Ermögliche Kunden sich einen Password-Reset-Link zu senden
Bernd Wurst

Bernd Wurst commited on 2014-01-15 18:15:09
Zeige 4 geänderte Dateien mit 69 Einfügungen und 23 Löschungen.

... ...
@@ -17,6 +17,21 @@ Nevertheless, in case you use a significant part of this code, we ask (but not r
17 17
 require_once('newpass.php');
18 18
 require_once('session/checkuser.php');
19 19
 
20
+function send_user_token($username) 
21
+{
22
+  $token = get_user_token($username);
23
+  $email = emailaddress_for_user($username);
24
+
25
+  $tokenurl = config('webinterface_url').'/init'.$token.'?agb=1';
26
+
27
+  $msg = 'Sie haben für Ihren Zugang bei '.config('company_name').' ein neues Passwort angefordert.
28
+Bitte besuchen Sie folgende Adresse um Ihr Passwort neu zu setzen:
29
+  '.$tokenurl.'
30
+
31
+Mit freundlichen Grüßen,
32
+Ihre Admins von '.config('company_name');
33
+  send_mail($email, "Passwortanforderung fuer schokokeks.org", $msg);
34
+}
20 35
 
21 36
 function send_customer_token($customerno)
22 37
 {
... ...
@@ -24,7 +39,7 @@ function send_customer_token($customerno)
24 39
   $token = get_customer_token($customerno);
25 40
   $customer = get_customer_info($customerno);
26 41
   if ($customer['email'] == '')
27
-    system_failure('Für Ihr Kundenkonto ist keine E-Mail-Adresse eingetragen. Diese Funktion steht Ihnen daher nicht zur Verfügung.')
42
+    system_failure('Für Ihr Kundenkonto ist keine E-Mail-Adresse eingetragen. Diese Funktion steht Ihnen daher nicht zur Verfügung.');
28 43
   $anrede = "Sehr geehrte Damen und Herren";
29 44
   if ($customer['title'] == 'Herr')
30 45
     $anrede = "Sehr geehrter Herr {$customer['name']}";
... ...
@@ -17,6 +17,18 @@ Nevertheless, in case you use a significant part of this code, we ask (but not r
17 17
 require_once('inc/db_connect.php');
18 18
 require_once('session/checkuser.php');
19 19
 
20
+function user_customer_match($cust, $user)
21
+{
22
+  $customerno = (int) $cust;
23
+  $username = mysql_real_escape_string($user);
24
+  $result = db_query("SELECT uid FROM system.useraccounts WHERE kunde={$customerno} AND username='{$username}' AND kundenaccount=1;");
25
+  if (mysql_num_rows($result) > 0)
26
+    return true;
27
+  return false;
28
+}
29
+
30
+
31
+
20 32
 function customer_has_email($customerno, $email)
21 33
 {
22 34
   $customerno = (int) $customerno;
... ...
@@ -88,23 +100,33 @@ function invalidate_systemuser_token($uid)
88 100
   db_query("DELETE FROM system.usertoken WHERE uid={$uid} LIMIT 1;");
89 101
 }
90 102
  
91
-function create_token($customerno)
103
+function create_token($username)
92 104
 {
93
-  $customerno = (int) $customerno;
105
+  $username = mysql_real_escape_string($username);
94 106
   expire_tokens();
95
-  $result = db_query("SELECT token_create FROM kundendaten.kunden WHERE id={$customerno} AND token_create IS NOT NULL;");
96
-  if (mysql_num_rows($result) > 0)
97
-  {
98
-    $res = mysql_fetch_object($result)->token_create;
99
-    input_error("Sie haben diese Funktion kürzlich erst benutzt, an Ihre E-Mail-Adresse wurde bereits am {$res} eine Nachricht verschickt. Sie können diese Funktion erst nach Ablauf von 24 Stunden erneut benutzen.");
100
-    return false;
107
+  $result = db_query("SELECT uid FROM system.useraccounts WHERE username='{$username}'");
108
+  $uid = (int) mysql_fetch_assoc($result)['uid'];
109
+  
110
+  $result = db_query("SELECT created FROM system.usertoken WHERE uid={$uid}");
111
+  if (mysql_num_rows($result) > 0) {
112
+    system_failure("Für Ihr Benutzerkonto ist bereits eine Passwort-Erinnerung versendet worden. Bitte wenden Sie sich an den Support wenn Sie diese nicht erhalten haben.");
101 113
   }
102
-  $token = random_string(10);
103
-  db_query("UPDATE kundendaten.kunden SET token='{$token}', token_create=now() WHERE id={$customerno} LIMIT 1;");
114
+  
115
+  $token = random_string(16);
116
+  db_query("INSERT INTO system.usertoken VALUES ({$uid}, NOW(), NOW() + INTERVAL 1 DAY, '{$token}')");
104 117
   return true;
105 118
 }
106 119
 
107 120
 
121
+function emailaddress_for_user($username)
122
+{
123
+  $username = mysql_real_escape_string($username);
124
+  $result = db_query("SELECT k.email FROM kundendaten.kunden AS k INNER JOIN system.useraccounts AS u ON (u.kunde=k.id) WHERE u.username='{$username}'");
125
+  $data = mysql_fetch_assoc($result);
126
+  return $data['email'];
127
+}
128
+
129
+
108 130
 function get_customer_token($customerno)
109 131
 {
110 132
   $customerno = (int) $customerno;
... ...
@@ -116,4 +138,12 @@ function get_customer_token($customerno)
116 138
 }
117 139
 
118 140
 
141
+function get_user_token($username) 
142
+{
143
+  $username = mysql_real_escape_string($username);
144
+  $result = db_query("SELECT token FROM system.usertoken AS t INNER JOIN system.useraccounts AS u USING (uid) WHERE username='{$username}'");
145
+  $tmp = mysql_fetch_assoc($result);
146
+  return $tmp['token'];
147
+}
148
+
119 149
 ?>
... ...
@@ -19,31 +19,32 @@ title("Neues Passwort beantragen");
19 19
 //require_once('inc/error.php');
20 20
 //system_failure("Diese Funktion ist noch nicht fertiggestellt.");
21 21
 
22
-if (isset($_POST['customerno']))
22
+if (isset($_POST['customerno']) && isset($_POST['username']))
23 23
 {
24 24
   require_once('newpass.php');
25
-  if (customer_has_email($_POST['customerno'], $_POST['email']))
25
+  if (user_customer_match($_POST['customerno'], $_POST['username']))
26 26
   {
27
-    if (create_token($_POST['customerno']))
27
+    if (create_token($_POST['username']))
28 28
     {
29 29
       require_once('mail.php');
30 30
       require_once('inc/base.php');
31
-      send_customer_token($_POST['customerno']);
32
-      logger(LOG_INFO, "modules/index/new_password", "pwrecovery", "token sent for customer »{$_POST['customerno']}«");
31
+      send_user_token($_POST['username']);
32
+      logger(LOG_INFO, "modules/index/lost_password", "pwrecovery", "token sent for customer »{$_POST['customerno']}/{$_POST['username']}«");
33 33
       success_msg('Die angegebenen Daten waren korrekt, Sie sollten umgehend eine E-Mail erhalten.');
34 34
     }
35 35
   }
36 36
   else
37 37
   {
38
-    input_error("Die eingegebenen Daten waren nicht korrekt. Sollten Sie nicht mehr wissen, welche E-Mail-Adresse Sie angegeben haben, wenden Sie sich bitte an einen Administrator.");
38
+    input_error("Die eingegebenen Daten waren nicht korrekt. Sollten Sie die Daten nicht mehr kennen, wenden Sie sich bitte an einen Administrator.");
39 39
   }
40 40
 }
41 41
 
42
-output('<p>Sofern Sie bei Ihrer Anmeldung noch kein Passwort für Ihren Kundenaccount festgelegt hatten, können Sie hier ein neues Passwort festlegen. Sie müssen dafür Ihre Kundennummer und die bei der Anmeldung angegebene E-Mail-Adresse eingeben.</p>
43
-<p>Nach dem Ausfüllen dieses Formulars erhalten Sie eine E-Mail mit einem Link, den Sie in Ihrem Browser öffnen müssen. Dort können Sie dann ein neues Passwort eingeben.</p>
42
+output('<p>Wenn Sie Ihr Kundenpasswort nicht mehr kennen, können Sie hier ein neues Passwort beantragen. Sie müssen dafür Ihre Kundennummer und Ihren Benutzernamen kennen. Kennen Sie diese Daten nicht, wenden Sie sich bitte <a href="mailto:'.config('adminmail').'">an die Administratoren</a>.</p>
43
+<p>Nach dem Ausfüllen dieses Formulars erhalten Sie eine E-Mail mn die bei uns hinterlegte E-Mail-Adresse. Diese Mail enthält einem Link, den Sie in Ihrem Browser öffnen müssen. Dort können Sie dann ein neues Passwort eingeben.</p>
44
+<p><span style="font-weight: bold;">Hinweis:</span> Sie können auf diesem Weg nur das Passwort des Hauptbenutzers neu anfordern. Sind Sie Mitbenutzer eines anderen Kunden, dann kann dieser Ihr Passwort neu setzen.</p>
44 45
 <form action="" method="post">
45 46
 <p><span class="login_label">Kundennummer:</span> <input type="text" name="customerno" size="30" /></p>
46
-<p><span class="login_label">E-Mail-Adresse:</span> <input type="text" name="email" size="30" /></p>
47
+<p><span class="login_label">Benutzername:</span> <input type="text" name="username" size="30" /></p>
47 48
 <p><span class="login_label">&#160;</span> <input type="submit" value="Passwort anfordern" /></p>
48 49
 </form>');
49 50
 
... ...
@@ -55,12 +55,12 @@ if ($messages) {
55 55
 <h3>schokokeks.org Hosting Webinterface</h3>
56 56
 <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>
57 57
 <form action="" method="post">
58
-<p><label for="username" class="login_label">Benutzername oder E-Mail-Adresse<sup>*</sup>:</label> <input type="text" id="username" name="webinterface_username" size="30" /></p>
58
+<p><label for="username" class="login_label">Benutzername oder E-Mail-Adresse:</label> <input type="text" id="username" name="webinterface_username" size="30" /></p>
59 59
 <p><label for="password" class="login_label">Passwort:</label> <input type="password" id="password" name="webinterface_password" size="30" /></p>
60 60
 <p><span class="login_label">&#160;</span> <input type="submit" value="Anmelden" /></p>
61 61
 </form>
62
-<p><sup>*</sup> Sie können sich hier mit Ihrem System-Benutzernamen, Ihrer E-Mail-Adresse oder Ihrer Kundennummer (jeweils mit zugehörigem Passwort) anmelden. Je nach gewählten Daten erhalten Sie unterschiedliche Zugriffsrechte.</p>
63
-<p>Sollten Sie Ihr Passwort nicht mehr kennen, wenden Sie sich bitte unter Angabe Ihres Benutzernamens und/oder Ihrer Kundennummer an den Support. Passwörter für E-Mail-Konten kann der Eigentümer des Benutzeraccounts neu setzen.</p>
62
+<p>Sie können sich hier mit Ihrem System-Benutzernamen, Ihrer E-Mail-Adresse oder Ihrer Kundennummer (jeweils mit zugehörigem Passwort) anmelden. Je nach gewählten Daten erhalten Sie unterschiedliche Zugriffsrechte.</p>
63
+<p><a href="lost_password">Sollten Sie Ihr Kunden-Passwort nicht mehr kennen, klicken Sie bitte hier.</a> Passwörter für E-Mail-Konten kann der Eigentümer des Benutzeraccounts neu setzen.</p>
64 64
 
65 65
 <p><em><a href="../../certlogin/?destination=go/<?php echo $go; ?>"  >Mit einem Client-Zertifikat anmelden</a></em> (<a href="../../go/index/certinfo"  >Wie geht das?</a>)</p>
66 66
 
67 67