add list of repos a user can commit to
[gwvp-mini.git] / gwvpmini / gwvpmini_view.php
1 <?php
2 global $HOME_PAGE_PROVIDERS;
3
4
5 $CALL_ME_FUNCTIONS["repoview"] = "gwvpmini_RepoViewCallMe";
6
7
8
9 function gwvpmini_RepoViewCallMe()
10 {
11         global $repo_view_call;
12         
13         error_log("in admin callme");\r
14         if(isset($_REQUEST["q"])) {\r
15                 $query = $_REQUEST["q"];\r
16                 $qspl = explode("/", $query);\r
17                 if(isset($qspl[0])) {\r
18                         if($qspl[0] == "view") {\r
19                                 if(isset($qspl[1])) {
20                                         $repo_view_call = $qspl[1];
21                                         return "gwvpmini_RepoViewPage";\r
22                                 } else return false;\r
23                         }
24                         if($qspl[0] == "updaterepobaseperms") {
25                                 return "gwvpmini_UpdateRepoBasePerms";
26                         } 
27                         if($qspl[0] == "repoaddreader") {
28                                 return "gwvpmini_AddRepoReader";
29                         }
30                         if($qspl[0] == "repoaddcontrib") {
31                                 return "gwvpmini_AddRepoContributor";
32                         }
33                         if($qspl[0] == "reporemovereaders") {
34                                 return "gwvpmini_RemoveRepoReader";
35                         }
36                         if($qspl[0] == "reporemovecontribs") {
37                                 return "gwvpmini_RemoveRepoContributor";
38                         }
39                         if($qspl[0] == "repoupdatedesc") {
40                                 return "gwvpmini_RepoUpdateDescription";
41                         }
42                         return false;\r
43                 }\r
44                 else return false;\r
45         }\r
46 \r
47         return false;\r
48         
49         
50 }
51
52 function gwvpmini_RepoViewPage()\r
53 {
54         global $repo_view_call, $MENU_ITEMS, $BASE_URL;\r
55         \r
56         $MENU_ITEMS["40thisrepo"]["text"] = "$repo_view_call";\r
57         $MENU_ITEMS["40thisrepo"]["link"] = "$BASE_URL/view/$repo_view_call";\r
58         \r
59         gwvpmini_goMainPage("gwvpmini_RepoViewPageBody");\r
60 }
61
62 function gwvpmini_RepoViewPageBody()
63 {
64         global $repo_view_call, $MENU_ITEMS, $BASE_URL;
65         
66         $repo_base = gwvpmini_getConfigVal("repodir");\r
67
68         $bperms_f = gwvpmini_GetRepoPerms(gwvpmini_GetRepoId($repo_view_call));
69         $bperms = $bperms_f["b"];
70         
71         $owner_view = false;\r
72         
73         if($_SERVER["SERVER_PORT"] == 443) $proto="https://";
74         else $proto = "http://";
75         $sname = $_SERVER["SERVER_NAME"];
76         
77         $owner = gwvpmini_GetRepoOwnerDetailsFromName($repo_view_call);
78         $desc = gwvpmini_GetRepoDescFromName($repo_view_call);
79         $editdesc = preg_replace("/\<br\>/", "\n", $desc);
80         
81         $rid = gwvpmini_GetRepoId($repo_view_call);
82         
83         $owner_name = $owner["username"];
84         
85         // TODO: fix this so that if user has no read access to repo, they cant see it
86         if(isset($_SESSION["id"])) {
87                 if($owner["id"] == $_SESSION["id"]) {
88                         $owner_view = true;
89                 } else if ($bperms != "r") {
90                         // check user level perms
91                         $perm = gwvpmini_GetRepoPerm($rid, $_SESSION["id"]);
92                         if($perm < 1) {
93                                 header("Location: $BASE_URL");\r
94                                 return;
95                         }
96                 }
97         } else {
98                 if($bperms != "a") {
99                         header("Location: $BASE_URL");
100                         return;
101                 }
102         }
103         
104         
105         error_log("STUFF:".print_r($owner,true));
106         if($bperms != "a") $login = $_SESSION["username"].":password@";
107         else $login = "";
108         $cloneurl = "git clone $proto$login$sname$BASE_URL/git/$repo_view_call.git";
109         echo "<textarea rows=1 cols=".strlen($cloneurl).">$cloneurl</textarea><br>";
110         
111         if($owner_view) $owner_extra = " (YOU)";
112         else $owner_extra = "";\r
113         
114         echo "<h2>".get_gravatar($owner["email"], 30, 'mm', 'g', true)."$repo_view_call - $owner_name$owner_extra</h2>";
115         if(!$owner_view) echo "<b>$desc</b><br>";
116         
117         if($owner_view) {
118                 echo "<form method=\"post\" action=\"$BASE_URL/repoupdatedesc/$repo_view_call\">";\r
119                 echo "<h3>Description<h3><textarea name=\"desc\" cols=\"120\" rows=\"5\">$editdesc</textarea><br><input type=\"submit\" name=\"Update\" value=\"Update\">";\r
120                 echo "</form><br>";\r
121                 
122                 
123
124                 
125                 $anyo = "";
126                 $regd = "";
127                 $expl = "";
128                 if($bperms == "a") $anyo = " selected";\r
129                 if($bperms == "r") $regd = " selected";\r
130                 if($bperms == "x") $expl = " selected";\r
131                 
132                 error_log("BPERMS: $bperms");
133                 
134                 if($bperms == "x") $cspan = 3;
135                 else $cspan = 2;
136                 
137                 echo "<table border=\"1\"><tr valign=\"top\"><tr><th colspan=\"$cspan\">Permissions</th></tr><td>";
138                 echo "<form method=\"post\" action=\"$BASE_URL/updaterepobaseperms/$repo_view_call\">";
139                 echo "<select name=\"base_perms\">";
140                 echo "<option value=\"a\"$anyo>Anyone can read</option>";
141                 echo "<option value=\"r\"$regd>Only registered users can read</option>";
142                 echo "<option value=\"x\"$expl>Explicit read permissions</option>";
143                 echo "</select>";
144                 echo "<input type=\"submit\" name=\"Set\" value=\"Set\">";
145                 echo "</form>";
146                 if($bperms == "x") {
147                         echo "</td><td><b>Readers</b><br>";
148                         echo "<form method=\"post\" action=\"$BASE_URL/reporemovereaders/$repo_view_call\">";
149                         $nl = 0;
150                         foreach($bperms_f as $key=>$val) {
151                                 if($val == 1) {
152                                         $dets = gwvpmini_getUser(null, null, $key);
153                                         echo get_gravatar($dets["email"], 18, 'mm', 'g', true)." <input type=\"checkbox\" name=\"$key\"> ".$dets["username"]."<br>";
154                                         $nl = 1;
155                                 }
156                         }
157                         if($nl==1) echo "<input type=\"submit\" name=\"remove\" value=\"Remove Selected\">";
158                         echo "</form>";
159                         echo "<form method=\"post\" action=\"$BASE_URL/repoaddreader/$repo_view_call\">";
160                         echo "<input type=\"text\" name=\"readerusername\"> <input type=\"submit\" name=\"Add\" value=\"Add\">";
161                         echo "</form><br>";
162                 }
163                 
164                 echo "</td><td><b>Contributors</b><br>";
165                 echo "<form method=\"post\" action=\"$BASE_URL/reporemovecontribs/$repo_view_call\">";
166                 $nl = 0;
167                 foreach($bperms_f as $key=>$val) {\r
168                         if($val == 2) {\r
169                                 $dets = gwvpmini_getUser(null, null, $key);\r
170                                 echo get_gravatar($dets["email"], 18, 'mm', 'g', true)." <input type=\"checkbox\" name=\"$key\"> ".$dets["username"]."<br>";
171                                 $nl = 1;\r
172                         }\r
173                 }\r
174                 if($nl==1) echo "<input type=\"submit\" name=\"remove\" value=\"Remove Selected\">";\r
175                 echo "</form>";
176                 
177                 echo "<form method=\"post\" action=\"$BASE_URL/repoaddcontrib/$repo_view_call\">";
178                 echo "<input type=\"text\" name=\"contribusername\"> <input type=\"submit\" name=\"Add\" value=\"Add\">";
179                 echo "</form><br>";
180                 echo "</td></tr></table>";
181                 
182         }
183         //echo "command: git log --git-dir=$repo_base/$repo_view_call.git --pretty=format:\"%H\" -10";
184         $rs = popen("git --git-dir=$repo_base/$repo_view_call.git log --pretty=format:\"%H\" -10", "r");
185         $commitids = array();
186         $i = 0;
187         if($rs) {
188                 while(!feof($rs)) {
189                         $flin = fgets($rs);
190                         if($flin !== false) {
191                                 $commitids[$i] = trim($flin);
192                                 $i++;
193                         }
194                 }
195                 fclose($rs);
196         } else {
197                 $commitids = false;
198         }
199         
200         if($commitids != false) {
201                 echo "<hr>Commits<br>";
202                 echo "<table border=\"1\">";
203                 echo "<tr><th>Committed By</th><th>Date</th><th>Commit Log Entry</th></tr>";
204                 foreach($commitids as $ids) {
205                         $rs = popen("git --git-dir=$repo_base/$repo_view_call.git log --pretty=format:\"%at%n%ce%n%an%n%s\" $ids -1 2> /dev/null", "r");
206                         if($rs) {
207                                 $flin1 = trim(fgets($rs));
208                                 $flin2 = trim(fgets($rs));
209                                 $flin3 = trim(fgets($rs));
210                                 while(!feof($rs)) {
211                                         $flin4 = fread($rs, 8192);
212                                 }
213                                 $flon =  gwvpmini_emailToUserLink($flin2);
214                                 if(!$flon) {
215                                         $flon = "$flin3 (external)";
216                                 }
217                         }
218                         echo "<tr><td>".get_gravatar($flin2, 18, 'mm', 'g', true)."$flon</td><td>$flin1</td><td>$flin4</td></tr>";
219                 }
220                 echo "</table>";
221         } else {
222                 echo "No commit information available yet<br>";
223         }
224 }
225
226 function gwvpmini_UpdateRepoBasePerms()
227 {
228         global $BASE_URL, $repo_view_call;
229         
230         if(isset($_REQUEST["q"])) {\r
231                 $query = $_REQUEST["q"];\r
232                 $qspl = explode("/", $query);
233                 error_log("PLOOP:qview".print_r($qspl, true));\r
234         }
235         
236         if(isset($qspl[1])) $repo_view_call = $qspl[1];
237         else {
238                 error_log("PLOOP: no repo name");
239                 header("Location: $BASE_URL/view/$repo_view_call");
240                 return;
241         }
242         
243         $newperms = $_REQUEST["base_perms"];
244         
245         $owner = gwvpmini_GetRepoOwnerDetailsFromName($repo_view_call);\r
246         $desc = gwvpmini_GetRepoDescFromName($repo_view_call);\r
247         \r
248         $owner_name = $owner["username"];
249         
250         $owner_view = false;
251         if(isset($_SESSION["id"])) {\r
252                 if($owner["id"] == $_SESSION["id"]) {\r
253                         $owner_view = true;\r
254                 }\r
255         }
256         
257         $rid = gwvpmini_GetRepoId($repo_view_call);
258         
259         if(!$owner_view) {
260                 gwvpmini_SendMessage("error", "failure updating permission for repo");
261                 error_log("PLOOP: attempt to update from non-owner");
262         } else {
263                 error_log("PLOOP: updateds: ".print_r($_REQUEST, true));
264                 gwvpmini_ChangeRepoPerm($rid, "b", $_REQUEST["base_perms"]);
265                 gwvpmini_SendMessage("info", "Base permissions for repo updated");
266         }\r
267         
268         header("Location: $BASE_URL/view/$repo_view_call");
269 }
270
271 function gwvpmini_AddRepoReader()
272 {
273         global $BASE_URL, $repo_view_call;\r
274         \r
275         if(isset($_REQUEST["q"])) {\r
276                 $query = $_REQUEST["q"];\r
277                 $qspl = explode("/", $query);\r
278                 error_log("PLOOP:qview".print_r($qspl, true));\r
279         }\r
280         \r
281         if(isset($qspl[1])) $repo_view_call = $qspl[1];\r
282         else {\r
283                 error_log("PLOOP: no repo name");
284                 // TODO: btw, this makes no sense\r
285                 header("Location: $BASE_URL/view/$repo_view_call");\r
286                 return;\r
287         }\r
288         \r
289         $newperms = $_REQUEST["base_perms"];\r
290         \r
291         $owner = gwvpmini_GetRepoOwnerDetailsFromName($repo_view_call);\r
292         $desc = gwvpmini_GetRepoDescFromName($repo_view_call);\r
293         \r
294         $owner_name = $owner["username"];\r
295         \r
296         $owner_view = false;\r
297         if(isset($_SESSION["id"])) {\r
298                 if($owner["id"] == $_SESSION["id"]) {\r
299                         $owner_view = true;\r
300                 }\r
301         }
302         if(!$owner_view) {
303                 gwvpmini_SendMessage("error", "failure updating permission for repo");\r
304                 error_log("PLOOP: attempt to update from non-owner");
305                 header("Location: $BASE_URL/view/$repo_view_call");
306                 return;
307         }\r
308         
309         $auid = gwvpmini_GetUserId($_REQUEST["readerusername"]);
310         
311         if($auid == $_SESSION["id"]) {
312                 gwvpmini_SendMessage("error", "You cannot add yourself as a reader as you already own the repo");
313                 header("Location: $BASE_URL/view/$repo_view_call");\r
314                 return;
315         }
316         
317         if($auid > 0)  {\r
318                 $rid = gwvpmini_GetRepoId($repo_view_call);
319                 
320                 gwvpmini_ChangeRepoPerm($rid, $auid, 1);
321                 gwvpmini_SendMessage("info", "Added user ".$_REQUEST["readerusername"]." as a reader");
322                 header("Location: $BASE_URL/view/$repo_view_call");\r
323                 return;
324         } else {
325                 gwvpmini_SendMessage("error", "Couldnt find user with username of ".$_REQUEST["readerusername"]);
326                 header("Location: $BASE_URL/view/$repo_view_call");
327                 return;
328         }
329         
330         
331 }
332
333 function gwvpmini_AddRepoContributor()
334 {
335         global $BASE_URL, $repo_view_call;\r
336         \r
337         if(isset($_REQUEST["q"])) {\r
338                 $query = $_REQUEST["q"];\r
339                 $qspl = explode("/", $query);\r
340                 error_log("PLOOP:qview".print_r($qspl, true));\r
341         }\r
342         \r
343         if(isset($qspl[1])) $repo_view_call = $qspl[1];\r
344         else {\r
345                 error_log("PLOOP: no repo name");\r
346                 // TODO: btw, this makes no sense\r
347                 header("Location: $BASE_URL/view/$repo_view_call");\r
348                 return;\r
349         }\r
350         \r
351         $newperms = $_REQUEST["base_perms"];\r
352         \r
353         $owner = gwvpmini_GetRepoOwnerDetailsFromName($repo_view_call);\r
354         $desc = gwvpmini_GetRepoDescFromName($repo_view_call);\r
355         \r
356         $owner_name = $owner["username"];\r
357         \r
358         $owner_view = false;\r
359         if(isset($_SESSION["id"])) {\r
360                 if($owner["id"] == $_SESSION["id"]) {\r
361                         $owner_view = true;\r
362                 }\r
363         }\r
364         if(!$owner_view) {\r
365                 gwvpmini_SendMessage("error", "failure updating permission for repo");\r
366                 error_log("PLOOP: attempt to update from non-owner");\r
367                 header("Location: $BASE_URL/view/$repo_view_call");\r
368                 return;\r
369         }\r
370         \r
371         $auid = gwvpmini_GetUserId($_REQUEST["contribusername"]);\r
372         \r
373         if($auid == $_SESSION["id"]) {\r
374                 gwvpmini_SendMessage("error", "You cannot add yourself as a contributor as you already own the repo");\r
375                 header("Location: $BASE_URL/view/$repo_view_call");\r
376                 return;\r
377         }\r
378         \r
379         if($auid > 0)  {\r
380                 $rid = gwvpmini_GetRepoId($repo_view_call);\r
381         \r
382                 gwvpmini_ChangeRepoPerm($rid, $auid, 2);\r
383                 gwvpmini_SendMessage("info", "Added user ".$_REQUEST["contribusername"]." as a contributor");\r
384                 header("Location: $BASE_URL/view/$repo_view_call");\r
385                 return;\r
386         } else {\r
387                 gwvpmini_SendMessage("error", "Couldnt find user with username of ".$_REQUEST["contribusername"]);\r
388                 header("Location: $BASE_URL/view/$repo_view_call");\r
389                 return;\r
390         }
391 }
392
393 function gwvpmini_RemoveRepoContributor()
394 {
395         
396         global $BASE_URL, $repo_view_call;\r
397         \r
398         if(isset($_REQUEST["q"])) {\r
399                 $query = $_REQUEST["q"];\r
400                 $qspl = explode("/", $query);\r
401                 error_log("PLOOP:qview".print_r($qspl, true));\r
402         }\r
403         \r
404         if(isset($qspl[1])) $repo_view_call = $qspl[1];\r
405         else {\r
406                 error_log("PLOOP: no repo name");\r
407                 // TODO: btw, this makes no sense\r
408                 header("Location: $BASE_URL/view/$repo_view_call");\r
409                 return;\r
410         }\r
411         \r
412         \r
413         $owner = gwvpmini_GetRepoOwnerDetailsFromName($repo_view_call);\r
414         $desc = gwvpmini_GetRepoDescFromName($repo_view_call);\r
415         \r
416         $owner_name = $owner["username"];\r
417         \r
418         $owner_view = false;\r
419         if(isset($_SESSION["id"])) {\r
420                 if($owner["id"] == $_SESSION["id"]) {\r
421                         $owner_view = true;\r
422                 }\r
423         }\r
424         if(!$owner_view) {\r
425                 gwvpmini_SendMessage("error", "failure updating permission for repo");\r
426                 error_log("PLOOP: attempt to update from non-owner");\r
427                 header("Location: $BASE_URL/view/$repo_view_call");\r
428                 return;\r
429         }
430         
431         $rid = gwvpmini_GetRepoId($repo_view_call);
432         
433         $bperms_f = gwvpmini_GetRepoPerms($rid);
434         
435         foreach($bperms_f as $key=>$val) {
436                 if($val == 2) {
437                         if(isset($_REQUEST["$key"])) {
438                                 gwvpmini_ChangeRepoPerm($rid, $key, 0);
439                         }
440                 }
441         }
442         
443         gwvpmini_SendMessage("info", "Repo permissions updated");
444         header("Location: $BASE_URL/view/$repo_view_call");\r
445         return;\r
446         
447 }\r
448
449 \r
450 function gwvpmini_RemoveRepoReader()\r
451 {\r
452 \r
453         global $BASE_URL, $repo_view_call;\r
454 \r
455         if(isset($_REQUEST["q"])) {\r
456                 $query = $_REQUEST["q"];\r
457                 $qspl = explode("/", $query);\r
458                 error_log("PLOOP:qview".print_r($qspl, true));\r
459         }\r
460 \r
461         if(isset($qspl[1])) $repo_view_call = $qspl[1];\r
462         else {\r
463                 error_log("PLOOP: no repo name");\r
464                 // TODO: btw, this makes no sense\r
465                 header("Location: $BASE_URL/view/$repo_view_call");\r
466                 return;\r
467         }\r
468 \r
469 \r
470         $owner = gwvpmini_GetRepoOwnerDetailsFromName($repo_view_call);\r
471         $desc = gwvpmini_GetRepoDescFromName($repo_view_call);\r
472 \r
473         $owner_name = $owner["username"];\r
474 \r
475         $owner_view = false;\r
476         if(isset($_SESSION["id"])) {\r
477                 if($owner["id"] == $_SESSION["id"]) {\r
478                         $owner_view = true;\r
479                 }\r
480         }\r
481         if(!$owner_view) {\r
482                 gwvpmini_SendMessage("error", "failure updating permission for repo");\r
483                 error_log("PLOOP: attempt to update from non-owner");\r
484                 header("Location: $BASE_URL/view/$repo_view_call");\r
485                 return;\r
486         }\r
487 \r
488         $rid = gwvpmini_GetRepoId($repo_view_call);\r
489 \r
490         $bperms_f = gwvpmini_GetRepoPerms($rid);\r
491 \r
492         foreach($bperms_f as $key=>$val) {\r
493                 if($val == 1) {\r
494                         if(isset($_REQUEST["$key"])) {\r
495                                 gwvpmini_ChangeRepoPerm($rid, $key, 0);\r
496                         }\r
497                 }\r
498         }\r
499 \r
500         gwvpmini_SendMessage("info", "Repo permissions updated");\r
501         header("Location: $BASE_URL/view/$repo_view_call");\r
502         return;\r
503 \r
504 }
505
506 function gwvpmini_RepoUpdateDescription()
507 {
508         global $BASE_URL, $repo_view_call;\r
509         \r
510         if(isset($_REQUEST["q"])) {\r
511                 $query = $_REQUEST["q"];\r
512                 $qspl = explode("/", $query);\r
513                 error_log("PLOOP:qview".print_r($qspl, true));\r
514         }\r
515         \r
516         if(isset($qspl[1])) $repo_view_call = $qspl[1];\r
517         else {\r
518                 error_log("PLOOP: no repo name");\r
519                 // TODO: btw, this makes no sense\r
520                 header("Location: $BASE_URL/view/$repo_view_call");\r
521                 return;\r
522         }\r
523         \r
524         \r
525         $owner = gwvpmini_GetRepoOwnerDetailsFromName($repo_view_call);\r
526         $desc = gwvpmini_GetRepoDescFromName($repo_view_call);\r
527         \r
528         $owner_name = $owner["username"];\r
529         \r
530         $owner_view = false;\r
531         if(isset($_SESSION["id"])) {\r
532                 if($owner["id"] == $_SESSION["id"]) {\r
533                         $owner_view = true;\r
534                 }\r
535         }\r
536         if(!$owner_view) {\r
537                 gwvpmini_SendMessage("error", "failure updating description for repo");\r
538                 error_log("PLOOP: attempt to update from non-owner");\r
539                 header("Location: $BASE_URL/view/$repo_view_call");\r
540                 return;\r
541         }\r
542         \r
543         $rid = gwvpmini_GetRepoId($repo_view_call);\r
544         \r
545         gwvpmini_UpdateRepoDescription($rid, $_REQUEST["desc"]);
546                 \r
547         gwvpmini_SendMessage("info", "Repo description updated");\r
548         header("Location: $BASE_URL/view/$repo_view_call");\r
549         return;
550 }\r
551
552 ?>