user_email; $server = 'activeauth.me'; $ikey = $options['aca_ikey']; $iaccount = $options['aca_iaccount']; $skey = $options['aca_skey']; $akey = get_option('aca_akey'); $aca = new ActiveAuth(); $secret = $aca->sign($username, $ikey, $skey, $akey); ?> Active Auth ' ?>
verify($response, $skey, $akey); if ($status) { remove_action('authenticate', 'wp_authenticate_username_password', 20); $user = get_user_by('email', $status); $user = new WP_User(0, $user->user_login); aca_set_cookie($user); return $user; } else { $user = new WP_Error('Authentication failed', 'Failed or expired two factor authentication'); return $user; } } $user = new WP_User(0, $username); if (!$user) { return null; } if(!aca_user_role($username)){ return null; } remove_action('authenticate', 'wp_authenticate_username_password', 20); $user = wp_authenticate_username_password(NULL, $username, $password); if (!is_a($user, 'WP_User')) { return $user; } else { sign_request($user); exit(); } } function aca_enabled() { $options = get_option('aca-options'); if ($options['aca_enabled'] == 1) { if ($options['aca_ikey'] != '' && $options['aca_skey'] != '' && $options['aca_iaccount'] != '') { return true; } } return false; } function aca_set_cookie($user) { global $ActiveAuthCookieName; global $ActiveSecAuthCookieName; $options = get_option('aca-options'); $ikey_b64 = base64_encode($options['aca_ikey']); $username_b64 = base64_encode($user->user_login); $expire = strtotime('+48 hours'); //Create http cookie $val = base64_encode(sprintf("%s|%s|%s|%s", $ActiveAuthCookieName, $username_b64, $ikey_b64, $expire)); $sig = aca_hash_hmac($val); $cookie = sprintf("%s|%s", $val, $sig); setcookie($ActiveAuthCookieName, $cookie, 0, COOKIEPATH, COOKIE_DOMAIN, false, true); if (COOKIEPATH != SITECOOKIEPATH){ setcookie($ActiveAuthCookieName, $cookie, 0, SITECOOKIEPATH, COOKIE_DOMAIN, false, true); } if (is_ssl()){ //Create https cookie $sec_val = base64_encode(sprintf("%s|%s|%s|%s", $ActiveSecAuthCookieName, $username_b64, $ikey_b64, $expire)); $sec_sig = aca_hash_hmac($sec_val); $sec_cookie = sprintf("%s|%s", $sec_val, $sec_sig); setcookie($ActiveSecAuthCookieName, $sec_cookie, 0, COOKIEPATH, COOKIE_DOMAIN, true, true); if (COOKIEPATH != SITECOOKIEPATH){ setcookie($ActiveSecAuthCookieName, $sec_cookie, 0, SITECOOKIEPATH, COOKIE_DOMAIN, true, true); } } } function aca_verify_auth() { if(!aca_enabled()){ return null; } if(is_user_logged_in()){ $user = wp_get_current_user(); if (!aca_verify_cookie($user) && aca_user_role($user->user_login)){ if (aca_uri_request()) { aca_set_cookie($user); } else { sign_request($user); } } } } function aca_uri_request() { if (isset($_SERVER['REQUEST_URI']) || (empty($_SERVER['QUERY_STRING']) && strpos($_SERVER['REQUEST_URI'], '?', 0))) { if (strpos($_SERVER['QUERY_STRING'], 'aca-settings')) { return true; } } } function aca_unset_cookie(){ global $ActiveAuthCookieName; global $ActiveSecAuthCookieName; setcookie($ActiveAuthCookieName, '', strtotime('-1 day'), COOKIEPATH, COOKIE_DOMAIN); setcookie($ActiveAuthCookieName, '', strtotime('-1 day'), SITECOOKIEPATH, COOKIE_DOMAIN); setcookie($ActiveSecAuthCookieName, '', strtotime('-1 day'), COOKIEPATH, COOKIE_DOMAIN); setcookie($ActiveSecAuthCookieName, '', strtotime('-1 day'), SITECOOKIEPATH, COOKIE_DOMAIN); } function aca_verify_cookie($user) { global $ActiveAuthCookieName; global $ActiveSecAuthCookieName; if (is_ssl() || isset($_COOKIE[$ActiveSecAuthCookieName])){ $duo_auth_cookie_name = $ActiveSecAuthCookieName; } else { $duo_auth_cookie_name = $ActiveAuthCookieName; } if(!isset($_COOKIE[$duo_auth_cookie_name])){ return false; } $cookie_list = explode('|', $_COOKIE[$duo_auth_cookie_name]); if (count($cookie_list) !== 2){ return false; } list($u_cookie_b64, $u_sig) = $cookie_list; if (!aca_verify_sig($u_cookie_b64, $u_sig)){ return false; } $cookie_content = explode('|', base64_decode($u_cookie_b64)); if (count($cookie_content) !== 4){ return false; } list($cookie_name, $cookie_username_b64, $cookie_ikey_b64, $expire) = $cookie_content; $options = get_option('aca-options', ''); if ($cookie_name !== $duo_auth_cookie_name || base64_decode($cookie_username_b64) !== $user->user_login || base64_decode($cookie_ikey_b64) !== $options['aca_ikey']){ return false; } $expire = intval($expire); if ($expire < strtotime('now')){ return false; } return true; } function aca_verify_sig($cookie, $u_sig){ $sig = aca_hash_hmac($cookie); if (aca_hash_hmac($sig) === aca_hash_hmac($u_sig)) { return true; } return false; } function aca_hash_hmac($data) { return hash_hmac('sha1', $data, get_option('aca_akey', '')); } function aca_user_role($username) { $wp_roles = aca_get_roles(); $user = new WP_User(0, $username); $all_roles = array(); foreach ($wp_roles->get_names() as $k=>$r) { $all_roles[$k] = $r; } $aca_roles = get_option('aca_roles', $all_roles); if(empty($user->roles)) { return true; } foreach ($user->roles as $role) { if (array_key_exists($role, $aca_roles)) { return true; } } return false; } function get_random_key($length=14) { $chars = array( 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'v', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'V', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' ); $char_count = count($chars); $key = ''; for($i=0; $i<$length; $i++){ $index = mt_rand(0, $char_count); shuffle($chars); $key .= $chars[$index]; } $key = $key.md5(time()); return str_shuffle($key); } function aca_get_roles() { global $wp_roles; $wp_roles = isset($wp_roles) ? $wp_roles : new WP_Roles(); return $wp_roles; } add_action('init', 'aca_verify_auth', 10); add_action('clear_auth_cookie', 'aca_unset_cookie', 10); add_filter('authenticate', 'authenticate_user', 10, 3); if(is_admin()) { $my_settings_page = new ActiveAuthSettings(plugin_basename(__FILE__)); } function aca_activation() { if(!get_option('aca_akey')){ add_option('aca_akey', get_random_key()); } } register_activation_hook( __FILE__, 'aca_activation' ); function aca_deactivation() { if(get_option('aca_akey')){ delete_option('aca_akey'); } if(get_option('aca_roles')){ delete_option('aca_roles'); } if(get_option('aca-options')){ delete_option('aca-options'); } } register_deactivation_hook( __FILE__, 'aca_deactivation' );