Bernd Wurst commited on 2012-03-12 09:31:30
Zeige 7 geänderte Dateien mit 212 Einfügungen und 5 Löschungen.
... | ... |
@@ -50,7 +50,7 @@ if (isset($_GET['repo'])) { |
50 | 50 |
if (isset($_GET['handle'])) { |
51 | 51 |
$users = list_users(); |
52 | 52 |
if (!in_array($_GET['handle'], $users)) { |
53 |
- system_failure("Es sollte ein unbekannter SSH-Key gelöscht werden!"); |
|
53 |
+ system_failure("Es sollte ein unbekannter Benutzer gelöscht werden!"); |
|
54 | 54 |
} |
55 | 55 |
|
56 | 56 |
$sure = user_is_sure(); |
... | ... |
@@ -72,3 +72,29 @@ if (isset($_GET['handle'])) { |
72 | 72 |
die(); |
73 | 73 |
} |
74 | 74 |
} |
75 |
+ |
|
76 |
+if (isset($_GET['foreignhandle'])) { |
|
77 |
+ $users = list_foreign_users(); |
|
78 |
+ if (!in_array($_GET['foreignhandle'], $users)) { |
|
79 |
+ system_failure("Es sollte ein unbekannter Benutzer gelöscht werden!"); |
|
80 |
+ } |
|
81 |
+ |
|
82 |
+ $sure = user_is_sure(); |
|
83 |
+ if ($sure === NULL) |
|
84 |
+ { |
|
85 |
+ are_you_sure("foreignhandle={$_GET['foreignhandle']}", '<p>Soll der GIT-Benutzer »'.$_GET['foreignhandle'].'« wirklich aus Ihrer Konfiguration werden?</p>'); |
|
86 |
+ } |
|
87 |
+ elseif ($sure === true) |
|
88 |
+ { |
|
89 |
+ delete_foreign_user($_GET['foreignhandle']); |
|
90 |
+ if (! $debugmode) |
|
91 |
+ header('Location: git'); |
|
92 |
+ die(); |
|
93 |
+ } |
|
94 |
+ elseif ($sure === false) |
|
95 |
+ { |
|
96 |
+ if (! $debugmode) |
|
97 |
+ header("Location: git"); |
|
98 |
+ die(); |
|
99 |
+ } |
|
100 |
+} |
... | ... |
@@ -22,6 +22,7 @@ $section = 'git_git'; |
22 | 22 |
|
23 | 23 |
$repos = list_repos(); |
24 | 24 |
$users = list_users(); |
25 |
+$foreign_users = list_foreign_users(); |
|
25 | 26 |
|
26 | 27 |
$action = ''; |
27 | 28 |
$form = ''; |
... | ... |
@@ -65,6 +66,23 @@ foreach ($users as $user) { |
65 | 66 |
} |
66 | 67 |
$form .= '<p>'.$user.': <select name="'.$user.'"><option value="-">Zugriff verweigern</option><option value="r"'.$r.'>Lesezugriff erlauben</option><option value="rw"'.$rw.'>Lese- und Schreibzugriff</option><option value="rwplus"'.$rwplus.'>erweiterter Lese- und Schreibzugriff (inkl. "rewind")</option></select></p>'; |
67 | 68 |
} |
69 |
+foreach ($foreign_users as $user) { |
|
70 |
+ $r = $rw = $rwplus = ''; |
|
71 |
+ if (isset($_GET['repo']) && isset($repos[$_GET['repo']])) { |
|
72 |
+ $permissions = $repos[$_GET['repo']]['users']; |
|
73 |
+ if (isset($permissions[$user])) { |
|
74 |
+ switch ($permissions[$user]) { |
|
75 |
+ case 'RW+': $rwplus = ' selected="selected"'; |
|
76 |
+ break; |
|
77 |
+ case 'RW': $rw = ' selected="selected"'; |
|
78 |
+ break; |
|
79 |
+ case 'R': $r = ' selected="selected"'; |
|
80 |
+ break; |
|
81 |
+ } |
|
82 |
+ } |
|
83 |
+ } |
|
84 |
+ $form .= '<p>'.$user.': <select name="'.$user.'"><option value="-">Zugriff verweigern</option><option value="r"'.$r.'>Lesezugriff erlauben</option><option value="rw"'.$rw.'>Lese- und Schreibzugriff</option><option value="rwplus"'.$rwplus.'>erweiterter Lese- und Schreibzugriff (inkl. "rewind")</option></select></p>'; |
|
85 |
+} |
|
68 | 86 |
$checked = (isset($_GET['repo']) && isset($repos[$_GET['repo']]) && isset($repos[$_GET['repo']]['users']['gitweb']) && $repos[$_GET['repo']]['users']['gitweb'] == 'R') ? ' checked="checked"' : ''; |
69 | 87 |
$description = (isset($_GET['repo']) && isset($repos[$_GET['repo']])) ? $repos[$_GET['repo']]['description'] : ''; |
70 | 88 |
$disabled = $checked ? '' : ' disabled="disabled"'; |
... | ... |
@@ -27,6 +27,7 @@ output("<p>Wir verwenden das beliebte System »gitolite« um diese Funktionalit |
27 | 27 |
|
28 | 28 |
$repos = list_repos(); |
29 | 29 |
$users = list_users(); |
30 |
+$foreign_users = list_foreign_users(); |
|
30 | 31 |
|
31 | 32 |
if (count($repos) == 0) { |
32 | 33 |
output("<p><em>bisher haben Sie keine GIT-Repositories</em></p>"); |
... | ... |
@@ -83,4 +84,18 @@ foreach ($users as $handle) { |
83 | 84 |
|
84 | 85 |
addnew('newkey', 'Neuen SSH-Key eintragen'); |
85 | 86 |
|
86 |
-output('<p style="font-size: 90%;padding-top: 0.5em; border-top: 1px solid black;">Hinweis: Die hier gezeigten Berechtigungen können unter Umständen nicht aktuell sein. Bei Bearf können Sie '.internal_link('refresh', 'die Berechtigungen neu einlesen lassen').'</p>'); |
|
87 |
+ |
|
88 |
+if (count($foreign_users) == 0) { |
|
89 |
+ output('<p><em>Es sind bisher keine GIT-Benutzer anderer Kunden eingetragen.</em></p>'); |
|
90 |
+} else { |
|
91 |
+ output('<h3>GIT-Benutzer anderer Kunden</h3>'); |
|
92 |
+} |
|
93 |
+ |
|
94 |
+foreach ($foreign_users as $handle) { |
|
95 |
+ output('<p><strong>'.$handle.'</strong> '.internal_link('delete', icon_delete('Benutzer aus diesem Kundenaccount entfernen'), 'foreignhandle='.$handle)."</p>"); |
|
96 |
+} |
|
97 |
+ |
|
98 |
+addnew('newforeignuser', 'GIT-Benutzer anderer Kunden freischalten'); |
|
99 |
+ |
|
100 |
+ |
|
101 |
+output('<p style="font-size: 90%;padding-top: 0.5em; border-top: 1px solid black;">Hinweis: Die hier gezeigten Berechtigungen können unter Umständen nicht aktuell sein. Bei Fehlfunktionen sollten Sie '.internal_link('refresh', 'die Berechtigungen neu einlesen lassen').'</p>'); |
... | ... |
@@ -160,6 +159,32 @@ function list_users() { |
160 | 159 |
return $users; |
161 | 160 |
} |
162 | 161 |
|
162 |
+function list_foreign_users() { |
|
163 |
+ global $config_file, $config_dir; |
|
164 |
+ $username = $_SESSION['userinfo']['username']; |
|
165 |
+ $userconfig = $config_dir . '/' . $username . '.conf'; |
|
166 |
+ DEBUG("using config file ".$userconfig); |
|
167 |
+ if (! is_file($userconfig)) { |
|
168 |
+ DEBUG("user-config does not exist"); |
|
169 |
+ return array(); |
|
170 |
+ } |
|
171 |
+ |
|
172 |
+ $lines = file($userconfig); |
|
173 |
+ $users = array(); |
|
174 |
+ foreach ($lines as $line) { |
|
175 |
+ $m = array(); |
|
176 |
+ if (preg_match('_# foreign user ([^]]+)_', $line, $m) != 0) { |
|
177 |
+ $users[] = chop($m[1]); |
|
178 |
+ } |
|
179 |
+ if (preg_match('_^\s*repo .*_', $line) != 0) { |
|
180 |
+ break; |
|
181 |
+ } |
|
182 |
+ } |
|
183 |
+ sort($users); |
|
184 |
+ DEBUG($users); |
|
185 |
+ return $users; |
|
186 |
+} |
|
187 |
+ |
|
163 | 188 |
function get_pubkey($handle) { |
164 | 189 |
global $key_dir; |
165 | 190 |
if (! validate_name($handle)) { |
... | ... |
@@ -174,6 +199,80 @@ function get_pubkey($handle) { |
174 | 199 |
|
175 | 200 |
|
176 | 201 |
|
202 |
+function new_foreign_user($handle) |
|
203 |
+{ |
|
204 |
+ global $key_dir, $config_dir; |
|
205 |
+ $username = $_SESSION['userinfo']['username']; |
|
206 |
+ |
|
207 |
+ if (! validate_name($handle)) { |
|
208 |
+ system_failure("Der eingegebene Name enthält ungültige Zeichen. Bitte nur Buchstaben, Zahlen, Unterstrich, Binderstrich und Punkt benutzen."); |
|
209 |
+ } |
|
210 |
+ |
|
211 |
+ if (in_array($handle, list_users())) { |
|
212 |
+ system_failure('Dieser GIT-Benutzer gehört zu diesem Kundenaccount.'); |
|
213 |
+ } |
|
214 |
+ |
|
215 |
+ $keyfile = $key_dir.'/'.$handle.'.pub'; |
|
216 |
+ if (! file_exists($keyfile) ) { |
|
217 |
+ system_failure('Diesen GIT-Benutzer gibt es nicht'); |
|
218 |
+ } |
|
219 |
+ |
|
220 |
+ $userconfig = $config_dir . '/' . $username . '.conf'; |
|
221 |
+ DEBUG("using config file ".$userconfig); |
|
222 |
+ if (! is_file($userconfig)) { |
|
223 |
+ DEBUG("user-config does not exist, creating new one"); |
|
224 |
+ file_put_contents($userconfig, '# user '.$handle."\n"); |
|
225 |
+ set_user_include(); |
|
226 |
+ } elseif (in_array($handle, list_foreign_users())) { |
|
227 |
+ # user ist schon eingetragen |
|
228 |
+ } else { |
|
229 |
+ $content = file_get_contents($userconfig); |
|
230 |
+ file_put_contents($userconfig, "# foreign user {$handle}\n".$content); |
|
231 |
+ } |
|
232 |
+ git_wrapper('add '.$userconfig); |
|
233 |
+ |
|
234 |
+ git_wrapper('commit --allow-empty -m "added new key for '.$handle.'"'); |
|
235 |
+ git_wrapper('push'); |
|
236 |
+} |
|
237 |
+ |
|
238 |
+function delete_foreign_user($handle) |
|
239 |
+{ |
|
240 |
+ global $config_dir; |
|
241 |
+ $username = $_SESSION['userinfo']['username']; |
|
242 |
+ |
|
243 |
+ $userconfig = $config_dir . '/' . $username . '.conf'; |
|
244 |
+ DEBUG("using config file ".$userconfig); |
|
245 |
+ if (! is_file($userconfig)) { |
|
246 |
+ DEBUG("user-config does not exist, wtf?"); |
|
247 |
+ system_failure("Es gibt für diesen Benutzer noch keine Konfiguration. Das sollte nicht sein!"); |
|
248 |
+ } else { |
|
249 |
+ $content = file($userconfig); |
|
250 |
+ DEBUG("Old file:"); |
|
251 |
+ DEBUG($content); |
|
252 |
+ $newcontent = array(); |
|
253 |
+ foreach ($content as $line) { |
|
254 |
+ if (preg_match('/^# foreign user '.$handle.'$/', $line)) { |
|
255 |
+ DEBUG("delete1: ".$line); |
|
256 |
+ continue; |
|
257 |
+ } |
|
258 |
+ if (preg_match('/^\s*(R|RW|RW+)\s*=\s*'.$handle.'\s*$/', $line)) { |
|
259 |
+ DEBUG("delete2: ".$line); |
|
260 |
+ continue; |
|
261 |
+ } |
|
262 |
+ $newcontent[] = $line; |
|
263 |
+ } |
|
264 |
+ DEBUG("Modified file:"); |
|
265 |
+ DEBUG($newcontent); |
|
266 |
+ file_put_contents($userconfig, implode('', $newcontent)); |
|
267 |
+ } |
|
268 |
+ git_wrapper('add '.$userconfig); |
|
269 |
+ |
|
270 |
+ git_wrapper('commit -m "deleted foreign user '.$handle.' for '.$username.'"'); |
|
271 |
+ git_wrapper('push'); |
|
272 |
+ |
|
273 |
+} |
|
274 |
+ |
|
275 |
+ |
|
177 | 276 |
function newkey($pubkey, $handle) |
178 | 277 |
{ |
179 | 278 |
global $key_dir, $config_dir; |
... | ... |
@@ -231,7 +330,6 @@ function delete_key($handle) |
231 | 330 |
system_failure("Den angegebenen Key scheint es nicht zu geben"); |
232 | 331 |
} |
233 | 332 |
|
234 |
- // FIXME: Muss man den SSH-Key auf Plausibilität prüfen? Aus Sicherheitsgründen vermutlich nicht. |
|
235 | 333 |
$keyfile = $key_dir.'/'.$handle.'.pub'; |
236 | 334 |
if (! file_exists($keyfile)) { |
237 | 335 |
system_failure("Der angegebene Schlüssel scheint nicht mehr vorhanden zu sein. Bitte manuelle Korrektur anfordern!"); |
... | ... |
@@ -0,0 +1,35 @@ |
1 |
+<?php |
|
2 |
+/* |
|
3 |
+This file belongs to the Webinterface of schokokeks.org Hosting |
|
4 |
+ |
|
5 |
+Written 2008-2012 by schokokeks.org Hosting, namely |
|
6 |
+ Bernd Wurst <bernd@schokokeks.org> |
|
7 |
+ Hanno Böck <hanno@schokokeks.org> |
|
8 |
+ |
|
9 |
+To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty. |
|
10 |
+ |
|
11 |
+You should have received a copy of the CC0 Public Domain Dedication along with this software. If not, see |
|
12 |
+http://creativecommons.org/publicdomain/zero/1.0/ |
|
13 |
+ |
|
14 |
+Nevertheless, in case you use a significant part of this code, we ask (but not require, see the license) that you keep the authors' names in place and return your changes to the public. We would be especially happy if you tell us what you're going to do with this code. |
|
15 |
+*/ |
|
16 |
+ |
|
17 |
+require_role(ROLE_SYSTEMUSER); |
|
18 |
+ |
|
19 |
+include('git.php'); |
|
20 |
+ |
|
21 |
+$section = 'git_git'; |
|
22 |
+ |
|
23 |
+$form = ''; |
|
24 |
+ |
|
25 |
+title('GIT-Benutzer eines anderen Kunden hinzufügen'); |
|
26 |
+output('<p>Um anderen GIT-Benutzern, die einen anderen Kundenaccount verwenden, ebenfalls Zugriff auf Ihre GIT-Repositories einzuräumen, können Sie hier GIT-Benutzer anderer Kunden freischalten.</p>'); |
|
27 |
+ |
|
28 |
+$form .= '<table> |
|
29 |
+ <tr><td><label for="handle" />Name des GIT-Benutzers:</label></td><td><input type="text" id="handle" name="handle" value="" /></td></tr> |
|
30 |
+ </table> |
|
31 |
+ <p><input type="submit" value="Speichern" /></p> |
|
32 |
+ '; |
|
33 |
+ |
|
34 |
+ |
|
35 |
+output(html_form('git_newforeignuser', 'save', 'action=newforeignuser', $form)); |
... | ... |
@@ -38,7 +38,7 @@ if ($handle) { |
38 | 38 |
} else { |
39 | 39 |
$action = 'newuser'; |
40 | 40 |
title('Neuer GIT-Benutzer'); |
41 |
- output('<p>Tragen Sie hier einen eindeutigen Namen für den neuen Benutzer fest und hinterlegen Sie einen SSH-Public-Key.</p>'); |
|
41 |
+ output('<p>Tragen Sie hier einen eindeutigen Namen für den neuen Benutzer fest und hinterlegen Sie einen SSH-Public-Key.</p><p><strong>Hinweis:</strong> Es wird nicht funktionieren, mehrere GIT-Zugänge mit dem selben Public-Key einzurichten. Soll ein Entwickler auf GIT-Repositories mehrerer unserer Kunden zugreifen, dann darf der Benutzer nur einmal angelegt werden und muss bei den übrigen Kunden als "GIT-Benutzer eines anderern Kunden" freigeschaltet werden.</p>'); |
|
42 | 42 |
} |
43 | 43 |
|
44 | 44 |
$userprefix = $_SESSION['userinfo']['username'].'-'; |
... | ... |
@@ -33,6 +33,20 @@ if ($_GET['action'] == 'newuser') { |
33 | 33 |
if (! $debugmode) |
34 | 34 |
header('Location: git'); |
35 | 35 |
die(); |
36 |
+} elseif ($_GET['action'] == 'newforeignuser') { |
|
37 |
+ check_form_token('git_newforeignuser'); |
|
38 |
+ $handle = $_POST['handle']; |
|
39 |
+ if ($handle == '') { |
|
40 |
+ system_failure("Leere Benutzerbezeichnung!"); |
|
41 |
+ } |
|
42 |
+ $users = list_foreign_users(); |
|
43 |
+ if (in_array($handle, $users)) { |
|
44 |
+ system_failure("Diesen Benutzer haben Sie bereits hinzugefügt."); |
|
45 |
+ } |
|
46 |
+ new_foreign_user($handle); |
|
47 |
+ if (! $debugmode) |
|
48 |
+ header('Location: git'); |
|
49 |
+ die(); |
|
36 | 50 |
} elseif ($_GET['action'] == 'newkey') { |
37 | 51 |
check_form_token('git_newkey'); |
38 | 52 |
$handle = $_POST['handle']; |
... | ... |
@@ -46,7 +60,7 @@ if ($_GET['action'] == 'newuser') { |
46 | 60 |
} elseif ($_GET['action'] == 'newrepo' || $_GET['action'] == 'editrepo') { |
47 | 61 |
check_form_token('git_edit'); |
48 | 62 |
$permissions = array(); |
49 |
- $users = list_users(); |
|
63 |
+ $users = array_merge(list_users(), list_foreign_users()); |
|
50 | 64 |
foreach ($users as $u) { |
51 | 65 |
if (isset($_POST[$u])) { |
52 | 66 |
switch ($_POST[$u]) { |
53 | 67 |