]> andersk Git - sql-web.git/blame - lib/security.lib.php
errors are emailed in
[sql-web.git] / lib / security.lib.php
CommitLineData
997305cf
JP
1<?php
2
3require_once('mitsql.lib.php');
4
5class Login {
e346f2b3
JP
6 private $id, $u, $p;
7 private $info;
997305cf 8 function Login($u, $p=null) {
377015e0 9 if (empty($u)) return;
e47be57b 10 $this->u = $u;
dc478ec8 11 $this->p = $p;
e47be57b
JP
12 if (is_numeric($u)) {
13 $this->id = $u;
14 $opt = sprintf(" UserId = '%s'", mysql_escape_string($u));
15 } else {
16 $opt = sprintf(" Username = '%s'", mysql_escape_string($u));
17 $opt .= (is_null($p)?'':sprintf(" AND Password='%s'", mysql_escape_string(base64_encode($p))));
18 }
997305cf
JP
19 $sql = sprintf("SELECT UserId, Username, Name, Email, UL, bEnabled
20 FROM User
377015e0 21 WHERE %s", $opt);
997305cf 22 $r = fetchRows(DBSelect($sql),'UserId');
e47be57b
JP
23 $this->info = count($r)?array_shift($r):$r;
24 }
997305cf 25 function exists() {
dc478ec8 26 return count($this->info);
997305cf 27 }
dc478ec8
JP
28 function isValid() {
29 return $this->getUL()>0;
30 }
997305cf
JP
31 function isEnabled() {
32 return $this->exists() && $this->info['bEnabled']==1;
33 }
dc478ec8
JP
34 function canLogin() {
35 return $this->isEnabled() && $this->isValid();
36 }
37 function canSignup() {
38 return !$this->isEnabled() && $this->isValid();
39 }
997305cf 40 function getUserId() {
dc478ec8 41 return $this->exists()?$this->info['UserId']:'';
997305cf
JP
42 }
43 function getUsername() {
dc478ec8 44 return $this->exists()?$this->info['Username']:'';
997305cf
JP
45 }
46 function getName() {
dc478ec8 47 return $this->exists()?$this->info['Name']:'';
997305cf
JP
48 }
49 function getEmail() {
dc478ec8 50 return $this->exists()?$this->info['Email']:'';
997305cf
JP
51 }
52 function getUL() {
dc478ec8 53 return $this->exists()?$this->info['UL']:'';
997305cf
JP
54 }
55 function expire() {
56 $this->info = null;
57 }
58 function refresh() {
e47be57b
JP
59 if (!empty($this->id)) {
60 $this->Login($this->id);
61 } else {
62 $this->Login($this->u,$this->p);
63 }
997305cf
JP
64 }
65 function update($name=null,$email=null) {
66 if (!$this->exists()) return;
67 $arr = array();
dc478ec8
JP
68 if ($name == $this->getName()) $name = null;
69 if ($email == $this->getEmail()) $email = null;
997305cf
JP
70 is_null($name) || $arr['Name'] = $name;
71 is_null($email) || $arr['Email'] = $email;
e47be57b 72 $upd = buildSQLSet($arr);
997305cf 73 $sql = sprintf("UPDATE User %s WHERE UserId = '%s'",
3ebfe9a3 74 $upd, mysql_escape_string($this->getUserId()));
e47be57b
JP
75 if (!empty($upd) && $upd != 'SET')
76 DBUpdate($sql);
dc478ec8 77 if (isset($arr['Name']))
377015e0 78 $this->info['Name'] = $arr['Name'];
dc478ec8 79 if (isset($arr['Email']))
377015e0 80 $this->info['Email'] = $arr['Email'];
dc478ec8
JP
81 }
82}
83
84class User {
e346f2b3
JP
85 private $userId;
86 private $info;
87 private $dblist;
dc478ec8
JP
88 function User($userId) {
89 $this->userId = $userId;
6ba4f54c 90 $sql = sprintf("SELECT User.UserId, Username, Name, Email, UL, bEnabled, nBytesSoft, nBytesHard, nBytes, nDatabases, nDatabasesHard, IF(nBytes>nBytesHard,1,0) AS bOverQuota
dc478ec8 91 FROM User
e47be57b
JP
92 INNER JOIN UserQuota ON User.UserId = UserQuota.UserId
93 INNER JOIN UserStat ON User.UserId = UserStat.UserId
88b7d384 94 WHERE User.UserId = '%s'",
dc478ec8
JP
95 mysql_escape_string($userId));
96 $r = fetchRows(DBSelect($sql),'UserId');
97 $this->info = count($r)?array_shift($r):$r;
377015e0 98 $this->dblist = $this->getDBList();
997305cf 99 }
88b7d384
JP
100 function refresh() {
101 unset($this->dblist);
102 $this->User($this->userId);
103 /*
6ba4f54c 104 $sql = sprintf("SELECT UserId, Username, Name, Email, UL, bEnabled
88b7d384
JP
105 FROM User
106 WHERE UserId = '%s'",
107 mysql_escape_string($this->userId));
108 $r = fetchRows(DBSelect($sql),'UserId');
109 $this->info = count($r)?array_shift($r):$r;
110 unset($this->dblist);
111 $this->getDBList();
112 */
113 }
dc478ec8
JP
114 function exists() {
115 return count($this->info);
116 }
117 function getUserId() {
118 return $this->exists()?$this->info['UserId']:'';
119 }
120 function getUsername() {
121 return $this->exists()?$this->info['Username']:'';
88b7d384 122 }
9c70b481
JP
123 function isOverQuota() {
124 return $this->exists()?($this->info['bOverQuota']>0?true:false):'';
125 }
88b7d384
JP
126 function getBytes() {
127 if($this->exists()) {
128 $arr['nBytes'] = $this->info['nBytes'];
129 $arr['nBytesSoft'] = $this->info['nBytesSoft'];
130 $arr['nBytesHard'] = $this->info['nBytesHard'];
131 return $arr;
132 }
dc478ec8
JP
133 }
134 function setPassword($pwd) {
135 $arr['Password'] = base64_encode($pwd);
136 $sql = sprintf("UPDATE User %s WHERE UserId = '%s'",
137 buildSQLSet($arr), mysql_escape_string($this->getUserId()));
138 DBUpdate($sql);
377015e0
JP
139 $sql = sprintf('SET PASSWORD FOR \'%s\'@\'%%\'=PASSWORD(\'%s\')',
140 mysql_escape_string($this->getUsername()),
141 mysql_escape_string($pwd));
142 DBSet($sql);
dc478ec8
JP
143 }
144 function signup($pwd) {
145 $this->pass = $pwd;
146 $arr['Password'] = base64_encode($pwd);
147 $arr['bEnabled'] = 1;
148 $arr['dSignup'] = 'NOW()';
149 $sql = sprintf("UPDATE User %s WHERE UserId = '%s'",
150 buildSQLSet($arr), mysql_escape_string($this->getUserId()));
151 DBUpdate($sql);
152
153 $this->setUsage();
154 $this->setAccess();
155 }
156 function setUsage($yes=true) {
157 $verb = $yes?'GRANT':'REVOKE';
158 $prep = $yes?'TO':'FROM';
3ebfe9a3 159 $suffix = $yes?sprintf("IDENTIFIED BY '%s'",mysql_escape_string($this->pass)):'';
dc478ec8
JP
160 $sql = sprintf("%s USAGE ON * . * %s '%s'@'%s' %s",
161 mysql_escape_string($verb),
162 mysql_escape_string($prep),
163 mysql_escape_string($this->getUsername()),
164 '%',
3ebfe9a3 165 $suffix);
dc478ec8
JP
166 DBGrant($sql);
167 }
168 function setAccess($db=null,$yes=true) {
169 $verb = $yes?'GRANT':'REVOKE';
170 $prep = $yes?'TO':'FROM';
171 if (is_null($db)) {
88b7d384 172 $dbs = $this->getDBList();
dc478ec8
JP
173 } else {
174 $dbs[] = array('Name'=>$db);
175 }
176 foreach($dbs as $db) {
177 $name = $db['Name'];
178 $sql = sprintf("%s ALL PRIVILEGES ON `%s` . * %s '%s'@'%s'",
179 mysql_escape_string($verb),
180 mysql_escape_string($name),
181 mysql_escape_string($prep),
377015e0 182 mysql_escape_string($this->getUsername()),
dc478ec8
JP
183 '%');
184 DBGrant($sql);
185 }
186 }
187 function getDBList() {
88b7d384
JP
188 if (isset($this->dblist)) {
189 return $this->dblist;
190 } else {
191 // LEFT JOIN DBQuota ON DBQuota.DatabaseId = DBOwner.DatabaseId
192 $sql = sprintf("SELECT *
dc478ec8 193 FROM DBOwner
e47be57b
JP
194 INNER JOIN DB ON DB.DatabaseId = DBOwner.DatabaseId
195 INNER JOIN DBQuota ON DBQuota.DatabaseId = DBOwner.DatabaseId
88b7d384 196 WHERE DBOwner.UserId = '%s' AND DB.bEnabled=1",
dc478ec8 197 mysql_escape_string($this->getUserId()));
88b7d384
JP
198// $r = fetchRows(DBSelect($sql),'DatabaseId');
199 $r = fetchRows(DBSelect($sql),'Name');
9c70b481 200 ksort($r);
88b7d384
JP
201 return $r;
202 }
dc478ec8 203 }
377015e0 204 function addDB($name) {
4a77eeb5 205 if (in_array($name, array_keys($this->getDBList()))) return false;
377015e0
JP
206 if (!addDB($name, $this->getUserId())) return false;
207 $this->setAccess($name);
208 return true;
209 }
e47be57b
JP
210 function delDB($name) {
211 if (!in_array($name, array_keys($this->getDBList()))) return false;
212 if (!delDB($name)) return false;//, $this->getUserId())) return false;
213 $this->setAccess($name,false);
214 return true;
215 }
997305cf
JP
216}
217
218
219function isLoggedIn($aLogin=null) {
220 if (is_null($aLogin)) {
221 global $Login;
222 $aLogin = $Login;
223 }
e346f2b3 224 return !empty($aLogin) && ($aLogin instanceof Login) && $aLogin->canLogin();
997305cf
JP
225}
226
e47be57b
JP
227function isAdmin($aLogin=null) {
228 if (is_null($aLogin)) {
229 global $Login;
230 $aLogin = $Login;
231 }
e346f2b3 232 return !empty($aLogin) && ($aLogin instanceof Login) && $aLogin->getUL()>=100;
e47be57b
JP
233}
234
88b7d384
JP
235function isImpersonating() {
236 return isSess('_UserId') && isSess('UserId');
237}
238
8ed5cf01
JP
239function isOffline() {
240 return (defined('OFFLINE') && OFFLINE);
241}
242
243function isOnline() {
244 return !isOffline();
245}
246
88b7d384
JP
247function impersonate($userId=null) {
248 $wasImpersonating = isImpersonating();
249 if ($wasImpersonating) {
224df904 250 if (is_null($userId) || empty($userId)) {
88b7d384 251 sess('UserId',sess('_UserId'));
224df904 252 sess('_UserId','');
88b7d384
JP
253 } elseif ($userId>0) {
254 sess('UserId',$userId);
255 } else {
256 return false;
257 }
258 } elseif (isLoggedIn()) {
259 sess('_UserId',sess('UserId'));
260 sess('UserId',$userId);
261 return true;
262 } else {
263 return false;
264 }
265}
266
997305cf 267function isSSL() {
aaaa7a8f 268 return isset($_SERVER['SERVER_PORT'])?($_SERVER['SERVER_PORT'] == 443):false;
997305cf
JP
269}
270
271function getSSLCert() {
272 if (DEVEL && file_exists('.forceauth')) {
273 $fu = explode('|',file_get_contents('.forceauth'));
dc478ec8
JP
274 $name = trim($fu[0]);
275 $email = trim($fu[1]);
997305cf
JP
276 } else {
277 $name = isset($_SERVER['SSL_CLIENT_S_DN_CN'])?$_SERVER['SSL_CLIENT_S_DN_CN']:null;
278 $email = isset($_SERVER['SSL_CLIENT_S_DN_Email'])?$_SERVER['SSL_CLIENT_S_DN_Email']:null;
279 }
280 if (!is_null($email)) {
281 $user = explode('@',$email);
282 $user = $user[0];
283 return array('Username'=>$user, 'Name'=>$name, 'Email'=>$email);
284 } else {
285 return null;
286 }
287}
288
289## 302 REDIRECTS
290
1389493c 291function redirect($target=null,$secure=null) {
997305cf 292 $base = (is_null($target)||substr($target,0,1)=='?')?$_SERVER['REDIRECT_URL']:(dirname($_SERVER['REDIRECT_URL']).'/');
dc478ec8 293 redirectFull(is_null($target)?$base:($base.$target),$secure);
997305cf 294}
224df904
JP
295function redirectStart() {
296 redirectFull(BASE_URL,null);
297}
dc478ec8 298function redirectFull($target,$secure) {
1389493c 299 redirect2((((isSSL()&&is_null($secure))||$secure==true)?'https://':'http://').$_SERVER['SERVER_NAME'].$target);
997305cf
JP
300}
301function redirect2($target) {
302 header('Location: '.$target);
303 exit;
304}
dc478ec8
JP
305function flipSSL() {
306 return (isSSL()?'http://':'https://').$_SERVER['SERVER_NAME'].$_SERVER['REDIRECT_URL'];
307}
997305cf
JP
308
309## USER SCRIPTS
310
311function addUser($sslCredentials) {
dc478ec8
JP
312 global $_NEW_USER, $_NEW_USERQUOTA, $_NEW_USERSTAT;
313
997305cf
JP
314 $arr = array_merge($sslCredentials, $_NEW_USER);
315 $sql = sprintf("INSERT INTO User %s",
316 buildSQLInsert($arr));
dc478ec8
JP
317 $UserId = DBInsert($sql);
318
319 $arr = $_NEW_USERQUOTA;
320 $arr['UserId'] = $UserId;
321 $sql = sprintf("INSERT INTO UserQuota %s",
322 buildSQLInsert($arr));
323 DBInsert($sql);
324
325 $arr = $_NEW_USERSTAT;
326 $arr['UserId'] = $UserId;
1389493c 327 $sql = sprintf("INSERT INTO UserStat %s",
dc478ec8
JP
328 buildSQLInsert($arr));
329 DBInsert($sql);
330
331 return $UserId;
997305cf
JP
332}
333
377015e0 334function addDB($dbname,$userid) {
e47be57b 335 global $_NEW_DB, $_NEW_DBQUOTA, $_NEW_DBOWNER;
377015e0
JP
336
337 DBCreate(sprintf('CREATE DATABASE `%s`', mysql_escape_string($dbname)));
377015e0
JP
338
339 $newdb['Name'] = $dbname;
e47be57b 340 $arr = array_merge($newdb, $_NEW_DB);
377015e0 341 $arr['bEnabled'] = 1;
e47be57b 342 $sql = sprintf("INSERT IGNORE INTO DB %s",
377015e0 343 buildSQLInsert($arr));
e47be57b
JP
344 $DBId = DBInsert($sql);
345 if (empty($DBId)) {
346 $sql = sprintf("SELECT DatabaseId FROM DB WHERE Name = '%s'",
347 mysql_escape_string($dbname));
348 $r = fetchRows(DBSelect($sql), 'DatabaseId');
349 if (count($r)) {
350 $r = array_shift($r);
351 $DBId = $r['DatabaseId'];
352 } else {
353 return false;
354 }
355 $sql = sprintf("UPDATE DB %s WHERE DB.DatabaseId = '%s'",
356 buildSQLSet($arr),
357 $DBId);
358 DBUpdate($sql);
359 return $DBId;
360 } else {
361 $arr = $_NEW_DBQUOTA;
362 $arr['DatabaseId'] = $DBId;
363 $sql = sprintf("INSERT IGNORE INTO DBQuota %s",
364 buildSQLInsert($arr));
365 DBInsert($sql);
377015e0 366
e47be57b
JP
367 $arr = $_NEW_DBOWNER;
368 $arr['DatabaseId'] = $DBId;
369 $arr['UserId'] = $userid;
370 $sql = sprintf("INSERT IGNORE INTO DBOwner %s",
371 buildSQLInsert($arr));
372 DBInsert($sql);
377015e0 373
e47be57b
JP
374 return $DBId;
375 }
376}
377
378function delDB($dbname) {
379 global $_NEW_DB, $_NEW_DBQUOTA, $_NEW_DBOWNER;
380
381 DBCreate(sprintf('DROP DATABASE `%s`', mysql_escape_string($dbname)));
382
383 $arr['bEnabled'] = 0;
384 $sql = sprintf("UPDATE DB %s WHERE DB.Name = '%s'",
385 buildSQLSet($arr),
386 $dbname);
387 DBUpdate($sql);
377015e0 388
e47be57b 389 return true;
377015e0
JP
390}
391
88b7d384 392?>
This page took 0.101486 seconds and 5 git commands to generate.