3 include_once('extern/rfc822.php');
5 function account_exists($login)
10 $query = sprintf("SELECT id FROM users WHERE lower(nickname) = lower('%s')",
11 pg_escape_string($login));
13 if (isset($_SESSION['uid']))
14 $query .= sprintf(' AND id <> %d', $_SESSION['uid']);
16 $sth = db_query($query);
18 # Return true in case of database error
22 return pg_num_rows ($sth) > 0;
25 function is_valid_passwd ($nickname, $passwd)
27 if (strtolower($passwd) == strtolower($nickname))
28 return 'Das Passwort darf nicht dem Usernamen entsprechen.';
30 if (strlen($passwd) < 4)
31 return 'Das Passwort ist zu kurz.';
33 if (strlen($passwd) > 15)
34 return 'Das Passwort ist zu lang.';
36 if (!preg_match ('/^[a-zA-Z0-9%!@#^&\*\$\\\+\.\_\-]{4,15}$/', $passwd, $matches))
37 return 'Das Passwort enthält ungültige Zeichen.';
42 function is_valid_username($nickname)
44 $blacklist = array('hitler','stalin');
46 if (!preg_match ('/^[a-zA-Z0-9\.\_\-]{4,15}$/', $nickname, $matches))
50 foreach ($blacklist as $badnick) {
51 if (soundex($nickname) == soundex($badnick))
58 function is_valid_realname($name)
60 if (preg_match ('/[\\\\<>"\(\)\[\]]/', $name, $matches))
66 function check_account_data()
71 $zlist['replace'] = array('nickname' => $_POST['nickname'],
72 'realname' => $_POST['realname'],
73 'email' => $_POST['email'],
74 'url' => $_POST['url']);
76 if (!strlen($_POST['nickname']) ||
77 !strlen($_POST['email']))
78 return 'Sie müssen alle Pflichtfelder ausfüllen! Siehe Beschreibung unten.';
80 if (account_exists($_POST['nickname']))
81 return 'Dieser Username ist in der Zeitungsliste bereits vergeben.';
83 if (!is_valid_email_address($_POST['email']))
84 return 'Die angegebene Mail-Adresse ist ungültig.';
86 if (!empty($_POST['url'])) {
87 $_POST['url'] = fix_url($_POST['url']);
88 if (!is_valid_url($_POST['url']))
89 return 'Die angegebene Homepage ist ungültig!';
92 if (!empty($_POST['realname']) && !is_valid_realname($_POST['realname']))
93 return 'Der angegebene Name enthält unerlaubte Zeichen.';
95 return is_valid_username($_POST['nickname']);
98 function check_passwd()
102 if (!strlen($_POST['passwd']) || !strlen($_POST['pwcopy']))
103 return 'Sie müssen alle Pflichtfelder ausfüllen! Siehe Beschreibung unten.';
105 if (strlen($_POST['passwd']) < 5)
106 return 'Ihr Passwort ist zu kurz, bitte verwenden Sie mindestens 5 Zeichen.';
108 if ($_POST['passwd'] != $_POST['pwcopy'])
109 return 'Sie haben sich beim Passwort vertippt.';
114 function passwd ($nickname, $passwd)
116 return md5(md5($passwd). $nickname);
119 function pwgen ($num)
121 $chars = "abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz";
122 $count = strlen($chars);
124 srand((double)microtime()*1000000);
126 for ($i = 0;$i < $num; $i++) {
127 $pos = rand() % $count;
128 $pass .= substr ($chars, $pos, 1);
134 function account_activate($code)
139 return 'Kein Aktivierungscode angegeben.';
141 $query = sprintf("SELECT uid FROM activation WHERE code = '%s'", pg_escape_string($code));
143 $sth = db_query($query);
146 return 'Es ist ein Datenbankfehler aufgetreten.';
148 if (pg_num_rows($sth) != 1)
149 return 'Der angegebene Aktivierungscode ist ungültig!';
151 db_query('BEGIN TRANSACTION');
153 $row = pg_fetch_array($sth, 0);
155 $query = sprintf('UPDATE users SET status = 1 WHERE id = %d', $row['uid']);
157 $sth = db_query($query);
159 if ($sth === false) {
160 db_query('ROLLBACK');
161 return 'Es ist ein Datenbankfehler aufgetreten.';
164 $query = sprintf("DELETE FROM activation WHERE code = '%s'", pg_escape_string($code));
166 $sth = db_query($query);
168 if ($sth === false) {
169 db_query('ROLLBACK');
170 return 'Es ist ein Datenbankfehler aufgetreten.';
178 function send_activation($email, $user, $code)
183 $url = sprintf('%sactivate.html?code=%s', $cfg['home'], urlencode($code));
184 $subject = 'Aktivierung Account Zeitungsliste';
185 $header = array('Bcc: ' . $cfg['mailto']);
187 $body = sprintf('Willkommen %s!
189 Sie haben einen neuen Account in der Zeitungsliste beantragt.
191 Um diesen zu aktivieren, geben Sie bitte folgende Adresse in
198 sendmail($email, '', $subject, $body, $header);
203 function process_activate()
207 if (($try = account_activate($_GET['code'])) !== true) {
208 $ret = warning($try);
210 $ret = information('Ihr Account ist aktiviert.');
211 $ret .= '<h3>Willkommen!</h3><p class="info">'.
212 'Sie werden automatisch zur <a href="login.html">Login-Seite</a> weitergeleitet. '.
213 'Bitte melden Sie sich dort an.</p>';
214 $zlist['redirect'] = 'login.html';
219 function process_account_new()
224 if (($try = check_account_data()) !== true)
227 if (($try = check_passwd()) !== true)
230 db_query('BEGIN TRANSACTION');
232 $query = sprintf('INSERT INTO users (nickname,email,status,passwd,register_date%s%s)' .
233 "VALUES ('%s','%s',0,'%s',now()%s%s)",
234 strlen($_POST['realname'])?',realname':'',
235 strlen($_POST['url'])?',url':'',
238 passwd($_POST['nickname'], $_POST['passwd']),
239 strlen($_POST['realname'])?",'".pg_escape_string($_POST['realname'])."'":'',
240 strlen($_POST['url'])?",'".pg_escape_string($_POST['url'])."'":'');
242 $sth = db_query($query);
244 if ($sth === false) {
245 db_query('ROLLBACK');
246 return 'Es ist ein Datenbankfehler aufgetreten.';
249 $uid = db_last_id('users', 'id');
251 $code = md5(pwgen(8));
253 $query = sprintf('INSERT INTO activation (code,uid,register_date) '.
254 "VALUES ('%s',%d,now())", $code, $uid);
256 $sth = db_query($query);
258 if ($sth === false) {
259 db_query('ROLLBACK');
260 return 'Es ist ein Datenbankfehler aufgetreten.';
263 if (send_activation($_POST['email'],
264 strlen($_POST['realname'])?$_POST['realname']:$_POST['nickname'],
266 db_query('ROLLBACK');
267 return 'Fehler beim Versenden der Aktivierungsmail.';
275 function update_account()
281 $query = sprintf("UPDATE users SET nickname='%s',realname='%s',email='%s',url='%s' ".
284 pg_escape_string($_POST['realname']),
286 pg_escape_string($_POST['url']),
291 if ($_SESSION['nickname'] != $_POST['nickname'])
292 $zlist['newpass'] = true;
294 $_SESSION['nickname'] = $_POST['nickname'];
295 $_SESSION['email'] = $_POST['email'];
296 $_SESSION['homepage'] = $_POST['url'];
297 $_SESSION['realname'] = $_POST['realname'];
300 function update_passwd()
305 $hash = passwd($_SESSION['nickname'], $_POST['passwd']);
307 $query = sprintf("UPDATE users SET passwd='%s' WHERE id = %d",
308 $hash, $_SESSION['uid']);
313 function checkpass($nickname, $passwd)
317 if (empty($nickname) || empty($passwd))
320 $query = sprintf("SELECT passwd,nickname FROM users ".
321 "WHERE lower(nickname) = lower('%s') AND status = 1",
322 pg_escape_string($nickname));
324 $sth = db_query($query);
329 if (pg_num_rows($sth) == 0)
332 $row = pg_fetch_array($sth, 0);
334 $hash = passwd($row['nickname'], $passwd);
336 if (strcmp($row[0], $hash) != 0)
342 function login_user($nickname, $passwd)
349 $query = sprintf("SELECT id,nickname,realname,email,url,passwd FROM users " .
350 "WHERE lower(nickname) = lower('%s') AND status = 1",
351 pg_escape_string($nickname));
353 $sth = db_query($query);
358 if (pg_num_rows($sth) == 0)
361 $row = pg_fetch_array($sth, 0);
363 $hash = passwd($row['nickname'], $passwd);
365 if (strcmp($row['passwd'], $hash) != 0)
368 session_name($cfg['session']);
371 $_SESSION['REMOTE_ADDR'] = $_SERVER["REMOTE_ADDR"];
372 $_SESSION['uid'] = $row['id'];
373 $_SESSION['nickname'] = $row['nickname'];
374 $_SESSION['javascript'] = $_POST['js']=='1'?true:false;
375 $_SESSION['email'] = $row['email'];
376 $_SESSION['homepage'] = $row['url'];
377 $_SESSION['realname'] = $row['realname'];
379 $query = sprintf('UPDATE users SET last_login = now() WHERE id = %d', $_SESSION['uid']);
382 $query = sprintf('INSERT INTO online (uid,activity) VALUES (%d,now())', $_SESSION['uid']);
386 $_SESSION["lastupdate"] = time();
391 function login_sendnew($nickname)
395 if (!strlen($nickname))
396 return 'Kein Username angegeben!';
398 $query = 'SELECT id,email,nickname,realname FROM users WHERE status = 1 AND ';
399 if (strstr($nickname, '@') === false)
400 $query .= sprintf("lower(nickname) = lower('%s')", pg_escape_string($nickname));
402 $query .= sprintf("lower(email) = lower('%s')", pg_escape_string($nickname));
404 $sth = db_query($query);
407 return 'Es ist ein Datenbankfehler aufgetreten.';
409 if (pg_num_rows($sth) == 0)
410 return 'Der angegebene Username ist im System nicht bekannt.';
412 $row = pg_fetch_array($sth, 0);
416 $query = sprintf("UPDATE users SET passwd = '%s' WHERE id = %d",
417 passwd($row['nickname'], $passwd), $row['id']);
419 $sth = db_query($query);
422 return 'Es ist ein Datenbankfehler aufgetreten.';
425 $header[] = 'From: ' . $cfg['from'];
426 $header[] = sprintf('To: %s <%s>',
427 strlen($row['realname'])?$row['realname']:$row['nickname'],
429 $header[] = 'MIME-Version: 1.0';
430 $header[] = 'Content-type: text/plain; charset=utf-8';
432 $subject = 'Zeitungsliste: Ihr Neues Passwort';
434 $body = sprintf('Moin %s!
436 Sie oder jemand anderes hat ein neues Passwort für Ihren Account auf
439 Das alte Passwort verliert damit seine Gültigkeit. Das System hat
440 ein neues Passwort für Sie berechnet und eingetragen.
442 Das neue Passwort lautet %s
444 Bitte ändern Sie es beim nächsten Einloggen.
446 strlen($row['realname'])?$row['realname']:$row['nickname'],
447 $cfg['home'], $passwd);
449 $sig = load_template('signature', array());
453 if (mail ($row['email'], $subject, $body, implode("\n", $header)) === false)
454 return 'Es ist ein Fehler beim Versand der Mail aufgetreten.';
459 function process_login_request()
463 if (isset($_POST['new'])) {
464 $try = process_account_new();
466 return information('Ihr neuer Account wurde angelegt. Die Aktivierungsmail ist unterwegs.');
468 $body = warning($try);
469 $replace = array('nickname' => $_POST['nickname'],
470 'realname' => $_POST['realname'],
471 'email' => $_POST['email'],
472 'url' => $_POST['url']);
473 $body .= load_template('login_new.html', $replace);
476 } elseif (isset($_POST['sendnew'])) {
477 $try = login_sendnew($_POST['nickname']);
479 $ret = information('Ein neues Passwort wird Ihnen per Mail zugeschickt');
480 $ret .= '<p>Bitte melden Sie sich mit diesem an und ändern Sie das Passwort '.
481 'über den Menüpunkt "Einstellungen".</p>';
484 $body = warning($try);
485 $body .= load_template('login.html');
489 if (empty($_POST['nickname'])) {
490 $body = warning('Sie haben keinen Usernamen angegeben!');
491 } elseif (empty($_POST['passwd'])) {
492 $body = warning('Sie haben kein Passwort angegeben!');
494 $try = login_user($_POST['nickname'], $_POST['passwd']);
498 $body = warning('Das angegebene Passwort ist ungültig!');
501 $replace = array('nickname' => $_POST['nickname']);
502 $body .= load_template('login.html', $replace);
507 function last_activity()
512 $query = sprintf("SELECT DISTINCT topics.id,topics.topic FROM article " .
513 "JOIN topics ON article.topic=topics.id " .
514 "WHERE uid = %d AND article.created > now() - interval'7 days'",
517 $sth = db_query($query);
519 if ($sth === false || pg_num_rows($sth) == 0)
522 $ret = '<h3>Sie haben an folgenden Diskussionen teilgenommen</h3>';
523 $ret .= '<p><ul class="gold">';
525 for ($i=0; $i < pg_num_rows($sth); $i++) {
526 $row = pg_fetch_array($sth, $i);
528 $ret .= sprintf('<li><a href="%stopic/%d.html">%s</a></li>',
530 $row['id'], $row['topic']);
537 function process_login()
543 if (isset($_GET['from'])) {
544 if ($_GET['from'] == 'article')
545 $ret .= warning('Um an einer Diskussion teilzunehmen, müssen Sie angemeldet sein.');
546 elseif ($_GET['from'] == 'zeitung')
547 $ret .= warning('Um eine neue Diskussion zu beginnen, müssen Sie angemeldet sein.');
548 elseif ($_GET['from'] == 'new')
549 $ret .= warning('Um eine Zeitung hinzuzufügen, müssen Sie angemeldet sein.');
550 elseif ($_GET['from'] == 'tags')
551 $ret .= warning('Um Tags zu einer Zeitung zu verwalten, müssen Sie angemeldet sein.');
552 elseif ($_GET['from'] == 'edit')
553 $ret .= warning('Um eine Zeitung zu bearbeiten, müssen Sie angemeldet sein.');
554 elseif ($_GET['from'] == 'session')
555 $ret .= warning('Ihre Session ist abgelaufen. Bitte melden Sie sich erneut an.');
556 $ret .= load_template('login.html');
557 } elseif (isset($_GET['new'])) {
558 $ret = load_template('login_new.html');
559 } elseif ($_SERVER['REQUEST_METHOD'] == 'GET') {
560 $ret = load_template('login.html');
562 $try = process_login_request();
564 $ret = information('Hallo '.$_SESSION['nickname'].'! Sie sind jetzt angemeldet.');
565 $try = last_activity();
569 $ret .= load_template('main.html');
577 function process_passwd()
584 if (!isset($_SESSION['uid'])) {
585 $ret = warning('Sie sind nicht angemeldet. Sie werden gleich zur Anmeldung weitergeleitet.');
586 $zlist['redirect'] = 'login.html';
588 if ($_SERVER['REQUEST_METHOD'] == 'GET') {
589 $ret .= load_javascript('passwd.js') . load_template('passwd.html', array('nickname' => $_SESSION['nickname']));
590 } elseif ($_SERVER['REQUEST_METHOD'] == 'POST') {
591 if (($try = check_passwd()) !== true) {
592 $ret = warning($try);
593 $ret .= load_javascript('passwd.js') . load_template('passwd.html', array('nickname' => $_SESSION['nickname']));
596 $ret .= information('Ihr neues Passwort ist eingetragen. Sie werden zur Hauptseite weitergeleitet.');
597 $zlist['redirect'] = '';
607 session_invalidate();
610 function process_options()
620 if (!isset($_SESSION['uid'])) {
621 $ret .= warning('Sie sind nicht angemeldet. Sie werden gleich zur Anmeldung weitergeleitet.');
622 $zlist['redirect'] = 'login.html';
624 if ($_SERVER['REQUEST_METHOD'] == 'POST') {
625 if (($try = check_account_data()) !== true)
626 $ret .= warning($try);
629 $ret .= information('Ihre persönlichen Daten wurden geändert. Sie werden zur Hauptseite weitergeleitet.');
631 $zlist['redirect'] = '';
632 if ($zlist['newpass']) {
633 $try = login_sendnew($_POST['nickname']);
635 $ret .= '<p>Aus technischen Gründen ist es erforderlich Ihnen ein neues Passwort zu geben. '.
636 'Dieses wird Ihnen per Mail an die im System gespeicherte Mail-Adresse geschickt. '.
637 'Diese Session ist von dieser Änderung nicht betroffen, Sie können daher Ihr Passwort '.
638 'direkt über den Menüpunkt "Passwort" ändern und die Mail ignorieren. '.
639 'Ansonsten melden Sie sich bitte beim nächsten Mal mit dem neuen Passwort an und ändern Sie es.</p>';
644 $zlist['replace'] = array('nickname' => $_SESSION['nickname'],
645 'realname' => $_SESSION['realname'],
646 'email' => $_SESSION['email'],
647 'url' => $_SESSION['url']);
649 $ret .= load_javascript('options.js') . load_template('options.html', $zlist['replace']);
655 function ajax_passwd_check()
659 return checkpass($_POST['nickname'], $_POST['passwd']);
662 function ajax_nickname_check()
666 return account_exists($_POST['nickname']);