Source

Selador / activate.php

<?php

/* activate.php - Front-end code for activating email accounts and hence selador accounts
 *
 * 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/>.
 **/

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:.");
}

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

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

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

$glob_log = array ();

require_once ("php/base/AuthDB.inc.php");
if (FORUM_NEEDED)
{
	require_once ("php/base/forumdb.inc.php");
}
require_once ("php/base/user.inc.php");
require_once ("php/auxiliary.php");
require_once ("php/auth.php");

function calc_invitations ($invited_by, $invitors_to_upgrade, $i = 0)
{
	//echo "<br><br>starting calc_invitations...<br>";
	global $authdb;
	global $errorstate;

	$query = "select user,invited_by from user where uid=".$invited_by;
	if ($res = $authdb->query($query))
	{
		if (mysql_num_rows($res) == 1)
		{
			if ($row = mysql_fetch_array($res))
			{
				if ($row['invited_by'] == 0)
				{
					//echo "\n <br>Debug ".$i.": ".$row['user']." was not invited....Return recursion with<br>";
				//	print_r($invitors_to_upgrade);
					return ($invitors_to_upgrade);
				}
				else
				{
					if (!in_array($row['invited_by'], $invitors_to_upgrade))
					{
						//echo "\n<br>Debug ".$i.": user ".$row['user']." was invited by ".$row['invited_by']."<br>";
						$invitors_to_upgrade[$i] = $row['invited_by'];
					}
					return calc_invitations($row['invited_by'],$invitors_to_upgrade, $i+1);

				}
			}
			else
				return false;
		}
		return ($invitors_to_upgrade);
	}
	else
		return false;
}

function update_invitations ($to_upgrade)
{
	global $authdb;
	foreach ($to_upgrade as $this_uid)
	{
		if (isset($query_tmp))
			$query_tmp .= ", ".$this_uid;
		else
			$query_tmp = $this_uid;

	}

	$query = "update user set invitations=invitations+1 where uid in ( ".$query_tmp.")";
	if (!$authdb->query($query))
		echo "Problem with database";
	/*else
		echo "Hurrra!".$query;*/

}

$authdb = new AuthDB;
if (FORUM_NEEDED)
	$forumdb = new ForumDB;

$success = false;

