function.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818
  1. <?php
  2. //é
  3. require_once('config.php');
  4. function rewindPath($path){
  5. $path = str_replace('/..','',$path);
  6. $path =substr($path,0,strrpos($path,'/'));
  7. return $path;
  8. }
  9. /**
  10. *
  11. * Scanne un dossier et retourne ses fichiers sous forme d'une liste de tableaux contenant le nom, l'extension et l'url du fichier
  12. * @author Idleman
  13. * @param string $folder
  14. * @return array<array<>> $realFiles
  15. */
  16. function scanFolder($folder){
  17. $folder = utf8_decode($folder);
  18. $noFolders = array(
  19. $folder.'.dc',
  20. $folder.'.'
  21. );
  22. $folder = str_replace('//','/',$folder);
  23. $root = getConfig('ROOT');
  24. if(realpath($folder)==realpath('../'.UPLOAD_FOLDER))$noFolders []=$folder.'..';
  25. $filteredFiles = array();
  26. //if($folder!='../uploads/') var_dump(mb_detect_encoding($folder),$folder);
  27. $files = scandir($folder);
  28. $realFiles = array();
  29. foreach($files as $file){
  30. $fileArray = array();
  31. //echo var_dump($folder.$file);
  32. if(DISPLAY_DOTFILES || (substr($file,0,1)!='.' || $file=='..') ){
  33. if(is_file($folder.$file)){
  34. if(!isset($filter) || in_array(str_replace('../','',utf8_encode($folder.$file)),$filteredFiles)){
  35. $fileArray['type'] = 'file';
  36. $fileArray['toolTipName'] =wordwrap(utf8_encode($file),29,'<br/>',true);
  37. $fileArray['name'] = utf8_encode($file);
  38. $fileArray['shortname'] =utf8_encode(short($file,NAME_LIMIT,get_extension($file)));
  39. $fileArray['extension'] =get_extension($file);
  40. $fileArray['url'] = utf8_encode(str_replace('../','',$folder).$file);
  41. $fileArray['absoluteUrl'] = $root.'php/action.php?action=openFile&file=../'.$fileArray['url'];
  42. $fileArray['size'] = getSize($folder.$file);
  43. $fileArray['published'] = isPublished($folder.$file);
  44. $mtime = filemtime ($folder.$file);
  45. $fileArray['mtimeDate'] = date('d/m/Y',$mtime);
  46. $fileArray['mtimeHour'] = date('h\hi\m',$mtime);
  47. $realFiles[]=$fileArray;
  48. unset($fileArray);
  49. }
  50. }else{
  51. if(!in_array($folder.$file, $noFolders) && ( !DISPLAY_AVATAR_FOLDER && realpath($folder.$file)!=realpath('../'.AVATARFOLDER)) ){
  52. $fileArray['type'] = 'folder';
  53. $fileArray['name'] = utf8_encode($file);
  54. $fileArray['shortname'] =utf8_encode(short($file,NAME_LIMIT,get_extension($file)));
  55. $fileArray['url'] = utf8_encode(str_replace('//','/',$folder.'/'.$file));
  56. if($file=='..')$fileArray['url'] =rewindPath($fileArray['url']);
  57. $fileArray['size'] ='10ko';
  58. $realFiles[]=$fileArray;
  59. unset($fileArray);
  60. }
  61. }
  62. }
  63. }
  64. return $realFiles;
  65. }
  66. /**
  67. * Retourne le resume d'une chaine $string au bout de $limit caracteres en ne prenant par compte de l'extension $ext (si c'est un fichier)
  68. * Enter description here ...
  69. * @param $string
  70. * @param $limit
  71. * @param $ext
  72. * @author Idleman
  73. * @return string $shortName
  74. */
  75. function short($string,$limit,$ext){
  76. return (strlen($string)>$limit?substr($string,0,$limit-3).NAME_LIMIT_BORDER.$ext:$string);
  77. }
  78. /**
  79. *
  80. * Retourne l'extension d'un fichier a partir de son nom
  81. * @param $file_name
  82. * @author Idleman
  83. * @return string $extension
  84. */
  85. function get_extension($file_name){
  86. $ext = explode('.', $file_name);
  87. $ext = (count($ext)==1?null:array_pop($ext));
  88. return strtolower($ext);
  89. }
  90. function getEvents(){
  91. if(!file_exists('../'.DCFOLDER.EVENTFILE)) @touch('../'.DCFOLDER.EVENTFILE);
  92. return file('../'.DCFOLDER.EVENTFILE);
  93. }
  94. /**
  95. *
  96. * Lit le fichier JSON des evenements, le parse et les retourne sous forme d'une liste d'objets JSON
  97. * @author Idleman
  98. * @return array<JSONObject> $events
  99. */
  100. function parseEvents(){
  101. $events = getEvents();
  102. $parsedEvents = array();
  103. foreach($events as $event){
  104. $parsedEvents [] = json_decode($event);
  105. }
  106. return $parsedEvents;
  107. }
  108. /**
  109. *
  110. * Ajoute un Evenement au fichier JSON de stockage des evenements
  111. * @author Idleman
  112. * @param array<> $event
  113. */
  114. function addEvent($event){
  115. file_put_contents('../'.DCFOLDER.EVENTFILE,json_encode($event)."\r\n",FILE_APPEND);
  116. }
  117. /**
  118. *
  119. * Ajoute un parametre au fichier securise JSON de configuration
  120. * @author Idleman
  121. * @param array<> $user
  122. */
  123. function addConfig($key,$value){
  124. $config = array($key => $value);
  125. file_put_contents('../'.DCFOLDER.CONFIGFILE,SECURE_DELIMITER_BEGIN.json_encode($config).SECURE_DELIMITER_END."\r\n",FILE_APPEND);
  126. }
  127. /**
  128. *
  129. * Encode le mot de passe fournis en sha1 et md5
  130. * @param string password
  131. * @author Idleman
  132. */
  133. function encode($str){
  134. return md5(sha1($str));
  135. }
  136. /**
  137. *
  138. * Teste l'existence d'un compte utilisateur dans la base.
  139. * @param string $login
  140. * @param string $password
  141. * @author Idleman
  142. * @return si l'utilisateur existe, il le retourne dans le cas contraire : boolean faux
  143. */
  144. function exist($login,$password){
  145. $user = getUser($login);
  146. return ($user!=false && $user->password==encode($password)?$user:false);
  147. }
  148. /**
  149. *
  150. * Teste l'existence d'un compte utilisateur dans la base en fonction de son authToken.
  151. * @param string $token
  152. * @author Idleman
  153. * @return boolean vrai ou faux
  154. */
  155. function existToken($token){
  156. $users = parseUsers();
  157. $target = false;
  158. foreach($users as $user){
  159. if(strcasecmp(getToken($user),$token)==0)$target=$user;
  160. }
  161. return ($target!=false?$target:false);
  162. }
  163. function getToken($user){
  164. return sha1(LEFT_HASH.$user->login.$user->password.RIGHT_HASH);
  165. }
  166. function existLogin($login){
  167. $user = getUser($login);
  168. return ($user!=false?$user:false);
  169. }
  170. /**
  171. *
  172. * Retourne les infos liees a un parametre de configuration sous la forme d'un objet JSON a partir de sa cle
  173. * @param $login
  174. * @return JSONObject $target
  175. * @author Idleman
  176. */
  177. function getConfig($key){
  178. $configs = parseConfigs();
  179. $target = false;
  180. foreach($configs as $config){
  181. $config = get_object_vars($config);
  182. if(isset($config[$key])){
  183. $target=$config[$key];
  184. }
  185. }
  186. return $target;
  187. }
  188. /**
  189. *
  190. * Ajoute un utilisateur au fichier securise JSON de stockage des utilisateurs
  191. * @author Idleman
  192. * @param array<> $user
  193. */
  194. function addUser($user,$encodePassword = true){
  195. if($encodePassword) $user['password'] = encode($user['password']);
  196. file_put_contents('../'.DCFOLDER.USERFILE,SECURE_DELIMITER_BEGIN.json_encode($user).SECURE_DELIMITER_END."\r\n",FILE_APPEND);
  197. }
  198. /**
  199. *
  200. * Retourne les infos d'un utilisateur sous la forme d'un objet JSON a partir de son login
  201. * @param $login
  202. * @return JSONObject $target
  203. * @author Idleman
  204. */
  205. function getUser($login){
  206. $users = parseUsers();
  207. $target = false;
  208. foreach($users as $user){
  209. if(strcasecmp($user->login,$login)==0)$target=$user;
  210. }
  211. return $target;
  212. }
  213. /**
  214. *
  215. * update les params d'un user à partir de son login
  216. * @param $login
  217. * @return JSONObject $target
  218. * @author H3
  219. * @edit [21/03/2012] Idleman -> Cryptage du mdp, non modification du mdp si nouveaux mdp vide
  220. */
  221. function updateUser($login,$values){
  222. $user = get_object_vars(getUser($login));
  223. foreach($values as $attr=>$value){
  224. if(!($attr == 'password' && ($value =="") || !isset($value))) $user[$attr] = ($attr=='password'?encode($value):$value);
  225. }
  226. deleteUser($login);
  227. addUser($user,false);
  228. $_SESSION['user'] = serialize((object)$user);
  229. }
  230. /**
  231. * Supprime une utilisateur de la base a partir de son login
  232. * @param string $login
  233. * @author Idleman
  234. */
  235. function deleteUser($login){
  236. $users = parseUsers();
  237. $targets = array();
  238. unlink('../'.DCFOLDER.USERFILE);
  239. foreach($users as $currentUser){
  240. if($currentUser->login!=$login){
  241. file_put_contents('../'.DCFOLDER.USERFILE,SECURE_DELIMITER_BEGIN.json_encode($currentUser).SECURE_DELIMITER_END."\r\n",FILE_APPEND);
  242. }
  243. }
  244. }
  245. /**
  246. * Parse le fichiers des utilisateurs et les retourne sous forme d'une liste d'objets JSON
  247. * @param [OPTIONNAL] string $dir
  248. * @author Idleman
  249. * @return array<JSONOBject> $users
  250. */
  251. function parseUsers($dir = '../'){
  252. $userLines = file($dir.DCFOLDER.USERFILE);
  253. $users = array();
  254. foreach($userLines as $userLine){
  255. if(trim($userLine)!=''){
  256. $catchedUser = json_decode(str_replace(array(SECURE_DELIMITER_BEGIN,SECURE_DELIMITER_END),'',$userLine));
  257. if(!isset($catchedUser->avatar) || trim($catchedUser->avatar)==''){
  258. //if($catchedUser->mail!=''){
  259. $catchedUser->avatar= getGravatar($catchedUser);
  260. //}else{
  261. // $catchedUser->avatar =AVATARFOLDER.AVATAR_DEFAULT;
  262. //}
  263. }
  264. $users [] = $catchedUser;
  265. }
  266. }
  267. return $users;
  268. }
  269. function deletePublish($file){
  270. $publishes = parsePublishes();
  271. $targets = array();
  272. unlink('../'.DCFOLDER.PUBLISHFILE);
  273. foreach($publishes as $publish){
  274. if($publish!=$file){
  275. file_put_contents('../'.DCFOLDER.PUBLISHFILE,SECURE_DELIMITER_BEGIN.json_encode(utf8_encode($publish)).SECURE_DELIMITER_END."\r\n",FILE_APPEND);
  276. }
  277. }
  278. }
  279. /**
  280. *
  281. * Ajoute un fichier publié au fichier des publications
  282. * @author Idleman
  283. * @param <string> file
  284. */
  285. function addPublish($file){
  286. if(!isPublished($file)){
  287. file_put_contents('../'.DCFOLDER.PUBLISHFILE,SECURE_DELIMITER_BEGIN.json_encode(utf8_encode($file)).SECURE_DELIMITER_END."\r\n",FILE_APPEND);
  288. }
  289. }
  290. /**
  291. *
  292. * Questionne le fichier des publications pour voir si le fichier est publié.
  293. * @param <string> $file chemin du fichier
  294. * @return true ou false
  295. * @author Idleman
  296. */
  297. function isPublished($file){
  298. $publishes = parsePublishes();
  299. $target = false;
  300. foreach($publishes as $publish){
  301. if(strcasecmp($publish,$file)==0)$target = true;
  302. }
  303. return $target;
  304. }
  305. /**
  306. * Parse le fichiers des publication et les retourne sous forme d'une liste d'objets JSON
  307. * @param [OPTIONNAL] string $dir
  308. * @author Idleman
  309. * @return array<JSONOBject> $publishes
  310. */
  311. function parsePublishes($dir = '../'){
  312. if(!file_exists($dir.DCFOLDER.PUBLISHFILE)) touch($dir.DCFOLDER.PUBLISHFILE);
  313. $publishesLines = file($dir.DCFOLDER.PUBLISHFILE);
  314. $publishes = array();
  315. foreach($publishesLines as $publishLine){
  316. if(trim($publishLine)!=''){
  317. $publishes [] = utf8_decode(json_decode(str_replace(array(SECURE_DELIMITER_BEGIN,SECURE_DELIMITER_END),'',$publishLine)));
  318. }
  319. }
  320. return $publishes;
  321. }
  322. /**
  323. * Parse le fichiers des configurations et les retourne sous forme d'une liste d'objets JSON
  324. * @param [OPTIONNAL] string $dir
  325. * @author Idleman
  326. * @return array<JSONOBject> $configs
  327. */
  328. function parseConfigs($dir = '../'){
  329. $configLines = (file_exists($dir.DCFOLDER.CONFIGFILE)?@file($dir.DCFOLDER.CONFIGFILE):@file(DCFOLDER.CONFIGFILE));
  330. $configs = array();
  331. if($configLines!=false){
  332. foreach($configLines as $configLine){
  333. if(trim($configLine)!=''){
  334. $catchedConfig = json_decode(str_replace(array(SECURE_DELIMITER_BEGIN,SECURE_DELIMITER_END),'',$configLine));
  335. $configs [] = $catchedConfig;
  336. }
  337. }
  338. }
  339. return $configs;
  340. }
  341. function reductImage($image,$dest,$largeur = 0, $hauteur = 0,$proportions = TRUE){
  342. $dimensions=getimagesize($image);
  343. if ($proportions){
  344. if($dimensions[0]<$dimensions[1]){
  345. $largeur = ($hauteur / $dimensions[1]) * $dimensions[0] ;
  346. }else{
  347. $hauteur = ($largeur / $dimensions[0]) * $dimensions[1] ;
  348. }
  349. }
  350. $pats = pathinfo($image);
  351. switch (strtolower($pats['extension'])){
  352. case 'jpg':
  353. $imageFlux = imagecreatefromjpeg($image);
  354. break;
  355. case 'jpeg':
  356. $imageFlux = imagecreatefromjpeg($image);
  357. break;
  358. case 'png':
  359. $imageFlux = imagecreatefrompng($image);
  360. break;
  361. case 'gif':
  362. $imageFlux = imagecreatefromgif($image);
  363. break;
  364. case 'bmp':
  365. $imageFlux = imagecreatefrombmp($image);
  366. break;
  367. }
  368. $destination = imagecreatetruecolor($largeur, $hauteur);
  369. imagecopyresampled ($destination,$imageFlux,0,0,0,0,$largeur,$hauteur,$dimensions[0],$dimensions[1] ) ;
  370. switch (strtolower($pats['extension'])){
  371. case 'jpg':
  372. imagejpeg($destination, $dest);
  373. break;
  374. case 'jpeg':
  375. imagejpeg($destination, $dest);
  376. break;
  377. case 'png':
  378. imagepng($destination, $dest);
  379. break;
  380. case 'gif':
  381. imagegif($destination, $dest);
  382. break;
  383. case 'bmp':
  384. imagejpeg($destination, $dest);
  385. break;
  386. }
  387. imagedestroy($imageFlux);
  388. }
  389. /**
  390. * Retourne l'url de l'image d'avatar correspondant au mail donne en parametre
  391. * @author Site de Gravatar
  392. * @param string $email The email address
  393. * @param string $s Size in pixels, defaults to 80px [ 1 - 512 ]
  394. * @param string $d Default imageset to use [ 404 | mm | identicon | monsterid | wavatar ]
  395. * @param string $r Maximum rating (inclusive) [ g | pg | r | x ]
  396. * @param boole $img True to return a complete IMG tag False for just the URL
  397. * @param array $atts Optional, additional key/value attributes to include in the IMG tag
  398. * @return String containing either just a URL or a complete image tag
  399. * @source http://gravatar.com/site/implement/images/php/
  400. */
  401. function getGravatar( $user, $s = 50, $d = 'mm', $r = 'g') {
  402. $email = $user->mail;
  403. $url = AVATARFOLDER.$user->login.'.jpg';
  404. if(!file_exists('../'.$url) && !file_exists($url)){
  405. @copy('http://www.gravatar.com/avatar/'.md5( strtolower( trim( $email ) ) ).".jpg?s=$s&d=$d&r=$r",'../'.$url);
  406. //@copy(file_get_contents('http://DropCenter.idleman.fr/services/avatar/index.php?code=nobot&key='.strtolower( trim( $email ))),$url);
  407. }
  408. return $url;
  409. }
  410. function describeEvent($event,$root){
  411. $user = getUser($event->user);
  412. $describedEvent['user'] = $user;
  413. $describedEvent['date'] = $event->date;
  414. $describedEvent['action'] = $event->action;
  415. $avatar = $root.'php/action.php?action=openFile&file='.$user->avatar;
  416. switch($event->action){
  417. case 'addEventForUpload':
  418. $describedEvent['title'] = $event->user.' '.tt('a ajoute un ou plusieurs fichiers');
  419. $files = $event->files;
  420. $describedEvent['lien'] = $root.'#'.urlencode(count($files)).'files-added-'.date('d-m-Y-h\hi\ms\s',$event->date);
  421. $describedEvent['description'] = '<img src="'.$avatar.'" align="absmiddle" border="0" /> <a href="mailto: '.$user->mail.'">'.$event->user.'</a> '.tt('a ajoute % fichier%',array(count($files),(count($files)>1?'s':''))).' : <ul>';
  422. if(count($files)!=0){
  423. foreach($files as $file){
  424. $describedEvent['description'] .='<li><a href="'.$file->path.'">'.$file->name.'</a></li>';
  425. }
  426. }
  427. $describedEvent['description'] .='</ul> le '.date('d/m/Y \- h:i:s',$event->date);
  428. break;
  429. case 'upload':
  430. $describedEvent['title'] = $event->user.' '.tt('a ajoute un fichier');
  431. $describedEvent['lien'] = $event->filePath;
  432. $describedEvent['description'] = '<img src="'.$avatar.'" align="absmiddle" border="0" /> <a href="mailto: '.$user->mail.'">'.$event->user.'</a> '.tt('a ajoute le fichier <a target="_blank" href="%">%</a> le %',array($describedEvent['lien'],$event->file,date('d/m/Y \- h:i:s',$event->date)));
  433. break;
  434. case 'deleteFiles':
  435. if($event->type=='folder'){
  436. $describedEvent['title'] = $event->user.' '.tt('a supprime un dossier');
  437. $describedEvent['description'] = '<img src="'.$avatar.'" align="absmiddle" border="0" /> <a href="mailto: '.$user->mail.'">'.$event->user.'</a> '.tt('a supprime le dossier % le %',array(str_replace(UPLOAD_FOLDER,'',$event->file),date('d/m/Y \- h:i:s',$event->date)));
  438. $describedEvent['lien'] = $root.'#'.urlencode($event->file).'-'.date('d-m-Y-h\hi\ms\s',$event->date).'-deleted';
  439. }else{
  440. $describedEvent['title'] = $event->user.' '.tt('a supprime un fichier');
  441. $describedEvent['description'] = '<img src="'.$avatar.'" align="absmiddle" border="0" /> <a href="mailto: '.$user->mail.'">'.$event->user.'</a> '.tt('a supprime le fichier % le %',array(str_replace(UPLOAD_FOLDER,'',$event->file),date('d/m/Y \- h:i:s',$event->date)));
  442. $describedEvent['lien'] = $root.'#'.(isset($event->filePath)?$event->filePath:'').urlencode($event->file).'-'.date('d-m-Y-h\hi\ms\s',$event->date).'-deleted';
  443. }
  444. break;
  445. case 'renameFile':
  446. $describedEvent['title'] = $event->user.' '.tt('a renomme un '.($event->type=='folder'?'dossier':'fichier'));
  447. $describedEvent['lien'] = $root.UPLOAD_FOLDER.urlencode($event->rename);
  448. $describedEvent['description'] = '<img src="'.$avatar.'" align="absmiddle" border="0" /> <a href="mailto: '.$user->mail.'">'.$event->user.'</a> '.tt('a renomme le '.($event->type=='folder'?'dossier':'fichier').' % en <a target="_blank" href="%">%</a> le %',array(str_replace(UPLOAD_FOLDER,'',$event->file),$describedEvent['lien'],$event->rename,date('d/m/Y \- h:i:s',$event->date)));
  449. break;
  450. case 'addUser':
  451. $describedEvent['title'] = $event->user.' '.tt('a ajoute l\'utilisateur').' '.$event->addedUser;
  452. $describedEvent['description'] = '<img src="'.$avatar.'" align="absmiddle" border="0" /> <a href="mailto: '.$user->mail.'">'.$event->user.'</a> '.tt('a ajoute l\'utilisateur % le %',array($event->addedUser,date('d/m/Y \- h:i:s',$event->date)));
  453. $describedEvent['lien'] = $root.'#'.date('d-m-Y-h\hi\ms\s',$event->date).'-'.$event->addedUser.'-added';
  454. break;
  455. case 'install':
  456. $describedEvent['title'] = $event->user.' '.tt('a installe le dropCenter');
  457. $describedEvent['description'] = '<img src="'.$avatar.'" align="absmiddle" border="0" /> <a href="mailto: '.$user->mail.'">'.$event->user.'</a> '.tt('a installe le dropCenter le %',array(date('d/m/Y \- h:i:s',$event->date)));
  458. $describedEvent['lien'] = $root.'#-install';
  459. break;
  460. case 'deleteUser':
  461. $describedEvent['title'] = $event->user.' '.tt('a supprime l\'utilisateur').' '.$event->deletedUser;
  462. $describedEvent['description'] = '<img src="'.$avatar.'" align="absmiddle" border="0" /> <a href="mailto: '.$user->mail.'">'.$event->user.'</a> '.tt('a supprime l\'utilisateur % le %',array($event->deletedUser,date('d/m/Y \- h:i:s',$event->date)));
  463. $describedEvent['lien'] = $root.'#'.date('d-m-Y-h\hi\ms\s',$event->date).'-'.$event->deletedUser.'-deleted';
  464. break;
  465. /*case 'backup':
  466. $describedEvent['title'] = $event->user.' '.tt('a fait un backup des fichiers');
  467. $describedEvent['lien'] = $event->filePath;
  468. $describedEvent['description'] = '<img src="'.$avatar.'" align="absmiddle" border="0" /> <a href="mailto: '.$user->mail.'">'.$event->user.'</a> '.tt('a fait un backup des fichiers disponible sur <a target="_blank" href="%">%</a> le %',array($describedEvent['lien'],$event->file,date('d/m/Y \- h:i:s',$event->date)));
  469. break;*/
  470. }
  471. return $describedEvent;
  472. }
  473. function chuckQuote($path = null){
  474. $path = (isset($path)?$path:'../'.DCFOLDER.CHUCKFILE);
  475. $stream = explode('%',file_get_contents(UPLOAD_FOLDER.$path));
  476. return utf8_encode($stream[rand(0,count($stream)-1)]);
  477. }
  478. function getSize($file)
  479. {
  480. $size = filesize($file);
  481. return convertSize($size);
  482. }
  483. function convertSize($size){
  484. if ($size < 1024) {
  485. return ($size==0?'0 ':$size) .' o';
  486. } elseif ($size < 1048576) {
  487. return round($size / 1024, 2) .' Ko';
  488. } elseif ($size < 1073741824) {
  489. return round($size / 1048576, 2) . ' Mo';
  490. } elseif ($size < 1099511627776) {
  491. return round($size / 1073741824, 2) . ' Go';
  492. } elseif ($size < 1125899906842624) {
  493. return round($size / 1099511627776, 2) .' To';
  494. } elseif ($size < 1152921504606846976) {
  495. return round($size / 1125899906842624, 2) .' Po';
  496. } elseif ($size < 1180591620717411303424) {
  497. return round($size / 1152921504606846976, 2) .' Eo';
  498. } elseif ($size < 1208925819614629174706176) {
  499. return round($size / 1180591620717411303424, 2) .' Zo';
  500. } else {
  501. return round($size / 1208925819614629174706176, 2) .' Yo';
  502. }
  503. }
  504. function countFiles($folder = UPLOAD_FOLDER){
  505. $fileInfos = array();
  506. $files = scanDir($folder);
  507. foreach($files as $file){
  508. if($file!='.' && $file!='..' && $folder.'/'.$file!='uploads//.dc' && $folder.'/'.$file!='uploads//avatars'&& $folder.'/'.$file!='uploads//.htaccess'){
  509. if(is_dir($folder.'/'.$file)){
  510. $fileInfos = array_merge($fileInfos,countFiles($folder.'/'.$file));
  511. }else{
  512. $fileInfos [$folder.$file]['size'] = filesize($folder.'/'.$file);
  513. }
  514. }
  515. }
  516. return $fileInfos;
  517. }
  518. /**
  519. * Convertis une cle de traduction en langage traduit
  520. * @param string $key : cle de traduction
  521. * @param [OPTIONNAL] array $parameters, parametres dynamiques e inclure dans la traduction (remplace respectivement les signes [%%])
  522. * @param [OPTIONNAL] string $lang
  523. * @author Idleman
  524. * @return String $traduction
  525. */
  526. function tt($key,$parameters=null,$langage=DC_LANG){
  527. $user = (isset($_SESSION['user']) && $_SESSION['user']!=null ?@unserialize($_SESSION['user']):null);
  528. if(isset($user->lang) && isset($user->lang)) $langage =$user->lang;
  529. $lang = getLang($langage);
  530. //$return = (isset($lang[$key])?$lang[$key]:"<span style='color:red;font-weight:bold'>TRADUCTION MISS : '$key' for langage '$langage']</span>");
  531. $return = (isset($lang[utf8_encode($key)])?$lang[utf8_encode($key)]:'<span style=\'color:red;font-weight:bold\'>'.$key.'[::->]</span>');
  532. if(isset($parameters)){
  533. $parametersVars = explode('[%%]',$return);
  534. $return = '';
  535. $i=0;
  536. for($o = 0,$e= count($parametersVars);$o<$e;$o++){
  537. if($o!=0){
  538. $return .= (isset($parameters[$i])?$parameters[$i]:'').$parametersVars[$o];
  539. $i++;
  540. }else{
  541. $return .= $parametersVars[$o];
  542. }
  543. }
  544. }
  545. return utf8_decode($return);
  546. }
  547. /**
  548. * Convertis une cle de traduction en langage traduit
  549. * @param string $key : cle de traduction
  550. * @param [OPTIONNAL] array $parameters, parametres dynamiques e inclure dans la traduction (remplace respectivement les signes [%%])
  551. * @param [OPTIONNAL] string $lang
  552. * @author Idleman
  553. * @echo String $traduction
  554. */
  555. function t($key,$parameters=null,$langage=DC_LANG){
  556. $user = (isset($_SESSION['user']) && $_SESSION['user']!=null ?unserialize($_SESSION['user']):null);
  557. if(isset($user->lang) && isset($user->lang))$langage=$user->lang;
  558. $lang = getLang($langage);
  559. $return = (isset($lang[utf8_encode($key)])?$lang[utf8_encode($key)]:"<span style='color:red;font-weight:bold'>TRADUCTION MISS : '$key' for langage '$langage']</span>");
  560. //$return = (isset($lang[$key])?$lang[$key]:'<span style=\'color:red;font-weight:bold\'>'.$key.'[::->]</span>');
  561. if(isset($parameters)){
  562. $parametersVars = explode('[%%]',$return);
  563. $return = '';
  564. $i=0;
  565. for($o = 0,$e = count($parametersVars);$o<$e;$o++){
  566. if($o!=0){
  567. $return .= (isset($parameters[$i])?$parameters[$i]:'').$parametersVars[$o];
  568. $i++;
  569. }else{
  570. $return .= $parametersVars[$o];
  571. }
  572. }
  573. }
  574. echo $return;
  575. }
  576. /**
  577. * Parse le fichiers des langues et retourne les traductions sous forme d'un tableau
  578. * @param [OPTIONNAL] string $lang
  579. * @author Idleman
  580. * @return array<String> $traductions
  581. */
  582. function getLang($lang=DC_LANG){
  583. if(!isset($_SESSION['traductions'])){
  584. $path = (file_exists(LANGFOLDER.$lang)?LANGFOLDER.$lang:'../'.LANGFOLDER.$lang);
  585. $langLines = file($path,FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
  586. $traductions = array();
  587. foreach($langLines as $langLine){
  588. if(trim($langLine)!=''){
  589. list($key,$traduction) = explode('[::->]',$langLine);
  590. $traductions[$key] = $traduction;
  591. }
  592. }
  593. //TODO, e decommenter en fin de dev :
  594. //$_SESSION['traductions'] = serialize($traductions);
  595. }else{
  596. $traductions = unserialize($_SESSION['traductions']);
  597. }
  598. return $traductions;
  599. }
  600. //Suprime un dossier et tous son contenu
  601. function recursiveDelete($folder){
  602. $open=@scandir($folder);
  603. if (!$open) return false;
  604. foreach($open as $file) {
  605. if ($file != '.' && $file != '..'){
  606. if (is_dir($folder."/".$file)) {
  607. $r=recursiveDelete($folder."/".$file);
  608. if (!$r) return false;
  609. }
  610. else if (is_file($folder."/".$file)){
  611. $r=@unlink($folder."/".$file);
  612. if (!$r) return false;
  613. }
  614. }
  615. }
  616. $r=@rmdir($folder);
  617. if (!$r) return false;
  618. return true;
  619. }
  620. //Convertit en bytes une chaîne au format texte
  621. //Exemples de chaîne: "2 Mo", "5 Ko", ...
  622. function toBytes($str)
  623. {
  624. $val = trim($str);
  625. $last = strtolower($str[strlen($str)-1]);
  626. switch($last)
  627. {
  628. case 'g': $val *= 1024;
  629. case 'm': $val *= 1024;
  630. case 'k': $val *= 1024;
  631. }
  632. return $val;
  633. }
  634. //Récupère la taille maximale d'upload autorisée dans php.ini
  635. function getUploadSize()
  636. {
  637. $postSize = ini_get('post_max_size');
  638. $uploadSize = ini_get('upload_max_filesize');
  639. return min(toBytes($postSize),toBytes($uploadSize));
  640. }
  641. /* Constitue un nom lors de la creation des dossiers pour ne pas excraser les existantes (ex :nouveaux dossier (2)) */
  642. function makeName($folder,$name,$number=1){
  643. $scan = scandir($folder);
  644. $exist = false;
  645. foreach($scan as $file){
  646. if($file==$name.' ('.$number.')') $exist = true;
  647. }
  648. if($exist){
  649. return makeName($folder,$name,$number+1);
  650. }else{
  651. return $name.' ('.$number.')';
  652. }
  653. }
  654. function rssHeader($link){
  655. return '<rss xmlns:media="http://search.yahoo.com/mrss/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  656. <channel>
  657. <atom:link href="'.$link.'" rel="self" type="application/rss+xml"/>
  658. <title>'.DC_TITLE.'</title>
  659. <link>
  660. '.$link.'
  661. </link>
  662. <description>'.DC_DESCRIPTION.'</description>
  663. <language>fr-fr</language>
  664. <copyright>'.DC_LICENCE.'</copyright>
  665. <pubDate>'.date('r', gmstrftime(time())) .'</pubDate>
  666. <lastBuildDate>'.date('r', gmstrftime(time())) .'</lastBuildDate>
  667. <generator>'.DC_TITLE.' '.DC_VERSION.' '.DC_NAME.'</generator>';
  668. }
  669. function rssItem($title,$link,$date,$content,$action,$user,$image){
  670. return '<item>
  671. <title><![CDATA['.html_entity_decode($title,ENT_QUOTES,'UTF-8').']]></title>
  672. <link>'.$link.'</link>
  673. <guid isPermaLink="true">'.$link.'</guid>
  674. <media:hash algo="sha-1">'.sha1($date.$user.$action).'</media:hash>
  675. <media:thumbnail time="'.$date.'" url="'.$image.'"/>
  676. <description>
  677. <![CDATA[
  678. '.$content.'
  679. ]]>
  680. </description>
  681. <category>'.$action.'</category>
  682. <dc:creator>'.$user.'</dc:creator>
  683. </item>';
  684. }
  685. function rssFooter(){
  686. return '</channel></rss>';
  687. }
  688. function unicode2utf8($string){
  689. return html_entity_decode(preg_replace("/U\+([0-9A-F]{4})/", "&#x\\1;", $string), ENT_NOQUOTES, 'UTF-8');
  690. }
  691. ?>