From 0feb46ee1c1f0e5c9f065485bac905d2fba0161d Mon Sep 17 00:00:00 2001 From: Alice Gaudon Date: Sat, 1 Jun 2019 15:36:52 +0200 Subject: [PATCH] Add plugin main class --- virtuser_identities_autoupdate.php | 117 +++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 virtuser_identities_autoupdate.php diff --git a/virtuser_identities_autoupdate.php b/virtuser_identities_autoupdate.php new file mode 100644 index 0000000..fe771a8 --- /dev/null +++ b/virtuser_identities_autoupdate.php @@ -0,0 +1,117 @@ +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; + } +}