Browse code

add foreign git users and grant permissions to them

Bernd Wurst authored on12/03/2012 09:31:30
Showing7 changed files
... ...
@@ -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. &quot;rewind&quot;)</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. &quot;rewind&quot;)</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>');
... ...
@@ -133,7 +133,6 @@ function list_repos()
133 133
 }
134 134
 
135 135
 
136
-
137 136
 function list_users() {
138 137
   global $config_file, $config_dir;
139 138
   $username = $_SESSION['userinfo']['username'];
... ...
@@ -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!");
238 336
new file mode 100644
... ...
@@ -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]) {