diff --git a/README.md b/README.md index 95b0bca..8b557c0 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ Installing "User Session Synchronizer" can be done either by searching for "User - Tags: user, session, synchronizer, cookie - Requires at least: 4.3 - Tested up to: 4.3 -- Stable tag: 1.1 +- Stable tag: 1.2 - License: GPLv3 or later - License URI: http://www.gnu.org/licenses/gpl-3.0.html @@ -59,6 +59,14 @@ This plugin template is designed to Keep the user logged in from one wordpress t ## Changelog ## +### 1.2 +* 2016-09-26 +* Multiple subfolders under same domain + +### 1.1 +* 2016-09-22 +* Theme footer hooked + ### 1.0 * 2016-09-06 * Initial release diff --git a/includes/class-user-session-synchronizer.php b/includes/class-user-session-synchronizer.php index 1bf32a8..496affb 100644 --- a/includes/class-user-session-synchronizer.php +++ b/includes/class-user-session-synchronizer.php @@ -1,706 +1,60 @@ _version = $version; - $this->_token = 'user-session-synchronizer'; - - // Load plugin environment variables - $this->file = $file; - $this->dir = dirname( $this->file ); - $this->assets_dir = trailingslashit( $this->dir ) . 'assets'; - $this->assets_url = esc_url( trailingslashit( plugins_url( '/assets/', $this->file ) ) ); - - $this->script_suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; - - // set user ip - - if (!empty($_SERVER['HTTP_CLIENT_IP'])) { - - $this->user_ip = $_SERVER['HTTP_CLIENT_IP']; - } - elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { - - $this->user_ip = $_SERVER['HTTP_X_FORWARDED_FOR']; - } - else { - - $this->user_ip = $_SERVER['REMOTE_ADDR']; + * Add donation link + * + */ + function user_session_synchronizer_row_meta( $links, $file ){ + if ( strpos( $file, basename( __FILE__ ) ) !== false ) { + $new_links = array( '' . __( 'Donate', 'cleanlogin' ) . '' ); + $links = array_merge( $links, $new_links ); } - - // set user agent - - $this->user_agent = $_SERVER ['HTTP_USER_AGENT']; - - // register plugin activation hook - - register_activation_hook( $this->file, array( $this, 'install' ) ); - - // Load frontend JS & CSS - add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_styles' ), 10 ); - add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ), 10 ); - - // Load admin JS & CSS - add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ), 10, 1 ); - add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_styles' ), 10, 1 ); - - // Load API for generic admin functions - if ( is_admin() ) { - - $this->admin = new User_Session_Synchronizer_Admin_API(); - } - - // Handle localisation - $this->load_plugin_textdomain(); - add_action( 'init', array( $this, 'load_localisation' ), 0 ); - - // Handle login synchronization - add_action( 'init', array( $this, 'ussync_synchronize_session' ), 0 ); - - // Handle profile updates - add_action( 'user_profile_update_errors', array( $this, 'ussync_prevent_email_change'), 10, 3 ); - add_action( 'admin_init', array( $this, 'ussync_user_profile_fields_disable')); - - } // End __construct () - - public function ussync_prevent_email_change( $errors, $update, $user ) { - - $old = get_user_by('id', $user->ID); - - if( $user->user_email != $old->user_email && (!current_user_can('create_users')) ) - $user->user_email = $old->user_email; + return $links; } + add_filter('plugin_row_meta', 'user_session_synchronizer_row_meta', 10, 2); + + // Load plugin class files + require_once( 'includes/class-user-session-synchronizer.php' ); + require_once( 'includes/class-user-session-synchronizer-email-verification.php' ); + require_once( 'includes/class-user-session-synchronizer-settings.php' ); + require_once( 'includes/class-user-session-synchronizer-session-control.php' ); - public function ussync_user_profile_fields_disable() { - - global $pagenow; - - // apply only to user profile or user edit pages - if ($pagenow!=='profile.php' && $pagenow!=='user-edit.php') { - - return; - } - - // do not change anything for the administrator - if (current_user_can('administrator')) { - - return; - } - - add_action( 'admin_footer', array( $this,'ussync_user_profile_fields_disable_js' )); - } - - + // Load plugin libraries + require_once( 'includes/lib/class-user-session-synchronizer-admin-api.php' ); + require_once( 'includes/lib/class-user-session-synchronizer-post-type.php' ); + require_once( 'includes/lib/class-user-session-synchronizer-taxonomy.php' ); + /** - * Disables selected fields in WP Admin user profile (profile.php, user-edit.php) + * Returns the main instance of User_Session_Synchronizer to prevent the need to use globals. + * + * @since 1.0.0 + * @return object User_Session_Synchronizer */ - public function ussync_user_profile_fields_disable_js() { - - ?> - - user_id = get_current_user_id(); + function User_Session_Synchronizer () { - // check user verified + $instance = User_Session_Synchronizer::instance( __FILE__, '1.0.0' ); - if( current_user_can('administrator') ) { - - $this->user_verified = 'true'; - } - else{ - - $this->user_verified = get_user_meta( $this->user_id, "ussync_email_verified", TRUE); + if ( is_null( $instance->emailVerification ) ) { + $instance->emailVerification = User_Session_Synchronizer_Email_Verification::instance( $instance ); } - // synchronize sessions - - if(isset($_GET['action'])&&$_GET['action']=='logout'){ - - $this-> ussync_call_domains(true); - } - elseif(isset($_GET['ussync-status']) && $_GET['ussync-status']=='loggedin'){ - - echo 'User logged in!'; - exit; - } - elseif(is_user_logged_in() && isset($_GET['redirect_to'])){ - - wp_safe_redirect( trim( $_GET['redirect_to'] ) ); - exit; - } - elseif(isset($_GET['ussync-token'])&&isset($_GET['ussync-id'])&&isset($_GET['ussync-ref'])){ - - // set secret key number - - $key_num=1; - - if(isset($_GET['ussync-key'])){ - - $key_num=(int)trim($_GET['ussync-key']); - } - - //decrypted user_name - - $user_name = trim($_GET['ussync-id']); - $user_name = $this->ussync_decrypt_uri($user_name, get_option('ussync_secret_key_'.$key_num) ); - - //decrypted user_name - - $user_ref = trim($_GET['ussync-ref']); - $user_ref = $this->ussync_decrypt_uri($user_ref, get_option('ussync_secret_key_'.$key_num) ); - - //decrypted user_email - - $user_email = trim($_GET['ussync-token']); - $user_email = $this->ussync_decrypt_uri($user_email, get_option('ussync_secret_key_'.$key_num) ); - - //set user ID - - $user_email = sanitize_email($user_email); - - //get valid domains - - $domains = get_option('ussync_domain_list_'.$key_num); - $domains = explode(PHP_EOL,$domains); - $domains = array_flip($domains); - - //check referer - - $valid_referer=false; - - if(isset($domains[$user_ref])){ - - $valid_referer=true; - } - - if($valid_referer===true){ - - if(isset($_GET['ussync-status']) && $_GET['ussync-status']=='loggingout'){ - - // Logout user - - if( $user = get_user_by('email', $user_email ) ){ - - // get all sessions for user with ID - $sessions = WP_Session_Tokens::get_instance($user->ID); - - // we have got the sessions, destroy them all! - $sessions->destroy_all(); - - echo 'User logged out...'; - exit; - } - else{ - - $this->ussync_decrypt_uri($_GET['ussync-token'], get_option('ussync_secret_key_'.$key_num) ); - - echo 'Error logging out...'; - exit; - } - } - else{ - - $current_user = wp_get_current_user(); - - if(!is_user_logged_in() || $current_user->user_email != $user_email){ - - // check if the user exists - - if( !email_exists( $user_email ) ){ - - $ussync_no_user = get_option('ussync_no_user_'.$key_num); - - if($ussync_no_user=='register_suscriber'){ - - // register new suscriber - - $user_data = array( - 'user_login' => $user_name, - 'user_email' => $user_email, - ); - - if( get_userdatabylogin($user_name) ){ - - echo 'User name already exists!'; - exit; - } - elseif( $user_id = wp_insert_user( $user_data ) ) { - - // update email status - - add_user_meta( $user_id, 'ussync_email_verified', 'true'); - } - else{ - - echo 'Error creating a new user!'; - exit; - } - } - else{ - - echo 'This user doesn\'t exist...'; - exit; - } - } - - if($current_user->user_email != $user_email){ - - //destroy current user session - - $sessions = WP_Session_Tokens::get_instance($current_user->ID); - $sessions->destroy_all(); - } - - if($user=get_user_by('email',$user_email)){ - - //do the authentication - - clean_user_cache($user->ID); - - wp_clear_auth_cookie(); - wp_set_current_user( $user->ID ); - wp_set_auth_cookie( $user->ID , true, false); - - update_user_caches($user); - - if(is_user_logged_in()){ - - //redirect after authentication - - wp_safe_redirect( rtrim( get_site_url(), '/' ) . '/?ussync-status=loggedin'); - } - } - else{ - - echo 'Error logging in...'; - exit; - } - } - else{ - - echo 'User already logged in...'; - exit; - } - } - } - else{ - - echo 'Host not allowed to synchronize...'; - exit; - } + if ( is_null( $instance->settings ) ) { + $instance->settings = User_Session_Synchronizer_Settings::instance( $instance ); } - elseif(is_user_logged_in() && !isset($_GET['ussync-token']) && $this->user_verified === 'true'){ - - //add footers - - if( is_admin() ) { - - add_action( 'admin_footer_text', array( $this, 'ussync_call_domains' )); - } - else{ - - add_action( 'wp_footer', array( $this, 'ussync_call_domains' )); - } - } - - } - - public function ussync_call_domains($loggingout=false){ - if($user = wp_get_current_user()){ - - //get secret key number - - $key_num = 1; - - //get secret key - - $secret_key=get_option('ussync_secret_key_'.$key_num); - - //get list of domains - - $domains = get_option('ussync_domain_list_'.$key_num); - $domains = explode(PHP_EOL,$domains); - - //get encrypted user name - - $user_name = $user->user_login; - $user_name = $this->ussync_encrypt_uri($user_name, $secret_key); - - //get encrypted user referer - - $user_ref = $_SERVER['HTTP_HOST']; - $user_ref = $this->ussync_encrypt_uri($user_ref, $secret_key); - - //get encrypted user email - - $user_email = $user->user_email; - $user_email = $this->ussync_encrypt_uri($user_email, $secret_key); - - //get current domain - - $current_domain = get_site_url(); - $current_domain = rtrim($current_domain,'/'); - $current_domain = preg_replace("(^https?://)", "", $current_domain); - - if(!empty($domains)){ - - foreach($domains as $domain){ - - $domain = trim($domain); - $domain = rtrim($domain,'/'); - $domain = preg_replace("(^https?://)", "", $domain); - - if($current_domain != $domain){ - - if($loggingout===true){ - - $opts = array( - 'http'=>array( - 'method'=>"GET", - 'header'=>"User-Agent: " . $this->user_agent . "\r\n" - ) - ); - - $context = stream_context_create($opts); - - file_get_contents('http://' . $domain . '/?ussync-token='.$user_email.'&ussync-key='.$key_num.'&ussync-id='.$user_name.'&ussync-ref='.$user_ref.'&ussync-status=loggingout'.'&_' . time(), false, $context); - } - else{ - - //output html - - echo ''; - } - } - } - } + if ( is_null( $instance->sessionControl ) ) { + $instance->sessionControl = User_Session_Synchronizer_Session_Control::instance( $instance ); } - } - - - private function ussync_encrypt_str($string, $secret_key){ - - $output = false; - $encrypt_method = "AES-256-CBC"; - - $secret_key = md5($secret_key); - - $secret_iv = md5($this->user_agent . $this->user_ip); - - // hash - $key = hash('sha256', $secret_key); - - // iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning - $iv = substr(hash('sha256', $secret_iv), 0, 16); - - $output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv); - $output = $this->ussync_base64_urlencode($output); - - return $output; - } - - private function ussync_decrypt_str($string, $secret_key){ - - $output = false; - - $encrypt_method = "AES-256-CBC"; - - $secret_key = md5($secret_key); - - $secret_iv = md5($this->user_agent . $this->user_ip); - - // hash - $key = hash('sha256', $secret_key); - - // iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning - $iv = substr(hash('sha256', $secret_iv), 0, 16); - - $output = openssl_decrypt($this->ussync_base64_urldecode($string), $encrypt_method, $key, 0, $iv); - - return $output; - } - - private function ussync_encrypt_uri($uri,$secret_key,$len=250,$separator='/'){ - - $uri = wordwrap($this->ussync_encrypt_str($uri,$secret_key),$len,$separator,true); - - return $uri; - } - - private function ussync_decrypt_uri($uri,$secret_key,$separator='/'){ - - $uri = $this->ussync_decrypt_str(str_replace($separator,'',$uri),$secret_key); - - return $uri; - } - - private function ussync_base64_urlencode($inputStr=''){ - - return strtr(base64_encode($inputStr), '+/=', '-_,'); - } - - private function ussync_base64_urldecode($inputStr=''){ - - return base64_decode(strtr($inputStr, '-_,', '+/=')); - } - - /** - * Wrapper function to register a new post type - * @param string $post_type Post type name - * @param string $plural Post type item plural name - * @param string $single Post type item single name - * @param string $description Description of post type - * @return object Post type class object - */ - public function register_post_type ( $post_type = '', $plural = '', $single = '', $description = '', $options = array() ) { - - if ( ! $post_type || ! $plural || ! $single ) return; - - $post_type = new User_Session_Synchronizer_Post_Type( $post_type, $plural, $single, $description, $options ); - - return $post_type; - } - - /** - * Wrapper function to register a new taxonomy - * @param string $taxonomy Taxonomy name - * @param string $plural Taxonomy single name - * @param string $single Taxonomy plural name - * @param array $post_types Post types to which this taxonomy applies - * @return object Taxonomy class object - */ - public function register_taxonomy ( $taxonomy = '', $plural = '', $single = '', $post_types = array(), $taxonomy_args = array() ) { - - if ( ! $taxonomy || ! $plural || ! $single ) return; - - $taxonomy = new User_Session_Synchronizer_Taxonomy( $taxonomy, $plural, $single, $post_types, $taxonomy_args ); - - return $taxonomy; + return $instance; } - /** - * Load frontend CSS. - * @access public - * @since 1.0.0 - * @return void - */ - public function enqueue_styles () { - - wp_register_style( $this->_token . '-frontend', esc_url( $this->assets_url ) . 'css/frontend.css', array(), $this->_version ); - wp_enqueue_style( $this->_token . '-frontend' ); - } // End enqueue_styles () - - /** - * Load frontend Javascript. - * @access public - * @since 1.0.0 - * @return void - */ - public function enqueue_scripts () { - wp_register_script( $this->_token . '-frontend', esc_url( $this->assets_url ) . 'js/frontend' . $this->script_suffix . '.js', array( 'jquery' ), $this->_version ); - wp_enqueue_script( $this->_token . '-frontend' ); - } // End enqueue_scripts () - - /** - * Load admin CSS. - * @access public - * @since 1.0.0 - * @return void - */ - public function admin_enqueue_styles ( $hook = '' ) { - wp_register_style( $this->_token . '-admin', esc_url( $this->assets_url ) . 'css/admin.css', array(), $this->_version ); - wp_enqueue_style( $this->_token . '-admin' ); - } // End admin_enqueue_styles () - - /** - * Load admin Javascript. - * @access public - * @since 1.0.0 - * @return void - */ - public function admin_enqueue_scripts ( $hook = '' ) { - wp_register_script( $this->_token . '-admin', esc_url( $this->assets_url ) . 'js/admin' . $this->script_suffix . '.js', array( 'jquery' ), $this->_version ); - wp_enqueue_script( $this->_token . '-admin' ); - } // End admin_enqueue_scripts () - - /** - * Load plugin localisation - * @access public - * @since 1.0.0 - * @return void - */ - public function load_localisation () { - load_plugin_textdomain( 'user-session-synchronizer', false, dirname( plugin_basename( $this->file ) ) . '/lang/' ); - } // End load_localisation () - - /** - * Load plugin textdomain - * @access public - * @since 1.0.0 - * @return void - */ - public function load_plugin_textdomain () { - $domain = 'user-session-synchronizer'; - - $locale = apply_filters( 'plugin_locale', get_locale(), $domain ); - - load_textdomain( $domain, WP_LANG_DIR . '/' . $domain . '/' . $domain . '-' . $locale . '.mo' ); - load_plugin_textdomain( $domain, false, dirname( plugin_basename( $this->file ) ) . '/lang/' ); - } // End load_plugin_textdomain () - - /** - * Main User_Session_Synchronizer Instance - * - * Ensures only one instance of User_Session_Synchronizer is loaded or can be loaded. - * - * @since 1.0.0 - * @static - * @see User_Session_Synchronizer() - * @return Main User_Session_Synchronizer instance - */ - public static function instance ( $file = '', $version = '1.0.0' ) { - if ( is_null( self::$_instance ) ) { - self::$_instance = new self( $file, $version ); - } - return self::$_instance; - } // End instance () - - /** - * Cloning is forbidden. - * - * @since 1.0.0 - */ - public function __clone () { - _doing_it_wrong( __FUNCTION__, __( 'Cheatin’ huh?' ), $this->_version ); - } // End __clone () - - /** - * Unserializing instances of this class is forbidden. - * - * @since 1.0.0 - */ - public function __wakeup () { - _doing_it_wrong( __FUNCTION__, __( 'Cheatin’ huh?' ), $this->_version ); - } // End __wakeup () - - /** - * Installation. Runs on activation. - * @access public - * @since 1.0.0 - * @return void - */ - public function install () { - $this->_log_version_number(); - } // End install () - - /** - * Log the plugin version number. - * @access public - * @since 1.0.0 - * @return void - */ - private function _log_version_number () { - update_option( $this->_token . '_version', $this->_version ); - } // End _log_version_number () -} \ No newline at end of file + User_Session_Synchronizer(); \ No newline at end of file diff --git a/readme.txt b/readme.txt index 8e494a9..91f3ca3 100644 --- a/readme.txt +++ b/readme.txt @@ -4,7 +4,7 @@ Donate link: https://www.paypal.me/recuweb Tags: user, session, synchronizer, cookie Requires at least: 4.3 Tested up to: 4.3 -Stable tag: 1.1 +Stable tag: 1.2 License: GPLv3 or later License URI: http://www.gnu.org/licenses/gpl-3.0.html @@ -56,6 +56,14 @@ This plugin template is designed to Keep the user logged in from one wordpress t == Changelog == += 1.2 = +* 2016-09-26 +* Multiple subfolders under same domain + += 1.1 = +* 2016-09-22 +* Theme footer hooked + = 1.0 = * 2016-09-02 * Initial release diff --git a/user-session-synchronizer.php b/user-session-synchronizer.php index f999e47..d986ec9 100644 --- a/user-session-synchronizer.php +++ b/user-session-synchronizer.php @@ -1,7 +1,7 @@