Handle login server error

This commit is contained in:
Robin Appelman 2015-08-14 12:43:15 +02:00
commit f299504ca5
3 changed files with 25 additions and 5 deletions

View file

@ -8,8 +8,10 @@
namespace Icewind\SMB; namespace Icewind\SMB;
use Icewind\SMB\Exception\AuthenticationException; use Icewind\SMB\Exception\AuthenticationException;
use Icewind\SMB\Exception\ConnectException;
use Icewind\SMB\Exception\ConnectionException; use Icewind\SMB\Exception\ConnectionException;
use Icewind\SMB\Exception\InvalidHostException; use Icewind\SMB\Exception\InvalidHostException;
use Icewind\SMB\Exception\NoLoginServerException;
class Connection extends RawConnection { class Connection extends RawConnection {
const DELIMITER = 'smb:'; const DELIMITER = 'smb:';
@ -31,13 +33,16 @@ class Connection extends RawConnection {
*/ */
public function read() { public function read() {
if (!$this->isValid()) { if (!$this->isValid()) {
throw new ConnectionException(); throw new ConnectionException('Connection not valied');
} }
$line = $this->readLine(); //first line is prompt $line = $this->readLine(); //first line is prompt
$this->checkConnectionError($line); $this->checkConnectionError($line);
$output = array(); $output = array();
$line = $this->readLine(); $line = $this->readLine();
if ($line === false) {
throw new ConnectException('Unknown error');
}
$length = mb_strlen(self::DELIMITER); $length = mb_strlen(self::DELIMITER);
while (mb_substr($line, 0, $length) !== self::DELIMITER) { //next prompt functions as delimiter while (mb_substr($line, 0, $length) !== self::DELIMITER) { //next prompt functions as delimiter
$output[] .= $line; $output[] .= $line;
@ -52,20 +57,24 @@ class Connection extends RawConnection {
* @param $line * @param $line
* @throws AuthenticationException * @throws AuthenticationException
* @throws InvalidHostException * @throws InvalidHostException
* @throws NoLoginServerException
*/ */
private function checkConnectionError($line) { private function checkConnectionError($line) {
$line = rtrim($line, ')'); $line = rtrim($line, ')');
if (substr($line, -23) === ErrorCodes::LogonFailure) { if (substr($line, -23) === ErrorCodes::LogonFailure) {
throw new AuthenticationException(); throw new AuthenticationException('Invalid login');
} }
if (substr($line, -26) === ErrorCodes::BadHostName) { if (substr($line, -26) === ErrorCodes::BadHostName) {
throw new InvalidHostException(); throw new InvalidHostException('Invalid hostname');
} }
if (substr($line, -22) === ErrorCodes::Unsuccessful) { if (substr($line, -22) === ErrorCodes::Unsuccessful) {
throw new InvalidHostException(); throw new InvalidHostException('Connection unsuccessful');
} }
if (substr($line, -28) === ErrorCodes::ConnectionRefused) { if (substr($line, -28) === ErrorCodes::ConnectionRefused) {
throw new InvalidHostException(); throw new InvalidHostException('Connection refused');
}
if (substr($line, -26) === ErrorCodes::NoLogonServers) {
throw new NoLoginServerException('No login server');
} }
} }

View file

@ -15,6 +15,7 @@ class ErrorCodes {
const BadHostName = 'NT_STATUS_BAD_NETWORK_NAME'; const BadHostName = 'NT_STATUS_BAD_NETWORK_NAME';
const Unsuccessful = 'NT_STATUS_UNSUCCESSFUL'; const Unsuccessful = 'NT_STATUS_UNSUCCESSFUL';
const ConnectionRefused = 'NT_STATUS_CONNECTION_REFUSED'; const ConnectionRefused = 'NT_STATUS_CONNECTION_REFUSED';
const NoLogonServers = 'NT_STATUS_NO_LOGON_SERVERS';
const PathNotFound = 'NT_STATUS_OBJECT_PATH_NOT_FOUND'; const PathNotFound = 'NT_STATUS_OBJECT_PATH_NOT_FOUND';
const NoSuchFile = 'NT_STATUS_NO_SUCH_FILE'; const NoSuchFile = 'NT_STATUS_NO_SUCH_FILE';

View file

@ -0,0 +1,10 @@
<?php
/**
* Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Licensed under the MIT license:
* http://opensource.org/licenses/MIT
*/
namespace Icewind\SMB\Exception;
class NoLoginServerException extends ConnectException {}