2fc4b43d79299a6527b40039fdd75b74253a8c7e
bernd First strike: list reposito...

bernd authored 13 years ago

1) <?php
2) require_role(ROLE_SYSTEMUSER);
3) 
4) $data_dir = realpath( dirname(__FILE__).'/../data/' );
5) $config_file = $data_dir.'/gitolite-admin/conf/webinterface.conf';
6) $config_dir = $data_dir.'/gitolite-admin/conf/webinterface';
7) $key_dir = $data_dir.'/gitolite-admin/keydir';
8) DEBUG("gitolite-data_dir: ".$data_dir);
9) $git_wrapper = $data_dir . '/git-wrapper.sh';
10) 
11) 
bernd Fürs erste feature-complete

bernd authored 13 years ago

12) 
bernd First strike: list reposito...

bernd authored 13 years ago

13) function check_env() 
14) {
15)   global $git_wrapper, $data_dir, $config_file, $config_dir, $key_dir;
16)   if (!is_executable($git_wrapper)) {
17)     system_failure("git_wrapper.sh is not executable: {$git_wrapper}");
18)   }
19)   if (! (is_file($data_dir.'/sshkey') && is_file($data_dir.'/sshkey.pub'))) {
20)     system_failure("SSH-key not found. Please setup the gitolite-module correctly. Run ./data/initialize.sh");
21)   }
22)   if (! is_dir($data_dir.'/gitolite-admin')) {
23)     system_failure("Repository gitolite-admin ot found. Initial checkout must be made manually. Run ./data/initialize.sh");
24)   }
25)   if (! is_dir($config_dir)) {
26)     system_failure("gitolite-admin repository is not prepared.");
27)   }
bernd First draft of gitolite-mod...

bernd authored 13 years ago

28)   if (! (is_dir($key_dir) && is_writeable($config_file))) {
bernd First strike: list reposito...

bernd authored 13 years ago

29)     system_failure("Repository gitolite-admin is corrupted or webinterface.conf is not writeable.");
30)   }
31) }
32) 
33) 
bernd First draft of gitolite-mod...

bernd authored 13 years ago

34) function validate_name($name) {
35)   return (preg_match('/^[[:alnum:]][[:alnum:]._-]*$/', $name));
36) }
37) 
bernd show URL

bernd authored 13 years ago

38) function get_git_url($repo) {
39)   $remote = git_wrapper('remote --verbose');
40)   DEBUG('gitolite-admin repo: '.$remote[0]);
41)   $url = preg_replace('#^.*\s+(\S+):gitolite-admin.*#', '$1', $remote[0]);
42)   DEBUG('URL: '.$url);
43)   return $url.':'.$repo;
44) }
45) 
bernd First draft of gitolite-mod...

bernd authored 13 years ago

46) 
bernd First strike: list reposito...

bernd authored 13 years ago

47) function git_wrapper($commandline)
48) {
49)   global $git_wrapper, $data_dir;
50) 
51)   $command = $git_wrapper.' '.$commandline;
52)   $output = array();
53)   $retval = 0;
54)   DEBUG($command);
55)   exec($command, $output, $retval);
56)   DEBUG($output);
57)   DEBUG($retval);
58)   if ($retval > 0) {
59)     system_failure('Interner Fehler!');
60)     // FIXME: Hier sollte auf jeden Fall ein Logging angeworfen werden!
61)   }
bernd show URL

bernd authored 13 years ago

62)   return $output;
bernd First strike: list reposito...

bernd authored 13 years ago

63) }
64) 
65) function refresh_gitolite() 
66) {
67)   check_env();
68)   git_wrapper('pull');
69) }
70) 
71) 
72) 
73) function list_repos() 
74) {
75)   global $config_file, $config_dir;
76)   $username = $_SESSION['userinfo']['username'];
77)   $userconfig = $config_dir . '/' . $username . '.conf';
78)   DEBUG("using config file ".$userconfig);
79)   if (! is_file($userconfig)) {
80)     DEBUG("user-config does not exist");
81)     return array();
82)   }
83) 
84)   $repos = array();
85)   $lines = file($userconfig);
86)   $current_repo = NULL;
bernd First draft of gitolite-mod...

bernd authored 13 years ago

87)   $current_repo_users = array();
bernd First strike: list reposito...

bernd authored 13 years ago

