PageRenderTime 167ms CodeModel.GetById 38ms RepoModel.GetById 2ms app.codeStats 0ms

/q_register.php

https://bitbucket.org/gregorytoullie/php-q-source-snircd
PHP | 670 lines | 632 code | 0 blank | 38 comment | 90 complexity | 4b535082d92d48e79929b11ade158f9f MD5 | raw file
  1. <?php
  2. /*
  3. Classe Register
  4. Enregistrement des utilisateurs et salons
  5. */
  6. class QRegister {
  7. private static $_instance;
  8. public static function getInstance(){
  9. if(!isset(self::$_instance)) self::$_instance = new self;
  10. return self::$_instance;
  11. }
  12. function __construct(){
  13. echo __CLASS__,": crיation de l'instance\n";
  14. self::load();
  15. }
  16. function __destruct(){ echo __CLASS__,": destruction de l'instance\n"; }
  17. function __clone(){trigger_error("Le clפnage n'est pas autorisי.",E_USER_ERROR);}
  18. private static $channels = array();
  19. private static $accounts = array();
  20. private static $queue = array();
  21. private static $glines = array();
  22. public static $last_ticket = 2;
  23. ###########################################
  24. ## Fonctions d'enregistrement des canaux ##
  25. ###########################################
  26. # Ex: addreg("#crap","dumbass","lameoper","classic",null)
  27. public static function addreg($name,$founder,$oper,$chantype=null,$chanflags=null){
  28. if(!array_key_exists(strtolower($name),self::$channels)){
  29. $chars = QChars::getInstance();
  30. if($chanflags==null){$chanflags=$chars->chanflags_encode("agj");}else{$chanflags=$chars->chanflags_encode($chanflags);}
  31. if($chantype==null){$chantype = "classic";}
  32. $chanlev = (int)$chars->chanlev_encode('amnotvfxs');
  33. $chanmode = (int)$chars->chanmode_encode('ntCNu');
  34. $id = (count(self::$channels)+1);
  35. self::$channels[strtolower($name)] = array(
  36. 'id' => $id,
  37. 'name' => $name,# Nom du salon sans rיduction de casse
  38. 'created' => time(),
  39. 'founder' => $founder,# Compte du Fondateur
  40. 'adder' => $oper,# Compte de l'opיrateur ayant crיי le salon
  41. 'chantype' => $chantype,# Par dיfaut: classic
  42. 'chanmode' => $chanmode,# Par dיfaut: +ntCN
  43. 'chanflags' => $chanflags,# Par dיfaut: +j
  44. 'chanlev' => array(strtolower($founder) => $chanlev),# Le chanlev est conservי dans le canal, si ce dernier est dיtruit, tous les niveaux d'accטs seront perdus
  45. 'welcome' => (string)null,# Le message de bienvenue
  46. 'topic' => (string)null,# Le sujet du canal
  47. );
  48. }
  49. }
  50. public static function delreg($name){
  51. if(array_key_exists(strtolower($name),self::$channels)){
  52. unset(self::$channels[strtolower($name)]);
  53. echo __FUNCTION__,": le salon $name a יtי supprimי\n";
  54. } else { echo __FUNCTION__,": le salon $name ne peut ךtre supprimי car il n'existe pas\n"; }
  55. }
  56. public static function getreg($name,$field){
  57. if(array_key_exists(strtolower($name),self::$channels)){
  58. if(array_key_exists(strtolower($field),self::$channels[strtolower($name)])){ return self::$channels[strtolower($name)][strtolower($field)]; }
  59. }
  60. return false;
  61. }
  62. public static function updatereg($name,$field,$value){
  63. if(array_key_exists(strtolower($name),self::$channels)){
  64. self::$channels[strtolower($name)][$field] = $value;
  65. if(array_key_exists($field,self::$channels[strtolower($name)])){echo __FUNCTION__,": mise א jour du champ $field du canal $name א la valeur $value\n";}
  66. else{echo __FUNCTION__,": inscription du champ $field du canal $name א la valeur $value\n";}
  67. }
  68. }
  69. public static function isreg($name){
  70. if(array_key_exists(strtolower($name),self::$channels)){return (int)1;}
  71. else {return (int)0;}
  72. }
  73. public static function getregs(){
  74. $return = array();
  75. foreach(self::$channels AS $name => $params){$return[$params['name']]=$params;}
  76. return($return);
  77. }
  78. public static function isvoice($name,$account){return self::getchanlev($name,$account,'v');}
  79. public static function isop($name,$account){return self::getchanlev($name,$account,'o');}
  80. public static function ismaster($name,$account){return self::getchanlev($name,$account,'m');}
  81. public static function isowner($name,$account){return self::getchanlev($name,$account,'n');}
  82. public static function issupervw($name,$account){return self::getchanlev($name,$account,'x');}
  83. public static function isfounder($name,$account){return self::getchanlev($name,$account,'f');}
  84. #################################################
  85. ####### Fonctions des chanlevs/chanflags ########
  86. #################################################
  87. # $params[in] name Nom du canal
  88. # $params[in] account Compte du client
  89. public static function ischanlev($name,$account){
  90. if(array_key_exists(strtolower($name),self::$channels)){
  91. if(array_key_exists(strtolower($account),self::$channels[strtolower($name)]['chanlev'])){return (int)1;}
  92. else {return (int)0;}
  93. }
  94. }
  95. # $params[in] name Nom du canal
  96. # $params[in] account Compte du client
  97. # $params[in] flag L'attribut א vיrifier
  98. public static function getchanlev($name,$account,$flag){# Fonction qui retourne les flags associיs א un compte salon
  99. if(array_key_exists(strtolower($account),self::$channels[strtolower($name)]['chanlev'])){
  100. $chars = QChars::getInstance();
  101. $hflag = $chars->chanlev_encode($flag);
  102. if($hflag & self::$channels[strtolower($name)]['chanlev'][strtolower($account)]) return (int)1;
  103. else return (int)0;
  104. }
  105. return false;
  106. }
  107. public static function ischanflag($name,$flag){# Fonction qui vיrifie l'existence d'un chanflag
  108. if(array_key_exists('chanflags',self::$channels[strtolower($name)])){
  109. $chars = QChars::getInstance();
  110. $hflag = $chars->chanflags_encode($flag);
  111. if($hflag & self::$channels[strtolower($name)]['chanflags']) return (int)1;
  112. else return (int)0;
  113. }
  114. trigger_error(__CLASS__.": Le canal ne contient aucun chanflag",E_USER_WARNING);
  115. }
  116. #################################################
  117. ####### Fonctions des comptes sur salons ########
  118. #################################################
  119. public static function getRegaccount($name,$account){
  120. if(array_key_exists(strtolower($name),self::$channels)){
  121. if(array_key_exists(strtolower($account),self::$channels[strtolower($name)]['chanlev'])){
  122. $chars = QChars::getInstance();
  123. return $chars->chanlev_decode(self::$channels[strtolower($name)]['chanlev'][strtolower($account)]);
  124. }
  125. }
  126. return false;
  127. }
  128. #################################################
  129. ## Fonctions d'enregistrement des utilisateurs ##
  130. #################################################
  131. public static function addaccount($account,$email,$level = 1){
  132. if(!array_key_exists(strtolower($account),self::$accounts)){
  133. $id = (count(self::$accounts)+1);
  134. if($level>1000) $level = (int)1000;
  135. if(!is_numeric($level)) $level = 1;
  136. self::$accounts[strtolower($account)] = array(
  137. 'name' => $account,# Nom du compte sans rיduction de casse
  138. 'id' => $id,# Incrיmentי automatiquement א chaque nouvel utilisateur
  139. 'created' => time(),# Date de crיation du compte
  140. 'level' => (int)$level,# Obligatoire, par dיfaut le niveau est 1 ( utilisateur enregistrי )
  141. 'clients' => array(),# Ceci est la partie 'numיrics' des utilisateurs utilisant le compte ( max 3 )
  142. 'email' => (string)$email,# Obligatoire, sinon la requטte d'inscription n'est pas valable
  143. 'password' => (string)null,# Mot-de-passe, tant qu'il n'est pas choisi le compte n'est pas activי
  144. 'userflags' => 0x1,# Par dיfaut, reחoit des notices
  145. 'noexpires' => (bool)0,# Rיservי aux opיrateurs et administrateurs
  146. 'lastconnect' => time(),# Date de la derniטre connexion
  147. 'greeting' => (string)'',# Le message d'accueil א afficher lors de l'entrיe de l'utilisateur
  148. 'vhost' => (string)'',# Hפte virtuel ( rיservי au staff rיseau, optionnel )
  149. );
  150. }
  151. else echo __CLASS__.": le compte $account existe dיjא\n";
  152. }
  153. public static function delaccount($account){
  154. if(array_key_exists(strtolower($account),self::$accounts)){
  155. unset(self::$accounts[strtolower($account)]);
  156. echo __CLASS__.": compte $account supprimי\n";
  157. }else{echo __CLASS__.": le compte $account n'existe pas\n";}
  158. }
  159. public static function getaccount($account,$field){
  160. if(array_key_exists(strtolower($account),self::$accounts)){
  161. if(array_key_exists(strtolower($field),self::$accounts[strtolower($account)])){
  162. if(isset(self::$accounts[strtolower($account)][strtolower($field)])){return self::$accounts[strtolower($account)][strtolower($field)];}
  163. }else echo __CLASS__.": le champ $field n'existe pas dans le compte $account\n";
  164. }else echo __CLASS__.": le compte $account n'existe pas\n";
  165. return false;
  166. }
  167. public static function updateaccount($account,$field,$value){
  168. if(array_key_exists(strtolower($account),self::$accounts)){
  169. self::$accounts[strtolower($account)][strtolower($field)] = $value;
  170. if(array_key_exists(strtolower($field),self::$accounts[strtolower($account)])){echo __CLASS__.": mise א jour du champ $field du compte $account א la valeur $value\n";
  171. }else{echo __CLASS__.": crיation de la clef $field du compte $account א la valeur $value\n";
  172. }
  173. }else{echo __CLASS__.": le compte $account n'existe pas\n";
  174. }
  175. }
  176. public static function isaccount($account){
  177. if(array_key_exists(strtolower($account),self::$accounts)){return (int)1;}else{return (int)0;}
  178. }
  179. #############################################
  180. #### Fonctions des utilisateurs de compte ###
  181. #############################################
  182. public static function addAccountclient($account,$client){
  183. if(array_key_exists(strtolower($account),self::$accounts)){
  184. if(!array_key_exists('clients',self::$accounts[strtolower($account)])){ self::$accounts[strtolower($account)]['clients'] = array(); }
  185. if(!in_array($client,self::$accounts[strtolower($account)]['clients'])){
  186. self::$accounts[strtolower($account)]['clients'][] = $client;
  187. echo __CLASS__.": client $client ajoutי au compte $account\n";
  188. } else echo __CLASS__.": le client $client ne peut ךtre ajoutי au compte $account\n";
  189. } else echo __CLASS__.": le compte $account n'existe pas\n";
  190. }
  191. public static function delAccountclient($account,$client){
  192. if(array_key_exists(strtolower($account),self::$accounts)){
  193. if(!array_key_exists('clients',self::$accounts[strtolower($account)])){ self::$accounts[strtolower($account)]['clients'] = array(); }
  194. if(in_array($client,self::$accounts[strtolower($account)]['clients'])){
  195. unset(self::$accounts[strtolower($account)]['clients'][$client]);
  196. echo __CLASS__.": client $client retirי du compte $account\n";
  197. } else echo __CLASS__.": le client $client ne peut ךtre retirי du compte $account\n";
  198. } else echo __CLASS__.": le compte $account n'existe pas\n";
  199. }
  200. public static function isAccountclient($account,$client){
  201. if(array_key_exists(strtolower($account),self::$accounts)){
  202. if(in_array($client,self::$accounts[strtolower($account)]['clients'])) return (int)1;
  203. else return (int)0;
  204. } else echo __CLASS__.": le compte $account n'existe pas\n";
  205. }
  206. public static function getAccountclients($account){
  207. if(array_key_exists(strtolower($account),self::$accounts)){
  208. if(!array_key_exists('clients',self::$accounts[strtolower($account)])) self::$accounts[strtolower($account)]['clients'] = array();
  209. if(count(self::$accounts[strtolower($account)]['clients'])>0) return self::$accounts[strtolower($account)]['clients'];
  210. } else echo __CLASS__.": le compte $account n'existe pas\n";
  211. return false;
  212. }
  213. # Permet de retrouver le compte client א partir d'un numיrique
  214. public static function getClientaccount($client){
  215. foreach(self::$accounts AS $account => $params){
  216. if(array_key_exists('clients',$params)){
  217. if(in_array($client,$params['clients'])) return $account;
  218. }
  219. }
  220. return false;
  221. }
  222. ######################################################
  223. ## Fonctions sur les comptes en attente de crיation ##
  224. ######################################################
  225. public static function addqueued($account,$email){
  226. if(!array_key_exists(strtolower($account),self::$queue)){
  227. $id = (count(self::$queue)+1);
  228. $key = substr(str_shuffle(str_repeat("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\\\]\[\}\{\`",10)),0,10);
  229. self::$queue[strtolower($account)] = array(
  230. 'id' => (int)$id,
  231. 'name' => (string)$account,
  232. 'created' => time(),
  233. 'email' => (string)$email,
  234. 'key' => $key,
  235. 'try' => (int)3
  236. );
  237. var_dump(self::$queue[strtolower($account)]);
  238. echo __CLASS__.": le compte $account ( $email ) a יtי mis en instance, clef: $key\n";
  239. } else { echo __CLASS__.": impossible de mettre le compte $account en instance car il existe dיjא\n"; }
  240. }
  241. public static function delqueued($account){
  242. if(array_key_exists(strtolower($account),self::$queue)){
  243. unset(self::$queue[strtolower($account)]);
  244. echo __CLASS__.": le compte $account a יtי retirי d'instance\n";
  245. } else { echo __CLASS__.": impossible de retirer le compte $account d'instance car il n'existe pas\n"; }
  246. }
  247. public static function isqueued($account){
  248. if(array_key_exists(strtolower($account),self::$queue)){ return (int)1; }
  249. else { return (int)0; }
  250. }
  251. public static function getqueued($account,$field){
  252. if(array_key_exists(strtolower($account),self::$queue)){
  253. if(array_key_exists(strtolower($field),self::$queue[strtolower($account)])){ return self::$queue[strtolower($account)][strtolower($field)]; }
  254. }
  255. return false;
  256. }
  257. ##############################
  258. ## Fonctions sur les glines ##
  259. ##############################
  260. public static function addGline($mask,$expiration,$raison){
  261. if(!array_key_exists(base64_encode($mask),self::$glines)){
  262. self::$glines[base64_encode($mask)] = array(
  263. 'id' => (int)(count(self::$glines)+1),
  264. 'mask' => (string)$mask,
  265. 'expiration' => (int)$expiration,
  266. 'reason' => (string)$reason
  267. );
  268. echo __CLASS__.": Gline $mask ( expiration le $expiration ) au motif de $raison, ajoutיe\n";
  269. }
  270. }
  271. ####################################################
  272. ############### Parser chanlevs ####################
  273. ####################################################
  274. public static function parsechanlev($name,$account,$string){
  275. $allowed_flags = array('a','b','d','g','j','k','m','n','o','s','t','v','w','x');
  276. $chars = QChars::getInstance();
  277. $tokens = str_split(strtolower($string),1);
  278. $add = array(); $del = array(); $t = null;
  279. foreach($tokens AS $token){
  280. switch($token){
  281. case "+":$t="+";break;
  282. case "-":$t="-";break;
  283. default:
  284. if($t=="+"){$add[]=$token;}
  285. else {$del[]=$token;}
  286. break;
  287. }
  288. }
  289. if(count($del)>0){
  290. if(self::ischanlev($name,$account)){
  291. $cur = self::$channels[strtolower($name)]['chanlev'][strtolower($account)];
  292. $current = str_split($chars->chanlev_decode($cur));
  293. foreach($del AS $token){
  294. if(in_array($token,$current)&&in_array($token,$allowed_flags)){unset($current[array_search($token,$current)]);}
  295. }
  296. $current = implode($current);
  297. echo __CLASS__.": nouveau chanlev pour le compte $account sur $name: $current\n";
  298. self::$channels[strtolower($name)]['chanlev'][strtolower($account)] = $chars->chanlev_encode($current);
  299. } else { echo __CLASS__.": il est impossible de retirer des flags d'un compte non ajoutי au CHANLEV\n"; }
  300. } else { echo __CLASS__.": aucun flag n'a יtי retirי du compte $account sur $name\n"; }
  301. if(count($add)>0){
  302. if(array_key_exists(strtolower($account),self::$channels[strtolower($name)]['chanlev'])){
  303. $cur = self::$channels[strtolower($name)]['chanlev'][strtolower($account)];
  304. $current = str_split($chars->chanlev_decode($cur));
  305. }else{$current=array();$current[strtolower($account)]=null;}# Ici nous autorisons le tableau vide car le chanlev peut ךtre crיי
  306. foreach($add AS $token){
  307. if(!in_array($token,$current)&&in_array($token,$allowed_flags)){$current[]=$token;}
  308. }
  309. $current = implode($current);
  310. self::$channels[strtolower($name)]['chanlev'][strtolower($account)] = $chars->chanlev_encode($current);
  311. } else { echo __CLASS__.": aucun flag n'a יtי ajoutי du compte $account sur $name\n"; }
  312. }
  313. ## Chanflags Parser
  314. public static function parseChanflags($name,$string){
  315. $allowed_flags = array('a','b','c','d','e','f','g','h','i','k','m','o','p','q','r','s','t','v','w','x');# Le chanflag 'j' ne peut ךtre modifiי
  316. $chars = QChars::getInstance();
  317. $tokens = str_split(strtolower($string),1);
  318. $add = array(); $del = array(); $t = null;
  319. foreach($tokens AS $token){
  320. switch($token){
  321. case "+":$t="+";break;
  322. case "-":$t="-";break;
  323. default:
  324. if($t=="+"){$add[]=$token;}
  325. else {$del[]=$token;}
  326. break;
  327. }
  328. }
  329. if(count($del)>0){
  330. $cur = self::$channels[strtolower($name)]['chanflags'];
  331. $currar = str_split($chars->chanflags_decode($cur),1);
  332. $remove = array();
  333. foreach($del AS $token){
  334. if(in_array($token,$currar)&&in_array($token,$allowed_flags)){ $remove[]=$token; }
  335. }
  336. $current = implode(array_diff($currar,$remove));
  337. echo __CLASS__.": nouveaux chanflags pour le canal $name: $current\n";
  338. self::updatereg($name,"chanflags",$chars->chanflags_encode($current));
  339. } else { echo __CLASS__.": aucun chanflag א retirer pour le canal $name\n"; }
  340. if(count($add)>0){
  341. $cur = self::$channels[strtolower($name)]['chanflags'];
  342. $currar = str_split($chars->chanflags_decode($cur),1);
  343. foreach($add AS $token){
  344. if(!in_array($token,$currar)&&in_array($token,$allowed_flags)){ $currar[]=$token; }
  345. }
  346. $current = implode($currar);
  347. self::updatereg($name,"chanflags",$chars->chanflags_encode($current));
  348. }
  349. }
  350. ## Chanmode parser
  351. # Les paramטtres +l/k/A/U ne sont pas inclus dans CHANMODE
  352. # Ils sont disponibles dans APASS UPASS KEY LIMIT
  353. public static function parseChmodes($name,$string){
  354. $noargs=str_split('imnpstrDdRucCNMTovb');# Nous crייons notre tableau de modes sans arguments et ajoutons ovb ( car non pris en charge par cette fonction )
  355. $chars = QChars::getInstance();
  356. $array = explode(' ',$string);
  357. $tokens = str_split($array[0],1);# Sensible א la casse, on ne la rיduit pas
  358. $add=array();$del=array();
  359. $addTargets=null;$delTargets=null;$ti=1;
  360. foreach($tokens AS $token){
  361. switch($token){
  362. case "+":$t="+";break;
  363. case "-":$t="-";break;
  364. default:
  365. if($t=="+"){
  366. if(preg_match('#[kl]+#',$token)) $addTargets[]=$array[$ti];$ti++;
  367. $add[]=$token;
  368. }
  369. else {
  370. if(preg_match('#[k]+#',$token)) $delTargets[]=$array[$ti];$ti++;
  371. $del[]=$token;
  372. }
  373. break;
  374. }
  375. }
  376. if(count($del)>0){
  377. $cur = $chars->chanmode_decode(self::$channels[strtolower($name)]['chanmode']);
  378. $current = str_split($cur,1);# Crיe le tableau de modes
  379. if(array_key_exists('key',self::$channels[strtolower($name)])) $key = (string)self::$channels[strtolower($name)]['key'];
  380. if(array_key_exists('limit',self::$channels[strtolower($name)])) $limit = (int)self::$channels[strtolower($name)]['limit'];
  381. foreach($del AS $token){
  382. if(in_array($token,$current)){# Ne supprime pas les modes inexistants
  383. switch($token){
  384. case 'k':self::updatereg($name,'key',null);break;# Dיsinstalle la clef du tableau salon
  385. case 'l':self::updatereg($name,'limit',null);break;# Dיsinstalle la limite du tableau salon
  386. case 'U':self::updatereg($name,'upass',null);break;
  387. case 'A':self::updatereg($name,'apass',null);break;
  388. }
  389. unset($current[array_search($token,$current)]);
  390. }
  391. }
  392. if(count($current)>0){
  393. self::updatereg($name,'chanmode',$chars->chanmode_encode(implode($current)));
  394. echo __CLASS__.": nouveau chanmode pour le canal $name:\n";print_r($current);
  395. } else { self::updatereg($name,'chanmode',null); }
  396. }
  397. if(count($add)>0){
  398. $args=array_diff($noargs,$add);print_r($args);
  399. $cur = $chars->chanmode_decode(self::$channels[strtolower($name)]['chanmode']);
  400. $current = str_split($cur);
  401. foreach($add AS $token){
  402. if(!in_array($token,$current)){
  403. if(in_array($token,$args)){
  404. $argpos=array_search($token,$args);
  405. switch($token){
  406. case 'l':$r->updatereg($name,'limit',$addTargets[$argpos]);break;
  407. case 'k':$r->updatereg($name,'key',$addTargets[$argpos]);break;
  408. case 'U':$r->updatereg($name,'upass',$addTargets[$argpos]);break;
  409. case 'A':$r->updatereg($name,'apass',$addTargets[$argpos]);break;
  410. }
  411. }
  412. $current[]=$token;
  413. }else{echo __CLASS__.": mode non ajoutי $token car existant.\n";}
  414. }
  415. self::updatereg($name,"chanmode",$chars->chanmode_encode(implode($current)));
  416. }else{echo __CLASS__.": Aucun mode ajoutי\n";}
  417. }
  418. #############################################
  419. ##### Fonctions de chargement/sauvegarde ####
  420. #############################################
  421. public static function save(){
  422. $link = mysql_connect(MYSQL_HOSTNAME,MYSQL_USERNAME,MYSQL_PASSWORD) or trigger_error("Sauvegarde impossible: ".mysql_error(),E_USER_ERROR);
  423. if($link){
  424. @mysql_query("USE q",$link);
  425. # Ici nous supprimons les salons orphelins de mysql
  426. $results = mysql_query("SELECT * FROM `channels`",$link);
  427. if(count(self::$channels)>0 && mysql_num_rows($results)!=0){
  428. while($table = mysql_fetch_assoc($results)){
  429. if(!array_key_exists(strtolower($table['name']),self::$channels)){
  430. mysql_query(sprintf("DELETE FROM channels WHERE `name`='%s';",$table['name']),$link);
  431. echo __CLASS__.": canal orphelin ".$table['name']." supprimי de mysql\n";
  432. }
  433. }
  434. }
  435. # Injection
  436. foreach(self::$channels AS $name => $values){
  437. $name = mysql_real_escape_string($name);
  438. $results = mysql_query(sprintf("SELECT * FROM `channels` WHERE name='%s'",$name),$link);
  439. if(mysql_num_rows($results)==0){
  440. # injection des nouveaux canaux
  441. mysql_query(sprintf("INSERT INTO `channels` (`id`,`name`,`created`,`founder`,`adder`,`chantype`,`chanmode`,`chanflags`,`chanlev`,`welcome`,`topic`) VALUES ('%d','%s','%d','%s','%s','%s','%d','%d','%s','%s','%s')",
  442. $values['id'],
  443. mysql_real_escape_string($values['name']),$values['created'],
  444. mysql_real_escape_string($values['founder']),
  445. mysql_real_escape_string($values['adder']),$values['chantype'],
  446. mysql_real_escape_string($values['chanmode']),$values['chanflags'],
  447. mysql_real_escape_string(json_encode($values['chanlev'])),
  448. mysql_real_escape_string($values['welcome']),
  449. mysql_real_escape_string($values['topic']))
  450. ,$link);
  451. }else{
  452. $last = mysql_fetch_assoc($results);
  453. if($values['topic']!==$last['topic']){mysql_query(sprintf("UPDATE `channels` SET `topic`='%s' WHERE `name`='%s'",mysql_real_escape_string($values["topic"]),$name),$link);}
  454. if($values['welcome']!==$last['welcome']){mysql_query(sprintf("UPDATE `channels` SET `welcome`='%s' WHERE `name`='%s'",mysql_real_escape_string($values["welcome"]),$name),$link);}
  455. if($values['chanmode']!==$last['chanmode']){mysql_query(sprintf("UPDATE `channels` SET `chanmode`='%s' WHERE `name`='%s'",$values["chanmode"],$name),$link);}
  456. if($values['chanflags']!==$last['chanflags']){mysql_query(sprintf("UPDATE `channels` SET `chanflags`='%d' WHERE `name`='%s'",$values["chanflags"],$name),$link);}
  457. if($values['chanlev']!==$last['chanlev']){mysql_query(sprintf("UPDATE `channels` SET `chanlev`='%s' WHERE `name`='%s'",json_encode($values["chanlev"]),$name),$link);}
  458. }
  459. if(mysql_error()){echo __CLASS__.": Erreur MySQL: ".mysql_error()."\n";}
  460. }
  461. # Ici nous supprimons les comptes orphelins de mysql
  462. $results = mysql_query("SELECT * FROM accounts",$link);
  463. if(count(self::$accounts)>0 && mysql_num_rows($results)!=0){
  464. while($table = mysql_fetch_assoc($results)){
  465. if(!array_key_exists(strtolower($table['name']),self::$accounts)){
  466. mysql_query(sprintf("DELETE FROM `accounts` WHERE `name`='%s';",$table['name']),$link);
  467. echo __CLASS__.": entrיe orpheline ".$table['name']." retirיe de la table ACCOUNTS\n";
  468. }
  469. }
  470. }
  471. # Injection
  472. foreach(self::$accounts AS $account => $values){
  473. $account = mysql_real_escape_string($account);
  474. $results = mysql_query(sprintf("SELECT * FROM accounts WHERE name='%s'",$account),$link);
  475. if(mysql_num_rows($results)==0){
  476. # injection des nouveaux comptes
  477. mysql_query(sprintf("INSERT INTO `accounts` (`id`,`name`,`created`,`level`,`email`,`password`,`userflags`,`noexpires`,`lastconnect`,`greeting`,`vhost`) VALUES ('%d','%s','%d','%d','%s','%s','%d','%d','%d','%s','%s')",
  478. $values['id'],
  479. mysql_real_escape_string($values['name']),$values['created'],$values['level'],
  480. mysql_real_escape_string($values['email']),
  481. mysql_real_escape_string($values['password']),$values['userflags'],$values['noexpires'],$values['lastconnect'],
  482. mysql_real_escape_string($values['greeting']),$values['vhost'])
  483. ,$link);
  484. }else{
  485. $last = mysql_fetch_assoc($results);
  486. if($values['password']!==$last['password']){mysql_query(sprintf("UPDATE `accounts` SET `password`='%d' WHERE `name`='%s'",mysql_real_escape_string($values["password"]),$account));}
  487. if($values['userflags']!==$last['userflags']){mysql_query(sprintf("UPDATE `accounts` SET `userflags`='%d' WHERE `name`='%s'",$values["userflags"],$account));}
  488. if($values['noexpires']!==$last['noexpires']){mysql_query(sprintf("UPDATE `accounts` SET `noexpires`='%d' WHERE `name`='%s'",$values["noexpires"],$account));}
  489. if($values['greeting']!==$last['greeting']){mysql_query(sprintf("UPDATE `accounts` SET `greeting`='%s' WHERE `name`='%s'",mysql_real_escape_string($values["greeting"]),$account));}
  490. if($values['vhost']!==$last['vhost']){mysql_query(sprintf("UPDATE `accounts` SET `vhost`='%s' WHERE `name`='%s'",mysql_real_escape_string($values["vhost"]),$account));}
  491. }
  492. }
  493. # Ici nous supprimons les entrיes d'instance orphelines
  494. $results = mysql_query("SELECT * FROM `queue`",$link);
  495. if(mysql_num_rows($results)!=0){
  496. while($table = mysql_fetch_assoc($results)){
  497. if(!array_key_exists(strtolower($table['name']),self::$queue)){mysql_query(sprintf("DELETE FROM `queue` WHERE `name`='%s';",$table['name']),$link);echo __CLASS__.": instance orpheline ".$table['name']." supprimיe de la table QUEUE\n";}
  498. }
  499. }else{echo __CLASS__.": Aucune entrיe orpheline retirיe de la table QUEUE\n";}
  500. # Injection
  501. if(count(self::$queue)>0){ # C'est utile car les instances peuvent ךtre vides ( y'a pas יcrit La Poste ! )
  502. foreach(self::$queue AS $instance => $values){
  503. $instance = mysql_real_escape_string($instance);
  504. $results = mysql_query(sprintf("SELECT * FROM queue WHERE name='%s'",$instance),$link);
  505. if(mysql_num_rows($results)==0){mysql_query(sprintf("INSERT INTO `queue` (`id`,`name`,`created`,`email`,`key`,`try`) VALUES ('%d','%s','%d','%s','%s','%d')",
  506. $values['id'],mysql_real_escape_string($values['name']),$values['created'],mysql_real_escape_string($values['email']),mysql_real_escape_string($values['key']),$values['try']),$link);
  507. }else{
  508. $last = mysql_fetch_assoc($results);
  509. if($values['try']!==$last['try']){mysql_query(sprintf("UPDATE `queue` SET `try`='%d' WHERE `name`='%s'",$values['try'],$instance));}
  510. }
  511. }
  512. }
  513. # ici nous supprimons les entrיes de glines orphelines
  514. if(count(self::$glines)>0){
  515. $results = mysql_query('SELECT * FROM `glines`',$link);
  516. if(mysql_num_rows($results)>0){
  517. while($table = mysql_fetch_assoc($results)){
  518. if(!array_key_exists(base64_decode($table['mask']),self::$glines)){mysql_query(sprintf('DELETE FROM `glines` WHERE `mask`=\'%s\';',mysql_real_escape_string($table['mask'])),$link);echo __CLASS__.": entrיe orpheline ".$table['mask']." retirיe de la table GLINES\n";}
  519. }
  520. }else{echo __CLASS__.": Aucune entrיe orpheline retirיe de la table GLINES\n";}
  521. }
  522. if(mysql_error()){trigger_error(__CLASS__.": erreur mysql ".mysql_error(),E_WARNING);
  523. }else{echo __CLASS__." Sauvegarde terminיe\n";}
  524. mysql_close($link);
  525. }
  526. }
  527. public static function load(){
  528. $link = mysql_connect(MYSQL_HOSTNAME,MYSQL_USERNAME,MYSQL_PASSWORD) or trigger_error("Chargement impossible: ".mysql_error(),E_USER_ERROR);
  529. if($link){
  530. @mysql_query("CREATE DATABASE IF NOT EXISTS q",$link);# Peut retourner FALSE, on s'en fiche c'est une routine anti-erreurs
  531. @mysql_query("USE q",$link);
  532. //@mysql_query("DROP TABLE `channels`",$link);// a commenter aprטs les tests
  533. @mysql_query("CREATE TABLE IF NOT EXISTS `channels` (
  534. `id` INT(5) ZEROFILL,
  535. `name` TEXT(200) NOT NULL,
  536. `created` INT(10) ZEROFILL DEFAULT '0946753235',
  537. `founder` TEXT(16) NOT NULL,
  538. `adder` TEXT(16),
  539. `chantype` TINYTEXT DEFAULT NULL,
  540. `chanmode` INT(6) DEFAULT '69641',
  541. `chanflags` INT(6) DEFAULT '12084',
  542. `chanlev` LONGTEXT DEFAULT NULL,
  543. `welcome` TEXT(512) DEFAULT NULL,
  544. `topic` TEXT(250) DEFAULT NULL,
  545. `limit` INT(5) DEFAULT NULL,
  546. `key` TEXT(23) DEFAULT NULL,
  547. `apass` TEXT(23) DEFAULT NULL,
  548. `upass` TEXT(23) DEFAULT NULL,
  549. PRIMARY KEY (`id`)
  550. )",$link);
  551. @mysql_query("CREATE TABLE IF NOT EXISTS `accounts` (
  552. `id` INT(5) ZEROFILL,
  553. `name` TEXT(16) NOT NULL,
  554. `created` INT(10) ZEROFILL DEFAULT '0946753235',
  555. `level` INT(4) ZEROFILL,
  556. `email` TEXT(256) NOT NULL,
  557. `password` TEXT(10),
  558. `userflags` BINARY(4),
  559. `noexpires` BOOL DEFAULT 0,
  560. `lastconnect` INT(10) ZEROFILL DEFAULT '0',
  561. `greeting` TEXT(100) DEFAULT NULL,
  562. `vhost` TEXT(128) DEFAULT NULL,
  563. PRIMARY KEY (`id`)
  564. )",$link);
  565. @mysql_query("CREATE TABLE IF NOT EXISTS `queue` (
  566. `id` INT(5) ZEROFILL,
  567. `name` TEXT(16) NOT NULL,
  568. `created` INT(10) ZEROFILL,
  569. `email` TEXT(128) NOT NULL,
  570. `key` TEXT(10) NOT NULL,
  571. `try` INT(1) DEFAULT NULL,
  572. PRIMARY KEY (`id`)
  573. )",$link);
  574. @mysql_query("CREATE TABLE IF NOT EXISTS `glines` (
  575. `id` INT(5) ZEROFILL,
  576. `mask` TEXT(256) NOT NULL,
  577. `expiration` INT(10) ZEROFILL,
  578. `reason` TEXT(256) NOT NULL,
  579. PRIMARY KEY (`id`)
  580. )",$link);
  581. @mysql_query("CREATE TABLE IF NOT EXISTS `memos` (
  582. `id` INT(5) ZEROFILL,
  583. `message` TEXT(256) NOT NULL,
  584. `from` TEXT(16) NOT NULL,
  585. `to` TEXT(16) NOT NULL,
  586. PRIMARY KEY (`id`)
  587. )",$link);
  588. # Rיcupיration des donnיes enregistrיes
  589. $results = mysql_query("SELECT * FROM `channels`",$link);
  590. if(mysql_num_rows($results)>0){
  591. while($table = mysql_fetch_assoc($results)){
  592. self::$channels[strtolower($table['name'])] = array(
  593. 'id' => (int)$table['id'],
  594. 'name' => (string)$table['name'],
  595. 'created' => (int)$table['created'],
  596. 'founder' => (string)$table['founder'],
  597. 'adder' => (string)$table['adder'],
  598. 'chantype' => $table['chantype'],
  599. 'chanmode' => (int)$table['chanmode'],
  600. 'chanflags' => (int)$table['chanflags'],
  601. 'chanlev' => json_decode($table['chanlev'],true),
  602. 'welcome' => (string)$table['welcome'],
  603. 'topic' => (string)$table['topic'],
  604. 'limit' => (int)$table['limit'],
  605. 'key' => (string)$table['key'],
  606. 'apass' => (string)$table['apass'],
  607. 'upass' => (string)$table['upass']
  608. );
  609. }
  610. }
  611. // id name created level email password userflags noexpires lastconnect greeting vhost
  612. $results = mysql_query("SELECT * FROM `accounts`",$link);
  613. if(mysql_num_rows($results)>0){
  614. while($table = mysql_fetch_assoc($results)){
  615. self::$accounts[strtolower($table['name'])] = array(
  616. 'id' => $table['id'],
  617. 'name' => $table['name'],
  618. 'created' => $table['created'],
  619. 'level' => $table['level'],
  620. 'email' => $table['email'],
  621. 'password' => $table['password'],
  622. 'userflags' => $table['userflags'],
  623. 'noexpires' => (bool)$table['noexpires'],
  624. 'lastconnect' => $table['lastconnect'],
  625. 'greeting' => $table['greeting'],
  626. 'vhost' => $table['vhost']
  627. );
  628. }
  629. }
  630. $results = mysql_query("SELECT * FROM `queue`",$link);
  631. if(mysql_num_rows($results)>0){
  632. while($table = mysql_fetch_assoc($results)){
  633. self::$queue[strtolower($table['name'])] = array(
  634. 'id' => (int)$table['id'],
  635. 'name' => (string)$table['name'],
  636. 'created' => (int)$table['created'],
  637. 'email' => (string)$table['email'],
  638. 'key' => (string)$table['key'],
  639. 'try' => (int)$table['try']
  640. );
  641. }
  642. }
  643. $results = mysql_query("SELECT * FROM `glines`",$link);
  644. if(mysql_num_rows($results)>0){
  645. while($table = mysql_fetch_assoc($results)){
  646. self::$glines[$table['id']] = array(
  647. 'id' => (int)$table['id'],
  648. 'mask' => (string)$table['mask'],
  649. 'expiration' => (int)$table['expiration'],
  650. 'reason' => (string)$table['reason']
  651. );
  652. }
  653. }
  654. $results = mysql_query('SELECT * FROM `memos`',$link);
  655. if(mysql_num_rows($results)>0){
  656. while($table = mysql_fetch_assoc($results)){
  657. self::$memos[strtolower($table['from'])]=array(
  658. 'id' => (int)$table['id'],
  659. 'message' => (string)$table['message'],
  660. 'from' => (string)$table['from'],
  661. 'to' => (string)$table['to']
  662. );
  663. }
  664. }
  665. echo "Chargement des donnיes terminי\n";
  666. mysql_close($link);
  667. }
  668. }
  669. }
  670. ?>