Submit
Path:
~
/
home
/
bfxleof
/
www
/
wp-content
/
plugins
/
wordpress-seo
/
src
/
File Content:
semrush-client.php
<?php namespace Yoast\WP\SEO\Config; use Exception; use Yoast\WP\SEO\Exceptions\OAuth\Authentication_Failed_Exception; use Yoast\WP\SEO\Exceptions\SEMrush\Tokens\Empty_Property_Exception; use Yoast\WP\SEO\Exceptions\SEMrush\Tokens\Empty_Token_Exception; use Yoast\WP\SEO\Exceptions\SEMrush\Tokens\Failed_Storage_Exception; use Yoast\WP\SEO\Helpers\Options_Helper; use Yoast\WP\SEO\Values\SEMrush\SEMrush_Token; use Yoast\WP\SEO\Wrappers\WP_Remote_Handler; use YoastSEO_Vendor\GuzzleHttp\Client; use YoastSEO_Vendor\League\OAuth2\Client\Provider\Exception\IdentityProviderException; use YoastSEO_Vendor\League\OAuth2\Client\Provider\GenericProvider; /** * Class SEMrush_Client */ class SEMrush_Client { /** * The option's key. */ const TOKEN_OPTION = 'semrush_tokens'; /** * The provider. * * @var GenericProvider */ protected $provider; /** * The options helper. * * @var Options_Helper */ protected $options_helper; /** * The token. * * @var SEMrush_Token|null */ protected $token; /** * SEMrush_Client constructor. * * @param Options_Helper $options_helper The Options_Helper instance. * @param WP_Remote_Handler $wp_remote_handler The request handler. * * @throws Empty_Property_Exception Exception thrown if a token property is empty. */ public function __construct( Options_Helper $options_helper, WP_Remote_Handler $wp_remote_handler ) { $this->provider = new GenericProvider( [ 'clientId' => 'yoast', 'clientSecret' => 'YdqNsWwnP4vE54WO1ugThKEjGMxMAHJt', 'redirectUri' => 'https://oauth.semrush.com/oauth2/yoast/success', 'urlAuthorize' => 'https://oauth.semrush.com/oauth2/authorize', 'urlAccessToken' => 'https://oauth.semrush.com/oauth2/access_token', 'urlResourceOwnerDetails' => 'https://oauth.semrush.com/oauth2/resource', ], [ 'httpClient' => new Client( [ 'handler' => $wp_remote_handler ] ), ] ); $this->options_helper = $options_helper; $this->token = $this->get_token_from_storage(); } /** * Requests the access token and refresh token based on the passed code. * * @param string $code The code to send. * * @return SEMrush_Token The requested tokens. * * @throws Authentication_Failed_Exception Exception thrown if authentication has failed. */ public function request_tokens( $code ) { try { $response = $this->provider ->getAccessToken( 'authorization_code', [ 'code' => $code, ] ); $token = SEMrush_Token::from_response( $response ); return $this->store_token( $token ); } catch ( Exception $exception ) { throw new Authentication_Failed_Exception( $exception ); } } /** * Performs an authenticated GET request to the desired URL. * * @param string $url The URL to send the request to. * @param array $options The options to pass along to the request. * * @return mixed The parsed API response. * * @throws IdentityProviderException Exception thrown if there's something wrong with the identifying data. * @throws Authentication_Failed_Exception Exception thrown if authentication has failed. * @throws Empty_Token_Exception Exception thrown if the token is empty. */ public function get( $url, $options = [] ) { return $this->do_request( 'GET', $url, $options ); } /** * Performs an authenticated POST request to the desired URL. * * @param string $url The URL to send the request to. * @param mixed $body The data to send along in the request's body. * @param array $options The options to pass along to the request. * * @return mixed The parsed API response. * * @throws IdentityProviderException Exception thrown if there's something wrong with the identifying data. * @throws Authentication_Failed_Exception Exception thrown if authentication has failed. * @throws Empty_Token_Exception Exception thrown if the token is empty. */ public function post( $url, $body, $options = [] ) { $options['body'] = $body; return $this->do_request( 'POST', $url, $options ); } /** * Determines whether or not there are valid tokens available. * * @return bool Whether or not there are valid tokens. */ public function has_valid_tokens() { return ! empty( $this->token ) && $this->token->has_expired() === false; } /** * Gets the stored tokens and refreshes them if they've expired. * * @return SEMrush_Token The stored tokens. * * @throws Empty_Token_Exception Exception thrown if the token is empty. */ public function get_tokens() { if ( empty( $this->token ) ) { throw new Empty_Token_Exception(); } if ( $this->token->has_expired() ) { $this->token = $this->refresh_tokens( $this->token ); } return $this->token; } /** * Retrieves the token from storage. * * @return SEMrush_Token|null The token object. Returns null if none exists. * * @throws Empty_Property_Exception Exception thrown if a token property is empty. */ public function get_token_from_storage() { $tokens = $this->options_helper->get( self::TOKEN_OPTION ); if ( empty( $tokens ) ) { return null; } return new SEMrush_Token( $tokens['access_token'], $tokens['refresh_token'], $tokens['expires'], $tokens['has_expired'], $tokens['created_at'] ); } /** * Stores the passed token. * * @param SEMrush_Token $token The token to store. * * @return SEMrush_Token The stored token. * * @throws Failed_Storage_Exception Exception thrown if storing of the token fails. */ public function store_token( SEMrush_Token $token ) { $saved = $this->options_helper->set( self::TOKEN_OPTION, $token->to_array() ); if ( $saved === false ) { throw new Failed_Storage_Exception(); } return $token; } /** * Performs the specified request. * * @param string $method The HTTP method to use. * @param string $url The URL to send the request to. * @param array $options The options to pass along to the request. * * @return mixed The parsed API response. * * @throws IdentityProviderException Exception thrown if there's something wrong with the identifying data. * @throws Authentication_Failed_Exception Exception thrown if authentication has failed. * @throws Empty_Token_Exception Exception thrown if the token is empty. */ protected function do_request( $method, $url, array $options ) { $defaults = [ 'headers' => $this->provider->getHeaders(), 'params' => [ 'access_token' => $this->get_tokens()->access_token, ], ]; $options = \array_merge_recursive( $defaults, $options ); if ( \array_key_exists( 'params', $options ) ) { $url .= '?' . \http_build_query( $options['params'] ); unset( $options['params'] ); } $request = $this->provider ->getAuthenticatedRequest( $method, $url, null, $options ); return $this->provider->getParsedResponse( $request ); } /** * Refreshes the outdated tokens. * * @param SEMrush_Token $tokens The outdated tokens. * * @return SEMrush_Token The refreshed tokens. * * @throws Authentication_Failed_Exception Exception thrown if authentication has failed. */ protected function refresh_tokens( SEMrush_Token $tokens ) { try { $new_tokens = $this->provider->getAccessToken( 'refresh_token', [ 'refresh_token' => $tokens->refresh_token, ] ); $token = SEMrush_Token::from_response( $new_tokens ); return $this->store_token( $token ); } catch ( Exception $exception ) { throw new Authentication_Failed_Exception( $exception ); } } }
Edit
Rename
Chmod
Delete
FILE
FOLDER
Name
Size
Permission
Action
actions
---
0755
builders
---
0755
commands
---
0755
conditionals
---
0755
config
---
0755
deprecated
---
0755
generated
---
0755
generators
---
0755
helpers
---
0755
integrations
---
0755
loggers
---
0755
memoizers
---
0755
models
---
0755
presentations
---
0755
presenters
---
0755
repositories
---
0755
schema-templates
---
0755
surfaces
---
0755
wrappers
---
0755
-20260704220714.DS_Store
10234 bytes
0644
.DS_Store
10234 bytes
0644
AjaxController-20260705133136.php
2162 bytes
0644
AjaxController-20260705183033.php
2162 bytes
0644
BundleWriter.php
5687 bytes
0644
DownloadConfController-20260706014647.php
945 bytes
0644
DownloadConfController.php
945 bytes
0644
JsonSerializable.php
577 bytes
0644
LimitStream-20260705054834.php
4209 bytes
0644
LimitStream.php
4209 bytes
0644
README.md
2555 bytes
0644
RequestInterface-20260623153819.php
4894 bytes
0644
ResponseInterface-20260623144535.php
2639 bytes
0644
article-author-presenter.php
1116 bytes
0644
article-modified-time-presenter-20260705202036.php
609 bytes
0644
article-modified-time-presenter.php
609 bytes
0644
baidu-presenter.php
659 bytes
0644
bing-presenter.php
638 bytes
0644
bingbot-presenter.php
1674 bytes
0644
class-admin-utils-20260622095013.php
2147 bytes
0644
class-admin-utils.php
2147 bytes
0644
class-gutenberg-compatibility.php
2510 bytes
0644
class-helpscout-20260622185632.php
6972 bytes
0644
class-metabox-formatter.php
12602 bytes
0644
class-metabox-null-tab.php
425 bytes
0644
class-option-tab-20260623090320.php
1784 bytes
0644
class-option-tab.php
1784 bytes
0644
class-option-tabs-formatter.php
2321 bytes
0644
class-plugin-availability-20260622071513.php
8440 bytes
0644
class-plugin-conflict-20260622015355.php
8640 bytes
0644
class-sitemaps-admin-20260703023908-20260704114125.php
3665 bytes
0644
class-sitemaps-admin-20260703023908.php
3665 bytes
0644
class-taxonomy-columns.php
7324 bytes
0644
class-upgrade-history.php
2939 bytes
0644
class-wpseo-replacement-variable.php
1375 bytes
0644
class-wpseo-statistics-20260705041721.php
1443 bytes
0644
class-wpseo-statistics-20260705175804.php
1443 bytes
0644
class-wpseo-statistics.php
1443 bytes
0644
class-yoast-form.php
31520 bytes
0644
class-yoast-notification-center.php
23601 bytes
0644
class-yoast-plugin-conflict.php
10390 bytes
0644
class.archive.config.php
1364 bytes
0644
class.constants.php
150 bytes
0644
class.pack.database.php
30838 bytes
0644
class.web.services.php
7748 bytes
0644
controller.php
2441 bytes
0644
ctrl.package-20260623211610.php
17073 bytes
0644
ctrl.package.php
17073 bytes
0644
dashboard-1650-rtl.css
1634 bytes
0644
date-helper.php
2846 bytes
0644
define.php
4567 bytes
0644
description-presenter-20260623011438.php
1026 bytes
0644
duplicator-en_US-20260707044145.mo
582 bytes
0644
duplicator-en_US.mo
582 bytes
0644
duplicator-main.php
26907 bytes
0644
duplicator.php
1781 bytes
0644
elFinderPlugin-20260706080701.php
3331 bytes
0644
elFinderPlugin.php
3331 bytes
0644
elFinderVolumeLocalFileSystem.class-20260623050500-20260706064840.php
48544 bytes
0644
elFinderVolumeLocalFileSystem.class-20260623050500.php
48544 bytes
0644
elFinderVolumeLocalFileSystem.class.php
48544 bytes
0644
enhanced-data-presenter.php
1913 bytes
0644
environment-helper.php
596 bytes
0644
estimated-reading-time-20260703220613.php
1111 bytes
0644
estimated-reading-time.php
1111 bytes
0644
exceptions-20260706092326.php
708 bytes
0644
exceptions.php
708 bytes
0644
feature-flag-conditional.php
740 bytes
0644
html-helper.php
1353 bytes
0644
image-helper.php
10231 bytes
0644
inc.data.php
5121 bytes
0644
inc.validator.php
5401 bytes
0644
index-20260622104110.php
15 bytes
0644
index.php
0 bytes
0644
interface-sitemap-cache-data.php
1208 bytes
0644
loco-20260705054904.xml
657 bytes
0644
loco-20260705195541.php
5626 bytes
0644
loco.php
5626 bytes
0644
loco.xml
657 bytes
0644
manager.php
14659 bytes
0644
meta-fields-presenter.php
1600 bytes
0644
module.php
1297 bytes
0644
primary-category.php
1998 bytes
0644
quick-edit-handler-1650.js
1848 bytes
0644
root.php
1951 bytes
0644
route-interface.php
267 bytes
0644
semrush-client.php
7615 bytes
0644
toggle-switch-1650.css
7961 bytes
0644
uninstall.php
4401 bytes
0644
wordpress-seo-es_ES-20260705060233.json
25583 bytes
0644
wordpress-seo-es_ES.json
25583 bytes
0644
wordpress-seojs-ar.json
25925 bytes
0644
wordpress-seojs-bs_BA-20260707003557.json
13790 bytes
0644
wordpress-seojs-bs_BA.json
13790 bytes
0644
wordpress-seojs-es_CR-20260707082908.json
14212 bytes
0644
wordpress-seojs-es_CR.json
14212 bytes
0644
wordpress-seojs-fi.json
19387 bytes
0644
wordpress-seojs-gl_ES.json
20143 bytes
0644
wordpress-seojs-ja.json
21424 bytes
0644
wordpress-seojs-uk-20260707073921.json
26506 bytes
0644
wordpress-seojs-uk.json
26506 bytes
0644
wp-seo-main.php
17504 bytes
0644
N4ST4R_ID | Naxtarrr