diff options
Diffstat (limited to 'plugins/database_attachments')
-rw-r--r-- | plugins/database_attachments/database_attachments.php | 169 | ||||
-rw-r--r-- | plugins/database_attachments/package.xml | 62 |
2 files changed, 231 insertions, 0 deletions
diff --git a/plugins/database_attachments/database_attachments.php b/plugins/database_attachments/database_attachments.php new file mode 100644 index 000000000..9a279f57e --- /dev/null +++ b/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']); + } +} diff --git a/plugins/database_attachments/package.xml b/plugins/database_attachments/package.xml new file mode 100644 index 000000000..40db858a4 --- /dev/null +++ b/plugins/database_attachments/package.xml @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="UTF-8"?> +<package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.9.0" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 + http://pear.php.net/dtd/tasks-1.0.xsd + http://pear.php.net/dtd/package-2.0 + http://pear.php.net/dtd/package-2.0.xsd"> + <name>database_attachments</name> + <channel>pear.roundcube.net</channel> + <summary>SQL database storage for uploaded attachments</summary> + <description> + 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. + </description> + <lead> + <name>Aleksander Machniak</name> + <user>alec</user> + <email>alec@alec.pl</email> + <active>yes</active> + </lead> + <developer> + <name>Ziba Scott</name> + <user>ziba</user> + <email>ziba@umich.edu</email> + <active>yes</active> + </developer> + <date>2011-11-21</date> + <version> + <release>1.0</release> + <api>1.0</api> + </version> + <stability> + <release>stable</release> + <api>stable</api> + </stability> + <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license> + <notes>-</notes> + <contents> + <dir baseinstalldir="/" name="/"> + <file name="database_attachments.php" role="php"> + <tasks:replace from="@name@" to="name" type="package-info"/> + <tasks:replace from="@package_version@" to="version" type="package-info"/> + </file> + </dir> + <!-- / --> + </contents> + <dependencies> + <required> + <php> + <min>5.2.1</min> + </php> + <pearinstaller> + <min>1.7.0</min> + </pearinstaller> + <package> + <name>filesystem_attachments</name> + <channel>pear.roundcube.net</channel> + </package> + </required> + </dependencies> + <phprelease/> +</package> |