summaryrefslogtreecommitdiff
path: root/Postman/Postman-Mail/PostmanTransportRegistry.php
diff options
context:
space:
mode:
Diffstat (limited to 'Postman/Postman-Mail/PostmanTransportRegistry.php')
-rw-r--r--Postman/Postman-Mail/PostmanTransportRegistry.php253
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' ),
+ );
+ }
+ }
+}