diff options
author | Christian Weiske <cweiske@cweiske.de> | 2014-01-18 00:31:39 +0400 |
---|---|---|
committer | Christian Weiske <cweiske@cweiske.de> | 2014-01-18 00:31:39 +0400 |
commit | c9f92d3c83b735fbe2e26fb24368203b29344909 (patch) | |
tree | e5d79441e82272fd9703a36139ff508f19ba23a0 /user_external | |
parent | ce2b32dac38ff72fa935d518cc47c886f1aedadb (diff) |
user_external: Check if extensions are enabled before using them
This patch checks if the relevant functionality is actually available
before using it for authentication:
1. check if function imap_open() exists before using it
2. check if smbclient executable exists during smb auth
3. check if ftp/ftps stream wrappers are registered before
using them for auth
This fixes a crash (white page) that happens when using IMAP authentication
and the IMAP extension is not installed.
Diffstat (limited to 'user_external')
-rw-r--r-- | user_external/lib/ftp.php | 7 | ||||
-rw-r--r-- | user_external/lib/imap.php | 4 | ||||
-rw-r--r-- | user_external/lib/smb.php | 14 |
3 files changed, 20 insertions, 5 deletions
diff --git a/user_external/lib/ftp.php b/user_external/lib/ftp.php index 388e1327a..b94d7fe39 100644 --- a/user_external/lib/ftp.php +++ b/user_external/lib/ftp.php @@ -18,7 +18,6 @@ class OC_User_FTP extends OC_User_Backend{ if($this->secure) { $this->protocol.='s'; } - $this->protocol.='://'; } /** @@ -30,7 +29,11 @@ class OC_User_FTP extends OC_User_Backend{ * Check if the password is correct without logging in the user */ public function checkPassword($uid, $password) { - $url=$this->protocol.$uid.':'.$password.'@'.$this->host.'/'; + if (false === array_search($this->protocol, stream_get_wrappers())) { + OCP\Util::writeLog('user_external', 'ERROR: Stream wrapper not available: ' . $this->protocol, OCP\Util::ERROR); + return false; + } + $url = sprintf('%s://%s:%s@%s/', $this->protocol, $uid, $password, $this->host); $result=@opendir($url); if(is_resource($result)) { return $uid; diff --git a/user_external/lib/imap.php b/user_external/lib/imap.php index 201d9d8ab..d1c62632c 100644 --- a/user_external/lib/imap.php +++ b/user_external/lib/imap.php @@ -22,6 +22,10 @@ class OC_User_IMAP extends OC_User_Backend{ * Check if the password is correct without logging in the user */ public function checkPassword($uid, $password) { + if (!function_exists('imap_open')) { + OCP\Util::writeLog('user_external', 'ERROR: PHP imap extension is not installed', OCP\Util::ERROR); + return false; + } $mbox = @imap_open($this->mailbox, $uid, $password); imap_errors(); imap_alerts(); diff --git a/user_external/lib/smb.php b/user_external/lib/smb.php index 96429d8cf..8a95120a8 100644 --- a/user_external/lib/smb.php +++ b/user_external/lib/smb.php @@ -29,10 +29,18 @@ class OC_User_SMB extends OC_User_Backend{ $password=escapeshellarg($password); $result=array(); $command=self::smbclient.' //'.$this->host.'/dummy -U'.$uidEscaped.'%'.$password; - $result=exec($command,$result); - if(substr($result,-strlen(self::loginError))==self::loginError) { + $lastline = exec($command, $output, $retval); + if ($retval === 127) { + OCP\Util::writeLog('user_external', 'ERROR: smbclient executable missing', OCP\Util::ERROR); return false; - }else{ + } else if (strpos($lastline, self::loginError) !== false) { + //normal login error + return false; + } else if ($retval != 0) { + //some other error + OCP\Util::writeLog('user_external', 'ERROR: smbclient error: ' . trim($lastline), OCP\Util::ERROR); + return false; + } else { return $uid; } } |