]> git.donarmstrong.com Git - roundcube.git/blob - plugins/filesystem_attachments/filesystem_attachments.php
Imported Upstream version 0.3.1
[roundcube.git] / plugins / filesystem_attachments / filesystem_attachments.php
1 <?php
2 /**
3  * Filesystem Attachments
4  * 
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.
10  *
11  * Developers may wish to extend this class when creating attachment
12  * handler plugins:
13  *   require_once('plugins/filesystem_attachments/filesystem_attachments.php');
14  *   class myCustom_attachments extends filesystem_attachments
15  *
16  * @author Ziba Scott <ziba@umich.edu>
17  * @author Thomas Bruederli <roundcube@gmail.com>
18  * 
19  */
20 class filesystem_attachments extends rcube_plugin
21 {
22     public $task = 'mail';
23     
24     function init()
25     {
26         // Save a newly uploaded attachment
27         $this->add_hook('upload_attachment', array($this, 'upload'));
28
29         // Save an attachment from a non-upload source (draft or forward)
30         $this->add_hook('save_attachment', array($this, 'save'));
31
32         // Remove an attachment from storage
33         $this->add_hook('remove_attachment', array($this, 'remove'));
34
35         // When composing an html message, image attachments may be shown
36         $this->add_hook('display_attachment', array($this, 'display'));
37
38         // Get the attachment from storage and place it on disk to be sent
39         $this->add_hook('get_attachment', array($this, 'get_attachment'));
40
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'));
44     }
45
46     /**
47      * Save a newly uploaded attachment
48      */
49     function upload($args)
50     {
51         $args['status'] = false;
52         $rcmail = rcmail::get_instance();
53
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');
58
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;
63
64             // Note the file for later cleanup
65             $_SESSION['plugins']['filesystem_attachments']['tmp_files'][] = $tmpfname;
66         }
67
68         return $args;
69     }
70
71     /**
72      * Save an attachment from a non-upload source (draft or forward)
73      */
74     function save($args)
75     {
76         $args['status'] = false;
77
78         if (!$args['path']) {
79             $rcmail = rcmail::get_instance();
80             $temp_dir = unslashify($rcmail->config->get('temp_dir'));
81             $tmp_path = tempnam($temp_dir, 'rcmAttmnt');
82
83             if ($fp = fopen($tmp_path, 'w')) {
84                 fwrite($fp, $args['data']);
85                 fclose($fp);
86                 $args['path'] = $tmp_path;
87             } else
88                 return $args;
89         }
90         
91         $args['id'] = $this->file_id();
92         $args['status'] = true;
93             
94         // Note the file for later cleanup
95         $_SESSION['plugins']['filesystem_attachments']['tmp_files'][] = $args['path'];
96
97         return $args;
98     }
99
100     /**
101      * Remove an attachment from storage
102      * This is triggered by the remove attachment button on the compose screen
103      */
104     function remove($args)
105     {
106         $args['status'] = @unlink($args['path']);
107         return $args;
108     }
109
110     /**
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
114      */
115     function display($args)
116     {
117         $args['status'] = file_exists($args['path']);
118         return $args;
119     }
120
121     /**
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.
125      */
126     function get_attachment($args)
127     {
128         return $args;
129     }
130     
131     /**
132      * Delete all temp files associated with this user
133      */
134     function cleanup($args)
135     {
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)){
142                     unlink($filename);
143                 }
144             }
145             unset($_SESSION['plugins']['filesystem_attachments']['tmp_files']);
146         }
147         return $args;
148     }
149
150     function file_id()
151     {
152         $userid = rcmail::get_instance()->user->ID;
153         list($usec, $sec) = explode(' ', microtime()); 
154         return preg_replace('/[^0-9]/', '', $userid . $sec . $usec);
155     }
156 }