summaryrefslogtreecommitdiff
path: root/Postman/Postman-Connectivity-Test/Postman-PortTest.php
diff options
context:
space:
mode:
authoryehudah <yehudah@b8457f37-d9ea-0310-8a92-e5e31aec5664>2019-11-25 08:22:35 +0000
committeryehudah <yehudah@b8457f37-d9ea-0310-8a92-e5e31aec5664>2019-11-25 08:22:35 +0000
commitc61784411988d36d9bbd93cd3a97e773990af342 (patch)
tree924e6e9dea2ba7b1eedb14d0c4b03a38aefdf179 /Postman/Postman-Connectivity-Test/Postman-PortTest.php
parent907ce8c044159ca8da6ccce3ec5362ac61e7c142 (diff)
downloadPost-SMTP-c61784411988d36d9bbd93cd3a97e773990af342.zip
Adding a folder
Diffstat (limited to 'Postman/Postman-Connectivity-Test/Postman-PortTest.php')
-rw-r--r--Postman/Postman-Connectivity-Test/Postman-PortTest.php286
1 files changed, 286 insertions, 0 deletions
diff --git a/Postman/Postman-Connectivity-Test/Postman-PortTest.php b/Postman/Postman-Connectivity-Test/Postman-PortTest.php
new file mode 100644
index 0000000..adbe530
--- /dev/null
+++ b/Postman/Postman-Connectivity-Test/Postman-PortTest.php
@@ -0,0 +1,286 @@
+<?php
+if ( ! defined( 'ABSPATH' ) ) {
+ exit; // Exit if accessed directly
+}
+
+require_once ("registered-domain-libs-master/PHP/effectiveTLDs.inc.php");
+require_once ("registered-domain-libs-master/PHP/regDomain.inc.php");
+
+/**
+ *
+ * @author jasonhendriks
+ *
+ */
+class PostmanPortTest {
+ private $errstr;
+ private $logger;
+ private $hostname;
+ public $hostnameDomainOnly;
+ private $port;
+ private $connectionTimeout;
+ private $readTimeout;
+ public $reportedHostname;
+ public $reportedHostnameDomainOnly;
+ public $protocol;
+ public $secure;
+ public $mitm;
+ public $http;
+ public $https;
+ public $smtp;
+ public $smtps;
+ public $startTls;
+ public $checkStartTls;
+ public $authLogin;
+ public $authPlain;
+ public $authCrammd5;
+ public $authXoauth;
+ public $authNone;
+ public $trySmtps;
+
+ //
+ const SMTPS_PROTOCOL = 'SMTPS';
+
+ /**
+ */
+ public function __construct($hostname, $port) {
+ $this->logger = new PostmanLogger ( get_class ( $this ) );
+ $this->hostname = $hostname;
+ $this->hostnameDomainOnly = $this->getRegisteredDomain ( $hostname );
+ $this->port = $port;
+ $this->connectionTimeout = 10;
+ $this->readTimeout = 10;
+ }
+
+ /**
+ * Wrap the regDomain/getRegisteredDomain function
+ *
+ * @param mixed $domain
+ * @return mixed
+ */
+ private function getRegisteredDomain($hostname) {
+ $registeredDomain = getRegisteredDomain ( $hostname );
+ if ($registeredDomain === NULL) {
+ return $hostname;
+ }
+ return $registeredDomain;
+ }
+ public function setConnectionTimeout($timeout) {
+ $this->connectionTimeout = $timeout;
+ $this->logger->trace ( $this->connectionTimeout );
+ }
+ public function setReadTimeout($timeout) {
+ $this->readTimeout = $timeout;
+ $this->logger->trace ( $this->readTimeout );
+ }
+ private function createStream($connectionString) {
+ $stream = @stream_socket_client ( $connectionString, $errno, $errstr, $this->connectionTimeout );
+ if ($stream) {
+ $this->trace ( sprintf ( 'connected to %s', $connectionString ) );
+ } else {
+ $this->trace ( sprintf ( 'Could not connect to %s because %s [%s]', $connectionString, $errstr, $errno ) );
+ }
+ return $stream;
+ }
+
+ /**
+ *
+ * @param number $timeout
+ * @return boolean
+ */
+ public function genericConnectionTest() {
+ $this->logger->trace ( 'testCustomConnection()' );
+ // test if the port is open
+ $connectionString = sprintf ( '%s:%s', $this->hostname, $this->port );
+ $stream = $this->createStream ( $connectionString, $this->connectionTimeout );
+ return null != $stream;
+ }
+
+ /**
+ * Given a hostname, test if it has open ports
+ *
+ * @param string $hostname
+ */
+ public function testHttpPorts() {
+ $this->trace ( 'testHttpPorts()' );
+ $connectionString = sprintf ( "https://%s:%s", $this->hostname, $this->port );
+ try {
+ $response = PostmanUtils::remotePost ( $connectionString );
+ $this->trace ( 'wp_remote_retrieve_headers:' );
+ $this->logger->trace ( wp_remote_retrieve_headers ( $response ) );
+ $this->trace ( wp_remote_retrieve_response_code ( $response ) );
+ $this->protocol = 'HTTPS';
+ $this->http = true;
+ $this->https = true;
+ $this->secure = true;
+ $this->reportedHostname = $this->hostname;
+ $this->reportedHostnameDomainOnly = $this->getRegisteredDomain ( $this->hostname );
+ return true;
+ } catch ( Exception $e ) {
+ $this->debug ( 'return false' );
+ }
+ }
+
+ /**
+ * Given a hostname, test if it has open ports
+ *
+ * @param string $hostname
+ */
+ public function testSmtpPorts() {
+ $this->logger->trace ( 'testSmtpPorts()' );
+ if ($this->port == 8025) {
+ $this->debug ( 'Executing test code for port 8025' );
+ $this->protocol = 'SMTP';
+ $this->smtp = true;
+ $this->authNone = 'true';
+ return true;
+ }
+ $connectionString = sprintf ( "%s:%s", $this->hostname, $this->port );
+ $success = $this->talkToMailServer ( $connectionString, $this->connectionTimeout, $this->readTimeout );
+ if ($success) {
+ $this->protocol = 'SMTP';
+ if (! ($this->authCrammd5 || $this->authLogin || $this->authPlain || $this->authXoauth)) {
+ $this->authNone = true;
+ }
+ } else {
+ $this->trySmtps = true;
+ }
+ return $success;
+ }
+
+ /**
+ * Given a hostname, test if it has open ports
+ *
+ * @param string $hostname
+ */
+ public function testSmtpsPorts() {
+ $this->logger->trace ( 'testSmtpsPorts()' );
+ $connectionString = sprintf ( "ssl://%s:%s", $this->hostname, $this->port );
+ $success = $this->talkToMailServer ( $connectionString, $this->connectionTimeout, $this->readTimeout );
+ if ($success) {
+ if (! ($this->authCrammd5 || $this->authLogin || $this->authPlain || $this->authXoauth)) {
+ $this->authNone = true;
+ }
+ $this->protocol = self::SMTPS_PROTOCOL;
+ $this->smtps = true;
+ $this->secure = true;
+ }
+ return $success;
+ }
+
+ /**
+ * Given a hostname, test if it has open ports
+ *
+ * @param string $hostname
+ */
+ private function talkToMailServer($connectionString) {
+ $this->logger->trace ( 'talkToMailServer()' );
+ $stream = $this->createStream ( $connectionString, $this->connectionTimeout );
+ if ($stream) {
+ $serverName = PostmanUtils::postmanGetServerName ();
+ @stream_set_timeout ( $stream, $this->readTimeout );
+ // see http://php.net/manual/en/transports.inet.php#113244
+ // see http://php.net/stream_socket_enable_crypto
+ $result = $this->readSmtpResponse ( $stream );
+ if ($result) {
+ $this->reportedHostname = $result;
+ $this->reportedHostnameDomainOnly = $this->getRegisteredDomain ( $this->reportedHostname );
+ $this->logger->trace ( sprintf ( 'comparing %s with %s', $this->reportedHostnameDomainOnly, $this->hostnameDomainOnly ) );
+ $this->mitm = true;
+ // MITM exceptions
+ if ($this->reportedHostnameDomainOnly == 'google.com' && $this->hostnameDomainOnly == 'gmail.com') {
+ $this->mitm = false;
+ } elseif ($this->reportedHostnameDomainOnly == 'hotmail.com' && $this->hostnameDomainOnly == 'live.com') {
+ $this->mitm = false;
+ } elseif ($this->reportedHostnameDomainOnly == $this->hostnameDomainOnly) {
+ $this->mitm = false;
+ }
+ $this->debug ( sprintf ( 'domain name: %s (%s)', $this->reportedHostname, $this->reportedHostnameDomainOnly ) );
+ $this->sendSmtpCommand ( $stream, sprintf ( 'EHLO %s', $serverName ) );
+ $this->readSmtpResponse ( $stream );
+ if ($this->checkStartTls) {
+ $this->sendSmtpCommand ( $stream, 'STARTTLS' );
+ $this->readSmtpResponse ( $stream );
+ $starttlsSuccess = @stream_socket_enable_crypto ( $stream, true, STREAM_CRYPTO_METHOD_TLS_CLIENT );
+ if ($starttlsSuccess) {
+ $this->startTls = true;
+ $this->secure = true;
+ $this->sendSmtpCommand ( $stream, sprintf ( 'EHLO %s', $serverName ) );
+ $this->readSmtpResponse ( $stream );
+ } else {
+ $this->error ( 'starttls failed' );
+ }
+ }
+ fclose ( $stream );
+ $this->debug ( 'return true' );
+ return true;
+ } else {
+ fclose ( $stream );
+ $this->debug ( 'return false' );
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+ private function sendSmtpCommand($stream, $message) {
+ $this->trace ( 'tx: ' . $message );
+ fputs ( $stream, $message . "\r\n" );
+ }
+ private function readSmtpResponse($stream) {
+ $result = '';
+ while ( ($line = fgets ( $stream )) !== false ) {
+ $this->trace ( 'rx: ' . $line );
+ if (preg_match ( '/^250.AUTH/', $line )) {
+ // $this->debug ( '250-AUTH' );
+ if (preg_match ( '/\\sLOGIN\\s/', $line )) {
+ $this->authLogin = true;
+ $this->debug ( 'authLogin' );
+ }
+ if (preg_match ( '/\\sPLAIN\\s/', $line )) {
+ $this->authPlain = true;
+ $this->debug ( 'authPlain' );
+ }
+ if (preg_match ( '/\\sCRAM-MD5\\s/', $line )) {
+ $this->authCrammd5 = true;
+ $this->debug ( 'authCrammd5' );
+ }
+ if (preg_match ( '/\\sXOAUTH.\\s/', $line )) {
+ $this->authXoauth = true;
+ $this->debug ( 'authXoauth' );
+ }
+ if (preg_match ( '/\\sANONYMOUS\\s/', $line )) {
+ // Postman treats ANONYMOUS login as no authentication.
+ $this->authNone = true;
+ $this->debug ( 'authAnonymous => authNone' );
+ }
+ // done
+ $result = 'auth';
+ } elseif (preg_match ( '/STARTTLS/', $line )) {
+ $result = 'starttls';
+ $this->checkStartTls = true;
+ $this->debug ( 'starttls' );
+ } elseif (preg_match ( '/^220.(.*?)\\s/', $line, $matches )) {
+ if (empty ( $result ))
+ $result = $matches [1];
+ }
+ if (preg_match ( '/^\d\d\d\\s/', $line )) {
+ // always exist on last server response line
+ // $this->debug ( 'exit' );
+ return $result;
+ }
+ }
+ return false;
+ }
+ public function getErrorMessage() {
+ return $this->errstr;
+ }
+ private function trace($message) {
+ $this->logger->trace ( sprintf ( '%s:%s => %s', $this->hostname, $this->port, $message ) );
+ }
+ private function debug($message) {
+ $this->logger->debug ( sprintf ( '%s:%s => %s', $this->hostname, $this->port, $message ) );
+ }
+ private function error($message) {
+ $this->logger->error ( sprintf ( '%s:%s => %s', $this->hostname, $this->port, $message ) );
+ }
+}