From 56505a11743d6869f6222f6b9467158edf295a44 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Thu, 11 Mar 2010 13:34:01 -0500
Subject: [PATCH] - Options virtuser_* replaced with virtuser_* plugins - Plugin API: Implemented 'email2user' and 'user2email' hooks

---
 CHANGELOG                                 |    2 
 plugins/virtuser_file/virtuser_file.php   |  109 +++++++++++++++++++++
 program/include/rcube_user.php            |   84 ++--------------
 plugins/virtuser_query/virtuser_query.php |   53 ++++++++++
 config/main.inc.php.dist                  |    9 -
 5 files changed, 174 insertions(+), 83 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 42f07a5..10630a7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,8 @@
 CHANGELOG RoundCube Webmail
 ===========================
 
+- Options virtuser_* replaced with virtuser_* plugins
+- Plugin API: Implemented 'email2user' and 'user2email' hooks
 - Fix forwarding message omits CC header (#1486305)
 - Add 'default_charset' option to user preferences (#1485451)
 - Add 'delete_always' option to user preferences
diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist
index 8558c44..5709a60 100644
--- a/config/main.inc.php.dist
+++ b/config/main.inc.php.dist
@@ -167,15 +167,6 @@
 // Specify an array with 'host' => 'domain' values to support multiple hosts
 $rcmail_config['mail_domain'] = '';
 
-// Path to a virtuser table file to resolve user names and e-mail addresses
-$rcmail_config['virtuser_file'] = '';
-
-// Query to resolve user names and e-mail addresses from the database
-// %u will be replaced with the current username for login.
-// The query should select the user's e-mail address as first column
-// and optional identity name as second column
-$rcmail_config['virtuser_query'] = '';
-
 // Password charset.
 // Use it if your authentication backend doesn't support UTF-8.
 // Defaults to ISO-8859-1 for backward compatibility
diff --git a/plugins/virtuser_file/virtuser_file.php b/plugins/virtuser_file/virtuser_file.php
new file mode 100644
index 0000000..071722b
--- /dev/null
+++ b/plugins/virtuser_file/virtuser_file.php
@@ -0,0 +1,109 @@
+<?php
+
+/**
+ * File based User-to-Email and Email-to-User lookup
+ * 
+ * Add it to the plugins list in config/main.inc.php and set
+ * path to a virtuser table file to resolve user names and e-mail
+ * addresses
+ * $rcmail_config['virtuser_file'] = '';
+ *
+ * @version 1.0
+ * @author Aleksander Machniak
+ */
+class virtuser_file extends rcube_plugin
+{
+    private $file;
+    private $app;
+
+    function init()
+    {
+	$this->app = rcmail::get_instance();
+	$this->file = $this->app->config->get('virtuser_file');
+
+	if ($this->file) {
+	    $this->add_hook('user2email', array($this, 'user2email'));
+	    $this->add_hook('email2user', array($this, 'email2user'));
+	}
+    }
+
+    /**
+     * User > Email
+     */
+    function user2email($p)
+    {
+        $r = $this->findinvirtual('/\s' . preg_quote($p['user'], '/') . '\s*$/');
+	$result = array();
+
+	for ($i=0; $i<count($r); $i++)
+	{
+	    $arr = preg_split('/\s+/', $r[$i]);
+
+	    if (count($arr) > 0 && strpos($arr[0], '@'))
+	    {
+		$result[] = trim(str_replace('\\@', '@', $arr[0]));
+
+		if ($p['first']) {
+		    $p['email'] = $result[0];
+		    break;
+		}
+	    }
+	}
+
+	$p['email'] = empty($result) ? NULL : $result;
+
+	return $p;
+    }
+
+    /**
+     * Email > User
+     */
+    function email2user($p)
+    {
+	$r = $this->findinvirtual('/^' . preg_quote($p['email'], '/') . '\s/');
+
+	for ($i=0; $i<count($r); $i++)
+        {
+	    $arr = preg_split('/\s+/', trim($r[$i]));
+	    
+	    if (count($arr) > 0) {
+		$p['user'] = trim($arr[count($arr)-1]);
+		break;
+	    }
+	}
+
+	return $p;
+    }
+
+    /**
+     * Find matches of the given pattern in virtuser file
+     *
+     * @param string Regular expression to search for
+     * @return array Matching entries
+     */
+    private function findinvirtual($pattern)
+    {
+	$result = array();
+	$virtual = null;
+	
+	if ($this->file)
+	    $virtual = file($virtuser_file);
+	
+	if (empty($virtual))
+	    return $result;
+	
+	// check each line for matches
+	foreach ($virtual as $line)
+	{
+	    $line = trim($line);
+	    if (empty($line) || $line[0]=='#')
+	        continue;
+	
+	    if (preg_match($pattern, $line))
+	        $result[] = $line;
+	}
+	
+	return $result;
+    }
+
+}
diff --git a/plugins/virtuser_query/virtuser_query.php b/plugins/virtuser_query/virtuser_query.php
new file mode 100644
index 0000000..803c270
--- /dev/null
+++ b/plugins/virtuser_query/virtuser_query.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * DB based User-to-Email and Email-to-User lookup
+ *
+ * Add it to the plugins list in config/main.inc.php and set
+ * SQL query to resolve user names and e-mail addresses from the database
+ * %u will be replaced with the current username for login.
+ * The query should select the user's e-mail address as first column
+ * and optional identity name as second column
+ * $rcmail_config['virtuser_query'] = '';
+ *
+ * @version 1.0
+ * @author Aleksander Machniak
+ */
+class virtuser_query extends rcube_plugin
+{
+    private $query;
+    private $app;
+
+    function init()
+    {
+	$this->app = rcmail::get_instance();
+	$this->query = $this->app->config->get('virtuser_query');
+
+	if ($this->query) {
+	    $this->add_hook('user2email', array($this, 'user2email'));
+//	    $this->add_hook('email2user', array($this, 'email2user'));
+	}
+    }
+
+    /**
+     * User > Email
+     */
+    function user2email($p)
+    {
+	$dbh = $rcmail->get_dbh();
+
+	$sql_result = $dbh->query(preg_replace('/%u/', $dbh->escapeSimple($p['user']), $this->query));
+
+	while ($sql_arr = $dbh->fetch_array($sql_result)) {
+	    if (strpos($sql_arr[0], '@')) {
+		$result[] = ($p['extended'] && count($sql_arr) > 1) ? $sql_arr : $sql_arr[0];
+
+		if ($p['first'])
+		    return $result[0];
+	    }
+	}
+
+	return $p;
+    }
+
+}
diff --git a/program/include/rcube_user.php b/program/include/rcube_user.php
index ab44cdc..63ffa63 100644
--- a/program/include/rcube_user.php
+++ b/program/include/rcube_user.php
@@ -447,29 +447,23 @@
   
   
   /**
-   * Resolve username using a virtuser file
+   * Resolve username using a virtuser plugins
    *
    * @param string E-mail address to resolve
    * @return string Resolved IMAP username
    */
   static function email2user($email)
   {
-    $r = self::findinvirtual('/^' . preg_quote($email, '/') . '\s/');
+    $rcmail = rcmail::get_instance();
+    $plugin = $rcmail->plugins->exec_hook('email2user',
+      array('email' => $email, 'user' => NULL));
 
-    for ($i=0; $i<count($r); $i++)
-    {
-      $data = trim($r[$i]);
-      $arr = preg_split('/\s+/', $data);
-      if (count($arr) > 0)
-        return trim($arr[count($arr)-1]);
-    }
-
-    return NULL;
+    return $plugin['user'];
   }
 
 
   /**
-   * Resolve e-mail address from virtuser file/table
+   * Resolve e-mail address from virtuser plugins
    *
    * @param string User name
    * @param boolean If true returns first found entry
@@ -478,70 +472,12 @@
    */
   static function user2email($user, $first=true, $extended=false)
   {
-    $result = array();
     $rcmail = rcmail::get_instance();
-    $dbh = $rcmail->get_dbh();
+    $plugin = $rcmail->plugins->exec_hook('user2email',
+      array('email' => NULL, 'user' => $user,
+        'first' => $first, 'extended' => $extended));
 
-    // SQL lookup
-    if ($virtuser_query = $rcmail->config->get('virtuser_query')) {
-      $sql_result = $dbh->query(preg_replace('/%u/', $dbh->escapeSimple($user), $virtuser_query));
-      while ($sql_arr = $dbh->fetch_array($sql_result))
-        if (strpos($sql_arr[0], '@')) {
-          $result[] = ($extended && count($sql_arr) > 1) ? $sql_arr : $sql_arr[0];
-          if ($first)
-            return $result[0];
-        }
-    }
-    // File lookup
-    $r = self::findinvirtual('/\s' . preg_quote($user, '/') . '\s*$/');
-    for ($i=0; $i<count($r); $i++)
-    {
-      $data = $r[$i];
-      $arr = preg_split('/\s+/', $data);
-      if (count($arr) > 0 && strpos($arr[0], '@'))
-      {
-        $result[] = trim(str_replace('\\@', '@', $arr[0]));
-
-        if ($first)
-          return $result[0];
-      }
-    }
-    
-    return empty($result) ? NULL : $result;
+    return empty($plugin['email']) ? NULL : $plugin['email'];
   }
   
-  
-  /**
-   * Find matches of the given pattern in virtuser file
-   * 
-   * @param string Regular expression to search for
-   * @return array Matching entries
-   */
-  private static function findinvirtual($pattern)
-  {
-    $result = array();
-    $virtual = null;
-    
-    if ($virtuser_file = rcmail::get_instance()->config->get('virtuser_file'))
-      $virtual = file($virtuser_file);
-    
-    if (empty($virtual))
-      return $result;
-    
-    // check each line for matches
-    foreach ($virtual as $line)
-    {
-      $line = trim($line);
-      if (empty($line) || $line{0}=='#')
-        continue;
-        
-      if (preg_match($pattern, $line))
-        $result[] = $line;
-    }
-    
-    return $result;
-  }
-
 }
-
-

--
Gitblit v1.9.1