Add plugin main class
This commit is contained in:
parent
c769ee97be
commit
0feb46ee1c
117
virtuser_identities_autoupdate.php
Normal file
117
virtuser_identities_autoupdate.php
Normal file
@ -0,0 +1,117 @@
|
||||
<?php
|
||||
/**
|
||||
* Virtuser Identity Auto Update
|
||||
*
|
||||
* Updates user's identities on each login
|
||||
*
|
||||
* This plugin requires virtuser_query to work.
|
||||
*
|
||||
* @author Alice Gaudon
|
||||
* @license MIT
|
||||
*/
|
||||
class virtuser_identities_autoupdate extends rcube_plugin
|
||||
{
|
||||
private $rc;
|
||||
private $config;
|
||||
private $db;
|
||||
|
||||
function init()
|
||||
{
|
||||
$this->rc = rcmail::get_instance();
|
||||
$this->load_config();
|
||||
$this->config = $this->rc->config->get('virtuser_identity_autoupdate');
|
||||
|
||||
$this->add_hook('login_after', array($this, 'login_after'));
|
||||
}
|
||||
|
||||
function login_after($args)
|
||||
{
|
||||
if (!$this->config['update_on_login']) {
|
||||
return $args;
|
||||
}
|
||||
|
||||
$user = rcmail::get_instance()->user;
|
||||
|
||||
$current_identities = $this->rc->user->list_emails();
|
||||
$target_identities = $this->fetch_aliases($user->data['username']);
|
||||
|
||||
// If enabled, remove unknown identities
|
||||
if ($this->config['remove_unknown_alias_identities']) {
|
||||
foreach ($current_identities as $existing_identity) {
|
||||
if (!in_array($current_identity['email'], $target_identities)) {
|
||||
// Remove
|
||||
$id = $existing_identity['identity_id'];
|
||||
$hook_result = $this->rc->plugins->exec_hook('identity_delete', $id);
|
||||
|
||||
if (!$hook_result['abort']) {
|
||||
$this->rc->user->delete_identity($id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$identity_name = '';
|
||||
|
||||
// Add new identities
|
||||
foreach ($target_identities as $new_identity) {
|
||||
$exists = false;
|
||||
foreach ($current_identities as $existing_identity) {
|
||||
$identity_name = $existing_identity['name']; // Make it a bit random. TODO: pick it from the alias request OR a custom request
|
||||
if ($existing_identity['email'] == $new_identity) {
|
||||
$exists = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ($exists) break;
|
||||
|
||||
// Add
|
||||
$hook_result = $this->rc->plugins->exec_hook('identity_create', array(
|
||||
'login' => false, // Most often triggered when the use was created long ago
|
||||
'record' => array(
|
||||
'user_id' => $this->rc->user->ID,
|
||||
'standard' => 0,
|
||||
'email' => $new_identity,
|
||||
'name' => $identity_name
|
||||
),
|
||||
));
|
||||
|
||||
if (!$hook_result['abort'] && $hook_result['record']['email']) {
|
||||
$this->rc->user->insert_identity($hook_result['record']);
|
||||
}
|
||||
}
|
||||
|
||||
return $args;
|
||||
}
|
||||
|
||||
function fetch_aliases($username) {
|
||||
$aliases = array();
|
||||
|
||||
$dbh = $this->get_dbh();
|
||||
|
||||
$result = $dbh->query(preg_replace('/%u/', $dbh->escape($username), $this->config['user_aliases_query']));
|
||||
|
||||
while ($row = $dbh->fetch_array($result)) {
|
||||
array_push($aliases, $row[0]);
|
||||
}
|
||||
|
||||
if(!in_array($username, $aliases)) {
|
||||
array_push($aliases, $username);
|
||||
}
|
||||
|
||||
return $aliases;
|
||||
}
|
||||
|
||||
function get_dbh() {
|
||||
if (!$this->db) {
|
||||
if ($dsn = $this->config['dsn']) {
|
||||
$this->db = rcube_db::factory($dsn);
|
||||
$this->db->set_debug((bool)$this->rc->config->get('sql_debug'));
|
||||
$this->db->db_connect('r'); // We only need to read
|
||||
} else {
|
||||
$this->db = $this->rc->get_dbh();
|
||||
}
|
||||
}
|
||||
|
||||
return $this->db;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user