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_NumRows ($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_NumRows($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';
186 $body = sprintf('Willkommen %s!
188 Sie haben einen neuen Account in der Zeitungsliste beantragt.
190 Um diesen zu aktivieren, geben Sie bitte folgende Adresse in
197 sendmail($email, '', $subject, $body);
202 function process_activate()
206 if (($try = account_activate($_GET['code'])) !== true) {
207 $ret = warning($try);
209 $ret = information('Ihr Account ist aktiviert.');
210 $ret .= '<h3>Willkommen!</h3><p class="info">'.
211 'Sie werden automatisch zur <a href="login.html">Login-Seite</a> weitergeleitet. '.
212 'Bitte melden Sie sich dort an.</p>';
213 $zlist['redirect'] = 'login.html';
218 function process_account_new()
223 if (($try = check_account_data()) !== true)
226 if (($try = check_passwd()) !== true)
229 db_query('BEGIN TRANSACTION');
231 $query = sprintf('INSERT INTO users (nickname,email,status,passwd,register_date%s%s)' .
232 "VALUES ('%s','%s',0,'%s',now()%s%s)",
233 strlen($_POST['realname'])?',realname':'',
234 strlen($_POST['url'])?',url':'',
237 passwd($_POST['nickname'], $_POST['passwd']),
238 strlen($_POST['realname'])?",'".pg_escape_string($_POST['realname'])."'":'',
239 strlen($_POST['url'])?",'".pg_escape_string($_POST['url'])."'":'');
241 $sth = db_query($query);
243 if ($sth === false) {
244 db_query('ROLLBACK');
245 return 'Es ist ein Datenbankfehler aufgetreten.';
248 $uid = db_last_id('users', 'id');
250 $code = md5(pwgen(8));
252 $query = sprintf('INSERT INTO activation (code,uid,register_date) '.
253 "VALUES ('%s',%d,now())", $code, $uid);
255 $sth = db_query($query);
257 if ($sth === false) {
258 db_query('ROLLBACK');
259 return 'Es ist ein Datenbankfehler aufgetreten.';
262 if (send_activation($_POST['email'],
263 strlen($_POST['realname'])?$_POST['realname']:$_POST['nickname'],
265 db_query('ROLLBACK');
266 return 'Fehler beim Versenden der Aktivierungsmail.';
274 function update_account()
280 $query = sprintf("UPDATE users SET nickname='%s',realname='%s',email='%s',url='%s' ".
283 pg_escape_string($_POST['realname']),
285 pg_escape_string($_POST['url']),
290 if ($_SESSION['nickname'] != $_POST['nickname'])
291 $zlist['newpass'] = true;
293 $_SESSION['nickname'] = $_POST['nickname'];
294 $_SESSION['email'] = $_POST['email'];
295 $_SESSION['homepage'] = $_POST['url'];
296 $_SESSION['realname'] = $_POST['realname'];
299 function update_passwd()
304 $hash = passwd($_SESSION['nickname'], $_POST['passwd']);
306 $query = sprintf("UPDATE users SET passwd='%s' WHERE id = %d",
307 $hash, $_SESSION['uid']);
312 function checkpass($nickname, $passwd)
316 if (empty($nickname) || empty($passwd))
319 $query = sprintf("SELECT passwd,nickname FROM users ".
320 "WHERE lower(nickname) = lower('%s') AND status = 1",
321 pg_escape_string($nickname));
323 $sth = db_query($query);
328 if (pg_NumRows($sth) == 0)
331 $row = pg_fetch_array($sth, 0);
333 $hash = passwd($row['nickname'], $passwd);
335 if (strcmp($row[0], $hash) != 0)
341 function login_user($nickname, $passwd)
348 $query = sprintf("SELECT id,nickname,realname,email,url,passwd FROM users " .
349 "WHERE lower(nickname) = lower('%s') AND status = 1",
350 pg_escape_string($nickname));
352 $sth = db_query($query);
357 if (pg_NumRows($sth) == 0)
360 $row = pg_fetch_array($sth, 0);
362 $hash = passwd($row['nickname'], $passwd);
364 if (strcmp($row['passwd'], $hash) != 0)
367 session_name($cfg['session']);
370 $_SESSION['REMOTE_ADDR'] = $_SERVER["REMOTE_ADDR"];
371 $_SESSION['uid'] = $row['id'];
372 $_SESSION['nickname'] = $row['nickname'];
373 $_SESSION['javascript'] = $_POST['js']=='1'?true:false;
374 $_SESSION['email'] = $row['email'];
375 $_SESSION['homepage'] = $row['url'];
376 $_SESSION['realname'] = $row['realname'];
378 $query = sprintf('UPDATE users SET last_login = now() WHERE id = %d', $_SESSION['uid']);
381 $query = sprintf('INSERT INTO online (uid,activity) VALUES (%d,now())', $_SESSION['uid']);
385 $_SESSION["lastupdate"] = time();
390 function login_sendnew($nickname)
394 if (!strlen($nickname))
395 return 'Kein Username angegeben!';
397 $query = 'SELECT id,email,nickname,realname FROM users WHERE status = 1 AND ';
398 if (strstr($nickname, '@') === false)
399 $query .= sprintf("lower(nickname) = lower('%s')", pg_escape_string($nickname));
401 $query .= sprintf("lower(email) = lower('%s')", pg_escape_string($nickname));
403 $sth = db_query($query);
406 return 'Es ist ein Datenbankfehler aufgetreten.';
408 if (pg_NumRows($sth) == 0)
409 return 'Der angegebene Username ist im System nicht bekannt.';
411 $row = pg_fetch_array($sth, 0);
415 $query = sprintf("UPDATE users SET passwd = '%s' WHERE id = %d",
416 passwd($row['nickname'], $passwd), $row['id']);
418 $sth = db_query($query);
421 return 'Es ist ein Datenbankfehler aufgetreten.';
424 $header[] = 'From: ' . $cfg['from'];
425 $header[] = sprintf('To: %s <%s>',
426 strlen($row['realname'])?$row['realname']:$row['nickname'],
428 $header[] = 'MIME-Version: 1.0';
429 $header[] = 'Content-type: text/plain; charset=utf-8';
431 $subject = 'Zeitungsliste: Ihr Neues Passwort';
433 $body = sprintf('Moin %s!
435 Sie oder jemand anderes hat ein neues Passwort für Ihren Account auf
438 Das alte Passwort verliert damit seine Gültigkeit. Das System hat
439 ein neues Passwort für Sie berechnet und eingetragen.
441 Das neue Passwort lautet %s
443 Bitte ändern Sie es beim nächsten Einloggen.
445 strlen($row['realname'])?$row['realname']:$row['nickname'],
446 $cfg['home'], $passwd);
448 $sig = load_template('signature', array());
452 if (mail ($row['email'], $subject, $body, implode("\n", $header)) === false)
453 return 'Es ist ein Fehler beim Versand der Mail aufgetreten.';
458 function process_login_request()
462 if (isset($_POST['new'])) {
463 $try = process_account_new();
465 return information('Ihr neuer Account wurde angelegt. Die Aktivierungsmail ist unterwegs.');
467 $body = warning($try);
468 $replace = array('nickname' => $_POST['nickname'],
469 'realname' => $_POST['realname'],
470 'email' => $_POST['email'],
471 'url' => $_POST['url']);
472 $body .= load_template('login_new.html', $replace);
475 } elseif (isset($_POST['sendnew'])) {
476 $try = login_sendnew($_POST['nickname']);
478 $ret = information('Ein neues Passwort wird Ihnen per Mail zugeschickt');
479 $ret .= '<p>Bitte melden Sie sich mit diesem an und ändern Sie das Passwort '.
480 'über den Menüpunkt "Einstellungen".</p>';
483 $body = warning($try);
484 $body .= load_template('login.html');
488 if (empty($_POST['nickname'])) {
489 $body = warning('Sie haben keinen Usernamen angegeben!');
490 } elseif (empty($_POST['passwd'])) {
491 $body = warning('Sie haben kein Passwort angegeben!');
493 $try = login_user($_POST['nickname'], $_POST['passwd']);
497 $body = warning('Das angegebene Passwort ist ungültig!');
500 $replace = array('nickname' => $_POST['nickname']);
501 $body .= load_template('login.html', $replace);
506 function last_activity()
511 $query = sprintf("SELECT DISTINCT topics.id,topics.topic FROM article " .
512 "JOIN topics ON article.topic=topics.id " .
513 "WHERE uid = %d AND article.created > now() - interval'7 days'",
516 $sth = db_query($query);
518 if ($sth === false || pg_NumRows($sth) == 0)
521 $ret = '<h3>Sie haben an folgenden Diskussionen teilgenommen</h3>';
522 $ret .= '<p><ul class="gold">';
524 for ($i=0; $i < pg_NumRows($sth); $i++) {
525 $row = pg_fetch_array($sth, $i);
527 $ret .= sprintf('<li><a href="%stopic/%d.html">%s</a></li>',
529 $row['id'], $row['topic']);
536 function process_login()
542 if (isset($_GET['from'])) {
543 if ($_GET['from'] == 'article')
544 $ret .= warning('Um an einer Diskussion teilzunehmen, müssen Sie angemeldet sein.');
545 elseif ($_GET['from'] == 'zeitung')
546 $ret .= warning('Um eine neue Diskussion zu beginnen, müssen Sie angemeldet sein.');
547 elseif ($_GET['from'] == 'new')
548 $ret .= warning('Um eine Zeitung hinzuzufügen, müssen Sie angemeldet sein.');
549 elseif ($_GET['from'] == 'tags')
550 $ret .= warning('Um Tags zu einer Zeitung zu verwalten, müssen Sie angemeldet sein.');
551 elseif ($_GET['from'] == 'edit')
552 $ret .= warning('Um eine Zeitung zu bearbeiten, müssen Sie angemeldet sein.');
553 elseif ($_GET['from'] == 'session')
554 $ret .= warning('Ihre Session ist abgelaufen. Bitte melden Sie sich erneut an.');
555 $ret .= load_template('login.html');
556 } elseif (isset($_GET['new'])) {
557 $ret = load_template('login_new.html');
558 } elseif ($_SERVER['REQUEST_METHOD'] == 'GET') {
559 $ret = load_template('login.html');
561 $try = process_login_request();
563 $ret = information('Hallo '.$_SESSION['nickname'].'! Sie sind jetzt angemeldet.');
564 $try = last_activity();
568 $ret .= load_template('main.html');
576 function process_passwd()
583 if (!isset($_SESSION['uid'])) {
584 $ret = warning('Sie sind nicht angemeldet. Sie werden gleich zur Anmeldung weitergeleitet.');
585 $zlist['redirect'] = 'login.html';
587 if ($_SERVER['REQUEST_METHOD'] == 'GET') {
588 $ret .= load_javascript('passwd.js') . load_template('passwd.html', array('nickname' => $_SESSION['nickname']));
589 } elseif ($_SERVER['REQUEST_METHOD'] == 'POST') {
590 if (($try = check_passwd()) !== true) {
591 $ret = warning($try);
592 $ret .= load_javascript('passwd.js') . load_template('passwd.html', array('nickname' => $_SESSION['nickname']));
595 $ret .= information('Ihr neues Passwort ist eingetragen. Sie werden zur Hauptseite weitergeleitet.');
596 $zlist['redirect'] = '';
606 session_invalidate();
609 function process_options()
619 if (!isset($_SESSION['uid'])) {
620 $ret .= warning('Sie sind nicht angemeldet. Sie werden gleich zur Anmeldung weitergeleitet.');
621 $zlist['redirect'] = 'login.html';
623 if ($_SERVER['REQUEST_METHOD'] == 'POST') {
624 if (($try = check_account_data()) !== true)
625 $ret .= warning($try);
628 $ret .= information('Ihre persönlichen Daten wurden geändert. Sie werden zur Hauptseite weitergeleitet.');
630 $zlist['redirect'] = '';
631 if ($zlist['newpass']) {
632 $try = login_sendnew($_POST['nickname']);
634 $ret .= '<p>Aus technischen Gründen ist es erforderlich Ihnen ein neues Passwort zu geben. '.
635 'Dieses wird Ihnen per Mail an die im System gespeicherte Mail-Adresse geschickt. '.
636 'Diese Session ist von dieser Änderung nicht betroffen, Sie können daher Ihr Passwort '.
637 'direkt über den Menüpunkt "Passwort" ändern und die Mail ignorieren. '.
638 'Ansonsten melden Sie sich bitte beim nächsten Mal mit dem neuen Passwort an und ändern Sie es.</p>';
643 $zlist['replace'] = array('nickname' => $_SESSION['nickname'],
644 'realname' => $_SESSION['realname'],
645 'email' => $_SESSION['email'],
646 'url' => $_SESSION['url']);
648 $ret .= load_javascript('options.js') . load_template('options.html', $zlist['replace']);
654 function ajax_passwd_check()
658 return checkpass($_POST['nickname'], $_POST['passwd']);
661 function ajax_nickname_check()
665 return account_exists($_POST['nickname']);