PageRenderTime 59ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/class.xmoduser2.inc

https://github.com/jcplat/console-seolan
PHP | 678 lines | 590 code | 44 blank | 44 comment | 92 complexity | 43fc767467c06a72968147075b71a007 MD5 | raw file
Possible License(s): LGPL-2.0, LGPL-2.1, GPL-3.0, Apache-2.0, BSD-3-Clause
  1. <?php
  2. class XModUser2 extends XModUserAndGroup {
  3. public $lost_password=true;
  4. public $account_request=false;
  5. public $choose_lang_on_login = true;
  6. public $send_account_request_to_email=NULL;
  7. function __construct($ar=NULL) {
  8. parent::__construct($ar);
  9. if($GLOBALS['XUSER'] && !empty($this->xset->desc['BO']) && empty($this->fieldssec['BO'])){
  10. $rwv=$this->secure('',':rwv');
  11. if(!$rwv) $this->fieldssec['BO']='ro';
  12. }
  13. XLabels::loadLabels('xmoduser2');
  14. $this->group=XLabels::getSysLabel("general","systemproperties","text");
  15. $this->modulename=XLabels::getSysLabel("xmoduser2","modulename","text");
  16. if(!$this->xset->fieldExists('PUBLISH')) $this->account_request=false;
  17. }
  18. /// Initialisation des propriétés
  19. public function initOptions() {
  20. parent::initOptions();
  21. $alabel = XLabels::getSysLabel('xmoduser2.modulename');
  22. $this->_options->setOpt(XLabels::getSysLabel('xmodtable','composed_fullnam'),'composed_fullnam','text',NULL,NULL,$alabel);
  23. $this->_options->setOpt(XLabels::getSysLabel('xmoduser2','lost_password'),'lost_password','boolean',NULL,NULL,$alabel);
  24. $this->_options->setOpt(XLabels::getSysLabel('xmoduser2','account_request'),'account_request','boolean',NULL,NULL,$alabel);
  25. $this->_options->setOpt(XLabels::getSysLabel('xmoduser2','choose_lang_on_login'),'choose_lang_on_login','boolean',NULL,NULL,$alabel);
  26. $this->_options->setComment(XLabels::getSysLabel('xmoduser2','account_request_comment'),'account_request');
  27. $this->_options->setOpt(XLabels::getSysLabel('xmoduser2','send_account_request_to_email'),'send_account_request_to_email','text',NULL,NULL,$alabel);
  28. }
  29. /// securite des fonctions accessibles par le web
  30. function secGroups($function, $group=NULL) {
  31. $g=array(
  32. 'setbackuid'=>array('none','admin'),
  33. 'editPref'=>array('admin'),
  34. 'setuid'=>array('admin'),
  35. 'getBookmarks'=>array('none','admin'),
  36. 'getBookmark'=>array('none','admin'),
  37. 'insertBookmark'=>array('none','admin'),
  38. 'procInsertBookmark'=>array('none','admin'),
  39. 'editBookmark'=>array('none','admin'),
  40. 'delBookmark'=>array('none','admin'),
  41. 'procEditBookmark'=>array('none','admin'),
  42. 'procEditPref'=>array('admin'),
  43. 'sendPasswords'=>array('rw','rwv','admin'),
  44. 'browseSelection'=>array('none','list','ro','rw','rwv','admin'),
  45. 'myAccount'=>array('none','list','ro','rw','rwv','admin'),
  46. 'procEditMyAccount'=>array('none','list','ro','rw','rwv','admin'),
  47. 'getPreferences'=>array('none','list','ro','rw','rwv','admin'),
  48. 'requestAnAccount'=>array('none'),
  49. 'procRequestAnAccount'=>array('none'),
  50. );
  51. if(isset($g[$function])) {
  52. if(!empty($group)) return in_array($group, $g[$function]);
  53. return $g[$function];
  54. }
  55. return parent::secGroups($function,$group);
  56. }
  57. /// Edition des propriétés du module
  58. function procEditProperties($ar=NULL){
  59. $ret=parent::procEditProperties($ar);
  60. if($this->account_request && !$this->xset->fieldExists('PUBLISH')){
  61. $this->xset->createField('PUBLISH','Actif','XBoolDef','0','1','0','1','0','1','0','0');
  62. updateQuery('update USERS set UPD=UPD,PUBLISH=1');
  63. }
  64. return $ret;
  65. }
  66. /// Prépare une demande de compte
  67. function requestAnAccount($ar=NULL){
  68. $this->captcha=true;
  69. if(empty($ar['selectedfields'])){
  70. $ar['selectedfields']=array_diff(array_keys($this->xset->desc),array('alias','GRP','GRPA','ldata','luser','passwd','DATEF','DATET',($this->composed_fullnam?'fullnam':'')));
  71. }
  72. // Désactive toutes les listbox
  73. foreach($this->xset->desc as $f){
  74. $f->listbox=false;
  75. }
  76. return $this->insert($ar);
  77. }
  78. /// Enregistre une demande de compte
  79. function procRequestAnAccount($ar=NULL){
  80. $p=new XParam($ar,NULL);
  81. $this->captcha=true;
  82. $ar['PUBLISH']=2;
  83. $ar['alias']='user'.uniqid();
  84. $ar['ldata']=XShell::getLangUser();
  85. $ar['luser']=XShell::getLangUser();
  86. $ret=$this->procInsert($ar);
  87. if(!empty($ret) && !empty($ret['oid']) && !empty($this->send_account_request_to_email)) {
  88. $olduser=$GLOBALS['XUSER'];
  89. $GLOBALS['XUSER']=new XUser(array("UID"=>'root'));
  90. setSessionVar("UID",$GLOBALS['XUSER']->_curoid);
  91. $this->procSendACopyTo(array('oid'=>$ret['oid'],
  92. 'sendinmail' => array($ret['oid']=>true),
  93. 'showdest'=>false,
  94. 'dest_aemails' => $this->send_account_request_to_email,
  95. 'asubject' => 'Account request : '.$p->get('fullnam'),
  96. 'amessage' => 'You have received a new account request',
  97. 'tplentry' => TZR_RETURN_DATA, '_local'=>true), TZR_SENDER_ADDRESS);
  98. if(!empty($olduser)) {
  99. setSessionVar("UID",$olduser->uid());
  100. $GLOBALS["XUSER"]=$olduser;
  101. }
  102. }
  103. return $r;
  104. }
  105. /// Edite le compte de l'utilisateur courant
  106. function myAccount($ar=NULL){
  107. $ar['oid']=XUser::get_current_user_uid();
  108. if(!is_array($ar['fieldssec'])){
  109. foreach(array('DATET','DATEF','alias','GRP','GRPA','BO','bohome') as $f){
  110. $ar['fieldssec'][$f]='ro';
  111. }
  112. }
  113. return $this->edit($ar);
  114. }
  115. /// Valide l'édition du compte de l'utilisateur courant
  116. function procEditMyAccount($ar=NULL){
  117. $p=new XParam($ar,NULL);
  118. $ar['oid']=XUser::get_current_user_uid();
  119. if(!is_array($ar['fieldssec'])){
  120. foreach(array('DATET','DATEF','alias','GRP','GRPA','BO','bohome') as $f){
  121. $ar['fieldssec'][$f]='ro';
  122. }
  123. }
  124. $ret=$this->procEdit($ar);
  125. $d=$this->display(array('oid'=>$ar['oid'],'tplentry'=>TZR_RETURN_DATA,'selectedfields'=>array('fullnam','email')));
  126. setSessionVar('FullName',$d['ofullnam']->raw);
  127. setSessionVar('Email',$d['oemail']->raw);
  128. return $ret;
  129. }
  130. /// Recupère les préferences de l'utilisateur sur chaque module
  131. function getPreferences($ar=NULL){
  132. $p=new XParam($ar,NULL);
  133. $tplentry=$p->get('tplentry');
  134. $modlist=XModule::modlist(array('tplentry'=>TZR_RETURN_DATA));
  135. foreach($modlist['lines_oid'] as $i=>$moid){
  136. $mod=XModule::objectFactory(array('moid'=>$moid,'tplentry'=>TZR_RETURN_DATA));
  137. $prefs=$mod->editPrefs();
  138. if(!empty($prefs)) $modlist['lines_prefs'][$i]=$prefs;
  139. }
  140. return XShell::toScreen1($tplentry,$modlist);
  141. }
  142. /// Rempli le fullname dans le cas ou il est composé d'autres champs
  143. function getComposedFullnam(&$ar){
  144. $p = new XParam($ar,array());
  145. $oid = $p->get('oid');
  146. if(!is_array($oid) && !empty($this->composed_fullnam)){
  147. $tab=explode(',',$this->composed_fullnam);
  148. $ok=false;
  149. // On verifie qu'au moins un des champs qui composent le nom existe
  150. foreach($tab as $f){
  151. if($p->is_set($f)){
  152. $ok=true;
  153. }
  154. }
  155. if($ok){
  156. $fullnam='';
  157. foreach($tab as $f){
  158. if($p->is_set($f)){
  159. $v=$p->get($f);
  160. }else{
  161. if(empty($d)) $d=$this->display(array('tplentry'=>TZR_RETURN_DATA,'oid'=>$oid,'selectedfields'=>$tab));
  162. $v=$d['o'.$f]->raw;
  163. }
  164. $fullnam.=$v;
  165. if(!empty($v)) $fullnam.=' ';
  166. }
  167. if(substr($fullnam,-1)==' ') $fullnam=substr($fullnam,0,-1);
  168. if(!empty($fullnam)) $ar['fullnam']=$fullnam;
  169. }
  170. }
  171. }
  172. /// Sauvegarde un compte utilisateur
  173. function procEdit($ar=NULL){
  174. $this->getComposedFullnam($ar);
  175. return parent::procEdit($ar);
  176. }
  177. /// Duplication d'un compte utilisateur
  178. function procEditDup($ar){
  179. $r=parent::procEditDup($ar);
  180. if(!empty($r['oid'])){
  181. $d1=$this->display(array('oid'=>$r['oid'], 'tplentry'=>TZR_RETURN_DATA));
  182. $groups=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.'GRP');
  183. foreach($d1['oGRP']->oidcollection as $groupoid) {
  184. $d2=&$groups->rDisplay($groupoid);
  185. if(!empty($d2['oprefs']->raw)) {
  186. // on duplique le contenu des préférences stockées dans la table OPTS
  187. $templateoid=$d2['oprefs']->raw;
  188. $useroid=$r['oid'];
  189. $rs2=selectQuery('select * from OPTS where user="'.$templateoid.'"');
  190. $opts=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.'OPTS');
  191. while($rs2 && ($ors2=$rs2->fetch())) {
  192. $opts->procInput(array('user'=>$useroid, 'specs'=>$ors2['specs'], 'modid'=>$ors2['modid'],
  193. 'dtype'=>$ors2['dtype']));
  194. }
  195. }
  196. }
  197. }
  198. return $r;
  199. }
  200. /// creation d'un nouvel utilisateur
  201. function procInsert($ar) {
  202. $this->getComposedFullnam($ar);
  203. $p=new XParam($ar,array());
  204. $passwd=$p->get('passwd');
  205. if($passwd==TZR_UNCHANGED || !$passwd) {
  206. $ar['passwd']=newPassword();
  207. }
  208. $r=parent::procInsert($ar);
  209. if(!empty($r['oid'])) {
  210. $d1=$this->display(array('oid'=>$r['oid'], 'tplentry'=>TZR_RETURN_DATA));
  211. $groups=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.'GRP');
  212. foreach($d1['oGRP']->oidcollection as $groupoid) {
  213. $d2=&$groups->rDisplay($groupoid);
  214. if(!empty($d2['oprefs']->raw)) {
  215. // on duplique le contenu des préférences stockées dans la table OPTS
  216. $templateoid=$d2['oprefs']->raw;
  217. $useroid=$r['oid'];
  218. $rs2=selectQuery('select * from OPTS where user="'.$templateoid.'"');
  219. $opts=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.'OPTS');
  220. while($rs2 && ($ors2=$rs2->fetch())) {
  221. $opts->procInput(array('user'=>$useroid, 'specs'=>$ors2['specs'], 'modid'=>$ors2['modid'],
  222. 'dtype'=>$ors2['dtype']));
  223. }
  224. return $r;
  225. }
  226. }
  227. }
  228. return $r;
  229. }
  230. function browse_actions(&$r) {
  231. $self=$GLOBALS['TZR_SESSION_MANAGER']::complete_self();
  232. $self=$self."&moid=".$this->_moid."&oid=<oid>&tplentry=br&function=";
  233. if(!is_array($r['lines_oid'])) return;
  234. $viewico=XLabels::getSysLabel('general','view');
  235. $viewtxt=XLabels::getSysLabel('general','view','text');
  236. $editico=XLabels::getSysLabel('general','edit');
  237. $edittxt=XLabels::getSysLabel('general','edit','text');
  238. $delico=XLabels::getSysLabel('general','delete');
  239. $deltxt=XLabels::getSysLabel('general','delete','text');
  240. $secico=XLabels::getSysLabel('general','security');
  241. $sectxt=XLabels::getSysLabel('general','security','text');
  242. $moveico=XLabels::getSysLabel('general','move');
  243. $movetxt=XLabels::getSysLabel('general','move','text');
  244. $editlvl=$this->secGroups('edit');
  245. $dellvl=$this->secGroups('del');
  246. $seclvl=$this->secGroups('editSec');
  247. $sec2lvl=$this->secGroups('setuid');
  248. $moidadmin=XModule::getMoid(XMODADMIN_TOID);
  249. foreach($r['lines_oid'] as $i =>$oid) {
  250. $oidlvl=array_keys($r['objects_sec'][$i]);
  251. $self1=str_replace('<oid>',$oid,$self);
  252. $r['actions'][$i][0]='<a class="cv8-ajaxlink cv8-dispaction" href="'.$self1.'display&template=xmodtable/view.html" title="'.$viewtxt.'">'.$viewico.'</a>';
  253. $r['actions_label'][$i][0]=$viewico;
  254. $r['actions_url'][$i][0]=$self1.'display&template=xmodtable/view.html';
  255. // edition
  256. $inter=array_intersect($editlvl,$oidlvl);
  257. if(!empty($inter)){
  258. $url=$self1.'edit&template=xmodtable/edit.html';
  259. $r['actions'][$i][1]='<a class="cv8-ajaxlink cv8-editaction" href="'.$url.'" title="'.$edittxt.'">'.$editico.'</a>';
  260. $r['actions_url'][$i][1]=$url;
  261. $r['actions_label'][$i][1]=$editico;
  262. }
  263. // suppression
  264. $inter=array_intersect($dellvl,$oidlvl);
  265. if(!empty($inter)){
  266. $url=$self1.'del&template=basic/message.html';
  267. $r['actions'][$i][2]='<a class="cv8-delaction" href="'.$url.'" title="'.$deltxt.'">'.$delico.'</a>';
  268. $r['actions_url'][$i][2]=$url;
  269. $r['actions_label'][$i][2]=$deltxt;
  270. }
  271. // securité
  272. $inter=array_intersect($seclvl,$oidlvl);
  273. if(!empty($inter)){
  274. $url=$self1.'editSec&moid='.$this->_moid."&oid=$oid&template=xmoduser2/secedit.html&tplentry=br";
  275. $r['actions'][$i][3]='<a class="cv8-ajaxlink" href="'.$url.'" title="'.$sectxt.'">'.$secico.'</a>';
  276. $r['actions_url'][$i][3]=$url;
  277. $r['actions_label'][$i][3]=$sectxt;
  278. }
  279. // changer user
  280. $inter=array_intersect($sec2lvl,$oidlvl);
  281. if(!empty($inter)){
  282. $url2='&function=portail&template=home.html&moid='.$moidadmin;
  283. $url=$self1.'setuid&moid='.$this->_moid."&oid=$oid&template=xmoduser2/secedit.html&tplentry=br&_next=".urlencode($url2);
  284. $r['actions'][$i][4]='<a href="'.$url.'" title="'.$movetxt.'">'.$moveico.'</a>';
  285. $r['actions_url'][$i][4]=$url;
  286. }
  287. }
  288. }
  289. /// Controle si une édition est valide
  290. function procEditCtrl($ar=NULL) {
  291. if(!parent::procEditCtrl($ar)) return false;
  292. $p=new XParam($ar,array());
  293. $alias=$p->get('alias');
  294. if(!empty($alias) && !preg_match('/^([a-z0-9@\._-]{3,30})$/i',$alias)) {
  295. XShell::toScreen2('','message','Username must be 3 to 30 characters long and must contain a-z, 0-9 and _, - characters only');
  296. return false;
  297. }
  298. $cnt=0;
  299. $oid=$p->get('oid');
  300. if(!empty($oid) && !empty($alias)) $cnt=countSelectQuery('select COUNT(*) from '.$this->table.' where alias="'.$alias.'" and KOID!="'.$oid.'"');
  301. elseif(!empty($alias)) $cnt=countSelectQuery('select COUNT(*) from '.$this->table.' where alias="'.$alias.'"');
  302. if($cnt) {
  303. XShell::toScreen2('','message',XLabels::getSysLabel('xmoduser2','existing_user','text'));
  304. return false;
  305. }
  306. // Verifie que les nouveaux droits ne sont pas supérieurs aux droits de l'utilisateur actuel
  307. $grp=$p->get('GRP');
  308. if(false && !empty($grp) && !XShell::isRoot()){
  309. $grp=$this->xset->desc['GRP']->post_edit($grp,array('GRP_HID'=>$p->get('GRP_HID'),'GRP_FMT'=>$p->get('GRP_FMT')));
  310. if(!empty($grp)){
  311. $rs=&selectQuery('select * from MODULES');
  312. while($rs && $ors=$rs->fetch()){
  313. foreach($GLOBALS['TZR_LANGUAGES'] as $lang=>$foo){
  314. $nlvl=XUser::secure8maxlevel($ors['MOID'],'',$grp->raw,$lang);
  315. $alvl=XUser::secure8maxlevel($ors['MOID'],'',null,$lang);
  316. if(XUser::compareSecLevels($ors['MOID'],$nlvl,$alvl,'>')){
  317. XShell::toScreen2('','message',XLabels::getSysLabel('security','noauthtosetsec'));;
  318. return false;
  319. }
  320. }
  321. }
  322. }
  323. }
  324. return true;
  325. }
  326. /// suppression d'un utilisateur
  327. function del($ar) {
  328. if(parent::del($ar)) {
  329. $p = new XParam($ar, array());
  330. $oid = $p->get('oid');
  331. // suppression des abonnements
  332. updateQuery("delete from OPTS where user like '$oid'");
  333. // suppression des regles de secuite inutiles
  334. updateQuery("delete from ACL4 where AGRP like '$oid'");
  335. // suppression des enregistrements dans les logs
  336. XArchives::appendOid($oid, 'LOGS.user', true);
  337. XArchives::appendOid($oid, 'LOGS.object', true);
  338. if(!empty($GLOBALS['XLOCK'])) {
  339. $GLOBALS['XLOCK']->cleanLocksForUser($oid);
  340. }
  341. }
  342. }
  343. /// Obtenir la liste des bookmarks de l'utilisateur connecté ou de l'utilisateur dont l'oid est passé dans le paramètre
  344. function &getBookmarks($ar) {
  345. $p=new XParam($ar,array());
  346. $oid=$p->get('oid','norequest');
  347. if(empty($oid)) $oid=XUser::get_current_user_uid();
  348. $tplentry=$p->get('tplentry');
  349. $r1=XOpts::getOpt($oid, $this->_moid, 'book');
  350. $sortarray=array();
  351. foreach($r1 as $k=>&$v1) {
  352. $sortarray[$k]=$v1['group'].$v1['title'];
  353. $v1['key']=$k;
  354. $v1['text']=nl2br(htmlspecialchars(strip_tags($v1['text'])));
  355. $v1['group']=htmlspecialchars(strip_tags($v1['group']));
  356. $v1['title']=htmlspecialchars(strip_tags($v1['title']));
  357. $v1['autostart']=@$v1['autostart'];
  358. $v1['viewhome']=@$v1['viewhome'];
  359. }
  360. array_multisort($sortarray,SORT_ASC,$r1);
  361. if($tplentry==TZR_RETURN_DATA) return $r1;
  362. else{
  363. $r2['bks']=&$r1;
  364. XShell::toScreen1($tplentry,$r2);
  365. }
  366. }
  367. /// Recupere les parametres d'un bookmark
  368. function &getBookmark($ar) {
  369. $p=new XParam($ar,array());
  370. $oid=$p->get('oid','norequest');
  371. if(empty($oid)) $oid=XUser::get_current_user_uid();
  372. $tplentry=$p->get('tplentry');
  373. $key=$p->get('key');
  374. $r1=XOpts::getOpt($oid, $this->_moid, 'book');
  375. $v1=$r1[$key];
  376. // Assure compatibilité <V8
  377. if(!is_array($v1['urls'])) $v1['urls']=array($v1['url']);
  378. $v1['key']=$key;
  379. $v1['text']=htmlspecialchars(strip_tags($v1['text']));
  380. $v1['group']=htmlspecialchars(strip_tags($v1['group']));
  381. $v1['title']=htmlspecialchars(strip_tags($v1['title']));
  382. $v1['autostart']=@$v1['autostart'];
  383. $v1['viewhome']=@$v1['viewhome'];
  384. return XShell::toScreen1($tplentry,$v1);
  385. }
  386. /// Modifie l'intégralité des bookmarks d'un utilisateur
  387. function &setBookmarks($ar) {
  388. $p=new XParam($ar,array());
  389. $oid=$p->get('oid','norequest');
  390. if(empty($oid)) $oid=XUser::get_current_user_uid();
  391. $specs=$p->get('specs');
  392. XOpts::setOpt($oid, $this->_moid, 'book', $specs);
  393. }
  394. /// Suppression d'un bookmark
  395. function delBookmark($ar) {
  396. $p=new XParam($ar,array('oid'=>XUser::get_current_user_uid()));
  397. $oid=$p->get('oid','norequest');
  398. if(!($oid==XUser::get_current_user_uid() || XShell::isRoot()))
  399. securityWarning('XModUser2::delBookmark: user '.$oid.' cannot apply');
  400. $tplentry=$p->get('tplentry');
  401. $key=$p->get('key');
  402. $r1=XOpts::unsetSubOpt($oid, $this->_moid, 'book', $key);
  403. }
  404. /// Prépare l'insertion d'un nouveau bookmark
  405. function insertBookmark($ar=NULL){
  406. $p=new XParam($ar,NULL);
  407. $urls=XModUser2::_normalizeBookmark($p->get('urls'));
  408. $titles=$p->get('titles');
  409. $comments=$p->get('comments');
  410. $tplentry=$p->get('tplentry');
  411. $ret=array('urls'=>$urls,'titles'=>$titles,'comments'=>$comments);
  412. XShell::toScreen1($tplentry,$ret);
  413. }
  414. /// Enregistre un nouveau bookmark
  415. function procInsertBookmark($ar=NULL){
  416. return $this->procEditBookmark($ar);
  417. }
  418. /// Modification d'un bookmark, préparation de l'écran
  419. function editBookmark($ar) {
  420. $p=new XParam($ar,array('oid'=>XUser::get_current_user_uid()));
  421. $oid=$p->get('oid','norequest');
  422. if(!($oid==XUser::get_current_user_uid() || XShell::isRoot()))
  423. securityWarning('XModUser2::editBookmark: user '.$oid.' cannot apply');
  424. $tplentry=$p->get('tplentry');
  425. $key=$p->get('key');
  426. $r1=XOpts::getOpt($oid, $this->_moid, 'book');
  427. $r2=$r1[$key];
  428. // Assure compatibilité <V8
  429. if(!is_array($r2['urls'])) $r2['urls']=array($r2['url']);
  430. $r2['key']=$key;
  431. return XShell::toScreen1($tplentry, $r2);
  432. }
  433. /// Normalisation des bookmarks: on essaie de transformer les bookmarks en url generiques par defaut
  434. static public function _normalizeBookmark($urls) {
  435. if(!is_array($urls)){
  436. $urls=array($urls);
  437. $one=true;
  438. }
  439. foreach($urls as &$url){
  440. $url=strip_tags(trim($url));
  441. $url=preg_replace('/^(javascript[^&]*)/','',$url);
  442. $url=preg_replace('/^(http[^&]*)/','',$url);
  443. $url=preg_replace('@^(/[^&]*)@','',$url);
  444. $url=preg_replace('/'.session_name().'=[a-z0-9]+/i','',$url);
  445. $url=preg_replace('/_bdx=[a-z0-9_]+/i','',$url);
  446. $url=preg_replace('/&_nohistory=./i','',$url);
  447. $url=preg_replace('/&_raw=./i','',$url);
  448. $url=preg_replace('/&_ajax=./i','',$url);
  449. $url=preg_replace('/&_bdxnewstack=./i','',$url);
  450. $url=preg_replace('/&_=[^&]+/i','',$url);
  451. $url=str_replace('&&','&',$url);
  452. }
  453. if($one) return $urls[0];
  454. else return $urls;
  455. }
  456. /// Enregistres les modifications d'un bookmark
  457. function procEditBookmark($ar) {
  458. $p=new XParam($ar,array('oid'=>XUser::get_current_user_uid()));
  459. $oid=$p->get('oid','norequest');
  460. if(!($oid==XUser::get_current_user_uid() || XShell::isRoot()))
  461. securityWarning('XModUser2::procEditBookmark: user '.$oid.' cannot apply');
  462. $tplentry=$p->get('tplentry');
  463. $key=$p->get('key');
  464. $group=strip_tags($p->get('group'));
  465. $title=strip_tags($p->get('title'));
  466. $text=strip_tags($p->get('text'));
  467. $autostart=$p->get('autostart');
  468. $viewhome=$p->get('viewhome');
  469. $titles=$p->get('titles');
  470. $comms=$p->get('comments');
  471. $urls=XModUser2::_normalizeBookmark($p->get('urls'));
  472. $r1=XOpts::getOpt($oid, $this->_moid, 'book');
  473. $new=array('title'=>$title,'text'=>$text,'group'=>$group,'urls'=>$urls,'titles'=>$titles,'comments'=>$comms,'autostart'=>$autostart,
  474. 'viewhome'=>$viewhome);
  475. if(isset($key)) $r1[$key]=$new;
  476. else $r1[]=$new;
  477. XOpts::setOpt($oid, $this->_moid, 'book', $r1);
  478. }
  479. /* Fin gestion des bookmarks */
  480. /// Envoie du mot de passe aux utilisteurs spécifiés
  481. function sendPasswords($ar=NULL) {
  482. $p=new XParam($ar, array());
  483. $_selected=$p->get('_selected');
  484. $adminonly=$p->get('adminonly');
  485. if(empty($_selected)) $_selected=array($p->get('oid')=>1);
  486. $fields=array('KOID','alias','fullnam','email');
  487. if($this->xset->fieldExists('ldata')) $fields[]="ldata";
  488. if($this->xset->fieldExists('luser')) $fields[]="luser";
  489. $actlangdata=XShell::getLangData();
  490. $actreqlangdata=$_REQUEST['LANG_DATA'];
  491. $actreqlanguser=$_REQUEST['LANG_USER'];
  492. foreach($_selected as $oid=>$foo) {
  493. $rs=selectQuery("select distinct ".implode(',',$fields)." from USERS where KOID='$oid'");
  494. if($ors=$rs->fetch()) {
  495. if($this->xset->fieldExists('ldata')){
  496. XShell::getLangData($ors['ldata'],true);
  497. $_REQUEST['LANG_DATA']=$ors['ldata'];
  498. }
  499. if($this->xset->fieldExists('luser')){
  500. $_REQUEST['LANG_USER']=$ors['luser'];
  501. $GLOBALS['XSHELL']->labels->reloadLabels();
  502. }
  503. $alias=$ors['alias'];
  504. $pwd=newPassword();
  505. $text=$GLOBALS['XSHELL']->labels->getCustomSysLabel('xsession.messages','login_msg','mail');
  506. $text=sprintf($text,$alias,$pwd);
  507. updateQuery('update USERS set passwd=MD5("'.$pwd.'") where alias="'.$alias.'"');
  508. $subject=$GLOBALS['XSHELL']->labels->getCustomSysLabel('xsession.messages','login_sub','mail');
  509. if(empty($adminonly)) $this->sendMail2User($subject, $text,$ors['email'],$this->sender);
  510. $this->sendMail2User($subject, $text,TZR_DEBUG_ADDRESS, $this->sender);
  511. $rs->closeCursor();
  512. }
  513. }
  514. if($this->xset->fieldExists('ldata')){
  515. XShell::getLangData($actlangdata,true);
  516. $_REQUEST['LANG_DATA']=$actreqlangdata;
  517. }
  518. if($this->xset->fieldExists('luser')){
  519. $_REQUEST['LANG_USER']=$actreqlanguser;
  520. $GLOBALS['XSHELL']->labels->reloadLabels();
  521. }
  522. }
  523. protected function _actionlist(&$my) {
  524. parent::_actionlist($my);
  525. $moid=$this->_moid;
  526. $oid=@$_REQUEST['oid'];
  527. $uniqid=XShell::uniqid();
  528. if($this->secure('','sendPasswords')) {
  529. if(in_array(XShell::_function(),array('edit','display'))) {
  530. $o1=new XModuleAction($this,'sendaccount',XLabels::getSysLabel('xmoduser2','sendaccount','text'),
  531. '&moid='.$moid.'&oid='.$oid.'&_function=sendPasswords&template=basic/message.html&tplentry=br','edit');
  532. $o1->menuable=true;
  533. $my['sendaccount']=$o1;
  534. }elseif(in_array(XShell::_function(),array('browse','procQuery'))) {
  535. $message=addslashes(XLabels::getSysLabel('general','operation_succeeded','text'));
  536. $o1=new XModuleAction($this,'sendaccount',XLabels::getSysLabel('xmoduser2','sendaccount','text'),
  537. 'javascript:TZR.applySelected("sendPasswords",document.browse'.$uniqid.',"'.$message.'",'.
  538. '"basic/message.html",0,"'.addslashes(XLabels::getSysLabel('general','error_select_object','text')).'");',
  539. 'edit');
  540. $o1->menuable=true;
  541. $my['sendaccount']=$o1;
  542. }
  543. }
  544. $goid=XModule::getMoid(XMODGROUP_TOID);
  545. $ri=XUser::secure8maxlevel($goid);
  546. if(in_array($ri, array('admin', 'rwv', 'rw', 'ro'))){
  547. $o1=new XModuleAction($this,'groups',XLabels::getSysLabel('xmodgroup','groups','text'),
  548. '&function=browse&moid='.$goid.'&template=xmodtable/browse.html&tplentry=br','display');
  549. $o1->menuable=true;
  550. $o1->setToolbar('xmodgroup','groups');
  551. $my['groups']=$o1;
  552. }
  553. }
  554. function al_browse(&$my){
  555. parent::al_browse($my);
  556. $uniqid='v'.XShell::uniqid();
  557. if($this->secure('','editSec')){
  558. $o1=new XModuleAction($this,'editsec',XLabels::getSysLabel('general','security','text'),
  559. 'javascript:'.$uniqid.'.applyfunction("editSec","",{template:"xmoduser2/secedit.html"},true,true);','edit');
  560. $o1->setToolbar('general','security');
  561. $o1->order=4;
  562. $my['editsec']=$o1;
  563. }
  564. }
  565. function setbackuid($ar) {
  566. $this->setuid($ar);
  567. }
  568. function setuid($ar) {
  569. $p=new XParam($ar,array());
  570. $oid=$p->get('oid');
  571. $suid=getSessionVar('SUID');
  572. $c=$GLOBALS['TZR_SESSION_MANAGER'];
  573. $sess=new $c();
  574. $params = array(
  575. '_options' => array('local' => 1),
  576. 'suid' => 1,
  577. 'admini' => getSessionVar('ADMINI'));
  578. if (empty($suid)){
  579. $params['uid'] = $oid;
  580. $sess->procAuth($params);
  581. } else {
  582. $params['uid'] = $suid;
  583. $sess->procAuth($params);
  584. }
  585. }
  586. /* Gestion de la selection */
  587. /// Ajoute des données à la selection
  588. function addToSelection($moid,$data){
  589. $sel=getSessionVar('selection');
  590. if(empty($sel[$moid])) $sel[$moid]=array();
  591. $sel[$moid]=array_merge($sel[$moid],$data);
  592. setSessionVar('selection',$sel);
  593. }
  594. /// Ajoute des données à la selection
  595. function delToSelection($moid,$data){
  596. $sel=getSessionVar('selection');
  597. foreach($data as $oid=>&$foo){
  598. unset($sel[$moid][$oid]);
  599. }
  600. if(empty($sel[$moid])) unset($sel[$moid]);
  601. setSessionVar('selection',$sel);
  602. }
  603. /// Parcours toute la selection
  604. function browseSelection($ar=NULL){
  605. $p=new XParam($ar,NULL);
  606. $tplentry=$p->get('tplentry');
  607. $details=$p->get('details');
  608. $sel=getSessionVar('selection');
  609. $result=array();
  610. $names=array();
  611. if(is_array($sel)) {
  612. foreach($sel as $moid=>&$data){
  613. $mod=XModule::objectFactory(array('moid'=>$moid,'tplentry'=>TZR_RETURN_DATA));
  614. $br=&$mod->browseUserSelection(array('tplentry'=>TZR_RETURN_DATA));
  615. $br['_actions']=$mod->userSelectionActions();
  616. if(empty($br['_count'])){
  617. unset($sel[$moid]);
  618. continue;
  619. }
  620. $result[]=$br;
  621. $names[]=$br['_modulename'];
  622. }
  623. setSessionVar('selection',$sel);
  624. array_multisort($names,$result);
  625. }
  626. return XShell::toScreen2($tplentry,'selections',$result);
  627. }
  628. /// Rend l'accessibilite du module avec l'oid donne
  629. function secure($oid, $func, $user=NULL, $lang=TZR_DEFAULT_LANG) {
  630. if(($func=='requestAnAccount' || $func=='procRequestAnAccount') && !$this->account_request) return false;
  631. return parent::secure($oid,$func,$user,$lang);
  632. }
  633. }
  634. ?>