Cert-Login geht jetztauch mit sub-usern
bernd

bernd commited on 2010-10-01 10:45:35
Zeige 5 geänderte Dateien mit 24 Einfügungen und 6 Löschungen.


git-svn-id: https://svn.schokokeks.org/repos/tools/webinterface/trunk@1823 87cf0b9e-d624-0410-a070-f6ee81989793
... ...
@@ -45,7 +45,7 @@ DEBUG($_SERVER);
45 45
 if ($_SESSION['role'] != ROLE_ANONYMOUS && isset($_REQUEST['record']) && isset($_REQUEST['backto']) && check_path($_REQUEST['backto']))
46 46
 {
47 47
   DEBUG('recording client-cert');
48
-  if (isset($_SERVER['REDIRECT_SSL_CLIENT_CERT']) && $_SERVER['REDIRECT_SSL_CLIENT_S_DN'] != '' && $_SERVER['REDIRECT_SSL_CLIENT_I_DN'] != '')
48
+  if (isset($_SERVER['REDIRECT_SSL_CLIENT_CERT']) && isset($_SERVER['REDIRECT_SSL_CLIENT_S_DN']) && isset($_SERVER['REDIRECT_SSL_CLIENT_I_DN']))
49 49
   {
50 50
     $_SESSION['clientcert_cert'] = prepare_cert($_SERVER['REDIRECT_SSL_CLIENT_CERT']);
51 51
     $_SESSION['clientcert_dn'] = $_SERVER['REDIRECT_SSL_CLIENT_S_DN'];
... ...
@@ -105,6 +105,9 @@ else
105 105
       if ($account['type'] == 'email') {
106 106
         $type = 'E-Mail-Konto';
107 107
       }
108
+      elseif ($account['type'] == 'subuser') {
109
+        $type = 'Unter-Nutzer';
110
+      }
108 111
       elseif ($account['type'] == 'customer') {
109 112
         $type = 'Kundenaccount';
110 113
       }
... ...
@@ -33,7 +33,10 @@ if (isset($_SESSION['clientcert_cert']))
33 33
 }
34 34
 
35 35
 
36
-$certs = get_certs_by_username($_SESSION['userinfo']['username']);
36
+$username = $_SESSION['userinfo']['username'];
37
+if (isset($_SESSION['subuser']))
38
+  $username = $_SESSION['subuser'];
39
+$certs = get_certs_by_username($username);
37 40
 if ($certs != NULL) {
38 41
   output('<p>Sie haben bereits Zertifikate für den Zugang eingerichtet.</p>
39 42
   <ul>');
... ...
@@ -51,6 +51,9 @@ function get_certs_by_username($username)
51 51
 
52 52
 function add_clientcert($certdata, $dn, $issuer, $startpage='')
53 53
 {
54
+  $type = 'user';
55
+  if (isset($_SESSION['subuser']))
56
+    $type = 'subuser';
54 57
   $certdata = mysql_real_escape_string($certdata);
55 58
   $dn = maybe_null(mysql_real_escape_string($dn));
56 59
   $issuer = maybe_null(mysql_real_escape_string($issuer));
... ...
@@ -59,6 +62,8 @@ function add_clientcert($certdata, $dn, $issuer, $startpage='')
59 62
   $startpage = maybe_null(mysql_real_escape_string($startpage));
60 63
 
61 64
   $username = mysql_real_escape_string($_SESSION['userinfo']['username']);
65
+  if ($type == 'subuser')
66
+    $username = $_SESSION['subuser'];
62 67
   if ($username == '')
63 68
     system_failure('Kein Username');
64 69
 
... ...
@@ -69,7 +74,7 @@ function add_clientcert($certdata, $dn, $issuer, $startpage='')
69 74
   DEBUG($issuer);
70 75
 
71 76
   db_query("INSERT INTO system.clientcert (`dn`, `issuer`, `cert`, `type`, `username`, `startpage`) 
72
-VALUES ({$dn}, {$issuer}, '{$certdata}', 'user', '{$username}', {$startpage})");
77
+VALUES ({$dn}, {$issuer}, '{$certdata}', '{$type}', '{$username}', {$startpage})");
73 78
 
74 79
 }
75 80
 
... ...
@@ -6,7 +6,7 @@ if ($role == ROLE_ANONYMOUS) {
6 6
   $menu["index_login"] = array("label" => "Login", "file" => "index", "weight" => 0);
7 7
   $menu["certlogin"] = array("label" => "Client-Zertifikat", "file" => "certinfo", "weight" => 10);
8 8
 } else {
9
-  if ($role & ROLE_SYSTEMUSER && ! ($role & ROLE_SUBUSER))
9
+  if ($role & (ROLE_SYSTEMUSER | ROLE_SUBUSER))
10 10
     $menu["index_cert"] = array("label" => "Client-Zertifikat", "file" => "cert", "weight" => 10, "submenu" => "index_index");
11 11
   if ($role & (ROLE_SYSTEMUSER | ROLE_CUSTOMER) && ! $role & ROLE_SUBUSER) {
12 12
     $menu["index_chpass"] = array("label" => "Passwort ändern", "file" => "chpass", "weight" => 98);
... ...
@@ -95,12 +95,19 @@ function find_role($login, $password, $i_am_admin = False)
95 95
 
96 96
   // Sub-User
97 97
 
98
-  $result = db_query("SELECT uid FROM system.subusers WHERE username='{$login}' AND password=SHA1('{$password}')");
98
+  $result = db_query("SELECT password FROM system.subusers WHERE username='{$login}'");
99 99
   if (@mysql_num_rows($result) > 0)
100 100
   {
101
-    // FIXME: Admin-Su-Anmeldung geht damit nicht
101
+    $entry = mysql_fetch_object($result);
102
+    $db_password = $entry->password;
103
+    $hash = sha1($password);
104
+    if ($hash == $db_password || $i_am_admin)
105
+    {
106
+      logger(LOG_INFO, "session/checkuser", "login", "logged in virtual subuser »{$login}«.");
102 107
       return ROLE_SUBUSER;
103 108
     }
109
+    logger(LOG_WARNING, "session/checkuser", "login", "wrong password for existing subuser »{$login}«.");
110
+  }
104 111
 
105 112
 
106 113
   // Nothing?
107 114