From fc52af24f1418d6590a2d37a0d8cc31b123e38f6 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli <thomas@roundcube.net> Date: Tue, 19 Aug 2014 12:08:35 -0400 Subject: [PATCH] Fix merge error that disabled contact drag'n'drop --- plugins/squirrelmail_usercopy/squirrelmail_usercopy.php | 149 +++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 124 insertions(+), 25 deletions(-) diff --git a/plugins/squirrelmail_usercopy/squirrelmail_usercopy.php b/plugins/squirrelmail_usercopy/squirrelmail_usercopy.php index cc44f35..7849f91 100644 --- a/plugins/squirrelmail_usercopy/squirrelmail_usercopy.php +++ b/plugins/squirrelmail_usercopy/squirrelmail_usercopy.php @@ -3,64 +3,117 @@ /** * Copy a new users identity and settings from a nearby Squirrelmail installation * - * Currently only file-based data storage of Squirrelmail is supported. - * - * @version 1.0 - * @author Thomas Bruederli + * @version 1.4 + * @author Thomas Bruederli, Johannes Hessellund, pommi, Thomas Lueder */ class squirrelmail_usercopy extends rcube_plugin { + public $task = 'login'; + private $prefs = null; + private $identities_level = 0; private $abook = array(); public function init() { - $this->add_hook('create_user', array($this, 'create_user')); - $this->add_hook('create_identity', array($this, 'create_identity')); + $this->add_hook('user_create', array($this, 'create_user')); + $this->add_hook('identity_create', array($this, 'create_identity')); } public function create_user($p) { + $rcmail = rcmail::get_instance(); + + // Read plugin's config + $this->initialize(); + // read prefs and add email address $this->read_squirrel_prefs($p['user']); - if ($this->prefs['email_address']) + if (($this->identities_level == 0 || $this->identities_level == 2) && $rcmail->config->get('squirrelmail_set_alias') && $this->prefs['email_address']) $p['user_email'] = $this->prefs['email_address']; - return $p; } public function create_identity($p) { - // only execute on login - if ($p['login'] && $this->prefs) { + $rcmail = rcmail::get_instance(); + + // prefs are set in create_user() + if ($this->prefs) { if ($this->prefs['full_name']) $p['record']['name'] = $this->prefs['full_name']; - if ($this->prefs['email_address']) + if (($this->identities_level == 0 || $this->identities_level == 2) && $this->prefs['email_address']) $p['record']['email'] = $this->prefs['email_address']; - if ($this->prefs['signature']) - $p['record']['signature'] = $this->prefs['signature']; - + if ($this->prefs['___signature___']) + $p['record']['signature'] = $this->prefs['___signature___']; + if ($this->prefs['reply_to']) + $p['record']['reply-to'] = $this->prefs['reply_to']; + if (($this->identities_level == 0 || $this->identities_level == 1) && isset($this->prefs['identities']) && $this->prefs['identities'] > 1) { + for ($i=1; $i < $this->prefs['identities']; $i++) { + unset($ident_data); + $ident_data = array('name' => '', 'email' => ''); // required data + if ($this->prefs['full_name'.$i]) + $ident_data['name'] = $this->prefs['full_name'.$i]; + if ($this->identities_level == 0 && $this->prefs['email_address'.$i]) + $ident_data['email'] = $this->prefs['email_address'.$i]; + else + $ident_data['email'] = $p['record']['email']; + if ($this->prefs['reply_to'.$i]) + $ident_data['reply-to'] = $this->prefs['reply_to'.$i]; + if ($this->prefs['___sig'.$i.'___']) + $ident_data['signature'] = $this->prefs['___sig'.$i.'___']; + // insert identity + $identid = $rcmail->user->insert_identity($ident_data); + } + } + // copy address book - $rcmail = rcmail::get_instance(); $contacts = $rcmail->get_address_book(null, true); if ($contacts && count($this->abook)) { - foreach ($this->abook as $rec) - $contacts->insert($rec, true); - } + foreach ($this->abook as $rec) { + // #1487096 handle multi-address and/or too long items + $rec['email'] = array_shift(explode(';', $rec['email'])); + if (check_email(rcube_idn_to_ascii($rec['email']))) { + $rec['email'] = rcube_idn_to_utf8($rec['email']); + $contacts->insert($rec, true); + } + } + } + + // mark identity as complete for following hooks + $p['complete'] = true; } return $p; } - private function read_squirrel_prefs($uname) + private function initialize() { - $this->load_config(); $rcmail = rcmail::get_instance(); - if ($srcdir = $rcmail->config->get('squirrelmail_data_dir')) { + // Load plugin's config file + $this->load_config(); + + // Set identities_level for operations of this plugin + $ilevel = $rcmail->config->get('squirrelmail_identities_level'); + if ($ilevel === null) + $ilevel = $rcmail->config->get('identities_level', 0); + + $this->identities_level = intval($ilevel); + } + + private function read_squirrel_prefs($uname) + { + $rcmail = rcmail::get_instance(); + + /**** File based backend ****/ + if ($rcmail->config->get('squirrelmail_driver') == 'file' && ($srcdir = $rcmail->config->get('squirrelmail_data_dir'))) { + if (($hash_level = $rcmail->config->get('squirrelmail_data_dir_hash_level')) > 0) + $srcdir = slashify($srcdir).chunk_split(substr(base_convert(crc32($uname), 10, 16), 0, $hash_level), 1, '/'); $prefsfile = slashify($srcdir) . $uname . '.pref'; $abookfile = slashify($srcdir) . $uname . '.abook'; $sigfile = slashify($srcdir) . $uname . '.sig'; + $sigbase = slashify($srcdir) . $uname . '.si'; if (is_readable($prefsfile)) { $this->prefs = array(); @@ -71,7 +124,16 @@ // also read signature file if exists if (is_readable($sigfile)) { - $this->prefs['signature'] = utf8_encode(file_get_contents($sigfile)); + $this->prefs['___signature___'] = utf8_encode(file_get_contents($sigfile)); + } + + if (isset($this->prefs['identities']) && $this->prefs['identities'] > 1) { + for ($i=1; $i < $this->prefs['identities']; $i++) { + // read signature file if exists + if (is_readable($sigbase.$i)) { + $this->prefs['___sig'.$i.'___'] = utf8_encode(file_get_contents($sigbase.$i)); + } + } } // parse addres book file @@ -83,9 +145,46 @@ } } } - } + } + /**** Database backend ****/ + else if ($rcmail->config->get('squirrelmail_driver') == 'sql') { + $this->prefs = array(); + + /* connect to squirrelmail database */ + $db = rcube_db::factory($rcmail->config->get('squirrelmail_dsn')); + + $db->set_debug($rcmail->config->get('sql_debug')); + $db->db_connect('r'); // connect in read mode + + /* retrieve prefs */ + $userprefs_table = $rcmail->config->get('squirrelmail_userprefs_table'); + $address_table = $rcmail->config->get('squirrelmail_address_table'); + $db_charset = $rcmail->config->get('squirrelmail_db_charset'); + + if ($db_charset) + $db->query('SET NAMES '.$db_charset); + + $sql_result = $db->query('SELECT * FROM '.$userprefs_table.' WHERE user=?', $uname); // ? is replaced with emailaddress + + while ($sql_array = $db->fetch_assoc($sql_result) ) { // fetch one row from result + $this->prefs[$sql_array['prefkey']] = rcube_charset_convert(rtrim($sql_array['prefval']), $db_charset); + } + + /* retrieve address table data */ + $sql_result = $db->query('SELECT * FROM '.$address_table.' WHERE owner=?', $uname); // ? is replaced with emailaddress + + // parse addres book + while ($sql_array = $db->fetch_assoc($sql_result) ) { // fetch one row from result + $rec['name'] = rcube_charset_convert(rtrim($sql_array['nickname']), $db_charset); + $rec['firstname'] = rcube_charset_convert(rtrim($sql_array['firstname']), $db_charset); + $rec['surname'] = rcube_charset_convert(rtrim($sql_array['lastname']), $db_charset); + $rec['email'] = rcube_charset_convert(rtrim($sql_array['email']), $db_charset); + $rec['notes'] = rcube_charset_convert(rtrim($sql_array['label']), $db_charset); + + if ($rec['name'] && $rec['email']) + $this->abook[] = $rec; + } + } // end if 'sql'-driver } } - -?> \ No newline at end of file -- Gitblit v1.9.1