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 = 'mail';
26 // Save a newly uploaded attachment
27 $this->add_hook('upload_attachment', array($this, 'upload'));
29 // Save an attachment from a non-upload source (draft or forward)
30 $this->add_hook('save_attachment', array($this, 'save'));
32 // Remove an attachment from storage
33 $this->add_hook('remove_attachment', array($this, 'remove'));
35 // When composing an html message, image attachments may be shown
36 $this->add_hook('display_attachment', array($this, 'display'));
38 // Get the attachment from storage and place it on disk to be sent
39 $this->add_hook('get_attachment', array($this, 'get_attachment'));
41 // Delete all temp files associated with this user
42 $this->add_hook('cleanup_attachments', array($this, 'cleanup'));
43 $this->add_hook('kill_session', array($this, 'cleanup'));
47 * Save a newly uploaded attachment
49 function upload($args)
51 $args['status'] = false;
52 $rcmail = rcmail::get_instance();
54 // use common temp dir for file uploads
55 // #1484529: we need absolute path on Windows for move_uploaded_file()
56 $temp_dir = realpath($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'] = count($_SESSION['plugins']['filesystem_attachments']['tmp_files'])+1;
61 $args['path'] = $tmpfname;
62 $args['status'] = true;
64 // Note the file for later cleanup
65 $_SESSION['plugins']['filesystem_attachments']['tmp_files'][] = $tmpfname;
72 * Save an attachment from a non-upload source (draft or forward)
76 $args['status'] = false;
79 $rcmail = rcmail::get_instance();
80 $temp_dir = unslashify($rcmail->config->get('temp_dir'));
81 $tmp_path = tempnam($temp_dir, 'rcmAttmnt');
83 if ($fp = fopen($tmp_path, 'w')) {
84 fwrite($fp, $args['data']);
86 $args['path'] = $tmp_path;
91 $args['id'] = count($_SESSION['plugins']['filesystem_attachments']['tmp_files'])+1;
92 $args['status'] = true;
94 // Note the file for later cleanup
95 $_SESSION['plugins']['filesystem_attachments']['tmp_files'][] = $args['path'];
101 * Remove an attachment from storage
102 * This is triggered by the remove attachment button on the compose screen
104 function remove($args)
106 $args['status'] = @unlink($args['path']);
111 * When composing an html message, image attachments may be shown
112 * For this plugin, the file is already in place, just check for
113 * the existance of the proper metadata
115 function display($args)
117 $args['status'] = file_exists($args['path']);
122 * This attachment plugin doesn't require any steps to put the file
123 * on disk for use. This stub function is kept here to make this
124 * class handy as a parent class for other plugins which may need it.
126 function get_attachment($args)
132 * Delete all temp files associated with this user
134 function cleanup($args)
136 // $_SESSION['compose']['attachments'] is not a complete record of
137 // temporary files because loading a draft or starting a forward copies
138 // the file to disk, but does not make an entry in that array
139 if (is_array($_SESSION['plugins']['filesystem_attachments']['tmp_files'])){
140 foreach ($_SESSION['plugins']['filesystem_attachments']['tmp_files'] as $filename){
141 if(file_exists($filename)){
145 unset($_SESSION['plugins']['filesystem_attachments']['tmp_files']);