cms/includes/auth.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);
}
?>