Source

Selador / lostpw.php

Full commit
<?php

/* lostpw.php - Front-end code for retrieving lost passwords
 *
 * Copyright (C) 2006, 2007, 2008 Kevin Read, Simone Schaefer
 *
 * This file is part of Selador, a browser-based fantasy strategy game
 *
 * This program is distributed under the terms of the GNU Affero General Public License.
 *
 *
 *   Selador is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU Affero General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   any later version.
 *
 *   Selador is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU Affero General Public License for more details.
 *
 *   You should have received a copy of the GNU Affero General Public License
 *   along with Selador.  If not, see <http://www.gnu.org/licenses/>.
 **/

@header ("Content-Type: text/html; charset=UTF-8");
@session_start ();

require_once ("php/base/config.inc.php");

// Setup the include path automagically
// First we need to check if our paths are already in the include path
$incpath = ini_get ("include_path");

if (!strstr ($cwd, BASE_PATH))
{
	ini_set ("include_path", BASE_PATH."php:".BASE_PATH."/php/base:".BASE_PATH."/var/php:.");
}

require_once ("base_functions.php");
require_once ("base_outside.php");
require_once ("php/auxiliary.php");

$glob_log = array ();



require_once ("php/base/AuthDB.inc.php");
$authdb = new AuthDB;

if (FORUM_NEEDED)
{
	require_once ("php/base/forumdb.inc.php");
	$forumdb = new ForumDB;
}

// Dynamically adapt the master url because it might be empty
if (MASTERURL == "")
{
	if (isset ($_SERVER['HTTPS']) && $_SERVER['https'])
		$weburl = "https://";
	else
		$weburl = "http://";
	$weburl .= $_SERVER['SERVER_NAME'];
	
	if ($_SERVER['SERVER_PORT'] != 80)
		$weburl .= ':' . $_SERVER['SERVER_PORT'];
}
else
	$weburl = MASTERURL;

$success = false;

if (isset ($_REQUEST['username']) && (strlen ($_REQUEST['username']) > 0))
{
	$errorstate = false;

	$query = 'select uid, email, user from user where email="'.mysql_real_escape_string ($_REQUEST['username']).'" or user="'.mysql_real_escape_string ($_REQUEST['username']).'"';

	if (($res = $authdb->query ($query)))
	{
		if (($user_row = mysql_fetch_array ($res)))
		{
			$read_uid = $user_row['uid'];
			$read_user = $user_row['user'];
			$read_email = $user_row['email'];
			$code = md5($read_email . rand (0, 120000));

			$authdb->query ("start transaction");

			$query = "replace into emailchange values (".$read_uid.", '".$code."')";

			if (!$authdb->query ($query))
			{
				mini_log_err ("Cannot insert emailchange code. Query: ".$query.", ".$authdb->error ());
				$errorstate = "Leider ist ein Datenbank-Fehler aufgetreten. Bitte probiere die Aktion erneut. Falls das Problem besteht, nimm bitte mit uns Kontakt auf.";
			}
			else
			{

				require_once ("php/base/mail.inc.php");

				$mail->From = "aktivierung@selador.de";
				$mail->FromName = "Selador";
				$mail->AddAddress($read_email);                  // name is optional

				$mail->Subject = 'Kennwort-Änderung';
				$text_body = "Hallo ".$read_user.",\r\n\r\n".
					"jemand hat eine Kennwortänderung angefordert. Wenn du dein Selador-Kennwort ändern willst,".
					"verwende dazu folgenden Link:\r\n\r\n".
					$weburl."/lostpw.php?e=".$code."\r\n\r\nWeiterhin viel Erfolg in dieser Welt wünscht Dir das Selador-Team.";

				$html_body = "<html><body><p>Hallo ".$read_user.",</p>".
					"<p>jemand hat eine Kennwort&auml;nderung angefordert. Wenn du dein Selador-Kennwort &auml;ndern willst,".
					"verwende dazu folgenden Link:</p>".
					"<a href=\"".$weburl."/lostpw.php?e=".$code."\">".$weburl."/lostpw.php?e=".$code."</a></p><p>Weiterhin viel Erfolg in dieser Welt w&uuml;nscht das Selador-Team.</p></body></html>";

				$mail->Body    = $html_body;
				$mail->AltBody = $text_body;

				if(!$mail->Send())
				{
					 $errorstate = "Die Nachricht konnte leider nicht gesendet werden. Ist die Email-Adresse korrekt?";
					 $authdb->query ("rollback");
				}
				else
				{
					$authdb->query ("rollback");
					$success = 'Du solltest in den nächsten Minuten eine Email mit einem Link erhalten. Falls nicht, wende dich per Email an <img src="gfx/mail_support.png">.';
				}
			}
		}
		else
			$errorstate = 'Dieser Benutzer oder diese Emailadresse kennen wir nicht. Bitte probiere es <a href="lostpw.php"> erneut.';
	}
	else
	{
		mini_log_err ("Cannot read user for emailchange code insert. Query: ".$query.", ".$authdb->error ());
		$errorstate = "Leider ist ein Datenbank-Fehler aufgetreten. Bitte probiere die Aktion erneut. Falls das Problem besteht, nimm bitte mit uns Kontakt auf.";
	}
}

