mirror of
https://github.com/godotengine/godot-question2answer.git
synced 2026-01-01 01:48:37 +03:00
264 lines
7.8 KiB
PHP
264 lines
7.8 KiB
PHP
<?php
|
|
/*
|
|
Question2Answer by Gideon Greenspan and contributors
|
|
http://www.question2answer.org/
|
|
|
|
Description: Controller for register page
|
|
|
|
|
|
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
|
|
*/
|
|
|
|
if (!defined('QA_VERSION')) { // don't allow this page to be requested directly from browser
|
|
header('Location: ../../');
|
|
exit;
|
|
}
|
|
|
|
require_once QA_INCLUDE_DIR . 'app/captcha.php';
|
|
require_once QA_INCLUDE_DIR . 'db/users.php';
|
|
|
|
|
|
if (qa_is_logged_in()) {
|
|
qa_redirect('');
|
|
}
|
|
|
|
// Check we're not using single-sign on integration, that we're not logged in, and we're not blocked
|
|
if (QA_FINAL_EXTERNAL_USERS) {
|
|
$request = qa_request();
|
|
$topath = qa_get('to'); // lets user switch between login and register without losing destination page
|
|
$userlinks = qa_get_login_links(qa_path_to_root(), isset($topath) ? $topath : qa_path($request, $_GET, ''));
|
|
|
|
if (!empty($userlinks['register'])) {
|
|
qa_redirect_raw($userlinks['register']);
|
|
}
|
|
qa_fatal_error('User registration should be handled by external code');
|
|
}
|
|
|
|
|
|
// Get information about possible additional fields
|
|
|
|
$show_terms = qa_opt('show_register_terms');
|
|
|
|
$userfields = qa_db_select_with_pending(
|
|
qa_db_userfields_selectspec()
|
|
);
|
|
|
|
foreach ($userfields as $index => $userfield) {
|
|
if (!($userfield['flags'] & QA_FIELD_FLAGS_ON_REGISTER))
|
|
unset($userfields[$index]);
|
|
}
|
|
|
|
|
|
// Check we haven't suspended registration, and this IP isn't blocked
|
|
|
|
if (qa_opt('suspend_register_users')) {
|
|
$qa_content = qa_content_prepare();
|
|
$qa_content['error'] = qa_lang_html('users/register_suspended');
|
|
return $qa_content;
|
|
}
|
|
|
|
if (qa_user_permit_error()) {
|
|
$qa_content = qa_content_prepare();
|
|
$qa_content['error'] = qa_lang_html('users/no_permission');
|
|
return $qa_content;
|
|
}
|
|
|
|
|
|
// Process submitted form
|
|
|
|
// Check that honeypot value wasn't changed before accepting registration
|
|
if (qa_clicked('doregister') && $_POST["url"] === "https://example.com") {
|
|
require_once QA_INCLUDE_DIR . 'app/limits.php';
|
|
|
|
if (qa_user_limits_remaining(QA_LIMIT_REGISTRATIONS)) {
|
|
require_once QA_INCLUDE_DIR . 'app/users-edit.php';
|
|
|
|
$inemail = qa_post_text('email');
|
|
$inpassword = qa_post_text('password');
|
|
$inhandle = qa_post_text('handle');
|
|
$interms = (int)qa_post_text('terms');
|
|
|
|
if (strpos(file_get_contents("https://api.stopforumspam.org/api?email=" . $inemail), '<appears>yes</appears>') != false) {
|
|
die('Spam registration detected.');
|
|
}
|
|
|
|
$inprofile = array();
|
|
foreach ($userfields as $userfield)
|
|
$inprofile[$userfield['fieldid']] = qa_post_text('field_' . $userfield['fieldid']);
|
|
|
|
if (!qa_check_form_security_code('register', qa_post_text('code'))) {
|
|
$pageerror = qa_lang_html('misc/form_security_again');
|
|
} else {
|
|
// core validation
|
|
$errors = array_merge(
|
|
qa_handle_email_filter($inhandle, $inemail),
|
|
qa_password_validate($inpassword)
|
|
);
|
|
|
|
// T&Cs validation
|
|
if ($show_terms && !$interms)
|
|
$errors['terms'] = qa_lang_html('users/terms_not_accepted');
|
|
|
|
// filter module validation
|
|
if (count($inprofile)) {
|
|
$filtermodules = qa_load_modules_with('filter', 'filter_profile');
|
|
foreach ($filtermodules as $filtermodule)
|
|
$filtermodule->filter_profile($inprofile, $errors, null, null);
|
|
}
|
|
|
|
if (qa_opt('captcha_on_register'))
|
|
qa_captcha_validate_post($errors);
|
|
|
|
if (empty($errors)) {
|
|
// register and redirect
|
|
qa_limits_increment(null, QA_LIMIT_REGISTRATIONS);
|
|
|
|
$userid = qa_create_new_user($inemail, $inpassword, $inhandle);
|
|
|
|
foreach ($userfields as $userfield)
|
|
qa_db_user_profile_set($userid, $userfield['title'], $inprofile[$userfield['fieldid']]);
|
|
|
|
qa_set_logged_in_user($userid, $inhandle);
|
|
|
|
$topath = qa_get('to');
|
|
|
|
if (isset($topath))
|
|
qa_redirect_raw(qa_path_to_root() . $topath); // path already provided as URL fragment
|
|
else
|
|
qa_redirect('');
|
|
}
|
|
}
|
|
|
|
} else
|
|
$pageerror = qa_lang('users/register_limit');
|
|
}
|
|
|
|
|
|
// Prepare content for theme
|
|
|
|
$qa_content = qa_content_prepare();
|
|
|
|
$qa_content['title'] = qa_lang_html('users/register_title');
|
|
|
|
$qa_content['error'] = @$pageerror;
|
|
|
|
$qa_content['form'] = array(
|
|
'tags' => 'method="post" action="' . qa_self_html() . '"',
|
|
|
|
'style' => 'tall',
|
|
|
|
'fields' => array(
|
|
'handle' => array(
|
|
'label' => qa_lang_html('users/handle_label'),
|
|
'tags' => 'name="handle" id="handle" dir="auto"',
|
|
'value' => qa_html(@$inhandle),
|
|
'error' => qa_html(@$errors['handle']),
|
|
),
|
|
|
|
'password' => array(
|
|
'type' => 'password',
|
|
'label' => qa_lang_html('users/password_label'),
|
|
'tags' => 'name="password" id="password" dir="auto"',
|
|
'value' => qa_html(@$inpassword),
|
|
'error' => qa_html(@$errors['password']),
|
|
),
|
|
|
|
'email' => array(
|
|
'label' => qa_lang_html('users/email_label'),
|
|
'tags' => 'name="email" id="email" dir="auto"',
|
|
'value' => qa_html(@$inemail),
|
|
'note' => qa_opt('email_privacy'),
|
|
'error' => qa_html(@$errors['email']),
|
|
),
|
|
|
|
// Honeypot field (not visible by users, hidden by CSS)
|
|
// Registration fails if this is changed from the default value
|
|
'url' => array(
|
|
'label' => '',
|
|
'tags' => 'name="url" id="url" dir="auto"',
|
|
'value' => "https://example.com",
|
|
'error' => qa_html(@$errors['email']),
|
|
),
|
|
),
|
|
|
|
'buttons' => array(
|
|
'register' => array(
|
|
'tags' => 'onclick="qa_show_waiting_after(this, false);"',
|
|
'label' => qa_lang_html('users/register_button'),
|
|
),
|
|
),
|
|
|
|
'hidden' => array(
|
|
'doregister' => '1',
|
|
'code' => qa_get_form_security_code('register'),
|
|
),
|
|
);
|
|
|
|
// prepend custom message
|
|
$custom = qa_opt('show_custom_register') ? trim(qa_opt('custom_register')) : '';
|
|
if (strlen($custom)) {
|
|
array_unshift($qa_content['form']['fields'], array(
|
|
'type' => 'custom',
|
|
'note' => $custom,
|
|
));
|
|
}
|
|
|
|
foreach ($userfields as $userfield) {
|
|
$value = @$inprofile[$userfield['fieldid']];
|
|
|
|
$label = trim(qa_user_userfield_label($userfield), ':');
|
|
if (strlen($label))
|
|
$label .= ':';
|
|
|
|
$qa_content['form']['fields'][$userfield['title']] = array(
|
|
'label' => qa_html($label),
|
|
'tags' => 'name="field_' . $userfield['fieldid'] . '"',
|
|
'value' => qa_html($value),
|
|
'error' => qa_html(@$errors[$userfield['fieldid']]),
|
|
'rows' => ($userfield['flags'] & QA_FIELD_FLAGS_MULTI_LINE) ? 8 : null,
|
|
);
|
|
}
|
|
|
|
if (qa_opt('captcha_on_register'))
|
|
qa_set_up_captcha_field($qa_content, $qa_content['form']['fields'], @$errors);
|
|
|
|
// show T&Cs checkbox
|
|
if ($show_terms) {
|
|
$qa_content['form']['fields']['terms'] = array(
|
|
'type' => 'checkbox',
|
|
'label' => trim(qa_opt('register_terms')),
|
|
'tags' => 'name="terms" id="terms"',
|
|
'value' => qa_html(@$interms),
|
|
'error' => qa_html(@$errors['terms']),
|
|
);
|
|
}
|
|
|
|
$loginmodules = qa_load_modules_with('login', 'login_html');
|
|
|
|
foreach ($loginmodules as $module) {
|
|
ob_start();
|
|
$module->login_html(qa_opt('site_url') . qa_get('to'), 'register');
|
|
$html = ob_get_clean();
|
|
|
|
if (strlen($html))
|
|
@$qa_content['custom'] .= '<br>' . $html . '<br>';
|
|
}
|
|
|
|
// prioritize 'handle' for keyboard focus
|
|
$qa_content['focusid'] = isset($errors['handle']) ? 'handle'
|
|
: (isset($errors['password']) ? 'password'
|
|
: (isset($errors['email']) ? 'email' : 'handle'));
|
|
|
|
|
|
return $qa_content;
|