8746f0fb40cf288e0951c24589d8a0ccaec99c56
[gwvp.git] / gwvplib / gwvpdatabase.php
1 <?php
2
3 global $DB_CONNECTION;
4 $DB_CONNECTION = false;
5
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()
8 {
9
10 }
11
12 function gwvp_dbCreateSQLiteStructure($dbloc)
13 {
14         $usersql = '
15                 CREATE TABLE "users" (
16             "users_id" INTEGER PRIMARY KEY AUTOINCREMENT,
17             "user_full_name" TEXT,
18             "user_password" TEXT,
19             "user_username" TEXT,
20             "user_email" TEXT,
21             "user_desc" TEXT,
22             "user_status" TEXT
23                 )';
24
25         $groupsql = '
26                 CREATE TABLE groups (
27             "groups_id" INTEGER PRIMARY KEY AUTOINCREMENT,
28             "groups_name" TEXT,
29             "groups_description" TEXT,
30             "groups_is_admin" INTEGER,
31                 "groups_owner_id" INTEGER
32                 )';
33
34         $reposql = '
35                 CREATE TABLE "repos" (
36             "repos_id" INTEGER PRIMARY KEY AUTOINCREMENT,
37             "repos_name" TEXT,
38             "repos_description" TEXT,
39             "repos_owner" INTEGER
40                 )';
41
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
46         $repoperms = '
47                 CREATE TABLE "repoperms" (
48                 "repoperms_id" INTEGER PRIMARY KEY AUTOINCREMENT,
49                 "repo_id" INTEGER,
50                 "repoperms_type" TEXT,
51                 "repoperms_ref" TEXT
52         )';
53
54         $configsql = '
55                 CREATE TABLE "config" (
56             "config_name" TEXT,
57             "config_value" TEXT
58                 )';
59
60         $groupmemsql = '
61                 CREATE TABLE "group_membership" (
62             "groupmember_id" INTEGER PRIMARY KEY AUTOINCREMENT,
63             "groupmember_groupid" INTEGER,
64             "groupmember_userid" INTEGER
65                 )';
66
67         try {
68                 $DB_CONNECTION = new PDO("sqlite:$dbloc");
69         } catch(PDOException $exep) {
70                 error_log("execpt on db open");
71                 return false;
72         }
73
74
75         $DB_CONNECTION->query($usersql);
76         $DB_CONNECTION->query($groupsql);
77         $DB_CONNECTION->query($reposql);
78         $DB_CONNECTION->query($configsql);
79         $DB_CONNECTION->query($groupmemsql);
80 }
81
82 function gwvp_GetUserStatus($userid)
83 {
84         $conn = gwvp_ConnectDB();
85         
86         $sql = "select user_status from users where users_id='$userid'";
87         
88         $res = $conn->query($sql);
89         
90         $return = null;
91         foreach($res as $val) {
92                 $spl = explode(";", $val);
93                 
94                 $return["statusid"] = $spl[0];
95                 $return["extstatus"] = $spl[1];
96         }
97         
98 }
99
100 function gwvp_SetUserStatus($userid, $status, $extendedstatus=null)
101 {
102         /*
103          * user statues
104          * 0 - all good
105          * 1 - locked
106          * 2 - password locked
107          * 3 - awaiting registration completion
108          * 4 - awaiting password reset
109          * where use status = 3,4 the key for unlock is set as the extended status
110          * i.e. if a user goes thru registration, when the validation email gets to
111          * them they'll have a key in their email (128 or 256 bit), thats what
112          * the extended status field is used for
113          */
114         
115         $conn = gwvp_ConnectDB();
116         
117         if($extendedstatus != null) {
118                 $sql = "update users set user_status='$status;$extendedstatus' where users_id='$userid'";
119         } else {
120                 $sql = "update users set user_status='$status;0' where users_id='$userid'";
121         }
122         
123         return $conn->query($sql);
124         
125 }
126
127 function gwvp_forceDisconnect()
128 {
129         
130         global $DB_CONNECTION;
131         
132         $DB_CONNECTION = false;
133 }
134
135
136 function gwvp_getConfigVal($confname)
137 {
138         /*
139          *      $configsql = '
140                 CREATE TABLE "config" (
141             "config_name" TEXT,
142             "config_value" TEXT
143                 )';
144
145          */
146         
147         $conn = gwvp_ConnectDB();
148         
149         $sql = "select * from config where config_name='$confname'";
150         
151         $res = $conn->query($sql);
152         
153         $return = null;
154         foreach($res as $val) {
155                 $return = $val;
156         }
157         
158 }
159
160 function gwvp_eraseConfigVal($confname)
161 {
162         /*
163          *      $configsql = '
164                 CREATE TABLE "config" (
165             "config_name" TEXT,
166             "config_value" TEXT
167                 )';
168
169          */
170         
171         $conn = gwvp_ConnectDB();
172         
173         $sql = "delete from config where config_name='$confname'";
174         
175         return $conn->query($sql);
176 }
177
178 function gwvp_setConfigVal($confname, $confval)
179 {
180         /*
181          *      $configsql = '
182                 CREATE TABLE "config" (
183             "config_name" TEXT,
184             "config_value" TEXT
185                 )';
186
187          */
188         gwvp_eraseConfigVal($confname);
189
190         $conn = gwvp_ConnectDB();
191         
192         $sql = "insert into config values('$confname', '$confval')";
193         
194         return $conn->query($sql);
195 }
196
197
198 function gwvp_isDBSetup()
199 {
200         // for sqlite, we just check if the db exists, for everyone else, we check for a conneciton and go yay or nay
201         global $WEB_ROOT_FS, $BASE_URL, $repo_base, $data_directory, $db_type, $db_url;
202
203         if($db_type == "sqlite") {
204                 if(file_exists($db_url)) return true;
205                 else return false;
206         }
207
208         // TODO now for the connectables
209         // gwvp_ConnectDB();
210 }
211
212 function gwvp_ConnectDB()
213 {
214         global $WEB_ROOT_FS, $BASE_URL, $repo_base, $data_directory, $db_type, $db_name, $DB_CONNECTION;
215
216         // first check if $DB_CONNECTION IS live
217         if($DB_CONNECTION != false) return $DB_CONNECTION;
218
219         if($db_type == "sqlite") {
220                 $db_url = $db_name;
221                 if(!file_exists($db_name)) {
222                         error_log("$db_name does not exist - problem");
223                 }
224         }
225
226         // and here we go with pdo.
227         error_log("attmpting to open db, $db_type:$db_url");
228         try {
229                 $DB_CONNECTION = new PDO("$db_type:$db_url");
230         } catch(PDOException $exep) {
231                 error_log("execpt on db open");
232                 return false;
233         }
234
235         return $DB_CONNECTION;
236 }
237
238 // TODO: we have to define what "Status" is
239 function gwvp_createUser($email, $fullname, $password, $username, $desc, $status)
240 {
241         $conn = gwvp_ConnectDB();
242
243         // TODO: change from sha1
244         $shapass = sha1($password);
245         //error_log("Create user called with $email");
246         $sql = "insert into users values (null, '$fullname', '$shapass', '$username', '$email', '$desc', '$status')";
247         error_log("Creating user, $sql");
248         return $conn->query($sql);
249         /*
250          *          "users_id" INTEGER PRIMARY KEY AUTOINCREMENT,
251          "user_full_name" TEXT,
252          "user_password" TEXT,
253          "user_username" TEXT,
254          "user_email" TEXT,
255          "user_desc" TEXT,
256          "user_status" INTEGER
257
258          */
259 }
260
261 function gwvp_getUser($username=null, $email=null, $id=null)
262 {
263         $conn = gwvp_ConnectDB();
264
265         if($username != null) {
266                 $res = $conn->query("select * from users where user_username='$username'");
267         } else if($email != null) {
268                 $res = $conn->query("select * from users where user_email='$email'");
269         } else if($id != null) {
270                 $res = $conn->query("select * from users where users_id='$id'");
271         } else return false;
272
273         $returns = false;
274         foreach($res as $u_res) {
275                 $returns["id"] = $u_res["users_id"];
276                 $returns["fullname"] = $u_res["user_full_name"];
277                 $returns["password"] = $u_res["user_password"];
278                 $returns["username"] = $u_res["user_username"];
279                 $returns["email"] = $u_res["user_email"];
280                 $returns["desc"] = $u_res["user_desc"];
281                 $returns["status"] = $u_res["user_status"];
282         }
283
284         return $returns;
285
286 }
287
288 function gwvp_getOwnedRepos($userid = null, $username = null)
289 {
290         $conn = gwvp_ConnectDB();
291         
292         if($username != null) {
293                 $details = gwvp_getUser($username);
294                 $uid = $details["id"];
295                 $sql = "select * from repos where repos_owner='$uid'";
296                 $res = $conn->query($sql);
297                 error_log("sql: $sql");
298         } else if($userid != null) {
299                 $sql = "select * from repos where repos_owner='$userid'";
300                 $res = $conn->query($sql);
301                 error_log("sql: $sql");
302         } else return false;
303         
304         /*
305          *              CREATE TABLE "repos" (
306             "repos_id" INTEGER PRIMARY KEY AUTOINCREMENT,
307             "repos_name" TEXT,
308             "repos_description" TEXT,
309             "repos_owner" INTEGER
310                 )';
311
312          */
313
314         $returns = false;
315         $rn = 0;
316         foreach($res as $u_res) {
317                 $returns[$rn]["id"] = $u_res["repos_id"];
318                 $returns[$rn]["name"] = $u_res["repos_name"];
319                 $returns[$rn]["description"] = $u_res["repos_description"];
320                 $rn++;
321         }
322
323         return $returns;
324 }
325
326 function gwvp_getUsers()
327 {
328         $conn = gwvp_ConnectDB();
329
330         $res = $conn->query("select * from users");
331
332         $returns = false;
333         $rn = 0;
334         foreach($res as $u_res) {
335                 $returns[$rn]["id"] = $u_res["users_id"];
336                 $returns[$rn]["fullname"] = $u_res["user_full_name"];
337                 $returns[$rn]["password"] = $u_res["user_password"];
338                 $returns[$rn]["username"] = $u_res["user_username"];
339                 $returns[$rn]["email"] = $u_res["user_email"];
340                 $returns[$rn]["desc"] = $u_res["user_desc"];
341                 $returns[$rn]["status"] = $u_res["user_status"];
342                 $rn++;
343         }
344
345         return $returns;
346 }
347
348 function gwvp_deleteUser($email)
349 {
350         $conn = gwvp_ConnectDB();
351
352         $sql = "delete from users where user_email='$email'";
353
354         $conn->query($sql);
355 }
356
357 function gwvp_createGroup($group_name, $group_desc, $is_admin, $owner_id)
358 {
359         $conn = gwvp_ConnectDB();
360
361         /*
362          *              CREATE TABLE groups (
363          "groups_id" INTEGER,
364          "groups_name" TEXT,
365          "groups_is_admin" INTEGER,
366                 "groups_owner_id" INTEGER
367                 )';
368
369          */
370         if($is_admin) {
371                 $is_admin_t = 1;
372         } else {
373                 $is_admin_t = 0;
374         }
375         $sql = "insert into groups values( null, '$group_name', '$group_desc', '$is_admin_t', '$owner_id')";
376         
377
378         $conn->query($sql);
379
380 }
381
382 function gwvp_deleteGroup($groupname)
383 {
384         $conn = gwvp_ConnectDB();
385
386         $sql = "delete from groups where groups_name='$groupname'";
387
388         $conn->query($sql);
389 }
390
391 function gwvp_getGroupsForUser($email)
392 {
393         $conn = gwvp_ConnectDB();
394
395         /*
396          select g.groups_name from
397          group_membership gm, groups g, users u
398          where
399          gm.groupmember_userid=u.users_id and
400          u.user_email='$email' and
401          gm.groupmember_groupid=g.groups_id and
402          g.groups_name='$groupname'
403          */
404
405         $sql = "
406                         select g.groups_name from 
407                                 group_membership gm, groups g, users u 
408                         where 
409                                 gm.groupmember_userid=u.users_id and
410                                 u.user_email='$email' and
411                                 gm.groupmember_groupid=g.groups_id
412         ";
413
414         $res = $conn->query($sql);
415
416         $return = false;
417         $rn = 0;
418         foreach($res as $u_res) {
419                 $return[$rn] = $u_res[0];
420                 $rn++;
421         }
422
423         return $return;
424 }
425
426 function gwvp_getGroupsOwnedByUser($email)
427 {
428         $conn = gwvp_ConnectDB();
429
430         /*
431          select g.groups_name from
432          group_membership gm, groups g, users u
433          where
434          gm.groupmember_userid=u.users_id and
435          u.user_email='$email' and
436          gm.groupmember_groupid=g.groups_id and
437          g.groups_name='$groupname'
438          */
439
440         $sql = "
441                         select g.groups_name from 
442                                 groups g, users u 
443                         where 
444                                 u.user_email='$email' and
445                                 u.users_id=g.groups_owner_id
446         ";
447
448         $res = $conn->query($sql);
449
450         $return = false;
451         $rn = 0;
452         foreach($res as $u_res) {
453                 $return[$rn] = $u_res[0];
454                 $rn++;
455         }
456
457         return $return;
458
459 }
460
461 function gwvp_groupOwner($groupname)
462 {
463         $conn = gwvp_ConnectDB();
464
465         $sql = "select u.user_email from users u, groups g where g.groups_name='$groupname' and g.groups_owner_id=u.users_id";
466
467         $res = $conn->query($sql);
468         $return = false;
469         foreach($res as $u_res) {
470                 $return = $u_res[0];
471         }
472
473         return $return;
474 }
475
476 function gwvp_getGroups()
477 {
478         $conn = gwvp_ConnectDB();
479
480         $res = $conn->query("select * from groups");
481
482         $returns = false;
483         $rn = 0;
484         foreach($res as $u_res) {
485                 $returns[$rn]["id"] = $u_res["groups_id"];
486                 $returns[$rn]["name"] = $u_res["groups_name"];
487                 if($u_res["groups_is_admin"]=="1") $return[$rn]["admin"] = true;
488                 else $return[$rn]["admin"] = false;
489                 $returns[$rn]["admin"] = $u_res["groups_is_admin"];
490                 $returns[$rn]["ownerid"] = $u_res["groups_owner_id"];
491                 $rn++;
492         }
493
494         return $returns;
495 }
496
497 function gwvp_getGroupId($groupname)
498 {
499         $conn = gwvp_ConnectDB();
500
501         $sql = "select groups_id from groups where groups_name='$groupname'";
502
503         $res = $conn->query($sql);
504         $return = false;
505         foreach($res as $u_res) {
506                 $return = $u_res["groups_id"];
507         }
508
509         return $return;
510 }
511
512 function gwvp_getGroup($gid = null, $gname = null)
513 {
514         /* 
515          *      $groupsql = '
516                 CREATE TABLE groups (
517             "groups_id" INTEGER PRIMARY KEY AUTOINCREMENT,
518             "groups_name" TEXT,
519             "groups_is_admin" INTEGER,
520                 "groups_owner_id" INTEGER
521                 )';
522
523          */
524         $conn = gwvp_ConnectDB();
525         
526         if($gid != null) {
527                 $sql = "select * from groups where groups_id='$gid'";
528         } else if ($gname != null) {
529                 $sql = "select * from groups where groups_name='$gname'";
530         } else return false;
531         
532         $res = $conn->query($sql);
533         $return = false;
534         foreach($res as $u_res) {
535                 $return["id"] = $u_res["groups_id"];
536                 $return["name"] = $u_res["groups_name"];
537                 if($u_res["groups_is_admin"] == 1) {
538                         $return["isadmin"] = true;
539                 } else {
540                         $return["isadmin"] = false;
541                 }
542                 $return["ownerid"] = $u_res["groups_owner_id"];
543                 $return["description"] = $u_res["groups_description"];
544         }
545         
546         return $return;
547 }
548
549 function gwvp_getUserId($useremail=null, $username = null)
550 {
551         $conn = gwvp_ConnectDB();
552
553         if($useremail != null) {
554                 $sql = "select users_id from users where user_email='$useremail'";
555         } else if($username != null) {
556                 $sql = "select users_id from users where user_username='$username'";
557         } else return false;
558
559         $res = $conn->query($sql);
560         $return = false;
561         foreach($res as $u_res) {
562                 $return = $u_res["users_id"];
563         }
564
565         return $return;
566 }
567
568 function gwvp_getUserName($id = null, $email=null)
569 {
570         $conn = gwvp_ConnectDB();
571
572         if($email != null) { 
573                 $sql = "select user_username from users where user_email='$email'";
574         } else if($id != null) {
575                 $sql = "select user_username from users where users_id='$id'";
576         } else return false;
577
578         $res = $conn->query($sql);
579         $return = false;
580         foreach($res as $u_res) {
581                 $return = $u_res["user_username"];
582         }
583
584         return $return;
585 }
586
587
588 function gwvp_getUserEmail($id)
589 {
590         $conn = gwvp_ConnectDB();
591
592         $sql = "select user_email from users where users_id='$id'";
593
594         $res = $conn->query($sql);
595         $return = false;
596         foreach($res as $u_res) {
597                 $return = $u_res["user_email"];
598         }
599
600         return $return;
601 }
602
603 function gwvp_deleteGroupMemberByID($uid, $gid)
604 {
605         $conn = gwvp_ConnectDB();
606
607         /*
608          *              CREATE TABLE "group_membership" (
609          "groupmember_id" INTEGER PRIMARY KEY AUTOINCREMENT,
610          "groupmember_groupid" INTEGER,
611          "groupmember_userid" INTEGER
612
613          */
614         $sql = "delete from group_membership where groupmember_groupid='$gid' and  groupmember_userid='$uid'";
615
616         $conn->query($sql);
617
618         return true;
619 }
620
621
622 function gwvp_addGroupMemberByID($uid, $gid)
623 {
624         $conn = gwvp_ConnectDB();
625
626         /*
627          *              CREATE TABLE "group_membership" (
628          "groupmember_id" INTEGER PRIMARY KEY AUTOINCREMENT,
629          "groupmember_groupid" INTEGER,
630          "groupmember_userid" INTEGER
631
632          */
633         $sql = "insert into group_membership values (null, '$gid', '$uid')";
634
635         $conn->query($sql);
636
637         return true;
638 }
639
640
641 function gwvp_addGroupMember($email, $groupname)
642 {
643         $conn = gwvp_ConnectDB();
644
645         $uid = gwvp_getUserId($email);
646         $gid = gwvp_getGroupId($groupname);
647
648         /*
649          *              CREATE TABLE "group_membership" (
650          "groupmember_id" INTEGER PRIMARY KEY AUTOINCREMENT,
651          "groupmember_groupid" INTEGER,
652          "groupmember_userid" INTEGER
653
654          */
655         if($uid!=false&&$gid!=false) gwvp_addGroupMemberByID($uid, $gid);
656         else return false;
657
658         $conn->query($sql);
659
660         return true;
661 }
662
663 function gwvp_IsGroupMember($email, $groupname)
664 {
665         $conn = gwvp_ConnectDB();
666
667         // i think this is right
668         $sql = "
669                         select count(*) from 
670                                 group_membership gm, groups g, users u 
671                         where 
672                                 gm.groupmember_userid=u.users_id and
673                                 u.user_email='$email' and
674                                 gm.groupmember_groupid=g.groups_id and
675                                 g.groups_name='$groupname'
676                         ";
677
678         $res = $conn->query($sql);
679         $result = 0;
680         foreach($res as $u_res) {
681                 $result = $u_res[0];
682         }
683
684         if($result == 0) return false;
685         if($result == 1) return true;
686 }
687
688 function gwvp_IsUserAdmin($email=null, $username = null)
689 {
690         $conn = gwvp_ConnectDB();
691
692
693         // TODO: clean this up, this should be a single query - idiot
694         if($email != null) {
695                 $id = gwvp_getUserId($email);
696                 $sql = "select groupmember_groupid from group_membership where groupmember_userid='$id'";
697         } else if($username != null) {
698                 $id = gwvp_getUserId(null, $username);
699                 $sql = "select groupmember_groupid from group_membership where groupmember_userid='$id'";
700         } else return false;
701
702         $res = $conn->query($sql);
703         $rn = 0;
704         $gid = false;
705         foreach($res as $u_res) {
706                 $gid[$rn] = $u_res["groupmember_groupid"];
707                 $rn++;
708         }
709
710         if($gid !== false) foreach($gid as $gid_t) {
711                 /*
712                  *              CREATE TABLE groups (
713                  "groups_id" INTEGER,
714                  "groups_name" TEXT,
715                  "groups_is_admin" INTEGER,
716                  "groups_owner_id" INTEGER
717                  )';
718
719                  */
720
721                 $sql = "select groups_is_admin from groups where groups_id='$gid_t'";
722                 $res = $conn->query($sql);
723                 foreach($res as $u_res) {
724                         if($u_res["groups_is_admin"] == "1") return true;
725                 }
726         }
727
728         return false;
729 }
730
731 function gwvp_ModifyUser($userid, $email=null, $fullname=null, $password=null, $username=null, $desc=null, $status=null)
732 {
733         /*
734          *          "users_id" INTEGER PRIMARY KEY AUTOINCREMENT,
735          "user_full_name" TEXT,
736          "user_password" TEXT,
737          "user_username" TEXT,
738          "user_email" TEXT,
739          "user_desc" TEXT,
740          "user_status" INTEGER
741
742          */
743
744         $conn = gwvp_ConnectDB();
745
746         if($email != null) {
747                 $sql = "update users set user_email='$email' where users_id='$userid'";
748                 $conn->query($sql);
749         }
750
751         if($fullname != null) {
752                 $sql = "update users set user_full_name='$fullname' where users_id='$userid'";
753                 $conn->query($sql);
754         }
755
756         if($password != null) {
757                 $shapass = sha1($password);
758                 $sql = "update users set user_password='$shapass' where users_id='$userid'";
759                 $conn->query($sql);
760         }
761
762         if($username != null) {
763                 $sql = "update users set user_username='$username' where users_id='$userid'";
764                 $conn->query($sql);
765         }
766
767         if($desc != null) {
768                 $sql = "update users set user_desc='$desc' where users_id='$userid'";
769                 $conn->query($sql);
770         }
771
772         if($status != null) {
773                 $sql = "update users set user_status='$status' where users_id='$userid'";
774                 $conn->query($sql);
775         }
776
777         return true;
778 }
779
780
781 function gwvp_ModifyGroup($groupid, $groupname = null, $group_is_admin = null, $groups_owner_id = null)
782 {
783         /*
784          *              CREATE TABLE groups (
785          "groups_id" INTEGER,
786          "groups_name" TEXT,
787          "groups_is_admin" INTEGER,
788                 "groups_owner_id" INTEGER
789                 )';
790
791          */
792         $conn = gwvp_ConnectDB();
793
794         if($groupname != null) {
795                 $sql = "update groups set groups_name='$groupname' where groups_id='$groupid'";
796                 $conn->query($sql);
797         }
798
799         if($group_is_admin != null) {
800                 $sql = "update groups set groups_is_admin='$group_is_admin' where groups_id='$groupid'";
801                 $conn->query($sql);
802         }
803
804         if($groups_owner_id != null) {
805                 $sql = "update groups set groups_owner_id='$groups_owner_id' where groups_id='$groupid'";
806                 $conn->query($sql);
807         }
808
809         return true;
810 }
811
812 function gwvp_AddRepo($reponame, $repodesc, $repoowner)
813 {
814         $conn = gwvp_ConnectDB();
815         
816         $sql = "insert into repos values (null, '$reponame', '$repodesc', '$repoowner')";
817         
818         $conn->query($sql);
819 }
820
821 function gwvp_GetRepoList()
822 {
823         $conn = gwvp_ConnectDB();
824
825         /*
826          *      $reposql = '
827                 CREATE TABLE "repos" (
828                 "repos_id" INTEGER PRIMARY KEY AUTOINCREMENT,
829                 "repos_name" TEXT,
830                 "repos_description" TEXT,
831                 "repos_owner" INTEGER
832                 )';
833
834          */
835
836         $sql = "select * from repos";
837         
838         $res = $conn->query($sql);
839         
840         $return = false;
841         $rn = 0;
842         foreach($res as $u_res) {
843                 $return[$rn]["id"] = $u_res["repos_id"];
844                 $return[$rn]["name"] = $u_res["repos_name"];
845                 $return[$rn]["description"] = $u_res["repos_description"];
846                 $return[$rn]["owner"] = $u_res["repos_owner"];
847                 $rn++;
848         }
849         
850         return $return;
851 }
852 /* functions we'll need to access data:
853  *
854  * getUsers(pattern)
855  * getUserData(username)
856  * getGroups(pattern)
857  * getGroupData(groupname)
858  * modifyGroup(...)
859  * addGroupMember(...)
860  * deleteGroupMember(...)
861  *
862  * createUser(...)
863  * deleteUser(...)
864  * modifyUser(...)
865  * createRepo(...)
866  * deleteRepo(...)
867  * getRepos()
868  */
869
870
871
872 ?>