diff options
Diffstat (limited to 'Postman/Postman-Mail/PostmanTransportRegistry.php')
-rw-r--r-- | Postman/Postman-Mail/PostmanTransportRegistry.php | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/Postman/Postman-Mail/PostmanTransportRegistry.php b/Postman/Postman-Mail/PostmanTransportRegistry.php new file mode 100644 index 0000000..4de782a --- /dev/null +++ b/Postman/Postman-Mail/PostmanTransportRegistry.php @@ -0,0 +1,253 @@ +<?php +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +require_once 'PostmanModuleTransport.php'; +require_once 'PostmanZendMailTransportConfigurationFactory.php'; + +/** + * + * @author jasonhendriks + */ +class PostmanTransportRegistry { + private $transports; + private $logger; + + /** + */ + private function __construct() { + $this->logger = new PostmanLogger( get_class( $this ) ); + } + + // singleton instance + public static function getInstance() { + static $inst = null; + if ( $inst === null ) { + $inst = new PostmanTransportRegistry(); + } + return $inst; + } + public function registerTransport( PostmanModuleTransport $instance ) { + $this->transports [ $instance->getSlug() ] = $instance; + $instance->init(); + } + public function getTransports() { + return $this->transports; + } + + /** + * Retrieve a Transport by slug + * Look up a specific Transport use: + * A) when retrieving the transport saved in the database + * B) when querying what a theoretical scenario involving this transport is like + * (ie.for ajax in config screen) + * + * @param mixed $slug + */ + public function getTransport( $slug ) { + $transports = $this->getTransports(); + if ( isset( $transports [ $slug ] ) ) { + return $transports [ $slug ]; + } + } + + /** + * A short-hand way of showing the complete delivery method + * + * @param PostmanModuleTransport $transport + * @return string + */ + public function getPublicTransportUri( PostmanModuleTransport $transport ) { + return $transport->getPublicTransportUri(); + } + + /** + * Determine if a specific transport is registered in the directory. + * + * @param mixed $slug + */ + public function isRegistered( $slug ) { + $transports = $this->getTransports(); + return isset( $transports [ $slug ] ); + } + + /** + * Retrieve the transport Postman is currently configured with. + * + * @return PostmanModuleTransport + * @deprecated + */ + public function getCurrentTransport() { + $selectedTransport = PostmanOptions::getInstance()->getTransportType(); + $transports = $this->getTransports(); + if ( ! isset( $transports [ $selectedTransport ] ) ) { + return $transports ['default']; + } else { + return $transports [ $selectedTransport ]; + } + } + + /** + * + * @param PostmanOptions $options + * @param PostmanOAuthToken $token + * @return boolean + */ + public function getActiveTransport() { + $selectedTransport = PostmanOptions::getInstance()->getTransportType(); + $transports = $this->getTransports(); + if ( isset( $transports [ $selectedTransport ] ) ) { + $transport = $transports [ $selectedTransport ]; + if ( $transport->getSlug() == $selectedTransport && $transport->isConfiguredAndReady() ) { + return $transport; + } + } + return $transports ['default']; + } + + /** + * Retrieve the transport Postman is currently configured with. + * + * @return PostmanModuleTransport + */ + public function getSelectedTransport() { + $selectedTransport = PostmanOptions::getInstance()->getTransportType(); + $transports = $this->getTransports(); + if ( isset( $transports [ $selectedTransport ] ) ) { + return $transports [ $selectedTransport ]; + } else { + return $transports ['default']; + } + } + + /** + * Determine whether to show the Request Permission link on the main menu + * + * This link is displayed if + * 1. the current transport requires OAuth 2.0 + * 2. the transport is properly configured + * 3. we have a valid Client ID and Client Secret without an Auth Token + * + * @param PostmanOptions $options + * @return boolean + */ + public function isRequestOAuthPermissionAllowed( PostmanOptions $options, PostmanOAuthToken $authToken ) { + // does the current transport use OAuth 2.0 + $oauthUsed = self::getSelectedTransport()->isOAuthUsed( $options->getAuthenticationType() ); + + // is the transport configured + if ( $oauthUsed ) { + $configured = self::getSelectedTransport()->isConfiguredAndReady(); + } + + return $oauthUsed && $configured; + } + + /** + * Polls all the installed transports to get a complete list of sockets to probe for connectivity + * + * @param mixed $hostname + * @param mixed $isGmail + * @return multitype: + */ + public function getSocketsForSetupWizardToProbe( $hostname = 'localhost', $smtpServerGuess = null ) { + $hosts = array(); + if ( $this->logger->isDebug() ) { + $this->logger->debug( sprintf( 'Getting sockets for Port Test given hostname %s and smtpServerGuess %s', $hostname, $smtpServerGuess ) ); + } + + $transports = $this->getTransports(); + if ( $hostname !== 'smtp.gmail.com' ) { + unset( $transports['gmail_api'] ); + } + foreach ( $transports as $transport ) { + $socketsToTest = $transport->getSocketsForSetupWizardToProbe( $hostname, $smtpServerGuess ); + if ( $this->logger->isTrace() ) { + $this->logger->trace( 'sockets to test:' ); + $this->logger->trace( $socketsToTest ); + } + $hosts = array_merge( $hosts, $socketsToTest ); + if ( $this->logger->isDebug() ) { + $this->logger->debug( sprintf( 'Transport %s returns %d sockets ', $transport->getName(), sizeof( $socketsToTest ) ) ); + } + } + return $hosts; + } + + /** + * If the host port is a possible configuration option, recommend it + * + * $hostData includes ['host'] and ['port'] + * + * response should include ['success'], ['message'], ['priority'] + * + * @param mixed $hostData + */ + public function getRecommendation( PostmanWizardSocket $hostData, $userAuthOverride, $originalSmtpServer ) { + $scrubbedUserAuthOverride = $this->scrubUserOverride( $hostData, $userAuthOverride ); + $transport = $this->getTransport( $hostData->transport ); + $recommendation = $transport->getConfigurationBid( $hostData, $scrubbedUserAuthOverride, $originalSmtpServer ); + if ( $this->logger->isDebug() ) { + $this->logger->debug( sprintf( 'Transport %s bid %s', $transport->getName(), $recommendation ['priority'] ) ); + } + return $recommendation; + } + + /** + * + * @param PostmanWizardSocket $hostData + * @param mixed $userAuthOverride + * @return NULL + */ + private function scrubUserOverride( PostmanWizardSocket $hostData, $userAuthOverride ) { + $this->logger->trace( 'before scrubbing userAuthOverride: ' . $userAuthOverride ); + + // validate userAuthOverride + if ( ! ($userAuthOverride == 'oauth2' || $userAuthOverride == 'password' || $userAuthOverride == 'none') ) { + $userAuthOverride = null; + } + + // validate the userAuthOverride + if ( ! $hostData->auth_xoauth ) { + if ( $userAuthOverride == 'oauth2' ) { + $userAuthOverride = null; + } + } + if ( ! $hostData->auth_crammd5 && ! $hostData->authPlain && ! $hostData->auth_login ) { + if ( $userAuthOverride == 'password' ) { + $userAuthOverride = null; + } + } + if ( ! $hostData->auth_none ) { + if ( $userAuthOverride == 'none' ) { + $userAuthOverride = null; + } + } + $this->logger->trace( 'after scrubbing userAuthOverride: ' . $userAuthOverride ); + return $userAuthOverride; + } + + /** + */ + public function getReadyMessage() { + if ( $this->getCurrentTransport()->isConfiguredAndReady() ) { + if ( PostmanOptions::getInstance()->getRunMode() != PostmanOptions::RUN_MODE_PRODUCTION ) { + return array( + 'error' => true, + 'message' => __( 'Postman is in <em>non-Production</em> mode and is dumping all emails.', 'post-smtp' ), + ); + } else { + return array( + 'error' => false, + 'message' => __( 'Postman is configured.', 'post-smtp' ), + ); + } + } else { + return array( + 'error' => true, + 'message' => __( 'Postman is <em>not</em> configured and is mimicking out-of-the-box WordPress email delivery.', 'post-smtp' ), + ); + } + } +} |