2 commits - plugins/calendar plugins/libkolab plugins/tasklist

Thomas Brüderli bruederli at kolabsys.com
Wed Apr 23 20:44:56 CEST 2014


 plugins/calendar/calendar.php                                  |   11 +++
 plugins/calendar/drivers/calendar_driver.php                   |   11 +++
 plugins/calendar/drivers/database/database_driver.php          |   30 ++++++++++
 plugins/calendar/drivers/kolab/kolab_driver.php                |   11 +++
 plugins/libkolab/lib/kolab_storage.php                         |   12 ++++
 plugins/libkolab/libkolab.php                                  |    5 +
 plugins/tasklist/drivers/database/tasklist_database_driver.php |   21 ++++++-
 plugins/tasklist/drivers/tasklist_driver.php                   |   11 +++
 plugins/tasklist/tasklist.php                                  |   10 +++
 9 files changed, 119 insertions(+), 3 deletions(-)

New commits:
commit 27f1717d0140258a9b380576eb6010f4133cbd18
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Wed Apr 23 20:44:46 2014 +0200

    Implement user_delete plugin hooks to clean-up calendar and tasks data

diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php
index ef39665..4bfe0d9 100644
--- a/plugins/calendar/calendar.php
+++ b/plugins/calendar/calendar.php
@@ -100,6 +100,8 @@ class calendar extends rcube_plugin
       // default startup routine
       $this->add_hook('startup', array($this, 'startup'));
     }
+
+    $this->add_hook('user_delete', array($this, 'user_delete'));
   }
 
   /**
@@ -2699,6 +2701,15 @@ class calendar extends rcube_plugin
   }
 
   /**
+   * Handler for user_delete plugin hook
+   */
+  public function user_delete($args)
+  {
+     $this->load_driver();
+     return $this->driver->user_delete($args);
+  }
+
+  /**
    * Magic getter for public access to protected members
    */
   public function __get($name)
diff --git a/plugins/calendar/drivers/calendar_driver.php b/plugins/calendar/drivers/calendar_driver.php
index 6769cfd..c5eff9d 100644
--- a/plugins/calendar/drivers/calendar_driver.php
+++ b/plugins/calendar/drivers/calendar_driver.php
@@ -531,4 +531,15 @@ abstract class calendar_driver
     return $events;
   }
 
+  /**
+   * Handler for user_delete plugin hook
+   *
+   * @param array Hash array with hook arguments
+   * @return array Return arguments for plugin hooks
+   */
+  public function user_delete($args)
+  {
+    // TO BE OVERRIDDEN
+    return $args;
+  }
 }
diff --git a/plugins/calendar/drivers/database/database_driver.php b/plugins/calendar/drivers/database/database_driver.php
index b4de23b..9b04bf1 100644
--- a/plugins/calendar/drivers/database/database_driver.php
+++ b/plugins/calendar/drivers/database/database_driver.php
@@ -1141,4 +1141,34 @@ class database_driver extends calendar_driver
       return $valarms;
   }
 
+  /**
+   * Handler for user_delete plugin hook
+   */
+  public function user_delete($args)
+  {
+      $db = $this->rc->db;
+      $user = $args['user'];
+      $event_ids = array();
+
+      $events = $db->query(
+          "SELECT event_id FROM " . $this->db_events . " AS ev" .
+          " LEFT JOIN " . $this->db_calendars . " cal ON (ev.calendar_id = cal.calendar_id)".
+          " WHERE user_id=?",
+          $user->ID);
+
+      while ($row = $db->fetch_assoc($calendars)) {
+          $event_ids[] = $row['event_id'];
+      }
+
+      if (!empty($event_ids)) {
+          foreach (array($this->db_attachments, $this->db_events) as $table) {
+              $db->query(sprintf("DELETE FROM $table WHERE event_id IN (%s)", join(',', $event_ids)));
+          }
+      }
+
+      foreach (array($this->db_calendars, 'itipinvitations') as $table) {
+          $db->query("DELETE FROM $table WHERE user_id=?", $user->ID);
+      }
+  }
+
 }
diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php
index 6058dfb..28eb8ba 100644
--- a/plugins/calendar/drivers/kolab/kolab_driver.php
+++ b/plugins/calendar/drivers/kolab/kolab_driver.php
@@ -1299,4 +1299,15 @@ class kolab_driver extends calendar_driver
 
     return $plugin['form']['sharing']['content'];
   }
+
+  /**
+   * Handler for user_delete plugin hook
+   */
+  public function user_delete($args)
+  {
+    $db = $this->rc->get_dbh();
+    foreach (array('kolab_alarms', 'itipinvitations') as $table) {
+      $db->query("DELETE FROM $table WHERE user_id=?", $args['user']->ID);
+    }
+  }
 }
