2 /***************************************************************
5 * (c) 1999-2005 Kasper Skaarhoj (kasperYYYY@typo3.com)
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.
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.
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.
25 * This copyright notice MUST APPEAR in all copies of the script!
26 ***************************************************************/
28 * Class for TYPO3 backend user authentication in the TSFE frontend
31 * Revised for TYPO3 3.6 July/2003 by Kasper Skaarhoj
34 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
37 * [CLASS/FUNCTION INDEX of SCRIPT]
41 * 103: class t3lib_tsfeBeUserAuth extends t3lib_beUserAuth
42 * 129: function extInitFeAdmin()
43 * 154: function extPrintFeAdminDialog()
45 * SECTION: Creating sections of the Admin Panel
46 * 249: function extGetCategory_preview($out='')
47 * 282: function extGetCategory_cache($out='')
48 * 320: function extGetCategory_publish($out='')
49 * 355: function extGetCategory_edit($out='')
50 * 399: function extGetCategory_tsdebug($out='')
51 * 429: function extGetCategory_info($out='')
53 * SECTION: Admin Panel Layout Helper functions
54 * 502: function extGetHead($pre)
55 * 522: function extItemLink($pre,$str)
56 * 538: function extGetItem($pre,$element)
57 * 555: function extFw($str)
58 * 564: function ext_makeToolBar()
60 * SECTION: TSFE BE user Access Functions
61 * 622: function checkBackendAccessSettingsFromInitPhp()
62 * 667: function extPageReadAccess($pageRec)
63 * 678: function extAdmModuleEnabled($key)
64 * 694: function extSaveFeAdminConfig()
65 * 726: function extGetFeAdminValue($pre,$val='')
66 * 759: function extIsAdmMenuOpen($pre)
68 * SECTION: TSFE BE user Access Functions
69 * 794: function extGetTreeList($id,$depth,$begin=0,$perms_clause)
70 * 825: function extGetNumberOfCachedPages($page_id)
72 * SECTION: Localization handling
73 * 864: function extGetLL($key)
75 * SECTION: Frontend Editing
76 * 908: function extIsEditAction()
77 * 926: function extIsFormShown()
78 * 942: function extEditAction()
81 * (This index is automatically created/updated by the extension "extdeveval")
96 * TYPO3 backend user authentication in the TSFE frontend.
97 * This includes mainly functions related to the Admin Panel
99 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
103 class t3lib_tsfeBeUserAuth
extends t3lib_beUserAuth
{
104 var $formfield_uname = ''; // formfield with login-name
105 var $formfield_uident = ''; // formfield with password
106 var $formfield_chalvalue = ''; // formfield with a unique value which is used to encrypt the password and username
107 var $security_level = ''; // sets the level of security. *'normal' = clear-text. 'challenged' = hashed password/username from form in $formfield_uident. 'superchallenged' = hashed password hashed again with username.
108 var $writeStdLog = 0; // Decides if the writelog() function is called at login and logout
109 var $writeAttemptLog = 0; // If the writelog() functions is called if a login-attempt has be tried without success
110 var $auth_include = ''; // this is the name of the include-file containing the login form. If not set, login CAN be anonymous. If set login IS needed.
112 var $extNeedUpdate=0;
113 var $extPublishList='';
114 var $extPageInTreeInfo=array();
115 var $ext_forcePreview=0;
116 var $langSplitIndex=0;
117 var $extAdmEnabled = 0; // General flag which is set if the adminpanel should be displayed at all..
123 * Initialize the usage of Admin Panel.
124 * Called from index_ts.php if a backend users is correctly logged in.
125 * Sets $this->extAdminConfig to the "admPanel" config for the user and $this->extAdmEnabled = 1 IF access is enabled.
129 function extInitFeAdmin() {
130 $this->extAdminConfig
= $this->getTSConfigProp('admPanel');
131 if (is_array($this->extAdminConfig
['enable.'])) {
132 reset($this->extAdminConfig
['enable.']);
133 while(list($k,$v)=each($this->extAdminConfig
['enable.'])) {
135 $this->extAdmEnabled
=1; // Enable panel
141 // Init TSFE_EDIT variables if either the admPanel is enabled or if forceDisplayIcons is set
142 if($this->extAdmEnabled ||
$this->extGetFeAdminValue('edit', 'displayIcons')) {
143 $this->TSFE_EDIT
= t3lib_div
::_POST('TSFE_EDIT');
148 * Creates and returns the HTML code for the Admin Panel in the TSFE frontend.
149 * Called from index_ts.php - in the end of the script
151 * @return string HTML for the Admin Panel
154 function extPrintFeAdminDialog() {
156 if ($this->uc
['TSFE_adminConfig']['display_top']) {
157 if ($this->extAdmModuleEnabled('preview')) $out.= $this->extGetCategory_preview();
158 if ($this->extAdmModuleEnabled('cache')) $out.= $this->extGetCategory_cache();
159 if ($this->extAdmModuleEnabled('publish')) $out.= $this->extGetCategory_publish();
160 if ($this->extAdmModuleEnabled('edit')) $out.= $this->extGetCategory_edit();
161 if ($this->extAdmModuleEnabled('tsdebug')) $out.= $this->extGetCategory_tsdebug();
162 if ($this->extAdmModuleEnabled('info')) $out.= $this->extGetCategory_info();
166 <tr class="typo3-adminPanel-hRow" bgcolor="#9BA1A8">
167 <td colspan="2" nowrap="nowrap">'.
168 $this->extItemLink('top','<img src="t3lib/gfx/ol/'.($this->uc
['TSFE_adminConfig']['display_top']?
'minus':'plus').'bullet.gif" width="18" height="16" align="absmiddle" border="0" alt="" /><strong>'.$this->extFw($this->extGetLL('adminOptions')).'</strong>').
169 $this->extFw(': '.$this->user
['username']).
171 <td><img src="clear.gif" width="10" height="1" alt="" /></td>
172 <td><input type="hidden" name="TSFE_ADMIN_PANEL[display_top]" value="'.$this->uc
['TSFE_adminConfig']['display_top'].'" />'.($this->extNeedUpdate?
'<input type="submit" value="'.$this->extGetLL('update').'" />':'').'</td>
179 <a name="TSFE_ADMIN"></a>
180 <form name="TSFE_ADMIN_PANEL_FORM" action="'.htmlspecialchars(t3lib_div
::getIndpEnv('REQUEST_URI')).'#TSFE_ADMIN" method="post" style="margin: 0 0 0 0;">
181 <table border="0" cellpadding="0" cellspacing="0" class="typo3-adminPanel" bgcolor="#F6F2E6" style="border: 1px solid black; z-index:0; position:absolute;">'.
186 if ($this->uc
['TSFE_adminConfig']['display_top']) {
187 $out.='<script type="text/javascript" src="t3lib/jsfunc.evalfield.js"></script>';
189 <script type="text/javascript">
191 var evalFunc = new evalFunc();
192 // TSFEtypo3FormFieldSet()
193 function TSFEtypo3FormFieldSet(theField, evallist, is_in, checkbox, checkboxValue) { //
194 var theFObj = new evalFunc_dummy (evallist,is_in, checkbox, checkboxValue);
195 var theValue = document.TSFE_ADMIN_PANEL_FORM[theField].value;
196 if (checkbox && theValue==checkboxValue) {
197 document.TSFE_ADMIN_PANEL_FORM[theField+"_hr"].value="";
198 document.TSFE_ADMIN_PANEL_FORM[theField+"_cb"].checked = "";
200 document.TSFE_ADMIN_PANEL_FORM[theField+"_hr"].value = evalFunc.outputObjValue(theFObj, theValue);
201 document.TSFE_ADMIN_PANEL_FORM[theField+"_cb"].checked = "on";
204 // TSFEtypo3FormFieldGet()
205 function TSFEtypo3FormFieldGet(theField, evallist, is_in, checkbox, checkboxValue, checkbox_off) { //
206 var theFObj = new evalFunc_dummy (evallist,is_in, checkbox, checkboxValue);
208 document.TSFE_ADMIN_PANEL_FORM[theField].value=checkboxValue;
210 document.TSFE_ADMIN_PANEL_FORM[theField].value = evalFunc.evalObjValue(theFObj, document.TSFE_ADMIN_PANEL_FORM[theField+"_hr"].value);
212 TSFEtypo3FormFieldSet(theField, evallist, is_in, checkbox, checkboxValue);
216 <script language="javascript" type="text/javascript">'.$this->extJSCODE
.'</script>';
218 return "\n\n\n\n".$out.'<br />';
236 /*****************************************************
238 * Creating sections of the Admin Panel
240 ****************************************************/
243 * Creates the content for the "preview" section ("module") of the Admin Panel
245 * @param string Optional start-value; The generated content is added to this variable.
246 * @return string HTML content for the section. Consists of a string with table-rows with four columns.
247 * @see extPrintFeAdminDialog()
249 function extGetCategory_preview($out='') {
250 $out.=$this->extGetHead('preview');
251 if ($this->uc
['TSFE_adminConfig']['display_preview']) {
252 $this->extNeedUpdate
= 1;
253 $out.= $this->extGetItem('preview_showHiddenPages', '<input type="hidden" name="TSFE_ADMIN_PANEL[preview_showHiddenPages]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[preview_showHiddenPages]" value="1"'.($this->uc
['TSFE_adminConfig']['preview_showHiddenPages']?
' checked="checked"':'').' />');
254 $out.= $this->extGetItem('preview_showHiddenRecords', '<input type="hidden" name="TSFE_ADMIN_PANEL[preview_showHiddenRecords]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[preview_showHiddenRecords]" value="1"'.($this->uc
['TSFE_adminConfig']['preview_showHiddenRecords']?
' checked="checked"':'').' />');
257 $out.= $this->extGetItem('preview_simulateDate', '<input type="checkbox" name="TSFE_ADMIN_PANEL[preview_simulateDate]_cb" onclick="TSFEtypo3FormFieldGet(\'TSFE_ADMIN_PANEL[preview_simulateDate]\', \'datetime\', \'\',1,0,1);" /><input type="text" name="TSFE_ADMIN_PANEL[preview_simulateDate]_hr" onchange="TSFEtypo3FormFieldGet(\'TSFE_ADMIN_PANEL[preview_simulateDate]\', \'datetime\', \'\', 1,0);" /><input type="hidden" name="TSFE_ADMIN_PANEL[preview_simulateDate]" value="'.$this->uc
['TSFE_adminConfig']['preview_simulateDate'].'" />');
258 $this->extJSCODE
.= 'TSFEtypo3FormFieldSet("TSFE_ADMIN_PANEL[preview_simulateDate]", "datetime", "", 1,0);';
261 $options = '<option value="0"></option>';
262 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
263 'fe_groups.uid, fe_groups.title',
265 'pages.uid=fe_groups.pid AND pages.deleted=0 '.t3lib_BEfunc
::deleteClause('fe_groups').' AND '.$this->getPagePermsClause(1)
267 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
268 $options.= '<option value="'.$row['uid'].'"'.($this->uc
['TSFE_adminConfig']['preview_simulateUserGroup']==$row['uid']?
' selected="selected"':'').'>'.htmlspecialchars('['.$row['uid'].'] '.$row['title']).'</option>';
270 $out.= $this->extGetItem('preview_simulateUserGroup', '<select name="TSFE_ADMIN_PANEL[preview_simulateUserGroup]">'.$options.'</select>');
276 * Creates the content for the "cache" section ("module") of the Admin Panel
278 * @param string Optional start-value; The generated content is added to this variable.
279 * @return string HTML content for the section. Consists of a string with table-rows with four columns.
280 * @see extPrintFeAdminDialog()
282 function extGetCategory_cache($out='') {
283 $out.=$this->extGetHead('cache');
284 if ($this->uc
['TSFE_adminConfig']['display_cache']) {
285 $this->extNeedUpdate
=1;
286 $out.=$this->extGetItem('cache_noCache', '<input type="hidden" name="TSFE_ADMIN_PANEL[cache_noCache]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[cache_noCache]" value="1"'.($this->uc
['TSFE_adminConfig']['cache_noCache']?
' checked="checked"':'').' />');
289 $options.='<option value="0"'.($this->uc
['TSFE_adminConfig']['cache_clearCacheLevels']==0?
' selected="selected"':'').'>'.$this->extGetLL('div_Levels_0').'</option>';
290 $options.='<option value="1"'.($this->uc
['TSFE_adminConfig']['cache_clearCacheLevels']==1?
' selected="selected"':'').'>'.$this->extGetLL('div_Levels_1').'</option>';
291 $options.='<option value="2"'.($this->uc
['TSFE_adminConfig']['cache_clearCacheLevels']==2?
' selected="selected"':'').'>'.$this->extGetLL('div_Levels_2').'</option>';
292 $out.=$this->extGetItem('cache_clearLevels', '<select name="TSFE_ADMIN_PANEL[cache_clearCacheLevels]">'.$options.'</select>'.
293 '<input type="hidden" name="TSFE_ADMIN_PANEL[cache_clearCacheId]" value="'.$GLOBALS['TSFE']->id
.'" /><input type="submit" value="'.$this->extGetLL('update').'" />');
296 $depth=$this->extGetFeAdminValue('cache','clearCacheLevels');
298 $this->extPageInTreeInfo
=array();
299 $this->extPageInTreeInfo
[]=array($GLOBALS['TSFE']->page
['uid'],$GLOBALS['TSFE']->page
['title'],$depth+
1);
300 $this->extGetTreeList($GLOBALS['TSFE']->id
, $depth,0,$this->getPagePermsClause(1));
301 reset($this->extPageInTreeInfo
);
302 while(list(,$row)=each($this->extPageInTreeInfo
)) {
303 $outTable.='<tr><td nowrap="nowrap"><img src="clear.gif" width="'.(($depth+
1-$row[2])*18).'" height="1" alt="" /><img src="t3lib/gfx/i/pages.gif" width="18" height="16" align="absmiddle" border="0" alt="" />'.$this->extFw($row[1]).'</td><td><img src="clear.gif" width="10" height="1" alt="" /></td><td>'.$this->extFw($this->extGetNumberOfCachedPages($row[0])).'</td></tr>';
305 $outTable='<br /><table border="0" cellpadding="0" cellspacing="0">'.$outTable.'</table>';
306 $outTable.='<input type="submit" name="TSFE_ADMIN_PANEL[action][clearCache]" value="'.$this->extGetLL('cache_doit').'" />';
307 $out.=$this->extGetItem('cache_cacheEntries', $outTable);
314 * Creates the content for the "publish" section ("module") of the Admin Panel
316 * @param string Optional start-value; The generated content is added to this variable.
317 * @return string HTML content for the section. Consists of a string with table-rows with four columns.
318 * @see extPrintFeAdminDialog()
320 function extGetCategory_publish($out='') {
321 $out.=$this->extGetHead('publish');
322 if ($this->uc
['TSFE_adminConfig']['display_publish']) {
323 $this->extNeedUpdate
=1;
325 $options.='<option value="0"'.($this->uc
['TSFE_adminConfig']['publish_levels']==0?
' selected="selected"':'').'>'.$this->extGetLL('div_Levels_0').'</option>';
326 $options.='<option value="1"'.($this->uc
['TSFE_adminConfig']['publish_levels']==1?
' selected="selected"':'').'>'.$this->extGetLL('div_Levels_1').'</option>';
327 $options.='<option value="2"'.($this->uc
['TSFE_adminConfig']['publish_levels']==2?
' selected="selected"':'').'>'.$this->extGetLL('div_Levels_2').'</option>';
328 $out.=$this->extGetItem('publish_levels', '<select name="TSFE_ADMIN_PANEL[publish_levels]">'.$options.'</select>'.
329 '<input type="hidden" name="TSFE_ADMIN_PANEL[publish_id]" value="'.$GLOBALS['TSFE']->id
.'" /><input type="submit" value="'.$this->extGetLL('update').'" />');
332 $depth=$this->extGetFeAdminValue('publish','levels');
334 $this->extPageInTreeInfo
=array();
335 $this->extPageInTreeInfo
[]=array($GLOBALS['TSFE']->page
['uid'],$GLOBALS['TSFE']->page
['title'],$depth+
1);
336 $this->extGetTreeList($GLOBALS['TSFE']->id
, $depth,0,$this->getPagePermsClause(1));
337 reset($this->extPageInTreeInfo
);
338 while(list(,$row)=each($this->extPageInTreeInfo
)) {
339 $outTable.='<tr><td nowrap="nowrap"><img src="clear.gif" width="'.(($depth+
1-$row[2])*18).'" height="1" alt="" /><img src="t3lib/gfx/i/pages.gif" width="18" height="16" align="absmiddle" border="0" alt="" />'.$this->extFw($row[1]).'</td><td><img src="clear.gif" width="10" height="1" alt="" /></td><td>'.$this->extFw('...').'</td></tr>';
341 $outTable='<br /><table border="0" cellpadding="0" cellspacing="0">'.$outTable.'</table>';
342 $outTable.='<input type="submit" name="TSFE_ADMIN_PANEL[action][publish]" value="'.$this->extGetLL('publish_doit').'" />';
343 $out.=$this->extGetItem('publish_tree', $outTable);
349 * Creates the content for the "edit" section ("module") of the Admin Panel
351 * @param string Optional start-value; The generated content is added to this variable.
352 * @return string HTML content for the section. Consists of a string with table-rows with four columns.
353 * @see extPrintFeAdminDialog()
355 function extGetCategory_edit($out='') {
356 $out.=$this->extGetHead('edit');
357 if ($this->uc
['TSFE_adminConfig']['display_edit']) {
359 // If another page module was specified, replace the default Page module with the new one
360 $newPageModule = trim($GLOBALS['BE_USER']->getTSConfigVal('options.overridePageModule'));
361 $pageModule = t3lib_BEfunc
::isModuleSetInTBE_MODULES($newPageModule) ?
$newPageModule : 'web_layout';
363 $this->extNeedUpdate
=1;
364 $out.=$this->extGetItem('edit_displayFieldIcons', '<input type="hidden" name="TSFE_ADMIN_PANEL[edit_displayFieldIcons]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[edit_displayFieldIcons]" value="1"'.($this->uc
['TSFE_adminConfig']['edit_displayFieldIcons']?
' checked="checked"':'').' />');
365 $out.=$this->extGetItem('edit_displayIcons', '<input type="hidden" name="TSFE_ADMIN_PANEL[edit_displayIcons]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[edit_displayIcons]" value="1"'.($this->uc
['TSFE_adminConfig']['edit_displayIcons']?
' checked="checked"':'').' />');
366 $out.=$this->extGetItem('edit_editFormsOnPage', '<input type="hidden" name="TSFE_ADMIN_PANEL[edit_editFormsOnPage]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[edit_editFormsOnPage]" value="1"'.($this->uc
['TSFE_adminConfig']['edit_editFormsOnPage']?
' checked="checked"':'').' />');
367 $out.=$this->extGetItem('edit_editNoPopup', '<input type="hidden" name="TSFE_ADMIN_PANEL[edit_editNoPopup]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[edit_editNoPopup]" value="1"'.($this->uc
['TSFE_adminConfig']['edit_editNoPopup']?
' checked="checked"':'').' />');
369 $out.=$this->extGetItem('', $this->ext_makeToolBar());
370 if (!t3lib_div
::_GP('ADMCMD_view')) {
371 $out.=$this->extGetItem('', '<a href="#" onclick="'.
373 if (parent.opener && parent.opener.top && parent.opener.top.TS) {
374 parent.opener.top.fsMod.recentIds["web"]='.intval($GLOBALS['TSFE']->page
['uid']).';
375 if (parent.opener.top.content && parent.opener.top.content.nav_frame && parent.opener.top.content.nav_frame.refresh_nav) {
376 parent.opener.top.content.nav_frame.refresh_nav();
378 parent.opener.top.goToModule("'.$pageModule.'");
379 parent.opener.top.focus();
381 vHWin=window.open(\''.TYPO3_mainDir
.'alt_main.php\',\''.md5('Typo3Backend-'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']).'\',\'status=1,menubar=1,scrollbars=1,resizable=1\');
386 '">'.$this->extFw($this->extGetLL('edit_openAB')).'</a>');
393 * Creates the content for the "tsdebug" section ("module") of the Admin Panel
395 * @param string Optional start-value; The generated content is added to this variable.
396 * @return string HTML content for the section. Consists of a string with table-rows with four columns.
397 * @see extPrintFeAdminDialog()
399 function extGetCategory_tsdebug($out='') {
400 $out.=$this->extGetHead('tsdebug');
401 if ($this->uc
['TSFE_adminConfig']['display_tsdebug']) {
402 $this->extNeedUpdate
=1;
403 $out.=$this->extGetItem('tsdebug_tree', '<input type="hidden" name="TSFE_ADMIN_PANEL[tsdebug_tree]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[tsdebug_tree]" value="1"'.($this->uc
['TSFE_adminConfig']['tsdebug_tree']?
' checked="checked"':'').' />');
404 $out.=$this->extGetItem('tsdebug_displayTimes', '<input type="hidden" name="TSFE_ADMIN_PANEL[tsdebug_displayTimes]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[tsdebug_displayTimes]" value="1"'.($this->uc
['TSFE_adminConfig']['tsdebug_displayTimes']?
' checked="checked"':'').' />');
405 $out.=$this->extGetItem('tsdebug_displayMessages', '<input type="hidden" name="TSFE_ADMIN_PANEL[tsdebug_displayMessages]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[tsdebug_displayMessages]" value="1"'.($this->uc
['TSFE_adminConfig']['tsdebug_displayMessages']?
' checked="checked"':'').' />');
406 $out.=$this->extGetItem('tsdebug_LR', '<input type="hidden" name="TSFE_ADMIN_PANEL[tsdebug_LR]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[tsdebug_LR]" value="1"'.($this->uc
['TSFE_adminConfig']['tsdebug_LR']?
' checked="checked"':'').' />');
407 $out.=$this->extGetItem('tsdebug_displayContent', '<input type="hidden" name="TSFE_ADMIN_PANEL[tsdebug_displayContent]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[tsdebug_displayContent]" value="1"'.($this->uc
['TSFE_adminConfig']['tsdebug_displayContent']?
' checked="checked"':'').' />');
408 $out.=$this->extGetItem('tsdebug_displayQueries', '<input type="hidden" name="TSFE_ADMIN_PANEL[tsdebug_displayQueries]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[tsdebug_displayQueries]" value="1"'.($this->uc
['TSFE_adminConfig']['tsdebug_displayQueries']?
' checked="checked"':'').' />');
410 $out.=$this->extGetItem('tsdebug_forceTemplateParsing', '<input type="hidden" name="TSFE_ADMIN_PANEL[tsdebug_forceTemplateParsing]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[tsdebug_forceTemplateParsing]" value="1"'.($this->uc
['TSFE_adminConfig']['tsdebug_forceTemplateParsing']?
' checked="checked"':'').' />');
412 $GLOBALS['TT']->printConf
['flag_tree'] = $this->extGetFeAdminValue('tsdebug','tree');
413 $GLOBALS['TT']->printConf
['allTime'] = $this->extGetFeAdminValue('tsdebug','displayTimes');
414 $GLOBALS['TT']->printConf
['flag_messages'] = $this->extGetFeAdminValue('tsdebug','displayMessages');
415 $GLOBALS['TT']->printConf
['flag_content'] = $this->extGetFeAdminValue('tsdebug','displayContent');
416 $GLOBALS['TT']->printConf
['flag_queries'] = $this->extGetFeAdminValue('tsdebug','displayQueries');
417 $out.='<tr><td><img src="clear.gif" width="50" height="1" alt="" /></td><td colspan="3">'.$GLOBALS['TT']->printTSlog().'</td></tr>';
423 * Creates the content for the "info" section ("module") of the Admin Panel
425 * @param string Optional start-value; The generated content is added to this variable.
426 * @return string HTML content for the section. Consists of a string with table-rows with four columns.
427 * @see extPrintFeAdminDialog()
429 function extGetCategory_info($out='') {
430 $out.=$this->extGetHead('info');
431 if ($this->uc
['TSFE_adminConfig']['display_info']) {
433 if (is_array($GLOBALS['TSFE']->imagesOnPage
) && $this->extGetFeAdminValue('cache','noCache')) {
434 reset($GLOBALS['TSFE']->imagesOnPage
);
438 while(list(,$file)=each($GLOBALS['TSFE']->imagesOnPage
)) {
439 $fs=@filesize
($file);
440 $fileTable.='<tr><td>'.$this->extFw($file).'</td><td align="right">'.$this->extFw(t3lib_div
::formatSize($fs)).'</td></tr>';
444 $fileTable.='<tr><td><strong>'.$this->extFw('Total number of images:').'</strong></td><td>'.$this->extFw($count).'</td></tr>';
445 $fileTable.='<tr><td><strong>'.$this->extFw('Total image file sizes:').'</strong></td><td align="right">'.$this->extFw(t3lib_div
::formatSize($theBytes)).'</td></tr>';
446 $fileTable.='<tr><td><strong>'.$this->extFw('Document size:').'</strong></td><td align="right">'.$this->extFw(t3lib_div
::formatSize(strlen($GLOBALS['TSFE']->content
))).'</td></tr>';
447 $fileTable.='<tr><td><strong>'.$this->extFw('Total page load:').'</strong></td><td align="right">'.$this->extFw(t3lib_div
::formatSize(strlen($GLOBALS['TSFE']->content
)+
$theBytes)).'</td></tr>';
448 $fileTable.='<tr><td> </td></tr>';
451 $fileTable.='<tr><td>'.$this->extFw('id:').'</td><td>'.$this->extFw($GLOBALS['TSFE']->id
).'</td></tr>';
452 $fileTable.='<tr><td>'.$this->extFw('type:').'</td><td>'.$this->extFw($GLOBALS['TSFE']->type
).'</td></tr>';
453 $fileTable.='<tr><td>'.$this->extFw('gr_list:').'</td><td>'.$this->extFw($GLOBALS['TSFE']->gr_list
).'</td></tr>';
454 $fileTable.='<tr><td>'.$this->extFw('no_cache:').'</td><td>'.$this->extFw($GLOBALS['TSFE']->no_cache
).'</td></tr>';
455 $fileTable.='<tr><td>'.$this->extFw('fe_user, name:').'</td><td>'.$this->extFw($GLOBALS['TSFE']->fe_user
->user
['username']).'</td></tr>';
456 $fileTable.='<tr><td>'.$this->extFw('fe_user, uid:').'</td><td>'.$this->extFw($GLOBALS['TSFE']->fe_user
->user
['uid']).'</td></tr>';
457 $fileTable.='<tr><td> </td></tr>';
460 $fileTable.='<tr><td>'.$this->extFw('Total parsetime:').'</td><td>'.$this->extFw($GLOBALS['TSFE']->scriptParseTime
.' ms').'</td></tr>';
462 $fileTable='<table border="0" cellpadding="0" cellspacing="0">'.$fileTable.'</table>';
464 $out.='<tr><td><img src="clear.gif" width="50" height="1" alt="" /></td><td colspan="3">'.$fileTable.'</td></tr>';
486 /*****************************************************
488 * Admin Panel Layout Helper functions
490 ****************************************************/
493 * Returns a row (with colspan=4) which is a header for a section in the Admin Panel.
494 * It will have a plus/minus icon and a label which is linked so that it submits the form which surrounds the whole Admin Panel when clicked, alterting the TSFE_ADMIN_PANEL[display_'.$pre.'] value
495 * See the functions extGetCategory_*
497 * @param string The suffix to the display_ label. Also selects the label from the LOCAL_LANG array.
498 * @return string HTML table row.
502 function extGetHead($pre) {
503 $out.='<img src="t3lib/gfx/ol/blank.gif" width="18" height="16" align="absmiddle" border="0" alt="" />';
504 $out.='<img src="t3lib/gfx/ol/'.($this->uc
['TSFE_adminConfig']['display_'.$pre]?
'minus':'plus').'bullet.gif" width="18" height="16" align="absmiddle" border="0" alt="" />';
505 $out.=$this->extFw($this->extGetLL($pre));
506 $out=$this->extItemLink($pre,$out);
508 <tr class="typo3-adminPanel-itemHRow" bgcolor="#ABBBB4">
509 <td colspan="4" nowrap="nowrap">'.$out.'<input type="hidden" name="TSFE_ADMIN_PANEL[display_'.$pre.']" value="'.$this->uc
['TSFE_adminConfig']['display_'.$pre].'" /></td>
514 * Wraps a string in a link which will open/close a certain part of the Admin Panel
516 * @param string The code for the display_ label/key
517 * @param string Input string
518 * @return string Linked input string
522 function extItemLink($pre,$str) {
523 return '<a href="#" onclick="'.
524 htmlspecialchars('document.TSFE_ADMIN_PANEL_FORM[\'TSFE_ADMIN_PANEL[display_'.$pre.']\'].value='.($this->uc
['TSFE_adminConfig']['display_'.$pre]?
'0':'1').'; document.TSFE_ADMIN_PANEL_FORM.submit(); return false;').
529 * Returns a row (with 4 columns) for content in a section of the Admin Panel.
530 * It will take $pre as a key to a label to display and $element as the content to put into the forth cell.
532 * @param string Key to label
533 * @param string The HTML content for the forth table cell.
534 * @return string HTML table row.
538 function extGetItem($pre,$element) {
540 <tr class="typo3-adminPanel-itemRow">
541 <td><img src="clear.gif" width="50" height="1" alt="" /></td>
542 <td nowrap="nowrap">'.($pre ?
$this->extFw($this->extGetLL($pre)) : ' ').'</td>
543 <td><img src="clear.gif" width="10" height="1" alt="" /></td>
544 <td>'.$element.'</td>
550 * Wraps a string in a font-tag with verdana, size 1 and black
552 * @param string The string to wrap
555 function extFw($str) {
556 return '<font face="verdana,arial" size="1" color="black">'.$str.'</font>';
560 * Creates the tool bar links for the "edit" section of the Admin Panel.
562 * @return string A string containing images wrapped in <a>-tags linking them to proper functions.
564 function ext_makeToolBar() {
565 // If mod.web_list.newContentWiz.overrideWithExtension is set, use that extension's create new content wizard instead:
566 $tmpTSc = t3lib_BEfunc
::getModTSconfig($this->pageinfo
['uid'],'mod.web_list');
567 $tmpTSc = $tmpTSc ['properties']['newContentWiz.']['overrideWithExtension'];
568 $newContentWizScriptPath = t3lib_extMgm
::isLoaded($tmpTSc) ?
(t3lib_extMgm
::extRelPath($tmpTSc).'mod1/db_new_content_el.php') : (TYPO3_mainDir
.'sysext/cms/layout/db_new_content_el.php');
571 $id = $GLOBALS['TSFE']->id
;
572 $toolBar.='<a href="'.htmlspecialchars(TYPO3_mainDir
.'show_rechis.php?element='.rawurlencode('pages:'.$id).'&returnUrl='.rawurlencode(t3lib_div
::getIndpEnv('REQUEST_URI'))).'#latest">'.
573 '<img src="t3lib/gfx/history2.gif" width="13" height="12" hspace="2" border="0" align="top" title="'.$this->extGetLL('edit_recordHistory').'" alt="" /></a>';
574 $toolBar.='<a href="'.htmlspecialchars($newContentWizScriptPath.'?id='.$id.'&returnUrl='.rawurlencode(t3lib_div
::getIndpEnv('REQUEST_URI'))).'">'.
575 '<img src="t3lib/gfx/new_record.gif" width="16" height="12" hspace="1" border="0" align="top" title="'.$this->extGetLL('edit_newContentElement').'" alt="" /></a>';
576 $toolBar.='<a href="'.htmlspecialchars(TYPO3_mainDir
.'move_el.php?table=pages&uid='.$id.'&returnUrl='.rawurlencode(t3lib_div
::getIndpEnv('REQUEST_URI'))).'">'.
577 '<img src="t3lib/gfx/move_page.gif" width="11" height="12" hspace="2" border="0" align="top" title="'.$this->extGetLL('edit_move_page').'" alt="" /></a>';
578 $toolBar.='<a href="'.htmlspecialchars(TYPO3_mainDir
.'db_new.php?id='.$id.'&pagesOnly=1&returnUrl='.rawurlencode(t3lib_div
::getIndpEnv('REQUEST_URI'))).'">'.
579 '<img src="t3lib/gfx/new_page.gif" width="13" height="12" hspace="0" border="0" align="top" title="'.$this->extGetLL('edit_newPage').'" alt="" /></a>';
581 $params='&edit[pages]['.$id.']=edit';
582 $toolBar.='<a href="'.htmlspecialchars(TYPO3_mainDir
.'alt_doc.php?'.$params.'&noView=1&returnUrl='.rawurlencode(t3lib_div
::getIndpEnv('REQUEST_URI'))).'">'.
583 '<img src="t3lib/gfx/edit2.gif" width="11" height="12" hspace="2" border="0" align="top" title="'.$this->extGetLL('edit_editPageHeader').'" alt="" /></a>';
584 if ($this->check('modules','web_list')) {
585 $toolBar.='<a href="'.htmlspecialchars(TYPO3_mainDir
.'db_list.php?id='.$id.'&returnUrl='.rawurlencode(t3lib_div
::getIndpEnv('REQUEST_URI'))).'">'.
586 '<img src="t3lib/gfx/list.gif" width="11" height="11" hspace="2" border="0" align="top" title="'.$this->extGetLL('edit_db_list').'" alt="" /></a>';
609 /*****************************************************
611 * TSFE BE user Access Functions
613 ****************************************************/
616 * Implementing the access checks that the typo3/init.php script does before a user is ever logged in.
617 * Used in the frontend.
619 * @return boolean Returns true if access is OK
620 * @see typo3/init.php, t3lib_beuserauth::backendCheckLogin()
622 function checkBackendAccessSettingsFromInitPhp() {
623 global $TYPO3_CONF_VARS;
625 // **********************
626 // Check Hardcoded lock on BE:
627 // **********************
628 if ($TYPO3_CONF_VARS['BE']['adminOnly'] < 0) {
632 // **********************
634 // **********************
635 if (trim($TYPO3_CONF_VARS['BE']['IPmaskList'])) {
636 if (!t3lib_div
::cmpIP(t3lib_div
::getIndpEnv('REMOTE_ADDR'), $TYPO3_CONF_VARS['BE']['IPmaskList'])) {
642 // **********************
644 // **********************
645 if (intval($TYPO3_CONF_VARS['BE']['lockSSL'])) {
646 if (!t3lib_div
::getIndpEnv('TYPO3_SSL')) {
651 // Finally a check from t3lib_beuserauth::backendCheckLogin()
652 if (!$TYPO3_CONF_VARS['BE']['adminOnly'] ||
$this->isAdmin()) {
659 * Evaluates if the Backend User has read access to the input page record.
660 * The evaluation is based on both read-permission and whether the page is found in one of the users webmounts. Only if both conditions are true will the function return true.
661 * Read access means that previewing is allowed etc.
662 * Used in index_ts.php
664 * @param array The page record to evaluate for
665 * @return boolean True if read access
667 function extPageReadAccess($pageRec) {
668 return $this->isInWebMount($pageRec['uid']) && $this->doesUserHaveAccess($pageRec,1);
672 * Checks if a Admin Panel section ("module") is available for the user. If so, true is returned.
674 * @param string The module key, eg. "edit", "preview", "info" etc.
676 * @see extPrintFeAdminDialog()
678 function extAdmModuleEnabled($key) {
679 // Returns true if the module checked is "preview" and the forcePreview flag is set.
680 if ($key=="preview" && $this->ext_forcePreview
) return true
;
681 // If key is not set, only "all" is checked
682 if ($this->extAdminConfig
['enable.']['all']) return true
;
683 if ($this->extAdminConfig
['enable.'][$key]) {
689 * Saves any change in settings made in the Admin Panel.
690 * Called from index_ts.php right after access check for the Admin Panel
694 function extSaveFeAdminConfig() {
695 $input = t3lib_div
::_POST('TSFE_ADMIN_PANEL');
696 if (is_array($input)) {
698 $this->uc
['TSFE_adminConfig'] = array_merge(!is_array($this->uc
['TSFE_adminConfig'])?
array():$this->uc
['TSFE_adminConfig'], $input); // Candidate for t3lib_div::array_merge() if integer-keys will some day make trouble...
699 unset($this->uc
['TSFE_adminConfig']['action']);
702 if ($input['action']['clearCache'] && $this->extAdmModuleEnabled('cache')) {
703 $this->extPageInTreeInfo
=array();
704 $theStartId = intval($input['cache_clearCacheId']);
705 $GLOBALS['TSFE']->clearPageCacheContent_pidList($this->extGetTreeList($theStartId, $this->extGetFeAdminValue('cache','clearCacheLevels'),0,$this->getPagePermsClause(1)).$theStartId);
707 if ($input['action']['publish'] && $this->extAdmModuleEnabled('publish')) {
708 $theStartId = intval($input['publish_id']);
709 $this->extPublishList
= $this->extGetTreeList($theStartId, $this->extGetFeAdminValue('publish','levels'),0,$this->getPagePermsClause(1)).$theStartId;
715 $GLOBALS['TT']->LR
= $this->extGetFeAdminValue('tsdebug','LR');
716 if ($this->extGetFeAdminValue('cache','noCache')) {$GLOBALS['TSFE']->set_no_cache();}
720 * Returns the value for a Admin Panel setting. You must specify both the module-key and the internal setting key.
722 * @param string Module key
723 * @param string Setting key
724 * @return string The setting value
726 function extGetFeAdminValue($pre,$val='') {
727 if ($this->extAdmModuleEnabled($pre)) { // Check if module is enabled.
728 // Exceptions where the values can be overridden from backend:
729 if ($pre.'_'.$val == 'edit_displayIcons' && $this->extAdminConfig
['module.']['edit.']['forceDisplayIcons']) {
732 if ($pre.'_'.$val == 'edit_displayFieldIcons' && $this->extAdminConfig
['module.']['edit.']['forceDisplayFieldIcons']) {
736 $retVal = $val ?
$this->uc
['TSFE_adminConfig'][$pre.'_'.$val] : 1;
738 if ($pre=='preview' && $this->ext_forcePreview
) {
747 if ($this->extIsAdmMenuOpen($pre)) { // See if the menu is expanded!
754 * Returns true if admin panel module is open
756 * @param string Module key
757 * @return boolean True, if the admin panel is open for the specified admin panel module key.
759 function extIsAdmMenuOpen($pre) {
760 return $this->uc
['TSFE_adminConfig']['display_top'] && $this->uc
['TSFE_adminConfig']['display_'.$pre];
778 /*****************************************************
780 * TSFE BE user Access Functions
782 ****************************************************/
785 * Generates a list of Page-uid's from $id. List does not include $id itself
786 * The only pages excluded from the list are deleted pages.
788 * @param integer Start page id
789 * @param integer Depth to traverse down the page tree.
790 * @param integer $begin is an optional integer that determines at which level in the tree to start collecting uid's. Zero means 'start right away', 1 = 'next level and out'
791 * @param string Perms clause
792 * @return string Returns the list with a comma in the end (if any pages selected!)
794 function extGetTreeList($id,$depth,$begin=0,$perms_clause) {
795 $depth=intval($depth);
796 $begin=intval($begin);
800 if ($id && $depth>0) {
801 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
804 'pid='.$id.' AND doktype IN ('.$GLOBALS['TYPO3_CONF_VARS']['FE']['content_doktypes'].') AND deleted=0 AND '.$perms_clause
806 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
808 $theList.=$row['uid'].',';
809 $this->extPageInTreeInfo
[]=array($row['uid'],$row['title'],$depth);
812 $theList.=$this->extGetTreeList($row['uid'], $depth-1,$begin-1,$perms_clause);
820 * Returns the number of cached pages for a page id.
822 * @param integer The page id.
823 * @return integer The number of pages for this page in the table "cache_pages"
825 function extGetNumberOfCachedPages($page_id) {
826 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', 'cache_pages', 'page_id='.intval($page_id));
827 list($num) = $GLOBALS['TYPO3_DB']->sql_fetch_row($res);
851 /*****************************************************
853 * Localization handling
855 ****************************************************/
858 * Returns the label for key, $key. If a translation for the language set in $this->uc['lang'] is found that is returned, otherwise the default value.
859 * IF the global variable $LOCAL_LANG is NOT an array (yet) then this function loads the global $LOCAL_LANG array with the content of "sysext/lang/locallang_tsfe.php" so that the values therein can be used for labels in the Admin Panel
861 * @param string Key for a label in the $LOCAL_LANG array of "sysext/lang/locallang_tsfe.php"
862 * @return string The value for the $key
864 function extGetLL($key) {
866 if (!is_array($LOCAL_LANG)) {
867 $GLOBALS['LANG']->includeLLFile('EXT:lang/locallang_tsfe.php');
868 #include('./'.TYPO3_mainDir.'sysext/lang/locallang_tsfe.php');
869 if (!is_array($LOCAL_LANG)) $LOCAL_LANG=array();
872 $labelStr = htmlspecialchars($GLOBALS['LANG']->getLL($key)); // Label string in the default backend output charset.
874 // Convert to utf-8, then to entities:
875 if ($GLOBALS['LANG']->charSet
!='utf-8') {
876 $labelStr = $GLOBALS['LANG']->csConvObj
->utf8_encode($labelStr,$GLOBALS['LANG']->charSet
);
878 $labelStr = $GLOBALS['LANG']->csConvObj
->utf8_to_entities($labelStr);
880 // Return the result:
896 /*****************************************************
900 ****************************************************/
903 * Returns true in an edit-action is sent from the Admin Panel
908 function extIsEditAction() {
909 if (is_array($this->TSFE_EDIT
)) {
910 if ($this->TSFE_EDIT
['cancel']) {
911 unset($this->TSFE_EDIT
['cmd']);
912 } elseif (($cmd!='edit' ||
(is_array($this->TSFE_EDIT
['data']) && ($this->TSFE_EDIT
['update'] ||
$this->TSFE_EDIT
['update_close']))) && $cmd!='new') {
913 // $cmd can be a command like "hide" or "move". If $cmd is "edit" or "new" it's an indication to show the formfields. But if data is sent with update-flag then $cmd = edit is accepted because edit may be sendt because of .keepGoing flag.
920 * Returns true if an edit form is shown on the page.
921 * Used from index_ts.php where a true return-value will result in classes etc. being included.
926 function extIsFormShown() {
927 if (is_array($this->TSFE_EDIT
)) {
928 $cmd=(string)$this->TSFE_EDIT
['cmd'];
929 if ($cmd=='edit' ||
$cmd=='new') {
936 * Management of the on-page frontend editing forms and edit panels.
937 * Basically taking in the data and commands and passes them on to the proper classes as they should be.
942 function extEditAction() {
943 global $TCA, $TYPO3_CONF_VARS;
945 list($table,$uid) = explode(':',$this->TSFE_EDIT
['record']);
946 if ($this->TSFE_EDIT
['cmd'] && $table && $uid && isset($TCA[$table])) {
947 $tce = t3lib_div
::makeInstance('t3lib_TCEmain');
948 $tce->stripslashes_values
=0;
951 $cmd=$this->TSFE_EDIT
['cmd'];
954 // extEditAction HOOK
956 if (is_array($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tsfebeuserauth.php']['extEditAction'])) {
958 foreach($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tsfebeuserauth.php']['extEditAction'] as $_funcRef) {
959 t3lib_div
::callUserFunction($_funcRef,$_params,$this);
966 $hideField = $TCA[$table]['ctrl']['enablecolumns']['disabled'];
968 $recData[$table][$uid][$hideField]=($cmd=='hide'?
1:0);
969 $tce->start($recData,Array());
970 $tce->process_datamap();
975 $sortField = $TCA[$table]['ctrl']['sortby'];
985 $fields = array_unique(t3lib_div
::trimExplode(',',$TCA[$table]['ctrl']['copyAfterDuplFields'].',uid,pid,'.$sortField,1));
986 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(implode(',',$fields), $table, 'uid='.$uid);
987 if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
988 // record before or after
989 $preview = $this->extGetFeAdminValue('preview');
990 $copyAfterFieldsQuery = '';
991 if ($preview) {$ignore = array('starttime'=>1, 'endtime'=>1, 'disabled'=>1, 'fe_group'=>1);}
992 if ($TCA[$table]['ctrl']['copyAfterDuplFields']) {
993 $cAFields = t3lib_div
::trimExplode(',',$TCA[$table]['ctrl']['copyAfterDuplFields'],1);
994 while(list(,$fN)=each($cAFields)) {
995 $copyAfterFieldsQuery.=' AND '.$fN.'="'.$row[$fN].'"';
999 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
1002 'pid='.intval($row['pid']).
1003 ' AND '.$sortField.$op.intval($row[$sortField]).
1004 $copyAfterFieldsQuery.
1005 t3lib_pageSelect
::enableFields($table,'',$ignore),
1010 if ($row2 = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
1012 $cmdData[$table][$uid]['move']= -$row2['uid'];
1013 } elseif ($row3 = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { // Must take the second record above...
1014 $cmdData[$table][$uid]['move']= -$row3['uid'];
1015 } else { // ... and if that does not exist, use pid
1016 $cmdData[$table][$uid]['move']= $row['pid'];
1018 } elseif ($cmd=='up') {
1019 $cmdData[$table][$uid]['move']= $row['pid'];
1022 if (count($cmdData)) {
1023 $tce->start(Array(),$cmdData);
1024 $tce->process_cmdmap();
1029 $cmdData[$table][$uid]['delete']= 1;
1030 if (count($cmdData)) {
1031 $tce->start(Array(),$cmdData);
1032 $tce->process_cmdmap();
1038 if (($this->TSFE_EDIT
['doSave'] ||
$this->TSFE_EDIT
['update'] ||
$this->TSFE_EDIT
['update_close']) && is_array($this->TSFE_EDIT
['data'])) {
1039 $tce = t3lib_div
::makeInstance('t3lib_TCEmain');
1040 $tce->stripslashes_values
=0;
1041 $tce->start($this->TSFE_EDIT
['data'],Array());
1042 $tce->process_uploads($_FILES);
1043 $tce->process_datamap();
1049 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE
]['XCLASS']['t3lib/class.t3lib_tsfebeuserauth.php']) {
1050 include_once($TYPO3_CONF_VARS[TYPO3_MODE
]['XCLASS']['t3lib/class.t3lib_tsfebeuserauth.php']);