You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

157 lines
3.2 KiB
PHP

<?php
/**
* Google Authentication wrapper.
*
* @since 1.0.49
* @package RankMath
* @subpackage RankMath\modules
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Google;
use RankMath\Helpers\Str;
use RankMath\Data_Encryption;
use RankMath\Helpers\Param;
use RankMath\Helpers\Security;
defined( 'ABSPATH' ) || exit;
/**
* Authentication class.
*/
class Authentication {
/**
* API version.
*
* @var string
*/
protected static $api_version = '2.1';
/**
* Get or update token data.
*
* @param bool|array $data Data to save.
* @return bool|array
*/
public static function tokens( $data = null ) {
$key = 'rank_math_google_oauth_tokens';
$encrypt_keys = [
'access_token',
'refresh_token',
];
// Clear data.
if ( false === $data ) {
delete_option( $key );
return false;
}
$saved = get_option( $key, [] );
foreach ( $encrypt_keys as $enc_key ) {
if ( isset( $saved[ $enc_key ] ) ) {
$saved[ $enc_key ] = Data_Encryption::deep_decrypt( $saved[ $enc_key ] );
}
}
// Getter.
if ( is_null( $data ) ) {
return wp_parse_args( $saved, [] );
}
// Setter.
foreach ( $encrypt_keys as $enc_key ) {
if ( isset( $saved[ $enc_key ] ) ) {
$saved[ $enc_key ] = Data_Encryption::deep_encrypt( $saved[ $enc_key ] );
}
if ( isset( $data[ $enc_key ] ) ) {
$data[ $enc_key ] = Data_Encryption::deep_encrypt( $data[ $enc_key ] );
}
}
$data = wp_parse_args( $data, $saved );
update_option( $key, $data );
return $data;
}
/**
* Is google authorized.
*
* @return boolean
*/
public static function is_authorized() {
$tokens = self::tokens();
return isset( $tokens['access_token'] ) && isset( $tokens['refresh_token'] );
}
/**
* Check if token is expired.
*
* @return boolean
*/
public static function is_token_expired() {
$tokens = self::tokens();
return $tokens['expire'] && time() > $tokens['expire'];
}
/**
* Get oauth url.
*
* @return string
*/
public static function get_auth_url() {
$page = self::get_page_slug();
return Security::add_query_arg_raw(
[
'version' => defined( 'RANK_MATH_PRO_VERSION' ) ? 'pro' : 'free',
'api_version' => static::$api_version,
'redirect_uri' => rawurlencode( admin_url( 'admin.php?page=' . $page ) ),
'security' => wp_create_nonce( 'rank_math_oauth_token' ),
],
self::get_auth_app_url()
);
}
/**
* Google custom app.
*
* @return string
*/
public static function get_auth_app_url() {
return apply_filters( 'rank_math/analytics/app_url', 'https://oauth.rankmath.com' );
}
/**
* Get page slug according to request.
*
* @return string
*/
public static function get_page_slug() {
$page = Param::get( 'page' );
if ( ! empty( $page ) ) {
switch ( $page ) {
case 'rank-math-wizard':
return 'rank-math-wizard&step=analytics';
case 'rank-math-analytics':
return 'rank-math-analytics';
default:
return 'rank-math-options-general#setting-panel-analytics';
}
}
$page = wp_get_referer();
if ( ! empty( $page ) && Str::contains( 'wizard', $page ) ) {
return 'rank-math-wizard&step=analytics';
}
return 'rank-math-options-general#setting-panel-analytics';
}
}