%d', $_SESSION['uid']); $sth = db_query($query); # Return true in case of database error if ($sth === false) return true; return pg_NumRows ($sth) > 0; } function is_valid_passwd ($nickname, $passwd) { if (strtolower($passwd) == strtolower($nickname)) return 'Das Passwort darf nicht dem Usernamen entsprechen.'; if (strlen($passwd) < 4) return 'Das Passwort ist zu kurz.'; if (strlen($passwd) > 15) return 'Das Passwort ist zu lang.'; if (!preg_match ('/^[a-zA-Z0-9%!@#^&\*\$\\\+\.\_\-]{4,15}$/', $passwd, $matches)) return 'Das Passwort enthält ungültige Zeichen.'; return true; } function is_valid_username($nickname) { $blacklist = array('hitler','stalin'); if (!preg_match ('/^[a-zA-Z0-9\.\_\-]{4,15}$/', $nickname, $matches)) return false; foreach ($blacklist as $badnick) { if (soundex($nickname) == soundex($badnick)) return false; } return true; } function is_valid_realname($name) { if (preg_match ('/[\\\\<>"\(\)\[\]]/', $name, $matches)) return false; return true; } function check_account_data() { global $_POST; global $zlist; $zlist['replace'] = array('nickname' => $_POST['nickname'], 'realname' => $_POST['realname'], 'email' => $_POST['email'], 'url' => $_POST['url']); if (!strlen($_POST['nickname']) || !strlen($_POST['email'])) return 'Sie müssen alle Pflichtfelder ausfüllen! Siehe Beschreibung unten.'; if (account_exists($_POST['nickname'])) return 'Dieser Username ist in der Zeitungsliste bereits vergeben.'; if (!is_valid_email_address($_POST['email'])) return 'Die angegebene Mail-Adresse ist ungültig.'; if (!empty($_POST['url'])) { $_POST['url'] = fix_url($_POST['url']); if (!is_valid_url($_POST['url'])) return 'Die angegebene Homepage ist ungültig!'; } if (!empty($_POST['realname']) && !is_valid_realname($_POST['realname'])) return 'Der angegebene Name enthält unerlaubte Zeichen.'; return is_valid_username($_POST['nickname']); } function check_passwd() { global $_POST; if (!strlen($_POST['passwd']) || !strlen($_POST['pwcopy'])) return 'Sie müssen alle Pflichtfelder ausfüllen! Siehe Beschreibung unten.'; if (strlen($_POST['passwd']) < 5) return 'Ihr Passwort ist zu kurz, bitte verwenden Sie mindestens 5 Zeichen.'; if ($_POST['passwd'] != $_POST['pwcopy']) return 'Sie haben sich beim Passwort vertippt.'; return true; } function passwd ($nickname, $passwd) { return md5(md5($passwd). $nickname); } function pwgen ($num) { $chars = "abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz"; $count = strlen($chars); $pass = ''; srand((double)microtime()*1000000); for ($i = 0;$i < $num; $i++) { $pos = rand() % $count; $pass .= substr ($chars, $pos, 1); } return $pass; } function account_activate($code) { global $cfg; if (!strlen($code)) return 'Kein Aktivierungscode angegeben.'; $query = sprintf("SELECT uid FROM activation WHERE code = '%s'", pg_escape_string($code)); $sth = db_query($query); if ($sth === false) return 'Es ist ein Datenbankfehler aufgetreten.'; if (pg_NumRows($sth) != 1) return 'Der angegebene Aktivierungscode ist ungültig!'; db_query('BEGIN TRANSACTION'); $row = pg_fetch_array($sth, 0); $query = sprintf('UPDATE users SET status = 1 WHERE id = %d', $row['uid']); $sth = db_query($query); if ($sth === false) { db_query('ROLLBACK'); return 'Es ist ein Datenbankfehler aufgetreten.'; } $query = sprintf("DELETE FROM activation WHERE code = '%s'", pg_escape_string($code)); $sth = db_query($query); if ($sth === false) { db_query('ROLLBACK'); return 'Es ist ein Datenbankfehler aufgetreten.'; } db_query('COMMIT'); return true; } function send_activation($email, $user, $code) { global $cfg; global $_SERVER; $url = sprintf('%sactivate.html?code=%s', $cfg['home'], urlencode($code)); $subject = 'Aktivierung Account Zeitungsliste'; $header = array('Bcc: ' . $cfg['mailto']); $body = sprintf('Willkommen %s! Sie haben einen neuen Account in der Zeitungsliste beantragt. Um diesen zu aktivieren, geben Sie bitte folgende Adresse in Ihren Browser ein: %s ', $user, $url); sendmail($email, '', $subject, $body, $header); return true; } function process_activate() { global $_GET; if (($try = account_activate($_GET['code'])) !== true) { $ret = warning($try); } else { $ret = information('Ihr Account ist aktiviert.'); $ret .= '

Willkommen!

'. 'Sie werden automatisch zur Login-Seite weitergeleitet. '. 'Bitte melden Sie sich dort an.

'; $zlist['redirect'] = 'login.html'; } return $ret; } function process_account_new() { global $cfg; global $_POST; if (($try = check_account_data()) !== true) return $try; if (($try = check_passwd()) !== true) return $try; db_query('BEGIN TRANSACTION'); $query = sprintf('INSERT INTO users (nickname,email,status,passwd,register_date%s%s)' . "VALUES ('%s','%s',0,'%s',now()%s%s)", strlen($_POST['realname'])?',realname':'', strlen($_POST['url'])?',url':'', $_POST['nickname'], $_POST['email'], passwd($_POST['nickname'], $_POST['passwd']), strlen($_POST['realname'])?",'".pg_escape_string($_POST['realname'])."'":'', strlen($_POST['url'])?",'".pg_escape_string($_POST['url'])."'":''); $sth = db_query($query); if ($sth === false) { db_query('ROLLBACK'); return 'Es ist ein Datenbankfehler aufgetreten.'; } $uid = db_last_id('users', 'id'); $code = md5(pwgen(8)); $query = sprintf('INSERT INTO activation (code,uid,register_date) '. "VALUES ('%s',%d,now())", $code, $uid); $sth = db_query($query); if ($sth === false) { db_query('ROLLBACK'); return 'Es ist ein Datenbankfehler aufgetreten.'; } if (send_activation($_POST['email'], strlen($_POST['realname'])?$_POST['realname']:$_POST['nickname'], $code) === false) { db_query('ROLLBACK'); return 'Fehler beim Versenden der Aktivierungsmail.'; } db_query('COMMIT'); return true; } function update_account() { global $_POST; global $_SESSION; global $zlist; $query = sprintf("UPDATE users SET nickname='%s',realname='%s',email='%s',url='%s' ". 'WHERE id = %d', $_POST['nickname'], pg_escape_string($_POST['realname']), $_POST['email'], pg_escape_string($_POST['url']), $_SESSION['uid']); db_query($query); if ($_SESSION['nickname'] != $_POST['nickname']) $zlist['newpass'] = true; $_SESSION['nickname'] = $_POST['nickname']; $_SESSION['email'] = $_POST['email']; $_SESSION['homepage'] = $_POST['url']; $_SESSION['realname'] = $_POST['realname']; } function update_passwd() { global $_POST; global $_SESSION; $hash = passwd($_SESSION['nickname'], $_POST['passwd']); $query = sprintf("UPDATE users SET passwd='%s' WHERE id = %d", $hash, $_SESSION['uid']); db_query($query); } function checkpass($nickname, $passwd) { global $cfg; if (empty($nickname) || empty($passwd)) return false; $query = sprintf("SELECT passwd,nickname FROM users ". "WHERE lower(nickname) = lower('%s') AND status = 1", pg_escape_string($nickname)); $sth = db_query($query); if ($sth === false) return false; if (pg_NumRows($sth) == 0) return false; $row = pg_fetch_array($sth, 0); $hash = passwd($row['nickname'], $passwd); if (strcmp($row[0], $hash) != 0) return false; return true; } function login_user($nickname, $passwd) { global $cfg; global $_SERVER; global $_POST; global $_SESSION; $query = sprintf("SELECT id,nickname,realname,email,url,passwd FROM users " . "WHERE lower(nickname) = lower('%s') AND status = 1", pg_escape_string($nickname)); $sth = db_query($query); if ($sth === false) return false; if (pg_NumRows($sth) == 0) return false; $row = pg_fetch_array($sth, 0); $hash = passwd($row['nickname'], $passwd); if (strcmp($row['passwd'], $hash) != 0) return false; session_name($cfg['session']); session_start(); $_SESSION['REMOTE_ADDR'] = $_SERVER["REMOTE_ADDR"]; $_SESSION['uid'] = $row['id']; $_SESSION['nickname'] = $row['nickname']; $_SESSION['javascript'] = $_POST['js']=='1'?true:false; $_SESSION['email'] = $row['email']; $_SESSION['homepage'] = $row['url']; $_SESSION['realname'] = $row['realname']; $query = sprintf('UPDATE users SET last_login = now() WHERE id = %d', $_SESSION['uid']); db_query($query); $query = sprintf('INSERT INTO online (uid,activity) VALUES (%d,now())', $_SESSION['uid']); db_query($query); session_update(); $_SESSION["lastupdate"] = time(); return true; } function login_sendnew($nickname) { global $cfg; if (!strlen($nickname)) return 'Kein Username angegeben!'; $query = 'SELECT id,email,nickname,realname FROM users WHERE status = 1 AND '; if (strstr($nickname, '@') === false) $query .= sprintf("lower(nickname) = lower('%s')", pg_escape_string($nickname)); else $query .= sprintf("lower(email) = lower('%s')", pg_escape_string($nickname)); $sth = db_query($query); if ($sth === false) return 'Es ist ein Datenbankfehler aufgetreten.'; if (pg_NumRows($sth) == 0) return 'Der angegebene Username ist im System nicht bekannt.'; $row = pg_fetch_array($sth, 0); $passwd = pwgen(8); $query = sprintf("UPDATE users SET passwd = '%s' WHERE id = %d", passwd($row['nickname'], $passwd), $row['id']); $sth = db_query($query); if ($sth === false) return 'Es ist ein Datenbankfehler aufgetreten.'; $header = array(); $header[] = 'From: ' . $cfg['from']; $header[] = sprintf('To: %s <%s>', strlen($row['realname'])?$row['realname']:$row['nickname'], $row['email']); $header[] = 'MIME-Version: 1.0'; $header[] = 'Content-type: text/plain; charset=utf-8'; $subject = 'Zeitungsliste: Ihr Neues Passwort'; $body = sprintf('Moin %s! Sie oder jemand anderes hat ein neues Passwort für Ihren Account auf <%s> angefordert. Das alte Passwort verliert damit seine Gültigkeit. Das System hat ein neues Passwort für Sie berechnet und eingetragen. Das neue Passwort lautet %s Bitte ändern Sie es beim nächsten Einloggen. ', strlen($row['realname'])?$row['realname']:$row['nickname'], $cfg['home'], $passwd); $sig = load_template('signature', array()); if (strlen($sig)) $body .= $sig; if (mail ($row['email'], $subject, $body, implode("\n", $header)) === false) return 'Es ist ein Fehler beim Versand der Mail aufgetreten.'; return true; } function process_login_request() { global $_POST; if (isset($_POST['new'])) { $try = process_account_new(); if ($try === true) return information('Ihr neuer Account wurde angelegt. Die Aktivierungsmail ist unterwegs.'); else { $body = warning($try); $replace = array('nickname' => $_POST['nickname'], 'realname' => $_POST['realname'], 'email' => $_POST['email'], 'url' => $_POST['url']); $body .= load_template('login_new.html', $replace); return $body; } } elseif (isset($_POST['sendnew'])) { $try = login_sendnew($_POST['nickname']); if ($try === true) { $ret = information('Ein neues Passwort wird Ihnen per Mail zugeschickt'); $ret .= '

Bitte melden Sie sich mit diesem an und ändern Sie das Passwort '. 'über den Menüpunkt "Einstellungen".

'; return $ret; } else { $body = warning($try); $body .= load_template('login.html'); return $body; } } else { if (empty($_POST['nickname'])) { $body = warning('Sie haben keinen Usernamen angegeben!'); } elseif (empty($_POST['passwd'])) { $body = warning('Sie haben kein Passwort angegeben!'); } else { $try = login_user($_POST['nickname'], $_POST['passwd']); if ($try === true) return true; else $body = warning('Das angegebene Passwort ist ungültig!'); } $replace = array('nickname' => $_POST['nickname']); $body .= load_template('login.html', $replace); return $body; } } function last_activity() { global $cfg; global $_SESSION; $query = sprintf("SELECT DISTINCT topics.id,topics.topic FROM article " . "JOIN topics ON article.topic=topics.id " . "WHERE uid = %d AND article.created > now() - interval'7 days'", $_SESSION['uid']); $sth = db_query($query); if ($sth === false || pg_NumRows($sth) == 0) return false; $ret = '

Sie haben an folgenden Diskussionen teilgenommen

'; $ret .= '

'; return $ret; } function process_login() { global $_GET; global $_SERVER; global $_SESSION; if (isset($_GET['from'])) { if ($_GET['from'] == 'article') $ret .= warning('Um an einer Diskussion teilzunehmen, müssen Sie angemeldet sein.'); elseif ($_GET['from'] == 'zeitung') $ret .= warning('Um eine neue Diskussion zu beginnen, müssen Sie angemeldet sein.'); elseif ($_GET['from'] == 'new') $ret .= warning('Um eine Zeitung hinzuzufügen, müssen Sie angemeldet sein.'); elseif ($_GET['from'] == 'tags') $ret .= warning('Um Tags zu einer Zeitung zu verwalten, müssen Sie angemeldet sein.'); elseif ($_GET['from'] == 'edit') $ret .= warning('Um eine Zeitung zu bearbeiten, müssen Sie angemeldet sein.'); elseif ($_GET['from'] == 'session') $ret .= warning('Ihre Session ist abgelaufen. Bitte melden Sie sich erneut an.'); $ret .= load_template('login.html'); } elseif (isset($_GET['new'])) { $ret = load_template('login_new.html'); } elseif ($_SERVER['REQUEST_METHOD'] == 'GET') { $ret = load_template('login.html'); } else { $try = process_login_request(); if ($try === true) { $ret = information('Hallo '.$_SESSION['nickname'].'! Sie sind jetzt angemeldet.'); $try = last_activity(); if ($try !== false) $ret .= $try; else $ret .= load_template('main.html'); } else $ret = $try; } return $ret; } function process_passwd() { global $_SESSION; global $_SERVER; global $zlist; global $cfg; if (!isset($_SESSION['uid'])) { $ret = warning('Sie sind nicht angemeldet. Sie werden gleich zur Anmeldung weitergeleitet.'); $zlist['redirect'] = 'login.html'; } else { if ($_SERVER['REQUEST_METHOD'] == 'GET') { $ret .= load_javascript('passwd.js') . load_template('passwd.html', array('nickname' => $_SESSION['nickname'])); } elseif ($_SERVER['REQUEST_METHOD'] == 'POST') { if (($try = check_passwd()) !== true) { $ret = warning($try); $ret .= load_javascript('passwd.js') . load_template('passwd.html', array('nickname' => $_SESSION['nickname'])); } else { update_passwd(); $ret .= information('Ihr neues Passwort ist eingetragen. Sie werden zur Hauptseite weitergeleitet.'); $zlist['redirect'] = ''; } } } return $ret; } function logout() { session_invalidate(); } function process_options() { global $_SESSION; global $_SERVER; global $_POST; global $zlist; global $cfg; $ok = false; $ret = ''; if (!isset($_SESSION['uid'])) { $ret .= warning('Sie sind nicht angemeldet. Sie werden gleich zur Anmeldung weitergeleitet.'); $zlist['redirect'] = 'login.html'; } else { if ($_SERVER['REQUEST_METHOD'] == 'POST') { if (($try = check_account_data()) !== true) $ret .= warning($try); else { update_account(); $ret .= information('Ihre persönlichen Daten wurden geändert. Sie werden zur Hauptseite weitergeleitet.'); $ok = true; $zlist['redirect'] = ''; if ($zlist['newpass']) { $try = login_sendnew($_POST['nickname']); if ($try === true) { $ret .= '

Aus technischen Gründen ist es erforderlich Ihnen ein neues Passwort zu geben. '. 'Dieses wird Ihnen per Mail an die im System gespeicherte Mail-Adresse geschickt. '. 'Diese Session ist von dieser Änderung nicht betroffen, Sie können daher Ihr Passwort '. 'direkt über den Menüpunkt "Passwort" ändern und die Mail ignorieren. '. 'Ansonsten melden Sie sich bitte beim nächsten Mal mit dem neuen Passwort an und ändern Sie es.

'; } } } } else $zlist['replace'] = array('nickname' => $_SESSION['nickname'], 'realname' => $_SESSION['realname'], 'email' => $_SESSION['email'], 'url' => $_SESSION['url']); if (!$ok) $ret .= load_javascript('options.js') . load_template('options.html', $zlist['replace']); } return $ret; } function ajax_passwd_check() { global $_POST; return checkpass($_POST['nickname'], $_POST['passwd']); } function ajax_nickname_check() { global $_POST; return account_exists($_POST['nickname']); } ?>