diff options
-rw-r--r-- | CHANGELOG | 2 | ||||
-rw-r--r-- | config/main.inc.php.dist | 9 | ||||
-rw-r--r-- | plugins/virtuser_file/virtuser_file.php | 109 | ||||
-rw-r--r-- | plugins/virtuser_query/virtuser_query.php | 53 | ||||
-rw-r--r-- | program/include/rcube_user.php | 84 |
5 files changed, 174 insertions, 83 deletions
@@ -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; - } - } - - |