Skip to content
wiki.fftac.org

Membership - Source Excerpt 04

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

wp_safe_redirect(antichrist_engine_membership_build_notice_url(
        $safe_redirect,
        'success',
        'register',
        'registered'
    ));
    exit;
}
add_action('admin_post_nopriv_antichrist_engine_membership_register', 'antichrist_engine_membership_handle_register');

/**
 * Handles lost password requests from the front-end portal.
 *
 * @return void
 */
function antichrist_engine_membership_handle_recovery()
{
    check_admin_referer('antichrist_engine_membership_recover');

    $portal_url = antichrist_engine_membership_get_portal_url('recover');
    $identifier = antichrist_engine_security_sanitize_text_field(antichrist_engine_security_get_post_value('user_login'), 190);

    $submission_error = antichrist_engine_security_validate_form_submission();

    if ($submission_error) {
        wp_safe_redirect(antichrist_engine_membership_build_notice_url(
            $portal_url,
            'error',
            'recover',
            $submission_error
        ));
        exit;
    }

    if (!antichrist_engine_security_check_rate_limit('membership_recover', 5, HOUR_IN_SECONDS)) {
        wp_safe_redirect(antichrist_engine_membership_build_notice_url(
            $portal_url,
            'error',
            'recover',
            'rate_limited'
        ));
        exit;
    }

    if (!$identifier) {
        wp_safe_redirect(antichrist_engine_membership_build_notice_url(
            $portal_url,
            'error',
            'recover',
            'empty_identifier'
        ));
        exit;
    }

    $result = retrieve_password($identifier);

    if (is_wp_error($result) && !in_array('invalidcombo', $result->get_error_codes(), true)) {
        wp_safe_redirect(antichrist_engine_membership_build_notice_url(
            $portal_url,
            'error',
            'recover',
            'recovery_failed'
        ));
        exit;
    }

    wp_safe_redirect(antichrist_engine_membership_build_notice_url(
        $portal_url,
        'success',
        'recover',
        'reset_sent'
    ));
    exit;
}
add_action('admin_post_nopriv_antichrist_engine_membership_recover', 'antichrist_engine_membership_handle_recovery');

/**
 * Handles front-end profile updates.
 *
 * @return void
 */
function antichrist_engine_membership_handle_profile_update()
{
    if (!is_user_logged_in()) {
        wp_safe_redirect(antichrist_engine_membership_build_notice_url(
            antichrist_engine_membership_get_portal_url('login'),
            'error',
            'login',
            'not_logged_in'
        ));
        exit;
    }

    check_admin_referer('antichrist_engine_membership_profile');

    $user_id      = get_current_user_id();
    $portal_url   = antichrist_engine_membership_get_page_url('portal');
    $display_name = antichrist_engine_security_sanitize_text_field(antichrist_engine_security_get_post_value('display_name'), 120);
    $email        = antichrist_engine_security_sanitize_email_field(antichrist_engine_security_get_post_value('user_email'), 190);
    $first_name   = antichrist_engine_security_sanitize_text_field(antichrist_engine_security_get_post_value('first_name'), 80);
    $last_name    = antichrist_engine_security_sanitize_text_field(antichrist_engine_security_get_post_value('last_name'), 80);
    $description  = antichrist_engine_security_sanitize_textarea_field(antichrist_engine_security_get_post_value('description'), 1000);
    $errors       = array();

    if (!$display_name) {
        $errors[] = 'empty_display_name';
    }

    if (!$email || !is_email($email)) {
        $errors[] = 'invalid_email';
    } else {
        $user_with_email = get_user_by('email', $email);

        if ($user_with_email instanceof WP_User && (int) $user_with_email->ID !== (int) $user_id) {
            $errors[] = 'email_exists';
        }
    }

    if ($errors) {
        wp_safe_redirect(antichrist_engine_membership_build_notice_url(
            $portal_url,
            'error',
            'profile',
            $errors
        ));
        exit;
    }

    $updated_user = wp_update_user(array(
        'ID'           => $user_id,
        'display_name' => $display_name,
        'user_email'   => $email,
        'first_name'   => $first_name,
        'last_name'    => $last_name,
        'description'  => $description,
    ));

    if (is_wp_error($updated_user)) {
        wp_safe_redirect(antichrist_engine_membership_build_notice_url(
            $portal_url,
            'error',
            'profile',
            'update_failed'
        ));
        exit;
    }

    if (function_exists('antichrist_engine_foundation_participants_database_sync_member')) {
        antichrist_engine_foundation_participants_database_sync_member((int) $user_id);
    }

    wp_safe_redirect(antichrist_engine_membership_build_notice_url(
        $portal_url,
        'success',
        'profile',
        'updated'
    ));
    exit;
}
add_action('admin_post_antichrist_engine_membership_profile', 'antichrist_engine_membership_handle_profile_update');

