]> git.donarmstrong.com Git - roundcube.git/blobdiff - plugins/squirrelmail_usercopy/squirrelmail_usercopy.php
Imported Debian patch 0.5.2+dfsg-1
[roundcube.git] / plugins / squirrelmail_usercopy / squirrelmail_usercopy.php
index 4a14ff2c928f7ba7a3a3ef3dc46b4b67fa86f12c..ee6bcc04b806505a0615a804fafb158ac31459d2 100644 (file)
@@ -3,51 +3,83 @@
 /**
  * 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;
                }
@@ -55,15 +87,33 @@ class squirrelmail_usercopy extends rcube_plugin
                return $p;
        }
 
-       private function read_squirrel_prefs($uname)
+       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();
 
-               if ($srcdir = $rcmail->config->get('squirrelmail_data_dir')) {
+               /**** 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();
@@ -74,7 +124,16 @@ class squirrelmail_usercopy extends rcube_plugin
 
                                // 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
@@ -86,9 +145,46 @@ class squirrelmail_usercopy extends rcube_plugin
                                        }
                                }
                        }
-               }
+               } 
+               /**** Database backend ****/
+               else if ($rcmail->config->get('squirrelmail_driver') == 'sql') { 
+                       $this->prefs = array();
+
+                       /* connect to squirrelmail database */
+                       $db = new rcube_mdb2($rcmail->config->get('squirrelmail_dsn'));
+                       $db->db_connect('r'); // connect in read mode
+
+                       // $db->set_debug(true);
+
+                       /* 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['note']      = 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