confirm.php 6.19 KB
Newer Older
Scott committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
<?php
/*
	Question2Answer by Gideon Greenspan and contributors
	http://www.question2answer.org/

	Description: Controller for email confirmation page (can also request a new code)


	This program is free software; you can redistribute it and/or
	modify it under the terms of the GNU General Public License
	as published by the Free Software Foundation; either version 2
	of the License, or (at your option) any later version.

	This program 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 General Public License for more details.

	More about this license: http://www.question2answer.org/license.php
*/

Scott committed
22
if (!defined('QA_VERSION')) { // don't allow this page to be requested directly from browser
23
	header('Location: ../../');
Scott committed
24 25
	exit;
}
Scott committed
26

Scott committed
27
// Check we're not using single-sign on integration, that we're not already confirmed, and that we're not blocked
Scott committed
28

29
if (QA_FINAL_EXTERNAL_USERS) {
Scott committed
30
	qa_fatal_error('User login is handled by external code');
31
}
Scott committed
32

Scott committed
33
// Check if we've been asked to send a new link or have a successful email confirmation
Scott committed
34

35 36 37 38 39 40 41 42 43 44 45 46 47 48
// Fetch the handle from POST or GET
$handle = qa_post_text('username');
if (!isset($handle)) {
	$handle = qa_get('u');
}
$handle = trim($handle); // if $handle is null, trim returns an empty string

// Fetch the code from POST or GET
$code = qa_post_text('code');
if (!isset($code)) {
	$code = qa_get('c');
}
$code = trim($code); // if $code is null, trim returns an empty string

49 50 51
$loggedInUserId = qa_get_logged_in_userid();
$emailConfirmationSent = false;
$userConfirmed = false;
Scott committed
52

53 54
$pageError = null;

55 56
if (isset($loggedInUserId) && qa_clicked('dosendconfirm')) { // A logged in user requested to be sent a confirmation link
	if (!qa_check_form_security_code('confirm', qa_post_text('formcode'))) {
57
		$pageError = qa_lang_html('misc/form_security_again');
58 59 60
	} else {
		// For qa_send_new_confirm
		require_once QA_INCLUDE_DIR . 'app/users-edit.php';
Scott committed
61

62 63
		qa_send_new_confirm($loggedInUserId);
		$emailConfirmationSent = true;
Scott committed
64
	}
65 66
} elseif (strlen($code) > 0) { // If there is a code present in the URL
	// For qa_db_select_with_pending, qa_db_user_account_selectspec
Scott committed
67
	require_once QA_INCLUDE_DIR . 'db/selects.php';
68 69

	// For qa_complete_confirm
Scott committed
70
	require_once QA_INCLUDE_DIR . 'app/users-edit.php';
Scott committed
71

72 73
	if (strlen($handle) > 0) { // If there is a handle present in the URL
		$userInfo = qa_db_select_with_pending(qa_db_user_account_selectspec($handle, false));
Scott committed
74

75 76 77
		if (strtolower(trim($userInfo['emailcode'])) == strtolower($code)) {
			qa_complete_confirm($userInfo['userid'], $userInfo['email'], $userInfo['handle']);
			$userConfirmed = true;
Scott committed
78
		}
Scott committed
79
	}
Scott committed
80

81 82 83
	if (!$userConfirmed && isset($loggedInUserId)) { // As a backup, also match code on URL against logged in user
		$userInfo = qa_db_select_with_pending(qa_db_user_account_selectspec($loggedInUserId, true));
		$flags = $userInfo['flags'];
Scott committed
84

85 86 87 88 89
		if (($flags & QA_USER_FLAGS_EMAIL_CONFIRMED) > 0 && ($flags & QA_USER_FLAGS_MUST_CONFIRM) == 0) {
			$userConfirmed = true; // if they confirmed before, just show message as if it happened now
		} elseif (strtolower(trim($userInfo['emailcode'])) == strtolower($code)) {
			qa_complete_confirm($userInfo['userid'], $userInfo['email'], $userInfo['handle']);
			$userConfirmed = true;
Scott committed
90 91
		}
	}
Scott committed
92
}
Scott committed
93

Scott committed
94
// Prepare content for theme
Scott committed
95

