Fixed bug #9398: Labels in Module User Administration are hardcoded
[Packages/TYPO3.CMS.git] / typo3 / sysext / beuser / mod / index.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2008 Kasper Skaarhoj (kasperYYYY@typo3.com)
6 * All rights reserved
7 *
8 * This script is part of the TYPO3 project. The TYPO3 project is
9 * free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * The GNU General Public License can be found at
15 * http://www.gnu.org/copyleft/gpl.html.
16 * A copy is found in the textfile GPL.txt and important notices to the license
17 * from the author is found in LICENSE.txt distributed with these scripts.
18 *
19 *
20 * This script is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * This copyright notice MUST APPEAR in all copies of the script!
26 ***************************************************************/
27 /**
28 * Backend User Administration Module
29 *
30 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
31 */
32 /**
33 * [CLASS/FUNCTION INDEX of SCRIPT]
34 *
35 *
36 *
37 * 129: class localPageTree extends t3lib_browseTree
38 * 140: function localPageTree($BE_USER,$WEBMOUNTS='')
39 * 154: function ext_permsC()
40 * 165: function wrapTitle($str,$row)
41 * 177: function PM_ATagWrap($icon,$cmd,$bMark='')
42 * 188: function wrapIcon($icon,$row)
43 * 201: function initializePositionSaving()
44 *
45 *
46 * 222: class printAllPageTree extends localPageTree
47 * 231: function ext_permsC()
48 * 243: function PM_ATagWrap($icon,$cmd,$bMark='')
49 * 254: function wrapIcon($icon,$row)
50 *
51 *
52 * 279: class printAllPageTree_perms extends printAllPageTree
53 * 288: function printTree($treeArr='',$printPath=0)
54 * 331: function ext_printPerms($int)
55 * 349: function ext_groupPerms($row,$firstGroup)
56 *
57 *
58 * 377: class localFolderTree extends t3lib_folderTree
59 * 388: function localFolderTree($BE_USER,$FILEMOUNTS='')
60 * 403: function wrapTitle($str,$row)
61 * 415: function PM_ATagWrap($icon,$cmd,$bMark='')
62 * 426: function wrapIcon($icon,$row)
63 * 439: function initializePositionSaving()
64 *
65 *
66 * 463: class printAllFolderTree extends localFolderTree
67 * 475: function PM_ATagWrap($icon,$cmd,$bMark='')
68 *
69 *
70 * 497: class local_beUserAuth extends t3lib_beUserAuth
71 * 509: function returnWebmounts($pClause='')
72 * 533: function ext_non_readAccessPages()
73 * 556: function user_where_clause()
74 * 568: function ext_printOverview($uInfo,$compareFlags,$printTrees=0)
75 * 838: function ext_getReadableButNonmounted()
76 * 873: function ext_printPerms($int)
77 * 891: function ext_groupPerms($row,$firstGroup)
78 * 907: function ext_compileUserInfoForHash($filter=NULL)
79 * 1007: function ext_uniqueAndSortList($list)
80 * 1021: function ext_ksortArrayRecursive(&$arr)
81 * 1034: function ext_workspaceMembership()
82 *
83 *
84 * 1088: class SC_mod_tools_be_user_index
85 * 1100: function init()
86 * 1128: function menuConfig()
87 * 1149: function main()
88 * 1185: function printContent()
89 *
90 * SECTION: OTHER FUNCTIONS:
91 * 1207: function compareUsers($compareFlags)
92 * 1394: function linkUser($str,$rec)
93 * 1405: function elementLinks($table,$row)
94 * 1436: function initUsers()
95 * 1456: function localPath($str)
96 * 1468: function switchUser($switchUser)
97 *
98 * TOTAL FUNCTIONS: 39
99 * (This index is automatically created/updated by the extension "extdeveval")
100 *
101 */
102
103 require_once (PATH_t3lib.'class.t3lib_basicfilefunc.php');
104 require_once (PATH_t3lib.'class.t3lib_browsetree.php');
105 require_once (PATH_t3lib.'class.t3lib_foldertree.php');
106 require_once (PATH_t3lib.'class.t3lib_tstemplate.php');
107 require_once (PATH_t3lib.'class.t3lib_loadmodules.php');
108 require_once (PATH_t3lib.'class.t3lib_tsparser_ext.php');
109 require_once (PATH_typo3.'class.alt_menu_functions.inc');
110
111 $GLOBALS['LANG']->includeLLFile('EXT:beuser/mod/locallang.xml');
112
113 $BE_USER->modAccess($MCONF,1);
114
115
116
117
118
119
120 /**
121 * Base Extension class for printing a page tree (non-browsable though)
122 *
123 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
124 * @package TYPO3
125 * @subpackage tx_beuser
126 */
127 class localPageTree extends t3lib_browseTree {
128 var $expandFirst=0;
129 var $expandAll=0;
130
131 /**
132 * Local backend user (not the GLOBALS[] backend user!!)
133 *
134 * @var t3lib_beUserAuth
135 */
136 var $BE_USER;
137
138 /**
139 * Constructor for the local page tree.
140 *
141 * @param object Local backend user (not the GLOBALS[] backend user!!)
142 * @param array Webmounts for the backend user.
143 * @return void
144 */
145 function localPageTree($BE_USER,$WEBMOUNTS='') {
146 $this->init();
147
148 $this->BE_USER = $BE_USER;
149 $this->MOUNTS = $WEBMOUNTS;
150 $this->clause = $this->ext_permsC(); // Notice, this clause does NOT filter out un-readable pages. This is the POINT since this class is ONLY used for the main overview where ALL is shown! Otherwise "AND '.$this->BE_USER->getPagePermsClause(1).'" should be added.
151 $this->orderByFields = 'sorting';
152 }
153
154 /**
155 * Return select permissions.
156 *
157 * @return string WHERE query part.
158 */
159 function ext_permsC() {
160 return '';
161 }
162
163 /**
164 * Wraps the title.
165 *
166 * @param string [See parent]
167 * @param array [See parent]
168 * @return string
169 */
170 function wrapTitle($str,$row) {
171 return $str;
172 }
173
174 /**
175 * Wraps the plus/minus icon - in this case we just return blank which means we STRIP AWAY the plus/minus icon!
176 *
177 * @param string [See parent]
178 * @param string [See parent]
179 * @param string [See parent]
180 * @return string
181 */
182 function PM_ATagWrap($icon,$cmd,$bMark='') {
183 return '';
184 }
185
186 /**
187 * Wrapping the icon of the element/page. Normally a click menu is wrapped around the icon, but in this case only a title parameter is set.
188 *
189 * @param string Icon image tag.
190 * @param array Row.
191 * @return string Icon with title attribute added.
192 */
193 function wrapIcon($icon,$row) {
194 // Add title attribute to input icon tag
195 $title = '['.$row['uid'].'] '.t3lib_BEfunc::getRecordPath($row['uid'],'',15);
196 $theIcon = $this->addTagAttributes($icon,($this->titleAttrib ? $this->titleAttrib.'="'.htmlspecialchars($title).'"' : '').' border="0"');
197
198 return $theIcon;
199 }
200
201 /**
202 * This will make sure that no position data is acquired from the BE_USER uc variable.
203 *
204 * @return void
205 */
206 function initializePositionSaving() {
207 $this->stored=array();
208 }
209 }
210
211
212
213
214
215
216
217
218
219
220 /**
221 * Extension class for printing a page tree: All pages of a mount point.
222 *
223 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
224 * @package TYPO3
225 * @subpackage tx_beuser
226 */
227 class printAllPageTree extends localPageTree {
228 var $expandFirst=1;
229 var $expandAll=1;
230
231 /**
232 * Return select permissions.
233 *
234 * @return string WHERE query part.
235 */
236 function ext_permsC() {
237 return ' AND '.$this->BE_USER->getPagePermsClause(1);
238 }
239
240 /**
241 * Returns the plus/minus icon.
242 *
243 * @param string [See parent]
244 * @param string [See parent]
245 * @param string [See parent]
246 * @return string
247 */
248 function PM_ATagWrap($icon,$cmd,$bMark='') {
249 return $icon;
250 }
251
252 /**
253 * Wrapping the icon of the element/page. Normally a click menu is wrapped around the icon, but in this case only a title parameter is set.
254 *
255 * @param string Icon image tag.
256 * @param array Row.
257 * @return string Icon with title attribute added.
258 */
259 function wrapIcon($icon,$row) {
260 // Add title attribute to input icon tag
261 $title = '['.$row['uid'].']';
262 $theIcon = $this->addTagAttributes($icon,($this->titleAttrib ? $this->titleAttrib.'="'.htmlspecialchars($title).'"' : '').' border="0"');
263
264 return $theIcon;
265 }
266 }
267
268
269
270
271
272
273
274
275
276
277 /**
278 * Extension class for printing a page tree: Printing all pages, with permissions.
279 *
280 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
281 * @package TYPO3
282 * @subpackage tx_beuser
283 */
284 class printAllPageTree_perms extends printAllPageTree {
285
286 /**
287 * Print the tree of pages.
288 *
289 * @param array The tree items
290 * @param boolean If set, the path of the pages in the tree is printed (only done for pages outside of mounts).
291 * @return string HTML content.
292 */
293 function printTree($treeArr='',$printPath=0) {
294 $titleLen=intval($this->BE_USER->uc['titleLen']);
295
296 $be_user_Array = t3lib_BEfunc::getUserNames();
297 $be_group_Array = t3lib_BEfunc::getGroupNames();
298 $lines=array();
299 $lines[]='<tr class="bgColor5">
300 <td nowrap="nowrap"><strong>' . $GLOBALS['LANG']->getLL('pageTitle', true) . '</strong></td>
301 ' . ($printPath?'<td nowrap="nowrap"><strong>' . $GLOBALS['LANG']->getLL('path', true) . '</strong></td>':'') . '
302 <td nowrap="nowrap" colspan="2"><strong>' . $GLOBALS['LANG']->getLL('user', true) . '</strong></td>
303 <td nowrap="nowrap" colspan="2"><strong>' . $GLOBALS['LANG']->getLL('group', true) . ' &nbsp;</strong></td>
304 <td nowrap="nowrap"><strong>' . $GLOBALS['LANG']->getLL('everybody', true) . ' &nbsp;</strong></td>
305 <td nowrap="nowrap"><strong>' . $GLOBALS['LANG']->getLL('thisUser', true) . ' &nbsp;</strong></td>
306 <td nowrap="nowrap"><strong>' . $GLOBALS['LANG']->getLL('mainGroup', true) . '</strong></td>
307 </tr>';
308
309 if (!is_array($treeArr)) {
310 $treeArr = $this->tree;
311 }
312 foreach ($treeArr as $v) {
313 $col1 = ' bgcolor="'.t3lib_div::modifyHtmlColor($GLOBALS['SOBE']->doc->bgColor4,+10,+10,+10).'"';
314 $row = $v['row'];
315 $title = htmlspecialchars(t3lib_div::fixed_lgd_cs($row['title'],$this->BE_USER->uc['titleLen']));
316 $lines[]='<tr class="bgColor4">
317 <td nowrap="nowrap">'.$v['HTML'].$title.' &nbsp;</td>
318 '.($printPath?'<td nowrap="nowrap">'.htmlspecialchars(t3lib_BEfunc::getRecordPath ($row['pid'],'',15)).' &nbsp;</td>':'').'
319 <td nowrap="nowrap"'.$col1.'>'.$be_user_Array[$row['perms_userid']]['username'].' &nbsp;</td>
320 <td nowrap="nowrap"'.$col1.'>'.$this->ext_printPerms($row['perms_user']).' &nbsp;</td>
321 <td nowrap="nowrap">'.$be_group_Array[$row['perms_groupid']]['title'].' &nbsp;</td>
322 <td nowrap="nowrap">'.$this->ext_printPerms($row['perms_group']).' &nbsp;</td>
323 <td nowrap="nowrap" align="center" '.$col1.'>'.$this->ext_printPerms($row['perms_everybody']).' &nbsp;</td>
324 <td nowrap="nowrap" align="center">' . ($row['editlock'] ? '<img ' . t3lib_iconWorks::skinImg($this->backPath,'gfx/recordlock_warning2.gif') . ' title="' . $GLOBALS['LANG']->getLL('editLock', true) . '" alt="" />' : $this->ext_printPerms($this->BE_USER->calcPerms($row))) . ' &nbsp;</td>
325 <td nowrap="nowrap" align="center">'.$this->ext_printPerms($this->ext_groupPerms($row,$be_group_Array[$this->BE_USER->firstMainGroup])).' &nbsp;</td>
326 </tr>';
327 }
328 return '<table border="0" cellpadding="0" cellspacing="0">'.implode('',$lines).'</table>';
329 }
330
331 /**
332 * Print a set of permissions
333 *
334 * @param integer The permissions integer.
335 * @return string HTML formatted.
336 */
337 function ext_printPerms($int) {
338 $str='';
339 $str.= (($int&1)?'*':'<font color="red">x</font>');
340 $str.= (($int&16)?'*':'<font color="red">x</font>');
341 $str.= (($int&2)?'*':'<font color="red">x</font>');
342 $str.= (($int&4)?'*':'<font color="red">x</font>');
343 $str.= (($int&8)?'*':'<font color="red">x</font>');
344
345 return '<b><font color="green">'.$str.'</font></b>';
346 }
347
348 /**
349 * returns the permissions for a group based of the perms_groupid of $row. If the $row[perms_groupid] equals the $firstGroup[uid] then the function returns perms_everybody OR'ed with perms_group, else just perms_everybody
350 *
351 * @param array Page record.
352 * @param array First-group record.
353 * @return integer Permissions.
354 */
355 function ext_groupPerms($row,$firstGroup) {
356 if (is_array($row)) {
357 $out=intval($row['perms_everybody']);
358 if ($row['perms_groupid'] && $firstGroup['uid']==$row['perms_groupid']) {
359 $out|= intval($row['perms_group']);
360 }
361 return $out;
362 }
363 }
364 }
365
366
367
368
369
370
371
372
373
374
375
376 /**
377 * Base Extension class for printing a folder tree (non-browsable though)
378 *
379 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
380 * @package TYPO3
381 * @subpackage tx_beuser
382 */
383 class localFolderTree extends t3lib_folderTree {
384 var $expandFirst=0;
385 var $expandAll=0;
386
387 /**
388 * Local backend user (not the GLOBALS[] backend user!!)
389 *
390 * @var t3lib_beUserAuth
391 */
392 var $BE_USER;
393
394 /**
395 * Constructor for the local folder tree.
396 *
397 * @param object Local backend user (not the GLOBALS[] backend user!!)
398 * @param array Filemounts for the backend user.
399 * @return void
400 */
401 function localFolderTree($BE_USER,$FILEMOUNTS='') {
402 $this->init();
403
404 $this->BE_USER = $BE_USER;
405 $this->MOUNTS = $FILEMOUNTS;
406 $this->clause = ''; // Notice, this clause does NOT filter out un-readable pages. This is the POINT since this class is ONLY used for the main overview where ALL is shown! Otherwise "AND '.$this->BE_USER->getPagePermsClause(1).'" should be added.
407 }
408
409 /**
410 * Wraps the title.
411 *
412 * @param string [See parent]
413 * @param array [See parent]
414 * @return string
415 */
416 function wrapTitle($str,$row) {
417 return $str;
418 }
419
420 /**
421 * Wraps the plus/minus icon - in this case we just return blank which means we STRIP AWAY the plus/minus icon!
422 *
423 * @param string [See parent]
424 * @param string [See parent]
425 * @param string [See parent]
426 * @return string
427 */
428 function PM_ATagWrap($icon,$cmd,$bMark='') {
429 return '';
430 }
431
432 /**
433 * Wrapping the icon of the element/page. Normally a click menu is wrapped around the icon, but in this case only a title parameter is set.
434 *
435 * @param string Icon image tag.
436 * @param array Row.
437 * @return string Icon with title attribute added.
438 */
439 function wrapIcon($icon,$row) {
440 // Add title attribute to input icon tag
441 $title = $GLOBALS['SOBE']->localPath($row['path']);
442 $theIcon = $this->addTagAttributes($icon,($this->titleAttrib ? $this->titleAttrib.'="'.htmlspecialchars($title).'"' : ''));
443
444 return $theIcon;
445 }
446
447 /**
448 * This will make sure that no position data is acquired from the BE_USER uc variable.
449 *
450 * @return void
451 */
452 function initializePositionSaving() {
453 $this->stored=array();
454 }
455 }
456
457
458
459
460
461
462
463
464
465
466
467
468
469 /**
470 * Extension class for printing a folder tree: All folders
471 *
472 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
473 * @package TYPO3
474 * @subpackage tx_beuser
475 */
476 class printAllFolderTree extends localFolderTree {
477 var $expandFirst=1;
478 var $expandAll=1;
479
480 /**
481 * Wraps the plus/minus icon - in this case we just return blank which means we STRIP AWAY the plus/minus icon!
482 *
483 * @param string [See parent]
484 * @param string [See parent]
485 * @param string [See parent]
486 * @return string
487 */
488 function PM_ATagWrap($icon,$cmd,$bMark='') {
489 return $icon;
490 }
491 }
492
493
494
495
496
497
498
499
500
501
502
503 /**
504 * Extension class of beuserauth class.
505 *
506 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
507 * @package TYPO3
508 * @subpackage tx_beuser
509 */
510 class local_beUserAuth extends t3lib_beUserAuth {
511 var $ext_pageIdsFromMounts=''; // List of mounted page ids (from browsetree class when selecting mountpoints)
512 var $ext_non_readAccessPageArray=array(); // Storage for non-readable webmounts, see returnWebmounts()
513
514 /**
515 * Returns an array of the webmounts for the user, with non-readable webmounts filtered out.
516 * If there are non-readable webmounts they are registered in $this->ext_non_readAccessPageArray
517 * (Extending function in parent class)
518 *
519 * @param string alternative select clause (default is getPagePermsClause(1)). For instance to make sure that ALL webmounts are selected regardless of whether the user has read access or not, you can set this to "1=1".
520 * @return array Webmounts id's
521 */
522 function returnWebmounts($pClause='') {
523
524 // Get array of webmounts:
525 $webmounts = (string)($this->groupData['webmounts'])!='' ? explode(',',$this->groupData['webmounts']) : Array();
526
527 // Get select clause:
528 $pClause=$pClause?$pClause:$this->getPagePermsClause(1);
529
530 // Traverse mounts, check if they are readable:
531 foreach ($webmounts as $k => $id) {
532 $rec=t3lib_BEfunc::getRecord('pages',$id,'*',' AND '.$pClause);
533 if (!is_array($rec)) {
534 $this->ext_non_readAccessPageArray[$id]=t3lib_BEfunc::getRecord('pages',$id);
535 unset($webmounts[$k]);
536 }
537 }
538 return $webmounts;
539 }
540
541 /**
542 * Based on the content of ->ext_non_readAccessPageArray (see returnWebmounts()) it generates visually formatted information about these non-readable mounts.
543 *
544 * @return string HTML content showing which DB-mounts were not accessible for the user
545 */
546 function ext_non_readAccessPages() {
547 $lines=array();
548
549 foreach ($this->ext_non_readAccessPageArray as $pA) {
550 if ($pA) {
551 $lines[] = t3lib_BEfunc::getRecordPath($pA['uid'],'',15);
552 }
553 }
554 if (count($lines)) {
555 return '<table bgcolor="red" border="0" cellpadding="0" cellspacing="0">
556 <tr>
557 <td align="center"><font color="white"><strong>' . $GLOBALS['LANG']->getLL('noReadAccess', true) . '</strong></font></td>
558 </tr>
559 <tr>
560 <td>'.implode('</td></tr><tr><td>',$lines).'</td>
561 </tr>
562 </table>';
563 }
564 }
565
566 /**
567 * This returns the where-clause needed to select the user with respect flags like deleted, hidden, starttime, endtime
568 *
569 * @return string
570 */
571 function user_where_clause() {
572 return 'AND pid=0 ';
573 }
574
575 /**
576 * Creates the overview information based on which analysis topics were selected.
577 *
578 * @param array Array of analysis topics
579 * @param array Array of the selected analysis topics (from session variable somewhere)
580 * @param boolean If set, the full trees of pages/folders are printed.
581 * @return array Array with accumulated HTML content.
582 */
583 function ext_printOverview($uInfo,$compareFlags,$printTrees=0) {
584 // Prepare for filemount and db-mount
585 if ($printTrees) { // ... this is if we see the detailed view for a user:
586 // Page tree object:
587 $className=t3lib_div::makeInstanceClassName(!$this->isAdmin() ? 'printAllPageTree_perms' : 'printAllPageTree');
588 $pagetree = new $className($this,$this->returnWebmounts()); // Here, only readable webmounts are returned (1=1)
589 $pagetree->addField('perms_user',1);
590 $pagetree->addField('perms_group',1);
591 $pagetree->addField('perms_everybody',1);
592 $pagetree->addField('perms_userid',1);
593 $pagetree->addField('perms_groupid',1);
594 $pagetree->addField('editlock',1);
595
596 // Folder tree object:
597 $className=t3lib_div::makeInstanceClassName('printAllFolderTree');
598 $foldertree = new $className($this,$this->returnFilemounts());
599 } else {
600 // Page tree object:
601 $className=t3lib_div::makeInstanceClassName('localPageTree');
602 $pagetree = new $className($this,$this->returnWebmounts('1=1')); // Here, ALL webmounts are returned (1=1)
603
604 // Folder tree object:
605 $className=t3lib_div::makeInstanceClassName('localFolderTree');
606 $foldertree = new $className($this,$this->returnFilemounts());
607 }
608
609 // Names for modules:
610 $modNames = array(
611 'web' => 'Web',
612 'web_layout' => 'Page',
613 'web_modules' => 'Modules',
614 'web_info' => 'Info',
615 'web_perms' => 'Access',
616 'web_func' => 'Func',
617 'web_list' => 'List',
618 'web_ts' => 'Template',
619 'file' => 'File',
620 'file_list' => 'List',
621 'file_images' => 'Images',
622 'doc' => 'Doc.',
623 'help' => 'Help',
624 'help_about' => 'About',
625 'help_quick' => 'User manual',
626 'help_welcome' => 'Welcome',
627 'user' => 'User',
628 'user_setup' => 'Setup',
629 'user_task' => 'Task center'
630 );
631
632 // Traverse the enabled analysis topics:
633 $out=array();
634 foreach ($uInfo as $k => $v) {
635 if ($compareFlags[$k]) {
636 switch($k) {
637 case 'filemounts':
638 $out[$k] = $foldertree->getBrowsableTree();
639 break;
640 case 'webmounts':
641 // Print webmounts:
642 $pagetree->addSelfId=1;
643 $out[$k] = $this->ext_non_readAccessPages(); // Add HTML for non-readable webmounts (only shown when viewing details of a user - in overview/comparison ALL mounts are shown)
644 $out[$k].= $pagetree->getBrowsableTree(); // Add HTML for readable webmounts.
645 $this->ext_pageIdsFromMounts=implode(',',array_unique($pagetree->ids)); // List of mounted page ids
646 break;
647 case 'tempPath':
648 $out[$k] = $GLOBALS['SOBE']->localPath($v);
649 break;
650 case 'pagetypes_select':
651 $pageTypes = explode(',',$v);
652 foreach ($pageTypes as &$vv) {
653 $vv = $GLOBALS['LANG']->sL(t3lib_BEfunc::getLabelFromItemlist('pages','doktype',$vv));
654 }
655 $out[$k] = implode('<br />',$pageTypes);
656 break;
657 case 'tables_select':
658 case 'tables_modify':
659 $tables = explode(',',$v);
660 foreach ($tables as &$vv) {
661 if ($vv) {
662 $vv = '<span class="nobr">'.t3lib_iconWorks::getIconImage($vv,array(),$GLOBALS['BACK_PATH'],'align="top"').$GLOBALS['LANG']->sL($GLOBALS['TCA'][$vv]['ctrl']['title']).'</span>';
663 }
664 }
665 $out[$k] = implode('<br />',$tables);
666 break;
667 case 'non_exclude_fields':
668 $nef = explode(',',$v);
669 $table='';
670 $pout=array();
671 foreach ($nef as $vv) {
672 if ($vv) {
673 list($thisTable,$field) = explode(':',$vv);
674 if ($thisTable!=$table) {
675 $table=$thisTable;
676 t3lib_div::loadTCA($table);
677 $pout[]='<span class="nobr">'.t3lib_iconWorks::getIconImage($table,array(),$GLOBALS['BACK_PATH'],'align="top"').$GLOBALS['LANG']->sL($GLOBALS['TCA'][$table]['ctrl']['title']).'</span>';
678 }
679 if ($GLOBALS['TCA'][$table]['columns'][$field]) {
680 $pout[]='<span class="nobr"> - '.ereg_replace(':$','',$GLOBALS['LANG']->sL($GLOBALS['TCA'][$table]['columns'][$field]['label'])).'</span>';
681 }
682 }
683 }
684 $out[$k] = implode('<br />',$pout);
685 break;
686 case 'groupList':
687 case 'firstMainGroup':
688 $uGroups = explode(',',$v);
689 $table='';
690 $pout=array();
691 foreach ($uGroups as $vv) {
692 if ($vv) {
693 $uGRow = t3lib_BEfunc::getRecord('be_groups',$vv);
694 $pout[]='<tr><td nowrap="nowrap">'.t3lib_iconWorks::getIconImage('be_groups',$uGRow,$GLOBALS['BACK_PATH'],'align="top"').'&nbsp;'.htmlspecialchars($uGRow['title']).'&nbsp;&nbsp;</td><td width=1% nowrap="nowrap">'.$GLOBALS['SOBE']->elementLinks('be_groups',$uGRow).'</td></tr>';
695 }
696 }
697 $out[$k] = '<table border="0" cellpadding="0" cellspacing="0" width="100%">'.implode('',$pout).'</table>';
698 break;
699 case 'modules':
700 $mods = explode(',',$v);
701 $mainMod='';
702 $pout=array();
703 foreach ($mods as $vv) {
704 if ($vv) {
705 list($thisMod,$subMod) = explode('_',$vv);
706 if ($thisMod!=$mainMod) {
707 $mainMod=$thisMod;
708 $pout[]='<span class="nobr">'.($modNames[$mainMod]?$modNames[$mainMod]:$mainMod).'</span>';
709 }
710 if ($subMod) {
711 $pout[]='<span class="nobr"> - '.($modNames[$mainMod.'_'.$subMod]?$modNames[$mainMod.'_'.$subMod]:$mainMod.'_'.$subMod).'</span>';
712 }
713 }
714 }
715 $out[$k] = implode('<br />',$pout);
716 break;
717 case 'userTS':
718
719 $tmpl = t3lib_div::makeInstance('t3lib_tsparser_ext'); // Defined global here!
720 $tmpl->tt_track = 0; // Do not log time-performance information
721
722 $tmpl->fixedLgd=0;
723 $tmpl->linkObjects=0;
724 $tmpl->bType='';
725 $tmpl->ext_expandAllNotes=1;
726 $tmpl->ext_noPMicons=1;
727 $out[$k] = $tmpl->ext_getObjTree($v,'','','','','1');
728 break;
729 case 'userTS_hl':
730 $tsparser = t3lib_div::makeInstance('t3lib_TSparser');
731 $tsparser->lineNumberOffset=0;
732 $out[$k] = $tsparser->doSyntaxHighlight($v,0,1);
733 break;
734 case 'explicit_allowdeny':
735
736 // Explode and flip values:
737 $nef = array_flip(explode(',',$v));
738 $pout = array();
739
740 $theTypes = t3lib_BEfunc::getExplicitAuthFieldValues();
741
742 // Icons:
743 $icons = array(
744 'ALLOW' => '<img'.t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'],'gfx/icon_ok2.gif','').' class="absmiddle" alt="" />',
745 'DENY' => '<img'.t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'],'gfx/icon_fatalerror.gif','').' class="absmiddle" alt="" />',
746 );
747
748 // Traverse types:
749 foreach ($theTypes as $tableFieldKey => $theTypeArrays) {
750 if (is_array($theTypeArrays['items'])) {
751 $pout[] = '<b>'.$theTypeArrays['tableFieldLabel'].'</b>';
752 // Traverse options for this field:
753 foreach ($theTypeArrays['items'] as $itemValue => $itemContent) {
754 $v = $tableFieldKey.':'.$itemValue.':'.$itemContent[0];
755 if (isset($nef[$v])) {
756 unset($nef[$v]);
757 $pout[] = $icons[$itemContent[0]].'['.$itemContent[2].'] '.$itemContent[1];
758 } else {
759 $pout[] = '<em style="color: #666666;">'.$icons[($itemContent[0]=='ALLOW' ? 'DENY' : 'ALLOW')].'['.$itemContent[2].'] '.$itemContent[1].'</em>';
760 }
761 }
762 $pout[] = '';
763 }
764 }
765
766 // Add remaining:
767 if (count($nef)) {
768 $pout = array_merge($pout, array_keys($nef));
769 }
770
771 // Implode for display:
772 $out[$k] = implode('<br />',$pout);
773 break;
774 case 'allowed_languages':
775
776 // Explode and flip values:
777 $nef = array_flip(explode(',',$v));
778 $pout = array();
779
780 // Get languages:
781 $items = t3lib_BEfunc::getSystemLanguages();
782
783 // Traverse values:
784 foreach ($items as $iCfg) {
785 if (isset($nef[$iCfg[1]])) {
786 unset($nef[$iCfg[1]]);
787 if (strlen($iCfg[2])) {
788 $icon = '<img '.t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'],'gfx/'.$iCfg[2]).' class="absmiddle" style="margin-right: 5px;" alt="" />';
789 } else {
790 $icon = '';
791 }
792 $pout[] = $icon.$iCfg[0];
793 }
794 }
795
796 // Add remaining:
797 if (count($nef)) {
798 $pout = array_merge($pout, array_keys($nef));
799 }
800
801 // Implode for display:
802 $out[$k] = implode('<br />',$pout);
803 break;
804 case 'workspace_perms':
805 $out[$k] = implode('<br/>',explode(', ',t3lib_BEfunc::getProcessedValue('be_users','workspace_perms',$v)));
806 break;
807 case 'workspace_membership':
808 $out[$k] = implode('<br/>',$this->ext_workspaceMembership());
809 break;
810 case 'custom_options':
811
812 // Explode and flip values:
813 $nef = array_flip(explode(',',$v));
814 $pout = array();
815
816 // Initialize:
817 $customOptions = $GLOBALS['TYPO3_CONF_VARS']['BE']['customPermOptions'];
818 if (is_array($customOptions)) {
819 foreach ($customOptions as $coKey => $coValue) {
820 if (is_array($coValue['items'])) {
821 // Traverse items:
822 foreach ($coValue['items'] as $itemKey => $itemCfg) {
823 $v = $coKey.':'.$itemKey;
824 if (isset($nef[$v])) {
825 unset($nef[$v]);
826 $pout[] = $GLOBALS['LANG']->sl($coValue['header']).' / '.$GLOBALS['LANG']->sl($itemCfg[0]);
827 }
828 }
829 }
830 }
831 }
832
833 // Add remaining:
834 if (count($nef)) {
835 $pout = array_merge($pout, array_keys($nef));
836 }
837
838 // Implode for display:
839 $out[$k] = implode('<br />',$pout);
840 break;
841 }
842 }
843 }
844 return $out;
845 }
846
847 /**
848 * Get HTML code for the pages which were mounted, but NOT readable!
849 *
850 * @return string HTML code.
851 */
852 function ext_getReadableButNonmounted() {
853
854 // List of page id mounts which ARE mounted (and should therefore not be selected)
855 if (!$this->ext_pageIdsFromMounts) {
856 $this->ext_pageIdsFromMounts=0;
857 }
858
859 // User and group names:
860 $be_user_Array = t3lib_BEfunc::getUserNames();
861 $be_group_Array = t3lib_BEfunc::getGroupNames();
862
863 // Create query:
864 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
865 'pid,uid,title,doktype,perms_user,perms_group,perms_everybody,perms_userid,perms_groupid'.(t3lib_extMgm::isLoaded('cms')?',media,layout,hidden,starttime,endtime,fe_group,extendToSubpages':''),
866 'pages',
867 'uid NOT IN ('.$this->ext_pageIdsFromMounts.') AND '.$this->getPagePermsClause(1).t3lib_BEfunc::deleteClause('pages')
868 );
869 $dat = array();
870 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
871 $dat[] = array(
872 'row'=>$row,
873 'HTML'=>t3lib_iconWorks::getIconImage('pages',$row,$GLOBALS['BACK_PATH'],'align="top" title="['.$row['uid'].']"') // .htmlspecialchars($row['title'])
874 );
875 }
876 $className=t3lib_div::makeInstanceClassName('printAllPageTree_perms');
877 $pp = new $className($this);
878 return $pp->printTree($dat,1);
879 }
880
881 /**
882 * Print a set of permissions
883 *
884 * @param integer The permissions integer.
885 * @return string HTML formatted.
886 */
887 function ext_printPerms($int) {
888 $str='';
889 $str.= (($int&1)?'*':'<font color="red">x</font>');
890 $str.= (($int&16)?'*':'<font color="red">x</font>');
891 $str.= (($int&2)?'*':'<font color="red">x</font>');
892 $str.= (($int&4)?'*':'<font color="red">x</font>');
893 $str.= (($int&8)?'*':'<font color="red">x</font>');
894
895 return '<b><font color="green">'.$str.'</font></b>';
896 }
897
898 /**
899 * returns the permissions for a group based of the perms_groupid of $row. If the $row[perms_groupid] equals the $firstGroup[uid] then the function returns perms_everybody OR'ed with perms_group, else just perms_everybody
900 *
901 * @param array Page record.
902 * @param array First-group record.
903 * @return integer Permissions.
904 */
905 function ext_groupPerms($row,$firstGroup) {
906 if (is_array($row)) {
907 $out=intval($row['perms_everybody']);
908 if ($row['perms_groupid'] && $firstGroup['uid']==$row['perms_groupid']) {
909 $out|= intval($row['perms_group']);
910 }
911 return $out;
912 }
913 }
914
915 /**
916 * Creates uInfo array for the user.
917 *
918 * @param array Might contain array where keys/values indicate whether to render a certain value
919 * @return array Array with the information of the user for each analysis topic.
920 */
921 function ext_compileUserInfoForHash($filter=NULL) {
922 $uInfo=array();
923 $renderAll = !is_array($filter);
924
925 // Filemounts:
926 if ($renderAll || $filter['filemounts']) {
927 $uInfo['filemounts'] = $this->ext_uniqueAndSortList(implode(',',array_keys($this->groupData['filemounts'])));
928 }
929
930 // DBmounts:
931 if ($renderAll || $filter['webmounts']) {
932 $uInfo['webmounts'] = $this->ext_uniqueAndSortList($this->groupData['webmounts']);
933 }
934
935 // Sharing Upload Folder
936 if ($renderAll || $filter['tempPath']) {
937 $fileProcessor = t3lib_div::makeInstance('t3lib_basicFileFunctions');
938 $fileProcessor->init($this->groupData['filemounts'], $GLOBALS['TYPO3_CONF_VARS']['BE']['fileExtensions']);
939 $uInfo['tempPath'] = $fileProcessor->findTempFolder(); // The closest TEMP-path is found
940 }
941
942 // First Main Group:
943 if ($renderAll || $filter['firstMainGroup']) {
944 $uInfo['firstMainGroup'] = $this->firstMainGroup;
945 }
946
947 // Group List:
948 if ($renderAll || $filter['groupList']) {
949 $uInfo['groupList'] = $this->groupList; // This gives a list that shows in which order the groups are processed. This may result in a list of groups which is similar to that of another user regarding which group but not the order of groups. For now, I believe it's most usefull to let separate orders of groups appear as different group settings for a user.
950 }
951
952 // Page Types:
953 if ($renderAll || $filter['pagetypes_select']) {
954 $uInfo['pagetypes_select'] = $this->ext_uniqueAndSortList($this->groupData['pagetypes_select']);
955 }
956
957 // Tables select:
958 if ($renderAll || $filter['tables_select']) {
959 $uInfo['tables_select'] = $this->ext_uniqueAndSortList($this->groupData['tables_select'].','.$this->groupData['tables_modify']);
960 }
961
962 // Tables modify:
963 if ($renderAll || $filter['tables_modify']) {
964 $uInfo['tables_modify'] = $this->ext_uniqueAndSortList($this->groupData['tables_modify']);
965 }
966
967 // Non-exclude fields:
968 if ($renderAll || $filter['non_exclude_fields']) {
969 $uInfo['non_exclude_fields'] = $this->ext_uniqueAndSortList($this->groupData['non_exclude_fields']);
970 }
971
972 // Explicit Allow/Deny:
973 if ($renderAll || $filter['explicit_allowdeny']) {
974 $uInfo['explicit_allowdeny'] = $this->ext_uniqueAndSortList($this->groupData['explicit_allowdeny']);
975 }
976
977 // Limit to languages:
978 if ($renderAll || $filter['allowed_languages']) {
979 $uInfo['allowed_languages'] = $this->ext_uniqueAndSortList($this->groupData['allowed_languages']);
980 }
981
982 // Workspace permissions
983 if ($renderAll || $filter['workspace_perms']) {
984 $uInfo['workspace_perms'] = $this->ext_uniqueAndSortList($this->groupData['workspace_perms']);
985 }
986
987 // Workspace membership
988 if ($renderAll || $filter['workspace_membership']) {
989 $uInfo['workspace_membership'] = $this->ext_workspaceMembership();
990 }
991
992 // Custom options:
993 if ($renderAll || $filter['custom_options']) {
994 $uInfo['custom_options'] = $this->ext_uniqueAndSortList($this->groupData['custom_options']);
995 }
996
997 // Modules:
998 if ($renderAll || $filter['modules']) {
999 $uInfo['modules'] = $this->ext_uniqueAndSortList($this->groupData['modules']);
1000 }
1001
1002 // User TS:
1003 $this->ext_ksortArrayRecursive($this->userTS);
1004 if ($renderAll || $filter['userTS']) {
1005 $uInfo['userTS'] = $this->userTS;
1006 }
1007
1008 if ($renderAll || $filter['userTS_hl']) {
1009 $uInfo['userTS_hl'] = $this->userTS_text;
1010 }
1011
1012 return $uInfo;
1013 }
1014
1015 /**
1016 * Sorts a commalist of values and removes duplicates.
1017 *
1018 * @param string Commalist.
1019 * @return string Sorted, unique commalist.
1020 */
1021 function ext_uniqueAndSortList($list) {
1022 $uList=t3lib_div::trimExplode(',',$list,1);
1023 sort($uList);
1024 $uList=array_unique($uList);
1025 $uList=implode(',',$uList);
1026 return $uList;
1027 }
1028
1029 /**
1030 * Key sort input array recursively.
1031 *
1032 * @param array Multidimensional array (value by reference!)
1033 * @return void
1034 */
1035 function ext_ksortArrayRecursive(&$arr) {
1036 krsort($arr);
1037 foreach ($arr as &$v) {
1038 if (is_array($v)) {
1039 $this->ext_ksortArrayRecursive($v);
1040 }
1041 }
1042 }
1043
1044 /**
1045 * Returns all workspaces that are accessible for the BE_USER
1046 *
1047 * @return array with key / value pairs of available workspaces (filtered by BE_USER check)
1048 */
1049 function ext_workspaceMembership() {
1050 // Create accessible workspace arrays:
1051 $options = array();
1052 if ($this->checkWorkspace(array('uid' => 0))) {
1053 $options[0] = '0: ' . $GLOBALS['LANG']->getLL('live', true);
1054 }
1055 if ($this->checkWorkspace(array('uid' => -1))) {
1056 $options[-1] = '-1: ' . $GLOBALS['LANG']->getLL('defaultDraft', true);
1057 }
1058
1059 // Add custom workspaces (selecting all, filtering by BE_USER check):
1060 $workspaces = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('uid,title,adminusers,members,reviewers,db_mountpoints','sys_workspace','pid=0'.t3lib_BEfunc::deleteClause('sys_workspace'),'','title');
1061 if (count($workspaces)) {
1062 foreach ($workspaces as $rec) {
1063 if ($this->checkWorkspace($rec)) {
1064 $options[$rec['uid']] = $rec['uid'].': '.$rec['title'];
1065
1066 // Check if all mount points are accessible, otherwise show error:
1067 if (trim($rec['db_mountpoints'])!=='') {
1068 $mountPoints = t3lib_div::intExplode(',',$this->workspaceRec['db_mountpoints'],1);
1069 foreach ($mountPoints as $mpId) {
1070 if (!$this->isInWebMount($mpId,'1=1')) {
1071 $options[$rec['uid']].= '<br> \- ' . $GLOBALS['LANG']->getLL('notAccessible', true) . ' ' . $mpId;
1072 }
1073 }
1074 }
1075 }
1076 }
1077 }
1078
1079 return $options;
1080 }
1081 }
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094 /**
1095 * Main script class
1096 *
1097 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
1098 * @package TYPO3
1099 * @subpackage tx_beuser
1100 */
1101 class SC_mod_tools_be_user_index {
1102 var $MCONF=array();
1103 var $MOD_MENU=array();
1104 var $MOD_SETTINGS=array();
1105
1106 /**
1107 * document emplate object
1108 *
1109 * @var noDoc
1110 */
1111 var $doc;
1112
1113 var $include_once=array();
1114 var $content;
1115
1116
1117 /**
1118 * Basic initialization of the class
1119 *
1120 * @return void
1121 */
1122 function init() {
1123 $this->MCONF = $GLOBALS['MCONF'];
1124
1125 $this->menuConfig();
1126 $this->switchUser(t3lib_div::_GP('SwitchUser'));
1127
1128
1129 // **************************
1130 // Initializing
1131 // **************************
1132 $this->doc = t3lib_div::makeInstance('template');
1133 $this->doc->backPath = $GLOBALS['BACK_PATH'];
1134 $this->doc->setModuleTemplate('templates/beuser.html');
1135 $this->doc->form='<form action="" method="POST">';
1136
1137 // JavaScript
1138 $this->doc->JScode = $this->doc->wrapScriptTags('
1139 script_ended = 0;
1140 function jumpToUrl(URL) { //
1141 window.location.href = URL;
1142 }
1143 ' . $this->doc->redirectUrls());
1144 }
1145
1146 /**
1147 * Initialization of the module menu configuration
1148 *
1149 * @return void
1150 */
1151 function menuConfig() {
1152 // MENU-ITEMS:
1153 // If array, then it's a selector box menu
1154 // If empty string it's just a variable, that'll be saved.
1155 // Values NOT in this array will not be saved in the settings-array for the module.
1156 $this->MOD_MENU = array(
1157 'function' => array(
1158 'compare' => $GLOBALS['LANG']->getLL('compareUserSettings', true),
1159 'whoisonline' => $GLOBALS['LANG']->getLL('listUsersOnline', true)
1160 )
1161 );
1162 // CLEAN SETTINGS
1163 $this->MOD_SETTINGS = t3lib_BEfunc::getModuleData($this->MOD_MENU, t3lib_div::_GP('SET'), $this->MCONF['name'], 'ses');
1164 }
1165
1166 /**
1167 * This functions builds the content of the page
1168 *
1169 * @return void
1170 */
1171 function main() {
1172 $this->content='';
1173
1174 $this->content.=$this->doc->header($GLOBALS['LANG']->getLL('backendUserAdministration', true));
1175 $this->content.=$this->doc->spacer(5);
1176
1177 switch($this->MOD_SETTINGS['function']) {
1178 case 'compare':
1179 if (t3lib_div::_GP('ads')) {
1180 $compareFlags = t3lib_div::_GP('compareFlags');
1181 $GLOBALS['BE_USER']->pushModuleData('tools_beuser/index.php/compare',$compareFlags);
1182 } else {
1183 $compareFlags = $GLOBALS['BE_USER']->getModuleData('tools_beuser/index.php/compare','ses');
1184 }
1185 $this->content.=$this->compareUsers($compareFlags);
1186 break;
1187 case 'whoisonline':
1188 $this->content.=$this->whoIsOnline();
1189 break;
1190 }
1191 // Setting up the buttons and markers for docheader
1192 $docHeaderButtons = $this->getButtons();
1193 //$markers['CSH'] = $docHeaderButtons['csh'];
1194 $markers['FUNC_MENU'] = t3lib_BEfunc::getFuncMenu(0,'SET[function]',$this->MOD_SETTINGS['function'],$this->MOD_MENU['function']);
1195 $markers['CONTENT'] = $this->content;
1196
1197 // Build the <body> for the module
1198 $this->content = $this->doc->startPage('Backend User Administration');
1199 $this->content.= $this->doc->moduleBody($this->pageinfo, $docHeaderButtons, $markers);
1200 $this->content.= $this->doc->endPage();
1201 $this->content = $this->doc->insertStylesAndJS($this->content);
1202 }
1203
1204 /**
1205 * Prints the content of the page
1206 *
1207 * @return void
1208 */
1209 function printContent() {
1210 echo $this->content;
1211 }
1212
1213 /**
1214 * Create the panel of buttons for submitting the form or otherwise perform operations.
1215 *
1216 * @return array all available buttons as an assoc. array
1217 */
1218 protected function getButtons() {
1219
1220 $buttons = array(
1221 'csh' => '',
1222 'shortcut' => '',
1223 'save' => ''
1224 );
1225 // CSH
1226 //$buttons['csh'] = t3lib_BEfunc::cshItem('_MOD_web_func', '', $GLOBALS['BACK_PATH']);
1227
1228 // Shortcut
1229 if ($GLOBALS['BE_USER']->mayMakeShortcut()) {
1230 $buttons['shortcut'] = $this->doc->makeShortcutIcon('be_user_uid,compareFlags','function', $this->MCONF['name']);
1231 }
1232
1233 return $buttons;
1234 }
1235
1236
1237
1238
1239
1240 /***************************
1241 *
1242 * OTHER FUNCTIONS:
1243 *
1244 ***************************/
1245
1246 /**
1247 * Compares the users with the given flags
1248 *
1249 * @param array options that should be taking into account to compare the users
1250 * @return string the content
1251 */
1252 function compareUsers($compareFlags) {
1253 // Menu:
1254 $options = array(
1255 'filemounts' => $GLOBALS['LANG']->getLL('filemounts', true),
1256 'webmounts' => $GLOBALS['LANG']->getLL('webmounts', true),
1257 'tempPath' => $GLOBALS['LANG']->getLL('defaultUploadPath', true),
1258 'firstMainGroup' => $GLOBALS['LANG']->getLL('mainUserGroup', true),
1259 'groupList' => $GLOBALS['LANG']->getLL('memberOfGroups', true),
1260 'pagetypes_select' => $GLOBALS['LANG']->getLL('pageTypesAccess', true),
1261 'tables_select' => $GLOBALS['LANG']->getLL('selectTables', true),
1262 'tables_modify' => $GLOBALS['LANG']->getLL('modifyTables', true),
1263 'non_exclude_fields' => $GLOBALS['LANG']->getLL('nonExcludeFields', true),
1264 'explicit_allowdeny' => $GLOBALS['LANG']->getLL('explicitAllowDeny', true),
1265 'allowed_languages' => $GLOBALS['LANG']->getLL('limitToLanguages', true),
1266 'workspace_perms' => $GLOBALS['LANG']->getLL('workspacePermissions', true),
1267 'workspace_membership' => $GLOBALS['LANG']->getLL('workspaceMembership', true),
1268 'custom_options' => $GLOBALS['LANG']->getLL('customOptions', true),
1269 'modules' => $GLOBALS['LANG']->getLL('modules', true),
1270 'userTS' => $GLOBALS['LANG']->getLL('tsconfig', true),
1271 'userTS_hl' => $GLOBALS['LANG']->getLL('tsconfigHL', true),
1272 );
1273
1274 $be_user_uid = t3lib_div::_GP('be_user_uid');
1275 if ($be_user_uid) {
1276 // This is used to test with other users. Development ONLY!
1277 $tempBE_USER = t3lib_div::makeInstance('local_beUserAuth'); // New backend user object
1278 $tempBE_USER->userTS_dontGetCached=1;
1279 $tempBE_USER->OS = TYPO3_OS;
1280 $tempBE_USER->setBeUserByUid($be_user_uid);
1281 $tempBE_USER->fetchGroupData();
1282
1283 $uInfo = $tempBE_USER->ext_compileUserInfoForHash();
1284 $uInfo_dat = $tempBE_USER->ext_printOverview($uInfo,$options,1);
1285
1286 $lines=array();
1287 foreach ($options as $kk => $vv) {
1288 if ($kk=='modules') {
1289 $loadModules = t3lib_div::makeInstance('t3lib_loadModules');
1290 $loadModules->load($GLOBALS['TBE_MODULES'],$tempBE_USER);
1291 $alt_menuObj = t3lib_div::makeInstance('alt_menu_functions');
1292 $uInfo_dat[$kk] = $alt_menuObj->topMenu($loadModules->modules,1,$GLOBALS['BACK_PATH']);
1293 }
1294 $lines[]='<tr class="bgColor4">
1295 <td nowrap="nowrap" valign="top">'.$vv.':&nbsp;&nbsp;</td>
1296 <td>'.$uInfo_dat[$kk].'&nbsp;</td>
1297 </tr>';
1298
1299 if ($kk=='webmounts' && !$tempBE_USER->isAdmin()) {
1300 $lines[]='<tr class="bgColor4">
1301 <td nowrap="nowrap" valign="top">' . $GLOBALS['LANG']->getLL('nonMountedReadablePages', true) . '&nbsp;&nbsp;</td>
1302 <td>'.$tempBE_USER->ext_getReadableButNonmounted().'&nbsp;</td>
1303 </tr>';
1304 }
1305 }
1306
1307 $outTable = '<table border="0" cellpadding="1" cellspacing="1"><tr class="bgColor5"><td>'.t3lib_iconWorks::getIconImage('be_users',$tempBE_USER->user,$GLOBALS['BACK_PATH'],'class="absmiddle" title="'.$tempBE_USER->user['uid'].'"').$tempBE_USER->user['username'].'</td>';
1308 $outTable.= '<td>'.$tempBE_USER->user['realName'].($tempBE_USER->user['email'] ? ', <a href="mailto:'.$tempBE_USER->user['email'].'">'.$tempBE_USER->user['email'].'</a>' : '').'</td>';
1309 $outTable.= '<td>'.$this->elementLinks('be_users',$tempBE_USER->user).'</td></tr></table>';
1310 $outTable.= '<strong><a href="'.htmlspecialchars($this->MCONF['_']).'">' . $GLOBALS['LANG']->getLL('backToOverview', true) . '</a></strong><br />';
1311
1312 $outTable.= '<br /><table border="0" cellpadding="2" cellspacing="1">'.implode('',$lines).'</table>';
1313 $content.= $this->doc->section($GLOBALS['LANG']->getLL('userInfo', true),$outTable,0,1);
1314 } else {
1315 $menu = array(0 => array());
1316 $rowCounter = 0;
1317 $columnCounter = 0;
1318 $itemsPerColumn = ceil(count($options) / 3);
1319 foreach ($options as $kk => $vv) {
1320 if ($rowCounter == $itemsPerColumn) {
1321 $rowCounter = 0;
1322 $columnCounter++;
1323 $menu[$columnCounter] = array();
1324 }
1325 $rowCounter++;
1326 $menu[$columnCounter][]='<input type="checkbox" value="1" name="compareFlags['.$kk.']" id="checkCompare_'.$kk.'"'.($compareFlags[$kk]?' checked="checked"':'').'> <label for="checkCompare_'.$kk.'">'.htmlspecialchars($vv).'</label>';
1327 }
1328 $outCode = '<p>' . $GLOBALS['LANG']->getLL('groupBy', true) . '</p>';
1329 $outCode .= '<table border="0" cellpadding="3" cellspacing="1" class="compare-checklist valign-top"><tr>';
1330 foreach ($menu as $column) {
1331 $outCode .= '<td>' . implode('<br />', $column) . '</td>';
1332 }
1333 $outCode .= '</tr></table>';
1334 $outCode.='<br /><input type="submit" name="ads" value="' . $GLOBALS['LANG']->getLL('update', true) . '">';
1335 $content = $this->doc->section($GLOBALS['LANG']->getLL('groupAndCompareUsers', true),$outCode,0,1);
1336
1337
1338 // Traverse all users
1339 $users = t3lib_BEfunc::getUserNames();
1340 $comparation=array();
1341 $counter=0;
1342
1343
1344 $offset=0;
1345 $numberAtTime=1000;
1346 $tooManyUsers='';
1347
1348 foreach ($users as $r) {
1349 if ($counter>=$offset) {
1350 // This is used to test with other users. Development ONLY!
1351 $tempBE_USER = t3lib_div::makeInstance('local_beUserAuth'); // New backend user object
1352 /* @var $tempBE_USER local_beUserAuth */
1353 $tempBE_USER->OS = TYPO3_OS;
1354 $tempBE_USER->setBeUserByUid($r['uid']);
1355 $tempBE_USER->fetchGroupData();
1356
1357 // Making group data
1358 $md5pre='';
1359 $menu=array();
1360 $uInfo = $tempBE_USER->ext_compileUserInfoForHash((array)$compareFlags);
1361 foreach ($options as $kk => $vv) {
1362 if ($compareFlags[$kk]) {
1363 $md5pre.=serialize($uInfo[$kk]).'|';
1364 }
1365 }
1366 // setting md5:
1367 $md5=md5($md5pre);
1368 if (!isset($comparation[$md5])) {
1369 $comparation[$md5]=$tempBE_USER->ext_printOverview($uInfo,$compareFlags);
1370 $comparation[$md5]['users']=array();
1371 }
1372 $comparation[$md5]['users'][]=$tempBE_USER->user; //array('uid'=>$r['uid'],'username'=>$r['username'],'realName'=>$tempBE_USER->user['realName'],'email'=>$tempBE_USER->user['email'],'admin'=>$tempBE_USER->user['admin']);
1373 unset($tempBE_USER);
1374 }
1375 $counter++;
1376 if ($counter>=($numberAtTime+$offset)) {
1377 $tooManyUsers=$GLOBALS['LANG']->getLL('tooManyUsers', true) . ' ' . count($users) . '. ' . $GLOBALS['LANG']->getLL('canOnlyDisplay', true) . ' ' . $numberAtTime . '.';
1378 break;
1379 }
1380 }
1381
1382 // Print the groups:
1383 $allGroups=array();
1384 // Header:
1385 $allCells = array();
1386
1387 $link_createNewUser='<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick('&edit[be_users][0]=new',$this->doc->backPath,-1)).'">'.
1388 '<img' . t3lib_iconWorks::skinImg($this->doc->backPath,'gfx/new_el.gif') . ' title="' . $GLOBALS['LANG']->getLL('newUser', true) . '" alt="" />'.
1389 '</a>';
1390
1391 $allCells['USERS'] = '<table border="0" cellspacing="0" cellpadding="0" width="100%"><td><b>' . $GLOBALS['LANG']->getLL('usernames', true) . '</b></td><td width="12">' . $link_createNewUser . '</td></tr></table>';
1392
1393 foreach ($options as $kk => $vv) {
1394 if ($compareFlags[$kk]) {
1395 $allCells[$kk] = '<b>'.$vv.':</b>';
1396 }
1397 }
1398 $allGroups[]=$allCells;
1399
1400 foreach ($comparation as $dat) {
1401 $allCells = array();
1402
1403 $curUid = $GLOBALS['BE_USER']->user['uid'];
1404 $uListArr=array();
1405
1406 foreach ($dat['users'] as $uDat) {
1407 $uItem = '<tr><td width="130">' . t3lib_iconWorks::getIconImage('be_users',$uDat,$GLOBALS['BACK_PATH'],'align="top" title="' . $uDat['uid'] . '"') . $this->linkUser($uDat['username'],$uDat) . '&nbsp;&nbsp;</td><td nowrap="nowrap">' . $this->elementLinks('be_users',$uDat);
1408 if ($curUid != $uDat['uid'] && !$uDat['disable'] && ($uDat['starttime'] == 0 || $uDat['starttime'] < time()) && ($uDat['endtime'] == 0 || $uDat['endtime'] > time())) {
1409 $uItem .= '<a href="' . t3lib_div::linkThisScript(array('SwitchUser'=>$uDat['uid'])) . '" target="_top"><img ' . t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'],'gfx/su.gif') . ' border="0" align="top" title="' . htmlspecialchars($GLOBALS['LANG']->getLL('switchUserTo', true) . ' ' . $uDat['username']) . ' ' . $GLOBALS['LANG']->getLL('changeToMode', true) . '" alt="" /></a>'.
1410 '<a href="' . t3lib_div::linkThisScript(array('SwitchUser'=>$uDat['uid'], 'switchBackUser' => 1)) . '" target="_top"><img ' . t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'],'gfx/su_back.gif') . ' border="0" align="top" title="' . htmlspecialchars($GLOBALS['LANG']->getLL('switchUserTo', true) . ' ' . $uDat['username']) . ' ' . $GLOBALS['LANG']->getLL('switchBackMode', true) . '" alt="" /></a>';
1411 }
1412 $uItem .= '</td></tr>';
1413 $uListArr[] = $uItem;
1414 }
1415 $allCells['USERS'] = '<table border="0" cellspacing="0" cellpadding="0" width="100%">'.implode('',$uListArr).'</table>';
1416
1417 foreach ($options as $kk => $vv) {
1418 if ($compareFlags[$kk]) {
1419 $allCells[$kk] = $dat[$kk];
1420 }
1421 }
1422 $allGroups[]=$allCells;
1423 }
1424
1425 // Make table
1426 $outTable='';
1427 $TDparams=' nowrap="nowrap" class="bgColor5" valign="top"';
1428 $i = 0;
1429 foreach ($allGroups as $allCells) {
1430 $outTable.='<tr><td'.$TDparams.'>'.implode('</td><td'.$TDparams.'>',$allCells).'</td></tr>';
1431 $TDparams=' nowrap="nowrap" class="'.($i++ % 2 == 0 ? 'bgColor4' : 'bgColor6').'" valign="top"';
1432 }
1433 $outTable='<table border="0" cellpadding="2" cellspacing="2">' . $outTable . '</table>';
1434 $outTable.=fw('<br /><br />' . $GLOBALS['LANG']->getLL('cachedGrouplistsUpdated', true) . '');
1435 $outTable.=$tooManyUsers?'<br /><br /><strong><span class="typo3-red">' . $tooManyUsers . '</span></strong>':'';
1436 $content.= $this->doc->spacer(10);
1437 $content.= $this->doc->section($GLOBALS['LANG']->getLL('result', true),$outTable,0,1);
1438 }
1439 return $content;
1440 }
1441
1442
1443 /**
1444 * Creates a HTML anchor to the user record
1445 *
1446 * @param string the string used to identify the user (inside the <a>...</a>)
1447 * @param array the BE user record to link
1448 * @return string the HTML anchor
1449 */
1450 function linkUser($str,$rec) {
1451 return '<a href="'.htmlspecialchars($this->MCONF['_']).'&be_user_uid='.$rec['uid'].'">'.$str.'</a>';
1452 }
1453
1454
1455 /**
1456 * Builds a list of all links for a specific element (here: BE user) and returns it for print.
1457 *
1458 * @param string the db table that should be used
1459 * @param array the BE user record to use
1460 * @return string a HTML formatted list of the link
1461 */
1462 function elementLinks($table,$row) {
1463 // Info:
1464 $cells[]='<a href="#" onclick="top.launchView(\'' . $table . '\', \'' . $row['uid'] . '\',\'' . $GLOBALS['BACK_PATH'] . '\'); return false;"><img ' . t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'],'gfx/zoom2.gif') . ' border="0" align="top" title="' . $GLOBALS['LANG']->getLL('showInformation', true) . '" alt="" /></a>';
1465
1466 // Edit:
1467 $params='&edit[' . $table . '][' . $row['uid'] . ']=edit';
1468 $cells[]='<a href="#" onclick="' . t3lib_BEfunc::editOnClick($params,$GLOBALS['BACK_PATH'],'') . '"><img ' . t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'],'gfx/edit2.gif') . ' border="0" align="top" title="' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_common.xml:edit', true) . '" alt="" /></a>';
1469
1470 // Hide:
1471 $hiddenField = $GLOBALS['TCA'][$table]['ctrl']['enablecolumns']['disabled'];
1472 if ($row[$hiddenField]) {
1473 $params='&data[' . $table . '][' . $row['uid'] . '][' . $hiddenField . ']=0';
1474 $cells[]='<a href="' . $this->doc->issueCommand($params) . '"><img ' . t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'],'gfx/button_unhide.gif') . ' border="0" title="' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_common.xml:enable', true) . '" align="top" alt="" /></a>';
1475 } else {
1476 $params='&data[' . $table . '][' . $row['uid'] . '][' . $hiddenField . ']=1';
1477 $cells[]='<a href="' . $this->doc->issueCommand($params) . '"><img ' . t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'],'gfx/button_hide.gif') . ' border="0" title="' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_common.xml:disable', true) . '" align="top" alt="" /></a>';
1478 }
1479
1480 // Delete
1481 $params='&cmd[' . $table . '][' . $row['uid'] . '][delete]=1';
1482 $cells[]='<a href="' . $this->doc->issueCommand($params) . '" onclick="return confirm(unescape(\'' . rawurlencode($GLOBALS['LANG']->getLL('sureToDelete', true)) . '\'));"><img ' . t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'],'gfx/garbage.gif') . ' border="0" align="top" title="' . $GLOBALS['LANG']->getLL('delete', true) . '" alt="" /></a>';
1483
1484 return implode('',$cells);
1485 }
1486
1487
1488 /**
1489 * Inits all BE-users available, for development ONLY!
1490 *
1491 * @return void
1492 */
1493 function initUsers() {
1494 // Initializing all users in order to generate the usergroup_cached_list
1495 $users = t3lib_BEfunc::getUserNames();
1496
1497 // This is used to test with other users. Development ONLY!
1498 foreach ($users as $r) {
1499 $tempBE_USER = t3lib_div::makeInstance('local_beUserAuth'); // New backend user object
1500 /* @var $tempBE_USER local_beUserAuth */
1501 $tempBE_USER->OS = TYPO3_OS;
1502 $tempBE_USER->setBeUserByUid($r['uid']);
1503 $tempBE_USER->fetchGroupData();
1504 }
1505 }
1506
1507 /**
1508 * Returns the local path for this string (removes the PATH_site if it is included)
1509 *
1510 * @param string the path that will be checked
1511 * @return string the local path
1512 */
1513 function localPath($str) {
1514 if (substr($str,0,strlen(PATH_site))==PATH_site) {
1515 return substr($str,strlen(PATH_site));
1516 } else {
1517 return $str;
1518 }
1519 }
1520
1521 /**
1522 * Switches to a given user (SU-mode) and then redirects to the start page of the backend to refresh the navigation etc.
1523 *
1524 * @param array BE-user record that will be switched to
1525 * @return void
1526 */
1527 function switchUser($switchUser) {
1528 $uRec=t3lib_BEfunc::getRecord('be_users',$switchUser);
1529 if (is_array($uRec) && $GLOBALS['BE_USER']->isAdmin()) {
1530 $updateData['ses_userid'] = $uRec['uid'];
1531 // user switchback
1532 if (t3lib_div::_GP('switchBackUser')) {
1533 $updateData['ses_backuserid'] = intval($GLOBALS['BE_USER']->user['uid']);
1534 }
1535 $GLOBALS['TYPO3_DB']->exec_UPDATEquery('be_sessions', 'ses_id='.$GLOBALS['TYPO3_DB']->fullQuoteStr($GLOBALS['BE_USER']->id, 'be_sessions').' AND ses_name=\'be_typo_user\' AND ses_userid='.intval($GLOBALS['BE_USER']->user['uid']),$updateData);
1536
1537 header('Location: '.t3lib_div::locationHeaderUrl($GLOBALS['BACK_PATH'].'index.php'.($GLOBALS['TYPO3_CONF_VARS']['BE']['interfaces']?'':'?commandLI=1')));
1538 exit;
1539 }
1540 }
1541
1542 /***************************
1543 *
1544 * "WHO IS ONLINE" FUNCTIONS:
1545 *
1546 ***************************/
1547
1548 /**
1549 * @author Martin Kutschker
1550 */
1551 function whoIsOnline() {
1552 $select_fields = 'ses_id, ses_tstamp, ses_iplock, u.uid,u.username, u.admin, u.realName, u.disable, u.starttime, u.endtime, u.deleted, bu.uid AS bu_uid,bu.username AS bu_username, bu.realName AS bu_realName';
1553 $from_table = '(be_sessions, be_users u) LEFT OUTER JOIN be_users bu ON (ses_backuserid=bu.uid)';
1554 $where_clause = 'ses_userid=u.uid';
1555 $orderBy = 'u.username';
1556
1557 if (t3lib_div::testInt($GLOBALS['TYPO3_CONF_VARS']['BE']['sessionTimeout'])) {
1558 $where_clause .= ' AND '.$GLOBALS['EXEC_TIME'].'<(ses_tstamp+'.$GLOBALS['TYPO3_CONF_VARS']['BE']['sessionTimeout'].')';
1559 } else {
1560 $timeout = intval($GLOBALS['TYPO3_CONF_VARS']['BE']['sessionTimeout']);
1561 if ($timeout > 0) {
1562 $where_clause .= ' AND '.$GLOBALS['EXEC_TIME'].'<(ses_tstamp+'.$timeout.')';
1563 }
1564 }
1565 // Fetch active sessions of other users from storage:
1566 $sessions = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows($select_fields,$from_table,$where_clause,'',$orderBy);
1567 // Process and visualized each active session as a table row:
1568 if (is_array($sessions)) {
1569 foreach ($sessions as $session) {
1570 $ip = $session['ses_iplock'];
1571 $hostName = '';
1572 if ($session['ses_iplock'] == '[DISABLED]' || $GLOBALS['TYPO3_CONF_VARS']['BE']['lockIP'] == 0) {
1573 $ip = '-';
1574 } elseif ($GLOBALS['TYPO3_CONF_VARS']['BE']['lockIP'] == 4) {
1575 $hostName = ' title="' . @gethostbyaddr($session['ses_iplock']) . '"';
1576 } else {
1577 $ip .= str_repeat('.*', 4-$GLOBALS['TYPO3_CONF_VARS']['BE']['lockIP']);
1578 }
1579 $outTable .= '
1580 <tr class="bgColor4" height="17" valign="top">' .
1581 '<td nowrap="nowrap">' .
1582 date($GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'].' '.$GLOBALS['TYPO3_CONF_VARS']['SYS']['hhmm'], $session['ses_tstamp']) .
1583 '</td>' .
1584 '<td nowrap="nowrap">' .
1585 '<span'.$hostName.'>'.$ip.'</span>' .
1586 '</td>' .
1587 '<td width="130">' .
1588 t3lib_iconWorks::getIconImage('be_users',$session,$GLOBALS['BACK_PATH'],'align="top" title="'.$session['uid'].'"').htmlspecialchars($session['username']).'&nbsp;' .
1589 '</td>' .
1590 '<td nowrap="nowrap">'.htmlspecialchars($session['realName']).'&nbsp;&nbsp;</td>' .
1591 '<td nowrap="nowrap">'.$this->elementLinks('be_users',$session).'</td>' .
1592 '<td nowrap="nowrap" valign="top">'.($session['bu_username'] ? '&nbsp;SU from: ' : '').htmlspecialchars($session['bu_username']).'&nbsp;</td>' .
1593 '<td nowrap="nowrap" valign="top">&nbsp;'.htmlspecialchars($session['bu_realName']).'</td>' .
1594 '</tr>';
1595 }
1596 }
1597 // Wrap <table> tag around the rows:
1598 $outTable = '
1599 <table border="0" cellpadding="2" cellspacing="2">
1600 <tr class="bgColor5">
1601 <td valign="top"><b>' . $GLOBALS['LANG']->getLL('timestamp', true) . '</b></td>
1602 <td valign="top"><b>' . $GLOBALS['LANG']->getLL('host', true) . '</b></td>
1603 <td valign="top" colspan="5"><b>' . $GLOBALS['LANG']->getLL('username', true) . '</b></td>
1604 </tr>'.$outTable.'
1605 </table>';
1606
1607 $content.= $this->doc->section($GLOBALS['LANG']->getLL('whoIsOnline', true),$outTable,0,1);
1608 return $content;
1609 }
1610
1611 }
1612
1613 // Include extension?
1614 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/beuser/mod/index.php']) {
1615 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/beuser/mod/index.php']);
1616 }
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629 // Make instance:
1630 $SOBE = t3lib_div::makeInstance('SC_mod_tools_be_user_index');
1631 $SOBE->init();
1632 $SOBE->main();
1633 $SOBE->printContent();
1634
1635 ?>