View sourcecode

The following files exists in this folder. Click to view.

functions.php

87 lines UTF-8 Unix (LF)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?php
session_start
();

if (!isset(
$_SESSION['csrf_token'])) {
    
$_SESSION['csrf_token'] = bin2hex(random_bytes(16));
}

function 
redirect_with_flash(string $to, ?string $msg null) {
    if (
$msg$_SESSION['flash'] = $msg;
    
header("Location: {$to}");
    exit;
}

define('USER_FILE'__DIR__ '/data/users.txt');

function 
load_users(): array {
    if (!
file_exists(USER_FILE)) return [];
    
$rows file(USER_FILEFILE_IGNORE_NEW_LINES FILE_SKIP_EMPTY_LINES);
    
$users = [];
    foreach (
$rows as $row) {
        [
$u$hash$role] = explode(':'$row);
        
$users[$u] = [$hash$role];
    }
    return 
$users;
}

function 
save_users(array $users): void {
    
$lines = [];
    foreach (
$users as $u => [$hash$role]) {
        
$lines[] = "{$u}:{$hash}:{$role}";
    }
    
file_put_contents(USER_FILEimplode(PHP_EOL$lines) . PHP_EOL);
}

function 
try_cookie_login(): void {
    if (!empty(
$_SESSION['user'])) return;
    if (empty(
$_COOKIE['remember_user'])) return;

    
$username $_COOKIE['remember_user'];

    
$roles = [
        
'admin' => 'admin',
        
'user' => 'Intentionally removed by CSource',
        
'bosse' => 'user'
    
];

    
session_regenerate_id(true);
    
$_SESSION['user'] = [
        
'name' => $username,
        
'role' => $roles[$username] ?? 'user',
        
'login_time' => time()
    ];
}

function 
require_login(): void {
    
try_cookie_login();
    if (!isset(
$_SESSION['user'])) redirect_with_flash('login.php''Du måste vara inloggad.');
    
session_timeout_check();
}

function 
require_role(string $role): void {
    
require_login();
    
$current $_SESSION['user']['role'] ?? 'user';
    
$rank = ['user' => 1'admin' => 2];
    if ((
$rank[$current] ?? 0) < ($rank[$role] ?? 0)) redirect_with_flash('index.php''Du saknar behörighet.');
}

function 
session_timeout_check(): void {
    if (!isset(
$_SESSION['user']) || !is_array($_SESSION['user'])) {
        
$_SESSION = [];
        
session_destroy();
        
header("Location: login.php");
        exit;
    }

    
$timeoutSeconds 30 60;
    
$last $_SESSION['user']['login_time'] ?? time();

    if (
time() - $last $timeoutSeconds) {
        
$_SESSION = [];
        
session_destroy();
        
session_start();
        
redirect_with_flash('login.php''Sessionen löpte ut. Logga in igen.');
    }

    
$_SESSION['user']['login_time'] = time();
}