if (isset ($_REQUEST['i']) && (strlen ($_REQUEST['n']) < 1))
{
	$errorstate = false;
	$authdb->query ("start transaction");

	$query = 'select * from activations A, user B where A.uid=B.uid and A.code="'.mysql_real_escape_string ($_REQUEST['i']).'"';

	if (($res = $authdb->query ($query)))
	{
		if (($user_row = mysql_fetch_array ($res)))
		{
			$read_uid = $user_row['uid'];

			$query = "update user set email_ok=1 where uid=".$read_uid;

			if (!$authdb->query ($query))
			{
				mini_log_err ("Cannot set email ok after activating. 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.";
				$authdb->query ("rollback");
			}
			else
			{
				// Also check if there really was a user there...
				if (!$authdb->affected_rows ())
				{
					mini_log_err ("Cannot find user after activating. Query: ".$query.", ".$authdb->error ());
					$errorstate = "Dieser Benutzer existiert nicht. Bitte lege einen neuen Benutzer an.";
					$authdb->query ("rollback");
				}
				else
				{
					$query = "delete from activations where uid=".$read_uid;
					if (!$authdb->query ($query))
					{
						mini_log_err ("Cannot delete activation row after activating. 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.";
						$authdb->query ("rollback");
					}
					if (FORUM_NEEDED)
					{
						// Now this account is activated. Lets create a forum account
						$forumdb->AddUser ($read_uid, $user_row['user'], $user_row['plpw'], $user_row['email'], '');
					}
					if ($user_row['invited_by'] != 0)
					{
						$invitors_to_upgrade = array();
						$to_upgrade = array();
						$to_upgrade = calc_invitations($user_row['uid'], $invitors_to_upgrade);
						update_invitations($to_upgrade);
					}


					$authdb->query ("commit");
					$_SESSION['email_ok'] = true;
					$first_login = true;
					$_SESSION['first_login'] = true;


					// Check is this guy is already logged in
					if (isset ($_SESSION['authed_uid']))
					{
						// Now if he also is the same guy that just activated, move him onto the
						// new hero page
						if ($_SESSION['authed_uid'] == $read_uid)
						{
							require_once ("portal.php");
							die ();
						}
						require_once ("portal.php");
					}

					$success = "Der Account ".stripslashes ($user_row['user'])." wurde erfolgreich aktiviert. Nach dem <a href=\"index.php\">Einloggen</a> kanns direkt losgehen!";

				}
			}
		}
		else
			$errorstate = "Dieser Aktivierungscode ist leider unbekannt. Bitte nochmal kontrollieren. Solltest Du ein Problem haben, wende dich bitte per Mail an <a href=\"mailto: support@selador.de\">support@selador.de</a>.";
	}
	else
		$errorstate = "Leider ist ein Datenbank-Fehler aufgetreten. Bitte probiere die Aktion erneut. Falls das Problem besteht, nimm bitte mit uns Kontakt auf: <a href=\"mailto: support@selador.de\">support@selador.de</a>";
}

require_once("header_extern.php");
echo '</head><body class="inhalt">';

echo '<div id="zentriert"><div id="logo"><a href="uebersicht.php"><img src="styles/sun/logo.jpg"></a></div>';


require_once("menue.php");


?>

<div id="forschung">
<div id="seite-links" class="inhalt">
<?php
	// 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;

	echo '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">';
	echo '<h2>Aktivierung des Accounts</h2><br>';

	if (isset ($_REQUEST['new']) || (strlen ($_REQUEST['n']) > 1))
	{
		if (is_string ($_REQUEST['n']) && (strlen ($_REQUEST['n']) >= 6))
		{
			$query = 'select *,time_to_sec(timediff(now(),A.created)) as dif from activations A, user B where A.uid=B.uid and B.email="'.mysql_real_escape_string ($_REQUEST['n']).'"';

			// echo $query;

			if (!($res = $authdb->query ($query)))
			{
				mini_log_err ("Error when trying to resend auth code. Query: ".$query.", ".$authdb->error ());
				$errorstate = "Leider ist ein DB-Fehler aufgetreten. Bitte versuche es später noch einmal. Bleibt der Fehler bestehen, melde Dich bitte bei uns.";
			}
			else
			{
				if (($row = mysql_fetch_array ($res)))
				{
					if ($row['dif'] > 600)
					{
						require_once ("php/base/mail.inc.php");

						$email = $row['email'];
						$code = $row['code'];
						$user = $row['user'];

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

						$mail->Subject = 'Aktivierung für Selador';
						$text_body = "Hallo ".$user.",\r\n\r\n".
							"vielen Dank für die Registrierung bei Selador. Um spielen zu können, muss nun nur noch der Account".
							"aktiviert werden. Dazu einfach auf folgenden Link klicken:\r\n\r\n".
							$weburl."/activate.php?i=".$code."\r\n\r\nViel Erfolg in dieser Welt wünscht Dir das Selador-Team.";

						$html_body = "<html><body><p>Hallo ".$user.",</p>".
							"<p>vielen Dank für die Registrierung bei Selador. Um spielen zu k&ouml;nnen, muss nun nur noch der Account".
							"aktiviert werden. Dazu einfach auf folgenden Link klicken:<br>".
							"<a href=\"".$weburl."/activate.php?i=".$code."\">".MASTERURL."/activate.php?i=".$code."</a></p><p>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?";
						}
						else
						{
							$success = "Eine Email wurde an die angegebene Adresse gesendet. In dieser Mail befindet sich ein Aktivierungslink, der angeklickt werden muss, damit der Account aktiviert wird.</p><p>Wenn die Mail nicht ankommt, kann sie durch einen Einlogversuch erneut angefordert werden. Solltest Du Probleme haben, wende dich bitte per Mail an <a href=\"mailto: support@selador.de\">support@selador.de</a>.</p>";
						}
					}
					else
						$errorstate = "Der Versand der letzten Aktivierungsmail war vor weniger als zehn Minuten. Bitte warte zumindest zehn Minuten, bevor du es noch einmal probierst. Solltest Du Probleme haben, wende dich bitte per Mail an <a href=\"mailto: support@selador.de\">support@selador.de</a>.</p>";
				}
				else
					$errorstate = "Diese Email-Adresse haben wir nicht in der Datenbank. Solltest Du Probleme haben, wende dich bitte per Mail an <a href=\"mailto: support@selador.de\">support@selador.de</a>.</p>";
			}
		}
		else
			$errorstate = "<br><br><b>Es ist leider ein Datenbank-Fehler aufgetreten. Tut uns leid :(</b>\n";
	}


	if ($success)
	{
		echo $success;
	}
	else
	{
		if (isset ($errorstate))
		{
			echo '<b>'.$errorstate.'</b><br>';
		}
		else
			echo '<br>';

		echo '<p><table cellspacing="0"><tr><td colspan="2">Wir haben per Email einen Aktivierungs-Code versendet. Nur wenn der Account aktiviert wurde, kannst Du Selador spielen. Gib bitte hier den Code ein:</td></tr>';

		echo '<tr><td colspan="2"><input name="i" size="32">&nbsp;<input type="submit" name="go" value="Aktivieren">&nbsp;&nbsp;&nbsp;</td></tr>';

		echo '<tr><td colspan="2"><br>Falls Du noch keine Mail bekommen hast, kannst Du Dir hier den Code noch einmal zusenden lassen:</td></tr>';

		echo '<tr><td colspan="2"><input name="n" size="32" length="80">&nbsp;<input type="submit" name="new" value="Neu senden">&nbsp;&nbsp;&nbsp;</td></tr>';

		echo '</table>';
	}
?>
</div></form>

</body></html>