88)   foreach ($lines as $line) {
bernd Fürs erste feature-complete

bernd authored 13 years ago

89)     DEBUG("LINE: ".$line);
bernd First strike: list reposito...

bernd authored 13 years ago

90)     $m = array();
bernd Setze Berechtigung für gitw...

bernd authored 13 years ago

91)     if (preg_match('/^(\S+) "[^"]+" = "([^"]+)"$/', $line, $m) != 0) {
92)       if (!array_key_exists($m[1], $repos)) {
93)         $repos[$m[1]] = array('users' => NULL, 'description' => '');
94)       }
95)       DEBUG("found description: {$m[1]} = \"{$m[2]}\"");
96)       $repos[$m[1]]['description'] = $m[2];
97)     } elseif (preg_match('_^\s*repo (\S+)\s*$_', $line, $m) != 0) {
98)       if (!array_key_exists($m[1], $repos)) {
99)         $repos[$m[1]] = array('users' => NULL, 'description' => '');
100)       }
bernd First draft of gitolite-mod...

bernd authored 13 years ago

101)       if ($current_repo) {
bernd Setze Berechtigung für gitw...

bernd authored 13 years ago

102)         $repos[$current_repo]['users'] = $current_repo_users;
bernd First draft of gitolite-mod...

bernd authored 13 years ago

103)       }
bernd First strike: list reposito...

bernd authored 13 years ago

104)       DEBUG("found repo ".$m[1]);
bernd First draft of gitolite-mod...

bernd authored 13 years ago

105)       $current_repo = chop($m[1]);
106)       $current_repo_users = array();
bernd Fürs erste feature-complete

bernd authored 13 years ago

107)     } else if (preg_match('/^\s*(R|RW|RW\+)\s*=\s*([[:alnum:]][[:alnum:]._-]*)\s*$/', $line, $m) != 0) {
bernd First draft of gitolite-mod...

bernd authored 13 years ago

108)       DEBUG("found access rule: ".$m[1]." for ".$m[2]);
109)       $current_repo_users[chop($m[2])] = chop($m[1]);
bernd First strike: list reposito...

bernd authored 13 years ago

110)     }
111)   }
bernd First draft of gitolite-mod...

bernd authored 13 years ago

112)   if ($current_repo) {
bernd Setze Berechtigung für gitw...

bernd authored 13 years ago

113)     $repos[$current_repo]['users'] = $current_repo_users;
bernd First draft of gitolite-mod...

bernd authored 13 years ago

114)   }
bernd Sortiere Repositories und U...

bernd authored 13 years ago

115)   ksort($repos);
bernd First strike: list reposito...

bernd authored 13 years ago

116)   DEBUG($repos);
117)   return $repos;
118) }
119) 
120) 
121) 
bernd First draft of gitolite-mod...

bernd authored 13 years ago

122) function list_users() {
123)   global $config_file, $config_dir;
124)   $username = $_SESSION['userinfo']['username'];
125)   $userconfig = $config_dir . '/' . $username . '.conf';
126)   DEBUG("using config file ".$userconfig);
127)   if (! is_file($userconfig)) {
128)     DEBUG("user-config does not exist");
129)     return array();
130)   }
131)   
132)   $lines = file($userconfig);
133)   $users = array();
134)   foreach ($lines as $line) {
135)     $m = array();
136)     if (preg_match('_# user ([^]]+)_', $line, $m) != 0) {
137)       $users[] = chop($m[1]);
138)     }
139)     if (preg_match('_^\s*repo .*_', $line) != 0) {
140)       break;
141)     }
142)   }
bernd Sortiere Repositories und U...

bernd authored 13 years ago

143)   sort($users);
bernd First draft of gitolite-mod...

bernd authored 13 years ago

144)   DEBUG($users);
145)   return $users;
146) }
bernd First strike: list reposito...

bernd authored 13 years ago

147) 
bernd First draft of gitolite-mod...

bernd authored 13 years ago

148) function get_pubkey($handle) {
149)   global $key_dir;
150)   if (! validate_name($handle)) {
151)     return '';
152)   }
153)   $keyfile = $key_dir.'/'.$handle.'.pub';
154)   if (! file_exists($keyfile)) {
155)     return '';
156)   }
157)   return file_get_contents($keyfile);
158) }
159) 
160) 
161) 
162) function newkey($pubkey, $handle)
bernd First strike: list reposito...

bernd authored 13 years ago

