1<?php
2
3function znote_session_request_is_https(): bool {
4 $https = strtolower((string)($_SERVER['HTTPS'] ?? ''));
5 return ($https !== '' && $https !== 'off') || (int)($_SERVER['SERVER_PORT'] ?? 0) === 443;
6}
7
8function znote_session_start(array $options = array()): void {
9 if (session_status() === PHP_SESSION_ACTIVE) {
10 return;
11 }
12
13 ini_set('session.use_strict_mode', '1');
14 ini_set('session.use_only_cookies', '1');
15 ini_set('session.use_trans_sid', '0');
16 ini_set('session.cookie_httponly', '1');
17
18 $secureOption = $options['cookie_secure'] ?? null;
19 $secure = is_bool($secureOption) ? $secureOption : znote_session_request_is_https();
20 $sameSite = ucfirst(strtolower((string)($options['cookie_samesite'] ?? 'Lax')));
21 if (!in_array($sameSite, array('Lax', 'Strict', 'None'), true)) {
22 $sameSite = 'Lax';
23 }
24
25 if ($sameSite === 'None' && !$secure) {
26 $sameSite = 'Lax';
27 }
28
29 $path = (string)($options['cookie_path'] ?? '/');
30 if ($path === '') {
31 $path = '/';
32 }
33
34 session_set_cookie_params(array(
35 'lifetime' => max(0, (int)($options['cookie_lifetime'] ?? 0)),
36 'path' => $path,
37 'domain' => (string)($options['cookie_domain'] ?? ''),
38 'secure' => $secure,
39 'httponly' => true,
40 'samesite' => $sameSite,
41 ));
42
43 if (!session_start()) {
44 throw new RuntimeException('Unable to start a secure PHP session.');
45 }
46}
47
48function znote_session_regenerate(): bool {
49 return session_status() === PHP_SESSION_ACTIVE && session_regenerate_id(true);
50}
51
52function znote_session_destroy(): void {
53 if (session_status() !== PHP_SESSION_ACTIVE) {
54 return;
55 }
56
57 $_SESSION = array();
58 if (ini_get('session.use_cookies')) {
59 $params = session_get_cookie_params();
60 setcookie(session_name(), '', array(
61 'expires' => time() - 42000,
62 'path' => $params['path'],
63 'domain' => $params['domain'],
64 'secure' => $params['secure'],
65 'httponly' => $params['httponly'],
66 'samesite' => $params['samesite'] ?? 'Lax',
67 ));
68 }
69
70 session_destroy();
71}
72