summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG2
-rw-r--r--config/main.inc.php.dist9
-rw-r--r--plugins/virtuser_file/virtuser_file.php109
-rw-r--r--plugins/virtuser_query/virtuser_query.php53
-rw-r--r--program/include/rcube_user.php84
5 files changed, 174 insertions, 83 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 42f07a5be..10630a7b4 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 8558c44e3..5709a6058 100644
--- a/config/main.inc.php.dist
+++ b/config/main.inc.php.dist
@@ -167,15 +167,6 @@ $rcmail_config['username_domain'] = '';
// 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 000000000..071722bf4
--- /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 000000000..803c2702d
--- /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 ab44cdca2..63ffa63ec 100644
--- a/program/include/rcube_user.php
+++ b/program/include/rcube_user.php
@@ -447,29 +447,23 @@ class rcube_user
/**
- * 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/');
-
- 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]);
- }
+ $rcmail = rcmail::get_instance();
+ $plugin = $rcmail->plugins->exec_hook('email2user',
+ array('email' => $email, 'user' => NULL));
- 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 @@ class rcube_user
*/
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;
- }
-
}
-
-