fixing up the "is setup" check in the installer
[gwvp.git] / gwvplib / gwvpdatabase.php
index d9b51cd..5823c0c 100644 (file)
@@ -3,6 +3,11 @@
 global $DB_CONNECTION;
 $DB_CONNECTION = false;
 
+
+global $db_url, $db_type;
+error_log("in include for database, $db_type, $db_name");
+
+
 // i need to figure out how i do data encapsulation here. We'll support mysql and sqlite3 off the bat if we can - sqlite3 comes first tho
 function gwvp_dbCreateMysqlStructure()
 {
@@ -19,13 +24,14 @@ function gwvp_dbCreateSQLiteStructure($dbloc)
            "user_username" TEXT,
            "user_email" TEXT,
            "user_desc" TEXT,
-           "user_status" INTEGER
+           "user_status" TEXT
                )';
 
        $groupsql = '
                CREATE TABLE groups (
            "groups_id" INTEGER PRIMARY KEY AUTOINCREMENT,
            "groups_name" TEXT,
+           "groups_description" TEXT,
            "groups_is_admin" INTEGER,
                "groups_owner_id" INTEGER
                )';
@@ -74,17 +80,140 @@ function gwvp_dbCreateSQLiteStructure($dbloc)
        $DB_CONNECTION->query($usersql);
        $DB_CONNECTION->query($groupsql);
        $DB_CONNECTION->query($reposql);
+       $DB_CONNECTION->query($repoperms);
        $DB_CONNECTION->query($configsql);
        $DB_CONNECTION->query($groupmemsql);
 }
 
