fsf changes, meant to be rebased on upstream
[squirrelmail.git] / functions / attachment_common.php
CommitLineData
7baf86a9 1<?php
7350889b 2
35586184 3/**
4 * attachment_common.php
5 *
35586184 6 * This file provides the handling of often-used attachment types.
7 *
c997cbe6 8 * @copyright 1999-2021 The SquirrelMail Project Team
4b4abf93 9 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
31841a9e 10 * @version $Id$
d6c32258 11 * @package squirrelmail
3169f064 12 * @todo document attachment $type hook arguments
35586184 13 */
7baf86a9 14
fdbac73b 15$attachment_common_show_images_list = array();
3169f064 16
4691e788 17/**
18 * Mapping of file extensions to mime types
19 *
20 * Used for application/octet-stream mime type detection.
21 * Supported extensions: bmp, gif, htm, html, jpg, jpeg, php,
22 * png, rtf, txt, patch (since 1.4.2), vcf
23 * @global array $FileExtensionToMimeType
24 */
5bc6067b 25$FileExtensionToMimeType = array('bmp' => 'image/x-bitmap',
26 'gif' => 'image/gif',
27 'htm' => 'text/html',
28 'html' => 'text/html',
6cbe465c 29 'jpe' => 'image/jpeg',
5bc6067b 30 'jpg' => 'image/jpeg',
31 'jpeg' => 'image/jpeg',
32 'php' => 'text/plain',
33 'png' => 'image/png',
34 'rtf' => 'text/richtext',
35 'txt' => 'text/plain',
ab8b558f 36 'patch'=> 'text/plain',
5bc6067b 37 'vcf' => 'text/x-vcard');
38
39/* Register browser-supported image types */
b455793d 40sqgetGlobalVar('attachment_common_types', $attachment_common_types);
4691e788 41// FIXME: do we use $attachment_common_types that is not extracted by sqgetGlobalVar() ?
5bc6067b 42if (isset($attachment_common_types)) {
4691e788 43 // var is used to detect activation of jpeg image types
44 unset($jpeg_done);
5bc6067b 45 /* Don't run this before being logged in. That may happen
46 when plugins include mime.php */
47 foreach ($attachment_common_types as $val => $v) {
7baf86a9 48 if ($val == 'image/gif')
5bc6067b 49 register_attachment_common('image/gif', 'link_image');
6cbe465c 50 elseif (($val == 'image/jpeg' || $val == 'image/pjpeg' || $val == 'image/jpg') and
7baf86a9 51 (!isset($jpeg_done))) {
5bc6067b 52 $jpeg_done = 1;
6cbe465c 53 register_attachment_common('image/jpg', 'link_image');
5bc6067b 54 register_attachment_common('image/jpeg', 'link_image');
55 register_attachment_common('image/pjpeg', 'link_image');
7baf86a9 56 }
57 elseif ($val == 'image/png')
5bc6067b 58 register_attachment_common('image/png', 'link_image');
7baf86a9 59 elseif ($val == 'image/x-xbitmap')
5bc6067b 60 register_attachment_common('image/x-xbitmap', 'link_image');
4691e788 61 elseif ($val == '*/*' || $val == 'image/*') {
62 /**
202bcbcc 63 * browser (Firefox) declared that anything is acceptable.
4691e788 64 * Lets register some common image types.
65 */
66 if (! isset($jpeg_done)) {
67 $jpeg_done = 1;
6cbe465c 68 register_attachment_common('image/jpg', 'link_image');
4691e788 69 register_attachment_common('image/jpeg', 'link_image');
70 register_attachment_common('image/pjpeg', 'link_image');
4691e788 71 }
72 register_attachment_common('image/gif', 'link_image');
73 register_attachment_common('image/png', 'link_image');
74 register_attachment_common('image/x-xbitmap', 'link_image');
75 // register_attachment_common('image/x-ico', 'link_image');
76 // register_attachment_common('image/x-icon', 'link_image');
77 // register_attachment_common('image/bmp', 'link_image');
78 // register_attachment_common('image/x-ms-bmp', 'link_image');
79 }
5bc6067b 80 }
81 unset($jpeg_done);
82}
7baf86a9 83
5bc6067b 84/* Register text-type attachments */
679f13b7 85register_attachment_common('message/rfc822', 'link_message');
5bc6067b 86register_attachment_common('text/plain', 'link_text');
87register_attachment_common('text/richtext', 'link_text');
7baf86a9 88
5bc6067b 89/* Register HTML */
90register_attachment_common('text/html', 'link_html');
7baf86a9 91
5bc6067b 92/* Register vcards */
93register_attachment_common('text/x-vcard', 'link_vcard');
35036cf9 94register_attachment_common('text/directory', 'link_vcard');
7baf86a9 95
4b06460b 96/* Register ics (calendar) */
97register_attachment_common('application/ics', 'link_text');
98
ae2f65a9 99/* Register rules for general types.
100 * These will be used if there isn't a more specific rule available. */
101register_attachment_common('text/*', 'link_text');
102register_attachment_common('message/*', 'link_text');
103
5bc6067b 104/* Register "unknown" attachments */
105register_attachment_common('application/octet-stream', 'octet_stream');
7baf86a9 106
107
3169f064 108/**
9c6e960d 109 * Function which optimizes readability of the above code, and also
110 * ensures that the attachment_common code is exectuted before any
111 * plugin, so that the latter may override the default processing.
112 *
3169f064 113 * Registers 'attachment $type' hooks.
9c6e960d 114 *
115 * @param string $type Attachment type
116 * @param string $func Suffix of attachment_common_* function, which
117 * handles $type attachments.
118 *
3169f064 119 * @since 1.2.0
120 */
7baf86a9 121function register_attachment_common($type, $func) {
5bc6067b 122 global $squirrelmail_plugin_hooks;
9c6e960d 123 $plugin_type = 'attachment ' . $type;
124 $fn = 'attachment_common_' . $func;
125 if (!empty($squirrelmail_plugin_hooks[$plugin_type])) {
126 $plugins = $squirrelmail_plugin_hooks[$plugin_type];
127 $plugins = array_merge(array('attachment_common', $fn), $plugins);
128 $squirrelmail_plugin_hooks[$plugin_type] = $plugins;
129 } else {
130 $squirrelmail_plugin_hooks[$plugin_type]['attachment_common'] = $fn;
131 }
7baf86a9 132}
133
3169f064 134/**
135 * Adds href and text keys to attachment_common array for text attachments
136 * @param array $Args attachment $type hook arguments
137 * @since 1.2.0
138 */
21dab2dc 139function attachment_common_link_text(&$Args) {
202bcbcc 140 global $base_uri;
21dab2dc 141 /* If there is a text attachment, we would like to create a "View" button
5bc6067b 142 that links to the text attachment viewer.
62f7daa5 143
d849b570 144 $Args[0] = the array of actions
62f7daa5 145
21dab2dc 146 Use the name of this file for adding an action
d849b570 147 $Args[0]['attachment_common'] = Array for href and text
62f7daa5 148
d849b570 149 $Args[0]['attachment_common']['text'] = What is displayed
150 $Args[0]['attachment_common']['href'] = Where it links to */
961ca3d8 151 sqgetGlobalVar('QUERY_STRING', $QUERY_STRING, SQ_SERVER);
846a3a21 152
3047e291 153 // if sm_encode_html_special_chars() breaks something - find other way to encode & in url.
d20a8181 154 $Args[0]['attachment_common']['href'] = $base_uri . 'src/view_text.php?'. $QUERY_STRING;
d849b570 155 $Args[0]['attachment_common']['href'] =
156 set_url_var($Args[0]['attachment_common']['href'],
157 'ent_id',$Args[4]);
62f7daa5 158
21dab2dc 159 /* The link that we created needs a name. */
d849b570 160 $Args[0]['attachment_common']['text'] = _("View");
679f13b7 161
5bc6067b 162 /* Each attachment has a filename on the left, which is a link.
163 Where that link points to can be changed. Just in case the link above
164 for viewing text attachments is not the same as the default link for
165 this file, we'll change it.
62f7daa5 166
5bc6067b 167 This is a lot better in the image links, since the defaultLink will just
168 download the image, but the one that we set it to will format the page
169 to have an image tag in the center (looking a lot like this text viewer) */
6f2b104c 170 $Args[5] = $Args[0]['attachment_common']['href'];
7baf86a9 171}
172
3169f064 173/**
174 * Adds href and text keys to attachment_common array for rfc822 attachments
175 * @param array $Args attachment $type hook arguments
176 * @since 1.2.6
177 */
21dab2dc 178function attachment_common_link_message(&$Args) {
202bcbcc 179 global $base_uri;
d849b570 180 $Args[0]['attachment_common']['href'] = $base_uri . 'src/read_body.php?startMessage=' .
181 $Args[1] . '&amp;passed_id=' . $Args[2] . '&amp;mailbox=' . $Args[3] .
182 '&amp;passed_ent_id=' . $Args[4] . '&amp;override_type0=message&amp;override_type1=rfc822';
21dab2dc 183
d849b570 184 $Args[0]['attachment_common']['text'] = _("View");
f4c8a5ab 185
d849b570 186 $Args[5] = $Args[0]['attachment_common']['href'];
679f13b7 187}
188
3169f064 189/**
190 * Adds href and text keys to attachment_common array for html attachments
191 * @param array $Args attachment $type hook arguments
192 * @since 1.2.0
193 */
21dab2dc 194function attachment_common_link_html(&$Args) {
202bcbcc 195 global $base_uri;
961ca3d8 196 sqgetGlobalVar('QUERY_STRING', $QUERY_STRING, SQ_SERVER);
846a3a21 197
d20a8181 198 $Args[0]['attachment_common']['href'] = $base_uri . 'src/view_text.php?'. $QUERY_STRING.
3169f064 199 /* why use the overridetype? can this be removed */
200 /* override_type might be needed only when we want view other type of messages as html */
47f9a69d 201 '&amp;override_type0=text&amp;override_type1=html';
d849b570 202 $Args[0]['attachment_common']['href'] =
203 set_url_var($Args[0]['attachment_common']['href'],
204 'ent_id',$Args[4]);
5bc6067b 205
d849b570 206 $Args[0]['attachment_common']['text'] = _("View");
5bc6067b 207
d849b570 208 $Args[5] = $Args[0]['attachment_common']['href'];
7baf86a9 209}
210
3169f064 211/**
f8a1ed5a 212 * Adds href and text keys to attachment_common array for image attachments
3169f064 213 * @param array $Args attachment $type hook arguments
214 * @since 1.2.0
215 */
21dab2dc 216function attachment_common_link_image(&$Args) {
202bcbcc 217 global $attachment_common_show_images_list, $base_uri ;
846a3a21 218
961ca3d8 219 sqgetGlobalVar('QUERY_STRING', $QUERY_STRING, SQ_SERVER);
62f7daa5 220
d849b570 221 $info['passed_id'] = $Args[2];
222 $info['mailbox'] = $Args[3];
223 $info['ent_id'] = $Args[4];
224 $info['name'] = $Args[6];
225 $info['download_href'] = isset($Args[0]['download link']) ? $Args[0]['download link']['href'] : '';
d2dcc193 226
5bc6067b 227 $attachment_common_show_images_list[] = $info;
62f7daa5 228
5899335c 229 $Args[0]['attachment_common']['href'] = $base_uri . 'src/image.php?'. $QUERY_STRING;
d849b570 230 $Args[0]['attachment_common']['href'] =
231 set_url_var($Args[0]['attachment_common']['href'],
232 'ent_id',$Args[4]);
62f7daa5 233
d849b570 234 $Args[0]['attachment_common']['text'] = _("View");
62f7daa5 235
d849b570 236 $Args[5] = $Args[0]['attachment_common']['href'];
7baf86a9 237}
238
3169f064 239/**
f8a1ed5a 240 * Adds href and text keys to attachment_common array for vcard attachments
3169f064 241 * @param array $Args attachment $type hook arguments
242 * @since 1.2.0
243 */
21dab2dc 244function attachment_common_link_vcard(&$Args) {
202bcbcc 245 global $base_uri;
961ca3d8 246 sqgetGlobalVar('QUERY_STRING', $QUERY_STRING, SQ_SERVER);
62f7daa5 247
5899335c 248 $Args[0]['attachment_common']['href'] = $base_uri . 'src/vcard.php?'. $QUERY_STRING;
d849b570 249 $Args[0]['attachment_common']['href'] =
250 set_url_var($Args[0]['attachment_common']['href'],
251 'ent_id',$Args[4]);
62f7daa5 252
d849b570 253 $Args[0]['attachment_common']['text'] = _("View Business Card");
62f7daa5 254
d849b570 255 $Args[5] = $Args[0]['attachment_common']['href'];
7baf86a9 256}
257
3169f064 258/**
259 * Processes octet-stream attachments.
f8a1ed5a 260 * Calls attachment_common-load_mime_types and attachment $type hooks.
3169f064 261 * @param array $Args attachment $type hook arguments
262 * @since 1.2.0
263 */
21dab2dc 264function attachment_common_octet_stream(&$Args) {
d849b570 265 global $FileExtensionToMimeType, $null;
62f7daa5 266
d7c9c0d4 267//FIXME: I propose removing this hook; I don't like having two hooks close together, but moreover, this hook appears to merely give plugins the chance to add to the global $FileExtensionToMimeType variable, which they can do in any hook before now - I'd recommend prefs_backend (which is what config_override used to be) because it's the one hook run at the beginning of almost all page requests in init.php -- the con is that we don't need it run on ALL page requests, do we? There may be another hook in THIS page request that we can recommend, in which case, we *really should* remove this hook here.
9c6e960d 268//FIXME: or at least we can move this hook up to the top of this file where $FileExtensionToMimeType is defined. What else is this hook here for? What plugins use it?
d849b570 269 do_hook('attachment_common-load_mime_types', $null);
62f7daa5 270
72331102 271 preg_match('/\.([^.]+)$/', $Args[6], $Regs);
b7910e12 272
273 $Ext = '';
274 if (is_array($Regs) && isset($Regs[1])) {
fc7b6eb1 275 $Ext = strtolower($Regs[1]);
b7910e12 276 }
62f7daa5 277
5bc6067b 278 if ($Ext == '' || ! isset($FileExtensionToMimeType[$Ext]))
62f7daa5 279 return;
280
9c6e960d 281 $temp = array(&$Args[0], &$Args[1], &$Args[2], &$Args[3], &$Args[4], &$Args[5],
282 &$Args[6], &$Args[7], &$Args[8]);
d7c9c0d4 283 do_hook('attachment ' . $FileExtensionToMimeType[$Ext], $temp);
62f7daa5 284
7baf86a9 285}