3 include_once('extern/rfc822.php');
5 function account_exists($login)
9 $query = sprintf("SELECT id FROM users WHERE lower(nickname) = lower('%s')",
10 pg_escape_string($login));
12 if (isset($_SESSION['uid']))
13 $query .= sprintf(' AND id <> %d', $_SESSION['uid']);
15 $sth = db_query($query);
17 # Return true in case of database error
21 return pg_num_rows ($sth) > 0;
24 function is_valid_passwd ($nickname, $passwd)
26 if (strtolower($passwd) == strtolower($nickname))
27 return 'Das Passwort darf nicht dem Usernamen entsprechen.';
29 if (strlen($passwd) < 4)
30 return 'Das Passwort ist zu kurz.';
32 if (strlen($passwd) > 15)
33 return 'Das Passwort ist zu lang.';
35 if (!preg_match ('/^[a-zA-Z0-9%!@#^&\*\$\\\+\.\_\-]{4,15}$/', $passwd, $matches))
36 return 'Das Passwort enthält ungültige Zeichen.';
41 function is_valid_username($nickname)
43 $blacklist = array('hitler','stalin');
45 if (!preg_match ('/^[a-zA-Z0-9\.\_\-]{4,15}$/', $nickname, $matches))
49 foreach ($blacklist as $badnick) {
50 if (soundex($nickname) == soundex($badnick))
57 function is_valid_realname($name)
59 if (preg_match ('/[\\\\<>"\(\)\[\]]/', $name, $matches))
65 function check_account_data()
69 $zlist['replace'] = array('nickname' => $_POST['nickname'],
70 'realname' => $_POST['realname'],
71 'email' => $_POST['email'],
72 'url' => $_POST['url']);
74 if (!strlen($_POST['nickname']) ||
75 !strlen($_POST['email']))
76 return 'Sie müssen alle Pflichtfelder ausfüllen! Siehe Beschreibung unten.';
78 if (account_exists($_POST['nickname']))
79 return 'Dieser Username ist in der Zeitungsliste bereits vergeben.';
81 if (!is_valid_email_address($_POST['email']))
82 return 'Die angegebene Mail-Adresse ist ungültig.';
84 if (!empty($_POST['url'])) {
85 $_POST['url'] = fix_url($_POST['url']);
86 if (!is_valid_url($_POST['url']))
87 return 'Die angegebene Homepage ist ungültig!';
90 if (!empty($_POST['realname']) && !is_valid_realname($_POST['realname']))
91 return 'Der angegebene Name enthält unerlaubte Zeichen.';
93 return is_valid_username($_POST['nickname']);
96 function check_passwd()
98 if (!strlen($_POST['passwd']) || !strlen($_POST['pwcopy']))
99 return 'Sie müssen alle Pflichtfelder ausfüllen! Siehe Beschreibung unten.';
101 if (strlen($_POST['passwd']) < 5)
102 return 'Ihr Passwort ist zu kurz, bitte verwenden Sie mindestens 5 Zeichen.';
104 if ($_POST['passwd'] != $_POST['pwcopy'])
105 return 'Sie haben sich beim Passwort vertippt.';
110 function passwd ($nickname, $passwd)
112 return md5(md5($passwd). $nickname);
115 function pwgen ($num)
117 $chars = "abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz";
118 $count = strlen($chars);
120 srand((double)microtime()*1000000);
122 for ($i = 0;$i < $num; $i++) {
123 $pos = rand() % $count;
124 $pass .= substr ($chars, $pos, 1);
130 function account_activate($code)
135 return 'Kein Aktivierungscode angegeben.';
137 $query = sprintf("SELECT uid FROM activation WHERE code = '%s'", pg_escape_string($code));
139 $sth = db_query($query);
142 return 'Es ist ein Datenbankfehler aufgetreten.';
144 if (pg_num_rows($sth) != 1)
145 return 'Der angegebene Aktivierungscode ist ungültig!';
147 db_query('BEGIN TRANSACTION');
149 $row = pg_fetch_array($sth, 0);
151 $query = sprintf('UPDATE users SET status = 1 WHERE id = %d', $row['uid']);
153 $sth = db_query($query);
155 if ($sth === false) {
156 db_query('ROLLBACK');
157 return 'Es ist ein Datenbankfehler aufgetreten.';
160 $query = sprintf("DELETE FROM activation WHERE code = '%s'", pg_escape_string($code));
162 $sth = db_query($query);
164 if ($sth === false) {
165 db_query('ROLLBACK');
166 return 'Es ist ein Datenbankfehler aufgetreten.';
174 function send_activation($email, $user, $code)
178 $url = sprintf('%sactivate.html?code=%s', $cfg['home'], urlencode($code));
179 $subject = 'Aktivierung Account Zeitungsliste';
180 $header = array('Bcc: ' . $cfg['mailto']);
182 $body = sprintf('Willkommen %s!
184 Sie haben einen neuen Account in der Zeitungsliste beantragt.
186 Um diesen zu aktivieren, geben Sie bitte folgende Adresse in
193 sendmail($email, '', $subject, $body, $header);
198 function process_activate()
200 if (($try = account_activate($_GET['code'])) !== true) {
201 $ret = warning($try);
203 $ret = information('Ihr Account ist aktiviert.');
204 $ret .= '<h3>Willkommen!</h3><p class="info">'.
205 'Sie werden automatisch zur <a href="login.html"><span style="color: red;">Login-Seite</span></a> weitergeleitet. '.
206 'Bitte melden Sie sich dort an.</p>';
207 $zlist['redirect'] = 'login.html';
212 function process_account_new()
216 if (($try = check_account_data()) !== true)
219 if (($try = check_passwd()) !== true)
222 db_query('BEGIN TRANSACTION');
224 $query = sprintf('INSERT INTO users (nickname,email,status,passwd,register_date%s%s)' .
225 "VALUES ('%s','%s',0,'%s',now()%s%s)",
226 strlen($_POST['realname'])?',realname':'',
227 strlen($_POST['url'])?',url':'',
230 passwd($_POST['nickname'], $_POST['passwd']),
231 strlen($_POST['realname'])?",'".pg_escape_string($_POST['realname'])."'":'',
232 strlen($_POST['url'])?",'".pg_escape_string($_POST['url'])."'":'');
234 $sth = db_query($query);
236 if ($sth === false) {
237 db_query('ROLLBACK');
238 return 'Es ist ein Datenbankfehler aufgetreten.';
241 $uid = db_last_id('users', 'id');
243 $code = md5(pwgen(8));
245 $query = sprintf('INSERT INTO activation (code,uid,register_date) '.
246 "VALUES ('%s',%d,now())", $code, $uid);
248 $sth = db_query($query);
250 if ($sth === false) {
251 db_query('ROLLBACK');
252 return 'Es ist ein Datenbankfehler aufgetreten.';
255 if (send_activation($_POST['email'],
256 strlen($_POST['realname'])?$_POST['realname']:$_POST['nickname'],
258 db_query('ROLLBACK');
259 return 'Fehler beim Versenden der Aktivierungsmail.';
267 function update_account()
271 $query = sprintf("UPDATE users SET nickname='%s',realname='%s',email='%s',url='%s' ".
274 pg_escape_string($_POST['realname']),
276 pg_escape_string($_POST['url']),
281 if ($_SESSION['nickname'] != $_POST['nickname'])
282 $zlist['newpass'] = true;
284 $_SESSION['nickname'] = $_POST['nickname'];
285 $_SESSION['email'] = $_POST['email'];
286 $_SESSION['homepage'] = $_POST['url'];
287 $_SESSION['realname'] = $_POST['realname'];
290 function update_passwd()
292 $hash = passwd($_SESSION['nickname'], $_POST['passwd']);
294 $query = sprintf("UPDATE users SET passwd='%s' WHERE id = %d",
295 $hash, $_SESSION['uid']);
300 function checkpass($nickname, $passwd)
304 if (empty($nickname) || empty($passwd))
307 $query = sprintf("SELECT passwd,nickname FROM users ".
308 "WHERE lower(nickname) = lower('%s') AND status = 1",
309 pg_escape_string($nickname));
311 $sth = db_query($query);
316 if (pg_num_rows($sth) == 0)
319 $row = pg_fetch_array($sth, 0);
321 $hash = passwd($row['nickname'], $passwd);
323 if (strcmp($row[0], $hash) != 0)
329 function login_user($nickname, $passwd)
333 $query = sprintf("SELECT id,nickname,realname,email,url,passwd FROM users " .
334 "WHERE lower(nickname) = lower('%s') AND status = 1",
335 pg_escape_string($nickname));
337 $sth = db_query($query);
342 if (pg_num_rows($sth) == 0)
345 $row = pg_fetch_array($sth, 0);
347 $hash = passwd($row['nickname'], $passwd);
349 if (strcmp($row['passwd'], $hash) != 0)
352 session_name($cfg['session']);
355 $_SESSION['REMOTE_ADDR'] = $_SERVER["REMOTE_ADDR"];
356 $_SESSION['uid'] = $row['id'];
357 $_SESSION['nickname'] = $row['nickname'];
358 $_SESSION['javascript'] = $_POST['js']=='1'?true:false;
359 $_SESSION['email'] = $row['email'];
360 $_SESSION['homepage'] = $row['url'];
361 $_SESSION['realname'] = $row['realname'];
363 $query = sprintf('UPDATE users SET last_login = now() WHERE id = %d', $_SESSION['uid']);
366 $query = sprintf('INSERT INTO online (uid,activity) VALUES (%d,now())', $_SESSION['uid']);
370 $_SESSION["lastupdate"] = time();
375 function login_sendnew($nickname)
379 if (!strlen($nickname))
380 return 'Kein Username angegeben!';
382 $query = 'SELECT id,email,nickname,realname FROM users WHERE status = 1 AND ';
383 if (strstr($nickname, '@') === false)
384 $query .= sprintf("lower(nickname) = lower('%s')", pg_escape_string($nickname));
386 $query .= sprintf("lower(email) = lower('%s')", pg_escape_string($nickname));
388 $sth = db_query($query);
391 return 'Es ist ein Datenbankfehler aufgetreten.';
393 if (pg_num_rows($sth) == 0)
394 return 'Der angegebene Username ist im System nicht bekannt.';
396 $row = pg_fetch_array($sth, 0);
400 $query = sprintf("UPDATE users SET passwd = '%s' WHERE id = %d",
401 passwd($row['nickname'], $passwd), $row['id']);
403 $sth = db_query($query);
406 return 'Es ist ein Datenbankfehler aufgetreten.';
409 $header[] = 'From: ' . $cfg['from'];
410 $header[] = sprintf('To: %s <%s>',
411 strlen($row['realname'])?$row['realname']:$row['nickname'],
413 $header[] = 'MIME-Version: 1.0';
414 $header[] = 'Content-type: text/plain; charset=utf-8';
416 $subject = 'Zeitungsliste: Ihr Neues Passwort';
418 $body = sprintf('Moin %s!
420 Sie oder jemand anderes hat ein neues Passwort für Ihren Account auf
423 Das alte Passwort verliert damit seine Gültigkeit. Das System hat
424 ein neues Passwort für Sie berechnet und eingetragen.
426 Das neue Passwort lautet %s
428 Bitte ändern Sie es beim nächsten Einloggen.
430 strlen($row['realname'])?$row['realname']:$row['nickname'],
431 $cfg['home'], $passwd);
433 $sig = load_template('signature', array());
437 if (mail ($row['email'], $subject, $body, implode("\n", $header)) === false)
438 return 'Es ist ein Fehler beim Versand der Mail aufgetreten.';
443 function process_login_request()
445 if (isset($_POST['new'])) {
446 $try = process_account_new();
448 return information('Ihr neuer Account wurde angelegt. Die Aktivierungsmail ist unterwegs.');
450 $body = warning($try);
451 $replace = array('nickname' => $_POST['nickname'],
452 'realname' => $_POST['realname'],
453 'email' => $_POST['email'],
454 'url' => $_POST['url']);
455 $body .= load_template('login_new.html', $replace);
458 } elseif (isset($_POST['sendnew'])) {
459 $try = login_sendnew($_POST['nickname']);
461 $ret = information('Ein neues Passwort wird Ihnen per Mail zugeschickt');
462 $ret .= '<p>Bitte melden Sie sich mit diesem an und ändern Sie das Passwort '.
463 'über den Menüpunkt "Einstellungen".</p>';
466 $body = warning($try);
467 $body .= load_template('login.html');
471 if (empty($_POST['nickname'])) {
472 $body = warning('Sie haben keinen Usernamen angegeben!');
473 } elseif (empty($_POST['passwd'])) {
474 $body = warning('Sie haben kein Passwort angegeben!');
476 $try = login_user($_POST['nickname'], $_POST['passwd']);
480 $body = warning('Das angegebene Passwort ist ungültig!');
483 $replace = array('nickname' => $_POST['nickname']);
484 $body .= load_template('login.html', $replace);
489 function last_activity()
493 $query = sprintf("SELECT DISTINCT topics.id,topics.topic FROM article " .
494 "JOIN topics ON article.topic=topics.id " .
495 "WHERE uid = %d AND article.created > now() - interval'7 days'",
498 $sth = db_query($query);
500 if ($sth === false || pg_num_rows($sth) == 0)
503 $ret = '<h3>Sie haben an folgenden Diskussionen teilgenommen</h3>';
504 $ret .= '<p><ul class="gold">';
506 for ($i=0; $i < pg_num_rows($sth); $i++) {
507 $row = pg_fetch_array($sth, $i);
509 $ret .= sprintf('<li><a href="%stopic/%d.html">%s</a></li>',
511 $row['id'], $row['topic']);
518 function process_login()
520 if (isset($_GET['from'])) {
521 if ($_GET['from'] == 'article')
522 $ret .= warning('Um an einer Diskussion teilzunehmen, müssen Sie angemeldet sein.');
523 elseif ($_GET['from'] == 'zeitung')
524 $ret .= warning('Um eine neue Diskussion zu beginnen, müssen Sie angemeldet sein.');
525 elseif ($_GET['from'] == 'new')
526 $ret .= warning('Um eine Zeitung hinzuzufügen, müssen Sie angemeldet sein.');
527 elseif ($_GET['from'] == 'tags')
528 $ret .= warning('Um Tags zu einer Zeitung zu verwalten, müssen Sie angemeldet sein.');
529 elseif ($_GET['from'] == 'edit')
530 $ret .= warning('Um eine Zeitung zu bearbeiten, müssen Sie angemeldet sein.');
531 elseif ($_GET['from'] == 'session')
532 $ret .= warning('Ihre Session ist abgelaufen. Bitte melden Sie sich erneut an.');
533 $ret .= load_template('login.html');
534 } elseif (isset($_GET['new'])) {
535 $ret = load_template('login_new.html');
536 } elseif ($_SERVER['REQUEST_METHOD'] == 'GET') {
537 $ret = load_template('login.html');
539 $try = process_login_request();
541 $ret = information('Hallo '.$_SESSION['nickname'].'! Sie sind jetzt angemeldet.');
542 $try = last_activity();
546 $ret .= load_template('main.html');
554 function process_passwd()
559 if (!isset($_SESSION['uid'])) {
560 $ret = warning('Sie sind nicht angemeldet. Sie werden gleich zur Anmeldung weitergeleitet.');
561 $zlist['redirect'] = 'login.html';
563 if ($_SERVER['REQUEST_METHOD'] == 'GET') {
564 $ret .= load_javascript('passwd.js') . load_template('passwd.html', array('nickname' => $_SESSION['nickname']));
565 } elseif ($_SERVER['REQUEST_METHOD'] == 'POST') {
566 if (($try = check_passwd()) !== true) {
567 $ret = warning($try);
568 $ret .= load_javascript('passwd.js') . load_template('passwd.html', array('nickname' => $_SESSION['nickname']));
571 $ret .= information('Ihr neues Passwort ist eingetragen. Sie werden zur Hauptseite weitergeleitet.');
572 $zlist['redirect'] = '';
582 session_invalidate();
585 function process_options()
592 if (!isset($_SESSION['uid'])) {
593 $ret .= warning('Sie sind nicht angemeldet. Sie werden gleich zur Anmeldung weitergeleitet.');
594 $zlist['redirect'] = 'login.html';
596 if ($_SERVER['REQUEST_METHOD'] == 'POST') {
597 if (($try = check_account_data()) !== true)
598 $ret .= warning($try);
601 $ret .= information('Ihre persönlichen Daten wurden geändert. Sie werden zur Hauptseite weitergeleitet.');
603 $zlist['redirect'] = '';
604 if ($zlist['newpass']) {
605 $try = login_sendnew($_POST['nickname']);
607 $ret .= '<p>Aus technischen Gründen ist es erforderlich Ihnen ein neues Passwort zu geben. '.
608 'Dieses wird Ihnen per Mail an die im System gespeicherte Mail-Adresse geschickt. '.
609 'Diese Session ist von dieser Änderung nicht betroffen, Sie können daher Ihr Passwort '.
610 'direkt über den Menüpunkt "Passwort" ändern und die Mail ignorieren. '.
611 'Ansonsten melden Sie sich bitte beim nächsten Mal mit dem neuen Passwort an und ändern Sie es.</p>';
616 $zlist['replace'] = array('nickname' => $_SESSION['nickname'],
617 'realname' => $_SESSION['realname'],
618 'email' => $_SESSION['email'],
619 'url' => $_SESSION['url']);
621 $ret .= load_javascript('options.js') . load_template('options.html', $zlist['replace']);
627 function ajax_passwd_check()
629 return checkpass($_POST['nickname'], $_POST['passwd']);
632 function ajax_nickname_check()
634 return account_exists($_POST['nickname']);