source: github/plugins/filesystem_attachments/filesystem_attachments.php @ 5fec6de

Last change on this file since 5fec6de was 5fec6de, checked in by thomascube <thomas@…>, 2 years ago

Copy plugins to release branch

  • Property mode set to 100644
File size: 4.9 KB
Line 
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 */
20class 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('attachment_upload', array($this, 'upload'));
28
29        // Save an attachment from a non-upload source (draft or forward)
30        $this->add_hook('attachment_save', array($this, 'save'));
31
32        // Remove an attachment from storage
33        $this->add_hook('attachment_delete', array($this, 'remove'));
34
35        // When composing an html message, image attachments may be shown
36        $this->add_hook('attachment_display', array($this, 'display'));
37
38        // Get the attachment from storage and place it on disk to be sent
39        $this->add_hook('attachment_get', array($this, 'get'));
40
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'));
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        $temp_dir = $rcmail->config->get('temp_dir');
56        $tmpfname = tempnam($temp_dir, 'rcmAttmnt');
57
58        if (move_uploaded_file($args['path'], $tmpfname) && file_exists($tmpfname)) {
59            $args['id'] = $this->file_id();
60            $args['path'] = $tmpfname;
61            $args['status'] = true;
62
63            // Note the file for later cleanup
64            $_SESSION['plugins']['filesystem_attachments']['tmp_files'][] = $tmpfname;
65        }
66
67        return $args;
68    }
69
70    /**
71     * Save an attachment from a non-upload source (draft or forward)
72     */
73    function save($args)
74    {
75        $args['status'] = false;
76
77        if (!$args['path']) {
78            $rcmail = rcmail::get_instance();
79            $temp_dir = $rcmail->config->get('temp_dir');
80            $tmp_path = tempnam($temp_dir, 'rcmAttmnt');
81
82            if ($fp = fopen($tmp_path, 'w')) {
83                fwrite($fp, $args['data']);
84                fclose($fp);
85                $args['path'] = $tmp_path;
86            } else
87                return $args;
88        }
89
90        $args['id'] = $this->file_id();
91        $args['status'] = true;
92
93        // Note the file for later cleanup
94        $_SESSION['plugins']['filesystem_attachments']['tmp_files'][] = $args['path'];
95
96        return $args;
97    }
98
99    /**
100     * Remove an attachment from storage
101     * This is triggered by the remove attachment button on the compose screen
102     */
103    function remove($args)
104    {
105        $args['status'] = @unlink($args['path']);
106        return $args;
107    }
108
109    /**
110     * When composing an html message, image attachments may be shown
111     * For this plugin, the file is already in place, just check for
112     * the existance of the proper metadata
113     */
114    function display($args)
115    {
116        $args['status'] = file_exists($args['path']);
117        return $args;
118    }
119
120    /**
121     * This attachment plugin doesn't require any steps to put the file
122     * on disk for use.  This stub function is kept here to make this
123     * class handy as a parent class for other plugins which may need it.
124     */
125    function get($args)
126    {
127        return $args;
128    }
129
130    /**
131     * Delete all temp files associated with this user
132     */
133    function cleanup($args)
134    {
135        // $_SESSION['compose']['attachments'] is not a complete record of
136        // temporary files because loading a draft or starting a forward copies
137        // the file to disk, but does not make an entry in that array
138        if (is_array($_SESSION['plugins']['filesystem_attachments']['tmp_files'])){
139            foreach ($_SESSION['plugins']['filesystem_attachments']['tmp_files'] as $filename){
140                if(file_exists($filename)){
141                    unlink($filename);
142                }
143            }
144            unset($_SESSION['plugins']['filesystem_attachments']['tmp_files']);
145        }
146        return $args;
147    }
148
149    function file_id()
150    {
151        $userid = rcmail::get_instance()->user->ID;
152            list($usec, $sec) = explode(' ', microtime()); 
153        return preg_replace('/[^0-9]/', '', $userid . $sec . $usec);
154    }
155}
Note: See TracBrowser for help on using the repository browser.