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