]> git.mxchange.org Git - friendica.git/blob - include/session.php
a1412ad9b445079b7ecfc00d8310f80e44f18342
[friendica.git] / include / session.php
1 <?php
2 // Session management functions. These provide database storage of PHP
3 // session info.
4
5 use Friendica\Core\Config;
6
7 require_once('include/cache.php');
8
9 $session_exists = 0;
10 $session_expire = 180000;
11
12 function ref_session_open($s, $n) {
13         return true;
14 }
15
16 function ref_session_read($id) {
17         global $session_exists;
18
19         if (!x($id)) {
20                 return '';
21         }
22
23         $memcache = cache::memcache();
24         if (is_object($memcache)) {
25                 $data = $memcache->get(get_app()->get_hostname().":session:".$id);
26                 if (!is_bool($data)) {
27                         $session_exists = true;
28                         return $data;
29                 }
30                 logger("no data for session $id", LOGGER_TRACE);
31                 return '';
32         }
33
34         $r = dba::select('session', array('data'), array('sid' => $id), array('limit' => 1));
35         if (dbm::is_result($r)) {
36                 $session_exists = true;
37                 return $r['data'];
38         } else {
39                 logger("no data for session $id", LOGGER_TRACE);
40         }
41
42         return '';
43 }
44
45 /**
46  * @brief Standard PHP session write callback
47  *
48  * This callback updates the DB-stored session data and/or the expiration depending
49  * on the case. Uses the $session_expire global for existing session, 5 minutes
50  * for newly created session.
51  *
52  * @global bool $session_exists Whether a session with the given id already exists
53  * @global int $session_expire Session expiration delay in seconds
54  * @param string $id Session ID with format: [a-z0-9]{26}
55  * @param string $data Serialized session data
56  * @return boolean Returns false if parameters are missing, true otherwise
57  */
58 function ref_session_write($id, $data) {
59         global $session_exists, $session_expire;
60
61         if (!$id || !$data) {
62                 return false;
63         }
64
65         $expire = time() + $session_expire;
66         $default_expire = time() + 300;
67
68         $memcache = cache::memcache();
69         $a = get_app();
70         if (is_object($memcache) && is_object($a)) {
71                 $memcache->set($a->get_hostname().":session:".$id, $data, MEMCACHE_COMPRESSED, $expire);
72                 return true;
73         }
74
75         if ($session_exists) {
76                 $fields = array('data' => $data, 'expire' => $expire);
77                 $condition = array("`sid` = ? AND (`data` != ? OR `expire` != ?)", $id, $data, $expire);
78                 dba::update('session', $fields, $condition);
79         } else {
80                 $fields = array('sid' => $id, 'expire' => $default_expire, 'data' => $data);
81                 dba::insert('session', $fields);
82         }
83
84         return true;
85 }
86
87 function ref_session_close() {
88         return true;
89 }
90
91 function ref_session_destroy($id) {
92         $memcache = cache::memcache();
93
94         if (is_object($memcache)) {
95                 $memcache->delete(get_app()->get_hostname().":session:".$id);
96                 return true;
97         }
98
99         dba::delete('session', array('sid' => $id));
100         return true;
101 }
102
103 function ref_session_gc($expire) {
104         dba::delete('session', array("`expire` < ?", time()));
105         return true;
106 }
107
108 $gc_probability = 50;
109
110 ini_set('session.gc_probability', $gc_probability);
111 ini_set('session.use_only_cookies', 1);
112 ini_set('session.cookie_httponly', 1);
113
114 if (Config::get('system', 'ssl_policy') == SSL_POLICY_FULL) {
115         ini_set('session.cookie_secure', 1);
116 }
117
118 if (!get_config('system', 'disable_database_session')) {
119         session_set_save_handler('ref_session_open', 'ref_session_close',
120                                 'ref_session_read', 'ref_session_write',
121                                 'ref_session_destroy', 'ref_session_gc');
122 }