Skip to content
wiki.fftac.org

Membership - Source Excerpt 03

Back to Membership

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);
    }