if (isset ($_REQUEST['e']))
{
	$code = mysql_real_escape_string ($_REQUEST['e']);
	$query = "select A.user,A.uid from user A, emailchange B where A.uid=B.uid and B.code='".$code."'";

	if (!($res = $authdb->query ($query)))
	{
		mini_log_err ("Cannot find uid for emailchange code. Query: ".$query.", ".$authdb->error ());
		$errorstate = "Leider ist ein Datenbank-Fehler aufgetreten. Bitte probiere die Aktion erneut. Falls das Problem besteht, nimm bitte mit uns Kontakt auf.";
	}
	else
	{
		if (($user_row = mysql_fetch_array ($res)))
		{
			$success = '<input type="hidden" name="e" value="'.$_REQUEST['e'].'">';
			$success .= '<p>Bitte weise dem Account &quot;'.$user_row['user'].'&quot; ein neues Kennwort zu:<br>';
			$success .= '<input type="password" name="p1" size="20" maxlength="20"></p>';
			$success .= '<p>Und zur Sicherheit nochmal eingeben:<br>';
			$success .= '<input type="password" name="p2" size="20" maxlength="20"></p>';
			$success .= '<input type="submit" name="e2" value="Kennwort setzen">';
			$changepw = $success;
		}
		else
			$errorstate = "Dieser Kennwortänderungs-Code ist uns nicht bekannt!";
	}
}

if (isset ($_REQUEST['p1']) && (strlen ($_REQUEST['p1']) > 1))
{
	$success = false;

	if (!isset ($_REQUEST['p2']) || ($_REQUEST['p1'] != $_REQUEST['p2']))
		$errorstate = "Die beiden Eingaben stimmen nicht überein!";
	else
	{
		if (CheckPasswordStrength ($_REQUEST['p1']) < 1)
			$errorstate = "Das neue Kennwort ist zu schwach. Es sollte gemischte Gro&szlig;- und Kleinschreibung enthalten, oder Zahlen.<br><br>";
		else
		{
			$authdb->query ("start transaction");

			$query = "update user set password=md5('".mysql_real_escape_string ($_REQUEST['p1'])."') where uid=".$user_row['uid'];

			if (!$authdb->query ($query))
			{
				mini_log_err ("Cannot update password in emailchange. Query: ".$query.", ".$authdb->error ());
				$errorstate = "Leider ist ein Datenbank-Fehler aufgetreten. Bitte probiere die Aktion erneut. Falls das Problem besteht, nimm bitte mit uns Kontakt auf.";
			}
			else
			{
				if (FORUM_NEEDED && !$forumdb->change_pw ($user_row['user'], $_REQUEST['p1']))
				{
					$authdb->query ("rollback");
					mini_log_err ("Cannot update password in emailchange. Query: ".$query.", ".$authdb->error ());
					$errorstate = "Leider ist ein Datenbank-Fehler aufgetreten. Bitte probiere die Aktion erneut. Falls das Problem besteht, nimm bitte mit uns Kontakt auf.";
				}

				// If this fails, it is non-fatal
				$query = "delete from emailchange where code='".$code."'";

				if (!$authdb->query ($query));
					mini_log_err ("Cannot delete code in emailchange. Query: ".$query.", ".$authdb->error ());
				$success = "Das Kennwort von ".stripslashes ($user_row['user'])." wurde erfolgreich geändert. Nach dem <a href=\"index.php\">Einloggen</a> kanns direkt losgehen!";
				$authdb->query ("commit");
			}
		}
	}
}

require_once("header_extern.php");
echo '</head>';
require_once("menue.php");

?>

<div id="contentbox">
<?php
	echo '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">';
	echo '<h2>Kennwort vergessen</h2>';
	if ($success)
		echo $success;
	else
	{
		if ($errorstate)
		{
			echo "<b>".$errorstate."</b>";
			if (isset ($changepw))
				echo $changepw;
		}
		else
		{
			echo '<p>Gib bitte deinen Benutzernamen oder deine Emailadresse ein. Wir werden dir einen Link zuschicken, mit dem du dein Kennwort
						&auml;ndern kannst.</p>';
			echo '<p>Dein Benutzername: <input name="username" maxlength="80" size="22"></p>';
			echo '<input type="submit" name="s" value="Ich möchte mein Kennwort ändern">';
		}
	}
?>
</form>
</div>
<?php
require_once("footer_outer.php");
?>