163) {
bernd First draft of gitolite-mod...

bernd authored 13 years ago

164)   global $key_dir, $config_dir;
165)   $username = $_SESSION['userinfo']['username'];
166)   
167)   $handle = $username.'-'.$handle;
168)   if (! validate_name($handle)) {
169)     system_failure("Der eingegebene Name enthält ungültige Zeichen. Bitte nur Buchstaben, Zahlen, Unterstrich, Binderstrich und Punkt benutzen.");
170)   }
171) 
172)   // FIXME: Muss man den SSH-Key auf Plausibilität prüfen? Aus Sicherheitsgründen vermutlich nicht.
173)   $keyfile = $key_dir.'/'.$handle.'.pub';
174)   file_put_contents($keyfile, $pubkey);
175)   git_wrapper('add '.$keyfile);
176) 
177)   $userconfig = $config_dir . '/' . $username . '.conf';
178)   DEBUG("using config file ".$userconfig);
179)   if (! is_file($userconfig)) {
180)     DEBUG("user-config does not exist, creating new one");
181)     file_put_contents($userconfig, '# user '.$handle."\n");
182)   } elseif (in_array($handle, list_users())) {
183)     # user ist schon eingetragen, nur neuer Key
184)   } else {
185)     $content = file_get_contents($userconfig);
186)     file_put_contents($userconfig, "# user {$handle}\n".$content);
187)   }
188)   git_wrapper('add '.$userconfig);
bernd First strike: list reposito...

bernd authored 13 years ago

189)   
bernd First draft of gitolite-mod...

bernd authored 13 years ago

190)   git_wrapper('commit --allow-empty -m "added new key for '.$handle.'"');
191)   git_wrapper('push');
bernd First strike: list reposito...

bernd authored 13 years ago

192) }
193) 
194) 
bernd First draft of gitolite-mod...

bernd authored 13 years ago

195) function delete_key($handle)
196) {
197)   global $key_dir, $config_dir;
198)   $username = $_SESSION['userinfo']['username'];
bernd First strike: list reposito...

bernd authored 13 years ago

199) 
bernd First draft of gitolite-mod...

bernd authored 13 years ago

200)   if (! validate_name($handle)) {
201)     system_failure("Der eingegebene Name enthält ungültige Zeichen. Bitte nur Buchstaben, Zahlen, Unterstrich, Binderstrich und Punkt benutzen.");
202)   }
203)   if (!in_array($handle, list_users())) {
204)     DEBUG("key {$handle} not in");
205)     DEBUG(list_users());
206)     system_failure("Den angegebenen Key scheint es nicht zu geben");
207)   }
208) 
209)   // FIXME: Muss man den SSH-Key auf Plausibilität prüfen? Aus Sicherheitsgründen vermutlich nicht.
210)   $keyfile = $key_dir.'/'.$handle.'.pub';
211)   if (! file_exists($keyfile)) {
212)     system_failure("Der angegebene Schlüssel scheint nicht mehr vorhanden zu sein. Bitte manuelle Korrektur anfordern!");
213)   } 
214)   git_wrapper('rm '.$keyfile);
215) 
216) 
217)   $userconfig = $config_dir . '/' . $username . '.conf';
218)   DEBUG("using config file ".$userconfig);
219)   if (! is_file($userconfig)) {
220)     DEBUG("user-config does not exist, wtf?");
221)     system_failure("Es gibt für diesen Benutzer noch keine Konfiguration. Das sollte nicht sein!");
222)   } else {
223)     $content = file($userconfig);
224)     DEBUG("Old file:");
225)     DEBUG($content);
226)     $newcontent = array();
227)     foreach ($content as $line) {
228)       if (preg_match('/^# user '.$handle.'$/', $line)) {
229)         DEBUG("delete1: ".$line);
230)         continue;
231)       }
232)       if (preg_match('/^\s*(R|RW|RW+)\s*=\s*'.$handle.'\s*$/', $line)) {
233)         DEBUG("delete2: ".$line);
234)         continue;
235)       }
236)       $newcontent[] = $line;
237)     }
238)     DEBUG("Modified file:");
239)     DEBUG($newcontent);
240)     file_put_contents($userconfig, implode('', $newcontent));
241)   }
242)   git_wrapper('add '.$userconfig);
243)  
244)   git_wrapper('commit -m "deleted key for '.$handle.'"');
245)   git_wrapper('push');
246) 
247) 
248) }
bernd Fürs erste feature-complete

