Passed
Push — master ( ef05d2...45bd4f )
by Anthony
03:55
created

ImportModule::setImportModule()   B

Complexity

Conditions 3
Paths 3

Size

Total Lines 28
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 5
Bugs 1 Features 0
Metric Value
c 5
b 1
f 0
dl 0
loc 28
rs 8.8571
cc 3
eloc 16
nc 3
nop 2
1
<?php
2
	namespace core\modules;
3
4
	use core\App;
5
	use core\HTML\flashmessage\FlashMessage;
6
7
	class ImportModule {
8
		private $nom_dossier;
9
		private $nom_fichier;
10
		private $extension;
11
		private $erreur;
12
13
		//pour les infos du module
14
		private $id_module;
15
		private $url_telechargement;
16
		private $version_ok;
17
		private $dossier_module;
18
19
		
20
		//-------------------------- CONSTRUCTEUR ----------------------------------------------------------------------------//
21
		public function __construct() {
22
			//On test si dossier temporaire + modules a la racines existes bien sinon on les crées
23
			if (!file_exists(ROOT."temp")) mkdir(ROOT."temp");
24
			if (!file_exists(ROOT."modules")) mkdir(ROOT."modules");
25
		}
26
		//-------------------------- FIN CONSTRUCTEUR ----------------------------------------------------------------------------//
27
		
28
		
29
		//-------------------------- GETTER ----------------------------------------------------------------------------//
30
		/**
31
		 * @param $id_module
32
		 * permets de récupérer des informations sur un module
33
		 */
34
		private function getInfoModule($id_module) {
35
			$dbc = App::getDb();
36
37
			$query = $dbc->query("select * from module WHERE ID_module=".$dbc->quote($id_module));
38
39
			if ((is_array($query)) && (count($query) > 0)) {
40
				foreach ($query as $obj) {
41
					$this->id_module = $obj->ID_module;
42
					$this->url_telechargement = $obj->url_telechargement;
43
					$this->version_ok = $obj->online_version;
44
					$this->dossier_module = str_replace("/", "", $obj->url);
45
				}
46
			}
47
		}
48
		//-------------------------- FIN GETTER ----------------------------------------------------------------------------//
49
		
50
		
51
		//-------------------------- SETTER ----------------------------------------------------------------------------//
52
		private function setInstallModule($url_module) {
53
			$zip = new \ZipArchive();
54
55
			if (($this->extension == "zip") &&
56
				(file_exists(MODULEROOT.$this->nom_dossier) == false) &&
57
				(file_put_contents(TEMPROOT.$this->nom_fichier, fopen($url_module, 'r')) != false) &&
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing file_put_contents(TEMPRO...open($url_module, 'r')) of type integer to the boolean false. If you are specifically checking for non-zero, consider using something more explicit like > 0 or !== 0 instead.
Loading history...
58
				($zip->open(TEMPROOT.$this->nom_fichier) == true) &&
59
				($zip->extractTo(TEMPROOT) == true) &&
60
				(rename(TEMPROOT.$this->nom_dossier, MODULEROOT.$this->nom_dossier) == true)) {
61
62
				$zip->close();
63
				return true;
64
			}
65
66
			return false;
67
		}
68
		/**
69
		 * @param $url_module
70
		 * @param boolean $update
71
		 * fonction qui permets d'importer un module dans notre site internet
72
		 */
73
		public function setImportModule($url_module, $update = null) {
74
			$dbc = App::getDb();
75
76
			//avant tout on récupère le nom du fichier pour le mettre dans le dossier temporaire
77
			$explode = explode("/", $url_module);
78
			$this->nom_fichier = end($explode);
79
80
			//on recupere le nom du dossier + extention
81
			$explode = explode(".", $this->nom_fichier);
82
			$this->nom_dossier = $explode[0];
83
			$this->extension = $explode[1];
84
85
			if ($this->setInstallModule($url_module) == true) {
86
				$this->setSupprimerArchiveTemp();
87
88
				//si c'est une install et non une mise à jour
89
				if ($update == null) {
90
					$requete = "";
91
					require_once(MODULEROOT.$this->nom_dossier."/install.php");
92
					$dbc->query($requete);
93
				}
94
95
				FlashMessage::setFlash("Votre module a bien été ajouté au site.", "success");
96
			}
97
			else {
98
				FlashMessage::setFlash("Le module n'a pas pu être correctement téléchargé et installé, veuillez réesseyer dans un instant");
99
			}
100
		}
101
102
		/**
103
		 * @param $id_module
104
		 * permet de mettre à jour un module en gardant une copie de l'ancienne version pendant une semaine
105
		 */
106
		Public function setUpdateModule($id_module) {
107
			$dbc = App::getDb();
108
109
			$this->getInfoModule($id_module);
110
111
			//on rename le dossier actuel du module
112
			if (rename(MODULEROOT.$this->dossier_module, MODULEROOT.$this->dossier_module."_OLDVERSION")) {
113
				$this->setImportModule($this->url_telechargement, true);
114
115
				//si pas d'erreur on met la date de next check a la semaine pro ++ on dit
116
				//de delete l'ancienne version au next check
117
				if (($this->erreur !== true) || (!isset($this->erreur))) {
118
					$today = date("Y-m-d");
119
					$today = new \DateTime($today);
120
121
					$value = [
122
						"next_check" => $today->add(new \DateInterval("P1W"))->format("Y-m-d"),
123
						"version" => $this->version_ok,
124
						"online_version" => "",
125
						"mettre_jour" => "",
126
						"delete_old_version" => 1,
127
						"id_module" => $id_module
128
					];
129
130
					$dbc->prepare("UPDATE module SET next_check_version=:next_check, version=:version, online_version=:online_version, mettre_jour=:mettre_jour, delete_old_version=:delete_old_version WHERE ID_module=:id_module", $value);
131
132
					FlashMessage::setFlash("Votre module a bien été mis à jour", "success");
133
				}
134
			}
135
			else {
136
				FlashMessage::setFlash("Impossible de télécharger la mise à jour, veuillez réesseyer dans un instant");
137
			}
138
		}
139
140
		/**
141
		 * @return bool
142
		 * fonction qui après l'installation d'un module supprime les fichier temporaires
143
		 */
144
		private function setSupprimerArchiveTemp() {
145
			if (unlink(TEMPROOT.$this->nom_fichier) == true) {
146
				return true;
147
			}
148
			else {
149
				return false;
150
			}
151
		}
152
153
		/**
154
		 * @param $id_module
155
		 * fonction qui permet de supprimer un module (suppression des tables + appel fonction supprimer dossier)
156
		 */
157
		public function setSupprimerModule($id_module) {
158
			$dbc = App::getDb();
159
			$systeme = "";
160
			$url = "";
161
162
			$query = $dbc->query("SELECT * FROM module WHERE ID_module=".$id_module);
163
164
			if ((is_array($query)) && (count($query) > 0)) {
165
				foreach ($query as $obj) {
166
					$url = MODULEROOT.str_replace("/", "", $obj->url);
167
					$systeme = $obj->systeme;
168
				}
169
			}
170
171
			if ($systeme == 1) {
172
				$value = array(
173
					"id_module" => $id_module,
174
					"activer" => 0,
175
					"installer" => 0,
176
				);
177
178
				$dbc->prepare("UPDATE module SET activer=:activer, installer=:installer WHERE ID_module=:id_module", $value);
179
			}
180
			else {
181
				$value = array(
182
					"id_module" => $id_module,
183
				);
184
185
				$dbc->prepare("DELETE FROM module WHERE ID_module=:id_module", $value);
186
			}
187
188
			$requete = "";
189
			require_once($url."/uninstall.php");
190
			$dbc->query($requete);
191
192
			$this->supprimerDossier($url);
193
		}
194
195
		/**
196
		 * @param $id_module
197
		 * fonction qui permet de supprimer le dossier d'une vielle version d'un module une semaine après son ajout
198
		 */
199
		public function setSupprimerOldModule($id_module) {
200
			$dbc = App::getDb();
201
202
			$this->getInfoModule($id_module);
203
204
			$this->supprimerDossier(MODULEROOT.$this->dossier_module);
205
206
			$value = [
207
				"id_module" => $this->id_module,
208
				"delete_old_version" => ""
209
			];
210
211
			$dbc->prepare("UPDATE module SET delete_old_version=:delete_old_version WHERE ID_module=:id_module", $value);
212
		}
213
214
		/**
215
		 * @param string $url
216
		 * fonction qui permet de supprmer un dossier avec toute son abrorescence en fonction d'une URL
217
		 */
218
		private function supprimerDossier($url) {
219
			if (is_dir($url)) {
220
				$objects = scandir($url);
221
				foreach ($objects as $object) {
222
					if ($object != "." && $object != "..") {
223
						if (filetype($url."/".$object) == "dir") $this->supprimerDossier($url."/".$object); else unlink($url."/".$object);
224
					}
225
				}
226
				reset($objects);
227
				rmdir($url);
228
			}
229
		}
230
		//-------------------------- FIN SETTER ----------------------------------------------------------------------------//
231
	}