Skip to content

Commit

Permalink
Add option novalidatecert to connect(); closes #63
Browse files Browse the repository at this point in the history
Signed-off-by: Johan Cwiklinski <jcwiklinski@teclib.com>
  • Loading branch information
abulhol authored and weierophinney committed Jul 28, 2020
1 parent b9bcf53 commit 27b8140
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 10 deletions.
4 changes: 4 additions & 0 deletions docs/book/read.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,10 @@ $mail = new Pop3([
]);
```

If you are connecting to a mail server with a self-signed certificate and want to
skip the SSL verification, you can also pass an additional argument `novalidatecert`
with the value `true`.

Both constructors throw `Laminas\Mail\Exception` or `Laminas\Mail\Protocol\Exception`
(extends `Laminas\Mail\Exception`) for connection errors, depending on the type of
error encountered.
Expand Down
48 changes: 43 additions & 5 deletions src/Protocol/Imap.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@ class Imap
*/
const TIMEOUT_CONNECTION = 30;

/**
* If set to true, do not validate the SSL certificate
* @var null|bool
*/
protected $novalidatecert;

/**
* socket to imap server
* @var resource|null
Expand All @@ -34,13 +40,16 @@ class Imap
/**
* Public constructor
*
* @param string $host hostname or IP address of IMAP server, if given connect() is called
* @param int|null $port port of IMAP server, null for default (143 or 993 for ssl)
* @param bool $ssl use ssl? 'SSL', 'TLS' or false
* @param string $host hostname or IP address of IMAP server, if given connect() is called
* @param int|null $port port of IMAP server, null for default (143 or 993 for ssl)
* @param bool $ssl use ssl? 'SSL', 'TLS' or false
* @param bool $novalidatecert set to true to skip SSL certificate validation
* @throws \Laminas\Mail\Protocol\Exception\ExceptionInterface
*/
public function __construct($host = '', $port = null, $ssl = false)
public function __construct($host = '', $port = null, $ssl = false, $novalidatecert = false)
{
$this->novalidatecert = $novalidatecert;

if ($host) {
$this->connect($host, $port, $ssl);
}
Expand All @@ -54,6 +63,14 @@ public function __destruct()
$this->logout();
}

public function setNoValidateCert($novalidatecert)
{

if (is_bool($novalidatecert)) {
$this->novalidatecert = $novalidatecert;
}
}

/**
* Open connection to IMAP server
*
Expand Down Expand Up @@ -87,8 +104,29 @@ public function connect($host, $port = null, $ssl = false)
}
}

$socket_options = [];

if ($this->novalidatecert) {
$socket_options = [
'ssl' => [
'verify_peer_name' => false,
'verify_peer' => false,
]
];
}

$socket_context = stream_context_create($socket_options);

ErrorHandler::start();
$this->socket = fsockopen($host, $port, $errno, $errstr, self::TIMEOUT_CONNECTION);
$this->socket = stream_socket_client(
$host . ":" . $port,
$errno,
$errstr,
self::TIMEOUT_CONNECTION,
STREAM_CLIENT_CONNECT,
$socket_context
);

$error = ErrorHandler::stop();
if (! $this->socket) {
throw new Exception\RuntimeException(sprintf(
Expand Down
48 changes: 43 additions & 5 deletions src/Protocol/Pop3.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@ class Pop3
*/
public $hasTop = null;

/**
* If set to true, do not validate the SSL certificate
* @var null|bool
*/
protected $novalidatecert;

/**
* socket to pop3
* @var null|resource
Expand All @@ -40,12 +46,15 @@ class Pop3
/**
* Public constructor
*
* @param string $host hostname or IP address of POP3 server, if given connect() is called
* @param int|null $port port of POP3 server, null for default (110 or 995 for ssl)
* @param bool|string $ssl use ssl? 'SSL', 'TLS' or false
* @param string $host hostname or IP address of POP3 server, if given connect() is called
* @param int|null $port port of POP3 server, null for default (110 or 995 for ssl)
* @param bool|string $ssl use ssl? 'SSL', 'TLS' or false
* @param bool $novalidatecert set to true to skip SSL certificate validation
*/
public function __construct($host = '', $port = null, $ssl = false)
public function __construct($host = '', $port = null, $ssl = false, $novalidatecert = false)
{
$this->novalidatecert = $novalidatecert;

if ($host) {
$this->connect($host, $port, $ssl);
}
Expand All @@ -59,6 +68,14 @@ public function __destruct()
$this->logout();
}

public function setNoValidateCert($novalidatecert)
{

if (is_bool($novalidatecert)) {
$this->novalidatecert = $novalidatecert;
}
}

/**
* Open connection to POP3 server
*
Expand Down Expand Up @@ -92,8 +109,29 @@ public function connect($host, $port = null, $ssl = false)
}
}

$socket_options = [];

if ($this->novalidatecert) {
$socket_options = [
'ssl' => [
'verify_peer_name' => false,
'verify_peer' => false,
]
];
}

$socket_context = stream_context_create($socket_options);

ErrorHandler::start();
$this->socket = fsockopen($host, $port, $errno, $errstr, self::TIMEOUT_CONNECTION);
$this->socket = stream_socket_client(
$host . ":" . $port,
$errno,
$errstr,
self::TIMEOUT_CONNECTION,
STREAM_CLIENT_CONNECT,
$socket_context
);

$error = ErrorHandler::stop();
if (! $this->socket) {
throw new Exception\RuntimeException(sprintf(
Expand Down
5 changes: 5 additions & 0 deletions src/Storage/Imap.php
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,11 @@ public function __construct($params)
$ssl = isset($params->ssl) ? $params->ssl : false;

$this->protocol = new Protocol\Imap();

if (isset($params->novalidatecert)) {
$this->protocol->setNoValidateCert(true);
}

$this->protocol->connect($host, $port, $ssl);
if (! $this->protocol->login($params->user, $password)) {
throw new Exception\RuntimeException('cannot login, user or password wrong');
Expand Down
5 changes: 5 additions & 0 deletions src/Storage/Pop3.php
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,11 @@ public function __construct($params)
$ssl = isset($params->ssl) ? $params->ssl : false;

$this->protocol = new Protocol\Pop3();

if (isset($params->novalidatecert)) {
$this->protocol->setNoValidateCert($params->novalidatecert);
}

$this->protocol->connect($host, $port, $ssl);
$this->protocol->login($params->user, $password);
}
Expand Down

0 comments on commit 27b8140

Please sign in to comment.