bernd authored 13 years ago

249) 
250) 
251) function remove_repo_from_array($data, $repo) {
252)   DEBUG("Request to remove repo »{$repo}«...");
253)   $inside = false;
254)   $outdata = array();
bernd Setze Berechtigung für gitw...

bernd authored 13 years ago

255)   $blank = true;
bernd Fürs erste feature-complete

bernd authored 13 years ago

256)   foreach ($data as $line) {
bernd Setze Berechtigung für gitw...

bernd authored 13 years ago

257)     if ($blank && chop($line) == '') {
258)       continue;
259)     }
260)     $blank = (chop($line) == '');
bernd Fürs erste feature-complete

bernd authored 13 years ago

261)     $m = array();
262)     if (preg_match('_^\s*repo (\S+)\s*$_', $line, $m) != 0) {
263)       $inside = ($m[1] == $repo);
264)     }
bernd Setze Berechtigung für gitw...

bernd authored 13 years ago

265)     if (! $inside && ! preg_match('/^'.$repo.'\s.*/', $line)) {
bernd Fürs erste feature-complete

bernd authored 13 years ago

266)       $outdata[] = $line;
267)     }
268)   }
269)   DEBUG($outdata);
270)   return $outdata;
271) }
272) 
273) 
274) function repo_exists_globally($repo) 
275) {
276)   global $config_dir;
277)   $files = scandir($config_dir);
278)   foreach ($files as $f) {
279)     if (is_file(realpath($config_dir.'/'.$f))) {
280)       $data = file(realpath($config_dir.'/'.$f));
281)       foreach ($data as $line) {
282)         if (preg_match('/^\s*repo '.$repo.'\s*$/', $line) != 0) {
283)           return true;
284)         }
285)       }
286)     }
287)   }
288)   return false;
289) }
290) 
291) 
292) function delete_repo($repo) 
293) {
294)   $repos = list_repos();
295)   if (!array_key_exists($repo, $repos)) {
296)     system_failure("Ein solches Repository existiert nicht!");
297)   }
298)   
299)   global $config_dir;
300)   $username = $_SESSION['userinfo']['username'];
301)   $userconfig = $config_dir . '/' . $username . '.conf';
302)   DEBUG("using config file ".$userconfig);
303)   $data = file($userconfig);
304)   $data = remove_repo_from_array($data, $repo);
305)   file_put_contents($userconfig, implode('', $data));
306)   git_wrapper('add '.$userconfig);
307)   
308)   git_wrapper('commit --allow-empty -m "deleted repo '.$repo.'"');
309)   git_wrapper('push');
310) }
311) 
bernd Setze Berechtigung für gitw...

bernd authored 13 years ago

312) function save_repo($repo, $permissions, $description) 
bernd Fürs erste feature-complete

bernd authored 13 years ago

313) {
314)   if (!validate_name($repo)) {
315)     system_failure("Der gewählte name entspricht nicht den Konventionen!");
316)   }
317)   if (!array_key_exists($repo, list_repos()) && repo_exists_globally($repo)) {
318)     system_failure("Der gewählte Name existiert bereits auf diesem Server. Bitte wählen Sie einen spezifischeren Namen.");
319)   } 
320)   global $config_dir;
321)   $username = $_SESSION['userinfo']['username'];
322)   $userconfig = $config_dir . '/' . $username . '.conf';
323)   DEBUG("using config file ".$userconfig);
324)   $data = array();
325)   if (! is_file($userconfig)) {
326)     DEBUG("user-config does not exist, creating new one");
327)   } else {
328)     $data = file($userconfig);
329)   }
330) 
331)   $repos = list_repos();
332)   if (array_key_exists($repo, $repos)) {
333)     $data = remove_repo_from_array($data, $repo);
334)   }
335) 
336)   $data[] = "\n";
bernd Setze Berechtigung für gitw...

bernd authored 13 years ago

337)   if ($description) {
bernd Sortiere Repositories und U...

bernd authored 13 years ago

338)     $description = preg_replace('/[\'"\r\n/', '', $description);
bernd Setze Berechtigung für gitw...

bernd authored 13 years ago

339)     $realname = $_SESSION['userinfo']['name'];
340)     $data[] = "{$repo} \"{$realname}\" = \"{$description}\"\n";
341)   }