HEX
Server: Apache
System: Linux efa57bbe-abb1-400d-2985-3b056fbc2701.secureserver.net 6.1.147-1.el9.elrepo.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Jul 24 12:33:32 EDT 2025 x86_64
User: root (0)
PHP: 8.0.30.4
Disabled: NONE
Upload Files
File: /var/www/wp-content/mu-plugins/vendor/godaddy/mwc-core/src/Email/Http/EmailsServiceRequest.php
<?php

namespace GoDaddy\WordPress\MWC\Core\Email\Http;

use Exception;
use GoDaddy\WordPress\MWC\Common\Auth\AuthProviderFactory;
use GoDaddy\WordPress\MWC\Common\Auth\Exceptions\AuthProviderException;
use GoDaddy\WordPress\MWC\Common\Auth\Exceptions\CredentialsCreateFailedException;
use GoDaddy\WordPress\MWC\Common\Configuration\Configuration;
use GoDaddy\WordPress\MWC\Common\Contracts\GraphQLOperationContract;
use GoDaddy\WordPress\MWC\Common\Helpers\StringHelper;
use GoDaddy\WordPress\MWC\Common\Http\GraphQL\Request;
use GoDaddy\WordPress\MWC\Common\Http\GraphQL\Response;
use GoDaddy\WordPress\MWC\Common\Traits\CanGetNewInstanceTrait;
use GoDaddy\WordPress\MWC\Core\Email\Exceptions\EmailsServiceAuthProviderException;
use GoDaddy\WordPress\MWC\Core\Email\Http\GraphQL\Mutations\IssueTokenForSiteMutation;
use ReflectionException;

class EmailsServiceRequest
{
    use CanGetNewInstanceTrait;
    /* @var GraphQLOperationContract GraphQL operation that will be used in request. */
    protected $operation;

    /**
     * @param GraphQLOperationContract $operation
     * @return EmailsServiceRequest
     */
    public function setOperation(GraphQLOperationContract $operation) : EmailsServiceRequest
    {
        $this->operation = $operation;

        return $this;
    }

    /**
     * Sends request and may retry with refreshed token if response is unauthenticated.
     *
     * @return Response
     * @throws Exception
     */
    public function send() : Response
    {
        return $this->maybeRetryIfUnauthenticated($this->sendWithoutRetry());
    }

    /**
     * Sends request without retry.
     *
     * @return Response
     * @throws EmailsServiceAuthProviderException|Exception
     */
    protected function sendWithoutRetry() : Response
    {
        $request = (new Request($this->operation))
            ->setUrl($this->getApiUrl());

        if ($this->shouldAuth()) {
            try {
                $request->setAuthMethod(AuthProviderFactory::getNewInstance()->getEmailsServiceAuthProvider()->getMethod());
            } catch (ReflectionException|AuthProviderException|CredentialsCreateFailedException $exception) {
                throw new EmailsServiceAuthProviderException("Could not get authentication method: {$exception->getMessage()}", $exception);
            }
        }

        return $request->send();
    }

    /**
     * Checks response and, if response is unauthenticated and retries are allowed, may retry with refreshed token.
     *
     * @param Response $response
     * @return Response
     * @throws EmailsServiceAuthProviderException
     */
    protected function maybeRetryIfUnauthenticated(Response $response) : Response
    {
        if ($this->shouldAuth() && $this->isResponseUnauthenticatedError($response)) {
            try {
                AuthProviderFactory::getNewInstance()->getEmailsServiceAuthProvider()->deleteCredentials();
            } catch (ReflectionException|AuthProviderException $exception) {
                throw new EmailsServiceAuthProviderException("Could not delete credentials from cache: {$exception->getMessage()}", $exception);
            }

            return $this->sendWithoutRetry();
        }

        return $response;
    }

    /**
     * @return string
     * @throws Exception
     */
    protected function getApiUrl() : string
    {
        return Configuration::get('mwc.emails_service.api.url', '');
    }

    /**
     * Does this operation require an authorization header with token?
     *
     * @return bool
     */
    protected function shouldAuth() : bool
    {
        return ! is_a($this->operation, IssueTokenForSiteMutation::class);
    }

    /**
     * Is the given response from the service telling us it could not authenticate?
     *
     * @param Response $response
     * @return bool
     */
    protected function isResponseUnauthenticatedError(Response $response) : bool
    {
        $errorMessage = $response->getErrorMessage();

        return $errorMessage !== null && StringHelper::startsWith($errorMessage, 'Unauthenticated');
    }
}