3 * Filesystem Attachments
5 * This is a core plugin which provides basic, filesystem based
6 * attachment temporary file handling. This includes storing
7 * attachments of messages currently being composed, writing attachments
8 * to disk when drafts with attachments are re-opened and writing
9 * attachments to disk for inline display in current html compositions.
11 * Developers may wish to extend this class when creating attachment
13 * require_once('plugins/filesystem_attachments/filesystem_attachments.php');
14 * class myCustom_attachments extends filesystem_attachments
16 * @author Ziba Scott <ziba@umich.edu>
17 * @author Thomas Bruederli <roundcube@gmail.com>
20 class filesystem_attachments extends rcube_plugin
22 public $task = '?(?!login).*';
26 // Save a newly uploaded attachment
27 $this->add_hook('attachment_upload', array($this, 'upload'));
29 // Save an attachment from a non-upload source (draft or forward)
30 $this->add_hook('attachment_save', array($this, 'save'));
32 // Remove an attachment from storage
33 $this->add_hook('attachment_delete', array($this, 'remove'));
35 // When composing an html message, image attachments may be shown
36 $this->add_hook('attachment_display', array($this, 'display'));
38 // Get the attachment from storage and place it on disk to be sent
39 $this->add_hook('attachment_get', array($this, 'get'));
41 // Delete all temp files associated with this user
42 $this->add_hook('attachments_cleanup', array($this, 'cleanup'));
43 $this->add_hook('session_destroy', array($this, 'cleanup'));
47 * Save a newly uploaded attachment
49 function upload($args)
51 $args['status'] = false;
52 $group = $args['group'];
53 $rcmail = rcmail::get_instance();
55 // use common temp dir for file uploads
56 $temp_dir = $rcmail->config->get('temp_dir');
57 $tmpfname = tempnam($temp_dir, 'rcmAttmnt');
59 if (move_uploaded_file($args['path'], $tmpfname) && file_exists($tmpfname)) {
60 $args['id'] = $this->file_id();
61 $args['path'] = $tmpfname;
62 $args['status'] = true;
64 // Note the file for later cleanup
65 $_SESSION['plugins']['filesystem_attachments'][$group][] = $tmpfname;
72 * Save an attachment from a non-upload source (draft or forward)
76 $group = $args['group'];
77 $args['status'] = false;
80 $rcmail = rcmail::get_instance();
81 $temp_dir = $rcmail->config->get('temp_dir');
82 $tmp_path = tempnam($temp_dir, 'rcmAttmnt');
84 if ($fp = fopen($tmp_path, 'w')) {
85 fwrite($fp, $args['data']);
87 $args['path'] = $tmp_path;
92 $args['id'] = $this->file_id();
93 $args['status'] = true;
95 // Note the file for later cleanup
96 $_SESSION['plugins']['filesystem_attachments'][$group][] = $args['path'];
102 * Remove an attachment from storage
103 * This is triggered by the remove attachment button on the compose screen
105 function remove($args)
107 $args['status'] = @unlink($args['path']);
112 * When composing an html message, image attachments may be shown
113 * For this plugin, the file is already in place, just check for
114 * the existance of the proper metadata
116 function display($args)
118 $args['status'] = file_exists($args['path']);
123 * This attachment plugin doesn't require any steps to put the file
124 * on disk for use. This stub function is kept here to make this
125 * class handy as a parent class for other plugins which may need it.
133 * Delete all temp files associated with this user
135 function cleanup($args)
137 // $_SESSION['compose']['attachments'] is not a complete record of
138 // temporary files because loading a draft or starting a forward copies
139 // the file to disk, but does not make an entry in that array
140 if (is_array($_SESSION['plugins']['filesystem_attachments'])){
141 foreach ($_SESSION['plugins']['filesystem_attachments'] as $group => $files) {
142 if ($args['group'] && $args['group'] != $group)
144 foreach ((array)$files as $filename){
145 if(file_exists($filename)){
149 unset($_SESSION['plugins']['filesystem_attachments'][$group]);
157 $userid = rcmail::get_instance()->user->ID;
158 list($usec, $sec) = explode(' ', microtime());
159 return preg_replace('/[^0-9]/', '', $userid . $sec . $usec);