190 lines
5.4 KiB
PHP
190 lines
5.4 KiB
PHP
<?php
|
|
session_start();
|
|
require_once __DIR__ . '/../config/database.php';
|
|
|
|
// Logowanie użytkownika
|
|
function login($username, $password) {
|
|
$db = getDB();
|
|
$stmt = $db->prepare("SELECT * FROM users WHERE username = ? AND status = 'active'");
|
|
$stmt->execute([$username]);
|
|
$user = $stmt->fetch();
|
|
|
|
if ($user && password_verify($password, $user['password'])) {
|
|
// Regeneruj ID sesji dla bezpieczeństwa
|
|
session_regenerate_id(true);
|
|
|
|
$_SESSION['user_id'] = $user['id'];
|
|
$_SESSION['username'] = $user['username'];
|
|
$_SESSION['role'] = $user['role'];
|
|
$_SESSION['logged_in'] = true;
|
|
$_SESSION['last_activity'] = time();
|
|
|
|
// Aktualizuj ostatnie logowanie
|
|
$updateStmt = $db->prepare("UPDATE users SET last_login = NOW() WHERE id = ?");
|
|
$updateStmt->execute([$user['id']]);
|
|
|
|
logActivity('login');
|
|
|
|
return ['success' => true, 'user' => $user];
|
|
}
|
|
|
|
return ['success' => false, 'message' => 'Nieprawidłowa nazwa użytkownika lub hasło'];
|
|
}
|
|
|
|
// Wylogowanie użytkownika
|
|
function logout() {
|
|
logActivity('logout');
|
|
|
|
$_SESSION = [];
|
|
|
|
if (isset($_COOKIE[session_name()])) {
|
|
setcookie(session_name(), '', time() - 3600, '/');
|
|
}
|
|
|
|
session_destroy();
|
|
}
|
|
|
|
// Sprawdzenie czy użytkownik jest zalogowany
|
|
function isLoggedIn() {
|
|
if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {
|
|
return false;
|
|
}
|
|
|
|
// Sprawdź timeout sesji
|
|
if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity'] > SESSION_LIFETIME)) {
|
|
logout();
|
|
return false;
|
|
}
|
|
|
|
$_SESSION['last_activity'] = time();
|
|
return true;
|
|
}
|
|
|
|
// Sprawdzenie roli użytkownika
|
|
function hasRole($role) {
|
|
if (!isLoggedIn()) {
|
|
return false;
|
|
}
|
|
|
|
$roles = ['user' => 1, 'editor' => 2, 'admin' => 3];
|
|
$userRole = $_SESSION['role'] ?? 'user';
|
|
|
|
return $roles[$userRole] >= $roles[$role];
|
|
}
|
|
|
|
// Wymuszenie logowania
|
|
function requireLogin() {
|
|
if (!isLoggedIn()) {
|
|
header('Location: ' . ADMIN_URL . '/login.php');
|
|
exit;
|
|
}
|
|
}
|
|
|
|
// Wymuszenie roli
|
|
function requireRole($role) {
|
|
requireLogin();
|
|
|
|
if (!hasRole($role)) {
|
|
http_response_code(403);
|
|
die('Brak uprawnień do tej strony');
|
|
}
|
|
}
|
|
|
|
// Rejestracja nowego użytkownika
|
|
function register($username, $email, $password) {
|
|
$db = getDB();
|
|
|
|
// Sprawdź czy rejestracja jest włączona
|
|
if (!getSetting('allow_registration', '0')) {
|
|
return ['success' => false, 'message' => 'Rejestracja jest wyłączona'];
|
|
}
|
|
|
|
// Walidacja
|
|
if (strlen($username) < 3) {
|
|
return ['success' => false, 'message' => 'Nazwa użytkownika musi mieć co najmniej 3 znaki'];
|
|
}
|
|
|
|
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
|
return ['success' => false, 'message' => 'Nieprawidłowy adres email'];
|
|
}
|
|
|
|
if (strlen($password) < 6) {
|
|
return ['success' => false, 'message' => 'Hasło musi mieć co najmniej 6 znaków'];
|
|
}
|
|
|
|
// Sprawdź czy użytkownik już istnieje
|
|
$stmt = $db->prepare("SELECT id FROM users WHERE username = ? OR email = ?");
|
|
$stmt->execute([$username, $email]);
|
|
|
|
if ($stmt->fetch()) {
|
|
return ['success' => false, 'message' => 'Użytkownik o tej nazwie lub emailu już istnieje'];
|
|
}
|
|
|
|
// Hashuj hasło
|
|
$hashedPassword = password_hash($password, HASH_ALGO);
|
|
|
|
// Dodaj użytkownika
|
|
$stmt = $db->prepare("
|
|
INSERT INTO users (username, email, password, role)
|
|
VALUES (?, ?, ?, 'user')
|
|
");
|
|
|
|
if ($stmt->execute([$username, $email, $hashedPassword])) {
|
|
logActivity('user_registered', 'user', $db->lastInsertId());
|
|
return ['success' => true, 'message' => 'Rejestracja zakończona pomyślnie'];
|
|
}
|
|
|
|
return ['success' => false, 'message' => 'Wystąpił błąd podczas rejestracji'];
|
|
}
|
|
|
|
// Zmiana hasła
|
|
function changePassword($userId, $oldPassword, $newPassword) {
|
|
$db = getDB();
|
|
|
|
$stmt = $db->prepare("SELECT password FROM users WHERE id = ?");
|
|
$stmt->execute([$userId]);
|
|
$user = $stmt->fetch();
|
|
|
|
if (!$user || !password_verify($oldPassword, $user['password'])) {
|
|
return ['success' => false, 'message' => 'Nieprawidłowe aktualne hasło'];
|
|
}
|
|
|
|
if (strlen($newPassword) < 6) {
|
|
return ['success' => false, 'message' => 'Nowe hasło musi mieć co najmniej 6 znaków'];
|
|
}
|
|
|
|
$hashedPassword = password_hash($newPassword, HASH_ALGO);
|
|
$stmt = $db->prepare("UPDATE users SET password = ? WHERE id = ?");
|
|
|
|
if ($stmt->execute([$hashedPassword, $userId])) {
|
|
logActivity('password_changed');
|
|
return ['success' => true, 'message' => 'Hasło zostało zmienione'];
|
|
}
|
|
|
|
return ['success' => false, 'message' => 'Nie udało się zmienić hasła'];
|
|
}
|
|
|
|
// Pobierz aktualnego użytkownika
|
|
function getCurrentUser() {
|
|
if (!isLoggedIn()) {
|
|
return null;
|
|
}
|
|
|
|
$db = getDB();
|
|
$stmt = $db->prepare("SELECT * FROM users WHERE id = ?");
|
|
$stmt->execute([$_SESSION['user_id']]);
|
|
return $stmt->fetch();
|
|
}
|
|
|
|
// CSRF Token
|
|
function generateCSRFToken() {
|
|
if (!isset($_SESSION['csrf_token'])) {
|
|
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
|
|
}
|
|
return $_SESSION['csrf_token'];
|
|
}
|
|
|
|
function validateCSRFToken($token) {
|
|
return isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token);
|
|
}
|
|
?>
|