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