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