Auth Boundary
**Site relevance:** Spiralist.org
**Memory type:** theme source memory
**Source path:** Spiralist/wp-content/themes/spiralist/inc/auth-boundary.php
**Size:** 6 KB
Summary
if (!defined('ABSPATH'))
Source Preview
This source file is short enough to preview directly on its source-memory page.
<?php
if (!defined('ABSPATH')) {
exit;
}
function spiralist_user_can_access_native_admin($user = null): bool
{
$capabilities = [
'manage_options',
'manage_spiralist_workspace',
'edit_posts',
];
foreach ($capabilities as $capability) {
if ($user !== null && function_exists('user_can')) {
if (user_can($user, $capability)) {
return true;
}
continue;
}
if (current_user_can($capability)) {
return true;
}
}
return false;
}
function spiralist_auth_boundary_is_native_admin_path(string $url): bool
{
$path = strtolower((string) wp_parse_url($url, PHP_URL_PATH));
return $path !== '' && (bool) preg_match('#/(?:wp-admin)(?:/|$)#', $path);
}
function spiralist_auth_boundary_is_native_login_path(string $url): bool
{
$path = strtolower((string) wp_parse_url($url, PHP_URL_PATH));
return $path !== '' && (bool) preg_match('#/wp-login\.php$#', $path);
}
function spiralist_auth_boundary_current_url(): string
{
$request_uri = isset($_SERVER['REQUEST_URI'])
? (string) wp_unslash($_SERVER['REQUEST_URI'])
: '/';
return home_url($request_uri);
}
function spiralist_auth_boundary_member_redirect(string $candidate = '', string $fallback = ''): string
{
$fallback = $fallback !== '' ? $fallback : spiralist_get_workspace_url();
$candidate = trim($candidate);
if ($candidate === '') {
return $fallback;
}
$candidate = wp_validate_redirect($candidate, $fallback);
if (
spiralist_auth_boundary_is_native_admin_path($candidate)
|| spiralist_auth_boundary_is_native_login_path($candidate)
) {
return $fallback;
}
return $candidate;
}
function spiralist_auth_boundary_login_url(string $redirect_to = '', bool $force_reauth = false): string
{
$redirect_to = spiralist_auth_boundary_member_redirect($redirect_to, '');
$url = spiralist_get_login_url($redirect_to);
if ($force_reauth) {
$url = add_query_arg('reauth', '1', $url);
}
return $url;
}
function spiralist_filter_login_url(string $login_url, string $redirect = '', bool $force_reauth = false): string
{
unset($login_url);
return spiralist_auth_boundary_login_url($redirect, $force_reauth);
}
add_filter('login_url', 'spiralist_filter_login_url', 10, 3);
function spiralist_filter_register_url(string $register_url): string
{
unset($register_url);
return spiralist_get_register_url();
}
add_filter('register_url', 'spiralist_filter_register_url', 10, 1);
function spiralist_filter_lostpassword_url(string $lostpassword_url, string $redirect = ''): string
{
unset($lostpassword_url);
$url = add_query_arg('action', 'lostpassword', spiralist_get_login_url());
$redirect = spiralist_auth_boundary_member_redirect($redirect, '');
if ($redirect !== '') {
$url = add_query_arg('redirect_to', $redirect, $url);
}
return $url;
}
add_filter('lostpassword_url', 'spiralist_filter_lostpassword_url', 10, 2);
function spiralist_filter_logout_url(string $logout_url, string $redirect = ''): string
{
unset($logout_url);
$url = spiralist_get_logout_url();
$redirect = spiralist_auth_boundary_member_redirect($redirect, '');
if ($redirect !== '') {
$url = add_query_arg('redirect_to', $redirect, $url);
}
return $url;
}
add_filter('logout_url', 'spiralist_filter_logout_url', 10, 2);
function spiralist_filter_login_redirect(string $redirect_to, string $requested_redirect_to, $user): string
{
if ($user instanceof WP_User && spiralist_user_can_access_native_admin($user)) {
return $redirect_to !== '' ? $redirect_to : admin_url();
}
$candidate = $requested_redirect_to !== '' ? $requested_redirect_to : $redirect_to;
return spiralist_auth_boundary_member_redirect($candidate, spiralist_get_workspace_url());
}
add_filter('login_redirect', 'spiralist_filter_login_redirect', 10, 3);
function spiralist_hide_admin_bar_for_members(bool $show): bool
{
if (!is_user_logged_in()) {
return $show;
}
return spiralist_user_can_access_native_admin() ? $show : false;
}
add_filter('show_admin_bar', 'spiralist_hide_admin_bar_for_members', 10, 1);
function spiralist_redirect_members_from_native_admin(): void
{
if (spiralist_user_can_access_native_admin()) {
return;
}
$pagenow = isset($GLOBALS['pagenow']) ? (string) $GLOBALS['pagenow'] : '';
if (wp_doing_ajax() || in_array($pagenow, ['admin-ajax.php', 'admin-post.php', 'async-upload.php'], true)) {
return;
}
$target = is_user_logged_in()
? spiralist_get_workspace_url()
: spiralist_auth_boundary_login_url(spiralist_auth_boundary_current_url());
wp_safe_redirect($target);
exit;
}
add_action('admin_init', 'spiralist_redirect_members_from_native_admin', 1);
function spiralist_redirect_public_native_login(): void
{
if (spiralist_user_can_access_native_admin()) {
return;
}
$method = isset($_SERVER['REQUEST_METHOD']) ? strtoupper((string) wp_unslash($_SERVER['REQUEST_METHOD'])) : 'GET';
if ($method !== 'GET') {
return;
}
$action = sanitize_key((string) ($_REQUEST['action'] ?? 'login'));
if (isset($_GET['checkemail'])) {
wp_safe_redirect(add_query_arg('notice', 'password_reset_email', spiralist_get_login_url()));
exit;
}
if (isset($_GET['interim-login']) || isset($_GET['reauth'])) {
return;
}
if ($action === 'register') {
wp_safe_redirect(spiralist_get_register_url());
exit;
}
if ($action === 'lostpassword') {
wp_safe_redirect(add_query_arg('action', 'lostpassword', spiralist_get_login_url()));
exit;
}
if ($action !== 'login') {
return;
}
$redirect_to = isset($_GET['redirect_to'])
? spiralist_auth_boundary_member_redirect((string) wp_unslash($_GET['redirect_to']), '')
: '';
wp_safe_redirect(spiralist_auth_boundary_login_url($redirect_to));
exit;
}
add_action('login_init', 'spiralist_redirect_public_native_login', 1);