| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 | 
							- <?php
 - 
 - /**
 -  * Copy a new users identities and contacts from a nearby Squirrelmail installation
 -  *
 -  * @version 1.5
 -  * @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('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->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)
 -     {
 -         $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->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['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
 -                     $rcmail->user->insert_identity($ident_data);
 -                 }
 -             }
 - 
 -             // copy address book
 -             $contacts  = $rcmail->get_address_book(null, true);
 -             $addresses = array();
 -             $groups    = array();
 - 
 -             if ($contacts && !empty($this->abook)) {
 -                 foreach ($this->abook as $rec) {
 -                     // #1487096: handle multi-address and/or too long items
 -                     // #1487858: convert multi-address contacts into groups
 -                     $emails   = preg_split('/[;,]/', $rec['email'], -1, PREG_SPLIT_NO_EMPTY);
 -                     $group_id = null;
 - 
 -                     // create group for addresses
 -                     if (count($emails) > 1) {
 -                         if (!($group_id = $groups[$rec['name']])) {
 -                             if ($group = $contacts->create_group($rec['name'])) {
 -                                 $group_id = $group['id'];
 -                                 $groups[$rec['name']] = $group_id;
 -                             }
 -                         }
 -                     }
 - 
 -                     // create contacts
 -                     foreach ($emails as $email) {
 -                         if (!($contact_id = $addresses[$email]) && rcube_utils::check_email(rcube_utils::idn_to_ascii($email))) {
 -                             $rec['email'] = rcube_utils::idn_to_utf8($email);
 -                             if ($contact_id = $contacts->insert($rec, true)) {
 -                                 $addresses[$email] = $contact_id;
 -                             }
 -                         }
 - 
 -                         if ($group_id && $contact_id) {
 -                             $contacts->add_to_group($group_id, array($contact_id));
 -                         }
 -                     }
 -                 }
 -             }
 - 
 -             // mark identity as complete for following hooks
 -             $p['complete'] = true;
 -         }
 - 
 -         return $p;
 -     }
 - 
 -     private function initialize()
 -     {
 -         $rcmail = rcmail::get_instance();
 - 
 -         // 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();
 -                 foreach (file($prefsfile) as $line) {
 -                     list($key, $value) = explode('=', $line);
 -                     $this->prefs[$key] = utf8_encode(rtrim($value));
 -                 }
 - 
 -                 // also read signature file if exists
 -                 if (is_readable($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
 -                 if (filesize($abookfile)) {
 -                     foreach(file($abookfile) as $line) {
 -                         list($rec['name'], $rec['firstname'], $rec['surname'], $rec['email']) = explode('|', utf8_encode(rtrim($line)));
 -                         if ($rec['name'] && $rec['email']) {
 -                             $this->abook[] = $rec;
 -                         }
 -                     }
 -                 }
 -             }
 -         }
 -         // 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 ' . $db->quote_identifier($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 ' . $db->quote_identifier($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
 -     }
 - }
 
 
  |