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.php237
1 files changed, 237 insertions, 0 deletions
diff --git a/Postman/Postman-Mail/PostmanTransportRegistry.php b/Postman/Postman-Mail/PostmanTransportRegistry.php
new file mode 100644
index 0000000..01a60bd
--- /dev/null
+++ b/Postman/Postman-Mail/PostmanTransportRegistry.php
@@ -0,0 +1,237 @@
+<?php
+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 unknown $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 unknown $slug
+ */
+ public function isRegistered($slug) {
+ $transports = $this->getTransports ();
+ return isset ( $transports [$slug] );
+ }
+
+ /**
+ * Retrieve the transport Postman is currently configured with.
+ *
+ * @return PostmanDummyTransport|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 PostmanDummyTransport|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 unknown $hostname
+ * @param unknown $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 ) );
+ }
+ foreach ( $this->getTransports () 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 unknown $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 unknown $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 __ ( 'Postman is in <em>non-Production</em> mode and is dumping all emails.', Postman::TEXT_DOMAIN );
+ } else {
+ return __ ( 'Postman is configured.', Postman::TEXT_DOMAIN );
+ }
+ } else {
+ return __ ( 'Postman is <em>not</em> configured and is mimicking out-of-the-box WordPress email delivery.', Postman::TEXT_DOMAIN );
+ }
+ }
+}