Scott committed
96
$qa_content = qa_content_prepare();
Scott committed
97

Scott committed
98
$qa_content['title'] = qa_lang_html('users/confirm_title');
99
$qa_content['error'] = $pageError;
Scott committed
100

101
if ($emailConfirmationSent) {
102
	$qa_content['success'] = qa_lang_html('users/confirm_emailed');
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121

	$email = qa_get_logged_in_email();
	$handle = qa_get_logged_in_handle();

	$qa_content['form'] = array(
		'tags' => 'method="post" action="' . qa_self_html() . '"',

		'style' => 'tall',

		'fields' => array(
			'email' => array(
				'label' => qa_lang_html('users/email_label'),
				'value' => qa_html($email) . strtr(qa_lang_html('users/change_email_link'), array(
						'^1' => '<a href="' . qa_path_html('account') . '">',
						'^2' => '</a>',
					)),
				'type' => 'static',
			),
			'code' => array(
122
				'label' => qa_lang_html('users/email_code_label'),
123 124
				'tags' => 'name="code" id="code"',
				'value' => isset($code) ? qa_html($code) : null,
125 126
				'note' => qa_lang_html('users/email_code_emailed') . ' - ' .
					'<a href="' . qa_path_html('confirm') . '">' . qa_lang_html('users/email_code_another') . '</a>',
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
			),
		),

		'buttons' => array(
			'confirm' => array( // This button does not actually need a name attribute
				'label' => qa_lang_html('users/confirm_button'),
			),
		),

		'hidden' => array(
			'formcode' => qa_get_form_security_code('confirm'),
			'username' => qa_html($handle),
		),
	);

	$qa_content['focusid'] = 'code';
143
} elseif ($userConfirmed) {
144
	$qa_content['success'] = qa_lang_html('users/confirm_complete');
Scott committed
145

146
	if (!isset($loggedInUserId)) {
Scott committed
147 148 149
		$qa_content['suggest_next'] = strtr(
			qa_lang_html('users/log_in_to_access'),
			array(
150
				'^1' => '<a href="' . qa_path_html('login', array('e' => $handle)) . '">',
Scott committed
151 152 153 154
				'^2' => '</a>',
			)
		);
	}
155
} elseif (isset($loggedInUserId)) { // if logged in, allow sending a fresh link
Scott committed
156
	require_once QA_INCLUDE_DIR . 'util/string.php';
Scott committed
157

158
	if (strlen($code) > 0) {
Scott committed
159
		$qa_content['error'] = qa_lang_html('users/confirm_wrong_resend');
160
	}
Scott committed
161

Scott committed
162
	$email = qa_get_logged_in_email();
Scott committed
163

Scott committed
164 165
	$qa_content['form'] = array(
		'tags' => 'method="post" action="' . qa_path_html('confirm') . '"',
Scott committed
166

Scott committed
167
		'style' => 'tall',
Scott committed
168

Scott committed
169 170 171 172 173
		'fields' => array(
			'email' => array(
				'label' => qa_lang_html('users/email_label'),
				'value' => qa_html($email) . strtr(qa_lang_html('users/change_email_link'), array(
						'^1' => '<a href="' . qa_path_html('account') . '">',
Scott committed
174 175
						'^2' => '</a>',
					)),
Scott committed
176
				'type' => 'static',
Scott committed
177
			),
Scott committed
178
		),
Scott committed
179

Scott committed
180 181 182 183
		'buttons' => array(
			'send' => array(
				'tags' => 'name="dosendconfirm"',
				'label' => qa_lang_html('users/send_confirm_button'),
Scott committed
184
			),
Scott committed
185
		),
Scott committed
186

Scott committed
187
		'hidden' => array(
188
			'formcode' => qa_get_form_security_code('confirm'),
Scott committed
189 190
		),
	);
Scott committed
191

Scott committed
192 193 194 195
	if (!qa_email_validate($email)) {
		$qa_content['error'] = qa_lang_html('users/email_invalid');
		unset($qa_content['form']['buttons']['send']);
	}
196
} else { // User is not logged in
Scott committed
197
	$qa_content['error'] = qa_insert_login_links(qa_lang_html('users/confirm_wrong_log_in'), 'confirm');
198
}
Scott committed
199

Scott committed
200
return $qa_content;