]> andersk Git - sql-web.git/blobdiff - lib/security.lib.php
check quotas function
[sql-web.git] / lib / security.lib.php
index ee7847e1f9744aaddd550688219f4e0d00c9655e..fca7a0f2279bfd399bc976dc9d2607ff96a0c968 100644 (file)
 require_once('mitsql.lib.php');
 
 class Login {
+       var $id, $u, $p;
     var $info;
     function Login($u, $p=null) {
-        $opt = is_null($p)?'':sprintf(" AND Password='%s' ", mysql_escape_string(base64_encode($p)));
+               if (empty($u)) return;
+               $this->u = $u;
+               $this->p = $p;
+               if (is_numeric($u)) {
+                       $this->id = $u;
+                       $opt = sprintf(" UserId = '%s'", mysql_escape_string($u));
+               } else {
+                       $opt = sprintf(" Username = '%s'", mysql_escape_string($u));
+                       $opt .= (is_null($p)?'':sprintf(" AND Password='%s'", mysql_escape_string(base64_encode($p))));
+               }
         $sql = sprintf("SELECT UserId, Username, Name, Email, UL, bEnabled
                         FROM User
-                        WHERE Username = '%s'
-                        $opt",
-                        mysql_escape_string($u));
+                        WHERE %s", $opt);
         $r = fetchRows(DBSelect($sql),'UserId');
-        $this->info = count($r)?array_shift($r):null;
-    }
+               $this->info = count($r)?array_shift($r):$r;
+       }
     function exists() {
-        return !is_null($this->info);
-    }
-    function isValid() {
-        return $this->isEnabled() && $this->getUL()>0;
+        return count($this->info);
     }
+       function isValid() {
+               return $this->getUL()>0;
+       }
     function isEnabled() {
         return $this->exists() && $this->info['bEnabled']==1;
     }
