diff options
| author | thomasb <thomasb@208e9e7b-5314-0410-a742-e7e81cd9613c> | 2012-03-31 12:25:48 +0000 |
|---|---|---|
| committer | thomasb <thomasb@208e9e7b-5314-0410-a742-e7e81cd9613c> | 2012-03-31 12:25:48 +0000 |
| commit | e6d8f97bf2e0bbb4d95df0c4e030eb7ec6ef75a5 (patch) | |
| tree | 4f6fdadb51cbe1a2bb3b2b06c9bcabb0429d1a84 /roundcubemail/plugins/database_attachments/database_attachments.php | |
| parent | 868c169e2a64c1d19a9b6bbcd98f268808dfd173 (diff) | |
Move plugins repository into roundcubemail root folder; svn:externals are not defined anymore
git-svn-id: https://svn.roundcube.net/trunk@6034 208e9e7b-5314-0410-a742-e7e81cd9613c
Diffstat (limited to 'roundcubemail/plugins/database_attachments/database_attachments.php')
| -rw-r--r-- | roundcubemail/plugins/database_attachments/database_attachments.php | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/roundcubemail/plugins/database_attachments/database_attachments.php b/roundcubemail/plugins/database_attachments/database_attachments.php new file mode 100644 index 000000000..9a279f57e --- /dev/null +++ b/roundcubemail/plugins/database_attachments/database_attachments.php @@ -0,0 +1,169 @@ +<?php +/** + * Filesystem Attachments + * + * This plugin which provides database backed storage for temporary + * attachment file handling. The primary advantage of this plugin + * is its compatibility with round-robin dns multi-server roundcube + * installations. + * + * This plugin relies on the core filesystem_attachments plugin + * + * @author Ziba Scott <ziba@umich.edu> + * @author Aleksander Machniak <alec@alec.pl> + * @version @package_version@ + */ +require_once('plugins/filesystem_attachments/filesystem_attachments.php'); +class database_attachments extends filesystem_attachments +{ + + // A prefix for the cache key used in the session and in the key field of the cache table + private $cache_prefix = "db_attach"; + + /** + * Helper method to generate a unique key for the given attachment file + */ + private function _key($args) + { + $uname = $args['path'] ? $args['path'] : $args['name']; + return $this->cache_prefix . $args['group'] . md5(mktime() . $uname . $_SESSION['user_id']); + } + + /** + * Save a newly uploaded attachment + */ + function upload($args) + { + $args['status'] = false; + $rcmail = rcmail::get_instance(); + $key = $this->_key($args); + + $data = file_get_contents($args['path']); + + if ($data === false) + return $args; + + $data = base64_encode($data); + + $status = $rcmail->db->query( + "INSERT INTO ".get_table_name('cache')." + (created, user_id, cache_key, data) + VALUES (".$rcmail->db->now().", ?, ?, ?)", + $_SESSION['user_id'], + $key, + $data); + + if ($status) { + $args['id'] = $key; + $args['status'] = true; + unset($args['path']); + } + + return $args; + } + + /** + * Save an attachment from a non-upload source (draft or forward) + */ + function save($args) + { + $args['status'] = false; + $rcmail = rcmail::get_instance(); + + $key = $this->_key($args); + + if ($args['path']) { + $args['data'] = file_get_contents($args['path']); + + if ($args['data'] === false) + return $args; + } + + $data = base64_encode($args['data']); + + $status = $rcmail->db->query( + "INSERT INTO ".get_table_name('cache')." + (created, user_id, cache_key, data) + VALUES (".$rcmail->db->now().", ?, ?, ?)", + $_SESSION['user_id'], + $key, + $data); + + if ($status) { + $args['id'] = $key; + $args['status'] = true; + } + + return $args; + } + + /** + * Remove an attachment from storage + * This is triggered by the remove attachment button on the compose screen + */ + function remove($args) + { + $args['status'] = false; + $rcmail = rcmail::get_instance(); + $status = $rcmail->db->query( + "DELETE FROM ".get_table_name('cache')." + WHERE user_id=? + AND cache_key=?", + $_SESSION['user_id'], + $args['id']); + + if ($status) { + $args['status'] = true; + } + + return $args; + } + + /** + * When composing an html message, image attachments may be shown + * For this plugin, $this->get() will check the file and + * return it's contents + */ + function display($args) + { + return $this->get($args); + } + + /** + * When displaying or sending the attachment the file contents are fetched + * using this method. This is also called by the attachment_display hook. + */ + function get($args) + { + $rcmail = rcmail::get_instance(); + + $sql_result = $rcmail->db->query( + "SELECT cache_id, data + FROM ".get_table_name('cache')." + WHERE user_id=? + AND cache_key=?", + $_SESSION['user_id'], + $args['id']); + + if ($sql_arr = $rcmail->db->fetch_assoc($sql_result)) { + $args['data'] = base64_decode($sql_arr['data']); + $args['status'] = true; + } + + return $args; + } + + /** + * Delete all temp files associated with this user + */ + function cleanup($args) + { + $prefix = $this->cache_prefix . $args['group']; + $rcmail = rcmail::get_instance(); + $rcmail->db->query( + "DELETE FROM ".get_table_name('cache')." + WHERE user_id=? + AND cache_key like '{$prefix}%'", + $_SESSION['user_id']); + } +} |
