]> andersk Git - sql-web.git/blob - lib/security.lib.php
7557465526cf66a96010402dc94cdc699efa461e
[sql-web.git] / lib / security.lib.php
1 <?php
2
3 require_once('mitsql.lib.php');
4
5 class Login {
6         var $id, $u, $p;
7     var $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(" 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                 }
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         var $userId;
86         var $info;
87         var $dblist;
88     function User($userId) {
89                 $this->userId = $userId;
90         $sql = sprintf("SELECT User.UserId, Username, Password, Name, Email, UL, bEnabled, nBytesSoft, nBytesHard, nBytes, nDatabases, nDatabasesHard
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 //              $this->pass = base64_decode($this->info['Password']);
100     }
101         function refresh() {
102                 unset($this->dblist);
103                 $this->User($this->userId);
104                 /*
105         $sql = sprintf("SELECT UserId, Username, Password, Name, Email, UL, bEnabled
106                         FROM User
107                         WHERE UserId = '%s'",
108                         mysql_escape_string($this->userId));
109         $r = fetchRows(DBSelect($sql),'UserId');
110         $this->info = count($r)?array_shift($r):$r;
111                 unset($this->dblist);
112                 $this->getDBList();
113                 */
114         }
115     function exists() {
116         return count($this->info);
117     }
118     function getUserId() {
119         return $this->exists()?$this->info['UserId']:'';
120     }
121     function getUsername() {
122         return $this->exists()?$this->info['Username']:'';
123     }
124     function getBytes() {
125         if($this->exists()) {
126                         $arr['nBytes'] = $this->info['nBytes'];
127                         $arr['nBytesSoft'] = $this->info['nBytesSoft'];
128                         $arr['nBytesHard'] = $this->info['nBytesHard'];
129                         return $arr;
130                 }
131     }
132         function setPassword($pwd) {
133                 $arr['Password'] = base64_encode($pwd);
134         $sql = sprintf("UPDATE User %s WHERE UserId = '%s'",
135                         buildSQLSet($arr), mysql_escape_string($this->getUserId()));
136         DBUpdate($sql);
137                 $sql = sprintf('SET PASSWORD FOR \'%s\'@\'%%\'=PASSWORD(\'%s\')',
138                                                 mysql_escape_string($this->getUsername()),
139                                                 mysql_escape_string($pwd));
140                 DBSet($sql);
141         }
142         function signup($pwd) {
143                 $this->pass = $pwd;
144                 $arr['Password'] = base64_encode($pwd);
145                 $arr['bEnabled'] = 1;
146                 $arr['dSignup'] = 'NOW()';
147         $sql = sprintf("UPDATE User %s WHERE UserId = '%s'",
148                         buildSQLSet($arr), mysql_escape_string($this->getUserId()));
149         DBUpdate($sql);
150
151                 $this->setUsage();
152                 $this->setAccess();
153         }
154         function setUsage($yes=true) {
155                 $verb = $yes?'GRANT':'REVOKE';
156                 $prep = $yes?'TO':'FROM';
157                 $suffix = $yes?sprintf("IDENTIFIED BY '%s'",mysql_escape_string($this->pass)):'';
158                 $sql = sprintf("%s USAGE ON * . * %s '%s'@'%s' %s",
159                                                 mysql_escape_string($verb),
160                                                 mysql_escape_string($prep),
161                                                 mysql_escape_string($this->getUsername()),
162                                                 '%',
163                                                 $suffix);
164                 DBGrant($sql);
165         }
166         function setAccess($db=null,$yes=true) {
167                 $verb = $yes?'GRANT':'REVOKE';
168                 $prep = $yes?'TO':'FROM';
169                 if (is_null($db)) {
170                         $dbs = $this->getDBList();
171                 } else {
172                         $dbs[] = array('Name'=>$db);
173                 }
174                 foreach($dbs as $db) {
175                         $name = $db['Name'];
176                         $sql = sprintf("%s ALL PRIVILEGES ON `%s` . * %s '%s'@'%s'",
177                                                         mysql_escape_string($verb),
178                                                         mysql_escape_string($name),
179                                                         mysql_escape_string($prep),
180                                                         mysql_escape_string($this->getUsername()),
181                                                         '%');
182                         DBGrant($sql);
183                 }
184         }
185         function getDBList() {
186                 if (isset($this->dblist)) {
187                         return $this->dblist;
188                 } else {
189                         //                      LEFT JOIN DBQuota ON DBQuota.DatabaseId = DBOwner.DatabaseId
190                         $sql = sprintf("SELECT *
191                                                 FROM DBOwner
192                                                 INNER JOIN DB ON DB.DatabaseId = DBOwner.DatabaseId
193                                                 INNER JOIN DBQuota ON DBQuota.DatabaseId = DBOwner.DatabaseId
194                                                 WHERE DBOwner.UserId = '%s' AND DB.bEnabled=1",
195                                                 mysql_escape_string($this->getUserId()));
196 //                      $r = fetchRows(DBSelect($sql),'DatabaseId');
197                         $r = fetchRows(DBSelect($sql),'Name');
198                         return $r;
199                 }
200         }
201         function addDB($name) {
202                 if (in_array($name, $this->getDBList())) return false;
203                 if (!addDB($name, $this->getUserId())) return false;
204                 $this->setAccess($name);
205                 return true;
206         }
207         function delDB($name) {
208                 if (!in_array($name, array_keys($this->getDBList()))) return false;
209                 if (!delDB($name)) return false;//, $this->getUserId())) return false;
210                 $this->setAccess($name,false);
211                 return true;
212         }
213 }
214
215
216 function isLoggedIn($aLogin=null) {
217     if (is_null($aLogin)) {
218         global $Login;
219         $aLogin = $Login;
220     }
221     return !empty($aLogin) && is_a($aLogin, 'Login') && $aLogin->canLogin();
222 }
223
224 function isAdmin($aLogin=null) {
225     if (is_null($aLogin)) {
226         global $Login;
227         $aLogin = $Login;
228     }
229     return !empty($aLogin) && is_a($aLogin, 'Login') && $aLogin->getUL()>=100;
230 }
231
232 function isImpersonating() {
233         return isSess('_UserId') && isSess('UserId');
234 }
235
236 function impersonate($userId=null) {
237         $wasImpersonating = isImpersonating();
238         if ($wasImpersonating) {
239                 if (is_null($userId)) {
240                         sess('UserId',sess('_UserId'));
241                 } elseif ($userId>0) {
242                         sess('UserId',$userId);
243                 } else {
244                         return false;
245                 }
246         } elseif (isLoggedIn()) {
247                 sess('_UserId',sess('UserId'));
248                 sess('UserId',$userId);
249                 return true;
250         } else {
251                 return false;
252         }
253 }
254
255 function isSSL() {
256         return $_SERVER['SERVER_PORT'] == 443;
257 }
258
259 function getSSLCert() {
260     if (DEVEL && file_exists('.forceauth')) {
261         $fu = explode('|',file_get_contents('.forceauth'));
262         $name = trim($fu[0]);
263         $email = trim($fu[1]);
264     } else {
265         $name = isset($_SERVER['SSL_CLIENT_S_DN_CN'])?$_SERVER['SSL_CLIENT_S_DN_CN']:null;
266         $email = isset($_SERVER['SSL_CLIENT_S_DN_Email'])?$_SERVER['SSL_CLIENT_S_DN_Email']:null;
267     }
268     if (!is_null($email)) {
269         $user = explode('@',$email);
270                 $user = $user[0];
271         return array('Username'=>$user, 'Name'=>$name, 'Email'=>$email);
272         } else {
273                 return null;
274         }
275 }
276
277 ## 302 REDIRECTS
278
279 function redirect($target=null,$secure=null) {
280     $base = (is_null($target)||substr($target,0,1)=='?')?$_SERVER['REDIRECT_URL']:(dirname($_SERVER['REDIRECT_URL']).'/');
281     redirectFull(is_null($target)?$base:($base.$target),$secure);
282 }
283 function redirectFull($target,$secure) {
284         redirect2((((isSSL()&&is_null($secure))||$secure==true)?'https://':'http://').$_SERVER['SERVER_NAME'].$target);
285 }
286 function redirect2($target) {
287         header('Location: '.$target);
288         exit;
289 }
290 function flipSSL() {
291         return (isSSL()?'http://':'https://').$_SERVER['SERVER_NAME'].$_SERVER['REDIRECT_URL'];
292 }
293
294 ## USER SCRIPTS
295
296 function addUser($sslCredentials) {
297     global $_NEW_USER, $_NEW_USERQUOTA, $_NEW_USERSTAT;
298
299     $arr = array_merge($sslCredentials, $_NEW_USER);
300     $sql = sprintf("INSERT INTO User %s",
301                     buildSQLInsert($arr));
302     $UserId = DBInsert($sql);
303
304         $arr = $_NEW_USERQUOTA;
305         $arr['UserId'] = $UserId;
306     $sql = sprintf("INSERT INTO UserQuota %s",
307                     buildSQLInsert($arr));
308         DBInsert($sql);
309
310         $arr = $_NEW_USERSTAT;
311         $arr['UserId'] = $UserId;
312     $sql = sprintf("INSERT INTO UserStat %s",
313                     buildSQLInsert($arr));
314         DBInsert($sql);
315
316         return $UserId;
317 }
318
319 function addDB($dbname,$userid) {
320         global $_NEW_DB, $_NEW_DBQUOTA, $_NEW_DBOWNER;
321
322         DBCreate(sprintf('CREATE DATABASE `%s`', mysql_escape_string($dbname)));
323
324         $newdb['Name'] = $dbname;
325         $arr = array_merge($newdb, $_NEW_DB);
326         $arr['bEnabled'] = 1;
327         $sql = sprintf("INSERT IGNORE INTO DB %s",
328                     buildSQLInsert($arr));
329         $DBId = DBInsert($sql);
330         if (empty($DBId)) {
331                 $sql = sprintf("SELECT DatabaseId FROM DB WHERE Name = '%s'",
332                                                 mysql_escape_string($dbname));
333                 $r = fetchRows(DBSelect($sql), 'DatabaseId');
334                 if (count($r)) {
335                         $r = array_shift($r);
336                         $DBId = $r['DatabaseId'];
337                 } else {
338                         return false;
339                 }
340                 $sql = sprintf("UPDATE DB %s WHERE DB.DatabaseId = '%s'",
341                                                 buildSQLSet($arr),
342                                                 $DBId);
343                 DBUpdate($sql);
344                 return $DBId;
345         } else {
346                 $arr = $_NEW_DBQUOTA;
347                 $arr['DatabaseId'] = $DBId;
348                 $sql = sprintf("INSERT IGNORE INTO DBQuota %s",
349                                                 buildSQLInsert($arr));
350                 DBInsert($sql);
351
352                 $arr = $_NEW_DBOWNER;
353                 $arr['DatabaseId'] = $DBId;
354                 $arr['UserId'] = $userid;
355                 $sql = sprintf("INSERT IGNORE INTO DBOwner %s",
356                                                 buildSQLInsert($arr));
357                 DBInsert($sql);
358
359                 return $DBId;
360         }
361 }
362
363 function delDB($dbname) {
364         global $_NEW_DB, $_NEW_DBQUOTA, $_NEW_DBOWNER;
365
366         DBCreate(sprintf('DROP DATABASE `%s`', mysql_escape_string($dbname)));
367
368         $arr['bEnabled'] = 0;
369         $sql = sprintf("UPDATE DB %s WHERE DB.Name = '%s'",
370                                         buildSQLSet($arr),
371                                         $dbname);
372         DBUpdate($sql);
373
374         return true;
375 }
376
377 ?>
This page took 0.053011 seconds and 3 git commands to generate.