[SPIP] v3.2.7-->v3.2.9
[lhc/web/www.git] / www / plugins-dist / archiviste / inc / archives.php
1 <?php
2
3 /**
4 * SPIP, Systeme de publication pour l'internet
5 *
6 * Copyright (c) 2001-2020
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James
8 *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL.
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.
11 */
12
13 namespace Spip\Archives;
14
15 /**
16 * Point d'entrée de la gestion des archives compressées de SPIP
17 */
18 class SpipArchives
19 {
20 /** @var integer Dernier code d'erreur */
21 private $codeErreur;
22
23 /** @var string Dernier message d'erreur */
24 private $messageErreur;
25
26 /** @var array Mode de compression connus */
27 private $compressionsConnues = array('zip');
28
29 /** @var string Mode de compression si l'extension du fichier n'est pas explicite */
30 private $modeCompression;
31
32 /** @var string Chemin vers le fichier d'archives */
33 private $fichierArchive;
34
35 /** @var boolean true si l'archive est en lecture seule */
36 private $lectureSeule = true;
37
38 /** @var array Liste des erreurs possibles */
39 private $erreurs = array(
40 0 => 'OK',
41 1 => 'erreur_inconnue',
42 2 => 'extension_inconnue',
43 3 => 'fichier_absent',
44 4 => 'fichier_lecture_seule',
45 5 => 'destination_inaccessible',
46 );
47
48 /**
49 * Renvoyer le dernier code d'erreur.
50 *
51 * @return integer Dernier code d'erreur
52 */
53 public function erreur() {
54 $code = in_array($this->codeErreur, array_keys($this->erreurs)) ? $this->codeErreur : 1;
55
56 $this->codeErreur = $code;
57 $this->messageErreur = 'archives:'.$this->erreurs[$code];
58
59 return $code;
60 }
61
62 /**
63 * Renvoyer le dernier message d'erreur.
64 *
65 * @return string Dernier message d'erreur
66 */
67 public function message() {
68 return $this->messageErreur;
69 }
70
71 /**
72 * Indiquer le détail du contenu de l'archive.
73 *
74 * @return array détail du contenu de l'archive
75 */
76 public function informer() {
77 return array(
78 'proprietes' => array(),
79 'fichiers' => array()
80 );
81 }
82
83 /**
84 * Extraire tout ou partie des fichiers de l'archive vers une destination.
85 *
86 * @param string $destination Chemin du répertoire d'extraction
87 * @param array $fichiers Liste des fichiers à extraire
88 *
89 * @return boolean Succès de l'opération
90 */
91 public function deballer($destination = '', array $fichiers = array()) {
92 if ($this->codeErreur !== 0) {
93 return false;
94 }
95
96 if (!(is_dir($destination) and is_writable($destination))) {
97 $this->codeErreur = 5;
98 return false;
99 }
100
101 $this->codeErreur = 0;
102 return true;
103 }
104
105 /**
106 * Créer ou modifier des fichiers dans le fichier d'archive.
107 *
108 * @param array $fichiers Liste des fichiers à ajouter ou modifier
109 *
110 * @return boolean Succès de l'opération
111 */
112 public function emballer(array $fichiers = array()) {
113 if ($this->lectureSeule) {
114 $this->codeErreur = 4;
115 return false;
116 }
117
118 $this->codeErreur = 0;
119 return true;
120 }
121
122 /**
123 * Retirer une liste de fichiers dans le fichier d'archive.
124 *
125 * @param array $fichiers Liste des fichiers à retirer
126 *
127 * @return boolean Succès de l'opération
128 */
129 public function retirer(array $fichiers = array()) {
130 if ($this->lectureSeule) {
131 $this->codeErreur = 4;
132 return false;
133 }
134
135 $this->codeErreur = 0;
136 return true;
137 }
138
139 /**
140 * Constructeur de base.
141 *
142 * @param string $fichierArchive Chemin vers le fichier d'archives
143 * @param string $modeCompression Mode de compression si l'extension du fichier n'est pas explicite
144 */
145 public function __construct($fichierArchive, $modeCompression = '') {
146 $this->codeErreur = 0;
147
148 if ('' === $modeCompression) {
149 $modeCompression = preg_replace(',.+\.([^.]+)$,', '$1', $fichierArchive);
150 }
151
152 $modeCompression = strtolower($modeCompression);
153 if (!in_array($modeCompression, $this->compressionsConnues)) {
154 $this->codeErreur = 2;
155 } elseif (!file_exists($fichierArchive)) {
156 $this->codeErreur = 3;
157
158 $repertoireArchive = dirname($fichierArchive);
159 $this->lectureSeule = !(is_dir($repertoireArchive) and is_writable($repertoireArchive));
160 } else {
161 $this->lectureSeule = !is_writable($fichierArchive);
162 }
163
164 $this->modeCompression = $modeCompression;
165 $this->fichierArchive = $fichierArchive;
166 }
167
168 /**
169 * Indique si l'archive est accessible en ecriture ou pas.
170 *
171 * @return boolean true si l'archive est en lecture seule
172 */
173 public function getLectureSeule() {
174 return $this->lectureSeule;
175 }
176 }