Subusers-Modul in einer ersten funktionsfähigen Version
Bernd Wurst

Bernd Wurst commited on 2011-11-23 11:00:31
Zeige 10 geänderte Dateien mit 330 Einfügungen und 9 Löschungen.

... ...
@@ -5,6 +5,11 @@ require_once('inc/error.php');
5 5
 
6 6
 function strong_password($password)
7 7
 {
8
+  if ($password == '' || strlen($password) < 4) {
9
+    DEBUG("Passwort zu kurz!");
10
+    return "Passwort ist zu kurz!";
11
+  }
12
+
8 13
   if (! function_exists("crack_opendict"))
9 14
   {
10 15
     DEBUG("cracklib not available!");
... ...
@@ -0,0 +1,29 @@
1
+<?php
2
+require_role(ROLE_SYSTEMUSER);
3
+require_once('inc/security.php');
4
+
5
+include('subuser.php');
6
+$section = 'subusers_subusers';
7
+
8
+if (isset($_GET['subuser'])) {
9
+  $sure = user_is_sure();
10
+  if ($sure === NULL)
11
+  {
12
+    $subuser = load_subuser($_GET['subuser']);
13
+    are_you_sure("subuser={$subuser['id']}", '
14
+    <p>Soll der zusätzliche Admin-Zugang »'.$subuser['username'].'« wirklich gelöscht werden?</p>');
15
+  }
16
+  elseif ($sure === true)
17
+  {
18
+    delete_subuser($_GET['subuser']);
19
+    if (! $debugmode)
20
+      header('Location: subusers');
21
+    die();
22
+  }
23
+  elseif ($sure === false)
24
+  {
25
+    if (! $debugmode)
26
+      header("Location: subusers");
27
+    die();
28
+  }
29
+}
... ...
@@ -0,0 +1,46 @@
1
+<?php
2
+require_role(ROLE_SYSTEMUSER);
3
+include('subuser.php');
4
+
5
+$section = 'subusers_subusers';
6
+
7
+if (isset($_GET['subuser'])) {
8
+  $list = list_subusers();
9
+  foreach ($list as $x) {
10
+    if ($x['id'] == $_GET['subuser']) {
11
+      $subuser = $x;
12
+    }
13
+  }
14
+  if (!isset($subuser)) {
15
+    system_failure('Der Account den Sie bearbeiten möchten wurde nicht gefunden!');
16
+  }
17
+  title("Zusätzlichen Admin-Zugang bearbeiten");
18
+  $pwnotice = ' <em>(Wenn Sie hier nichts eingeben, wird das alte Passwort beibehalten)</em>';
19
+} else {
20
+  $subuser = empty_subuser();
21
+  title("Zusätzlichen Admin-Zugang erstellen");
22
+  $pwnotice = '';
23
+}
24
+
25
+// Username davor entfernen
26
+$subuser['username'] = str_replace($_SESSION['userinfo']['username'].'_', '', $subuser['username']);
27
+
28
+output('Ein zusätzlicher Admin-Zugang darf die hier bestimmten Module dieses Webinterfaces mit den selben Möglichkeiten wie Sie selbst benutzen. Erlauben sie den Zugriff nur vertrauenswürdigen Dritten!');
29
+
30
+
31
+$form = '<table>
32
+<tr><td><strong><label for="username">Benutzername:</label></td><td>'.$_SESSION['userinfo']['username'].'_<input type="text" name="username" id="username" value="'.$subuser['username'].'" /></td></tr>
33
+<tr><td><strong><label for="password">Passwort:</label></td><td><input type="password" name="password" id="password" value="" />'.$pwnotice.'</td></tr>
34
+<tr><td style="vertical-align: top;">Berechtigungen:</td><td>';
35
+foreach ($modinfo as $key => $desc) {
36
+  $checked = in_array($key, $subuser['modules']) ? 'checked="checked "' : '';
37
+  $form .= '<input type="checkbox" name="modules[]" id="'.$key.'" value="'.$key.'" '.$checked.'/> <label for="'.$key.'">'.$desc.'</label><br />';
38
+}
39
+$form .= '</td></tr>
40
+<tr><td colspan="2"><input type="submit" value="Speichern" /></td></tr>
41
+
42
+</table>';
43
+
44
+output(html_form('subusers_edit', 'save', 'id='.$subuser['id'], $form));
45
+
46
+
... ...
@@ -0,0 +1,171 @@
1
+<?php
2
+require_once("inc/base.php");
3
+require_once("inc/security.php");
4
+require_once("inc/debug.php");
5
+
6
+// FIXME: Das sollten die Module selbst irgendwo anbieten!
7
+$modinfo = array(
8
+	"index" => "An- und Abmelden",
9
+	"domains" => "Liste der Domains anzeigen",
10
+	"dns" => "DNS-Einträge verändern",
11
+	"mysql" => "MySQL-Datenbanken verwalten",
12
+	"jabber" => "Jabber-Accouns verwalten",
13
+	"vhosts" => "Webserver-Konfiguration verwalten",
14
+	"systemuser" => "Daten des System-Benutzeraccounts einsehen/ändern",
15
+//	"su" => "Das Webinterface unter einem beliebigen anderen Account ausführen",
16
+	"email" => "E-Mail-Adressen und/oder IMAP-Accounts verwalten",
17
+	"webapps" => "Automatische Installation von Web-Anwendungen",
18
+	"greylisting" => "Ausnahmeliste für Greylisting verwalten",
19
+	"invoice" => "Fällige und kommende Rechnungen anzeigen",
20
+	"mailman" => "Mailinglisten verwalten",
21
+	"ftpusers" => "Zugriff per FTP verwalten",
22
+	"subusers" => "Zusätzliche Admin-Zugänge verwalten");
23
+// FIXME: Dependancies der Module sollte man auch irgendwo speichern.
24
+
25
+
26
+
27
+function list_subusers()
28
+{
29
+  $uid = (int) $_SESSION['userinfo']['uid'];
30
+  $result = db_query("SELECT id, username, modules FROM system.subusers WHERE uid={$uid}");
31
+  $subusers = array();
32
+  while ($item = mysql_fetch_assoc($result))
33
+  {
34
+    $item['modules'] = explode(',', $item['modules']);
35
+    $subusers[] = $item;
36
+  }
37
+  DEBUG($subusers);
38
+  return $subusers;
39
+}
40
+
41
+
42
+function load_subuser($id) {
43
+  $id = (int) $id;
44
+  $uid = (int) $_SESSION['userinfo']['uid'];
45
+  
46
+  $result = db_query("SELECT id, username, modules FROM system.subusers WHERE uid={$uid} AND id={$id}");
47
+  $item = mysql_fetch_assoc($result);
48
+  $item['modules'] = explode(',', $item['modules']);
49
+  return $item;
50
+}
51
+
52
+
53
+function available_modules()
54
+{
55
+  global $modinfo;
56
+  $modules = array();
57
+  foreach (config('modules') as $mod)
58
+  {
59
+    if (isset($modinfo[$mod]))
60
+      $modules[$mod] = $modinfo[$mod];
61
+  }
62
+  return $modules;
63
+}
64
+
65
+function delete_subuser($id) {
66
+  $id = (int) $id;
67
+  $uid = (int) $_SESSION['userinfo']['uid'];
68
+  
69
+  db_query("DELETE FROM system.subusers WHERE id={$id} AND uid={$uid}");
70
+}
71
+
72
+function empty_subuser()
73
+{
74
+  $subuser = array("id" => NULL, "username" => $_SESSION['userinfo']['username'].'_', "modules" => array('index'));
75
+  return $subuser;
76
+}
77
+
78
+function new_subuser($username, $requested_modules, $password) 
79
+{
80
+  $uid = (int) $_SESSION['userinfo']['uid'];
81
+
82
+  $username = mysql_real_escape_string(filter_input_username($username));
83
+  if (strpos($username, $_SESSION['userinfo']['username']) !== 0) {
84
+    // Username nicht enthalten (FALSE) oder nicht am Anfang (>0)
85
+    system_failure("Ungültiger Benutzername!");
86
+  }
87
+
88
+  if (!is_array($requested_modules)) {
89
+    system_failure("Module nicht als array erhalten!");
90
+  }
91
+  DEBUG($requested_modules);
92
+  $allmods = available_modules();
93
+  $modules = array();
94
+  foreach ($requested_modules as $mod) {
95
+    if (isset($allmods[$mod])) {
96
+      $modules[] = $mod;
97
+    }
98
+  }
99
+  DEBUG($modules);
100
+  if (count($modules) == 0) {
101
+    system_failure("Es sind (nach der Filterung) keine Module mehr übrig!");
102
+  }
103
+  $modules = mysql_real_escape_string(implode(',', $modules));
104
+  
105
+  $result = strong_password($password);
106
+  if ($result !== true) {
107
+    system_failure("Unsicheres Passwort. Die Meldung von cracklib lautet: ".$result);
108
+  }
109
+  $password = hash("sha256", $password);
110
+
111
+  db_query("INSERT INTO system.subusers (uid, username, password, modules) VALUES ({$uid}, '{$username}', '{$password}', '{$modules}')");
112
+}
113
+
114
+
115
+function edit_subuser($id, $username, $requested_modules, $password) 
116
+{
117
+  $uid = (int) $_SESSION['userinfo']['uid'];
118
+
119
+  $id = (int) $id;
120
+  $my_subusers = list_subusers();
121
+  $valid = false;
122
+  foreach ($my_subusers as $x) {
123
+    if ($x['id'] == $id) {
124
+      $valid = true;
125
+    }
126
+  }
127
+  if (!$valid) {
128
+    system_failure("Kann diesen Account nicht finden!");
129
+  }
130
+
131
+  $username = mysql_real_escape_string(filter_input_username($username));
132
+  if (strpos($username, $_SESSION['userinfo']['username']) !== 0) {
133
+    // Username nicht enthalten (FALSE) oder nicht am Anfang (>0)
134
+    system_failure("Ungültiger Benutzername!");
135
+  }
136
+
137
+
138
+  if (!is_array($requested_modules)) {
139
+    system_failure("Module nicht als array erhalten!");
140
+  }
141
+  $allmods = available_modules();
142
+  $modules = array();
143
+  foreach ($requested_modules as $mod) {
144
+    if (isset($allmods[$mod])) {
145
+      $modules[] = $mod;
146
+    }
147
+  }
148
+  if (count($modules) == 0) {
149
+    system_failure("Es sind (nach der Filterung) keine Module mehr übrig!");
150
+  }
151
+  $modules = mysql_real_escape_string(implode(',', $modules));
152
+  
153
+  $pwchange = '';
154
+  if ($password) {
155
+    $result = strong_password($password);
156
+    if ($result !== true) {
157
+      system_failure("Unsicheres Passwort. Die Meldung von cracklib lautet: ".$result);
158
+    }
159
+    $password = hash("sha256", $password);
160
+    $pwchange = ", password='{$password}'";
161
+  }
162
+
163
+
164
+  db_query("UPDATE system.subusers SET username='{$username}', modules='{$modules}'{$pwchange} WHERE id={$id} AND uid={$uid}");
165
+}
166
+
167
+
168
+
169
+
170
+
171
+
... ...
@@ -0,0 +1,11 @@
1
+<?php
2
+
3
+$role = $_SESSION['role'];
4
+
5
+if ($role & ROLE_SYSTEMUSER) {
6
+  $menu["subusers_subusers"] = array("label" => "Zusätzliche Admins", "file" => "subusers", "weight" => 1, "submenu" => "systemuser_account");
7
+  //$menu["subusers_subusers"] = array("label" => "Zusätzliche Admins", "file" => "subusers", "weight" => 1);
8
+}
9
+
10
+
11
+?>
... ...
@@ -0,0 +1,25 @@
1
+<?php
2
+require_role(ROLE_SYSTEMUSER);
3
+include("subuser.php");
4
+
5
+$section = 'subusers_subusers';
6
+
7
+if (!isset($_POST['username']) || $_POST['username'] == '') {
8
+  system_failure("Der Benutzername muss eingegeben werden!");
9
+}
10
+if (!isset($_POST['modules']) || count($_POST['modules']) == 0) {
11
+  system_failure("Der zusätzliche Zugang muss irgendwelche Rechte erhalten!");
12
+}
13
+
14
+$_POST['username'] = $_SESSION['userinfo']['username'].'_'.$_POST['username'];
15
+
16
+if (isset($_GET['id']) && (int) $_GET['id'] != 0) {
17
+  edit_subuser($_GET['id'], $_POST['username'], $_POST['modules'], $_POST['password']);
18
+} else {
19
+  new_subuser($_POST['username'], $_POST['modules'], $_POST['password']);
20
+}
21
+
22
+
23
+if (! $debugmode)
24
+  header('Location: subusers');
25
+
... ...
@@ -0,0 +1,34 @@
1
+<?php
2
+require_role(ROLE_SYSTEMUSER);
3
+require_once('inc/icons.php');
4
+
5
+include("subuser.php");
6
+
7
+title("Zusätzliche Admin-Zugänge");
8
+
9
+output('<p>Sie können für dieses Admin-Interface zusätzliche Accounts anlegen, die dann nur Zugriff auf einzelne Module haben. So ist es z.B. möglich, einen Mail-Admin und einen Webserver-Admin festzulegen.</p><p><strong>Wichtig:</strong> Diese zusätzlichen Zugänge gelten ausschließlich für dieses Web-Interface, nicht für die Anmeldung am Server.</p>');
10
+
11
+$subusers = list_subusers();
12
+
13
+$available_modules = available_modules();
14
+DEBUG($available_modules);
15
+
16
+if ($subusers)
17
+{
18
+  output('<h4>Momentan vorhandene zusätzliche Admin-Zugänge</h4>');
19
+  foreach ($subusers as $subuser) {
20
+    output('<div><p><strong>'.$subuser['username'].'</strong> '.internal_link('delete.php', icon_delete('Löschen'), 'subuser='.$subuser['id']).' '.internal_link('edit.php', icon_edit('Bearbeiten'), 'subuser='.$subuser['id']).'</p>');
21
+    output('<ul>');
22
+    foreach ($subuser['modules'] as $mod) {
23
+      output('<li>'.$available_modules[$mod].'</li>');
24
+    }
25
+    output('</ul></div>');
26
+  }
27
+  
28
+}
29
+else
30
+{
31
+  output('<p><em>Sie haben bisher keine zusätzlichen Admin-Zugänge</em></p>');
32
+}
33
+
34
+addnew('edit.php', 'Neuen zusätzlichen Admin-Zugang anlegen...');
... ...
@@ -100,8 +100,8 @@ function find_role($login, $password, $i_am_admin = False)
100 100
   {
101 101
     $entry = mysql_fetch_object($result);
102 102
     $db_password = $entry->password;
103
-    $hash = sha1($password);
104
-    if ($hash == $db_password || $i_am_admin)
103
+    // SHA1 für alte Subuser (kaylee), SHA256 für neue Subuser
104
+    if (hash("sha1", $password) == $db_password || hash("sha256", $password) == $db_password || $i_am_admin)
105 105
     {
106 106
       logger(LOG_INFO, "session/checkuser", "login", "logged in virtual subuser »{$login}«.");
107 107
       return ROLE_SUBUSER;
... ...
@@ -23,9 +23,9 @@ if (!session_start())
23 23
 
24 24
 DEBUG("<pre>POST-DATA: ".htmlspecialchars(print_r($_POST, true))."\nSESSION_DATA: ".htmlspecialchars(print_r($_SESSION, true))."</pre>");
25 25
 
26
-if (isset($_POST['username']) && isset($_POST['password']))
26
+if (isset($_POST['webinterface_username']) && isset($_POST['webinterface_password']))
27 27
 {
28
-  $role = find_role($_POST['username'], $_POST['password']);
28
+  $role = find_role($_POST['webinterface_username'], $_POST['webinterface_password']);
29 29
   if ($role === NULL)
30 30
   {
31 31
     $_SESSION['role'] = ROLE_ANONYMOUS;
... ...
@@ -34,10 +34,10 @@ if (isset($_POST['username']) && isset($_POST['password']))
34 34
   }
35 35
   else
36 36
   {
37
-    setup_session($role, $_POST['username']);
37
+    setup_session($role, $_POST['webinterface_username']);
38 38
   }
39
-  unset($_POST['username']);
40
-  unset($_POST['password']);
39
+  unset($_POST['webinterface_username']);
40
+  unset($_POST['webinterface_password']);
41 41
 }
42 42
 
43 43
 elseif (isset($_SESSION['role']))
... ...
@@ -41,8 +41,8 @@ if ($messages) {
41 41
 <h3>schokokeks.org Hosting Webinterface</h3>
42 42
 <p>Auf dieser Seite können Sie diverse Einstellungen Ihres Accounts auf schokokeks.org Hosting festlegen. Sofern Sie noch kein Kunde von schokokeks.org Hosting sind, können Sie diese Seite nicht benutzen. Besuchen Sie in diesem Fall bitte unsere <a href="http://www.schokokeks.org">öffentliche Seite</a>.</p>
43 43
 <form action="" method="post">
44
-<p><span class="login_label">Benutzer<sup>*</sup>:</span> <input type="text" name="username" size="30" /></p>
45
-<p><span class="login_label">Passwort:</span> <input type="password" name="password" size="30" /></p>
44
+<p><span class="login_label">Benutzer<sup>*</sup>:</span> <input type="text" name="webinterface_username" size="30" /></p>
45
+<p><span class="login_label">Passwort:</span> <input type="password" name="webinterface_password" size="30" /></p>
46 46
 <p><span class="login_label">&#160;</span> <input type="submit" value="Anmelden" /></p>
47 47
 </form>
48 48
 <p><sup>*</sup> Sie können sich hier mit Ihrem System-Benutzernamen, Ihrem IMAP-Account oder Ihrer Kundennummer (jeweils mit zugehörigem Passwort) anmelden. Je nach gewählten Daten erhalten Sie unterschiedliche Zugriffsrechte.</p>
49 49