4 $DB_CONNECTION = false;
6 // 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
7 function gwvp_dbCreateMysqlStructure()
12 function gwvp_dbCreateSQLiteStructure($dbloc)
15 CREATE TABLE "users" (
16 "users_id" INTEGER PRIMARY KEY AUTOINCREMENT,
17 "user_full_name" TEXT,
27 "groups_id" INTEGER PRIMARY KEY AUTOINCREMENT,
29 "groups_description" TEXT,
30 "groups_is_admin" INTEGER,
31 "groups_owner_id" INTEGER
35 CREATE TABLE "repos" (
36 "repos_id" INTEGER PRIMARY KEY AUTOINCREMENT,
38 "repos_description" TEXT,
42 // this looks like null, <repoid>, <read|visible|write>, user:<uid>|group:<gid>|authed|anon
43 // where authed = any authenticated user, anon = everyone (logged in, not logged in, etc)
44 // read|visible|write = can clone from repo|can see repo exists and see description but not clone from it|can push to repo
45 // TODO: is this sufficient? i have to think about it
47 CREATE TABLE "repoperms" (
48 "repoperms_id" INTEGER PRIMARY KEY AUTOINCREMENT,
50 "repoperms_type" TEXT,
55 CREATE TABLE "config" (
61 CREATE TABLE "group_membership" (
62 "groupmember_id" INTEGER PRIMARY KEY AUTOINCREMENT,
63 "groupmember_groupid" INTEGER,
64 "groupmember_userid" INTEGER
68 $DB_CONNECTION = new PDO("sqlite:$dbloc");
69 } catch(PDOException $exep) {
70 error_log("execpt on db open");
75 $DB_CONNECTION->query($usersql);
76 $DB_CONNECTION->query($groupsql);
77 $DB_CONNECTION->query($reposql);
78 $DB_CONNECTION->query($repoperms);
79 $DB_CONNECTION->query($configsql);
80 $DB_CONNECTION->query($groupmemsql);
83 function gwvp_GetUserStatus($userid)
85 $conn = gwvp_ConnectDB();
87 $sql = "select user_status from users where users_id='$userid'";
89 $res = $conn->query($sql);
92 foreach($res as $val) {
93 $spl = explode(";", $val);
95 $return["statusid"] = $spl[0];
96 $return["extstatus"] = $spl[1];
101 function gwvp_SetUserStatus($userid, $status, $extendedstatus=null)
107 * 2 - password locked
108 * 3 - awaiting registration completion
109 * 4 - awaiting password reset
110 * where use status = 3,4 the key for unlock is set as the extended status
111 * i.e. if a user goes thru registration, when the validation email gets to
112 * them they'll have a key in their email (128 or 256 bit), thats what
113 * the extended status field is used for
116 $conn = gwvp_ConnectDB();
118 if($extendedstatus != null) {
119 $sql = "update users set user_status='$status;$extendedstatus' where users_id='$userid'";
121 $sql = "update users set user_status='$status;0' where users_id='$userid'";
124 return $conn->query($sql);
128 function gwvp_forceDisconnect()
131 global $DB_CONNECTION;
133 $DB_CONNECTION = false;
137 function gwvp_getConfigVal($confname)
141 CREATE TABLE "config" (
148 $conn = gwvp_ConnectDB();
150 $sql = "select * from config where config_name='$confname'";
152 $res = $conn->query($sql);
155 foreach($res as $val) {
161 function gwvp_eraseConfigVal($confname)
165 CREATE TABLE "config" (
172 $conn = gwvp_ConnectDB();
174 $sql = "delete from config where config_name='$confname'";
176 return $conn->query($sql);
179 function gwvp_setConfigVal($confname, $confval)
183 CREATE TABLE "config" (
189 gwvp_eraseConfigVal($confname);
191 $conn = gwvp_ConnectDB();
193 $sql = "insert into config values('$confname', '$confval')";
195 return $conn->query($sql);
199 function gwvp_isDBSetup()
201 // for sqlite, we just check if the db exists, for everyone else, we check for a conneciton and go yay or nay
202 global $WEB_ROOT_FS, $BASE_URL, $repo_base, $data_directory, $db_type, $db_url;
204 if($db_type == "sqlite") {
205 if(file_exists($db_url)) return true;
209 // TODO now for the connectables
213 function gwvp_ConnectDB()
215 global $WEB_ROOT_FS, $BASE_URL, $repo_base, $data_directory, $db_type, $db_name, $DB_CONNECTION;
217 // first check if $DB_CONNECTION IS live
218 if($DB_CONNECTION != false) return $DB_CONNECTION;
220 if($db_type == "sqlite") {
222 if(!file_exists($db_name)) {
223 error_log("$db_name does not exist - problem");
227 // and here we go with pdo.
228 error_log("attmpting to open db, $db_type:$db_url");
230 $DB_CONNECTION = new PDO("$db_type:$db_url");
231 } catch(PDOException $exep) {
232 error_log("execpt on db open");
236 return $DB_CONNECTION;
239 // TODO: we have to define what "Status" is
240 function gwvp_createUser($email, $fullname, $password, $username, $desc, $status)
242 $conn = gwvp_ConnectDB();
244 // TODO: change from sha1
245 $shapass = sha1($password);
246 //error_log("Create user called with $email");
247 $sql = "insert into users values (null, '$fullname', '$shapass', '$username', '$email', '$desc', '$status')";
248 error_log("Creating user, $sql");
249 return $conn->query($sql);
251 * "users_id" INTEGER PRIMARY KEY AUTOINCREMENT,
252 "user_full_name" TEXT,
253 "user_password" TEXT,
254 "user_username" TEXT,
257 "user_status" INTEGER
262 function gwvp_getUser($username=null, $email=null, $id=null)
264 $conn = gwvp_ConnectDB();
266 if($username != null) {
267 $res = $conn->query("select * from users where user_username='$username'");
268 } else if($email != null) {
269 $res = $conn->query("select * from users where user_email='$email'");
270 } else if($id != null) {
271 $res = $conn->query("select * from users where users_id='$id'");
275 foreach($res as $u_res) {
276 $returns["id"] = $u_res["users_id"];
277 $returns["fullname"] = $u_res["user_full_name"];
278 $returns["password"] = $u_res["user_password"];
279 $returns["username"] = $u_res["user_username"];
280 $returns["email"] = $u_res["user_email"];
281 $returns["desc"] = $u_res["user_desc"];
282 $returns["status"] = $u_res["user_status"];
289 function gwvp_getRepoOwner($repoid)
291 $conn = gwvp_ConnectDB();
293 $sql = "select repos_owner from repos where repos_id='$repoid'";
295 $res = $conn->query($sql);
298 foreach($res as $rown) {
299 $return = $rown["repos_owner"];
304 function gwvp_getOwnedRepos($userid = null, $username = null)
306 $conn = gwvp_ConnectDB();
308 if($username != null) {
309 $details = gwvp_getUser($username);
310 $uid = $details["id"];
311 $sql = "select * from repos where repos_owner='$uid'";
312 $res = $conn->query($sql);
313 error_log("sql: $sql");
314 } else if($userid != null) {
315 $sql = "select * from repos where repos_owner='$userid'";
316 $res = $conn->query($sql);
317 error_log("sql: $sql");
321 * CREATE TABLE "repos" (
322 "repos_id" INTEGER PRIMARY KEY AUTOINCREMENT,
324 "repos_description" TEXT,
325 "repos_owner" INTEGER
332 foreach($res as $u_res) {
333 $returns[$rn]["id"] = $u_res["repos_id"];
334 $returns[$rn]["name"] = $u_res["repos_name"];
335 $returns[$rn]["description"] = $u_res["repos_description"];
342 function gwvp_getUsers()
344 $conn = gwvp_ConnectDB();
346 $res = $conn->query("select * from users");
350 foreach($res as $u_res) {
351 $returns[$rn]["id"] = $u_res["users_id"];
352 $returns[$rn]["fullname"] = $u_res["user_full_name"];
353 $returns[$rn]["password"] = $u_res["user_password"];
354 $returns[$rn]["username"] = $u_res["user_username"];
355 $returns[$rn]["email"] = $u_res["user_email"];
356 $returns[$rn]["desc"] = $u_res["user_desc"];
357 $returns[$rn]["status"] = $u_res["user_status"];
364 function gwvp_deleteUser($email)
366 $conn = gwvp_ConnectDB();
368 $sql = "delete from users where user_email='$email'";
373 function gwvp_createGroup($group_name, $group_desc, $is_admin, $owner_id)
375 $conn = gwvp_ConnectDB();
378 * CREATE TABLE groups (
381 "groups_is_admin" INTEGER,
382 "groups_owner_id" INTEGER
391 $sql = "insert into groups values( null, '$group_name', '$group_desc', '$is_admin_t', '$owner_id')";
398 function gwvp_deleteGroup($groupname)
400 $conn = gwvp_ConnectDB();
402 $sql = "delete from groups where groups_name='$groupname'";
407 function gwvp_getGroupsForUser($email = null, $userid = null)
409 $conn = gwvp_ConnectDB();
412 select g.groups_name from
413 group_membership gm, groups g, users u
415 gm.groupmember_userid=u.users_id and
416 u.user_email='$email' and
417 gm.groupmember_groupid=g.groups_id and
418 g.groups_name='$groupname'
422 select g.groups_name from
423 group_membership gm, groups g, users u
425 gm.groupmember_userid=u.users_id and
426 u.user_email='$email' and
427 gm.groupmember_groupid=g.groups_id
429 } else if($userid != null) {
431 select g.groups_name from
432 group_membership gm, groups g, users u
434 gm.groupmember_userid=u.users_id and
435 u.users_id='$userid' and
436 gm.groupmember_groupid=g.groups_id
440 $res = $conn->query($sql);
444 foreach($res as $u_res) {
445 $return[$rn] = $u_res[0];
452 function gwvp_getGroupsOwnedByUser($email)
454 $conn = gwvp_ConnectDB();
457 select g.groups_name from
458 group_membership gm, groups g, users u
460 gm.groupmember_userid=u.users_id and
461 u.user_email='$email' and
462 gm.groupmember_groupid=g.groups_id and
463 g.groups_name='$groupname'
467 select g.groups_name from
470 u.user_email='$email' and
471 u.users_id=g.groups_owner_id
474 $res = $conn->query($sql);
478 foreach($res as $u_res) {
479 $return[$rn] = $u_res[0];
487 function gwvp_groupOwner($groupname)
489 $conn = gwvp_ConnectDB();
491 $sql = "select u.user_email from users u, groups g where g.groups_name='$groupname' and g.groups_owner_id=u.users_id";
493 $res = $conn->query($sql);
495 foreach($res as $u_res) {
502 function gwvp_getGroups()
504 $conn = gwvp_ConnectDB();
506 $res = $conn->query("select * from groups");
510 foreach($res as $u_res) {
511 $returns[$rn]["id"] = $u_res["groups_id"];
512 $returns[$rn]["name"] = $u_res["groups_name"];
513 if($u_res["groups_is_admin"]=="1") $return[$rn]["admin"] = true;
514 else $return[$rn]["admin"] = false;
515 $returns[$rn]["admin"] = $u_res["groups_is_admin"];
516 $returns[$rn]["ownerid"] = $u_res["groups_owner_id"];
523 function gwvp_getGroupId($groupname)
525 $conn = gwvp_ConnectDB();
527 $sql = "select groups_id from groups where groups_name='$groupname'";
529 $res = $conn->query($sql);
531 foreach($res as $u_res) {
532 $return = $u_res["groups_id"];
538 function gwvp_getGroup($gid = null, $gname = null)
542 CREATE TABLE groups (
543 "groups_id" INTEGER PRIMARY KEY AUTOINCREMENT,
545 "groups_is_admin" INTEGER,
546 "groups_owner_id" INTEGER
550 $conn = gwvp_ConnectDB();
553 $sql = "select * from groups where groups_id='$gid'";
554 } else if ($gname != null) {
555 $sql = "select * from groups where groups_name='$gname'";
558 $res = $conn->query($sql);
560 foreach($res as $u_res) {
561 $return["id"] = $u_res["groups_id"];
562 $return["name"] = $u_res["groups_name"];
563 if($u_res["groups_is_admin"] == 1) {
564 $return["isadmin"] = true;
566 $return["isadmin"] = false;
568 $return["ownerid"] = $u_res["groups_owner_id"];
569 $return["description"] = $u_res["groups_description"];
575 function gwvp_getUserId($useremail=null, $username = null)
577 $conn = gwvp_ConnectDB();
579 if($useremail != null) {
580 $sql = "select users_id from users where user_email='$useremail'";
581 } else if($username != null) {
582 $sql = "select users_id from users where user_username='$username'";
585 $res = $conn->query($sql);
587 foreach($res as $u_res) {
588 $return = $u_res["users_id"];
594 function gwvp_getUserName($id = null, $email=null)
596 $conn = gwvp_ConnectDB();
599 $sql = "select user_username from users where user_email='$email'";
600 } else if($id != null) {
601 $sql = "select user_username from users where users_id='$id'";
604 $res = $conn->query($sql);
606 foreach($res as $u_res) {
607 $return = $u_res["user_username"];
614 function gwvp_getUserEmail($id)
616 $conn = gwvp_ConnectDB();
618 $sql = "select user_email from users where users_id='$id'";
620 $res = $conn->query($sql);
622 foreach($res as $u_res) {
623 $return = $u_res["user_email"];
629 function gwvp_deleteGroupMemberByID($uid, $gid)
631 $conn = gwvp_ConnectDB();
634 * CREATE TABLE "group_membership" (
635 "groupmember_id" INTEGER PRIMARY KEY AUTOINCREMENT,
636 "groupmember_groupid" INTEGER,
637 "groupmember_userid" INTEGER
640 $sql = "delete from group_membership where groupmember_groupid='$gid' and groupmember_userid='$uid'";
648 function gwvp_addGroupMemberByID($uid, $gid)
650 $conn = gwvp_ConnectDB();
653 * CREATE TABLE "group_membership" (
654 "groupmember_id" INTEGER PRIMARY KEY AUTOINCREMENT,
655 "groupmember_groupid" INTEGER,
656 "groupmember_userid" INTEGER
659 $sql = "insert into group_membership values (null, '$gid', '$uid')";
667 function gwvp_addGroupMember($email, $groupname)
669 $conn = gwvp_ConnectDB();
671 $uid = gwvp_getUserId($email);
672 $gid = gwvp_getGroupId($groupname);
675 * CREATE TABLE "group_membership" (
676 "groupmember_id" INTEGER PRIMARY KEY AUTOINCREMENT,
677 "groupmember_groupid" INTEGER,
678 "groupmember_userid" INTEGER
681 if($uid!=false&&$gid!=false) gwvp_addGroupMemberByID($uid, $gid);
687 function gwvp_IsGroupMember($email, $groupname)
689 $conn = gwvp_ConnectDB();
691 // i think this is right
694 group_membership gm, groups g, users u
696 gm.groupmember_userid=u.users_id and
697 u.user_email='$email' and
698 gm.groupmember_groupid=g.groups_id and
699 g.groups_name='$groupname'
702 $res = $conn->query($sql);
704 foreach($res as $u_res) {
708 if($result == 0) return false;
709 if($result == 1) return true;
712 function gwvp_IsUserAdmin($email=null, $username = null, $userid = null)
714 $conn = gwvp_ConnectDB();
717 // TODO: clean this up, this should be a single query - idiot
719 $id = gwvp_getUserId($email);
720 $sql = "select groupmember_groupid from group_membership where groupmember_userid='$id'";
721 } else if($userid != null) {
722 $sql = "select groupmember_groupid from group_membership where groupmember_userid='$userid'";
723 } else if($username != null) {
724 $id = gwvp_getUserId(null, $username);
725 $sql = "select groupmember_groupid from group_membership where groupmember_userid='$id'";
728 $res = $conn->query($sql);
731 foreach($res as $u_res) {
732 $gid[$rn] = $u_res["groupmember_groupid"];
736 if($gid !== false) foreach($gid as $gid_t) {
738 * CREATE TABLE groups (
741 "groups_is_admin" INTEGER,
742 "groups_owner_id" INTEGER
747 $sql = "select groups_is_admin from groups where groups_id='$gid_t'";
748 $res = $conn->query($sql);
749 foreach($res as $u_res) {
750 if($u_res["groups_is_admin"] == "1") return true;
757 function gwvp_ModifyUser($userid, $email=null, $fullname=null, $password=null, $username=null, $desc=null, $status=null)
760 * "users_id" INTEGER PRIMARY KEY AUTOINCREMENT,
761 "user_full_name" TEXT,
762 "user_password" TEXT,
763 "user_username" TEXT,
766 "user_status" INTEGER
770 $conn = gwvp_ConnectDB();
773 $sql = "update users set user_email='$email' where users_id='$userid'";
777 if($fullname != null) {
778 $sql = "update users set user_full_name='$fullname' where users_id='$userid'";
782 if($password != null) {
783 $shapass = sha1($password);
784 $sql = "update users set user_password='$shapass' where users_id='$userid'";
788 if($username != null) {
789 $sql = "update users set user_username='$username' where users_id='$userid'";
794 $sql = "update users set user_desc='$desc' where users_id='$userid'";
798 if($status != null) {
799 $sql = "update users set user_status='$status' where users_id='$userid'";
807 function gwvp_ModifyGroup($groupid, $groupname = null, $group_is_admin = null, $groups_owner_id = null)
810 * CREATE TABLE groups (
813 "groups_is_admin" INTEGER,
814 "groups_owner_id" INTEGER
818 $conn = gwvp_ConnectDB();
820 if($groupname != null) {
821 $sql = "update groups set groups_name='$groupname' where groups_id='$groupid'";
825 if($group_is_admin != null) {
826 $sql = "update groups set groups_is_admin='$group_is_admin' where groups_id='$groupid'";
830 if($groups_owner_id != null) {
831 $sql = "update groups set groups_owner_id='$groups_owner_id' where groups_id='$groupid'";
838 function gwvp_GetRepoList()
840 $conn = gwvp_ConnectDB();
844 CREATE TABLE "repos" (
845 "repos_id" INTEGER PRIMARY KEY AUTOINCREMENT,
847 "repos_description" TEXT,
848 "repos_owner" INTEGER
853 $sql = "select * from repos";
855 $res = $conn->query($sql);
859 foreach($res as $u_res) {
860 $return[$rn]["id"] = $u_res["repos_id"];
861 $return[$rn]["name"] = $u_res["repos_name"];
862 $return[$rn]["description"] = $u_res["repos_description"];
863 $return[$rn]["owner"] = $u_res["repos_owner"];
870 function gwvp_AddRepo($reponame, $repodesc, $repoowner, $defaultperms = 0)
872 $conn = gwvp_ConnectDB();
874 $sql = "insert into repos values (null, '$reponame', '$repodesc', '$repoowner')";
878 $sql = "select repos_id from repos where repos_name='$reponame'";
879 $res = $conn->query($sql);
881 foreach($res as $repos) {
882 $rid = $repos["repos_id"];
885 * CREATE TABLE "repoperms" (
886 "repoperms_id" INTEGER PRIMARY KEY AUTOINCREMENT,
888 "repoperms_type" TEXT,
895 // 0 - anyone can clone/read, only owner can write
896 // 1 - noone can clone/read, repo is visible (i.e. name), only owner can read/write repo
897 // 2 - only owner can see anything
901 switch($defaultperms) {
903 gwvp_addRepoPermission($rid, "visible", "anon");
906 // by 2, we do nothing, owner already has full perms
909 gwvp_addRepoPermission($rid, "read", "anon");
914 function gwvp_getRepoPermissions($repoid)
917 * // this looks like null, <repoid>, <read|visible|write>, user:<uid>|group:<gid>|authed|anon
918 // where authed = any authenticated user, anon = everyone (logged in, not logged in, etc)
919 // read|visible|write = can clone from repo|can see repo exists and see description but not clone from it|can push to repo
920 // TODO: is this sufficient? i have to think about it
922 CREATE TABLE "repoperms" (
923 "repoperms_id" INTEGER PRIMARY KEY AUTOINCREMENT,
925 "repoperms_type" TEXT,
930 $conn = gwvp_ConnectDB();
932 $sql = "select * from repoperms where repo_id='$repoid'";
934 $res = $conn->query($sql);
938 foreach($res as $perm) {
939 $returns[$rn]["permid"] = $perm["repoperms_id"];
940 $returns[$rn]["type"] = $perm["repoperms_type"];
941 $returns[$rn]["ref"] = $perm["repoperms_ref"];
948 function gwvp_addRepoPermission($repoid, $permtype, $permref)
950 $conn = gwvp_ConnectDB();
952 $sql = "insert into repoperms values(null, '$repoid', '$permtype', '$permref')";
954 return $conn->query($sql);
956 /* functions we'll need to access data:
959 * getUserData(username)
961 * getGroupData(groupname)
963 * addGroupMember(...)
964 * deleteGroupMember(...)