Membership - Source Excerpt 03
Summary
This source excerpt preserves a bounded section of Anti-Christ.org/wp-content/plugins/fftac-membership/inc/membership.php so readers can inspect the evidence without opening the full source file.
**Source path:** Anti-Christ.org/wp-content/plugins/fftac-membership/inc/membership.php
'membership_status' => sanitize_key($status),
'membership_context' => sanitize_key($context),
'membership_codes' => implode(',', $codes),
);
return add_query_arg(array_merge($notice_args, $args), $url);
}
/**
* Generates a unique username for members.
*
* @param string $full_name Member full name.
* @param string $email Member email.
* @return string
*/
function antichrist_engine_membership_generate_username($full_name, $email)
{
$base = '';
if ($full_name) {
$base = sanitize_user(strtolower(str_replace(' ', '', $full_name)), true);
}
if (!$base && $email) {
$email_parts = explode('@', $email);
$base = sanitize_user(strtolower($email_parts[0]), true);
}
if (!$base) {
$base = 'member';
}
$candidate = $base;
$suffix = 1;
while (username_exists($candidate)) {
$candidate = $base . $suffix;
$suffix++;
}
return $candidate;
}
/**
* Splits a full name into first and last name values.
*
* @param string $full_name Raw full name.
* @return array<string, string>
*/
function antichrist_engine_membership_split_name($full_name)
{
$parts = preg_split('/\s+/', trim($full_name));
if (!$parts) {
return array(
'first_name' => '',
'last_name' => '',
);
}
$first_name = array_shift($parts);
return array(
'first_name' => $first_name ?: '',
'last_name' => implode(' ', $parts),
);
}
/**
* Handles member sign-in requests.
*
* @return void
*/
function antichrist_engine_membership_handle_login()
{
check_admin_referer('antichrist_engine_membership_login');
$portal_url = antichrist_engine_membership_get_portal_url('login');
$redirect_to = antichrist_engine_security_get_post_value('redirect_to');
$safe_redirect = antichrist_engine_membership_normalize_redirect(
$redirect_to,
antichrist_engine_membership_get_page_url('members')
);
$submission_error = antichrist_engine_security_validate_form_submission();
if ($submission_error) {
wp_safe_redirect(antichrist_engine_membership_build_notice_url(
$portal_url,
'error',
'login',
$submission_error,
array('redirect_to' => $safe_redirect)
));
exit;
}
if (!antichrist_engine_security_check_rate_limit('membership_login', 10, 15 * MINUTE_IN_SECONDS)) {
wp_safe_redirect(antichrist_engine_membership_build_notice_url(
$portal_url,
'error',
'login',
'rate_limited',
array('redirect_to' => $safe_redirect)
));
exit;
}
$user_login = antichrist_engine_security_sanitize_text_field(antichrist_engine_security_get_post_value('log'), 190);
$password = antichrist_engine_security_get_post_value('pwd');
$remember = !empty($_POST['rememberme']);
if (!$user_login || !$password || strlen($password) > 4096) {
wp_safe_redirect(antichrist_engine_membership_build_notice_url(
$portal_url,
'error',
'login',
!$user_login || !$password ? 'empty_fields' : 'invalid_credentials',
array('redirect_to' => $safe_redirect)
));
exit;
}
$user = wp_signon(array(
'user_login' => $user_login,
'user_password' => $password,
'remember' => $remember,
), is_ssl());
if (is_wp_error($user)) {
wp_safe_redirect(antichrist_engine_membership_build_notice_url(
$portal_url,
'error',
'login',
'invalid_credentials',
array('redirect_to' => $safe_redirect)
));
exit;
}
wp_safe_redirect($safe_redirect);
exit;
}
add_action('admin_post_nopriv_antichrist_engine_membership_login', 'antichrist_engine_membership_handle_login');
/**
* Handles new member registration requests.
*
* @return void
*/
function antichrist_engine_membership_handle_register()
{
check_admin_referer('antichrist_engine_membership_register');
$portal_url = antichrist_engine_membership_get_portal_url('register');
$redirect_to = antichrist_engine_security_get_post_value('redirect_to');
$safe_redirect = antichrist_engine_membership_normalize_redirect(
$redirect_to,
antichrist_engine_membership_get_page_url('members')
);
$full_name = antichrist_engine_security_sanitize_text_field(antichrist_engine_security_get_post_value('full_name'), 120);
$email = antichrist_engine_security_sanitize_email_field(antichrist_engine_security_get_post_value('user_email'), 190);
$password = antichrist_engine_security_get_post_value('user_password');
$confirm = antichrist_engine_security_get_post_value('confirm_password');
$errors = array();
$submission_error = antichrist_engine_security_validate_form_submission();
if ($submission_error) {
$errors[] = $submission_error;
}
if (!$submission_error && !antichrist_engine_security_check_rate_limit('membership_register', 5, HOUR_IN_SECONDS)) {
$errors[] = 'rate_limited';
}
if (!$full_name) {
$errors[] = 'empty_name';
}
if (!$email) {
$errors[] = 'empty_email';
} elseif (!is_email($email)) {
$errors[] = 'invalid_email';
} elseif (email_exists($email)) {
$errors[] = 'email_exists';
}
if (strlen($password) > 4096 || strlen($confirm) > 4096) {
$errors[] = 'password_too_long';
} elseif (strlen($password) < 8) {
$errors[] = 'weak_password';
}
if ($password !== $confirm) {
$errors[] = 'password_mismatch';
}
if ($errors) {
wp_safe_redirect(antichrist_engine_membership_build_notice_url(
$portal_url,
'error',
'register',
$errors,
array('redirect_to' => $safe_redirect)
));
exit;
}
$name_parts = antichrist_engine_membership_split_name($full_name);
$user_id = wp_insert_user(array(
'user_login' => antichrist_engine_membership_generate_username($full_name, $email),
'user_pass' => $password,
'user_email' => $email,
'display_name' => $full_name,
'first_name' => $name_parts['first_name'],
'last_name' => $name_parts['last_name'],
'role' => 'subscriber',
));
if (is_wp_error($user_id)) {
wp_safe_redirect(antichrist_engine_membership_build_notice_url(
$portal_url,
'error',
'register',
'registration_failed',
array('redirect_to' => $safe_redirect)
));
exit;
}
wp_set_current_user($user_id);
wp_set_auth_cookie($user_id, true);
if (function_exists('antichrist_engine_foundation_participants_database_sync_member')) {
antichrist_engine_foundation_participants_database_sync_member((int) $user_id);
}