+    function canLogin() {
+        return $this->isEnabled() && $this->isValid();
+    }
+    function canSignup() {
+        return !$this->isEnabled() && $this->isValid();
+    }
     function getUserId() {
-        return $this->exists() && $this->info['UserId'];
+        return $this->exists()?$this->info['UserId']:'';
     }
     function getUsername() {
-        return $this->exists() && $this->info['Username'];
+        return $this->exists()?$this->info['Username']:'';
     }
     function getName() {
-        return $this->exists() && $this->info['Name'];
+        return $this->exists()?$this->info['Name']:'';
     }
     function getEmail() {
-        return $this->exists() && $this->info['Email'];
+        return $this->exists()?$this->info['Email']:'';
     }
     function getUL() {
-        return $this->exists() && $this->info['UL'];
+        return $this->exists()?$this->info['UL']:'';
     }
     function expire() {
         $this->info = null;
     }
     function refresh() {
-        $this->Login($this->getUsername());
+               if (!empty($this->id)) {
+                       $this->Login($this->id);
+               } else {
+                       $this->Login($this->u,$this->p);
+               }
     }
     function update($name=null,$email=null) {
         if (!$this->exists()) return;
         $arr = array();
+               if ($name == $this->getName()) $name = null;
+               if ($email == $this->getEmail()) $email = null;
         is_null($name) || $arr['Name'] = $name;
         is_null($email) || $arr['Email'] = $email;
+               $upd = buildSQLSet($arr);
+        $sql = sprintf("UPDATE User %s WHERE UserId = '%s'",
+                        $upd, mysql_escape_string($this->getUserId()));
+               if (!empty($upd) && $upd != 'SET')
+                       DBUpdate($sql);
+               if (isset($arr['Name']))
+                       $this->info['Name'] = $arr['Name'];
+               if (isset($arr['Email']))
+                       $this->info['Email'] = $arr['Email'];
+       }
+}
+
+class User {
+       var $userId;
+       var $info;
+       var $dblist;
+    function User($userId) {
+               $this->userId = $userId;
+        $sql = sprintf("SELECT User.UserId, Username, Password, Name, Email, UL, bEnabled, nBytesSoft, nBytesHard, nBytes, nDatabases, nDatabasesHard, IF(nBytes>nBytesHard,1,0) AS bOverQuota
+                        FROM User
+                                               INNER JOIN UserQuota ON User.UserId = UserQuota.UserId
+                                               INNER JOIN UserStat ON User.UserId = UserStat.UserId
+                        WHERE User.UserId = '%s'",
+                        mysql_escape_string($userId));
+        $r = fetchRows(DBSelect($sql),'UserId');
+        $this->info = count($r)?array_shift($r):$r;
+               $this->dblist = $this->getDBList();
+//             $this->pass = base64_decode($this->info['Password']);
+    }
+       function refresh() {
+               unset($this->dblist);
+               $this->User($this->userId);
+               /*
+        $sql = sprintf("SELECT UserId, Username, Password, Name, Email, UL, bEnabled
+                        FROM User
+                        WHERE UserId = '%s'",
+                        mysql_escape_string($this->userId));
+        $r = fetchRows(DBSelect($sql),'UserId');
+        $this->info = count($r)?array_shift($r):$r;
+               unset($this->dblist);
+               $this->getDBList();
+               */
+       }
+    function exists() {
+        return count($this->info);
+    }
+    function getUserId() {
+        return $this->exists()?$this->info['UserId']:'';
+    }
+    function getUsername() {
+        return $this->exists()?$this->info['Username']:'';
+    }
+    function isOverQuota() {
+        return $this->exists()?($this->info['bOverQuota']>0?true:false):'';
+    }
+    function getBytes() {
+        if($this->exists()) {
+                       $arr['nBytes'] = $this->info['nBytes'];
+                       $arr['nBytesSoft'] = $this->info['nBytesSoft'];
+                       $arr['nBytesHard'] = $this->info['nBytesHard'];
+                       return $arr;
+               }
+    }
+       function setPassword($pwd) {
+               $arr['Password'] = base64_encode($pwd);
         $sql = sprintf("UPDATE User %s WHERE UserId = '%s'",
                         buildSQLSet($arr), mysql_escape_string($this->getUserId()));
         DBUpdate($sql);
-    }
+               $sql = sprintf('SET PASSWORD FOR \'%s\'@\'%%\'=PASSWORD(\'%s\')',
+                                               mysql_escape_string($this->getUsername()),
+                                               mysql_escape_string($pwd));
+               DBSet($sql);
+       }
+       function signup($pwd) {
+               $this->pass = $pwd;
+               $arr['Password'] = base64_encode($pwd);
+               $arr['bEnabled'] = 1;
+               $arr['dSignup'] = 'NOW()';
+        $sql = sprintf("UPDATE User %s WHERE UserId = '%s'",
+                        buildSQLSet($arr), mysql_escape_string($this->getUserId()));
+        DBUpdate($sql);
+
+               $this->setUsage();
+               $this->setAccess();
+       }
+       function setUsage($yes=true) {
+               $verb = $yes?'GRANT':'REVOKE';
+               $prep = $yes?'TO':'FROM';
+               $suffix = $yes?sprintf("IDENTIFIED BY '%s'",mysql_escape_string($this->pass)):'';
+               $sql = sprintf("%s USAGE ON * . * %s '%s'@'%s' %s",
+                                               mysql_escape_string($verb),
+                                               mysql_escape_string($prep),
+                                               mysql_escape_string($this->getUsername()),
+                                               '%',
+                                               $suffix);
+               DBGrant($sql);
+       }
+       function setAccess($db=null,$yes=true) {
+               $verb = $yes?'GRANT':'REVOKE';
+               $prep = $yes?'TO':'FROM';
+               if (is_null($db)) {
+                       $dbs = $this->getDBList();
+               } else {
+                       $dbs[] = array('Name'=>$db);
+               }
+               foreach($dbs as $db) {
+                       $name = $db['Name'];
+                       $sql = sprintf("%s ALL PRIVILEGES ON `%s` . * %s '%s'@'%s'",
+                                                       mysql_escape_string($verb),
+                                                       mysql_escape_string($name),
+                                                       mysql_escape_string($prep),
+                                                       mysql_escape_string($this->getUsername()),
+                                                       '%');
+                       DBGrant($sql);
+               }
+       }
+       function getDBList() {
+               if (isset($this->dblist)) {
+                       return $this->dblist;
+               } else {
+                       //                      LEFT JOIN DBQuota ON DBQuota.DatabaseId = DBOwner.DatabaseId
+                       $sql = sprintf("SELECT *
+                                               FROM DBOwner
+                                               INNER JOIN DB ON DB.DatabaseId = DBOwner.DatabaseId
+                                               INNER JOIN DBQuota ON DBQuota.DatabaseId = DBOwner.DatabaseId
+                                               WHERE DBOwner.UserId = '%s' AND DB.bEnabled=1",
+                                               mysql_escape_string($this->getUserId()));
+//                     $r = fetchRows(DBSelect($sql),'DatabaseId');
+                       $r = fetchRows(DBSelect($sql),'Name');
+                       ksort($r);
+                       return $r;
+               }
+       }
+       function addDB($name) {
+               if (in_array($name, $this->getDBList())) return false;
+               if (!addDB($name, $this->getUserId())) return false;
+               $this->setAccess($name);
+               return true;
+       }
+       function delDB($name) {
+               if (!in_array($name, array_keys($this->getDBList()))) return false;
+               if (!delDB($name)) return false;//, $this->getUserId())) return false;
+               $this->setAccess($name,false);
+               return true;
+       }
 }
 
 
