/[openfoncier]/trunk/obj/electronicsignature.class.php
ViewVC logotype

Contents of /trunk/obj/electronicsignature.class.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 18876 - (show annotations)
Tue Oct 8 08:41:06 2024 UTC (3 months, 2 weeks ago) by softime
File size: 19781 byte(s)
merge: fusion de la branche d'intégration 6.8.0-develop dans le trunk

1 <?php
2 /**
3 * Contient la définition des classes 'electronicsignature' et 'electronicsignature_base'.
4 */
5
6 if (defined('PATH_OPENMAIRIE') !== true) {
7 define('PATH_OPENMAIRIE', '../core/');
8 }
9 require_once PATH_OPENMAIRIE."om_logger.class.php";
10
11 /**
12 * Abstracteur du parapheur
13 */
14 class electronicsignature {
15
16 /**
17 * Configuration du connecteur parapheur.
18 * @var array
19 */
20 var $conf = null;
21
22 /**
23 * Instance du connecteur parapheur.
24 * @var object
25 */
26 var $electronicsignature = null;
27
28 /**
29 * Liste des clés obligatoire pour les parapheurs.
30 * @var array
31 */
32 const DATA_KEYS = array(
33 "om_utilisateur_email",
34 "om_utilisateur_nom",
35 "signataire_arrete_email",
36 "signataire_arrete_nom",
37 "signataire_arrete_prenom",
38 "dossier"
39 );
40
41 /**
42 * Liste des clés obligatoire pour les métadonnées des documents d'instruction.
43 * @var array
44 */
45 const DOSSIER_METADATA = array(
46 "mimetype",
47 "filename",
48 "url_di",
49 "titre_document"
50 );
51
52 /**
53 * Liste des clés obligatoire pour l'annulation l'envoi en signature des documents d'instruction.
54 * @var array
55 */
56 const CANCEL_DATA_KEYS = array(
57 "id_parapheur_signature"
58 );
59
60
61 /**
62 * Instancie le connecteur parapheur depuis la collectivité transmise et la
63 * configuration.
64 *
65 * Liste des paramètres :
66 * - *conf_name* nom de la configuration à récupérer, par défaut 'electronicsignature-default'
67 * - *collectivite_idx* identifiant de la collectivité
68 * - collectivite_multi_idx identifiant de la collectivité de niveau 2
69 *
70 * @param array $params Liste des paramètres.
71 * @param array $extra_params Tableau de paramètres en extra
72 */
73 public function __construct(array $params, array $extra_params = array()) {
74 //
75 if (file_exists("../dyn/electronicsignature.inc.php") === false) {
76 throw new electronicsignature_configuration_exception(__("Aucun fichier de configuration pour la signature électronique."));
77 }
78 include("../dyn/electronicsignature.inc.php");
79 if (isset($conf) === false) {
80 throw new electronicsignature_configuration_exception(__("Aucune configuration pour la signature électronique."));
81 }
82 $this->conf = $conf;
83 //
84 if (isset($params['conf_name']) === true) {
85 $this->conf = $this->conf[$params['conf_name']];
86 } else {
87 $this->conf = $this->conf['electronicsignature-default'];
88 }
89 //
90 if (isset($params['collectivite_idx']) === true
91 && $this->get_conf('unexpected_collectivite') !== null
92 && in_array($params['collectivite_idx'], $this->get_conf('unexpected_collectivite')) === true) {
93 //
94 throw new electronicsignature_configuration_exception(__("Aucun parapheur configuré pour la collectivité."));
95 }
96 //
97 if (isset($params['collectivite_idx']) === true
98 && $this->get_conf($params['collectivite_idx']) !== null) {
99 //
100 $this->conf = $this->conf[$params['collectivite_idx']];
101 }
102 elseif (isset($params['collectivite_multi_idx']) === true
103 && $this->get_conf($params['collectivite_multi_idx']) !== null) {
104 //
105 $this->conf = $this->conf[$params['collectivite_multi_idx']];
106 } else {
107 throw new electronicsignature_configuration_exception(__("Aucun parapheur configuré pour la collectivité."));
108 }
109
110 //
111 if ($this->get_conf('path') === null) {
112 throw new electronicsignature_configuration_exception(__("Le chemin vers le connecteur du parapheur n'est pas configuré."));
113 }
114 //
115 if ($this->get_conf('connector') === null) {
116 throw new electronicsignature_configuration_exception(__("Le nom du connecteur du parapheur n'est pas configuré."));
117 }
118 //
119 $connector = sprintf(
120 '%s_%s',
121 get_class($this),
122 $this->get_conf('connector')
123 );
124 require_once $this->conf['path'].$connector.'.class.php';
125 $this->electronicsignature = new $connector($this->get_conf(), $extra_params);
126 }
127
128 /**
129 * Détruit la ressource instanciée dans le constructeur.
130 */
131 public function __destruct() {
132 //
133 if (is_null($this->electronicsignature) === false) {
134 unset($this->electronicsignature);
135 }
136 }
137
138 /**
139 * Accesseur pour récupérer la configuration complète du connecteur parapheur
140 * ou une partie de celle-ci.
141 *
142 * @param string $params Attribut de la configuration.
143 * @return mixed Le tableau de configuration complet ou la valeur
144 * d'une entrée du tableau de configuration.
145 */
146 public function get_conf($params = null) {
147 if ($params === null) {
148 return $this->conf;
149 }
150 if (is_string($params) === true
151 && is_array($this->conf) === true) {
152 //
153 if (array_key_exists($params, $this->conf) === true) {
154 return $this->conf[$params];
155 }
156 }
157 if (is_array($params) === true
158 && is_array($this->conf) === true
159 && count($params) === 2
160 && array_key_exists($params[0], $this->conf) === true
161 && is_array($this->conf[$params[0]]) === true
162 && array_key_exists($params[1], $this->conf[$params[0]]) === true) {
163 //
164 return $this->conf[$params[0]][$params[1]];
165 }
166 return null;
167 }
168
169 /**
170 * Appelle la méthode de même nom du connecteur parapheur.
171 * Permet de transmettre un document à signer.
172 *
173 * @param array $data Liste des paramètres (dépend du connecteur).
174 * @param string $file_content Contenu du document à signer.
175 * @param array $dossier_metadata Métadonnées du dossier d'instruction.
176 * @param array $optional_data Paramètres spécifique au connecteur.
177 * @return array Tableau de résultat retourné par le
178 * connecteur parapheur, sinon retourne une exception.
179 */
180 public function send_for_signature(array $data, string $file_content, array $dossier_metadata, array $optional_data = null) {
181 //
182 if (is_array($data) === false
183 || empty($data) === true) {
184 //
185 throw new electronicsignature_parameter_exception();
186 }
187
188 $missed_data_keys = array();
189 foreach (self::DATA_KEYS as $data_key) {
190 // Construire une liste des clés manquantes
191 if (! isset($data[$data_key])) {
192 $missed_data_keys[] = $data_key;
193 }
194 }
195 if (! empty($missed_data_keys)) {
196 throw new electronicsignature_connector_exception(
197 __("Certains paramètres nécessaires à l'envoi en signature sont manquantes : ").implode(', ', $missed_data_keys)
198 );
199 }
200
201 $missed_metadata_keys = array();
202 foreach (self::DOSSIER_METADATA as $data_key) {
203 // Construire une liste des clés manquantes
204 if (! isset($data[$data_key])) {
205 $missed_metadata_keys[] = $data_key;
206 }
207 }
208 if (! empty($missed_data_keys)) {
209 throw new electronicsignature_connector_exception(
210 __("Certaines métadonnées nécessaires à l'envoi en signature sont manquantes : ").implode(', ', $missed_data_keys)
211 );
212 }
213
214 if (empty($file_content) === true) {
215 //
216 throw new electronicsignature_parameter_exception(__("Contenu du fichier absent."));
217 }
218
219 //
220 $es = $this->electronicsignature;
221 if (is_null($es) === true) {
222 return false;
223 }
224 //
225 return $es->send_for_signature($data, $file_content, $dossier_metadata, $optional_data);
226 }
227
228 /**
229 * Appelle la méthode de même nom du connecteur parapheur.
230 * Permet d'annuler la transmission du document à signer.
231 *
232 * @param array $data Liste des paramètres (dépend du connecteur).
233 * @return array Tableau de résultat retourné par le
234 * connecteur parapheur, sinon retourne une exception.
235 */
236 public function cancel_send_for_signature(array $data) {
237 //
238 //
239 if (is_array($data) === false
240 || empty($data) === true) {
241 //
242 throw new electronicsignature_parameter_exception();
243 }
244
245 $missed_data_keys = array();
246 foreach (self::CANCEL_DATA_KEYS as $data_key) {
247 // Construire une liste des clés manquantes
248 if (! isset($data[$data_key])) {
249 $missed_data_keys[] = $data_key;
250 }
251 }
252 if (! empty($missed_data_keys)) {
253 throw new electronicsignature_connector_exception(
254 __("Certains paramètres nécessaires à l'annulation de l'envoi en signature sont manquants : ").implode(', ', $missed_data_keys)
255 );
256 }
257
258 //
259 $es = $this->electronicsignature;
260 if (is_null($es) === true) {
261 return false;
262 }
263 //
264 return $es->cancel_send_for_signature($data);
265 }
266
267
268 /**
269 * Appelle la méthode de même nom du connecteur parapheur.
270 * Permet de récupérer le statut d'un parapheur.
271 *
272 * @param array $data Liste des paramètres (dépend du connecteur).
273 * @return array Tableau de résultat retourné par le
274 * connecteur parapheur, sinon retourne une exception.
275 */
276 public function get_signature_status(array $data) {
277 //
278 if (is_array($data) === false
279 || empty($data) === true) {
280 //
281 throw new electronicsignature_parameter_exception();
282 }
283
284 //
285 $es = $this->electronicsignature;
286 if (is_null($es) === true) {
287 return false;
288 }
289 //
290 return $es->get_signature_status($data);
291 }
292
293 /**
294 * Appelle la méthode de même nom du connecteur parapheur.
295 * Permet de récupérer le document signé.
296 *
297 * @param array $data Liste des paramètres (dépend du connecteur).
298 * @return array Tableau de résultat retourné par le
299 * connecteur parapheur, sinon retourne une exception.
300 */
301 public function get_signed_document(array $data) {
302 //
303 if (is_array($data) === false
304 || empty($data) === true) {
305 //
306 throw new electronicsignature_parameter_exception();
307 }
308
309 //
310 $es = $this->electronicsignature;
311 if (is_null($es) === true) {
312 return false;
313 }
314 //
315 return $es->get_signed_document($data);
316 }
317
318 /**
319 * Appelle la méthode de même nom du connecteur parapheur.
320 *
321 * Permet de spécifier le support de la notification mail au signataire.
322 *
323 * @param array $data Liste des paramètres (dépend du connecteur).
324 *
325 * @return bool 'true' si le connecteur délègue à openADS les notifications mail
326 *
327 * @throw electronicsignature_connector_method_not_implemented_exception
328 */
329 public function signer_notification_is_delegated(array $data = []) {
330 return $this->electronicsignature->signer_notification_is_delegated($data);
331 }
332 }
333
334 /**
335 * Classe parente de tous les connecteurs parapheur
336 */
337 class electronicsignature_base {
338
339 /**
340 * Configuration du connecteur parapheur.
341 * @var array
342 */
343 var $conf = null;
344
345 /**
346 * Tableau de paramètres en extra
347 *
348 * @var array
349 */
350 protected $extra_params = array();
351
352 /**
353 * Instancie le connecteur parapheur selon la configuration.
354 *
355 * @param array $conf Configuration du connecteur.
356 * @param array $extra_params Tableau de paramètres en extra.
357 */
358 public function __construct(array $conf, array $extra_params = array()) {
359 $this->conf = $conf;
360 // Liste des paramètres extra
361 $this->extra_params = $extra_params;
362 }
363
364 /**
365 * Accesseur pour récupérer la configuration complète du connecteur parapheur
366 * ou une partie de celle-ci.
367 *
368 * @param string $params Attribut de la configuration.
369 * @return mixed Le tableau de configuration complet ou la valeur
370 * d'une entrée du tableau de configuration.
371 */
372 protected function get_conf($params = null) {
373 if ($params === null) {
374 return $this->conf;
375 }
376 if (is_string($params) === true
377 && is_array($this->conf) === true) {
378 //
379 if (array_key_exists($params, $this->conf) === true) {
380 return $this->conf[$params];
381 }
382 }
383 if (is_array($params) === true
384 && is_array($this->conf) === true
385 && count($params) === 2
386 && array_key_exists($params[0], $this->conf) === true
387 && is_array($this->conf[$params[0]]) === true
388 && array_key_exists($params[1], $this->conf[$params[0]]) === true) {
389 //
390 return $this->conf[$params[0]][$params[1]];
391 }
392 return null;
393 }
394
395 /**
396 * Doit être implémentée par des classe dérivées.
397 * Permet de transmettre un document à signer.
398 *
399 * @param array $data Liste des paramètres (dépend du connecteur).
400 * @param string $file_content Contenu du document à signer.
401 * @param array $dossier_metadata Métadonnées du dossier d'instruction.
402 * @param array $optional_data Paramètres spécifique au connecteur.
403 * @return array Tableau de résultat retourné par le
404 * connecteur parapheur, sinon retourne une exception.
405 */
406 protected function send_for_signature(array $data, string $file_content, array $dossier_metadata, array $optional_data = null) {
407 //
408 throw new electronicsignature_connector_method_not_implemented_exception();
409 }
410
411 /**
412 * Doit être implémentée par des classe dérivées.
413 * Permet d'annuler la transmission du document à signer.
414 *
415 * @param array $data Liste des paramètres (dépend du connecteur).
416 * @return array Tableau de résultat retourné par le
417 * connecteur parapheur, sinon retourne une exception.
418 */
419 protected function cancel_send_for_signature(array $data) {
420 //
421 throw new electronicsignature_connector_method_not_implemented_exception();
422 }
423
424
425 /**
426 * Doit être implémentée par des classe dérivées.
427 * Permet de récupérer le statut d'un parapheur.
428 *
429 * @param array $data Liste des paramètres (dépend du connecteur).
430 * @return array Tableau de résultat retourné par le
431 * connecteur parapheur, sinon retourne une exception.
432 */
433 protected function get_signature_status(array $data) {
434 //
435 throw new electronicsignature_connector_method_not_implemented_exception();
436 }
437
438 /**
439 * Doit être implémentée par des classe dérivées.
440 * Permet de récupérer le document signé.
441 *
442 * @param array $data Liste des paramètres (dépend du connecteur).
443 * @return array Tableau de résultat retourné par le
444 * connecteur parapheur, sinon retourne une exception.
445 */
446 protected function get_signed_document(array $data) {
447 //
448 throw new electronicsignature_connector_method_not_implemented_exception();
449 }
450
451 /**
452 * Doit être implémentée par les classe dérivées.
453 * Permet de spécifier le support de la notification mail au signataire.
454 *
455 * @param array $data Liste des paramètres (dépend du connecteur).
456 *
457 * @return bool 'true' si le connecteur délègue à openADS les notifications mail
458 *
459 * @throw electronicsignature_connector_method_not_implemented_exception
460 */
461 public function signer_notification_is_delegated(array $data = []) {
462 //
463 throw new electronicsignature_connector_method_not_implemented_exception();
464 }
465
466 /**
467 * Permet de lancer une requête sql dans la base de données de l'application.
468 * La requête sql doit être un SELECT.
469 *
470 * @param string $query_sql Requête sql à exécuter.
471 *
472 * @return array|boolean Résultat de la requête sql ou false.
473 */
474 protected function query_db($query_sql, $force_return = true) {
475 if (isset($this->extra_params['inst_framework']) === false) {
476 throw new electronicsignature_exception(__("Il est nécessaire de passer l'instanciation du framework en paramètre pour réaliser des requête en base de données depuis un connecteur electronicsignature."));
477 }
478 $inst_framework = $this->extra_params['inst_framework'];
479 if (stripos($query_sql, 'SELECT') === false) {
480 throw new geoads_exception('Seules les requêtes SQL SELECT sont autorisées.');
481 }
482 return $inst_framework->get_all_results_from_db_query(
483 $query_sql,
484 array(
485 "origin" => __METHOD__,
486 "force_return" => $force_return,
487 )
488 );
489 }
490 }
491
492 /**
493 * Classe gérant les erreurs
494 */
495 class electronicsignature_exception extends Exception {
496
497 public function __construct($message = "", $code = 0, Exception $previous = null) {
498 parent::__construct($message, $code, $previous);
499 logger::instance()->writeErrorLogToFile();
500 logger::instance()->cleanLog();
501 }
502
503 protected function add_to_log($code, $message) {
504 logger::instance()->log(sprintf(
505 "Electronic Signature Connector - Error code : %s -> %s",
506 $code,
507 $message
508 ));
509 }
510 }
511
512 class electronicsignature_configuration_exception extends electronicsignature_exception {
513
514 public function __construct($message = null) {
515 $ret = trim(sprintf(
516 '%s %s %s',
517 __('Erreur de configuration du parapheur.'),
518 __('Veuillez contacter votre administrateur.'),
519 $message
520 ));
521 parent::__construct($ret);
522 }
523 }
524
525 class electronicsignature_parameter_exception extends electronicsignature_exception {
526
527 public function __construct($message = null) {
528 $ret = trim(sprintf(
529 '%s %s %s',
530 __("Les paramètres d'appel au parapheur ne sont pas valides."),
531 __('Veuillez contacter votre administrateur.'),
532 $message
533 ));
534 parent::__construct($ret);
535 }
536 }
537
538 class electronicsignature_connector_exception extends electronicsignature_exception {
539
540 public function __construct($message = null, $code = null) {
541 // Log de l'erreur technique
542 $this->add_to_log($code, $message);
543 // Log utilisateur
544 $ret = trim(sprintf(
545 '%s %s %s',
546 __('Erreur du parapheur.'),
547 __('Veuillez contacter votre administrateur.'),
548 $message
549 ));
550 parent::__construct($ret);
551 }
552 }
553
554 class electronicsignature_connector_method_not_implemented_exception extends electronicsignature_exception {
555
556 public function __construct($message = null) {
557 $ret = trim(sprintf(
558 '%s %s %s',
559 __("La méthode n'est pas implémentée dans le connecteur."),
560 __('Veuillez contacter votre administrateur.'),
561 $message
562 ));
563 parent::__construct($ret);
564 }
565 }

Properties

Name Value
svn:executable *

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26