+function gwvp_GetUserStatus($userid)
+{
+       $conn = gwvp_ConnectDB();
+       
+       $sql = "select user_status from users where users_id='$userid'";
+       
+       $res = $conn->query($sql);
+       
+       $return = null;
+       foreach($res as $val) {
+               $spl = explode(";", $val);
+               
+               $return["statusid"] = $spl[0];
+               $return["extstatus"] = $spl[1];
+       }
+       
+}
+
+function gwvp_SetUserStatus($userid, $status, $extendedstatus=null)
+{
+       /*
+        * user statues
+        * 0 - all good
+        * 1 - locked
+        * 2 - password locked
+        * 3 - awaiting registration completion
+        * 4 - awaiting password reset
+        * where use status = 3,4 the key for unlock is set as the extended status
+        * i.e. if a user goes thru registration, when the validation email gets to
+        * them they'll have a key in their email (128 or 256 bit), thats what
+        * the extended status field is used for
+        */
+       
+       $conn = gwvp_ConnectDB();
+       
+       if($extendedstatus != null) {
+               $sql = "update users set user_status='$status;$extendedstatus' where users_id='$userid'";
+       } else {
+               $sql = "update users set user_status='$status;0' where users_id='$userid'";
+       }
+       
+       return $conn->query($sql);
+       
+}
+
+function gwvp_forceDisconnect()
+{
+       
+       global $DB_CONNECTION;
+       
+       $DB_CONNECTION = false;
+}
+
+
+function gwvp_getConfigVal($confname)
+{
+       /*
+        *      $configsql = '
+               CREATE TABLE "config" (
+           "config_name" TEXT,
+           "config_value" TEXT
+               )';
+
+        */
+       
+       $conn = gwvp_ConnectDB();
+       
+       $sql = "select config_value from config where config_name='$confname'";
+       
+       $res = $conn->query($sql);
+       
+       $return = null;
+       foreach($res as $val) {
+               $return = $val["config_value"];
+       }
+       
+       return $return;
+}
+
+function gwvp_eraseConfigVal($confname)
+{
+       /*
+        *      $configsql = '
+               CREATE TABLE "config" (
+           "config_name" TEXT,
+           "config_value" TEXT
+               )';
+
+        */
+       
+       $conn = gwvp_ConnectDB();
+       
+       $sql = "delete from config where config_name='$confname'";
+       
+       return $conn->query($sql);
+}
+
+function gwvp_setConfigVal($confname, $confval)
+{
+       /*
+        *      $configsql = '
+               CREATE TABLE "config" (
+           "config_name" TEXT,
+           "config_value" TEXT
+               )';
+
+        */
+       gwvp_eraseConfigVal($confname);
+
+       $conn = gwvp_ConnectDB();
+       
+       $sql = "insert into config values('$confname', '$confval')";
+       
+       return $conn->query($sql);
+}
+
+
 function gwvp_isDBSetup()
 {
        // for sqlite, we just check if the db exists, for everyone else, we check for a conneciton and go yay or nay
-       global $WEB_ROOT_FS, $BASE_URL, $repo_base, $data_directory, $db_type, $db_url;
-
+       global $WEB_ROOT_FS, $BASE_URL, $data_directory, $db_type, $db_name;
+       
+       // oh this isnt working. poo.
+       error_log("checking for $db_name, $db_type");
+       
        if($db_type == "sqlite") {
-               if(file_exists($db_url)) return true;
+               if(file_exists($db_name)) {
+                       return true;
+               }
                else return false;
        }
 
@@ -94,9 +223,11 @@ function gwvp_isDBSetup()
 
 function gwvp_ConnectDB()
 {
-       global $WEB_ROOT_FS, $BASE_URL, $repo_base, $data_directory, $db_type, $db_name, $DB_CONNECTION;
+       global $WEB_ROOT_FS, $BASE_URL, $data_directory, $db_type, $db_name, $DB_CONNECTION;
 
        // first check if $DB_CONNECTION IS live
+       error_log("in connection $db_type, $db_name");
+       
        if($DB_CONNECTION != false) return $DB_CONNECTION;
 
        if($db_type == "sqlite") {
@@ -118,6 +249,7 @@ function gwvp_ConnectDB()
        return $DB_CONNECTION;
 }
 
+// TODO: we have to define what "Status" is
 function gwvp_createUser($email, $fullname, $password, $username, $desc, $status)
 {
        $conn = gwvp_ConnectDB();
@@ -125,7 +257,9 @@ function gwvp_createUser($email, $fullname, $password, $username, $desc, $status
        // TODO: change from sha1
        $shapass = sha1($password);
        //error_log("Create user called with $email");
-       $conn->query("insert into users values (null, '$fullname', '$shapass', '$username', '$email', '$desc', '$status')");
+       $sql = "insert into users values (null, '$fullname', '$shapass', '$username', '$email', '$desc', '$status')";
+       error_log("Creating user, $sql");
+       return $conn->query($sql);
        /*
         *          "users_id" INTEGER PRIMARY KEY AUTOINCREMENT,
         "user_full_name" TEXT,
@@ -165,6 +299,59 @@ function gwvp_getUser($username=null, $email=null, $id=null)
 
 }
 
+function gwvp_getRepoOwner($repoid)
+{
+       $conn = gwvp_ConnectDB();
+
+       $sql = "select repos_owner from repos where repos_id='$repoid'";
+
+       $res = $conn->query($sql);
+       
+       $return = false;
+       foreach($res as $rown) {
+               $return = $rown["repos_owner"];
+       }
+       return $return;
+}
+
+function gwvp_getOwnedRepos($userid = null, $username = null)
+{
+       $conn = gwvp_ConnectDB();
+       
+       if($username != null) {
+               $details = gwvp_getUser($username);
+               $uid = $details["id"];
+               $sql = "select * from repos where repos_owner='$uid'";
+               $res = $conn->query($sql);
+               error_log("sql: $sql");
+       } else if($userid != null) {
+               $sql = "select * from repos where repos_owner='$userid'";
+               $res = $conn->query($sql);
+               error_log("sql: $sql");
+       } else return false;
+       
+       /*
+        *              CREATE TABLE "repos" (
+           "repos_id" INTEGER PRIMARY KEY AUTOINCREMENT,
+           "repos_name" TEXT,
+           "repos_description" TEXT,
+           "repos_owner" INTEGER
+               )';
+
+        */
+
+       $returns = false;
+       $rn = 0;
+       foreach($res as $u_res) {
+               $returns[$rn]["id"] = $u_res["repos_id"];
+               $returns[$rn]["name"] = $u_res["repos_name"];
+               $returns[$rn]["description"] = $u_res["repos_description"];
+               $rn++;
+       }
+
+       return $returns;
+}
+
 function gwvp_getUsers()
 {
        $conn = gwvp_ConnectDB();
@@ -196,7 +383,7 @@ function gwvp_deleteUser($email)
        $conn->query($sql);
 }
 
-function gwvp_createGroup($group_name, $is_admin, $owner_id)
+function gwvp_createGroup($group_name, $group_desc, $is_admin, $owner_id)
 {
        $conn = gwvp_ConnectDB();
 
@@ -214,10 +401,19 @@ function gwvp_createGroup($group_name, $is_admin, $owner_id)
        } else {
                $is_admin_t = 0;
        }
-       $sql = "insert into groups values( null, '$group_name', '$is_admin_t', '$owner_id')";
+       $sql = "insert into groups values( null, '$group_name', '$group_desc', '$is_admin_t', '$owner_id')";
+       
 
        $conn->query($sql);
-
+       
+       // add the owner to the group
+       $gid = gwvp_getGroupId($group_name);
+       
+       
+       error_log("calling addgroupmember with $owner_id, $gid");
+       gwvp_addGroupMemberById($owner_id, $gid);
+       
+       return true;
 }
 
 function gwvp_deleteGroup($groupname)
@@ -229,7 +425,7 @@ function gwvp_deleteGroup($groupname)
        $conn->query($sql);
 }
 
-function gwvp_getGroupsForUser($email)
+function gwvp_getGroupsForUser($email = null, $userid = null)
 {
        $conn = gwvp_ConnectDB();
 
@@ -242,15 +438,25 @@ function gwvp_getGroupsForUser($email)
         gm.groupmember_groupid=g.groups_id and
         g.groups_name='$groupname'
         */
-
-       $sql = "
-                       select g.groups_name from 
-                               group_membership gm, groups g, users u 
-                       where 
-                               gm.groupmember_userid=u.users_id and
-                               u.user_email='$email' and
-                               gm.groupmember_groupid=g.groups_id
-       ";
+       if($email != null) {
+               $sql = "
+                               select g.groups_name from 
+                                       group_membership gm, groups g, users u 
+                               where 
+                                       gm.groupmember_userid=u.users_id and
+                                       u.user_email='$email' and
+                                       gm.groupmember_groupid=g.groups_id
+               ";
+       } else if($userid != null) {
+               $sql = "
+                               select g.groups_name from 
+                                       group_membership gm, groups g, users u 
+                               where 
+                                       gm.groupmember_userid=u.users_id and
+                                       u.users_id='$userid' and
+                                       gm.groupmember_groupid=g.groups_id
+               ";
+       } else return false;
 
        $res = $conn->query($sql);
 
@@ -350,6 +556,43 @@ function gwvp_getGroupId($groupname)
        return $return;
 }
 
+function gwvp_getGroup($gid = null, $gname = null)
+{
+       /* 
+        *      $groupsql = '
+               CREATE TABLE groups (
+           "groups_id" INTEGER PRIMARY KEY AUTOINCREMENT,
+           "groups_name" TEXT,
+           "groups_is_admin" INTEGER,
+               "groups_owner_id" INTEGER
+               )';
+
+        */
+       $conn = gwvp_ConnectDB();
+       
+       if($gid != null) {
+               $sql = "select * from groups where groups_id='$gid'";
+       } else if ($gname != null) {
+               $sql = "select * from groups where groups_name='$gname'";
+       } else return false;
+       
+       $res = $conn->query($sql);
+       $return = false;
+       foreach($res as $u_res) {
+               $return["id"] = $u_res["groups_id"];
+               $return["name"] = $u_res["groups_name"];
+               if($u_res["groups_is_admin"] == 1) {
+                       $return["isadmin"] = true;
+               } else {
+                       $return["isadmin"] = false;
+               }
+               $return["ownerid"] = $u_res["groups_owner_id"];
+               $return["description"] = $u_res["groups_description"];
+       }
+       
+       return $return;
+}
+
 function gwvp_getUserId($useremail=null, $username = null)
 {
        $conn = gwvp_ConnectDB();
@@ -369,6 +612,26 @@ function gwvp_getUserId($useremail=null, $username = null)
        return $return;
 }
 
+function gwvp_getUserName($id = null, $email=null)
+{
+       $conn = gwvp_ConnectDB();
+
+       if($email != null) { 
+               $sql = "select user_username from users where user_email='$email'";
+       } else if($id != null) {
+               $sql = "select user_username from users where users_id='$id'";
+       } else return false;
+
+       $res = $conn->query($sql);
+       $return = false;
+       foreach($res as $u_res) {
+               $return = $u_res["user_username"];
+       }
+
+       return $return;
+}
+
+
 function gwvp_getUserEmail($id)
 {
        $conn = gwvp_ConnectDB();
@@ -384,6 +647,44 @@ function gwvp_getUserEmail($id)
        return $return;
 }
 
+function gwvp_deleteGroupMemberByID($uid, $gid)
+{
+       $conn = gwvp_ConnectDB();
+
+       /*
+        *              CREATE TABLE "group_membership" (
+        "groupmember_id" INTEGER PRIMARY KEY AUTOINCREMENT,
+        "groupmember_groupid" INTEGER,
+        "groupmember_userid" INTEGER
+
+        */
+       $sql = "delete from group_membership where groupmember_groupid='$gid' and  groupmember_userid='$uid'";
+
+       $conn->query($sql);
+
+       return true;
+}
+
+
+function gwvp_addGroupMemberByID($uid, $gid)
+{
+       $conn = gwvp_ConnectDB();
+
+       /*
+        *              CREATE TABLE "group_membership" (
+        "groupmember_id" INTEGER PRIMARY KEY AUTOINCREMENT,
+        "groupmember_groupid" INTEGER,
+        "groupmember_userid" INTEGER
+
+        */
+       $sql = "insert into group_membership values (null, '$gid', '$uid')";
+
+       $conn->query($sql);
+
+       return true;
+}
+
+
 function gwvp_addGroupMember($email, $groupname)
 {
        $conn = gwvp_ConnectDB();
@@ -398,14 +699,28 @@ function gwvp_addGroupMember($email, $groupname)
         "groupmember_userid" INTEGER
 
         */
-       if($uid!=false&&$gid!=false) $sql = "insert into group_membership values (null, '$gid', '$uid')";
+       if($uid!=false&&$gid!=false) gwvp_addGroupMemberByID($uid, $gid);
        else return false;
 
-       $conn->query($sql);
-
        return true;
 }
 
+function gwvp_IsGroupMemberById($uid, $gid)
+{
+       $conn = gwvp_ConnectDB();
+       
+       $sql = "select count(*) from group_membership where groupmember_userid='$uid' and groupmember_groupid='$gid'";
+
+       $res = $conn->query($sql);
+       $result = 0;
+       foreach($res as $u_res) {
+               $result = $u_res[0];
+       }
+
+       if($result == 0) return false;
+       if($result == 1) return true;
+}
+
 function gwvp_IsGroupMember($email, $groupname)
 {
        $conn = gwvp_ConnectDB();
@@ -431,7 +746,47 @@ function gwvp_IsGroupMember($email, $groupname)
        if($result == 1) return true;
 }
 
-function gwvp_IsUserAdmin($email=null, $username = null)
+function gwvp_IsGroupAdmin($groupname = null, $gid = null)
+{
+       $conn = gwvp_ConnectDB();
+       
+       if($groupname != null) {
+               $sql = "select groups_is_admin from groups where groups_name='$groupname'";
+       } else if($gid != null) {
+               $sql = "select groups_is_admin from groups where groups_id='$gid'";
+       } else return false;
+       
+       $res = $conn->query($sql);
+       
+       $return = false;
+       foreach($res as $u_res) {
+               if($u_res["groups_is_admin"] == "1") $return = true;
+       }
+       
+       return $return;
+}
+
+function gwvp_IsRepoOwner($userid, $repoid)
+{
+       $conn = gwvp_ConnectDB();
+       
+       $sql = "select repos_owner from repos where repos_id='$repoid'";
+       
+       $res = $conn->query($sql);
+       
+       $return = false;
+       foreach($res as $u_res) {
+               $return["owner"] = $u_res["repos_owner"];
+       }
+
+       if($return == false) return false;
+       if($return["owner"] == $userid) return true;
+       else return false;
+       
+       
+}
+
+function gwvp_IsUserAdmin($email=null, $username = null, $userid = null)
 {
        $conn = gwvp_ConnectDB();
 
@@ -440,6 +795,8 @@ function gwvp_IsUserAdmin($email=null, $username = null)
        if($email != null) {
                $id = gwvp_getUserId($email);
                $sql = "select groupmember_groupid from group_membership where groupmember_userid='$id'";
+       } else if($userid != null) {
+               $sql = "select groupmember_groupid from group_membership where groupmember_userid='$userid'";
        } else if($username != null) {
                $id = gwvp_getUserId(null, $username);
                $sql = "select groupmember_groupid from group_membership where groupmember_userid='$id'";
@@ -447,12 +804,13 @@ function gwvp_IsUserAdmin($email=null, $username = null)
 
        $res = $conn->query($sql);
        $rn = 0;
+       $gid = false;
        foreach($res as $u_res) {
                $gid[$rn] = $u_res["groupmember_groupid"];
                $rn++;
        }
 
-       foreach($gid as $gid_t) {
+       if($gid !== false) foreach($gid as $gid_t) {
                /*
                 *              CREATE TABLE groups (
                 "groups_id" INTEGER,
@@ -554,13 +912,40 @@ function gwvp_ModifyGroup($groupid, $groupname = null, $group_is_admin = null, $
        return true;
 }
 
-function gwvp_AddRepo($reponame, $repodesc, $repoowner)
+function gwvp_GetRepoId($reponame)
 {
        $conn = gwvp_ConnectDB();
        
-       $sql = "insert into repos values (null, '$reponame', '$repodesc', '$repoowner')";
+       $sql = "select repos_id from repos where repos_name='$reponame'";
        
-       $conn->query($sql);
+       $res = $conn->query($sql);
+       
+       $return = false;
+       foreach($res as $u_res) {
+               $return = $u_res["repos_id"];
+       }
+       
+       return $return;
+       
+}
+
+function gwvp_GetRepo($rid)
+{
+       $conn = gwvp_ConnectDB();
+       
+       $sql = "select * from repos where repos_id='$rid'";
+       
+       $res = $conn->query($sql);
+       
+       $return = false;
+       foreach($res as $u_res) {
+               $return["id"] = $u_res["repos_id"];
+               $return["name"] = $u_res["repos_name"];
+               $return["description"] = $u_res["repos_description"];
+               $return["owner"] = $u_res["repos_owner"];
+       }
+       
+       return $return;
 }
 
 function gwvp_GetRepoList()
@@ -594,6 +979,104 @@ function gwvp_GetRepoList()
        
        return $return;
 }
+
+function gwvp_AddRepo($reponame, $repodesc, $repoowner, $defaultperms = 0)
+{
+       $conn = gwvp_ConnectDB();
+       
+       $sql = "insert into repos values (null, '$reponame', '$repodesc', '$repoowner')";
+       
+       $conn->query($sql);
+       
+       $sql = "select repos_id from repos where repos_name='$reponame'";
+       $res = $conn->query($sql);
+       $rid = -1;
+       foreach($res as $repos) {
+               $rid = $repos["repos_id"];
+       }
+       /*
+        *              CREATE TABLE "repoperms" (
+               "repoperms_id" INTEGER PRIMARY KEY AUTOINCREMENT,
+               "repo_id" INTEGER,
+               "repoperms_type" TEXT,
+               "repoperms_ref" TEXT
+
+        */
+       
+       /*
+        * // default perms:
+// 0 - anyone can clone/read, only owner can write
+// 1 - noone can clone/read, repo is visible (i.e. name), only owner can read/write repo
+// 2 - only owner can see anything
+
+        */
+
+       switch($defaultperms) {
+               case "1":
+                       gwvp_addRepoPermission($rid, "visible", "anon");
+                       break;
+               case "2":
+                       // by 2, we do nothing, owner already has full perms
+                       break;
+               default: // 0
+                       gwvp_addRepoPermission($rid, "read", "anon");
+                       
+       }
+}
+
+function gwvp_getRepoPermissions($repoid)
+{
+       /*
+        *      // this looks like null, <repoid>, <read|visible|write>, user:<uid>|group:<gid>|authed|anon
+       // where authed = any authenticated user, anon = everyone (logged in, not logged in, etc)
+       // read|visible|write = can clone from repo|can see repo exists and see description but not clone from it|can push to repo
+       // TODO: is this sufficient? i have to think about it
+       $repoperms = '
+               CREATE TABLE "repoperms" (
+               "repoperms_id" INTEGER PRIMARY KEY AUTOINCREMENT,
+               "repo_id" INTEGER,
+               "repoperms_type" TEXT,
+               "repoperms_ref" TEXT
+       )';
+
+        */
+       $conn = gwvp_ConnectDB();
+
+       $sql = "select * from repoperms where repo_id='$repoid'";
+       
+       $res = $conn->query($sql);
+       
+       $returns = false;
+       $rn = 0;
+       foreach($res as $perm) {
+               $returns[$rn]["id"] = $perm["repoperms_id"];
+               $returns[$rn]["type"] = $perm["repoperms_type"];
+               $returns[$rn]["ref"] = $perm["repoperms_ref"];
+               $rn++;
+       }
+       
+       return $returns;
+}
+
+function gwvp_removeRepoPermission($permid)
+{
+       $conn = gwvp_ConnectDB();
+       
+       $sql = "delete from repoperms where repoperms_id='$permid'";
+       error_log("attempting: \"$sql\"");
+       
+       return $conn->query($sql);
+}
+
+function gwvp_addRepoPermission($repoid, $permtype, $permref)
+{
+       $conn = gwvp_ConnectDB();
+       
+       error_log("PERMS: $repoid, $permtype, $permref");
+       $sql = "insert into repoperms values(null, '$repoid', '$permtype', '$permref')";
+       
+       return $conn->query($sql);
+}
 /* functions we'll need to access data:
  *
  * getUsers(pattern)