/**
 * Handles custom logout requests.
 *
 * @return void
 */
function antichrist_engine_membership_handle_logout()
{
    check_admin_referer('antichrist_engine_membership_logout');

    $redirect_to = isset($_GET['redirect_to']) ? rawurldecode(wp_unslash($_GET['redirect_to'])) : '';
    $redirect_to = antichrist_engine_membership_normalize_redirect(
        $redirect_to,
        antichrist_engine_membership_get_portal_url('login')
    );

    wp_logout();

    wp_safe_redirect(antichrist_engine_membership_build_notice_url(
        $redirect_to,
        'success',
        'login',
        'logged_out'
    ));
    exit;
}
add_action('admin_post_antichrist_engine_membership_logout', 'antichrist_engine_membership_handle_logout');

/**
 * Redirects visitors away from protected member pages.
 *
 * @return void
 */
function antichrist_engine_membership_protect_members_pages()
{
    if (is_admin() || is_user_logged_in() || !is_page()) {
        return;
    }

    if (!is_page_template('template-members-area.php')) {
        return;
    }

    $current_url = '';

    if (is_singular()) {
        $current_url = get_permalink();
    }

    $portal_url = antichrist_engine_membership_get_portal_url('login', array(
        'redirect_to' => antichrist_engine_membership_normalize_redirect(
            $current_url,
            antichrist_engine_membership_get_page_url('members')
        ),
    ));

    wp_safe_redirect(antichrist_engine_membership_build_notice_url(
        $portal_url,
        'error',
        'login',
        'not_logged_in'
    ));
    exit;
}
add_action('template_redirect', 'antichrist_engine_membership_protect_members_pages');

/**
 * Keeps members out of the WordPress dashboard.
 *
 * @return void
 */
function antichrist_engine_membership_limit_dashboard_access()
{
    if (!is_user_logged_in() || current_user_can('edit_posts') || wp_doing_ajax()) {
        return;
    }

    $current_screen = $GLOBALS['pagenow'] ?? '';

    if (in_array($current_screen, array('admin-post.php', 'async-upload.php'), true)) {
        return;
    }

    wp_safe_redirect(antichrist_engine_membership_get_page_url('portal'));
    exit;
}
add_action('admin_init', 'antichrist_engine_membership_limit_dashboard_access');

/**
 * Sends members to the front-end portal after login.
 *
 * @param string           $redirect_to           Resolved redirect URL.
 * @param string           $requested_redirect_to Requested redirect URL.
 * @param WP_User|WP_Error $user                  Logged-in user object.
 * @return string
 */
function antichrist_engine_membership_login_redirect($redirect_to, $requested_redirect_to, $user)
{
    if (!$user instanceof WP_User || user_can($user, 'edit_posts')) {
        return $redirect_to;
    }

    if ($requested_redirect_to) {
        return antichrist_engine_membership_normalize_redirect(
            $requested_redirect_to,
            antichrist_engine_membership_get_page_url('members')
        );
    }

    return antichrist_engine_membership_get_page_url('members');
}
add_filter('login_redirect', 'antichrist_engine_membership_login_redirect', 10, 3);

/**
 * Hides the admin bar for members using the front-end portal.
 *
 * @param bool $show_admin_bar Existing setting.
 * @return bool
 */
function antichrist_engine_membership_show_admin_bar($show_admin_bar)
{
    if (is_user_logged_in() && !current_user_can('edit_posts')) {
        return false;
    }

    return $show_admin_bar;
}
add_filter('show_admin_bar', 'antichrist_engine_membership_show_admin_bar');