bernd commited on 2011-12-21 16:51:52
Zeige 4 geänderte Dateien mit 160 Einfügungen und 3 Löschungen.
git-svn-id: https://svn.schokokeks.org/repos/tools/webinterface/trunk@2092 87cf0b9e-d624-0410-a070-f6ee81989793
| ... | ... |
@@ -5,6 +5,45 @@ include("git.php");
|
| 5 | 5 |
|
| 6 | 6 |
$section = 'git_git'; |
| 7 | 7 |
|
| 8 |
+$repos = list_repos(); |
|
| 8 | 9 |
|
| 10 |
+$users = list_users(); |
|
| 9 | 11 |
|
| 12 |
+$action = ''; |
|
| 13 |
+$form = ''; |
|
| 14 |
+ |
|
| 15 |
+if (isset($_GET['repo']) && isset($repos[$_GET['repo']])) {
|
|
| 16 |
+ $action = 'editrepo'; |
|
| 17 |
+ title("Zugriff auf GIT-Repository ändern");
|
|
| 18 |
+ output("<p>Legen Sie hier fest, welche Berechtigungen für welche SSH-Keys gelten sollen.</p>");
|
|
| 19 |
+ $form .= '<table><tr><td>Name des Repository</td><td><input type="hidden" name="repo" value="'.filter_input_general($_GET['repo']).'" />'.filter_input_general($_GET['repo']).'</td></tr>'; |
|
| 20 |
+} else {
|
|
| 21 |
+ $action = 'newrepo'; |
|
| 22 |
+ title("Neues GIT-Repository anlegen");
|
|
| 23 |
+ output("<p>Geben Sie einen Namen für das neue Repository an und legen Sie fest, welche Berechtigungen für welche SSH-Keys gelten sollen.</p>");
|
|
| 24 |
+ $form .= '<table><tr><td><label for="repo">Name des Repository</label></td><td><input type="text" id="repo" name="repo" /></td></tr>'; |
|
| 25 |
+} |
|
| 26 |
+ |
|
| 27 |
+$form .= '<tr><td>Berechtigungen</td><td>'; |
|
| 28 |
+foreach ($users as $user) {
|
|
| 29 |
+ $r = $rw = $rwplus = ''; |
|
| 30 |
+ if (isset($_GET['repo']) && isset($repos[$_GET['repo']])) {
|
|
| 31 |
+ $repo = $repos[$_GET['repo']]; |
|
| 32 |
+ if (isset($repo[$user])) {
|
|
| 33 |
+ switch ($repo[$user]) {
|
|
| 34 |
+ case 'RW+': $rwplus = ' selected="selected"'; |
|
| 35 |
+ break; |
|
| 36 |
+ case 'RW': $rw = ' selected="selected"'; |
|
| 37 |
+ break; |
|
| 38 |
+ case 'R': $r = ' selected="selected"'; |
|
| 39 |
+ break; |
|
| 40 |
+ } |
|
| 41 |
+ } |
|
| 42 |
+ } |
|
| 43 |
+ $form .= $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><br />'; |
|
| 44 |
+} |
|
| 45 |
+$form .= '</td></tr></table>'; |
|
| 46 |
+$form .= '<p><input type="submit" value="Speichern" /></p>'; |
|
| 47 |
+ |
|
| 48 |
+output(html_form('git_edit', 'save', 'action='.$action, $form));
|
|
| 10 | 49 |
|
| ... | ... |
@@ -76,15 +77,16 @@ function list_repos() |
| 76 | 77 |
$current_repo = NULL; |
| 77 | 78 |
$current_repo_users = array(); |
| 78 | 79 |
foreach ($lines as $line) {
|
| 80 |
+ DEBUG("LINE: ".$line);
|
|
| 79 | 81 |
$m = array(); |
| 80 |
- if (preg_match('_^[ \t]*repo ([^]]+)_', $line, $m) != 0) {
|
|
| 82 |
+ if (preg_match('_^\s*repo (\S+)\s*$_', $line, $m) != 0) {
|
|
| 81 | 83 |
if ($current_repo) {
|
| 82 | 84 |
$repos[$current_repo] = $current_repo_users; |
| 83 | 85 |
} |
| 84 | 86 |
DEBUG("found repo ".$m[1]);
|
| 85 | 87 |
$current_repo = chop($m[1]); |
| 86 | 88 |
$current_repo_users = array(); |
| 87 |
- } else if (preg_match('/^\s*(R|RW|RW+)\s*=\s*([[:alnum:]][[:alnum:]._-]*)\s*/', $line, $m) != 0) {
|
|
| 89 |
+ } else if (preg_match('/^\s*(R|RW|RW\+)\s*=\s*([[:alnum:]][[:alnum:]._-]*)\s*$/', $line, $m) != 0) {
|
|
| 88 | 90 |
DEBUG("found access rule: ".$m[1]." for ".$m[2]);
|
| 89 | 91 |
$current_repo_users[chop($m[2])] = chop($m[1]); |
| 90 | 92 |
} |
| ... | ... |
@@ -224,3 +226,97 @@ function delete_key($handle) |
| 224 | 226 |
|
| 225 | 227 |
|
| 226 | 228 |
} |
| 229 |
+ |
|
| 230 |
+ |
|
| 231 |
+function remove_repo_from_array($data, $repo) {
|
|
| 232 |
+ DEBUG("Request to remove repo »{$repo}«...");
|
|
| 233 |
+ $inside = false; |
|
| 234 |
+ $outdata = array(); |
|
| 235 |
+ foreach ($data as $line) {
|
|
| 236 |
+ $m = array(); |
|
| 237 |
+ if (preg_match('_^\s*repo (\S+)\s*$_', $line, $m) != 0) {
|
|
| 238 |
+ $inside = ($m[1] == $repo); |
|
| 239 |
+ } |
|
| 240 |
+ if (! $inside) {
|
|
| 241 |
+ $outdata[] = $line; |
|
| 242 |
+ } |
|
| 243 |
+ } |
|
| 244 |
+ DEBUG($outdata); |
|
| 245 |
+ return $outdata; |
|
| 246 |
+} |
|
| 247 |
+ |
|
| 248 |
+ |
|
| 249 |
+function repo_exists_globally($repo) |
|
| 250 |
+{
|
|
| 251 |
+ global $config_dir; |
|
| 252 |
+ $files = scandir($config_dir); |
|
| 253 |
+ foreach ($files as $f) {
|
|
| 254 |
+ if (is_file(realpath($config_dir.'/'.$f))) {
|
|
| 255 |
+ $data = file(realpath($config_dir.'/'.$f)); |
|
| 256 |
+ foreach ($data as $line) {
|
|
| 257 |
+ if (preg_match('/^\s*repo '.$repo.'\s*$/', $line) != 0) {
|
|
| 258 |
+ return true; |
|
| 259 |
+ } |
|
| 260 |
+ } |
|
| 261 |
+ } |
|
| 262 |
+ } |
|
| 263 |
+ return false; |
|
| 264 |
+} |
|
| 265 |
+ |
|
| 266 |
+ |
|
| 267 |
+function delete_repo($repo) |
|
| 268 |
+{
|
|
| 269 |
+ $repos = list_repos(); |
|
| 270 |
+ if (!array_key_exists($repo, $repos)) {
|
|
| 271 |
+ system_failure("Ein solches Repository existiert nicht!");
|
|
| 272 |
+ } |
|
| 273 |
+ |
|
| 274 |
+ global $config_dir; |
|
| 275 |
+ $username = $_SESSION['userinfo']['username']; |
|
| 276 |
+ $userconfig = $config_dir . '/' . $username . '.conf'; |
|
| 277 |
+ DEBUG("using config file ".$userconfig);
|
|
| 278 |
+ $data = file($userconfig); |
|
| 279 |
+ $data = remove_repo_from_array($data, $repo); |
|
| 280 |
+ file_put_contents($userconfig, implode('', $data));
|
|
| 281 |
+ git_wrapper('add '.$userconfig);
|
|
| 282 |
+ |
|
| 283 |
+ git_wrapper('commit --allow-empty -m "deleted repo '.$repo.'"');
|
|
| 284 |
+ git_wrapper('push');
|
|
| 285 |
+} |
|
| 286 |
+ |
|
| 287 |
+function save_repo($repo, $permissions) |
|
| 288 |
+{
|
|
| 289 |
+ if (!validate_name($repo)) {
|
|
| 290 |
+ system_failure("Der gewählte name entspricht nicht den Konventionen!");
|
|
| 291 |
+ } |
|
| 292 |
+ if (!array_key_exists($repo, list_repos()) && repo_exists_globally($repo)) {
|
|
| 293 |
+ system_failure("Der gewählte Name existiert bereits auf diesem Server. Bitte wählen Sie einen spezifischeren Namen.");
|
|
| 294 |
+ } |
|
| 295 |
+ global $config_dir; |
|
| 296 |
+ $username = $_SESSION['userinfo']['username']; |
|
| 297 |
+ $userconfig = $config_dir . '/' . $username . '.conf'; |
|
| 298 |
+ DEBUG("using config file ".$userconfig);
|
|
| 299 |
+ $data = array(); |
|
| 300 |
+ if (! is_file($userconfig)) {
|
|
| 301 |
+ DEBUG("user-config does not exist, creating new one");
|
|
| 302 |
+ } else {
|
|
| 303 |
+ $data = file($userconfig); |
|
| 304 |
+ } |
|
| 305 |
+ |
|
| 306 |
+ $repos = list_repos(); |
|
| 307 |
+ if (array_key_exists($repo, $repos)) {
|
|
| 308 |
+ $data = remove_repo_from_array($data, $repo); |
|
| 309 |
+ } |
|
| 310 |
+ |
|
| 311 |
+ $data[] = "\n"; |
|
| 312 |
+ $data[] = 'repo '.$repo."\n"; |
|
| 313 |
+ foreach ($permissions as $user => $perm) {
|
|
| 314 |
+ $data[] = ' '.$perm.' = '.$user."\n"; |
|
| 315 |
+ } |
|
| 316 |
+ file_put_contents($userconfig, implode('', $data));
|
|
| 317 |
+ git_wrapper('add '.$userconfig);
|
|
| 318 |
+ |
|
| 319 |
+ git_wrapper('commit --allow-empty -m "written repo '.$repo.'"');
|
|
| 320 |
+ git_wrapper('push');
|
|
| 321 |
+} |
|
| 322 |
+ |
| ... | ... |
@@ -4,6 +4,7 @@ require_role(ROLE_SYSTEMUSER); |
| 4 | 4 |
include('git.php');
|
| 5 | 5 |
|
| 6 | 6 |
if ($_GET['action'] == 'newuser') {
|
| 7 |
+ check_form_token('git_newkey');
|
|
| 7 | 8 |
$handle = $_POST['handle']; |
| 8 | 9 |
if ($handle == '') {
|
| 9 | 10 |
system_failure("Leere Benutzerbezeichnung!");
|
| ... | ... |
@@ -17,6 +18,7 @@ if ($_GET['action'] == 'newuser') {
|
| 17 | 18 |
header('Location: git');
|
| 18 | 19 |
die(); |
| 19 | 20 |
} elseif ($_GET['action'] == 'newkey') {
|
| 21 |
+ check_form_token('git_newkey');
|
|
| 20 | 22 |
$handle = $_POST['handle']; |
| 21 | 23 |
if ($handle == '') {
|
| 22 | 24 |
system_failure("Leere Benutzerbezeichnung!");
|
| ... | ... |
@@ -25,6 +27,27 @@ if ($_GET['action'] == 'newuser') {
|
| 25 | 27 |
if (! $debugmode) |
| 26 | 28 |
header('Location: git');
|
| 27 | 29 |
die(); |
| 30 |
+} elseif ($_GET['action'] == 'newrepo' || $_GET['action'] == 'editrepo') {
|
|
| 31 |
+ check_form_token('git_edit');
|
|
| 32 |
+ $permissions = array(); |
|
| 33 |
+ $users = list_users(); |
|
| 34 |
+ foreach ($users as $u) {
|
|
| 35 |
+ if (isset($_POST[$u])) {
|
|
| 36 |
+ switch ($_POST[$u]) {
|
|
| 37 |
+ case 'rwplus': $permissions[$u] = 'RW+'; |
|
| 38 |
+ break; |
|
| 39 |
+ case 'rw': $permissions[$u] = 'RW'; |
|
| 40 |
+ break; |
|
| 41 |
+ case 'r': $permissions[$u] = 'R'; |
|
| 42 |
+ break; |
|
| 43 |
+ } |
|
| 44 |
+ } |
|
| 45 |
+ } |
|
| 46 |
+ save_repo($_POST['repo'], $permissions); |
|
| 47 |
+ if (! $debugmode) |
|
| 48 |
+ header('Location: git');
|
|
| 49 |
+ die(); |
|
| 50 |
+ |
|
| 28 | 51 |
} |
| 29 | 52 |
|
| 30 | 53 |
|
| 31 | 54 |