diff --git a/plugins/tasklist/drivers/database/tasklist_database_driver.php b/plugins/tasklist/drivers/database/tasklist_database_driver.php
index f40d504..cf1885b 100644
--- a/plugins/tasklist/drivers/database/tasklist_database_driver.php
+++ b/plugins/tasklist/drivers/database/tasklist_database_driver.php
@@ -89,7 +89,8 @@ class tasklist_database_driver extends tasklist_driver
     {
       // attempt to create a default list for this user
       if (empty($this->lists)) {
-        if ($this->create_list(array('name' => 'Default', 'color' => '000000')))
+        $prop = array('name' => 'Default', 'color' => '000000');
+        if ($this->create_list($prop))
           $this->_read_lists();
       }
 
@@ -723,4 +724,22 @@ class tasklist_database_driver extends tasklist_driver
         return $valarms;
     }
 
+    /**
+     * Handler for user_delete plugin hook
+     */
+    public function user_delete($args)
+    {
+        $db = $this->rc->db;
+        $list_ids = array();
+        $lists = $db->query("SELECT tasklist_id FROM " . $this->db_lists . " WHERE user_id=?", $args['user']->ID);
+        while ($row = $db->fetch_assoc($lists)) {
+            $list_ids[] = $row['tasklist_id'];
+        }
+
+        if (!empty($list_ids)) {
+            foreach (array($this->db_tasks, $this->db_lists) as $table) {
+                $db->query(sprintf("DELETE FROM $table WHERE tasklist_id IN (%s)", join(',', $list_ids)));
+            }
+        }
+    }
 }
diff --git a/plugins/tasklist/drivers/tasklist_driver.php b/plugins/tasklist/drivers/tasklist_driver.php
index ee5a161..382a910 100644
--- a/plugins/tasklist/drivers/tasklist_driver.php
+++ b/plugins/tasklist/drivers/tasklist_driver.php
@@ -277,4 +277,15 @@ abstract class tasklist_driver
         return $html;
     }
 
+    /**
+     * Handler for user_delete plugin hook
+     *
+     * @param array Hash array with hook arguments
+     * @return array Return arguments for plugin hooks
+     */
+    public function user_delete($args)
+    {
+        // TO BE OVERRIDDEN
+        return $args;
+    }
 }
diff --git a/plugins/tasklist/tasklist.php b/plugins/tasklist/tasklist.php
index 9532c61..ace7e45 100644
--- a/plugins/tasklist/tasklist.php
+++ b/plugins/tasklist/tasklist.php
@@ -75,6 +75,8 @@ class tasklist extends rcube_plugin
 
         // proceed initialization in startup hook
         $this->add_hook('startup', array($this, 'startup'));
+
+        $this->add_hook('user_delete', array($this, 'user_delete'));
     }
 
     /**
@@ -984,5 +986,13 @@ class tasklist extends rcube_plugin
       return strtoupper(md5(time() . uniqid(rand())) . '-' . substr(md5($this->rc->user->get_username()), 0, 16));
     }
 
+    /**
+     * Handler for user_delete plugin hook
+     */
+    public function user_delete($args)
+    {
+       $this->load_driver();
+       return $this->driver->user_delete($args);
+    }
 }
 


commit 51bfc0ea4d963afe07cb7b3fac20286d1bcaf053
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Wed Apr 23 20:00:24 2014 +0200

    Hook into user_delete actions and clear cache data for the given user.
    
    ATTENTION: this requires 'libkolab' to be listed in $config['plugins'].

diff --git a/plugins/libkolab/lib/kolab_storage.php b/plugins/libkolab/lib/kolab_storage.php
index b7c981b..52df016 100644
--- a/plugins/libkolab/lib/kolab_storage.php
+++ b/plugins/libkolab/lib/kolab_storage.php
@@ -1141,6 +1141,18 @@ class kolab_storage
         }
     }
 
+    /**
+     * Handler for user_delete plugin hooks
+     *
+     * Remove all cache data from the local database related to the given user.
+     */
+    public static function delete_user_folders($args)
+    {
+        $db = rcmail::get_instance()->get_dbh();
+        $prefix = 'imap://' . urlencode($args['username']) . '@' . $args['host'] . '/%';
+        $db->query("DELETE FROM " . $db->table_name('kolab_folders') . " WHERE resource LIKE ?", $prefix);
+    }
+
 }
 
 /**
diff --git a/plugins/libkolab/libkolab.php b/plugins/libkolab/libkolab.php
index 48a5033..c32d65a 100644
--- a/plugins/libkolab/libkolab.php
+++ b/plugins/libkolab/libkolab.php
@@ -37,12 +37,13 @@ class libkolab extends rcube_plugin
         // load local config
         $this->load_config();
 
-        $this->add_hook('storage_init', array($this, 'storage_init'));
-
         // extend include path to load bundled lib classes
         $include_path = $this->home . '/lib' . PATH_SEPARATOR . ini_get('include_path');
         set_include_path($include_path);
 
+        $this->add_hook('storage_init', array($this, 'storage_init'));
+        $this->add_hook('user_delete', array('kolab_storage', 'delete_user_folders'));
+
         $rcmail = rcube::get_instance();
         try {
             kolab_format::$timezone = new DateTimeZone($rcmail->config->get('timezone', 'GMT'));




More information about the commits mailing list