From 1bf9a86a8e080991b8c15d0fb360c06a6321c72d Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Fri, 02 Oct 2009 08:14:14 -0400
Subject: [PATCH] - Password: cPanel driver added

---
 CHANGELOG                            |    1 
 plugins/password/drivers/cpanel.php  |  121 ++++++++++++++++++++++++++++++++++++++++
 plugins/password/README              |    8 ++
 plugins/password/config.inc.php.dist |   23 +++++++
 4 files changed, 152 insertions(+), 1 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 9ea85f0..ee2af5f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG RoundCube Webmail
 ===========================
 
+- Password: added cPanel driver
 - Fix return to first page from e-mail screen (#1486105)
 - Fix handling HTML comments in HTML messages (#1486189)
 - Fix folder/messagelist controls alignment - icons used (#1486072)
diff --git a/plugins/password/README b/plugins/password/README
index 033af5f..ac725f8 100644
--- a/plugins/password/README
+++ b/plugins/password/README
@@ -31,6 +31,7 @@
  2.3.	Poppassd/Courierpassd (poppassd)
  2.4.	LDAP (ldap)
  2.5.	DirectAdmin Control Panel
+ 2.6.   cPanel
  3.	Driver API
 
 
@@ -174,6 +175,13 @@
  for more info.
 
 
+ 2.6. cPanel
+ -----------
+
+ You can specify parameters for HTTP connection to cPanel's admin
+ interface. See config.inc.php file for more info.
+
+
  3. Driver API
  -------------
 
diff --git a/plugins/password/config.inc.php.dist b/plugins/password/config.inc.php.dist
index 73057ae..d311948 100644
--- a/plugins/password/config.inc.php.dist
+++ b/plugins/password/config.inc.php.dist
@@ -3,7 +3,7 @@
 // Password Plugin options
 // -----------------------
 // A driver to use for password change. Default: "sql".
-// Current possibilities: 'directadmin', 'ldap', 'poppassd', 'sasl', 'sql', 'vpopmaild'
+// Current possibilities: 'directadmin', 'ldap', 'poppassd', 'sasl', 'sql', 'vpopmaild', 'cpanel'
 $rcmail_config['password_driver'] = 'sql';
 
 // Determine whether current password is required to change password.
@@ -158,4 +158,25 @@
 // TCP port used for vpopmaild connections
 $rcmail_config['password_vpopmaild_port'] = 89;
 
+
+// cPanel Driver options
+// --------------------------
+// The cPanel Host name
+$rcmail_config['password_cpanel_host'] = 'host.domain.com';
+
+// The cPanel admin username
+$rcmail_config['password_cpanel_username'] = 'username';
+
+// The cPanel admin password
+$rcmail_config['password_cpanel_password'] = 'password';
+
+// The cPanel port to use
+$rcmail_config['password_cpanel_port'] = 2082;
+
+// Using ssl for cPanel connections?
+$rcmail_config['password_cpanel_ssl'] = true;
+
+// The cPanel theme in use
+$rcmail_config['password_cpanel_theme'] = 'x';
+
 ?>
diff --git a/plugins/password/drivers/cpanel.php b/plugins/password/drivers/cpanel.php
new file mode 100644
index 0000000..82bfe74
--- /dev/null
+++ b/plugins/password/drivers/cpanel.php
@@ -0,0 +1,121 @@
+<?php
+
+/**
+ * cPanel Password Driver
+ *
+ * Driver that adds functionality to change the users cPanel password.
+ * The cPanel PHP API code has been taken from: http://www.phpclasses.org/browse/package/3534.html
+ *
+ * This driver has been tested with Hostmonster hosting and seems to work fine.
+
+ *
+ * @version 1.0
+ * @author Fulvio Venturelli <fulvio@venturelli.org>
+ */
+
+class HTTP
+{
+	function HTTP($host, $username, $password, $port, $ssl, $theme)
+	{
+		$this->ssl = $ssl ? 'ssl://' : '';
+		$this->username = $username;
+		$this->password = $password;
+		$this->theme = $theme;
+		$this->auth = base64_encode($username . ':' . $password);
+		$this->port = $port;
+		$this->host = $host;
+		$this->path = '/frontend/' . $theme . '/';
+	}
+
+	function getData($url, $data = '')
+	{
+		$url = $this->path . $url;
+		if(is_array($data))
+		{
+			$url = $url . '?';
+			foreach($data as $key=>$value)
+			{
+				$url .= urlencode($key) . '=' . urlencode($value) . '&';
+			}
+			$url = substr($url, 0, -1);
+		}
+		$response = '';
+		$fp = fsockopen($this->ssl . $this->host, $this->port);
+		if(!$fp)
+		{
+			return false;
+		}
+		$out = 'GET ' . $url . ' HTTP/1.0' . "\r\n";
+		$out .= 'Authorization: Basic ' . $this->auth . "\r\n";
+		$out .= 'Connection: Close' . "\r\n\r\n";
+		fwrite($fp, $out);
+		while (!feof($fp))
+		{
+			$response .= @fgets($fp);
+		}
+		fclose($fp);
+		return $response;
+	}
+}
+
+
+class emailAccount
+{          
+	function emailAccount($host, $username, $password, $port, $ssl, $theme, $address)
+	{
+		$this->HTTP = new HTTP($host, $username, $password, $port, $ssl, $theme);
+		if(strpos($address, '@'))
+		{
+			list($this->email, $this->domain) = explode('@', $address);
+		}
+		else
+		{
+			list($this->email, $this->domain) = array($address, '');
+		}
+	}
+
+ /*
+  * Change email account password
+  *
+  * Returns true on success or false on failure.
+  * @param string $password email account password
+  * @return bool
+  */
+	function setPassword($password)
+	{
+		$data['email'] = $this->email;
+		$data['domain'] = $this->domain;
+		$data['password'] = $password;
+		$response = $this->HTTP->getData('mail/dopasswdpop.html', $data);
+		if(strpos($response, 'success') && !strpos($response, 'failure'))
+		{
+			return true;
+		}
+		return false;
+	}
+}
+
+
+function password_save($curpas, $newpass)
+{
+    $rcmail = rcmail::get_instance();
+
+    // Create a cPanel email object
+    $cPanel = new emailAccount($rcmail->config->get('password_cpanel_host'),
+	$rcmail->config->get('password_cpanel_username'),
+	$rcmail->config->get('password_cpanel_password'),
+	$rcmail->config->get('password_cpanel_port'),
+	$rcmail->config->get('password_cpanel_ssl'),
+	$rcmail->config->get('password_cpanel_theme'),
+	$_SESSION['username'] );
+
+    if ($cPanel->setPassword($newpass)){
+        return PASSWORD_SUCCESS;
+    }
+    else
+    {
+       return PASSWORD_ERROR;
+    }
+}
+
+?>

--
Gitblit v1.9.1