@@ -61,7 +222,39 @@ function isLoggedIn($aLogin=null) {
         global $Login;
         $aLogin = $Login;
     }
-    return !empty($aLogin) && is_a($aLogin, 'Login') && $aLogin->isValid();
+    return !empty($aLogin) && is_a($aLogin, 'Login') && $aLogin->canLogin();
+}
+
+function isAdmin($aLogin=null) {
+    if (is_null($aLogin)) {
+        global $Login;
+        $aLogin = $Login;
+    }
+    return !empty($aLogin) && is_a($aLogin, 'Login') && $aLogin->getUL()>=100;
+}
+
+function isImpersonating() {
+       return isSess('_UserId') && isSess('UserId');
+}
+
+function impersonate($userId=null) {
+       $wasImpersonating = isImpersonating();
+       if ($wasImpersonating) {
+               if (is_null($userId) || empty($userId)) {
+                       sess('UserId',sess('_UserId'));
+                       sess('_UserId','');
+               } elseif ($userId>0) {
+                       sess('UserId',$userId);
+               } else {
+                       return false;
+               }
+       } elseif (isLoggedIn()) {
+               sess('_UserId',sess('UserId'));
+               sess('UserId',$userId);
+               return true;
+       } else {
+               return false;
+       }
 }
 
 function isSSL() {
@@ -71,8 +264,8 @@ function isSSL() {
 function getSSLCert() {
     if (DEVEL && file_exists('.forceauth')) {
         $fu = explode('|',file_get_contents('.forceauth'));
-        $name = $fu[0];
-        $email = $fu[1];
+        $name = trim($fu[0]);
+        $email = trim($fu[1]);
     } else {
         $name = isset($_SERVER['SSL_CLIENT_S_DN_CN'])?$_SERVER['SSL_CLIENT_S_DN_CN']:null;
         $email = isset($_SERVER['SSL_CLIENT_S_DN_Email'])?$_SERVER['SSL_CLIENT_S_DN_Email']:null;
@@ -88,26 +281,105 @@ function getSSLCert() {
 
 ## 302 REDIRECTS
 
-function redirect($target=NULL) {
+function redirect($target=null,$secure=null) {
     $base = (is_null($target)||substr($target,0,1)=='?')?$_SERVER['REDIRECT_URL']:(dirname($_SERVER['REDIRECT_URL']).'/');
-    redirectFull(is_null($target)?$base:($base.$target));
+    redirectFull(is_null($target)?$base:($base.$target),$secure);
+}
+function redirectStart() {
+       redirectFull(BASE_URL,null);
 }
-function redirectFull($target) {
-       redirect2((isSSL()?'https://':'http://').$_SERVER['SERVER_NAME'].$target);
+function redirectFull($target,$secure) {
+       redirect2((((isSSL()&&is_null($secure))||$secure==true)?'https://':'http://').$_SERVER['SERVER_NAME'].$target);
 }
 function redirect2($target) {
        header('Location: '.$target);
        exit;
 }
+function flipSSL() {
+       return (isSSL()?'http://':'https://').$_SERVER['SERVER_NAME'].$_SERVER['REDIRECT_URL'];
+}
 
 ## USER SCRIPTS
 
 function addUser($sslCredentials) {
-    global $_NEW_USER;
+    global $_NEW_USER, $_NEW_USERQUOTA, $_NEW_USERSTAT;
+
     $arr = array_merge($sslCredentials, $_NEW_USER);
     $sql = sprintf("INSERT INTO User %s",
                     buildSQLInsert($arr));
-    return DBInsert($sql);
+    $UserId = DBInsert($sql);
+
+       $arr = $_NEW_USERQUOTA;
+       $arr['UserId'] = $UserId;
+    $sql = sprintf("INSERT INTO UserQuota %s",
+                    buildSQLInsert($arr));
+       DBInsert($sql);
+
+       $arr = $_NEW_USERSTAT;
+       $arr['UserId'] = $UserId;
+    $sql = sprintf("INSERT INTO UserStat %s",
+                    buildSQLInsert($arr));
+       DBInsert($sql);
+
+       return $UserId;
+}
+
+function addDB($dbname,$userid) {
+       global $_NEW_DB, $_NEW_DBQUOTA, $_NEW_DBOWNER;
+
+       DBCreate(sprintf('CREATE DATABASE `%s`', mysql_escape_string($dbname)));
+
+       $newdb['Name'] = $dbname;
+       $arr = array_merge($newdb, $_NEW_DB);
+       $arr['bEnabled'] = 1;
+       $sql = sprintf("INSERT IGNORE INTO DB %s",
+                    buildSQLInsert($arr));
+       $DBId = DBInsert($sql);
+       if (empty($DBId)) {
+               $sql = sprintf("SELECT DatabaseId FROM DB WHERE Name = '%s'",
+                                               mysql_escape_string($dbname));
+               $r = fetchRows(DBSelect($sql), 'DatabaseId');
+               if (count($r)) {
+                       $r = array_shift($r);
+                       $DBId = $r['DatabaseId'];
+               } else {
+                       return false;
+               }
+               $sql = sprintf("UPDATE DB %s WHERE DB.DatabaseId = '%s'",
+                                               buildSQLSet($arr),
+                                               $DBId);
+               DBUpdate($sql);
+               return $DBId;
+       } else {
+               $arr = $_NEW_DBQUOTA;
+               $arr['DatabaseId'] = $DBId;
+               $sql = sprintf("INSERT IGNORE INTO DBQuota %s",
+                                               buildSQLInsert($arr));
+               DBInsert($sql);
+
+               $arr = $_NEW_DBOWNER;
+               $arr['DatabaseId'] = $DBId;
+               $arr['UserId'] = $userid;
+               $sql = sprintf("INSERT IGNORE INTO DBOwner %s",
+                                               buildSQLInsert($arr));
+               DBInsert($sql);
+
+               return $DBId;
+       }
+}
+
+function delDB($dbname) {
+       global $_NEW_DB, $_NEW_DBQUOTA, $_NEW_DBOWNER;
+
+       DBCreate(sprintf('DROP DATABASE `%s`', mysql_escape_string($dbname)));
+
+       $arr['bEnabled'] = 0;
+       $sql = sprintf("UPDATE DB %s WHERE DB.Name = '%s'",
+                                       buildSQLSet($arr),
+                                       $dbname);
+       DBUpdate($sql);
+
+       return true;
 }
 
 ?>
This page took 0.114049 seconds and 4 git commands to generate.