From d1a7952c6b83f93aeac02869ff9342310c342dc1 Mon Sep 17 00:00:00 2001
From: Charles McNulty <cmcnulty@kznf.com>
Date: Mon, 04 Nov 2013 14:03:01 -0500
Subject: [PATCH] Merge remote branch 'upstream/master' into row-focus

---
 plugins/password/drivers/domainfactory.php |  117 ++++++++++++++++++++++----------------
 plugins/help/help.php                      |    5 +
 2 files changed, 73 insertions(+), 49 deletions(-)

diff --git a/plugins/help/help.php b/plugins/help/help.php
index 37fd908..df08caf 100644
--- a/plugins/help/help.php
+++ b/plugins/help/help.php
@@ -33,6 +33,11 @@
         $this->register_action('about', array($this, 'action'));
         $this->register_action('license', array($this, 'action'));
 
+        $this->add_hook('startup', array($this, 'startup'));
+    }
+
+    function startup($args)
+    {
         $rcmail = rcmail::get_instance();
 
         // add taskbar button
diff --git a/plugins/password/drivers/domainfactory.php b/plugins/password/drivers/domainfactory.php
index 7f6b886..9128720 100644
--- a/plugins/password/drivers/domainfactory.php
+++ b/plugins/password/drivers/domainfactory.php
@@ -4,9 +4,9 @@
  * domainFACTORY Password Driver
  *
  * Driver to change passwords with the hosting provider domainFACTORY.
- * See: http://www.df.eu/
+ * http://www.df.eu/
  *
- * @version 2.0
+ * @version 2.1
  * @author Till Krüss <me@tillkruess.com>
  * @link http://tillkruess.com/projects/roundcube/
  *
@@ -14,57 +14,76 @@
 
 class rcube_domainfactory_password
 {
-    function save($curpass, $passwd)
-    {
-	    $rcmail = rcmail::get_instance();
+	function save($curpass, $passwd)
+	{
+		$rcmail = rcmail::get_instance();
 
-	    if (is_null($curpass)) {
-		    $curpass = $rcmail->decrypt($_SESSION['password']);
-	    }
+		if (is_null($curpass)) {
+			$curpass = $rcmail->decrypt($_SESSION['password']);
+		}
 
-    	if ($ch = curl_init()) {
-    		// initial login
-	    	curl_setopt_array($ch, array(
-		    	CURLOPT_RETURNTRANSFER => true,
-    			CURLOPT_URL => 'https://ssl.df.eu/chmail.php',
-	    		CURLOPT_POST => true,
-		    	CURLOPT_POSTFIELDS => array(
-			    	'login' => $rcmail->user->get_username(),
-				    'pwd' => $curpass,
-    				'action' => 'change'
-	    		)
-		    ));
+		if ($ch = curl_init()) {
 
-    		if ($result = curl_exec($ch)) {
-    			// login successful, get token!
-	    		$postfields = array(
-		    		'pwd1' => $passwd,
-			    	'pwd2' => $passwd,
-				    'action[update]' => 'Speichern'
-    			);
+			// initial login
+			curl_setopt_array($ch, array(
+				CURLOPT_RETURNTRANSFER => true,
+				CURLOPT_URL => 'https://ssl.df.eu/chmail.php',
+				CURLOPT_POST => true,
+				CURLOPT_POSTFIELDS => array(
+					'login' => $rcmail->user->get_username(),
+					'pwd' => $curpass,
+					'action' => 'change'
+				)
+			));
 
-    			preg_match_all('~<input name="(.+?)" type="hidden" value="(.+?)">~i', $result, $fields);
-	    		foreach ($fields[1] as $field_key => $field_name) {
-		    		$postfields[$field_name] = $fields[2][$field_key];
-			    }
+			if ($result = curl_exec($ch)) {
+				// login successful, get token!
+				$postfields = array(
+					'pwd1' => $passwd,
+					'pwd2' => $passwd,
+					'action[update]' => 'Speichern'
+				);
 
-    			// change password
-	    		$ch = curl_copy_handle($ch);
-		    	curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
-			    if ($result = curl_exec($ch)) {
-    				if (strpos($result, 'Einstellungen erfolgreich') !== false) {
-	    				return PASSWORD_SUCCESS;
-		    		}
-    			} else {
-	    			return PASSWORD_CONNECT_ERROR;
-		    	}
-    		} else {
-	    		return PASSWORD_CONNECT_ERROR;
-		    }
-    	} else {
-	    	return PASSWORD_CONNECT_ERROR;
-	    }
+				preg_match_all('~<input name="(.+?)" type="hidden" value="(.+?)">~i', $result, $fields);
+				foreach ($fields[1] as $field_key => $field_name) {
+					$postfields[$field_name] = $fields[2][$field_key];
+				}
 
-    	return PASSWORD_ERROR;
-    }
+				// change password
+				$ch = curl_copy_handle($ch);
+				curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
+				if ($result = curl_exec($ch)) {
+
+					// has the password been changed?
+					if (strpos($result, 'Einstellungen erfolgreich') !== false) {
+						return PASSWORD_SUCCESS;
+					}
+
+					// show error message(s) if possible
+					if (strpos($result, '<div class="d-msg-text">') !== false) {
+						preg_match_all('#<div class="d-msg-text">(.*?)</div>#s', $result, $errors);
+						if (isset($errors[1])) {
+							$error_message = '';
+							foreach ( $errors[1] as $error ) {
+								$error_message .= trim(mb_convert_encoding( $error, 'UTF-8', 'ISO-8859-15' )).' ';
+							}
+							return array('code' => PASSWORD_ERROR, 'message' => $error_message);
+						}
+					}
+
+
+				} else {
+					return PASSWORD_CONNECT_ERROR;
+				}
+
+			} else {
+				return PASSWORD_CONNECT_ERROR;
+			}
+
+		} else {
+			return PASSWORD_CONNECT_ERROR;
+		}
+
+		return PASSWORD_ERROR;
+	}
 }

--
Gitblit v1.9.1