From cd05354aaff7deb44d46718ad8ffa5d1b65b4539 Mon Sep 17 00:00:00 2001 From: Christian Weiske Date: Fri, 17 Jan 2014 21:31:39 +0100 Subject: [PATCH] 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. --- lib/ftp.php | 7 +++++-- lib/imap.php | 4 ++++ lib/smb.php | 14 +++++++++++--- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/lib/ftp.php b/lib/ftp.php index 388e132..b94d7fe 100644 --- a/lib/ftp.php +++ b/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/lib/imap.php b/lib/imap.php index 201d9d8..d1c6263 100644 --- a/lib/imap.php +++ b/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/lib/smb.php b/lib/smb.php index 96429d8..8a95120 100644 --- a/lib/smb.php +++ b/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; } }