source: plugins_spip/import_video/emballe_medias/action/forcer_telecharger.php @ 2486

Last change on this file since 2486 was 2486, checked in by kent1, 10 years ago

Le type normal équivaut à aucun type

Du texte en moins

File size: 2.7 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5include_spip('inc/headers');
6
7/**
8 * Forcer le téléchargement de documents
9 * verifie soit que le demandeur est authentifie
10 * soit que le document est publie, c'est-a-dire
11 * joint a au moins 1 article, breve ou rubrique publie
12 *
13 * Action fortement pompée sur acceder_document du core
14 * http://doc.spip.org/@action_acceder_document_dist
15 *
16 * @return
17 */
18function action_forcer_telecharger_dist() {
19        include_spip('inc/documents');
20       
21        // $file exige pour eviter le scan id_document par id_document
22        $f = rawurldecode(_request('file'));
23        $file = get_spip_doc($f);
24        $arg = rawurldecode(_request('arg'));
25
26        $status = $dcc = false;
27        if (strpos($f,'../') !== false
28        OR preg_match(',^\w+://,', $f)) {
29                $status = 403;
30        }
31        else if (!file_exists($file) OR !is_readable($file)) {
32                $status = 404;
33        } else {
34                $where = "documents.fichier=".sql_quote(set_spip_doc($file))
35                . ($arg ? " AND documents.id_document=".intval($arg): '');
36
37                $doc = sql_fetsel("documents.id_document, documents.titre, documents.fichier, types.mime_type, types.inclus, documents.extension", "spip_documents AS documents LEFT JOIN spip_types_documents AS types ON documents.extension=types.extension",$where);
38                if (!$doc) {
39                        $status = 404;
40                } else {
41
42                        // ETag pour gerer le status 304
43                        $ETag = md5($file . ': '. filemtime($file));
44                        if (isset($_SERVER['HTTP_IF_NONE_MATCH'])
45                        AND $_SERVER['HTTP_IF_NONE_MATCH'] == $ETag) {
46                                http_status(304); // Not modified
47                                exit;
48                        } else {
49                                header('ETag: '.$ETag);
50                        }
51
52                        //
53                        // Verifier les droits de lecture du document
54                        // en controlant la cle passee en argument
55                        //
56                        include_spip('inc/securiser_action');
57                        $cle = _request('cle');
58                        if (!verifier_cle_action($doc['id_document'].','.$f, $cle)) {
59                                spip_log("acces interdit $cle erronee");
60                                $status = 403;
61                        }
62                }
63        }
64
65        switch($status) {
66
67        case 403:
68                include_spip('inc/minipres');
69                echo minipres();
70                break;
71
72        case 404:
73                http_status(404);
74                include_spip('inc/minipres');
75                echo minipres(_T('erreur').' 404',
76                        _T('info_document_indisponible'));
77                break;
78
79        default:
80                header("Content-Type: ". $doc['mime_type']);
81
82                $f = basename($file);
83                // ce content-type est necessaire pour eviter des corruptions de zip dans ie6
84                header('Content-Type: application/octet-stream');
85
86                header("Content-Disposition: attachment; filename=\"$f\";");
87                header("Content-Transfer-Encoding: binary");
88
89                // fix for IE catching or PHP bug issue
90                header("Pragma: public");
91                header("Expires: 0"); // set expiration time
92                header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
93
94                if ($cl = filesize($file))
95                        header("Content-Length: ". $cl);
96                spip_log('default');
97                readfile($file);
98                break;
99        }
100
101}
102
103?>
Note: See TracBrowser for help on using the repository browser.