Add upstream
This commit is contained in:
		| @@ -0,0 +1,109 @@ | ||||
| <?php | ||||
|  | ||||
| if (!defined('ABSPATH')) die('No direct access allowed'); | ||||
|  | ||||
| class UpdraftPlus_Temporary_Clone_Auto_Login { | ||||
| 	 | ||||
| 	/** | ||||
| 	 * Constructor for the class. | ||||
| 	 */ | ||||
| 	public function __construct() { | ||||
| 		if (!empty($_REQUEST['uc_auto_login'])) add_action('wp_loaded', array($this, 'handle_url_actions')); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Log in the indicated user, if no user is currently logged in. Do verification before calling this function. | ||||
| 	 * | ||||
| 	 * @param WP_User $user - WP user object | ||||
| 	 */ | ||||
| 	public function autologin_user($user) { | ||||
| 		if (is_user_logged_in()) return; | ||||
| 		if (!is_object($user) || !is_a($user, 'WP_User')) return; | ||||
| 		delete_user_meta($user->ID, 'uc_allow_auto_login'); | ||||
| 		wp_set_current_user($user->ID, $user->user_login); | ||||
| 		wp_set_auth_cookie($user->ID); | ||||
| 		try { | ||||
| 			// WooCommerce (3.4.4) dies here. We catch and carry on to avoid confusing the user about something that nothing can be done about / is a one-time issue. | ||||
| 			do_action('wp_login', $user->user_login); | ||||
| 			if (wp_redirect(admin_url())) exit; | ||||
| 		} catch (Exception $e) { | ||||
| 			$log_message = 'Exception ('.get_class($e).') occurred during the wp_login action call: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')'; | ||||
| 			error_log($log_message); | ||||
| 		// @codingStandardsIgnoreLine | ||||
| 		} catch (Error $e) { | ||||
| 			$log_message = 'PHP Fatal error ('.get_class($e).') occurred during the wp_login action call. Error Message: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')'; | ||||
| 			error_log($log_message); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Pass in a WP_User object to get a login hash. The caller should/must first check that this user is aloud to autologin | ||||
| 	 * | ||||
| 	 * @param WP_User         $user     - WordPress user object | ||||
| 	 * @param boolean|integer $use_time - false or a timestamp | ||||
| 	 * | ||||
| 	 * @return string                   - a hash to log the user in | ||||
| 	 */ | ||||
| 	public static function get_autologin_key($user, $use_time = false) { | ||||
| 		if (false === $use_time) $use_time = time(); | ||||
| 		// Start of day | ||||
| 		$use_time = $use_time - ($use_time % 86400); | ||||
| 		if (!defined('UPDRAFTPLUS_UNIQUE_TOKEN')) return; | ||||
| 		$hash_it = $user->ID.'_'.$use_time.'_'.UPDRAFTPLUS_UNIQUE_TOKEN; | ||||
| 		$hash = hash('sha256', $hash_it); | ||||
| 		return $hash; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Called upon the WP action wp_loaded | ||||
| 	 * | ||||
| 	 * @return void | ||||
| 	 */ | ||||
| 	public function handle_url_actions() { | ||||
|  | ||||
| 		if (!isset($_SERVER['REQUEST_METHOD']) || 'GET' != $_SERVER['REQUEST_METHOD'] || !isset($_REQUEST['uc_auto_login'])) return; | ||||
|  | ||||
| 		if (0 == ($user_id = get_current_user_id())) { | ||||
|  | ||||
| 			if (isset($_REQUEST['uc_login']) && '' !== $_REQUEST['uc_login'] && !empty($_REQUEST['uc_lkey'])) { | ||||
|  | ||||
| 				if ($this->auto_login_key_matches($_REQUEST['uc_lkey'], $_REQUEST['uc_login'])) { | ||||
| 					$login_user = get_user_by('login', $_REQUEST['uc_login']); | ||||
| 					$allow_autolink = get_user_meta($login_user->ID, 'uc_allow_auto_login'); | ||||
|  | ||||
| 					if ($allow_autolink) { | ||||
| 						$this->autologin_user($login_user); | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Check an auto-login key. This does not perform any checks on the user - the caller should do these (e.g. do not allow for privileged users) | ||||
| 	 * | ||||
| 	 * @param String $check_key  - the key to check for validity | ||||
| 	 * @param String $user_login - login for the user renewing his licences | ||||
| 	 * | ||||
| 	 * @return boolean           - indicates if the check was successful or not | ||||
| 	 */ | ||||
| 	private function auto_login_key_matches($check_key, $user_login) { | ||||
|  | ||||
| 		$login_user = get_user_by('login', $user_login); | ||||
| 		if (is_a($login_user, 'WP_User')) { | ||||
| 			$time_now = time(); | ||||
| 			for ($i=0; $i <= apply_filters('uc_autologinexpirydays', 3); $i++) { | ||||
| 				$key = $this->get_autologin_key($login_user, $time_now - 86400*$i); | ||||
| 				if ($key && $key == $check_key) { | ||||
| 					return true; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return false; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| if (defined('UPDRAFTPLUS_THIS_IS_CLONE')) { | ||||
| 	$updraftplus_temporary_clone_auto_login = new UpdraftPlus_Temporary_Clone_Auto_Login(); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user