]> andersk Git - sql-web.git/blob - lib/security.lib.php
bug fix: signup/db-create for class lockers
[sql-web.git] / lib / security.lib.php
1 <?php
2
3 require_once('mitsql.lib.php');
4
5 class Login {
6         private $id, $u, $p;
7     private $info;
8     function Login($u, $p=null) {
9                 if (empty($u)) return;
10                 $this->u = $u;
11                 $this->p = $p;
12                 if (is_numeric($u)) {
13                         $this->id = $u;
14                         $opt = sprintf(" Username = '%s' OR UserId = '%s'", mysql_escape_string($u), 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                 }
19         $sql = sprintf("SELECT UserId, Username, Name, Email, UL, bEnabled
20                         FROM User
21                         WHERE %s", $opt);
22         $r = fetchRows(DBSelect($sql),'UserId');
23                 $this->info = count($r)?array_shift($r):$r;
24         }
25     function exists() {
26         return count($this->info);
27     }
28         function isValid() {
29                 return $this->getUL()>0;
30         }
31     function isEnabled() {
32         return $this->exists() && $this->info['bEnabled']==1;
33     }
34     function canLogin() {
35         return $this->isEnabled() && $this->isValid();
36     }
37     function canSignup() {
38         return !$this->isEnabled() && $this->isValid();
39     }
40     function getUserId() {
41         return $this->exists()?$this->info['UserId']:'';
42     }
43     function getUsername() {
44         return $this->exists()?$this->info['Username']:'';
45     }
46     function getName() {
47         return $this->exists()?$this->info['Name']:'';
48     }
49     function getEmail() {
50         return $this->exists()?$this->info['Email']:'';
51     }
52     function getUL() {
53         return $this->exists()?$this->info['UL']:'';
54     }
55     function expire() {
56         $this->info = null;
57     }
58     function refresh() {
59                 if (!empty($this->id)) {
60                         $this->Login($this->id);
61                 } else {
62                         $this->Login($this->u,$this->p);
63                 }
64     }
65     function update($name=null,$email=null) {
66         if (!$this->exists()) return;
67         $arr = array();
68                 if ($name == $this->getName()) $name = null;
69                 if ($email == $this->getEmail()) $email = null;
70         is_null($name) || $arr['Name'] = $name;
71         is_null($email) || $arr['Email'] = $email;
72                 $upd = buildSQLSet($arr);
73         $sql = sprintf("UPDATE User %s WHERE UserId = '%s'",
74                         $upd, mysql_escape_string($this->getUserId()));
75                 if (!empty($upd) && $upd != 'SET')
76                         DBUpdate($sql);
77                 if (isset($arr['Name']))
78                         $this->info['Name'] = $arr['Name'];
79                 if (isset($arr['Email']))
80                         $this->info['Email'] = $arr['Email'];
81         }
82 }
83
84 class User {
85         private $userId;
86         private $info;
87         private $dblist;
88     function User($userId) {
89                 $this->userId = $userId;
90         $sql = sprintf("SELECT User.UserId, Username, Name, Email, UL, bEnabled, nBytesSoft, nBytesHard, nBytes, nDatabases, nDatabasesHard, IF(nBytes>nBytesHard,1,0) AS bOverQuota
91                         FROM User
92                                                 INNER JOIN UserQuota ON User.UserId = UserQuota.UserId
93                                                 INNER JOIN UserStat ON User.UserId = UserStat.UserId
94                         WHERE User.UserId = '%s'",
95                         mysql_escape_string($userId));
96         $r = fetchRows(DBSelect($sql),'UserId');
97         $this->info = count($r)?array_shift($r):$r;
98                 $this->dblist = $this->getDBList();
99     }
100         function refresh() {
101                 unset($this->dblist);
102                 $this->User($this->userId);
103                 /*
104         $sql = sprintf("SELECT UserId, Username, Name, Email, UL, bEnabled
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         }
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']:'';
122     }
123     function isOverQuota() {
124         return $this->exists()?($this->info['bOverQuota']>0?true:false):'';
125     }
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                 }
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);
139                 $sql = sprintf('SET PASSWORD FOR \'%s\'@\'%%\'=PASSWORD(\'%s\')',
140                                                 mysql_escape_string($this->getUsername()),
141                                                 mysql_escape_string($pwd));
142                 DBSet($sql);
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';
159                 $suffix = $yes?sprintf("IDENTIFIED BY '%s'",mysql_escape_string($this->pass)):'';
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                                                 '%',
165                                                 $suffix);
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)) {
172                         $dbs = $this->getDBList();
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),
182                                                         mysql_escape_string($this->getUsername()),
183                                                         '%');
184                         DBGrant($sql);
185                 }
186         }
187         function getDBList() {
188                 if (isset($this->dblist)) {
189                         return $this->dblist;
190                 } else {
191                         //                      LEFT JOIN DBQuota ON DBQuota.DatabaseId = DBOwner.DatabaseId
192                         $sql = sprintf("SELECT *
193                                                 FROM DBOwner
194                                                 INNER JOIN DB ON DB.DatabaseId = DBOwner.DatabaseId
195                                                 INNER JOIN DBQuota ON DBQuota.DatabaseId = DBOwner.DatabaseId
196                                                 WHERE DBOwner.UserId = '%s' AND DB.bEnabled=1",
197                                                 mysql_escape_string($this->getUserId()));
198 //                      $r = fetchRows(DBSelect($sql),'DatabaseId');
199                         $r = fetchRows(DBSelect($sql),'Name');
200                         ksort($r);
201                         return $r;
202                 }
203         }
204         function addDB($name) {
205                 if (in_array($name, array_keys($this->getDBList()))) return false;
206                 if (!addDB($name, $this->getUserId())) return false;
207                 $this->setAccess($name);
208                 return true;
209         }
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         }
216 }
217
218
219 function isLoggedIn($aLogin=null) {
220     if (is_null($aLogin)) {
221         global $Login;
222         $aLogin = $Login;
223     }
224     return !empty($aLogin) && ($aLogin instanceof Login) && $aLogin->canLogin();
225 }
226
227 function isAdmin($aLogin=null) {
228     if (is_null($aLogin)) {
229         global $Login;
230         $aLogin = $Login;
231     }
232     return !empty($aLogin) && ($aLogin instanceof Login) && $aLogin->getUL()>=100;
233 }
234
235 function isImpersonating() {
236         return isSess('_UserId') && isSess('UserId');
237 }
238
239 function isOffline() {
240         return (defined('OFFLINE') && OFFLINE);
241 }
242
243 function isOnline() {
244         return !isOffline();
245 }
246
247 function impersonate($userId=null) {
248         $wasImpersonating = isImpersonating();
249         if ($wasImpersonating) {
250                 if (is_null($userId) || empty($userId)) {
251                         sess('UserId',sess('_UserId'));
252                         sess('_UserId','');
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
267 function isSSL() {
268         return isset($_SERVER['SERVER_PORT'])?($_SERVER['SERVER_PORT'] == 443):false;
269 }
270
271 function getSSLCert() {
272     if (DEVEL && file_exists('.forceauth')) {
273         $fu = explode('|',file_get_contents('.forceauth'));
274         $name = trim($fu[0]);
275         $email = trim($fu[1]);
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
291 function redirect($target=null,$secure=null) {
292     $base = (is_null($target)||substr($target,0,1)=='?')?$_SERVER['REDIRECT_URL']:(dirname($_SERVER['REDIRECT_URL']).'/');
293     redirectFull(is_null($target)?$base:($base.$target),$secure);
294 }
295 function redirectStart() {
296         redirectFull(BASE_URL,null);
297 }
298 function redirectFull($target,$secure) {
299         //redirect2((((isSSL()&&is_null($secure))||$secure==true)?'https://':'http://').$_SERVER['SERVER_NAME'].$target);
300         redirect2((((isSSL()&&is_null($secure))||$secure==true)?'https://scripts-cert.mit.edu':'http://scripts.mit.edu').$target);
301 }
302 function redirect2($target) {
303         header('Location: '.$target);
304         exit;
305 }
306 function flipSSL() {
307         //return (isSSL()?'http://':'https://').$_SERVER['SERVER_NAME'].$_SERVER['REDIRECT_URL'];
308         return (isSSL()?'http://scripts.mit.edu':'https://scripts-cert.mit.edu').$_SERVER['REDIRECT_URL'];
309 }
310
311 ## USER SCRIPTS
312
313 function addUser($sslCredentials) {
314     global $_NEW_USER, $_NEW_USERQUOTA, $_NEW_USERSTAT;
315
316     $arr = array_merge($sslCredentials, $_NEW_USER);
317     $sql = sprintf("INSERT INTO User %s",
318                     buildSQLInsert($arr));
319     $UserId = DBInsert($sql);
320
321         $arr = $_NEW_USERQUOTA;
322         $arr['UserId'] = $UserId;
323     $sql = sprintf("INSERT INTO UserQuota %s",
324                     buildSQLInsert($arr));
325         DBInsert($sql);
326
327         $arr = $_NEW_USERSTAT;
328         $arr['UserId'] = $UserId;
329     $sql = sprintf("INSERT INTO UserStat %s",
330                     buildSQLInsert($arr));
331         DBInsert($sql);
332
333         return $UserId;
334 }
335
336 function addDB($dbname,$userid) {
337         global $_NEW_DB, $_NEW_DBQUOTA, $_NEW_DBOWNER;
338
339         DBCreate(sprintf('CREATE DATABASE `%s`', mysql_escape_string($dbname)));
340         if (mysql_error()) return false;
341
342         $newdb['Name'] = $dbname;
343         $arr = array_merge($newdb, $_NEW_DB);
344         $arr['bEnabled'] = 1;
345         $sql = sprintf("INSERT IGNORE INTO DB %s",
346                     buildSQLInsert($arr));
347         $DBId = DBInsert($sql);
348         if (empty($DBId)) {
349                 $sql = sprintf("SELECT DatabaseId FROM DB WHERE Name = '%s'",
350                                                 mysql_escape_string($dbname));
351                 $r = fetchRows(DBSelect($sql), 'DatabaseId');
352                 if (count($r)) {
353                         $r = array_shift($r);
354                         $DBId = $r['DatabaseId'];
355                 } else {
356                         return false;
357                 }
358                 $sql = sprintf("UPDATE DB %s WHERE DB.DatabaseId = '%s'",
359                                                 buildSQLSet($arr),
360                                                 $DBId);
361                 DBUpdate($sql);
362         }
363
364         DBDelete(sprintf("DELETE FROM DBOwner WHERE DatabaseId = '%s'", mysql_escape_string($DBId)));
365         DBDelete(sprintf("DELETE FROM DBQuota WHERE DatabaseId = '%s'", mysql_escape_string($DBId)));
366         
367         $arr = $_NEW_DBQUOTA;
368         $arr['DatabaseId'] = $DBId;
369         $sql = sprintf("INSERT IGNORE INTO DBQuota %s",
370                                         buildSQLInsert($arr));
371         DBInsert($sql);
372
373         $arr = $_NEW_DBOWNER;
374         $arr['DatabaseId'] = $DBId;
375         $arr['UserId'] = $userid;
376         $sql = sprintf("INSERT IGNORE INTO DBOwner %s",
377                                         buildSQLInsert($arr));
378         DBInsert($sql);
379
380         return $DBId;
381 }
382
383 function delDB($dbname) {
384         global $_NEW_DB, $_NEW_DBQUOTA, $_NEW_DBOWNER;
385
386         DBCreate(sprintf('DROP DATABASE `%s`', mysql_escape_string($dbname)));
387
388         $arr['bEnabled'] = 0;
389         $sql = sprintf("UPDATE DB %s WHERE DB.Name = '%s'",
390                                         buildSQLSet($arr),
391                                         $dbname);
392         DBUpdate($sql);
393
394         return true;
395 }
396
397 ?>
This page took 0.076498 seconds and 5 git commands to generate.