CHANGELOG | ●●●●● patch | view | raw | blame | history | |
config/main.inc.php.dist | ●●●●● patch | view | raw | blame | history | |
plugins/virtuser_file/virtuser_file.php | ●●●●● patch | view | raw | blame | history | |
plugins/virtuser_query/virtuser_query.php | ●●●●● patch | view | raw | blame | history | |
program/include/rcube_user.php | ●●●●● patch | view | raw | blame | history |
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 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 plugins/virtuser_file/virtuser_file.php
New file @@ -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; } } plugins/virtuser_query/virtuser_query.php
New file @@ -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; } } 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; } }