PageRenderTime 31ms CodeModel.GetById 9ms app.highlight 16ms RepoModel.GetById 1ms app.codeStats 1ms

/class/class_digicode.php

http://malleo-cms.googlecode.com/
PHP | 261 lines | 187 code | 18 blank | 56 comment | 28 complexity | f8caf835d73e205e4afa854042779f06 MD5 | raw file
  1<?php
  2/*
  3|------------------------------------------------------------------------------------------------------------
  4| Software: Malleo ( CMS )
  5| Contact:  SP - http://www.malleo-cms.com
  6| Support: http://www.malleo-cms.com?module=forum
  7|  Documentation : Support: http://www.malleo-cms.com?module=wiki
  8|------------------------------------------------------------------------------------------------------------
  9|  Author: Stephane RAJALU
 10|  Copyright (c) 2008-2009, Stephane RAJALU All Rights Reserved
 11|------------------------------------------------------------------------------------------------------------
 12|  License: Distributed under the CECILL V2 License
 13|  This program is distributed in the hope that it will be useful - WITHOUT 
 14|  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
 15|  FITNESS FOR A PARTICULAR PURPOSE. 
 16|
 17| Please read Licence_CeCILL_V2-en.txt
 18| SVP lisez Licence_CeCILL_V2-fr.txt
 19|------------------------------------------------------------------------------------------------------------
 20*/
 21if ( !defined('PROTECT_ADMIN') )
 22{
 23	die("Tentative de Hacking");
 24}
 25
 26require_once($root.'class/class_image.php');
 27class digicode extends image
 28{
 29	// Combien de cases pour former le digicode
 30	var $nbre_cases = 25;
 31	// Combien de colonnes dans le damier
 32	var $nbre_colonnes = 5;
 33	// Caracteres possibles
 34	var $caracteres_autorises = array(0,1,2,3,4,5,6,7,8,9);
 35	// Longueur clef par caractere
 36	var $longueur_clef = 5;
 37	// Liste des clefs pour cette tentative de connexion
 38	var $clefs = array();
 39	// Repertoire de cache	
 40	var $url_cache='cache/digicode/';
 41	var $format = 'png';
 42	var $taille_texte = 14;
 43	// Largeur des cases
 44	var $largeur_cases = 30;
 45	var $police = array();
 46	var $couleur_texte = '#000000';
 47	var $couleur_fond = '#FFFFFF';
 48	
 49	//
 50	// Init
 51	function digicode(){
 52		global $cf,$root;
 53		// Polices dispos
 54		$this->police[] = $root.'data/fonts/verdana.ttf';
 55		$this->police[] = $root.'data/fonts/Alanden_.ttf';
 56		
 57		$this->code_acces_za = preg_replace('/[^0-9]/','',$cf->config['digicode_acces_zone_admin']);
 58		if ($this->code_acces_za == '')$this->code_acces_za='0000';
 59	}
 60
 61	//
 62	// Cree une image avec l'adresse en texte.	
 63	function generer_image_case_digicode($texte,$url){
 64		$this->image = imagecreatetruecolor($this->largeur_cases,$this->largeur_cases);
 65		$rgb = $this->html2rgb($this->couleur_fond);
 66		$background = ImageColorAllocate ($this->image, $rgb[0],$rgb[1],$rgb[2]); 
 67		imagefill($this->image,0,0,$background);	
 68		// Parasites
 69		$this->genere_parasites($texte);
 70		// Texte
 71		$this->position_x=4;
 72		$this->position_y=20;
 73		shuffle($this->police);
 74		$this->inserer_texte($texte,$this->taille_texte,$this->couleur_texte,$this->police[0]);
 75		// On enregistre
 76		$this->extension = $this->format;
 77		$this->save_image($url);
 78	}
 79	//
 80	// Cree des symboles parasites pour que la taille des images ne soit pas constante
 81	function genere_parasites($texte){
 82		// Rectangle
 83		$rgb = $this->html2rgb('#d2ee95');
 84		$couleur_motifs = ImageColorAllocate($this->image, $rgb[0],$rgb[1],$rgb[2]);
 85		$position = mt_rand(0,$this->largeur_cases);
 86		imagefilledrectangle($this->image, $position, $position, ($position+20), ($position+10), $couleur_motifs);
 87		// elypse
 88		$rgb = $this->html2rgb('#cfe2f0');
 89		$couleur_motifs = ImageColorAllocate($this->image, $rgb[0],$rgb[1],$rgb[2]);
 90		$position = mt_rand(0,$this->largeur_cases);
 91		imagefilledellipse($this->image, $position, $position, $position, $position, $couleur_motifs);
 92		// Si il n'y a pas de texte on rajoute un peu de couleur noire
 93		$texte=trim($texte);
 94		if (empty($texte)){
 95			$rgb = $this->html2rgb($this->couleur_texte);
 96			$couleur_motifs = ImageColorAllocate($this->image, $rgb[0],$rgb[1],$rgb[2]);
 97			imageline($this->image, mt_rand(0,$this->largeur_cases), mt_rand(0,$this->largeur_cases), mt_rand(0,$this->largeur_cases), mt_rand(0,$this->largeur_cases), $couleur_motifs);
 98			$couleur_motifs = ImageColorAllocate($this->image, $rgb[0],$rgb[1],$rgb[2]);
 99			imageline($this->image, mt_rand(0,$this->largeur_cases), mt_rand(0,$this->largeur_cases), mt_rand(0,$this->largeur_cases), mt_rand(0,$this->largeur_cases), $couleur_motifs);
100			$couleur_motifs = ImageColorAllocate($this->image, $rgb[0],$rgb[1],$rgb[2]);
101			imageline($this->image, mt_rand(0,$this->largeur_cases), mt_rand(0,$this->largeur_cases), mt_rand(0,$this->largeur_cases), mt_rand(0,$this->largeur_cases), $couleur_motifs);
102		}
103	}
104	
105	//
106	// Genere une image pour la case du digicode
107	function appel_image_case_digicode($numero,$clef){
108		if (empty($numero) || empty($clef)) return false;
109		global $root;
110		if (!is_dir($root.$this->url_cache)) $this->creer_dossier_image($root.$this->url_cache);
111		$url = $root.$this->url_cache.md5($clef).'.'.$this->format;
112		if (!file_exists($url)){
113			$this->generer_image_case_digicode($numero,$url);
114		}
115		return $url;
116	}
117	
118	//
119	// Affiche le digicode
120	function afficher_digicode(){
121		global $tpl,$root,$lang;
122		$this->purger_cache_digicode();
123		$tpl->set_filenames(array(
124			'body_admin' => $root.'html/admin_digicode.html'
125		));
126		$liste_cases = array_pad($this->caracteres_autorises,$this->nbre_cases,' ');
127		shuffle($liste_cases);
128		include_once($root.'fonctions/fct_maths.php');
129		$i = 0;
130		foreach($liste_cases AS $numero){
131			$clef = generate_key($this->longueur_clef);
132			$this->clefs[$numero] = $clef;
133			if ($i%$this->nbre_colonnes ==0) $tpl->assign_block_vars('tr', array());
134			$tpl->assign_block_vars('tr.case', array(
135				'IMAGE'	=> $this->appel_image_case_digicode(' '.$numero,$clef),
136				'CLEF'	=> $clef,
137			));
138			$i++;
139		}
140		unset($liste_cases);
141		$this->encoder_code_access();
142		$this->declarer_clefs_langue();
143		$nbre_tentatives = 0;
144		if (isset($_SESSION['digicode_nbre_tentatives']) && $_SESSION['digicode_nbre_tentatives']>0){
145			$tpl->assign_block_vars('alerte_tentatives', array());
146			$nbre_tentatives = $_SESSION['digicode_nbre_tentatives'];
147		}
148		$tpl->assign_vars(array(
149			'LARGEUR_DIGICODE'	=> ($this->largeur_cases*$this->nbre_colonnes+35),
150			'NBRE_COLONNES'		=> $this->nbre_colonnes,
151			'L_ALERTE_TENTATIVES'	=> sprintf($lang['L_ALERTE_TENTATIVES'],$nbre_tentatives)
152		));		
153	}
154	
155	//
156	// Encode la clef de la zone admin pour la stocker en session
157	function encoder_code_access(){
158		$caracteres = str_split($this->code_acces_za,1);
159		$code_crypte = '';
160		// Parcours du code secret
161		foreach($caracteres AS $c){	$code_crypte .= $this->clefs[$c]; }
162		$_SESSION['digicode_clef_acceptee'] = $code_crypte;
163	}
164
165	
166	//
167	// Verifie que le code saisi corresponde bien au code definis par les fondateurs
168	function verifier_code($vars){
169		$this->purger_cache_digicode();
170		if (!isset($vars['code']) 
171			|| empty($vars['code']) 
172			|| !isset($_SESSION['digicode_clef_acceptee']) 
173			|| empty($_SESSION['digicode_clef_acceptee']))
174		{
175			$this->redirect_echec();
176		}else{
177			$code_saisis = preg_replace('/[^a-z0-9]/i','',$vars['code']);	
178			if ($code_saisis != $_SESSION['digicode_clef_acceptee']){
179				$this->redirect_echec();
180			}else{
181				$_SESSION['digicode_TTL'] = time();
182				$_SESSION['digicode_clef_acceptee'] = null;
183				$_SESSION['digicode_nbre_tentatives'] = 0;
184				header('location: '.$this->retour);
185				exit;
186			}
187		}
188	}
189	
190	//
191	// Redirection apres tentative ratee
192	function redirect_echec(){
193		$_SESSION['digicode_clef_acceptee'] = null;
194		$_SESSION['digicode_nbre_tentatives'] = (isset($_SESSION['digicode_nbre_tentatives']))?$_SESSION['digicode_nbre_tentatives']+1:1;
195		if ($_SESSION['digicode_nbre_tentatives']>2){
196			global $droits,$session,$lang,$user;
197			$this->alerte_mail_fondateurs();
198			$droits->ban_ip($session->ip,time(),sprintf($lang['L_DIGICODE_HACK'],$user['pseudo']));
199			header('location: ./index.php');
200		}
201		$this->afficher_digicode();
202	}
203	
204	//
205	// Mail pour prevenir les fondateurs
206	function alerte_mail_fondateurs(){
207		global $root,$cf,$c,$lang,$user,$session;
208		load_lang('emails');
209		
210		require_once($root.'class/class_mail.php');
211		$email = new mail();
212		$email->Subject = $lang['L_DIGICODE_ALERTE_HACKING'];
213		$email->titre_message = $lang['L_DIGICODE_ALERTE_HACKING_DETAIL'];
214		$email->message_explain = $lang['L_DIGICODE_ALERTE_HACKING_EXPLAIN'];
215		$email->formate_html(sprintf($lang['L_DIGICODE_ALERTE_HACKING_MSG'], date('d/m/Y H\hi'), $user['pseudo'], $session->ip, gethostbyaddr($session->ip)));
216
217		$sql = 'SELECT email, pseudo FROM '.TABLE_USERS.' WHERE level>8';
218		if (!$resultat = $c->sql_query($sql))message_die(E_ERROR,1300,__FILE__,__LINE__,$sql);
219		while($row = $c->sql_fetchrow($resultat)){
220			$email->AddAddress($row['email'],$row['pseudo']);
221		}
222		$email->Send();	
223	}
224	
225	//
226	// Purger le dossier des images
227	function purger_cache_digicode(){
228		global $root;
229		$this->url_cache = $root.$this->url_cache;
230		if (!is_dir($this->url_cache)) return true;
231		
232		$ch = @opendir($this->url_cache);
233		while ($fichier = @readdir($ch))
234		{
235			if ($fichier != '.' && $fichier != '..' 
236				&& $fichier != '.htaccess' && !is_dir($this->url_cache.$fichier))
237			{
238				@unlink($this->url_cache.$fichier);
239			}
240		}
241		@closedir($ch);	
242		return true;	
243	}
244	
245	//
246	// Declaration des clefs de langue
247	function declarer_clefs_langue(){
248		global $tpl,$lang,$img;
249		$tpl->assign_vars(array(
250			'L_SAISISSEZ_VOTRE_CODE'	=> $lang['L_SAISISSEZ_VOTRE_CODE'],
251			'L_ENTRER'					=> $lang['L_ENTRER'],
252			'L_EFFACER'					=> $lang['L_EFFACER'],
253			'L_ADMIN_DIGICODE'			=> $lang['L_ADMIN_DIGICODE'],
254			'L_ADMIN_DIGICODE_EXPLAIN'	=> $lang['L_ADMIN_DIGICODE_EXPLAIN'],
255			'I_DIGICODE'				=> $img['digicode'],
256		));
257	}
258}
259
260
261?>