See changelog
authorKasper Skårhøj <kasper@typo3.org>
Wed, 27 Apr 2005 09:57:56 +0000 (09:57 +0000)
committerKasper Skårhøj <kasper@typo3.org>
Wed, 27 Apr 2005 09:57:56 +0000 (09:57 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@670 709f56b5-9817-0410-a4d7-c38de5d9e867

43 files changed:
ChangeLog
TODO.txt
t3lib/class.t3lib_arraybrowser.php
t3lib/class.t3lib_beuserauth.php
t3lib/class.t3lib_div.php
t3lib/class.t3lib_exec.php
t3lib/class.t3lib_extmgm.php
t3lib/class.t3lib_install.php
t3lib/class.t3lib_page.php
t3lib/class.t3lib_svbase.php
t3lib/class.t3lib_tceforms.php
t3lib/class.t3lib_tstemplate.php
t3lib/class.t3lib_userauth.php
t3lib/class.t3lib_userauthgroup.php
t3lib/config_default.php
t3lib/stddb/tables.sql
typo3/alt_clickmenu.php
typo3/alt_main.php
typo3/class.alt_menu_functions.inc
typo3/class.db_list.inc
typo3/index.php
typo3/sysext/cms/ext_tables.php
typo3/sysext/cms/ext_tables.sql
typo3/sysext/cms/ext_tables_static+adt.sql
typo3/sysext/cms/layout/db_new_content_el.php
typo3/sysext/cms/locallang_tca.xml
typo3/sysext/cms/tslib/class.tslib_content.php
typo3/sysext/cms/tslib/class.tslib_fe.php
typo3/sysext/cms/tslib/class.tslib_feuserauth.php
typo3/sysext/cms/tslib/class.tslib_menu.php
typo3/sysext/cms/tslib/class.tslib_pibase.php
typo3/sysext/cms/web_info/class.tx_cms_webinfo_lang.php
typo3/sysext/indexed_search/class.indexer.php
typo3/sysext/indexed_search/cli/indexer_cli.phpsh
typo3/sysext/indexed_search/ext_tables.sql
typo3/sysext/indexed_search/pi/locallang.php [deleted file]
typo3/sysext/indexed_search/pi/locallang.xml [new file with mode: 0755]
typo3/sysext/lang/lang.php
typo3/sysext/sv/class.tx_sv_auth.php
typo3/sysext/sv/class.tx_sv_authbase.php
typo3/sysext/sv/ext_localconf.php
typo3/sysext/sys_action/ext_tables.sql
typo3/sysext/sys_note/ext_tables.sql

index 98ff0b1..0bd7fde 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2005-04-21 => 04-26  Kasper Skårhøj,,,  <kasper@typo3.com>
+
+       * Added a runaway brake to t3lib_div::expandList(): Ranges are limited to 1000 values per range.
+       * Added authentication services (from sysext/sv/) to the core.
+       * Added a feature to menu objects that you can have them show pages in the menus which are normally access restricted. The pages shown will like to a fixed page ID as long as access is not allowed - that page could then show a login box for instance. If access to the elements is ok they will of course link to themselves.
+       * Added the same feature described for menu objects above to normal typolinks, configured with "config.typolinkLinkAccessRestrictedPages". See TSref for details. The feature will allow links pointing to access restricted page to be created but redirected to a central page which could for instnace contain a login form which is what will be shown if the page was not accessible.
+       * !!! Technical/API: Changed sys_page->where_hid_del so the fe_group check is not included in WHERE clause but found separately in sys_page->where_groupAccess. It is probably quite rare if this affects any extension but it could do so potentially. PHP code would have to be adapted then.
+       * Implemented configuration to inverse localization setting for pages, $GLOBALS['TYPO3_CONF_VARS']['FE']['hidePagesIfNotTranslatedByDefault']:  If TRUE, pages that has no translation will be hidden by default. Basically this will inverse the effect of the page localization setting "Hide page if no translation for current language exists" to "Show page even if no translation exists"
+       * Added new function; t3lib_div::explodeUrl2Array(): Explodes a string with GETvars (eg. "&id=1&type=2&ext[mykey]=3") into an array
+       * Added "config.language_alt" which enables localization from locallang-files of plugins to fallback to an alternative language if the main one (specified with config.language) was not found in hte locallang file. Thus a brazil portuguese ("br") website could specify portuguese (pt) as fallback language!
+       * Added hook for page-not-found handling enabling any handling to be done for really flexible use.
+       * Extended class t3lib_arraybrowser so it can show a PHP array without links. Used for "realurl" extension displaying its configuration in backend module.
+       * Introduced readLLfile() and readLLXMLfile() in t3lib_div in the section with TYPO3 specific functions. They were moved from lang/lang.php class (language class) where they served to load locallang.(php|xml) files. Since this functionality was needed in the frontend as well the functions had to exist in a common script, that being t3lib_div.
+       * fixed "bug" where the meta data from a flexform data structure was returned in t3lib_div::-function
+       * Completely reverted the removal of the "unsigned" attributes in *.sql files - DBAL has to handle this depending on DB.
+       * Added record-uid to the listing of reference in TCEform group fields.
+       * Added features in tslib_fe which records the reasons why a certain page was not accessible if it related to hidden/starttime/endtime/groups. This can be used in page-not-found handlers to produce a proper response to access attempts to eg. protected sections.
+       * Support for locallang-xml in frontend as well.
+       * Added unique name for TYPO3 re-login pop-up box
+       * Fixed a few smaller bugs/inconveniences
+
 2005-04-25  Andreas Otto  <andreas.otto@dkd.de>
 
        * Fixed bug #0000649. Used the patch provided in the bug description.
index 23dcda5..dc3d827 100755 (executable)
--- a/TODO.txt
+++ b/TODO.txt
@@ -396,7 +396,7 @@ XQCR: t3lib/class.t3lib_clipboard.php
 XQCR: t3lib/class.t3lib_diff.php
 XQCR: t3lib/class.t3lib_div.php
                t3lib/class.t3lib_dmailer.php                   [Jan-Erik!]
-               t3lib/class.t3lib_exec.php                              [Rene]
+-QC-: t3lib/class.t3lib_exec.php
 -QCR: t3lib/class.t3lib_extfilefunc.php
 -QCR: t3lib/class.t3lib_extmgm.php
 -QCR: t3lib/class.t3lib_extobjbase.php
@@ -419,10 +419,10 @@ XQCR: t3lib/class.t3lib_positionmap.php
 -QCR: t3lib/class.t3lib_readmail.php
 XQCR: t3lib/class.t3lib_recordlist.php
 -QCR: t3lib/class.t3lib_scbase.php
-               t3lib/class.t3lib_sqlengine.php                 [Kasper/Karsten?]
+               t3lib/class.t3lib_sqlengine.php                 [Karsten?]
 -QCR: t3lib/class.t3lib_stdgraphic.php
 XQCR: t3lib/class.t3lib_superadmin.php
-               t3lib/class.t3lib_svbase.php                    [Rene]
+-QC-: t3lib/class.t3lib_svbase.php
 -QCR: t3lib/class.t3lib_tceforms.php                   [Kasper]
                t3lib/class.t3lib_tcemain.php                   [Kasper]
 XQCR: t3lib/class.t3lib_timetrack.php
@@ -508,7 +508,7 @@ OK          lang/
                lowlevel                        (2/800)
                        - Extend support and finish it with the efforts soon to be done for TCEmain.
 OK             setup/
-?              sv/                                                     [Rene]
+OK             sv/
                sys_action                      (1/400)
                        - Extend with API for adding custom action scripts
                        - flexforms for configuration!
index 796b8e1..9f6cbec 100644 (file)
@@ -75,6 +75,8 @@
  * @see SC_mod_tools_config_index::main()
  */
 class t3lib_arrayBrowser       {
+       var $expAll = FALSE;                    // If set, will expand all (depthKeys is obsolete then) (and no links are applied)
+       var $dontLinkVar = FALSE;               // If set, the variable keys are not linked.
        var $depthKeys = array();               // Array defining which keys to expand. Typically set from outside from some session variable - otherwise the array will collapse.
        var $searchKeys = array();              // After calling the getSearchKeys function this array is populated with the key-positions in the array which contains values matching the search.
        var $fixedLgd=1;                                // If set, the values are truncated with "..." appended if longer than a certain length.
@@ -104,7 +106,7 @@ class t3lib_arrayBrowser    {
                        $depth = $depth_in.$key;
                        $goto = substr(md5($depth),0,6);
 
-                       $deeper = (is_array($arr[$key]) && $this->depthKeys[$depth]) ? 1 : 0;
+                       $deeper = (is_array($arr[$key]) && ($this->depthKeys[$depth] || $this->expAll)) ? 1 : 0;
                        $PM = 'join';
                        $LN = ($a==$c)?'blank':'line';
                        $BTM = ($a==$c)?'bottom':'';
@@ -116,7 +118,10 @@ class t3lib_arrayBrowser   {
                        if ($PM=='join')        {
                                $HTML.=$theIcon;
                        } else {
-                               $HTML.='<a name="'.$goto.'" href="'.htmlspecialchars('index.php?node['.$depth.']='.($deeper?0:1).'#'.$goto).'">'.$theIcon.'</a>';
+                               $HTML.=
+                                       ($this->expAll ? '' : '<a name="'.$goto.'" href="'.htmlspecialchars('index.php?node['.$depth.']='.($deeper?0:1).'#'.$goto).'">').
+                                       $theIcon.
+                                       ($this->expAll ? '' : '</a>');
                        }
 
                        $label = $key;
@@ -170,7 +175,7 @@ class t3lib_arrayBrowser    {
                $label = htmlspecialchars($label);
 
                        // If varname is set:
-               if ($this->varName) {
+               if ($this->varName && !$this->dontLinkVar) {
                        $variableName = $this->varName.'[\''.str_replace('.','\'][\'',$depth).'\'] = '.(!t3lib_div::testInt($theValue) ? '\''.addslashes($theValue).'\'' : $theValue).'; ';
                        $label = '<a href="'.htmlspecialchars('index.php?varname='.$variableName.'#varname').'">'.$label.'</a>';
                }
index 095d9ae..2ff4a76 100644 (file)
@@ -96,7 +96,7 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
        var $formfield_uident = 'userident';            // formfield with password
        var $formfield_chalvalue = 'challenge';         // formfield with a unique value which is used to encrypt the password and username
        var $formfield_status = 'login_status';         // formfield with status: *'login', 'logout'
-       var $security_level = 'challenged';                             // sets the level of security. *'normal' = clear-text. 'challenged' = hashed password/username from form in $formfield_uident. 'superchallenged' = hashed password hashed again with username.
+       var $security_level = 'superchallenged';        // sets the level of security. *'normal' = clear-text. 'challenged' = hashed password/username from form in $formfield_uident. 'superchallenged' = hashed password hashed again with username.
 
        var $writeStdLog = 1;                                   // Decides if the writelog() function is called at login and logout
        var $writeAttemptLog = 1;                               // If the writelog() functions is called if a login-attempt has be tried without success
@@ -225,7 +225,7 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
                                                if (!$this->isAdmin())  {
                                                        return TRUE;
                                                } else die('ERROR: CLI backend user "'.$userName.'" was ADMIN which is not allowed!'.chr(10).chr(10));
-                                       } else die('ERROR: No backend user named "'.$userName.'" was found!'.chr(10).chr(10));
+                                       } else die('ERROR: No backend user named "'.$userName.'" was found! [Database: '.TYPO3_db.']'.chr(10).chr(10));
                                } else die('ERROR: Module name, "'.$GLOBALS['MCONF']['name'].'", was not prefixed with "_CLI_"'.chr(10).chr(10));
                        } else die('ERROR: Another user was already loaded which is impossible in CLI mode!'.chr(10).chr(10));
                }
index 243aba4..f669c3f 100755 (executable)
@@ -676,6 +676,7 @@ class t3lib_div {
 
        /**
         * Expand a comma-separated list of integers with ranges (eg 1,3-5,7 becomes 1,3,4,5,7).
+        * Ranges are limited to 1000 values per range.
         *
         * @param       string          $list   comma-separated list of integers with ranges (string)
         * @return      string          new comma-separated list of items
@@ -687,8 +688,12 @@ class t3lib_div {
                while(list(,$item)=each($items))        {
                        $range = explode('-',$item);
                        if (isset($range[1]))   {
+                               $runAwayBrake = 1000;
                                for ($n=$range[0]; $n<=$range[1]; $n++) {
                                        $list[] = $n;
+
+                                       $runAwayBrake--;
+                                       if ($runAwayBrake<=0)   break;
                                }
                        } else {
                                $list[] = $item;
@@ -1304,8 +1309,9 @@ class t3lib_div {
         * @param       array           The (multidim) array to implode
         * @param       string          (keep blank)
         * @param       boolean         If set, parameters which were blank strings would be removed.
-        * @param       boolean         If set, the param name itselt (for example "param[key][key2]") would be rawurlencoded as well.
+        * @param       boolean         If set, the param name itself (for example "param[key][key2]") would be rawurlencoded as well.
         * @return      string          Imploded result, fx. &param[key][key2]=value2&param[key][key3]=value3
+        * @see explodeUrl2Array()
         */
        function implodeArrayForUrl($name,$theArray,$str='',$skipBlank=0,$rawurlencodeParamName=0)      {
                if (is_array($theArray))        {
@@ -1316,7 +1322,7 @@ class t3lib_div {
                                } else {
                                        if (!$skipBlank || strcmp($AVal,''))    {
                                                $str.='&'.($rawurlencodeParamName ? rawurlencode($thisKeyName) : $thisKeyName).
-                                                       '='.rawurlencode($AVal);        // strips slashes because _POST / _GET input is with slashes...
+                                                       '='.rawurlencode($AVal);
                                        }
                                }
                        }
@@ -1325,6 +1331,31 @@ class t3lib_div {
        }
 
        /**
+        * Explodes a string with GETvars (eg. "&id=1&type=2&ext[mykey]=3") into an array
+        *
+        * @param       string          GETvars string
+        * @param       boolean         If set, the string will be parsed into a multidimensional array if square brackets are used in variable names (using PHP function parse_str())
+        * @return      array           Array of values. All values AND keys are rawurldecoded() as they properly should be. But this means that any implosion of the array again must rawurlencode it!
+        * @see implodeArrayForUrl()
+        */
+       function explodeUrl2Array($string,$multidim=FALSE)      {
+               if ($multidim)  {
+                       parse_str($string,$tempGetVars);
+                       return $tempGetVars;
+               } else {
+                       $output = array();
+                       $p = explode('&',$string);
+                       foreach($p as $v)       {
+                               if (strlen($v)) {
+                                       list($pK,$pV) = explode('=',$v,2);
+                                       $output[rawurldecode($pK)] = rawurldecode($pV);
+                               }
+                       }
+                       return $output;
+               }
+       }
+
+       /**
         * Returns an array with selected keys from incoming data.
         * (Better read source code if you want to find out...)
         * Usage: 3
@@ -3069,6 +3100,151 @@ class t3lib_div {
        }
 
        /**
+        * Responds on input localization setting value whether the page it comes from should be hidden if no translation exists or not.
+        *
+        * @param       integer         Value from "l18n_cfg" field of a page record
+        * @return      boolean         True if the page should be hidden
+        */
+       function hideIfNotTranslated($l18n_cfg_fieldValue)      {
+               if ($GLOBALS['TYPO3_CONF_VARS']['FE']['hidePagesIfNotTranslatedByDefault'])     {
+                       return $l18n_cfg_fieldValue&2 ? FALSE : TRUE;
+               } else {
+                       return $l18n_cfg_fieldValue&2 ? TRUE : FALSE;
+               }
+       }
+
+       /**
+        * Includes a locallang file and returns the $LOCAL_LANG array found inside.
+        *
+        * @param       string          Input is a file-reference (see t3lib_div::getFileAbsFileName) which, if exists, is included. That file is expected to be a 'local_lang' file containing a $LOCAL_LANG array.
+        * @param       string          Language key
+        * @return      array           Value of $LOCAL_LANG found in the included file. If that array is found it's returned. Otherwise an empty array
+        */
+       function readLLfile($fileRef,$langKey)  {
+               $file = t3lib_div::getFileAbsFileName($fileRef);
+               if ($file)      {
+                       $baseFile = ereg_replace('\.(php|xml)$', '', $file);
+
+                       if (@is_file($baseFile.'.xml')) {
+                               $LOCAL_LANG = t3lib_div::readLLXMLfile($baseFile.'.xml', $langKey);
+                       } elseif (@is_file($baseFile.'.php'))   {
+                               include($baseFile.'.php');
+                       } else die('Filereference, "'.$file.'", not found!');
+               }
+
+               return is_array($LOCAL_LANG)?$LOCAL_LANG:array();
+       }
+
+       /**
+        * Includes a locallang-xml file and returns the $LOCAL_LANG array
+        * Works only when the frontend or backend has been initialized with a charset conversion object. See first code lines.
+        *
+        * @param       string          Absolute reference to locallang-XML file
+        * @param       string          TYPO3 language key, eg. "dk" or "de" or "default"
+        * @return      array           LOCAL_LANG array in return.
+        */
+       function readLLXMLfile($fileRef,$langKey)       {
+
+               if (is_object($GLOBALS['LANG']))        {
+                       $csConvObj = &$GLOBALS['LANG']->csConvObj;
+               } elseif (is_object($GLOBALS['TSFE']))  {
+                       $csConvObj = &$GLOBALS['TSFE']->csConvObj;
+               } else $csConvObj = NULL;
+
+               if (@is_file($fileRef) && $langKey && is_object($csConvObj))    {
+
+                               // Set charset:
+                       $origCharset = $csConvObj->parse_charset($csConvObj->charSetArray[$langKey] ? $csConvObj->charSetArray[$langKey] : 'iso-8859-1');
+
+                               // Cache file name:
+                       $hashSource = substr($fileRef,strlen(PATH_site)).'|'.date('d-m-Y H:i:s',filemtime($fileRef));
+                       $cacheFileName = PATH_site.'typo3temp/llxml/'.
+                                                       #str_replace('_','',ereg_replace('^.*\/','',dirname($fileRef))).
+                                                       #'_'.basename($fileRef).
+                                                       substr(basename($fileRef),10,15).
+                                                       '_'.t3lib_div::shortMD5($hashSource).'.'.$langKey.'.'.$origCharset.'.cache';
+
+                               // Check if cache file exists...
+                       if (!@is_file($cacheFileName))  {       // ... if it doesn't, create content and write it:
+
+                                       // Read XML, parse it.
+                               $xmlString = t3lib_div::getUrl($fileRef);
+                               $xmlContent = t3lib_div::xml2array($xmlString);
+
+                                       // Set default LOCAL_LANG array content:
+                               $LOCAL_LANG = array();
+                               $LOCAL_LANG['default'] = $xmlContent['data']['default'];
+
+                                       // Specific language, convert from utf-8 to backend language charset:
+                                       // NOTICE: Converting from utf-8 back to "native" language may be a temporary solution until we can totally discard "locallang.php" files altogether (and use utf-8 for everything). But doing this conversion is the quickest way to migrate now and the source is in utf-8 anyway which is the main point.
+                               if ($langKey!='default')        {
+                                       $LOCAL_LANG[$langKey] = $xmlContent['data'][$langKey];
+
+                                               // Checking if charset should be converted.
+                                       if (is_array($LOCAL_LANG[$langKey]) && $origCharset!='utf-8')   {
+                                               foreach($LOCAL_LANG[$langKey] as $labelKey => $labelValue)      {
+                                                       $LOCAL_LANG[$langKey][$labelKey] = $csConvObj->utf8_decode($labelValue,$origCharset);
+                                               }
+                                       }
+                               }
+
+                                       // Cache the content now:
+                               $serContent = array('origFile'=>$hashSource, 'LOCAL_LANG'=>$LOCAL_LANG);
+                               $res = t3lib_div::writeFileToTypo3tempDir($cacheFileName, serialize($serContent));
+                               if ($res)       die('ERROR: '.$res);
+                       } else {
+                                       // Get content from cache:
+                               $serContent = unserialize(t3lib_div::getUrl($cacheFileName));
+                               $LOCAL_LANG = $serContent['LOCAL_LANG'];
+                       }
+
+                               // Checking for EXTERNAL file for non-default language:
+                       if ($langKey!='default' && is_string($LOCAL_LANG[$langKey]) && strlen($LOCAL_LANG[$langKey]))   {
+
+                                       // Look for localized file:
+                               $localized_file = t3lib_div::getFileAbsFileName($LOCAL_LANG[$langKey]);
+                               if ($localized_file && @is_file($localized_file))       {
+
+                                               // Cache file name:
+                                       $hashSource = substr($localized_file,strlen(PATH_site)).'|'.date('d-m-Y H:i:s',filemtime($localized_file));
+                                       $cacheFileName = PATH_site.'typo3temp/llxml/ext_'.
+                                                                       substr(basename($localized_file),10,15).
+                                                                       '_'.t3lib_div::shortMD5($hashSource).'.'.$langKey.'.'.$origCharset.'.cache';
+
+                                               // Check if cache file exists...
+                                       if (!@is_file($cacheFileName))  {       // ... if it doesn't, create content and write it:
+
+                                                       // Read and parse XML content:
+                                               $local_xmlString = t3lib_div::getUrl($localized_file);
+                                               $local_xmlContent = t3lib_div::xml2array($local_xmlString);
+                                               $LOCAL_LANG[$langKey] = is_array($local_xmlContent['data'][$langKey]) ? $local_xmlContent['data'][$langKey] : array();
+
+                                                       // Checking if charset should be converted.
+                                               if (is_array($LOCAL_LANG[$langKey]) && $origCharset!='utf-8')   {
+                                                       foreach($LOCAL_LANG[$langKey] as $labelKey => $labelValue)      {
+                                                               $LOCAL_LANG[$langKey][$labelKey] = $csConvObj->utf8_decode($labelValue,$origCharset);
+                                                       }
+                                               }
+
+                                                       // Cache the content now:
+                                               $serContent = array('extlang'=>$langKey, 'origFile'=>$LOCAL_LANG[$langKey], 'EXT_DATA'=>$LOCAL_LANG[$langKey]);
+                                               $res = t3lib_div::writeFileToTypo3tempDir($cacheFileName, serialize($serContent));
+                                               if ($res)       die('ERROR: '.$res);
+                                       } else {
+                                                       // Get content from cache:
+                                               $serContent = unserialize(t3lib_div::getUrl($cacheFileName));
+                                               $LOCAL_LANG[$langKey] = $serContent['EXT_DATA'];
+                                       }
+                               } else {
+                                       $LOCAL_LANG[$langKey] = array();
+                               }
+                       }
+
+                       return $LOCAL_LANG;
+               }
+       }
+
+       /**
         * Loads the $TCA (Table Configuration Array) for the $table
         *
         * Requirements:
@@ -3118,6 +3294,7 @@ class t3lib_div {
                } else {
                        $singleSheet = TRUE;
                        $dataStruct = $dataStructArray;
+                       unset($dataStruct['meta']);     // Meta data should not appear there.
                        $sheet = 'sDEF';        // Default sheet
                }
                return array($dataStruct,$sheet,$singleSheet);
@@ -3359,27 +3536,30 @@ class t3lib_div {
                                return $GLOBALS['T3_VAR']['makeInstanceService'][$info['className']];
 
                                // include file and create object
-                       } elseif (@is_file($info['classFile'])) {
-                               require_once ($info['classFile']);
-                               $obj = t3lib_div::makeInstance($info['className']);
-                               if (is_object($obj)) {
-                                       if(!@is_callable(array($obj,'init')))   {
-                                                       // use silent logging??? I don't think so.
-                                               die ('Broken service:'.t3lib_div::view_array($info));
-                                       }
-                                       $obj->info = $info;
-                                       if ($obj->init()) { // service available?
+                       } else {
+                               $requireFile = t3lib_div::getFileAbsFileName($info['classFile']);
+                               if (@is_file($requireFile)) {
+                                       require_once ($requireFile);
+                                       $obj = t3lib_div::makeInstance($info['className']);
+                                       if (is_object($obj)) {
+                                               if(!@is_callable(array($obj,'init')))   {
+                                                               // use silent logging??? I don't think so.
+                                                       die ('Broken service:'.t3lib_div::view_array($info));
+                                               }
+                                               $obj->info = $info;
+                                               if ($obj->init()) { // service available?
 
-                                                       // create persistent object
-                                               $T3_VAR['makeInstanceService'][$info['className']] = &$obj;
+                                                               // create persistent object
+                                                       $T3_VAR['makeInstanceService'][$info['className']] = &$obj;
 
-                                                       // needed to delete temp files
-                                               register_shutdown_function(array(&$obj, '__destruct'));
+                                                               // needed to delete temp files
+                                                       register_shutdown_function(array(&$obj, '__destruct'));
 
-                                               return $obj; // object is passed as reference by funtion definition
+                                                       return $obj; // object is passed as reference by function definition
+                                               }
+                                               $error = $obj->getLastErrorArray();
+                                               unset($obj);
                                        }
-                                       $error = $obj->getLastErrorArray();
-                                       unset($obj);
                                }
                        }
                                // deactivate the service
index dfb56d5..e289f42 100755 (executable)
@@ -81,7 +81,7 @@
 class t3lib_exec {
 
        /**
-        * checks if a command is valid or not
+        * Checks if a command is valid or not
         * updates global vars
         *
         * @param       string          the command that should be executed. eg: "convert"
@@ -152,7 +152,7 @@ class t3lib_exec {
        }
 
        /**
-        * returns a command string for exec(), system()
+        * Returns a command string for exec(), system()
         *
         * @param       string          the command that should be executed. eg: "convert"
         * @param       string          handler (executor) for the command. eg: "perl"
@@ -183,20 +183,19 @@ class t3lib_exec {
        }
 
        /**
-        * Extend the preset paths. This way an extension can install an axecutable and provide the path to t3lib_exec.
+        * Extend the preset paths. This way an extension can install an executable and provide the path to t3lib_exec.
         *
         * @param       string          comma seperated list of extra paths where a command should be searched. Relative paths (without leading "/") are prepend with site root path (PATH_site).
-        * @return      [type]          ...
+        * @return      void
         */
        function addPaths($paths)       {
                t3lib_exec::_initPaths($paths);
        }
 
        /**
-        * set the search paths from different sources
+        * Set the search paths from different sources
         *
-        * @return      [type]          ...
-        * @internal
+        * @return      array           Array of absolute paths (keys and values are equal)
         */
        function _getPaths()    {
                global $TYPO3_CONF_VARS;
@@ -222,12 +221,8 @@ class t3lib_exec {
                        }
                }
 
-
-
-
 # ???? t3lib_div::getIndpEnv('REQUEST_URI');
 
-
                        // add path from environment
 #TODO: how does this work for WIN
                if ($GLOBALS['_SERVER']['PATH']) {
@@ -261,9 +256,9 @@ class t3lib_exec {
        }
 
        /**
-        * init
+        * Initialization, internal
         *
-        * @return      [type]          ...
+        * @return      void
         * @internal
         */
        function _init()        {
@@ -276,10 +271,10 @@ class t3lib_exec {
        }
 
        /**
-        * init and extend the preset paths with own
+        * Init and extend the preset paths with own
         *
-        * @param       string          comma seperated list of extra paths where a command should be searched. Relative paths (without leading "/") are prepend with site root path (PATH_site).
-        * @return      [type]          ...
+        * @param       string          Comma seperated list of extra paths where a command should be searched. Relative paths (without leading "/") are prepend with site root path (PATH_site).
+        * @return      void
         * @internal
         */
        function _initPaths($paths='')  {
@@ -332,7 +327,7 @@ class t3lib_exec {
        }
 
        /**
-        * returns on which OS we're runing
+        * Returns on which OS we're runing
         *
         * @return      string          the OS type: "UNIX" or "WIN"
         * @internal
@@ -342,14 +337,14 @@ class t3lib_exec {
        }
 
        /**
-        * set a path to the right format
+        * Set a path to the right format
         *
-        * @param       string          path
-        * @return      string          path
+        * @param       string          Input path
+        * @return      string          Output path
         * @internal
         */
        function _fixPath($path)        {
-               return str_replace ('//',"/",$path.'/');
+               return str_replace ('//','/',$path.'/');
        }
 }
 
index 4687e53..117c1e9 100644 (file)
@@ -471,8 +471,8 @@ class t3lib_extMgm {
         * Adds a service to the global services array
         *
         * @param       string          Extension key
-        * @param       string          Service type
-        * @param       string          Service key
+        * @param       string          Service type, cannot be prefixed "tx_"
+        * @param       string          Service key, must be prefixed "tx_"
         * @param       array           Service description array
         * @return      void
         * @author      René Fritz <r.fritz@colorcube.de>
@@ -543,7 +543,7 @@ class t3lib_extMgm {
         * @author      René Fritz <r.fritz@colorcube.de>
         */
        function findService($serviceType, $serviceSubType='', $excludeServiceKeys=array()) {
-               global $T3_SERVICES;
+               global $T3_SERVICES, $TYPO3_CONF_VARS;
 
                $serviceKey = FALSE;
                $serviceInfo = FALSE;
index a985bd2..16b678c 100755 (executable)
@@ -101,45 +101,6 @@ class t3lib_install {
        var $touchedLine = 0;                           // updated with line in localconf.php file that was changed.
 
 
-
-
-       var $changedUnsignedFields = FALSE;             // Switch this to TRUE if you wish the install tool to convert all unsigned fields (for 3.8.0 core) to signed integers (unsigned is depricated due to DBAL but doesn't hurt - usually...). It might be a good idea to flush cache-tables first including the tables from indexed search (which has to be re-build thereafter)
-       var $coreFieldsWithUnsignedKeywordRemovedIn380 = array(
-               'be_groups' => 'uid,pid,tstamp,crdate,cruser_id,hidden,inc_access_lists,deleted',
-               'be_sessions' => 'ses_userid,ses_tstamp',
-               'be_users' => 'uid,pid,tstamp,admin,disable,starttime,endtime,options,crdate,cruser_id,disableIPlock,deleted,lastlogin',
-               'cache_hash' => 'tstamp',
-               'cache_imagesizes' => 'imagewidth,imageheight',
-               'pages' => 't3ver_oid,t3ver_id,tstamp,sorting,deleted,perms_userid,perms_groupid,perms_user,perms_group,perms_everybody,editlock,crdate,cruser_id,doktype,hidden,starttime,endtime,urltype,shortcut,shortcut_mode,no_cache,layout,lastUpdated,cache_timeout,newUntil,no_search,SYS_LASTCHANGED,extendToSubpages,content_from_pid,mount_pid',
-               'sys_be_shortcuts' => 'uid,userid',
-               'sys_filemounts' => 'uid,pid,tstamp,base,hidden,deleted',
-               'sys_history' => 'uid',
-               'sys_lockedrecords' => 'uid,userid,tstamp',
-               'sys_log' => 'uid,userid,action,recuid,error,tstamp,type,details_nr',
-               'sys_language' => 'uid,pid,tstamp,hidden,static_lang_isocode',
-               'cache_pages' => 'id,page_id,reg1,tstamp,expires',
-               'cache_pagesection' => 'page_id,mpvar_hash,tstamp',
-               'cache_imagesizes' => 'imagewidth,imageheight',
-               'fe_groups' => 'uid,pid,tstamp,hidden,deleted',
-               'fe_session_data' => 'tstamp',
-               'fe_sessions' => 'ses_userid,ses_tstamp',
-               'fe_users' => 'uid,pid,tstamp,disable,starttime,endtime,crdate,cruser_id,deleted,module_sys_dmail_category,module_sys_dmail_html,fe_cruser_id,lastlogin,is_online',
-               'pages_language_overlay' => 't3ver_oid,t3ver_id,tstamp,crdate,cruser_id,sys_language_uid,hidden,starttime,endtime',
-               'static_template' => 'uid,pid,tstamp,crdate',
-               'sys_domain' => 'uid,pid,tstamp,hidden,sorting',
-               'sys_template' => 't3ver_oid,t3ver_id,tstamp,sorting,crdate,cruser_id,hidden,starttime,endtime,root,clear,deleted,includeStaticAfterBasedOn,static_file_mode',
-               'tt_content' => 't3ver_oid,t3ver_id,tstamp,hidden,sorting,imagewidth,imageorient,imagecols,imageborder,layout,deleted,cols,starttime,endtime,colPos,spaceBefore,spaceAfter,image_zoom,image_noRows,image_effects,image_compression,text_face,text_size,text_color,text_properties,table_border,table_cellspacing,table_cellpadding,table_bgColor,select_key,sectionIndex,linkToTop,filelink_size,section_frame,date,image_frames,recursive,imageheight,module_sys_dmail_category',
-               'sys_note' => 'uid,pid,deleted,tstamp,crdate,cruser,personal,category',
-               'sys_action' => 'uid,pid,tstamp,crdate,cruser_id,type',
-               'sys_action_asgr_mm' => 'uid_local,uid_foreign,sorting',
-               'index_phash' => 'data_page_id,data_page_reg1,data_page_type,tstamp',
-               'index_rel' => 'count,first,freq,flags',
-               'index_section' => 'rl0,rl1,rl2',
-               'index_stat_search' => 'feuser_id',
-               'index_config' => 'tstamp,crdate,cruser_id,hidden,starttime,type,depth,chashcalc',
-       );
-
-
        /**
         * Constructor function
         *
@@ -149,12 +110,6 @@ class t3lib_install {
                if ($GLOBALS['TYPO3_CONF_VARS']['SYS']['multiplyDBfieldSize']>= 1 && $GLOBALS['TYPO3_CONF_VARS']['SYS']['multiplyDBfieldSize']<=5)      {
                        $this->multiplySize = (double)$GLOBALS['TYPO3_CONF_VARS']['SYS']['multiplyDBfieldSize'];
                }
-
-
-                       // Init this array:
-               foreach($this->coreFieldsWithUnsignedKeywordRemovedIn380 as $table => $fieldNameList)   {
-                       $this->coreFieldsWithUnsignedKeywordRemovedIn380[$table] = array_flip(t3lib_div::trimExplode(',',$fieldNameList,1));
-               }
        }
 
 
@@ -465,17 +420,9 @@ class t3lib_install {
                                                foreach($keyTypes as $theKey)   {
                                                        if (is_array($info[$theKey]))   {
                                                                foreach($info[$theKey] as $fieldN => $fieldC) {
-
-if (!$this->changedUnsignedFields && isset($this->coreFieldsWithUnsignedKeywordRemovedIn380[$table][$fieldN])) {
-       $FDcomp[$table][$theKey][$fieldN] = str_replace(' unsigned','',$FDcomp[$table][$theKey][$fieldN]);
-       unset($this->coreFieldsWithUnsignedKeywordRemovedIn380[$table][$fieldN]);       // Just to verify that all fields are actually found!
-}
-
-
-
                                                                        if (!isset($FDcomp[$table][$theKey][$fieldN]))  {
                                                                                $extraArr[$table][$theKey][$fieldN] = $fieldC;
-                                                                       } elseif (strcmp($FDcomp[$table][$theKey][$fieldN], $fieldC) && strcmp($FDcomp[$table][$theKey][$fieldN], str_replace(' unsigned','',$fieldC))){
+                                                                       } elseif (strcmp($FDcomp[$table][$theKey][$fieldN], $fieldC) && strcmp($FDcomp[$table][$theKey][$fieldN], $fieldC)){
                                                                                $diffArr[$table][$theKey][$fieldN] = $fieldC;
                                                                                $diffArr_cur[$table][$theKey][$fieldN] = $FDcomp[$table][$theKey][$fieldN];
                                                                        }
index ce86e71..f58a14f 100755 (executable)
 class t3lib_pageSelect {
        var $urltypes = Array('','http://','ftp://','mailto:');
        var $where_hid_del = ' AND pages.deleted=0';    // This is not the final clauses. There will normally be conditions for the hidden,starttime and endtime fields as well. You MUST initialize the object by the init() function
+       var $where_groupAccess = '';    // Clause for fe_group access
        var $sys_language_uid = 0;
 
                // Versioning preview related:
@@ -130,6 +131,7 @@ class t3lib_pageSelect {
         * @see tslib_fe::fetch_the_id(), tx_tstemplateanalyzer::initialize_editor()
         */
        function init($show_hidden)     {
+               $this->where_groupAccess = '';
                $this->where_hid_del = ' AND pages.deleted=0 ';
                if (!$show_hidden)      {
                        $this->where_hid_del.= 'AND pages.hidden=0 ';
@@ -165,11 +167,12 @@ class t3lib_pageSelect {
         * If no page is found an empty array is returned.
         *
         * @param       integer         The page id to look up.
+        * @param       boolean         If set, the check for group access is disabled. VERY rarely used
         * @return      array           The page row with overlayed localized fields. Empty it no page.
         * @see getPage_noCheck()
         */
-       function getPage($uid)  {
-               $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'pages', 'uid='.intval($uid).$this->where_hid_del);
+       function getPage($uid, $disableGroupAccessCheck=FALSE)  {
+               $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'pages', 'uid='.intval($uid).$this->where_hid_del.($disableGroupAccessCheck ? '' : $this->where_groupAccess));
                if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
 #??                    $this->versionOL('pages',$row);
                        return $this->getPageOverlay($row);
@@ -202,7 +205,7 @@ class t3lib_pageSelect {
         */
        function getFirstWebPage($uid)  {
                $output = '';
-               $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'pages', 'pid='.intval($uid).$this->where_hid_del, '', 'sorting', '1');
+               $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'pages', 'pid='.intval($uid).$this->where_hid_del.$this->where_groupAccess, '', 'sorting', '1');
                if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
 #??                    $this->versionOL('pages',$row);
                        $output = $this->getPageOverlay($row);
@@ -395,7 +398,7 @@ class t3lib_pageSelect {
         */
        function getMenu($uid,$fields='*',$sortField='sorting',$addWhere='')    {
                $output = Array();
-               $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($fields, 'pages', 'pid='.intval($uid).$this->where_hid_del.' '.$addWhere, '', $sortField);
+               $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($fields, 'pages', 'pid='.intval($uid).$this->where_hid_del.$this->where_groupAccess.' '.$addWhere, '', $sortField);
                while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))      {
 #??                    $this->versionOL('pages',$row);
 
@@ -443,7 +446,7 @@ class t3lib_pageSelect {
                                        'pages.uid=sys_domain.pid
                                                AND sys_domain.hidden=0
                                                AND (sys_domain.domainName='.$GLOBALS['TYPO3_DB']->fullQuoteStr($domain, 'sys_domain').' OR sys_domain.domainName='.$GLOBALS['TYPO3_DB']->fullQuoteStr($domain.'/', 'sys_domain').') '.
-                                               $this->where_hid_del,
+                                               $this->where_hid_del.$this->where_groupAccess,
                                        '',
                                        '',
                                        1
index 2d79dbf..2d0f23e 100755 (executable)
  *  127: class t3lib_svbase
  *
  *              SECTION: Get service meta information
- *  191:     function getServiceInfo()
- *  199:     function getServiceKey()
- *  207:     function getServiceTitle()
- *  220:     function getServiceOption($optionName, $defaultValue='', $includeDefaultConfig=TRUE)
+ *  195:     function getServiceInfo()
+ *  203:     function getServiceKey()
+ *  211:     function getServiceTitle()
+ *  224:     function getServiceOption($optionName, $defaultValue='', $includeDefaultConfig=TRUE)
  *
  *              SECTION: Error handling
- *  255:     function devLog($msg, $severity=0, $dataVar=FALSE)
- *  269:     function errorPush($errNum=T3_ERR_SV_GENERAL, $errMsg='Unspecified error occured')
- *  284:     function errorPull()
- *  296:     function getLastError()
- *  311:     function getLastErrorMsg()
- *  326:     function getErrorMsgArray()
- *  344:     function getLastErrorArray()
- *  353:     function resetErrors()
+ *  259:     function devLog($msg, $severity=0, $dataVar=FALSE)
+ *  273:     function errorPush($errNum=T3_ERR_SV_GENERAL, $errMsg='Unspecified error occured')
+ *  288:     function errorPull()
+ *  300:     function getLastError()
+ *  315:     function getLastErrorMsg()
+ *  330:     function getErrorMsgArray()
+ *  348:     function getLastErrorArray()
+ *  357:     function resetErrors()
  *
  *              SECTION: General service functions
- *  373:     function checkExec($progList)
- *  395:     function deactivateService()
- *  401:     function available()
+ *  377:     function checkExec($progList)
+ *  401:     function deactivateService()
+ *  407:     function available()
  *
  *              SECTION: IO tools
- *  439:     function checkInputFile ($absFile)
- *  460:     function readFile ($absFile, $length=0)
- *  485:     function writeFile ($content, $absFile='')
- *  511:     function tempFile ($filePrefix)
- *  529:     function registerTempFile ($absFile)
- *  539:     function unlinkTempFiles ()
+ *  445:     function checkInputFile ($absFile)
+ *  466:     function readFile ($absFile, $length=0)
+ *  491:     function writeFile ($content, $absFile='')
+ *  517:     function tempFile ($filePrefix)
+ *  535:     function registerTempFile ($absFile)
+ *  545:     function unlinkTempFiles ()
  *
  *              SECTION: IO input
- *  561:     function setInput ($content, $type='')
- *  575:     function setInputFile ($absFile, $type='')
- *  588:     function getInput ()
- *  603:     function getInputFile ($createFile='')
+ *  567:     function setInput ($content, $type='')
+ *  581:     function setInputFile ($absFile, $type='')
+ *  594:     function getInput ()
+ *  609:     function getInputFile ($createFile='')
  *
  *              SECTION: IO output
- *  628:     function setOutputFile ($absFile)
- *  638:     function getOutput ()
- *  652:     function getOutputFile ($absFile='')
+ *  634:     function setOutputFile ($absFile)
+ *  644:     function getOutput ()
+ *  658:     function getOutputFile ($absFile='')
  *
  *              SECTION: Service implementation
- *  676:     function init()
- *  700:     function reset()
- *  715:     function __destruct()
- *  721:     function process($content='', $type='', $conf=array())
+ *  682:     function init()
+ *  706:     function reset()
+ *  721:     function __destruct()
+ *  727:     function process($content='', $type='', $conf=array())
  *
  * TOTAL FUNCTIONS: 32
  * (This index is automatically created/updated by the extension "extdeveval")
@@ -178,43 +178,52 @@ class t3lib_svbase {
 
 
 
+
+
+
+
+
+
+
        /***************************************
         *
         *       Get service meta information
         *
         ***************************************/
 
-
        /**
+        * Returns internal information array for service
+        *
         * @return      array           service description array
         */
        function getServiceInfo() {
                return $this->info;
        }
 
-
        /**
+        * Returns the service key of the service
+        *
         * @return      string          service key
         */
        function getServiceKey() {
                return $this->info['serviceKey'];
        }
 
-
        /**
+        * Returns the title of the service
+        *
         * @return      string          service title
         */
        function getServiceTitle() {
                return $this->info['title'];
        }
 
-
        /**
         * Returns service configuration values from the $TYPO3_CONF_VARS['SVCONF'] array
         *
         * @param       string          Name of the config option
         * @param       boolean         If set the 'default' config will be return if no special config for this service is available (default: true)
-        * @param       [type]          $includeDefaultConfig: ...
+        * @param       boolean         If set, the option value will be searched for in the "default" configuration (service key = "default") if not found for the service key of the service.
         * @return      mixed           configuration value for the service
         */
        function getServiceOption($optionName, $defaultValue='', $includeDefaultConfig=TRUE) {
@@ -237,13 +246,20 @@ class t3lib_svbase {
 
 
 
+
+
+
+
+
+
+
+
        /***************************************
         *
         *       Error handling
         *
         ***************************************/
 
-
        /**
         * Logs debug messages to t3lib_div::devLog()
         *
@@ -258,7 +274,6 @@ class t3lib_svbase {
                }
        }
 
-
        /**
         * Puts an error on the error stack. Calling without parameter adds a general error.
         *
@@ -269,13 +284,12 @@ class t3lib_svbase {
        function errorPush($errNum=T3_ERR_SV_GENERAL, $errMsg='Unspecified error occured') {
                array_push($this->error, array('nr'=>$errNum, 'msg'=>$errMsg));
 
-               if (is_object($GLOBALS["TT"])) {
+               if (is_object($GLOBALS['TT'])) {
                        $GLOBALS['TT']->setTSlogMessage($errMsg,2);
                }
 
        }
 
-
        /**
         * Removes the last error from the error stack.
         *
@@ -287,7 +301,6 @@ class t3lib_svbase {
                // pop for $GLOBALS['TT']->setTSlogMessage is not supported
        }
 
-
        /**
         * Returns the last error number from the error stack.
         *
@@ -302,7 +315,6 @@ class t3lib_svbase {
                }
        }
 
-
        /**
         * Returns the last message from the error stack.
         *
@@ -317,7 +329,6 @@ class t3lib_svbase {
                }
        }
 
-
        /**
         * Returns all error messages as array.
         *
@@ -335,7 +346,6 @@ class t3lib_svbase {
                return $errArr;
        }
 
-
        /**
         * Returns the last array from the error stack.
         *
@@ -356,14 +366,21 @@ class t3lib_svbase {
 
 
 
+
+
+
+
+
+
+
+
+
        /***************************************
         *
         *       General service functions
         *
         ***************************************/
 
-
-
        /**
         * check the availability of external programs
         *
@@ -371,6 +388,8 @@ class t3lib_svbase {
         * @return      boolean         return FALSE if one program was not found
         */
        function checkExec($progList) {
+               global $TYPO3_CONF_VARS;
+
                $ret = TRUE;
 
                require_once(PATH_t3lib.'class.t3lib_exec.php');
@@ -386,7 +405,6 @@ class t3lib_svbase {
                return $ret;
        }
 
-
        /**
         * Deactivate the service. Use this if the service fails at runtime and will not be available.
         *
@@ -397,29 +415,15 @@ class t3lib_svbase {
        }
 
 
-/**
-function available()   {
-       global $AB,$BE_USER,$LANG,$BACK_PATH,$TCA_DESCR,$TCA,$CLIENT,$TYPO3_CONF_VARS;
 
-       // check if the service is available at runtime
-       // the sense of this method is that the service might need some more information to check the availablity
 
-       / *
 
-       $excludeServiceKeys='';
-       while (is_object($serviceObj = t3lib_div::makeInstanceService('anyService','', $excludeServiceKeys))) {
-               if ($serviceObj->available('some special parm to check availablity')) {
-                       break;
-               }
-               $excludeServiceKeys .= ','.$serviceObj->getServiceKey;
-               unset($serviceObj);
-       }
 
-       * /
 
-       return TRUE;
-}
-*/
+
+
+
+
 
 
        /***************************************
@@ -428,8 +432,6 @@ function available()        {
         *
         ***************************************/
 
-
-
        /**
         * Check if a file exists and is readable.
         *
@@ -437,7 +439,7 @@ function available()        {
         * @return      string          File name or FALSE.
         */
        function checkInputFile ($absFile)      {
-               if(@is_file($absFile)) {
+               if(t3lib_div::isAllowedAbsPath($absFile) && @is_file($absFile)) {
                        if(@is_readable($absFile)) {
                                return $absFile;
                        } else {
@@ -449,7 +451,6 @@ function available()        {
                return FALSE;
        }
 
-
        /**
         * Read content from a file a file.
         *
@@ -474,7 +475,6 @@ function available()        {
                return $out;
        }
 
-
        /**
         * Write content to a file.
         *
@@ -489,7 +489,7 @@ function available()        {
                        $absFile = $this->tempFile($this->prefixId);
                }
 
-               if($absFile) {
+               if($absFile && t3lib_div::isAllowedAbsPath($absFile)) {
                        if ($fd = @fopen($absFile,'wb')) {
                                @fwrite($fd, $content);
                                @fclose($fd);
@@ -544,19 +544,29 @@ function available()      {
        }
 
 
+
+
+
+
+
+
+
+
+
+
+
        /***************************************
         *
         *       IO input
         *
         ***************************************/
 
-
        /**
         * Set the input content for service processing.
         *
-        * @param       mixed
-        * @param       [type]          $type: ...
-        * @return      [type]          ...
+        * @param       mixed           Input content (going into ->inputContent)
+        * @param       string          The type of the input content (or file). Might be the same as the service subtypes.
+        * @return      void
         */
        function setInput ($content, $type='') {
                $this->inputContent = $content;
@@ -564,13 +574,12 @@ function available()      {
                $this->inputType = $type;
        }
 
-
        /**
         * Set the input file name for service processing.
         *
         * @param       string          file name
-        * @param       [type]          $type: ...
-        * @return      [type]          ...
+        * @param       string          The type of the input content (or file). Might be the same as the service subtypes.
+        * @return      void
         */
        function setInputFile ($absFile, $type='') {
                $this->inputContent = '';
@@ -578,10 +587,9 @@ function available()       {
                $this->inputType = $type;
        }
 
-
        /**
         * Get the input content.
-        * Will be read from input file if needed.
+        * Will be read from input file if needed. (That is if ->inputContent is empty and ->inputFile is not)
         *
         * @return      mixed
         */
@@ -592,7 +600,6 @@ function available()        {
                return $this->inputContent;
        }
 
-
        /**
         * Get the input file name.
         * If the content was set by setContent a file will be created.
@@ -612,24 +619,29 @@ function available()      {
 
 
 
+
+
+
+
+
+
+
        /***************************************
         *
         *       IO output
         *
         ***************************************/
 
-
        /**
         * Set the output file name.
         *
         * @param       string          file name
-        * @return      [type]          ...
+        * @return      void
         */
        function setOutputFile ($absFile) {
                $this->outputFile = $absFile;
        }
 
-
        /**
         * Get the output content.
         *
@@ -642,11 +654,10 @@ function available()      {
                return $this->out;
        }
 
-
        /**
-        * Get the output file name.
+        * Get the output file name. If no output file is set, the ->out buffer is written to the file given by input parameter filename
         *
-        * @param       [type]          $absFile: ...
+        * @param       string          Absolute filename to write to
         * @return      mixed
         */
        function getOutputFile ($absFile='') {
@@ -659,6 +670,14 @@ function available()       {
 
 
 
+
+
+
+
+
+
+
+
        /***************************************
         *
         *       Service implementation
@@ -690,7 +709,6 @@ function available()        {
                return $this->getLastError();
        }
 
-
        /**
         * Resets the service.
         * Will be called by init(). Should be used before every use if a service instance is used multiple times.
@@ -716,12 +734,10 @@ function available()      {
                $this->unlinkTempFiles();
        }
 
-
        /* every service type has it's own API
-       function process($content='', $type='', $conf=array())  {
+       function process($content='', $type='', $conf=array())  {       //
        }
        */
-
 }
 
 /**
index f818e91..3d66c05 100755 (executable)
@@ -708,7 +708,7 @@ class t3lib_TCEforms        {
 
                        // Get the TCA configuration for the current field:
                $PA['fieldConf'] = $TCA[$table]['columns'][$field];
-               $PA['fieldConf']['config']['form_type'] = $PA['fieldConf']['config']['form_type'] ? $PA['fieldConf']['config']['form_type'] : $PA['fieldConf']['config']['type'];
+               $PA['fieldConf']['config']['form_type'] = $PA['fieldConf']['config']['form_type'] ? $PA['fieldConf']['config']['form_type'] : $PA['fieldConf']['config']['type'];       // Using "form_type" locally in this script
 
                        // Now, check if this field is configured and editable (according to excludefields + other configuration)
                if (    is_array($PA['fieldConf']) &&
@@ -828,7 +828,7 @@ class t3lib_TCEforms        {
         * @see getSingleField(), getSingleField_typeFlex_draw()
         */
        function getSingleField_SW($table,$field,$row,&$PA)     {
-               $PA['fieldConf']['config']['form_type'] = $PA['fieldConf']['config']['form_type'] ? $PA['fieldConf']['config']['form_type'] : $PA['fieldConf']['config']['type'];
+               $PA['fieldConf']['config']['form_type'] = $PA['fieldConf']['config']['form_type'] ? $PA['fieldConf']['config']['form_type'] : $PA['fieldConf']['config']['type'];       // Using "form_type" locally in this script
 
                switch($PA['fieldConf']['config']['form_type']) {
                        case 'input':
@@ -1160,8 +1160,7 @@ class t3lib_TCEforms      {
 
                                // Checking languages and authMode:
                        $languageDeny = $TCA[$table]['ctrl']['languageField'] && !strcmp($TCA[$table]['ctrl']['languageField'], $field) && !$GLOBALS['BE_USER']->checkLanguageAccess($p[1]);
-                       $authModeDeny = $config['type']=='select' && $config['authMode'] && !$GLOBALS['BE_USER']->checkAuthMode($table,$field,$p[1],$config['authMode']);
-
+                       $authModeDeny = $config['form_type']=='select' && $config['authMode'] && !$GLOBALS['BE_USER']->checkAuthMode($table,$field,$p[1],$config['authMode']);
                        if (in_array($p[1],$removeItems) || $languageDeny || $authModeDeny)     {
                                unset($selItems[$tk]);
                        } elseif (isset($PA['fieldTSConfig']['altLabels.'][$p[1]])) {
@@ -1558,7 +1557,7 @@ class t3lib_TCEforms      {
                foreach($itemArray as $tk => $tv) {
                        $tvP = explode('|',$tv,2);
                        $evalValue = rawurldecode($tvP[0]);
-                       $isRemoved = in_array($evalValue,$removeItems)  || ($config['type']=='select' && $config['authMode'] && !$GLOBALS['BE_USER']->checkAuthMode($table,$field,$evalValue,$config['authMode']));
+                       $isRemoved = in_array($evalValue,$removeItems)  || ($config['form_type']=='select' && $config['authMode'] && !$GLOBALS['BE_USER']->checkAuthMode($table,$field,$evalValue,$config['authMode']));
                        if ($isRemoved && !$PA['fieldTSConfig']['disableNoMatchingValueElement'] && !$config['disableNoMatchingValueElement'])  {
                                $tvP[1] = rawurlencode(@sprintf($nMV_label, $evalValue));
                        } elseif (isset($PA['fieldTSConfig']['altLabels.'][$evalValue])) {
@@ -1744,7 +1743,7 @@ class t3lib_TCEforms      {
                                                $imgs[] = '<span class="nobr">'.
                                                                $this->getClickMenu(t3lib_iconWorks::getIconImage($this_table,$rr,$this->backPath,'align="top" title="'.htmlspecialchars(t3lib_BEfunc::getRecordPath($rr['pid'],$perms_clause,15)).' [UID: '.$rr['uid'].']"'),$this_table, $this_uid).
                                                                '&nbsp;'.
-                                                               $this->noTitle($rr[$GLOBALS['TCA'][$this_table]['ctrl']['label']],array('<em>','</em>')).
+                                                               $this->noTitle($rr[$GLOBALS['TCA'][$this_table]['ctrl']['label']],array('<em>','</em>')).' <span class="typo3-dimmed"><em>['.$rr['uid'].']</em></span>'.
                                                                '</span>';
                                        }
                                }
@@ -2803,7 +2802,7 @@ class t3lib_TCEforms      {
                $listFlag = '_list';
 
                        // Manipulate the field name (to be the true form field name) and remove a suffix-value if the item is a selector box with renderMode "singlebox":
-               if ($PA['fieldConf']['config']['type']=='select')       {
+               if ($PA['fieldConf']['config']['form_type']=='select')  {
                        if ($PA['fieldConf']['config']['maxitems']<=1)  {       // Single select situation:
                                $listFlag = '';
                        } elseif ($PA['fieldConf']['config']['renderMode']=='singlebox')        {
index dc3741a..4f4a2e4 100755 (executable)
@@ -1329,13 +1329,7 @@ class t3lib_TStemplate   {
                        // linkVars
                if ($GLOBALS['TSFE']->config['config']['uniqueLinkVars']) {
                        if ($addParams) {
-                               $lV = array();
-                               $addParamsArr = t3lib_div::trimExplode('&',$GLOBALS['TSFE']->linkVars.$addParams,1);
-                               while(list($k,$e)=each($addParamsArr)) if ($e) {
-                                       list($k,$v) = explode('=',$e, 2);
-                                       $lV[$k] = $v;
-                               }
-                               $LD['linkVars'] = t3lib_div::implodeArrayForUrl('',$lV);
+                               $LD['linkVars'] = t3lib_div::implodeArrayForUrl('',t3lib_div::explodeUrl2Array($GLOBALS['TSFE']->linkVars.$addParams));
                        } else {
                                $LD['linkVars'] = $GLOBALS['TSFE']->linkVars;
                        }
index ec532ac..7db323e 100755 (executable)
  * Revised for TYPO3 3.6 July/2003 by Kasper Skaarhoj
  *
  * @author     Kasper Skaarhoj <kasperYYYY@typo3.com>
+ * @author     René Fritz <r.fritz@colorcube.de>
  */
 /**
  * [CLASS/FUNCTION INDEX of SCRIPT]
  *
  *
  *
- *   89: class t3lib_userAuth
- *  160:     function start()
- *  262:     function check_authentication()
- *  423:     function redirect()
- *  436:     function logoff()
- *  451:     function gc()
- *  465:     function user_where_clause()
- *  479:     function ipLockClause()
- *  497:     function ipLockClause_remoteIPNumber($parts)
- *  518:     function hashLockClause()
- *  529:     function hashLockClause_getHashInt()
- *  545:     function writeUC($variable='')
- *  568:     function writelog($type,$action,$error,$details_nr,$details,$data,$tablename,$recuid,$recpid)
- *  577:     function checkLogFailures()
- *  586:     function unpack_uc($theUC='')
- *  602:     function pushModuleData($module,$data,$noSave=0)
- *  615:     function getModuleData($module,$type='')
- *  628:     function getSessionData($key)
- *  641:     function setAndSaveSessionData($key,$data)
- *  660:     function setBeUserByUid($uid)
- *  673:     function setBeUserByName($name)
+ *  111: class t3lib_userAuth
+ *  187:     function start()
+ *  300:     function checkAuthentication()
  *
- * TOTAL FUNCTIONS: 20
+ *              SECTION: User Sessions
+ *  531:     function createUserSession ($tempuser)
+ *  568:     function fetchUserSession()
+ *  619:     function logoff()
+ *
+ *              SECTION: SQL Functions
+ *  655:     function user_where_clause()
+ *  669:     function ipLockClause()
+ *  687:     function ipLockClause_remoteIPNumber($parts)
+ *  708:     function hashLockClause()
+ *  719:     function hashLockClause_getHashInt()
+ *
+ *              SECTION: Session and Configuration Handling
+ *  751:     function writeUC($variable='')
+ *  766:     function unpack_uc($theUC='')
+ *  782:     function pushModuleData($module,$data,$noSave=0)
+ *  795:     function getModuleData($module,$type='')
+ *  808:     function getSessionData($key)
+ *  821:     function setAndSaveSessionData($key,$data)
+ *
+ *              SECTION: Misc
+ *  854:     function getLoginFormData()
+ *  881:     function processLoginData($loginData, $security_level='')
+ *  915:     function getAuthInfoArray()
+ *  945:     function compareUident($user, $loginData, $security_level='')
+ *  983:     function gc()
+ *  997:     function redirect()
+ * 1019:     function writelog($type,$action,$error,$details_nr,$details,$data,$tablename,$recuid,$recpid)
+ * 1028:     function checkLogFailures()
+ * 1041:     function setBeUserByUid($uid)
+ * 1053:     function setBeUserByName($name)
+ * 1064:     function getRawUserByUid($uid)
+ * 1082:     function getRawUserByName($name)
+ *
+ *              SECTION: Create/update user - EXPERIMENTAL
+ * 1121:     function fetchUserRecord($dbUser, $username, $extraWhere='' )
+ *
+ * TOTAL FUNCTIONS: 29
  * (This index is automatically created/updated by the extension "extdeveval")
  *
  */
 
 
+require_once(t3lib_extMgm::extPath('sv').'class.tx_sv_authbase.php');
 
 
 
  * See Inside TYPO3 for more information about the API of the class and internal variables.
  *
  * @author     Kasper Skaarhoj <kasperYYYY@typo3.com>
+ * @author     René Fritz <r.fritz@colorcube.de>
  * @package TYPO3
  * @subpackage t3lib
  */
@@ -110,7 +132,7 @@ class t3lib_userAuth {
        var $formfield_uident = '';             // formfield with password
        var $formfield_chalvalue = '';          // formfield with a unique value which is used to encrypt the password and username
        var $formfield_status = '';             // formfield with status: *'login', 'logout'. If empty login is not verified.
-       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.
+       var $security_level = 'normal';         // sets the level of security. *'normal' = clear-text. 'challenged' = hashed password/username from form in $formfield_uident. 'superchallenged' = hashed password hashed again with username.
 
        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.
 
@@ -118,32 +140,45 @@ class t3lib_userAuth {
        var $lifetime = 0;                  // 0 = Session-cookies. If session-cookies, the browser will stop session when the browser is closed. Else it keeps the session for $lifetime seconds.
        var $gc_time  = 24;                     // GarbageCollection. Purge all session data older than $gc_time hours.
        var $gc_probability = 1;                        // Possibility (in percent) for GarbageCollection to be run.
-       var $writeStdLog = 0;                                   // Decides if the writelog() function is called at login and logout
-       var $writeAttemptLog = 0;                               // If the writelog() functions is called if a login-attempt has be tried without success
-       var $sendNoCacheHeaders = 1;            // If this is set, headers is sent to assure, caching is NOT done
-       var $getFallBack = 0;                           // If this is set, authentication is also accepted by the $_GET. Notice that the identification is NOT 128bit MD5 hash but reduced. This is done in order to minimize the size for mobile-devices, such as WAP-phones
+       var $writeStdLog = FALSE;                       // Decides if the writelog() function is called at login and logout
+       var $writeAttemptLog = FALSE;           // If the writelog() functions is called if a login-attempt has be tried without success
+       var $sendNoCacheHeaders = TRUE;         // If this is set, headers is sent to assure, caching is NOT done
+       var $getFallBack = FALSE;                       // If this is set, authentication is also accepted by the $_GET. Notice that the identification is NOT 128bit MD5 hash but reduced. This is done in order to minimize the size for mobile-devices, such as WAP-phones
        var $hash_length = 32;                          // The ident-hash is normally 32 characters and should be! But if you are making sites for WAP-devices og other lowbandwidth stuff, you may shorten the length. Never let this value drop below 6. A length of 6 would give you more than 16 mio possibilities.
-       var $getMethodEnabled = 0;                      // Setting this flag true lets user-authetication happen from GET_VARS if POST_VARS are not set. Thus you may supply username/password from the URL.
+       var $getMethodEnabled = FALSE;          // Setting this flag true lets user-authetication happen from GET_VARS if POST_VARS are not set. Thus you may supply username/password from the URL.
        var $lockIP = 4;                                        // If set, will lock the session to the users IP address (all four numbers. Reducing to 1-3 means that only first, second or third part of the IP address is used).
        var $lockHashKeyWords = 'useragent';    // Keyword list (commalist with no spaces!): "useragent". Each keyword indicates some information that can be included in a integer hash made to lock down usersessions.
 
        var $warningEmail = '';                         // warning -emailaddress:
        var $warningPeriod = 3600;                      // Period back in time (in seconds) in which number of failed logins are collected
        var $warningMax = 3;                            // The maximum accepted number of warnings before an email is sent
-       var $checkPid=1;                                        // If set, the user-record must $checkPid_value as pid
+       var $checkPid = TRUE;                           // If set, the user-record must $checkPid_value as pid
        var $checkPid_value=0;                          // The pid, the user-record must have as page-id
 
                // Internals
        var $id;                                                        // Internal: Will contain session_id (MD5-hash)
        var $cookieId;                                          // Internal: Will contain the session_id gotten from cookie or GET method. This is used in statistics as a reliable cookie (one which is known to come from $_COOKIE).
-       var $loginSessionStarted = 0;           // Will be set to 1 if the login session is actually written during auth-check.
+       var $loginFailure = FALSE;                      // Indicates if an authentication was started but failed
+       var $loginSessionStarted = FALSE;       // Will be set to true if the login session is actually written during auth-check.
 
        var $user;                                                      // Internal: Will contain user- AND session-data from database (joined tables)
        var $get_URL_ID = '';                           // Internal: Will will be set to the url--ready (eg. '&login=ab7ef8d...') GET-auth-var if getFallBack is true. Should be inserted in links!
 
-       var $forceSetCookie=0;                          // Will force the session cookie to be set everytime (lifetime must be 0)
-       var $dontSetCookie=0;                           // Will prevent the setting of the session cookie (takes precedence over forceSetCookie)
-       var $challengeStoredInCookie=0;         // If set, the challenge value will be stored in a session as well so the server can check that is was not forged.
+       var $newSessionID = FALSE;                      // Will be set to true if a new session ID was created
+       var $forceSetCookie = FALSE;            // Will force the session cookie to be set everytime (lifetime must be 0)
+       var $dontSetCookie = FALSE;                     // Will prevent the setting of the session cookie (takes precedence over forceSetCookie)
+       var $challengeStoredInCookie = FALSE;   // If set, the challenge value will be stored in a session as well so the server can check that is was not forged.
+       var $loginType = '';                            // Login type, used for services.
+
+       var $svConfig = array();                        // "auth" services configuration array from $TYPO3_CONF_VARS['SVCONF']['auth']
+       var $writeDevLog = FALSE;                       // write messages into the devlog?
+
+
+
+
+
+
+
 
 
        /**
@@ -160,11 +195,27 @@ class t3lib_userAuth {
        function start() {
                global $TYPO3_CONF_VARS;
 
+                       // backend or frontend login - used for auth services
+               $this->loginType = ($this->name=='fe_typo_user') ? 'FE' : 'BE';
+
+                       // set level to normal if not already set
+               $this->security_level = $this->security_level ? $this->security_level : 'normal';
+
+                       // enable dev logging if set
+               if ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_userauth.php']['writeDevLog']) $this->writeDevLog = TRUE;
+               if ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_userauth.php']['writeDevLog'.$this->loginType]) $this->writeDevLog = TRUE;
+               if (TYPO3_DLOG) $this->writeDevLog = TRUE;
+
+               if ($this->writeDevLog)         t3lib_div::devLog('## Beginning of auth logging.', 't3lib_userAuth');
+
                        // Init vars.
-               $mode='';
-               $new_id = false;                                // Default: not a new session
-               $id = isset($_COOKIE[$this->name]) ? stripslashes($_COOKIE[$this->name]) : '';  // $id is set to ses_id if cookie is present. Else set to false, which will start a new session
+               $mode = '';
+               $this->newSessionID = FALSE;
+                       // $id is set to ses_id if cookie is present. Else set to false, which will start a new session
+               $id = isset($_COOKIE[$this->name]) ? stripslashes($_COOKIE[$this->name]) : '';
                $this->hash_length = t3lib_div::intInRange($this->hash_length,6,32);
+               $this->svConfig = $TYPO3_CONF_VARS['SVCONF']['auth'];
+
 
                        // If fallback to get mode....
                if (!$id && $this->getFallBack && $this->get_name)      {
@@ -174,47 +225,54 @@ class t3lib_userAuth {
                }
                $this->cookieId = $id;
 
-               if (!$id)       {                                       // If new session...
-               $id = substr(md5(uniqid('')),0,$this->hash_length);             // New random session-$id is made
-                       $new_id = true;                         // New session
+                       // If new session...
+               if (!$id)       {
+                               // New random session-$id is made
+               $id = substr(md5(uniqid('').getmypid()),0,$this->hash_length);
+                       // New session
+                       $this->newSessionID = TRUE;
                }
+
                        // Internal var 'id' is set
                $this->id = $id;
-               if ($mode=='get' && $this->getFallBack && $this->get_name)      {       // If fallback to get mode....
+
+                       // If fallback to get mode....
+               if ($mode=='get' && $this->getFallBack && $this->get_name)      {
                        $this->get_URL_ID = '&'.$this->get_name.'='.$id;
                }
-               $this->user = '';                               // Make certain that NO user is set initially
+                       // Make certain that NO user is set initially
+               $this->user = '';
 
                        // Setting cookies
-        if (($new_id || $this->forceSetCookie) && $this->lifetime==0 ) {               // If new session and the cookie is a sessioncookie, we need to set it only once!
-          if (!$this->dontSetCookie)   SetCookie($this->name, $id, 0, '/');            // Cookie is set
-        }
-        if ($this->lifetime > 0) {             // If it is NOT a session-cookie, we need to refresh it.
-          if (!$this->dontSetCookie)   SetCookie($this->name, $id, time()+$this->lifetime, '/');
-        }
+                       // If new session and the cookie is a sessioncookie, we need to set it only once!
+        if (($this->newSessionID || $this->forceSetCookie) && $this->lifetime==0 ) {
+                       if (!$this->dontSetCookie)      {
+                               SetCookie($this->name, $id, 0, '/');
+                               if ($this->writeDevLog)         t3lib_div::devLog('Set new Cookie: '.$id, 't3lib_userAuth');
+                       }
+               }
 
-                       // Check to see if anyone has submitted login-information and if so register the user with the session. $this->user[uid] may be used to write log...
-               if ($this->formfield_status)    {
-                       $this->check_authentication();
+                       // If it is NOT a session-cookie, we need to refresh it.
+        if ($this->lifetime > 0) {
+                       if (!$this->dontSetCookie)      {
+                               SetCookie($this->name, $id, time()+$this->lifetime, '/');
+                               if ($this->writeDevLog)         t3lib_div::devLog('Update Cookie: '.$id, 't3lib_userAuth');
+               }
                }
-               unset($this->user);                             // Make certain that NO user is set initially. ->check_authentication may have set a session-record which will provide us with a user record in the next section:
 
+                       // Check to see if anyone has submitted login-information and if so register the user with the session. $this->user[uid] may be used to write log...
+               $this->checkAuthentication();
 
-                       // The session_id is used to find user in the database. Two tables are joined: The session-table with user_id of the session and the usertable with its primary key
-               $dbres = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
-                                               '*',
-                                               $this->session_table.','.$this->user_table,
-                                               $this->session_table.'.ses_id = '.$GLOBALS['TYPO3_DB']->fullQuoteStr($this->id, $this->session_table).'
-                                                       AND '.$this->session_table.'.ses_name = '.$GLOBALS['TYPO3_DB']->fullQuoteStr($this->name, $this->session_table).'
-                                                       AND '.$this->session_table.'.ses_userid = '.$this->user_table.'.'.$this->userid_column.'
-                                                       '.$this->ipLockClause().'
-                                                       '.$this->hashLockClause().'
-                                                       '.$this->user_where_clause()
-                                       );
+                       // Make certain that NO user is set initially. ->check_authentication may have set a session-record which will provide us with a user record in the next section:
+               unset($this->user);
 
-               $this->user = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($dbres);
+                       // re-read user session
+               $this->user = $this->fetchUserSession();
 
-               // Hook for alternative ways of filling the $this->user array (is used by TIMTAW extension)
+               if ($this->writeDevLog AND is_array($this->user))       t3lib_div::devLog('User session finally read: '.t3lib_div::arrayToLogString($this->user, array($this->userid_column,$this->username_column)), 't3lib_userAuth', -1);
+               if ($this->writeDevLog AND !is_array($this->user)) t3lib_div::devLog('No user session found.', 't3lib_userAuth', 2);
+
+                       // Hook for alternative ways of filling the $this->user array (is used by TIMTAW extension)
                if(is_array($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_userauth.php']['postUserLookUp']))        {
                        foreach($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_userauth.php']['postUserLookUp'] as $funcName)        {
                                $_params = array(
@@ -224,32 +282,8 @@ class t3lib_userAuth {
                        }
                }
 
-               if ($this->user)        {
-                               // A user was found
-                       if (is_string($this->auth_timeout_field))       {
-                               $timeout = intval($this->user[$this->auth_timeout_field]);              // Get timeout-time from usertable
-                       } else {
-                               $timeout = intval($this->auth_timeout_field);                                   // Get timeout from object
-                       }
-                               // If timeout > 0 (true) and currenttime has not exceeded the latest sessions-time plus the timeout in seconds then accept user
-                               // Option later on: We could check that last update was at least x seconds ago in order not to update twice in a row if one script redirects to another...
-                       if ($timeout>0 && ($GLOBALS['EXEC_TIME'] < ($this->user['ses_tstamp']+$timeout)))       {
-                                       $GLOBALS['TYPO3_DB']->exec_UPDATEquery(
-                                                                                       $this->session_table,
-                                                                                       'ses_id='.$GLOBALS['TYPO3_DB']->fullQuoteStr($this->id, $this->session_table).'
-                                                                                               AND ses_name='.$GLOBALS['TYPO3_DB']->fullQuoteStr($this->name, $this->session_table),
-                                                                                       array('ses_tstamp' => $GLOBALS['EXEC_TIME'])
-                                                                               );
-                                       $this->user['ses_tstamp'] = $GLOBALS['EXEC_TIME'];      // Make sure that the timestamp is also updated in the array
-                       } else {
-                               $this->user = '';
-                               $this->logoff();                // delete any user set...
-                       }
-               } else {
-                       $this->logoff();                // delete any user set...
-               }
-
-               $this->redirect();              // If any redirection (inclusion of file) then it will happen in this function
+                       // If any redirection (inclusion of file) then it will happen in this function
+               $this->redirect();
 
                        // Set all posible headers that could ensure that the script is not cached on the client-side
                if ($this->sendNoCacheHeaders)  {
@@ -267,208 +301,359 @@ class t3lib_userAuth {
        }
 
        /**
-        * Checks if a submission of username and password is present
+        * Checks if a submission of username and password is present or use other authentication by auth services
         *
-        * @return      string          Returns "login" if login, "logout" if logout, or empty if $F_status was none of these values.
+        * @return      void
         * @internal
         */
-       function check_authentication() {
+       function checkAuthentication() {
 
-                       // The values fetched from input variables here are supposed to already BE slashed...
-               if ($this->getMethodEnabled)    {
-                       $F_status = t3lib_div::_GP($this->formfield_status);
-                       $F_uname = t3lib_div::_GP($this->formfield_uname);
-                       $F_uident = t3lib_div::_GP($this->formfield_uident);
-                       $F_chalvalue = t3lib_div::_GP($this->formfield_chalvalue);
-               } else {
-                       $F_status = t3lib_div::_POST($this->formfield_status);
-                       $F_uname = t3lib_div::_POST($this->formfield_uname);
-                       $F_uident = t3lib_div::_POST($this->formfield_uident);
-                       $F_chalvalue = t3lib_div::_POST($this->formfield_chalvalue);
+                       // No user for now - will be searched by service below
+               $tempuserArr = array();
+               $tempuser = FALSE;
+
+                       // User is not authenticated by default
+               $authenticated = FALSE;
+
+                       // User want to login with passed login data (name/password)
+               $activeLogin = FALSE;
+
+                       // Indicates if an active authentication failed (not auto login)
+               $this->loginFailure = FALSE;
+
+               if ($this->writeDevLog)         t3lib_div::devLog('Login type: '.$this->loginType, 't3lib_userAuth');
+
+                       // The info array provide additional information for auth services
+               $authInfo = $this->getAuthInfoArray();
+
+                       // Get Login/Logout data submitted by a form or params
+               $loginData = $this->getLoginFormData();
+
+               if ($this->writeDevLog)         t3lib_div::devLog('Login data: '.t3lib_div::arrayToLogString($loginData), 't3lib_userAuth');
+
+
+                       // active logout (eg. with "logout" button)
+               if ($loginData['status']=='logout') {
+                       if ($this->writeStdLog)         $this->writelog(255,2,0,2,'User %s logged out',Array($this->user['username'])); // Logout written to log
+                       if ($this->writeDevLog)         t3lib_div::devLog('User logged out. Id: '.$this->id, 't3lib_userAuth', -1);
+
+                       $this->logoff();
                }
 
-               switch ($F_status)      {
-                       case 'login':
-                               $refInfo=parse_url(t3lib_div::getIndpEnv('HTTP_REFERER'));
+                       // active login (eg. with login form)
+               if ($loginData['status']=='login') {
+                       $activeLogin = TRUE;
+
+                       if ($this->writeDevLog)         t3lib_div::devLog('Active login (eg. with login form)', 't3lib_userAuth');
+
+                               // check referer for submitted login values
+                       if($this->formfield_status && $loginData['uident'] && $loginData['uname'])      {
                                $httpHost = t3lib_div::getIndpEnv('TYPO3_HOST_ONLY');
-                               if (!$this->getMethodEnabled && ($httpHost!=$refInfo['host'] && !$GLOBALS['TYPO3_CONF_VARS']['SYS']['doNotCheckReferer']))      {
-                                       die('Error: This host address ("'.$httpHost.'") and the referer host ("'.$refInfo['host'].'") mismatches!<br />
+                               if (!$this->getMethodEnabled && ($httpHost!=$authInfo['refInfo']['host'] && !$GLOBALS['TYPO3_CONF_VARS']['SYS']['doNotCheckReferer']))  {
+                                       die('Error: This host address ("'.$httpHost.'") and the referer host ("'.$authInfo['refInfo']['host'].'") mismatches!<br />
                                                It\'s possible that the environment variable HTTP_REFERER is not passed to the script because of a proxy.<br />
                                                The site administrator can disable this check in the "All Configuration" section of the Install Tool (flag: TYPO3_CONF_VARS[SYS][doNotCheckReferer]).');
                                }
-                               if ($F_uident && $F_uname)      {
 
-                                               // Reset this flag
-                                       $loginFailure=0;
+                                       // delete old user session if any
+                               $this->logoff();
+                       }
+               }
 
-                                               // delete old user session if any
-                                       $this->logoff();
 
-                                               // Look up the new user by the username:
-                                       $dbres = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
-                                                                       '*',
-                                                                       $this->user_table,
-                                                                       ($this->checkPid ? 'pid IN ('.$GLOBALS['TYPO3_DB']->cleanIntList($this->checkPid_value).') AND ' : '').
-                                                                               $this->username_column.'='.$GLOBALS['TYPO3_DB']->fullQuoteStr($F_uname, $this->user_table).' '.
-                                                                               $this->user_where_clause()
-                                                       );
-
-                                               // Enter, if a user was found:
-                                       if ($tempuser = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($dbres))  {
-                                                       // Internal user record set (temporarily)
-                                               $this->user = $tempuser;
-
-                                                       // Default: not OK - will be set true if password matches in the comparison hereafter
-                                               $OK = false;
-
-                                                       // check the password
-                                               switch ($this->security_level)  {
-                                                       case 'superchallenged':         // If superchallenged the password in the database ($tempuser[$this->userident_column]) must be a md5-hash of the original password.
-                                                       case 'challenged':
-
-                                                               if ($this->challengeStoredInCookie)     {
-                                                                       session_start();
-                                                                       if ($_SESSION['login_challenge'] !== $F_chalvalue) {
-                                                                               $this->logoff();
-                                                                               return 'login';
-                                                                       }
-                                                               }
-
-                                                               if (!strcmp($F_uident,md5($tempuser[$this->username_column].':'.$tempuser[$this->userident_column].':'.$F_chalvalue)))  {
-                                                                       $OK = true;
-                                                               };
-                                                       break;
-                                                       default:        // normal
-                                                               if (!strcmp($F_uident,$tempuser[$this->userident_column]))      {
-                                                                       $OK = true;
-                                                               };
-                                                       break;
-                                               }
+               // the following code makes auto-login possible (if configured). No submitted data needed
 
-                                                       // Write session-record in case user was verified OK
-                                               if ($OK)        {
-                                                               // Checking the domain (lockToDomain)
-                                                       if ($this->user['lockToDomain'] && $this->user['lockToDomain']!=t3lib_div::getIndpEnv('HTTP_HOST'))     {
-                                                                       // Lock domain didn't match, so error:
-                                                               if ($this->writeAttemptLog) {
-                                                                       $this->writelog(255,3,3,1,
-                                                                               "Login-attempt from %s (%s), username '%s', locked domain '%s' did not match '%s'!",
-                                                                               Array(t3lib_div::getIndpEnv('REMOTE_ADDR'),t3lib_div::getIndpEnv('REMOTE_HOST'),$F_uname,$this->user['lockToDomain'],t3lib_div::getIndpEnv('HTTP_HOST')));
-                                                               }
-                                                               $loginFailure=1;
-                                                       } else {
-                                                                       // The loginsession is started.
-                                                               $this->loginSessionStarted = 1;
-
-                                                                       // Inserting session record:
-                                                               $insertFields = array(
-                                                                       'ses_id' => $this->id,
-                                                                       'ses_name' => $this->name,
-                                                                       'ses_iplock' => $this->user['disableIPlock'] ? '[DISABLED]' : $this->ipLockClause_remoteIPNumber($this->lockIP),
-                                                                       'ses_hashlock' => $this->hashLockClause_getHashInt(),
-                                                                       'ses_userid' => $tempuser[$this->userid_column],
-                                                                       'ses_tstamp' => $GLOBALS['EXEC_TIME']
-                                                               );
-                                                               $GLOBALS['TYPO3_DB']->exec_INSERTquery($this->session_table, $insertFields);
-
-                                                                       // Updating column carrying information about last login.
-                                                               if ($this->lastLogin_column)    {
-                                                                       $GLOBALS['TYPO3_DB']->exec_UPDATEquery(
-                                                                                                                       $this->user_table,
-                                                                                                                       $this->userid_column.'='.$GLOBALS['TYPO3_DB']->fullQuoteStr($tempuser[$this->userid_column], $this->user_table),
-                                                                                                                       array($this->lastLogin_column => $GLOBALS['EXEC_TIME'])
-                                                                                                               );
-                                                               }
-                                                                       // User logged in - write that to the log!
-                                                               if ($this->writeStdLog) {
-                                                                       $this->writelog(255,1,0,1,
-                                                                               'User %s logged in from %s (%s)',
-                                                                               Array($this->user['username'],t3lib_div::getIndpEnv('REMOTE_ADDR'),t3lib_div::getIndpEnv('REMOTE_HOST')));
-                                                               }
-                                                       }
+                       // re-read user session
+               $authInfo['userSession'] = $this->fetchUserSession();
+               $haveSession = is_array($authInfo['userSession']) ? TRUE : FALSE;
+
+               if ($this->writeDevLog AND $haveSession)        t3lib_div::devLog('User session found: '.t3lib_div::arrayToLogString($authInfo['userSession'], array($this->userid_column,$this->username_column)), 't3lib_userAuth', 0);
+               if ($this->writeDevLog)         t3lib_div::devLog('SV setup: '.t3lib_div::arrayToLogString($this->svConfig['setup']), 't3lib_userAuth', 0);
+
+
+                       // fetch user if ...
+               if ( $activeLogin
+                               OR (!$haveSession AND $this->svConfig['setup'][$this->loginType.'_fetchUserIfNoSession'])
+                               OR $this->svConfig['setup'][$this->loginType.'_alwaysFetchUser']) {
+
+                               // use 'auth' service to find the user
+                               // first found user will be used
+                       $serviceChain = '';
+                       $subType = 'getUser'.$this->loginType;
+                       while (is_object($serviceObj = t3lib_div::makeInstanceService('auth', $subType, $serviceChain))) {
+                               $serviceChain.=','.$serviceObj->getServiceKey();
+                               $serviceObj->initAuth($subType, $loginData, $authInfo, $this);
+                               if ($row=$serviceObj->getUser()) {
+                                       $tempuserArr[] = $row;
+
+                                       if ($this->writeDevLog)         t3lib_div::devLog('User found: '.t3lib_div::arrayToLogString($row, array($this->userid_column,$this->username_column)), 't3lib_userAuth', 0);
+
+                                               // user found, just stop to search for more if not configured to go on
+                                       if(!$this->svConfig['setup'][$this->loginType.'_fetchAllUsers']) {
+                                               break;
+                                       }
+                               }
+                               unset($serviceObj);
+                       }
+                       unset($serviceObj);
+
+                       if ($this->writeDevLog AND $this->svConfig['setup'][$this->loginType.'_alwaysFetchUser'])       t3lib_div::devLog($this->loginType.'_alwaysFetchUser option is enabled', 't3lib_userAuth');
+                       if ($this->writeDevLog AND $serviceChain)       t3lib_div::devLog($subType.' auth services called: '.$serviceChain, 't3lib_userAuth');
+                       if ($this->writeDevLog AND !count($tempuserArr))        t3lib_div::devLog('No user found by services', 't3lib_userAuth');
+                       if ($this->writeDevLog AND count($tempuserArr))         t3lib_div::devLog(count($tempuserArr).' user records found by services', 't3lib_userAuth');
+               }
+
+
+                       // If no new user was set we use the already found user session
+               if (!count($tempuserArr) AND $haveSession)      {
+                       $tempuserArr[] = $authInfo['userSession'];
+                       $tempuser = $authInfo['userSession'];
+                               // User is authenticated because we found a user session
+                       $authenticated = TRUE;
+
+                       if ($this->writeDevLog)         t3lib_div::devLog('User session used: '.t3lib_div::arrayToLogString($authInfo['userSession'], array($this->userid_column,$this->username_column)), 't3lib_userAuth');
+               }
+
+
+                       // Re-auth user when 'auth'-service option is set
+               if ($this->svConfig['setup'][$this->loginType.'_alwaysAuthUser']) {
+                       $authenticated = FALSE;
+                       if ($this->writeDevLog)         t3lib_div::devLog('alwaysAuthUser option is enabled', 't3lib_userAuth');
+               }
+
+
+                       // Authenticate the user if needed
+               if(count($tempuserArr) AND !$authenticated) {
+
+                       foreach($tempuserArr as $tempuser) {
+
+                               // use 'auth' service to authenticate the user
+                               // if one service returns FALSE then authentication failed
+                               // a service might return 100 which means there's no reason to stop but the user can't be authenticated by that service
+
+                               if ($this->writeDevLog)         t3lib_div::devLog('Auth user: '.t3lib_div::arrayToLogString($tempuser), 't3lib_userAuth');
+
+                               $serviceChain='';
+                               $subType = 'authUser'.$this->loginType;
+                               while (is_object($serviceObj = t3lib_div::makeInstanceService('auth', $subType, $serviceChain))) {
+                                       $serviceChain.=','.$serviceObj->getServiceKey();
+                                       $serviceObj->initAuth($subType, $loginData, $authInfo, $this);
+                                       if (($ret=$serviceObj->authUser($tempuser)) > 0) {
+
+                                                       // if the service returns >=200 then no more checking is needed - useful for IP checking without password
+                                               if (intval($ret) >= 200)        {
+                                                       $authenticated = TRUE;
+                                                       break;
+                                               } elseif (intval($ret) >= 100) {
+                                                       // Just go on. User is still not authenticated but there's no reason to stop now.
                                                } else {
-                                                               // Failed login attempt (wrong password) - write that to the log!
-                                                       if ($this->writeAttemptLog) {
-                                                               $this->writelog(255,3,3,1,
-                                                                       "Login-attempt from %s (%s), username '%s', password not accepted!",
-                                                                       Array(t3lib_div::getIndpEnv('REMOTE_ADDR'),t3lib_div::getIndpEnv('REMOTE_HOST'),$F_uname));
-                                                       }
-                                                       $loginFailure=1;
+                                                       $authenticated = TRUE;
                                                }
-                                                       // Make sure to clear the user again!!
-                                               unset($this->user);
+
                                        } else {
-                                                       // Failed login attempt (no username found)
-                                               if ($this->writeAttemptLog) {
-                                                       $this->writelog(255,3,3,2,
-                                                               "Login-attempt from %s (%s), username '%s' not found!!",
-                                                               Array(t3lib_div::getIndpEnv('REMOTE_ADDR'),t3lib_div::getIndpEnv('REMOTE_HOST'),$F_uname));     // Logout written to log
-                                               }
-                                               $loginFailure=1;
+                                               $authenticated = FALSE;
+                                               break;
                                        }
+                                       unset($serviceObj);
+                               }
+                               unset($serviceObj);
 
-                                               // If there were a login failure, check to see if a warning email should be sent:
-                                       if ($loginFailure)      {
-                                               $this->checkLogFailures($this->warningEmail, $this->warningPeriod, $this->warningMax);
-                                       }
+                               if ($this->writeDevLog AND $serviceChain)       t3lib_div::devLog($subType.' auth services called: '.$serviceChain, 't3lib_userAuth');
+
+                               if($authenticated) {
+                                               // leave foreach() because a user is authenticated
+                                       break;
                                }
+                       }
+               }
 
-                                       // Return "login" - since this was the $F_status
-                               return 'login';
-                       break;
-                       case 'logout':
-                                       // Just logout:
-                               if ($this->writeStdLog)         $this->writelog(255,2,0,2,'User %s logged out',Array($this->user['username'])); // Logout written to log
-                               $this->logoff();
 
-                                       // Return "logout" - since this was the $F_status
-                               return 'logout';
-                       break;
+                       // If user is authenticated a valid user is in $tempuser
+               if ($authenticated)     {
+                               // reset failure flag
+                       $this->loginFailure = FALSE;
+
+
+                               // Insert session record if needed:
+                       if (!($haveSession AND (
+                               $tempuser['ses_id']==$this->id OR       // check if the tempuser has the current session id
+                               $tempuser['uid']==$authInfo['userSession']['ses_userid']        // check if the tempuser has the uid of the fetched session user
+                               ))) {
+                               $this->createUserSession($tempuser);
+
+                                       // The login session is started.
+                               $this->loginSessionStarted = TRUE;
+                       }
+
+                               // User logged in - write that to the log!
+                       if ($this->writeStdLog && $activeLogin) {
+                               $this->writelog(255,1,0,1,
+                                       'User %s logged in from %s (%s)',
+                                       Array($tempuser[$this->username_column], t3lib_div::getIndpEnv('REMOTE_ADDR'), t3lib_div::getIndpEnv('REMOTE_HOST')));
+                       }
+
+                       if ($this->writeDevLog && $activeLogin)         t3lib_div::devLog('User '.$tempuser[$this->username_column].' logged in from '.t3lib_div::getIndpEnv('REMOTE_ADDR').' ('.t3lib_div::getIndpEnv('REMOTE_HOST').')', 't3lib_userAuth', -1);
+                       if ($this->writeDevLog && !$activeLogin)        t3lib_div::devLog('User '.$tempuser[$this->username_column].' authenticated from '.t3lib_div::getIndpEnv('REMOTE_ADDR').' ('.t3lib_div::getIndpEnv('REMOTE_HOST').')', 't3lib_userAuth', -1);
+
+
+               } elseif ($activeLogin OR count($tempuserArr)) {
+                       $this->loginFailure = TRUE;
+
+                       if ($this->writeDevLog AND !count($tempuserArr) AND $activeLogin)       t3lib_div::devLog('Login failed: '.t3lib_div::arrayToLogString($loginData), 't3lib_userAuth', 2);
+                       if ($this->writeDevLog AND count($tempuserArr))         t3lib_div::devLog('Login failed: '.t3lib_div::arrayToLogString($tempuser, array($this->userid_column,$this->username_column)), 't3lib_userAuth', 2);
                }
-       }
 
-       /**
-        * Redirect to somewhere. Obsolete, depreciated etc.
-        *
-        * @return      void
-        * @ignore
-        */
-       function redirect() {
-               if (!$this->userid && $this->auth_url)  {        // if no userid AND an include-document for login is given
-                       include ($this->auth_include);
-                       exit;
+
+                       // If there were a login failure, check to see if a warning email should be sent:
+               if ($this->loginFailure AND $activeLogin)       {
+                       if ($this->writeDevLog)         t3lib_div::devLog('Call checkLogFailures: '.t3lib_div::arrayToLogString(array('warningEmail'=>$this->warningEmail,'warningPeriod'=>$this->warningPeriod,'warningMax'=>$this->warningMax,)), 't3lib_userAuth', -1);
+
+                       $this->checkLogFailures($this->warningEmail, $this->warningPeriod, $this->warningMax);
                }
        }
 
+
+
+
+
+
+
+
+
+
+
+
+       /*************************
+        *
+        * User Sessions
+        *
+        *************************/
+
+
        /**
-        * Log out current user!
-        * Removes the current session record, sets the internal ->user array to a blank string; Thereby the current user (if any) is effectively logged out!
+        * Creates a user session record.
         *
+        * @param       array           user data array
         * @return      void
         */
-       function logoff() {
+       function createUserSession ($tempuser) {
+
+               if ($this->writeDevLog)         t3lib_div::devLog('Create session ses_id = '.$this->id, 't3lib_userAuth');
+
+                       // delete session entry first
                $GLOBALS['TYPO3_DB']->exec_DELETEquery(
                                        $this->session_table,
                                        'ses_id = '.$GLOBALS['TYPO3_DB']->fullQuoteStr($this->id, $this->session_table).'
                                                AND ses_name = '.$GLOBALS['TYPO3_DB']->fullQuoteStr($this->name, $this->session_table)
                                );
-               $this->user = "";
+
+                       // re-create session entry
+               $insertFields = array(
+                       'ses_id' => $this->id,
+                       'ses_name' => $this->name,
+                       'ses_iplock' => $tempuser['disableIPlock'] ? '[DISABLED]' : $this->ipLockClause_remoteIPNumber($this->lockIP),
+                       'ses_hashlock' => $this->hashLockClause_getHashInt(),
+                       'ses_userid' => $tempuser[$this->userid_column],
+                       'ses_tstamp' => $GLOBALS['EXEC_TIME']
+               );
+               $GLOBALS['TYPO3_DB']->exec_INSERTquery($this->session_table, $insertFields);
+
+                       // Updating lastLogin_column carrying information about last login.
+               if ($this->lastLogin_column)    {
+                       $GLOBALS['TYPO3_DB']->exec_UPDATEquery(
+                                                                       $this->user_table,
+                                                                       $this->userid_column.'='.$GLOBALS['TYPO3_DB']->fullQuoteStr($tempuser[$this->userid_column], $this->user_table),
+                                                                       array($this->lastLogin_column => $GLOBALS['EXEC_TIME'])
+                                                               );
+               }
        }
 
        /**
-        * Garbage collector, removing old expired sessions.
+        * Read the user session from db.
+        *
+        * @return      array           user session data
+        */
+       function fetchUserSession() {
+
+               $user = '';
+
+               if ($this->writeDevLog)         t3lib_div::devLog('Fetch session ses_id = '.$this->id, 't3lib_userAuth');
+
+                       // The session_id is used to find user in the database. Two tables are joined: The session-table with user_id of the session and the usertable with its primary key
+               $dbres = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
+                                               '*',
+                                               $this->session_table.','.$this->user_table,
+                                               $this->session_table.'.ses_id = '.$GLOBALS['TYPO3_DB']->fullQuoteStr($this->id, $this->session_table).'
+                                                       AND '.$this->session_table.'.ses_name = '.$GLOBALS['TYPO3_DB']->fullQuoteStr($this->name, $this->session_table).'
+                                                       AND '.$this->session_table.'.ses_userid = '.$this->user_table.'.'.$this->userid_column.'
+                                                       '.$this->ipLockClause().'
+                                                       '.$this->hashLockClause().'
+                                                       '.$this->user_where_clause()
+                                       );
+
+
+               if ($user = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($dbres))      {
+                               // A user was found
+                       if (is_string($this->auth_timeout_field))       {
+                               $timeout = intval($user[$this->auth_timeout_field]);            // Get timeout-time from usertable
+                       } else {
+                               $timeout = intval($this->auth_timeout_field);                                   // Get timeout from object
+                       }
+                               // If timeout > 0 (true) and currenttime has not exceeded the latest sessions-time plus the timeout in seconds then accept user
+                               // Option later on: We could check that last update was at least x seconds ago in order not to update twice in a row if one script redirects to another...
+                       if ($timeout>0 && ($GLOBALS['EXEC_TIME'] < ($user['ses_tstamp']+$timeout)))     {
+                                       $GLOBALS['TYPO3_DB']->exec_UPDATEquery(
+                                                                                       $this->session_table,
+                                                                                       'ses_id='.$GLOBALS['TYPO3_DB']->fullQuoteStr($this->id, $this->session_table).'
+                                                                                               AND ses_name='.$GLOBALS['TYPO3_DB']->fullQuoteStr($this->name, $this->session_table),
+                                                                                       array('ses_tstamp' => $GLOBALS['EXEC_TIME'])
+                                                                               );
+                                       $user['ses_tstamp'] = $GLOBALS['EXEC_TIME'];    // Make sure that the timestamp is also updated in the array
+                       } else {
+                               $this->logoff();                // delete any user set...
+                       }
+               } else {
+                       $this->logoff();                // delete any user set...
+               }
+               return $user;
+       }
+
+       /**
+        * Log out current user!
+        * Removes the current session record, sets the internal ->user array to a blank string; Thereby the current user (if any) is effectively logged out!
         *
         * @return      void
-        * @internal
         */
-       function gc() {
+       function logoff() {
+               if ($this->writeDevLog)         t3lib_div::devLog('logoff: ses_id = '.$this->id, 't3lib_userAuth');
+
                $GLOBALS['TYPO3_DB']->exec_DELETEquery(
                                        $this->session_table,
-                                       'ses_tstamp < '.intval(time()-($this->gc_time*60*60)).'
+                                       'ses_id = '.$GLOBALS['TYPO3_DB']->fullQuoteStr($this->id, $this->session_table).'
                                                AND ses_name = '.$GLOBALS['TYPO3_DB']->fullQuoteStr($this->name, $this->session_table)
                                );
+
+               $this->user = '';
        }
 
+
+
+
+
+
+
+
+
+
+
+
+
+       /*************************
+        *
+        * SQL Functions
+        *
+        *************************/
+
        /**
         * This returns the where-clause needed to select the user with respect flags like deleted, hidden, starttime, endtime
         *
@@ -547,6 +732,22 @@ class t3lib_userAuth {
                return t3lib_div::md5int($hashStr);
        }
 
+
+
+
+
+
+
+
+
+
+
+       /*************************
+        *
+        * Session and Configuration Handling
+        *
+        *************************/
+
        /**
         * This writes $variable to the user-record. This is a way of providing session-data.
         * You can fetch the data again through $this->uc in this class!
@@ -556,41 +757,15 @@ class t3lib_userAuth {
         * @return      void
         */
        function writeUC($variable='')  {
-               if (is_array($this->user) && $this->user['uid'])        {
+               if (is_array($this->user) && $this->user[$this->userid_column]) {
                        if (!is_array($variable)) { $variable = $this->uc; }
 
-                       $GLOBALS['TYPO3_DB']->exec_UPDATEquery($this->user_table, 'uid='.intval($this->user['uid']), array('uc' => serialize($variable)));
+                       if ($this->writeDevLog)         t3lib_div::devLog('writeUC: '.$this->userid_column.'='.intval($this->user[$this->userid_column]), 't3lib_userAuth');
+                       $GLOBALS['TYPO3_DB']->exec_UPDATEquery($this->user_table, $this->userid_column.'='.intval($this->user[$this->userid_column]), array('uc' => serialize($variable)));
                }
        }
 
        /**
-        * DUMMY: Writes to log database table (in some extension classes)
-        *
-        * @param       integer         $type: denotes which module that has submitted the entry. This is the current list:  1=tce_db; 2=tce_file; 3=system (eg. sys_history save); 4=modules; 254=Personal settings changed; 255=login / out action: 1=login, 2=logout, 3=failed login (+ errorcode 3), 4=failure_warning_email sent
-        * @param       integer         $action: denotes which specific operation that wrote the entry (eg. 'delete', 'upload', 'update' and so on...). Specific for each $type. Also used to trigger update of the interface. (see the log-module for the meaning of each number !!)
-        * @param       integer         $error: flag. 0 = message, 1 = error (user problem), 2 = System Error (which should not happen), 3 = security notice (admin)
-        * @param       integer         $details_nr: The message number. Specific for each $type and $action. in the future this will make it possible to translate errormessages to other languages
-        * @param       string          $details: Default text that follows the message
-        * @param       array           $data: Data that follows the log. Might be used to carry special information. If an array the first 5 entries (0-4) will be sprintf'ed the details-text...
-        * @param       string          $tablename: Special field used by tce_main.php. These ($tablename, $recuid, $recpid) holds the reference to the record which the log-entry is about. (Was used in attic status.php to update the interface.)
-        * @param       integer         $recuid: Special field used by tce_main.php. These ($tablename, $recuid, $recpid) holds the reference to the record which the log-entry is about. (Was used in attic status.php to update the interface.)
-        * @param       integer         $recpid: Special field used by tce_main.php. These ($tablename, $recuid, $recpid) holds the reference to the record which the log-entry is about. (Was used in attic status.php to update the interface.)
-        * @return      void
-        * @see t3lib_userauthgroup::writelog()
-        */
-       function writelog($type,$action,$error,$details_nr,$details,$data,$tablename,$recuid,$recpid)   {
-       }
-
-       /**
-        * DUMMY: Check login failures (in some extension classes)
-        *
-        * @return      void
-        * @ignore
-        */
-       function checkLogFailures()     {
-       }
-
-       /**
         * Sets $theUC as the internal variable ->uc IF $theUC is an array. If $theUC is false, the 'uc' content from the ->user array will be unserialized and restored in ->uc
         *
         * @param       mixed           If an array, then set as ->uc, otherwise load from user record
@@ -656,9 +831,212 @@ class t3lib_userAuth {
                $sesDat[$key] = $data;
                $this->user['ses_data'] = serialize($sesDat);
 
+               if ($this->writeDevLog)         t3lib_div::devLog('setAndSaveSessionData: ses_id = '.$this->user['ses_id'], 't3lib_userAuth');
                $GLOBALS['TYPO3_DB']->exec_UPDATEquery($this->session_table, 'ses_id='.$GLOBALS['TYPO3_DB']->fullQuoteStr($this->user['ses_id'], $this->session_table), array('ses_data' => $this->user['ses_data']));
        }
 
+
+
+
+
+
+
+
+
+
+
+
+
+       /*************************
+        *
+        * Misc
+        *
+        *************************/
+
+       /**
+        * Returns an info array with Login/Logout data submitted by a form or params
+        *
+        * @return      array
+        * @internal
+        */
+       function getLoginFormData() {
+               $loginData=array();
+               if ($this->getMethodEnabled)    {
+                       $loginData['status'] = t3lib_div::_GP($this->formfield_status);
+                       $loginData['uname'] = t3lib_div::_GP($this->formfield_uname);
+                       $loginData['uident'] = t3lib_div::_GP($this->formfield_uident);
+                       $loginData['chalvalue'] = t3lib_div::_GP($this->formfield_chalvalue);
+               } else {
+                       $loginData['status'] = t3lib_div::_POST($this->formfield_status);
+                       $loginData['uname'] = t3lib_div::_POST($this->formfield_uname);
+                       $loginData['uident'] = t3lib_div::_POST($this->formfield_uident);
+                       $loginData['chalvalue'] = t3lib_div::_POST($this->formfield_chalvalue);
+               }
+               $loginData = $this->processLoginData($loginData);
+
+               return $loginData;
+       }
+
+       /**
+        * Processes Login data submitted by a form or params depending on the
+        * security_level
+        *
+        * @param       array           login data array
+        * @param       string          security_level
+        * @return      array           processed login data array
+        * @internal
+        */
+       function processLoginData($loginData, $security_level='') {
+               global $TYPO3_CONF_VARS;
+
+               $loginSecurityLevel = $security_level ? $security_level : ($TYPO3_CONF_VARS[$this->loginType]['loginSecurityLevel'] ? $TYPO3_CONF_VARS[$this->loginType]['loginSecurityLevel'] : $this->security_level);
+               if ($loginSecurityLevel=='normal') {
+                       $loginData['uident_text'] = $loginData['uident'];
+                       $loginData['uident_challenged'] = (string)md5($loginData['uname'].':'.$loginData['uident'].':'.$loginData['chalvalue']);
+                       $loginData['uident_superchallenged'] = (string)md5($loginData['uname'].':'.(md5($loginData['uident'])).':'.$loginData['chalvalue']);
+               } elseif ($loginSecurityLevel=='challenged') {
+                       $loginData['uident_text'] = '';
+                       $loginData['uident_challenged'] = $loginData['uident'];
+                       $loginData['uident_superchallenged'] = '';
+               } elseif ($loginSecurityLevel=='superchallenged') {
+                       $loginData['uident_text'] = '';
+                       $loginData['uident_challenged'] = '';
+                       $loginData['uident_superchallenged'] = $loginData['uident'];
+               }
+
+               if ($this->security_level=='normal') {
+                       $loginData['uident'] = $loginData['uident_text'];
+               } elseif ($this->security_level=='challenged') {
+                       $loginData['uident'] = $loginData['uident_challenged'];
+               } elseif ($this->security_level=='superchallenged') {
+                       $loginData['uident'] = $loginData['uident_superchallenged'];
+               }
+
+               return $loginData;
+       }
+
+       /**
+        * Returns an info array which provides additional information for auth services
+        *
+        * @return      array
+        * @internal
+        */
+       function getAuthInfoArray() {
+               $authInfo = array();
+               $authInfo['loginType'] = $this->loginType;
+               $authInfo['refInfo'] = parse_url(t3lib_div::getIndpEnv('HTTP_REFERER'));
+               $authInfo['HTTP_HOST'] = t3lib_div::getIndpEnv('HTTP_HOST');
+               $authInfo['REMOTE_ADDR'] = t3lib_div::getIndpEnv('REMOTE_ADDR');
+               $authInfo['REMOTE_HOST'] = t3lib_div::getIndpEnv('REMOTE_HOST');
+               $authInfo['security_level'] = $this->security_level;
+               $authInfo['showHiddenRecords'] = $this->showHiddenRecords;
+                       // can be overidden in localconf by SVCONF:
+               $authInfo['db_user']['table'] = $this->user_table;
+               $authInfo['db_user']['userid_column'] = $this->userid_column;
+               $authInfo['db_user']['username_column'] = $this->username_column;
+               $authInfo['db_user']['userident_column'] = $this->userident_column;
+               $authInfo['db_user']['usergroup_column'] = $this->usergroup_column;
+               $authInfo['db_user']['enable_clause'] = $this->user_where_clause();
+               $authInfo['db_user']['checkPidList'] = $this->checkPid ? $this->checkPid_value : '';
+               $authInfo['db_user']['check_pid_clause'] = $this->checkPid ? ' AND pid IN ('.$GLOBALS['TYPO3_DB']->cleanIntList($authInfo['db_user']['checkPidList']).')' : '';
+               $authInfo['db_groups']['table'] = $this->usergroup_table;
+               return $authInfo;
+       }
+
+       /**
+        * Check the login data with the user record data for builtin login methods
+        *
+        * @param       array           user data array
+        * @param       array           login data array
+        * @param       string          security_level
+        * @return      boolean         true if login data matched
+        */
+       function compareUident($user, $loginData, $security_level='') {
+
+               $OK = FALSE;
+               $security_level = $security_level ? $security_level : $this->security_level;
+
+               switch ($security_level)        {
+                       case 'superchallenged':         // If superchallenged the password in the database ($user[$this->userident_column]) must be a md5-hash of the original password.
+                       case 'challenged':
+
+                                       // Check challenge stored in cookie:
+                               if ($this->challengeStoredInCookie)     {
+                                       session_start();
+                                       if ($_SESSION['login_challenge'] !== $loginData['chalvalue']) {
+                                               $this->logoff();
+                                               return FALSE;
+                                       }
+                               }
+
+                               if ((string)$loginData['uident'] === (string)md5($user[$this->username_column].':'.$user[$this->userident_column].':'.$loginData['chalvalue'])) {
+                                       $OK = TRUE;
+                               };
+                       break;
+                       default:        // normal
+                               if ((string)$loginData['uident'] === (string)$user[$this->userident_column])    {
+                                       $OK = TRUE;
+                               };
+                       break;
+               }
+
+               return $OK;
+       }
+
+       /**
+        * Garbage collector, removing old expired sessions.
+        *
+        * @return      void
+        * @internal
+        */
+       function gc() {
+               $GLOBALS['TYPO3_DB']->exec_DELETEquery(
+                                       $this->session_table,
+                                       'ses_tstamp < '.intval(time()-($this->gc_time*60*60)).'
+                                               AND ses_name = '.$GLOBALS['TYPO3_DB']->fullQuoteStr($this->name, $this->session_table)
+                               );
+       }
+
+       /**
+        * Redirect to somewhere. Obsolete, depreciated etc.
+        *
+        * @return      void
+        * @ignore
+        */
+       function redirect() {
+               if (!$this->userid && $this->auth_url)  {        // if no userid AND an include-document for login is given
+                       include ($this->auth_include);
+                       exit;
+               }
+       }
+
+       /**
+        * DUMMY: Writes to log database table (in some extension classes)
+        *
+        * @param       integer         $type: denotes which module that has submitted the entry. This is the current list:  1=tce_db; 2=tce_file; 3=system (eg. sys_history save); 4=modules; 254=Personal settings changed; 255=login / out action: 1=login, 2=logout, 3=failed login (+ errorcode 3), 4=failure_warning_email sent
+        * @param       integer         $action: denotes which specific operation that wrote the entry (eg. 'delete', 'upload', 'update' and so on...). Specific for each $type. Also used to trigger update of the interface. (see the log-module for the meaning of each number !!)
+        * @param       integer         $error: flag. 0 = message, 1 = error (user problem), 2 = System Error (which should not happen), 3 = security notice (admin)
+        * @param       integer         $details_nr: The message number. Specific for each $type and $action. in the future this will make it possible to translate errormessages to other languages
+        * @param       string          $details: Default text that follows the message
+        * @param       array           $data: Data that follows the log. Might be used to carry special information. If an array the first 5 entries (0-4) will be sprintf'ed the details-text...
+        * @param       string          $tablename: Special field used by tce_main.php. These ($tablename, $recuid, $recpid) holds the reference to the record which the log-entry is about. (Was used in attic status.php to update the interface.)
+        * @param       integer         $recuid: Special field used by tce_main.php. These ($tablename, $recuid, $recpid) holds the reference to the record which the log-entry is about. (Was used in attic status.php to update the interface.)
+        * @param       integer         $recpid: Special field used by tce_main.php. These ($tablename, $recuid, $recpid) holds the reference to the record which the log-entry is about. (Was used in attic status.php to update the interface.)
+        * @return      void
+        * @see t3lib_userauthgroup::writelog()
+        */
+       function writelog($type,$action,$error,$details_nr,$details,$data,$tablename,$recuid,$recpid)   {
+       }
+
+       /**
+        * DUMMY: Check login failures (in some extension classes)
+        *
+        * @return      void
+        * @ignore
+        */
+       function checkLogFailures()     {
+       }
+
        /**
         * Raw initialization of the be_user with uid=$uid
         * This will circumvent all login procedures and select a be_users record from the database and set the content of ->user to the record selected. Thus the BE_USER object will appear like if a user was authenticated - however without a session id and the fields from the session table of course.
@@ -666,13 +1044,11 @@ class t3lib_userAuth {
         *
         * @param       integer         The UID of the backend user to set in ->user
         * @return      void
-        * @params integer      'uid' of be_users record to select and set.
         * @internal
         * @see SC_mod_tools_be_user_index::compareUsers(), SC_mod_user_setup_index::simulateUser(), freesite_admin::startCreate()
         */
        function setBeUserByUid($uid)   {
-               $dbres = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', $this->user_table, 'uid='.intval($uid).' '.$this->user_where_clause());
-               $this->user = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($dbres);
+               $this->user = $this->getRawUserByUid($uid);
        }
 
        /**
@@ -684,8 +1060,96 @@ class t3lib_userAuth {
         * @internal
         */
        function setBeUserByName($name) {
+               $this->user = $this->getRawUserByName($name);
+       }
+
+       /**
+        * Fetching raw user record with uid=$uid
+        *
+        * @param       integer         The UID of the backend user to set in ->user
+        * @return      array           user record or FALSE
+        * @internal
+        */
+       function getRawUserByUid($uid)  {
+               $user = FALSE;
+               $dbres = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', $this->user_table, 'uid='.intval($uid).' '.$this->user_where_clause());
+               if ($dbres)     {
+                       $user = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($dbres);
+                       $GLOBALS['TYPO3_DB']->sql_free_result($dbres);
+               }
+               return $user;
+       }
+
+       /**
+        * Fetching raw user record with username=$name
+        *
+        * @param       string          The username to look up.
+        * @return      array           user record or FALSE
+        * @see t3lib_userAuth::getUserByUid()
+        * @internal
+        */
+       function getRawUserByName($name)        {
+               $user = FALSE;
                $dbres = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', $this->user_table, 'username='.$GLOBALS['TYPO3_DB']->fullQuoteStr($name, $this->user_table).' '.$this->user_where_clause());
-               $this->user = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($dbres);
+               if ($dbres)     {
+                       $user = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($dbres);
+                       $GLOBALS['TYPO3_DB']->sql_free_result($dbres);
+               }
+               return $user;
+       }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+       /*************************
+        *
+        * Create/update user - EXPERIMENTAL
+        *
+        *************************/
+
+       /**
+        * Get a user from DB by username
+        * provided for usage from services
+        *
+        * @param       array           User db table definition: $this->db_user
+        * @param       string          user name
+        * @param       string          additional WHERE clause: " AND ...
+        * @return      mixed           user array or FALSE
+        */
+       function fetchUserRecord($dbUser, $username, $extraWhere='' )   {
+               $user = FALSE;
+
+               $usernameClause = $username ? ($dbUser['username_column'].'='.$GLOBALS['TYPO3_DB']->fullQuoteStr($username, $dbUser['table'])) : '';
+
+               if ($username OR $extraWhere)   {
+
+                               // Look up the user by the username and/or extraWhere:
+                       $dbres = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
+                                               '*',
+                                               $dbUser['table'],
+                                                       $usernameClause.
+                                                       $dbUser['check_pid_clause'].
+                                                       $dbUser['enable_clause'].
+                                                       $extraWhere
+                                       );
+
+                       if ($dbres)     {
+                               $user = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($dbres);
+                               $GLOBALS['TYPO3_DB']->sql_free_result($dbres);
+                       }
+               }
+               return $user;
        }
 }
 
index f0e39e9..226452a 100755 (executable)
@@ -1055,6 +1055,7 @@ class t3lib_userAuthGroup extends t3lib_userAuth {
         * @access private
         */
        function checkLogFailures($email, $secondsBack=3600, $max=3)    {
+
                if ($email)     {
 
                                // get last flag set in the log for sending
index 40229de..6cb2eb2 100755 (executable)
@@ -117,6 +117,7 @@ $TYPO3_CONF_VARS = Array(
                'lockBeUserToDBmounts' => 1,                    // Boolean. If set, the backend user is allowed to work only within his page-mount. It's advisable to leave this on because it makes security easy to manage.
                'lockSSL' => 0,                                                 // Int. 0,1,2: If set (1+2), the backend can only be operated from an ssl-encrypted connection (https). Set to 2 you will be redirected to the https admin-url supposed to be the http-url, but with https scheme instead.
                'enabledBeUserIPLock' => 1,                             // Boolean. If set, the User/Group TSconfig option 'option.lockToIP' is enabled.
+               'loginSecurityLevel' => '',                             //
                'adminOnly' => 0,                                               // Int. If set (>=1), the only "admin" users can log in to the backend. If "<=-1" then the backend is totally shut down! For maintenance purposes.
                'disable_exec_function' => 0,                   // Boolean. Don't use exec() function (except for ImageMagick which is disabled by [GFX][im]=0). If set, all fileoperations are done by the default PHP-functions. This is nescessary under windows! On UNIX the system commands by exec() can be used, unless this is disabled.
                'usePHPFileFunctions' => 1,                             // Boolean. If set, all fileoperations are done by the default PHP-functions. Default on UNIX is using the system commands by exec(). You need to set this flag under safe_mode.
@@ -169,15 +170,16 @@ $TYPO3_CONF_VARS = Array(
                'simulateStaticDocuments' => 0,                 // Boolean. This is the default value for simulateStaticDocuments (configurable with TypoScript which overrides this, if the TypoScript value is present)
                'noPHPscriptInclude' => 0,                              // Boolean. If set, PHP-scripts are not included by TypoScript configurations, unless they reside in 'media/scripts/'-folder. This is a security option to ensure that users with template-access do not terrorize
                'strictFormmail' => TRUE,                               // Boolean. If set, the internal "formmail" feature in TYPO3 will send mail ONLY to recipients which has been encoded by the system itself. This protects against spammers misusing the formmailer.
-               'secureFormmail' => true,                               // Boolean. If set, the internal "formmail" feature in TYPO3 will send mail ONLY to the recipients that are defined in the form CE record. This protects against spammers misusing the formmailer.
+               'secureFormmail' => TRUE,                               // Boolean. If set, the internal "formmail" feature in TYPO3 will send mail ONLY to the recipients that are defined in the form CE record. This protects against spammers misusing the formmailer.
                'compressionLevel' => 0,                                // Determines output compression. Requires zlib in your php4 install. Range 1-9, where 1 is least compression (approx. 50%) and 9 is greatest compression (approx 33%). 'true' as value will set the compression based on system load (works with Linux, freebsd). Good default value is 3. For more info, see class in t3lib/class.gzip_encode.php written by Sandy McArthur, Jr. <Leknor@Leknor.com>
                'compressionDebugInfo' => 0,                    // Boolean. If set, then in the end of the pages, the sizes of the compressed and non-compressed document is output. This should be used ONLY as a test, because the content is compressed twice in order to output this statistics!
-               'pageNotFound_handling' => '',                  // How TYPO3 should handle requests for non-existing/accessible pages. false (default): The 'nearest' page is shown. TRUE or '1': An TYPO3 error box is displayed. Integer > 1: Not used yet (outputs "ERROR: ###"). Strings: redirect URL, eg. 'notfound.html' or 'http://www.domain.org/errors/notfound.html'. If prefixed with "READFILE:" then it will expect the remaining string to be a HTML file which will be read and outputted directly after having the marker "###CURRENT_URL###" substituted with REQUEST_URI and ###REASON### with reason text, for example: "READFILE:fileadmin/notfound.html"
+               'pageNotFound_handling' => '',                  // How TYPO3 should handle requests for non-existing/accessible pages. false (default): The 'nearest' page is shown. TRUE or '1': An TYPO3 error box is displayed. Strings: redirect URL, eg. 'notfound.html' or 'http://www.domain.org/errors/notfound.html'. If prefixed with "READFILE:" then it will expect the remaining string to be a HTML file which will be read and outputted directly after having the marker "###CURRENT_URL###" substituted with REQUEST_URI and ###REASON### with reason text, for example: "READFILE:fileadmin/notfound.html". Another option is the prefix "USER_FUNCTION:" which will call a user function, eg. "USER_FUNCTION:typo3conf/pageNotFoundHandling.php:user_pageNotFound->pageNotFound" where the file must contain a class "user_pageNotFound" with a method "pageNotFound" inside with two parameters, $param and $ref
                'pageNotFound_handling_statheader' => 'Status: 404 Not Found',                  // If 'pageNotFound_handling' is enabled, this string will always be sent as header before the actual handling.
                'userFuncClassPrefix' => 'user_',               // This prefix must be the first part of any function or class name called from TypoScript, for instance in the stdWrap function.
                'addRootLineFields' => '',                              // Comma-list of fields from the 'pages'-table. These fields are added to the select query for fields in the rootline.
-               'checkFeUserPid' => 1,                                  // Boolean. If set, the pid of fe_user logins must be sent in the form as the field 'pid' and then the user must be located in the pid. Default is 1 from Typo32+. If you unset this, you should change the fe_users.username eval-flag 'uniqueInPid' to 'unique' in $TCA. This will do: $TCA['fe_users']['columns']['username']['config']['eval']= 'nospace,lower,required,unique';
+               'checkFeUserPid' => 1,                                  // Boolean. If set, the pid of fe_user logins must be sent in the form as the field 'pid' and then the user must be located in the pid. If you unset this, you should change the fe_users.username eval-flag 'uniqueInPid' to 'unique' in $TCA. This will do: $TCA['fe_users']['columns']['username']['config']['eval']= 'nospace,lower,required,unique';
                'lockIP' => 2,                                                  // Integer (0-4). If >0, fe_users are locked to (a part of) their REMOTE_ADDR IP for their session. Enhances security but may throw off users that may change IP during their session (in which case you can lower it to 2 or 3). The integer indicates how many parts of the IP address to include in the check. Reducing to 1-3 means that only first, second or third part of the IP address is used. 4 is the FULL IP address and recommended. 0 (zero) disables checking of course.
+               'loginSecurityLevel' => '',                             //
                'lifetime' => 0,                                                // Integer, positive. If >0, the cookie of FE users will NOT be a session cookie (deleted when browser is shut down) but rather a cookie with a lifetime of the number of seconds this value indicates. Setting this value to 3600*24*7 will result in automatic login of FE users during a whole week.
                'lockHashKeyWords' => 'useragent',              // Keyword list (Strings commaseparated). Currently only "useragent"; If set, then the FE user session is locked to the value of HTTP_USER_AGENT. This lowers the risk of session hi-jacking. However some cases (like payment gateways) might have to use the session cookie and in this case you will have to disable that feature (eg. with a blank string).
                'defaultUserTSconfig' => '',                    // Enter lines of default frontend user/group TSconfig.
@@ -189,11 +191,14 @@ $TYPO3_CONF_VARS = Array(
                'defaultTypoScript_editorcfg.' => Array(),              // As above, but for Backend Editor Configuration
                'dontSetCookie' => 0,                                   // If set, the no cookies is attempted to be set in the front end. Of course no userlogins are possible either...
                'XCLASS' => Array(),                                    // See 'Inside TYPO3' document for more information.
-//             'IPmaskMountGroups' => array(array('IPmaskList_1','fe_group uid'), array('IPmaskList_2','fe_group uid')),       // This allows you to specify an array of IPmaskLists/fe_group-uids. If the REMOTE_ADDR of the user matches an IPmaskList, then the given fe_group is add to the gr_list. So this is an automatic mounting of a user-group. But no fe_user is logged in though!
+               'IPmaskMountGroups' => array(                   // This allows you to specify an array of IPmaskLists/fe_group-uids. If the REMOTE_ADDR of the user matches an IPmaskList, then the given fe_group is add to the gr_list. So this is an automatic mounting of a user-group. But no fe_user is logged in though! This feature is implemented for the default frontend user authentication and might not be implemented for alternative authentication services.
+                       // array('IPmaskList_1','fe_group uid'), array('IPmaskList_2','fe_group uid')
+               ),
                'get_url_id_token' => '#get_URL_ID_TOK#',       // This is the token, which is substituted in the output code in order to keep a GET-based session going. Normally the GET-session-id is 5 chars ('&ftu=') + hash_length (norm. 10)
                'content_doktypes' => '1,2,5,7',                        // List of pages.doktype values which can contain content (so shortcut pages and external url pages are excluded, but all pages below doktype 199 should be included. doktype=6 is not either (backend users only...). For doktypes going into menus see class.tslib_menu.php, line 494 (search for 'doktype'))
                'enable_mount_pids' => 1,                                       // If set to "1", the mount_pid feature allowing 'symlinks' in the page tree (for frontend operation) is allowed.
                'pageOverlayFields' => 'uid,title,subtitle,nav_title,media,keywords,description,abstract,author,author_email',                          // List of fields from the table "pages_language_overlay" which should be overlaid on page records. See t3lib_page::getPageOverlay()
+               'hidePagesIfNotTranslatedByDefault' => FALSE,   // If TRUE, pages that has no translation will be hidden by default. Basically this will inverse the effect of the page localization setting "Hide page if no translation for current language exists" to "Show page even if no translation exists"
        ),
        'MODS' => Array(                // Backend Module Configuration (obsolete, make extension instead)
        ),
index 8aae7b1..c6a1af7 100755 (executable)
@@ -10,9 +10,9 @@
 # Table structure for table 'be_groups'
 #
 CREATE TABLE be_groups (
-  uid int(11) DEFAULT '0' NOT NULL auto_increment,
-  pid int(11) DEFAULT '0' NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
+  uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
+  pid int(11) unsigned DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
   title varchar(20) DEFAULT '' NOT NULL,
   non_exclude_fields blob NOT NULL,
   explicit_allowdeny blob NOT NULL,
@@ -22,15 +22,15 @@ CREATE TABLE be_groups (
   pagetypes_select tinyblob NOT NULL,
   tables_select blob NOT NULL,
   tables_modify blob NOT NULL,
-  crdate int(11) DEFAULT '0' NOT NULL,
-  cruser_id int(11) DEFAULT '0' NOT NULL,
+  crdate int(11) unsigned DEFAULT '0' NOT NULL,
+  cruser_id int(11) unsigned DEFAULT '0' NOT NULL,
   groupMods tinyblob NOT NULL,
   file_mountpoints varchar(40) DEFAULT '' NOT NULL,
-  hidden tinyint(3) DEFAULT '0' NOT NULL,
-  inc_access_lists tinyint(3) DEFAULT '0' NOT NULL,
+  hidden tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  inc_access_lists tinyint(3) unsigned DEFAULT '0' NOT NULL,
   description text NOT NULL,
   lockToDomain varchar(50) DEFAULT '' NOT NULL,
-  deleted tinyint(3) DEFAULT '0' NOT NULL,
+  deleted tinyint(3) unsigned DEFAULT '0' NOT NULL,
   TSconfig blob NOT NULL,
   subgroup tinyblob NOT NULL,
   hide_in_lists tinyint(4) DEFAULT '0' NOT NULL,
@@ -46,8 +46,8 @@ CREATE TABLE be_sessions (
   ses_name varchar(32) DEFAULT '' NOT NULL,
   ses_iplock varchar(39) DEFAULT '' NOT NULL,
   ses_hashlock int(11) DEFAULT '0' NOT NULL,
-  ses_userid int(11) DEFAULT '0' NOT NULL,
-  ses_tstamp int(11) DEFAULT '0' NOT NULL,
+  ses_userid int(11) unsigned DEFAULT '0' NOT NULL,
+  ses_tstamp int(11) unsigned DEFAULT '0' NOT NULL,
   ses_data mediumblob NOT NULL,
   PRIMARY KEY (ses_id,ses_name)
 );
@@ -56,22 +56,22 @@ CREATE TABLE be_sessions (
 # Table structure for table 'be_users'
 #
 CREATE TABLE be_users (
-  uid int(11) DEFAULT '0' NOT NULL auto_increment,
-  pid int(11) DEFAULT '0' NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
+  uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
+  pid int(11) unsigned DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
   username varchar(20) DEFAULT '' NOT NULL,
   password varchar(40) DEFAULT '' NOT NULL,
-  admin tinyint(4) DEFAULT '0' NOT NULL,
+  admin tinyint(4) unsigned DEFAULT '0' NOT NULL,
   usergroup tinyblob NOT NULL,
-  disable tinyint(4) DEFAULT '0' NOT NULL,
-  starttime int(11) DEFAULT '0' NOT NULL,
-  endtime int(11) DEFAULT '0' NOT NULL,
+  disable tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  starttime int(11) unsigned DEFAULT '0' NOT NULL,
+  endtime int(11) unsigned DEFAULT '0' NOT NULL,
   lang char(2) DEFAULT '' NOT NULL,
   email varchar(80) DEFAULT '' NOT NULL,
   db_mountpoints varchar(40) DEFAULT '' NOT NULL,
-  options tinyint(4) DEFAULT '0' NOT NULL,
-  crdate int(11) DEFAULT '0' NOT NULL,
-  cruser_id int(11) DEFAULT '0' NOT NULL,
+  options tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  crdate int(11) unsigned DEFAULT '0' NOT NULL,
+  cruser_id int(11) unsigned DEFAULT '0' NOT NULL,
   realName varchar(80) DEFAULT '' NOT NULL,
   userMods tinyblob NOT NULL,
   allowed_languages tinyblob NOT NULL,
@@ -79,10 +79,10 @@ CREATE TABLE be_users (
   file_mountpoints varchar(40) DEFAULT '' NOT NULL,
   fileoper_perms tinyint(4) DEFAULT '0' NOT NULL,
   lockToDomain varchar(50) DEFAULT '' NOT NULL,
-  disableIPlock tinyint(3) DEFAULT '0' NOT NULL,
-  deleted tinyint(3) DEFAULT '0' NOT NULL,
+  disableIPlock tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  deleted tinyint(3) unsigned DEFAULT '0' NOT NULL,
   TSconfig blob NOT NULL,
-  lastlogin int(10) DEFAULT '0' NOT NULL,
+  lastlogin int(10) unsigned DEFAULT '0' NOT NULL,
   createdByAction int(11) DEFAULT '0' NOT NULL,
   usergroup_cached_list tinytext NOT NULL,
   PRIMARY KEY (uid),
@@ -96,7 +96,7 @@ CREATE TABLE be_users (
 CREATE TABLE cache_hash (
   hash varchar(32) DEFAULT '' NOT NULL,
   content mediumblob NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
   ident varchar(20) DEFAULT '' NOT NULL,
   PRIMARY KEY (hash)
 );
@@ -109,8 +109,8 @@ CREATE TABLE cache_imagesizes (
   md5filename varchar(32) DEFAULT '' NOT NULL,
   tstamp int(11) DEFAULT '0' NOT NULL,
   filename tinytext NOT NULL,
-  imagewidth mediumint(11) DEFAULT '0' NOT NULL,
-  imageheight mediumint(11) DEFAULT '0' NOT NULL,
+  imagewidth mediumint(11) unsigned DEFAULT '0' NOT NULL,
+  imageheight mediumint(11) unsigned DEFAULT '0' NOT NULL,
   PRIMARY KEY (md5filename)
 );
 
@@ -120,22 +120,22 @@ CREATE TABLE cache_imagesizes (
 CREATE TABLE pages (
   uid int(11) DEFAULT '0' NOT NULL auto_increment,
   pid int(11) DEFAULT '0' NOT NULL,
-  t3ver_oid int(11) DEFAULT '0' NOT NULL,
-  t3ver_id int(11) DEFAULT '0' NOT NULL,
+  t3ver_oid int(11) unsigned DEFAULT '0' NOT NULL,
+  t3ver_id int(11) unsigned DEFAULT '0' NOT NULL,
   t3ver_label varchar(30) DEFAULT '' NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
-  sorting int(11) DEFAULT '0' NOT NULL,
-  deleted tinyint(4) DEFAULT '0' NOT NULL,
-  perms_userid int(11) DEFAULT '0' NOT NULL,
-  perms_groupid int(11) DEFAULT '0' NOT NULL,
-  perms_user tinyint(4) DEFAULT '0' NOT NULL,
-  perms_group tinyint(4) DEFAULT '0' NOT NULL,
-  perms_everybody tinyint(4) DEFAULT '0' NOT NULL,
-  editlock tinyint(4) DEFAULT '0' NOT NULL,
-  crdate int(11) DEFAULT '0' NOT NULL,
-  cruser_id int(11) DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
+  sorting int(11) unsigned DEFAULT '0' NOT NULL,
+  deleted tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  perms_userid int(11) unsigned DEFAULT '0' NOT NULL,
+  perms_groupid int(11) unsigned DEFAULT '0' NOT NULL,
+  perms_user tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  perms_group tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  perms_everybody tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  editlock tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  crdate int(11) unsigned DEFAULT '0' NOT NULL,
+  cruser_id int(11) unsigned DEFAULT '0' NOT NULL,
   title tinytext NOT NULL,
-  doktype tinyint(3) DEFAULT '0' NOT NULL,
+  doktype tinyint(3) unsigned DEFAULT '0' NOT NULL,
   TSconfig blob NOT NULL,
   storage_pid int(11) DEFAULT '0' NOT NULL,
   is_siteroot tinyint(4) DEFAULT '0' NOT NULL,
@@ -150,8 +150,8 @@ CREATE TABLE pages (
 # Table structure for table 'sys_be_shortcuts'
 #
 CREATE TABLE sys_be_shortcuts (
-  uid int(11) DEFAULT '0' NOT NULL auto_increment,
-  userid int(11) DEFAULT '0' NOT NULL,
+  uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
+  userid int(11) unsigned DEFAULT '0' NOT NULL,
   module_name tinytext NOT NULL,
   url text NOT NULL,
   description tinytext NOT NULL,
@@ -165,14 +165,14 @@ CREATE TABLE sys_be_shortcuts (
 # Table structure for table 'sys_filemounts'
 #
 CREATE TABLE sys_filemounts (
-  uid int(11) DEFAULT '0' NOT NULL auto_increment,
-  pid int(11) DEFAULT '0' NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
+  uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
+  pid int(11) unsigned DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
   title varchar(30) DEFAULT '' NOT NULL,
   path varchar(120) DEFAULT '' NOT NULL,
-  base tinyint(4) DEFAULT '0' NOT NULL,
-  hidden tinyint(3) DEFAULT '0' NOT NULL,
-  deleted tinyint(3) DEFAULT '0' NOT NULL,
+  base tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  hidden tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  deleted tinyint(3) unsigned DEFAULT '0' NOT NULL,
   PRIMARY KEY (uid),
   KEY parent (pid)
 );
@@ -181,7 +181,7 @@ CREATE TABLE sys_filemounts (
 # Table structure for table 'sys_history'
 #
 CREATE TABLE sys_history (
-  uid int(11) DEFAULT '0' NOT NULL auto_increment,
+  uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
   sys_log_uid int(11) DEFAULT '0' NOT NULL,
   history_data mediumblob NOT NULL,
   fieldlist blob NOT NULL,
@@ -199,9 +199,9 @@ CREATE TABLE sys_history (
 # Table structure for table 'sys_lockedrecords'
 #
 CREATE TABLE sys_lockedrecords (
-  uid int(11) DEFAULT '0' NOT NULL auto_increment,
-  userid int(11) DEFAULT '0' NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
+  uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
+  userid int(11) unsigned DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
   record_table varchar(40) DEFAULT '' NOT NULL,
   record_uid int(11) DEFAULT '0' NOT NULL,
   record_pid int(11) DEFAULT '0' NOT NULL,
@@ -214,17 +214,17 @@ CREATE TABLE sys_lockedrecords (
 # Table structure for table 'sys_log'
 #
 CREATE TABLE sys_log (
-  uid int(11) DEFAULT '0' NOT NULL auto_increment,
-  userid int(11) DEFAULT '0' NOT NULL,
-  action tinyint(4) DEFAULT '0' NOT NULL,
-  recuid int(11) DEFAULT '0' NOT NULL,
+  uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
+  userid int(11) unsigned DEFAULT '0' NOT NULL,
+  action tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  recuid int(11) unsigned DEFAULT '0' NOT NULL,
   tablename varchar(40) DEFAULT '' NOT NULL,
   recpid int(11) DEFAULT '0' NOT NULL,
-  error tinyint(4) DEFAULT '0' NOT NULL,
+  error tinyint(4) unsigned DEFAULT '0' NOT NULL,
   details tinytext NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
-  type tinyint(3) DEFAULT '0' NOT NULL,
-  details_nr tinyint(3) DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
+  type tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  details_nr tinyint(3) unsigned DEFAULT '0' NOT NULL,
   IP varchar(39) DEFAULT '' NOT NULL,
   log_data tinyblob NOT NULL,
   event_pid int(11) DEFAULT '-1' NOT NULL,
@@ -237,13 +237,13 @@ CREATE TABLE sys_log (
 # Table structure for table 'sys_language'
 #
 CREATE TABLE sys_language (
-  uid int(11) DEFAULT '0' NOT NULL auto_increment,
-  pid int(11) DEFAULT '0' NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
-  hidden tinyint(4) DEFAULT '0' NOT NULL,
+  uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
+  pid int(11) unsigned DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
+  hidden tinyint(4) unsigned DEFAULT '0' NOT NULL,
   title varchar(80) DEFAULT '' NOT NULL,
   flag varchar(20) DEFAULT '' NOT NULL,
-  static_lang_isocode int(11) DEFAULT '0' NOT NULL,
+  static_lang_isocode int(11) unsigned DEFAULT '0' NOT NULL,
   PRIMARY KEY (uid),
   KEY parent (pid)
 );
index 1cc1080..6f279b2 100755 (executable)
@@ -274,7 +274,7 @@ class clickMenu {
                        if (!in_array('paste',$this->disabledItems) && $elFromAllTables)        {
                                $selItem = $this->clipObj->getSelectedRecord();
                                $elInfo=array(
-                                       $selItem['_RECORD_TITLE'],
+                                       t3lib_div::fixed_lgd_cs($selItem['_RECORD_TITLE'],$BE_USER->uc['titleLen']),
                                        ($root?$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']:t3lib_div::fixed_lgd_cs(t3lib_BEfunc::getRecordTitle($table,$this->rec),$BE_USER->uc['titleLen'])),
                                        $this->clipObj->currentMode()
                                );
index ceaca65..f3c5fa2 100755 (executable)
@@ -187,7 +187,7 @@ class SC_alt_main {
                }
        }
        function busy_OpenRefreshWindow()       {       //
-               vHWin=window.open("login_frameset.php","relogin","height=350,width=700,status=0,menubar=0,location=1");
+               vHWin=window.open("login_frameset.php","relogin_"+TS.uniqueID,"height=350,width=700,status=0,menubar=0,location=1");
                vHWin.focus();
                this.openRefreshW=1;
        }
@@ -320,13 +320,12 @@ class SC_alt_main {
        /**
         * Function restoring previous selection in left menu after clearing cache
         */
-       
        function restoreHighlightedModuleMenuItem() {
                if (currentlyHighLightedId) {
                        highlightModuleMenuItem(currentlyHighLightedId,currentlyHighLightedMain);
                }
        }
-       
+
        /**
         * Function used to switch switch module.
         */
index 7f513e5..609fe7c 100755 (executable)
@@ -95,10 +95,10 @@ class alt_menu_functions {
                global $LANG, $TBE_TEMPLATE, $BE_USER;
 
                        // By default module sections are collapsable, only if they are explicitly turned off via TSconfig, they are not:
-               $tmpArr = $BE_USER->getTSConfig('options.moduleMenuCollapsable');                       
+               $tmpArr = $BE_USER->getTSConfig('options.moduleMenuCollapsable');
                $collapsable = ($tmpArr['value'] ? 0 : 1);
                unset($tmpArr);
-               
+
                        // Initialize vars:
                $final='';
                $menuCode='';
@@ -119,23 +119,23 @@ class alt_menu_functions {
 
                        // Get collapsed configuration
                if ($collapsable == 1) {
-                       $config = is_array ($BE_USER->uc['moduleData']['alt_menu.php']) ? $BE_USER->uc['moduleData']['alt_menu.php'] : array(); 
+                       $config = is_array ($BE_USER->uc['moduleData']['alt_menu.php']) ? $BE_USER->uc['moduleData']['alt_menu.php'] : array();
                        $collapsedOverride = t3lib_div::_GP('collapsedOverride');
                        if (is_array ($collapsedOverride)) {
                                $config = array_merge ($config, $collapsedOverride);
                        }
-                       
+
                        if (t3lib_div::_GP('collapsableExpandAll') == 1) {
                                $config['expandAll'] = t3lib_div::_GP('expandAll');
                        }
-                       
+
                        if ($config['expandAll'] && is_array($collapsedOverride)) {
                                $config = $collapsedOverride;
                        }
-                       
+
                        $BE_USER->uc['moduleData']['alt_menu.php'] = $config;
                        $BE_USER->writeUC($BE_USER->uc);
-                       
+
                                // all items have to be expanded when expandAll is set
                        if($config['expandAll'] == 1) {
                                foreach($config as $key => $value) {
@@ -144,13 +144,13 @@ class alt_menu_functions {
                                }
                        }
                }
-               
+
                        // Traverse array with modules
                reset($theModules);
                while(list($moduleName,$moduleInfo)=each($theModules))  {
                        $mC++;
 
-                       $prefix=$this->getNavFramePrefix ($moduleInfo);
+                       $prefix = $this->getNavFramePrefix($moduleInfo);
                        if ($prefix) {
                                $this->fsMod[]='fsMod.recentIds["'.$moduleName.'"]="";';
                        }
@@ -206,15 +206,15 @@ class alt_menu_functions {
                        $selectItems[] = '<option value="top.goToModule(\''.$moduleName.'\');">'.htmlspecialchars($LANG->moduleLabels['tabs'][$moduleKey]).'</option>';
                        $label='&nbsp;<b>'.$label.'</b>&nbsp;';
 
-                       
+
                                // make menu collapsable
                        if($collapsable == 1 && is_array($moduleInfo['sub'])) {
-                               $collapseJS = 'onclick="window.location.href=\'alt_menu.php?collapsedOverride['.$moduleName.']='.($config[$moduleName] ? '0' : '1').'\'"';                              
-                               $collapseIcon = '<span class="c-iconCollapse"><img'.t3lib_iconWorks::skinImg($backPath,'gfx/ol/'.($config[$moduleName] ? 'plusbullet.gif':'minusbullet.gif'),'width="18" height="16"').' title="" alt="" /></span>';                            
+                               $collapseJS = 'onclick="window.location.href=\'alt_menu.php?collapsedOverride['.$moduleName.']='.($config[$moduleName] ? '0' : '1').'\'"';
+                               $collapseIcon = '<span class="c-iconCollapse"><img'.t3lib_iconWorks::skinImg($backPath,'gfx/ol/'.($config[$moduleName] ? 'plusbullet.gif':'minusbullet.gif'),'width="18" height="16"').' title="" alt="" /></span>';
                        } else {
                                $collapseJS = $collapseIcon = '';
                        }
-                       
+
                                // Creating a main item for the vertical menu (descr=0)
                        $menuCode.='
                                                <tr class="c-mainitem" id="'.$moduleCSSId.'">
@@ -251,7 +251,7 @@ class alt_menu_functions {
                                        }
 
                                        $link = t3lib_div::resolveBackPath($subInfo['script']);
-                                       $prefix=$this->getNavFramePrefix ($moduleInfo, $subInfo);
+                                       $prefix = $this->getNavFramePrefix($moduleInfo, $subInfo);
 
                                        $subKey = $moduleName.'_'.$subName.'_tab';
                                        $moduleCSSId = 'ID_'.t3lib_div::md5int($moduleName.'_'.$subName);
@@ -392,7 +392,7 @@ class alt_menu_functions {
                        } else {
                                $collapseAllHTML = '';
                        }
-                       
+
                        $final = '
 
 
@@ -465,7 +465,7 @@ class alt_menu_functions {
         * @param       string          Submodule info array
         * @return      string          Result url string
         */
-       function getNavFramePrefix ($moduleInfo, $subModuleInfo=array()) {
+       function getNavFramePrefix($moduleInfo, $subModuleInfo=array()) {
                global $BE_USER;
 
                $prefix = '';
index e9c1183..43914bb 100755 (executable)
@@ -517,7 +517,7 @@ class recordList extends t3lib_recordList {
 
                        // If the title is blank, make a "no title" label:
                if (!strcmp($code,'')) {
-                       $code = '<i>['.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.no_title',1).']</i> - '.htmlspecialchars(t3lib_BEfunc::getRecordTitle($table,$row));
+                       $code = '<i>['.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.no_title',1).']</i> - '.htmlspecialchars(t3lib_div::fixed_lgd_cs(t3lib_BEfunc::getRecordTitle($table,$row),$GLOBALS['BE_USER']->uc['titleLen']));
                } else {
                        $code = htmlspecialchars(t3lib_div::fixed_lgd_cs($code,$this->fixedL));
                }
index dc794fb..bb76bd6 100755 (executable)
@@ -106,7 +106,8 @@ class SC_index {
        var $interfaceSelector_jump;    // A selector box for selecting value for "interface" may be rendered into this variable - this will have an onchange action which will redirect the user to the selected interface right away
        var $interfaceSelector_hidden;  // A hidden field, if the interface is not set.
 
-
+               // sets the level of security. *'normal' = clear-text. 'challenged' = hashed password/username from form in $formfield_uident. 'superchallenged' = hashed password hashed again with username.
+       var $loginSecurityLevel = 'superchallenged';
 
 
 
@@ -128,6 +129,11 @@ class SC_index {
                $this->loginRefresh = t3lib_div::_GP('loginRefresh');           // Login
                $this->commandLI = t3lib_div::_GP('commandLI');                 // Value of "Login" button. If set, the login button was pressed.
 
+                       // sets the level of security from conf vars
+               if ($TYPO3_CONF_VARS['BE']['loginSecurityLevel']) {
+                       $this->loginSecurityLevel = $TYPO3_CONF_VARS['BE']['loginSecurityLevel'];
+               }
+
                        // Getting login labels:
                $this->L_vars = explode('|',$TYPO3_CONF_VARS['BE']['loginLabels']);
 
@@ -157,10 +163,12 @@ class SC_index {
                $TBE_TEMPLATE->JScode.='
                        <script type="text/javascript" src="md5.js"></script>
                        '.$TBE_TEMPLATE->wrapScriptTags('
-                               function doChallengeResponse() {        //
+                               function doChallengeResponse(superchallenged) { //
                                        password = document.loginform.p_field.value;
                                        if (password)   {
-                                               password = MD5(password);       // this makes it superchallenged!!
+                                               if (superchallenged)    {
+                                                       password = MD5(password);       // this makes it superchallenged!!
+                                               }
                                                str = document.loginform.username.value+":"+password+":"+document.loginform.challenge.value;
                                                document.loginform.userident.value = MD5(str);
                                                document.loginform.p_field.value = "";
@@ -182,9 +190,23 @@ class SC_index {
 
                        // Creating form based on whether there is a login or not:
                if (!$BE_USER->user['uid'])     {
-                       $TBE_TEMPLATE->form = '
-                               <form action="index.php" method="post" name="loginform" onsubmit="doChallengeResponse();">
-                               <input type="hidden" name="login_status" value="login" />
+
+                       if ($this->loginSecurityLevel == 'challenged') {
+                               $TBE_TEMPLATE->form = '
+                                       <form action="index.php" method="post" name="loginform" onsubmit="doChallengeResponse(0);">
+                                       ';
+                       } elseif ($this->loginSecurityLevel == 'normal') {
+                               $TBE_TEMPLATE->form = '
+                                       <form action="index.php" method="post" name="loginform" onsubmit="document.loginform.userident.value=document.loginform.p_field.value;document.loginform.p_field.value=\'\';document.loginform.challenge.value=\'\';return true;">
+                                       ';
+                       } else { // if ($this->loginSecurityLevel == 'superchallenged') {
+                               $TBE_TEMPLATE->form = '
+                                       <form action="index.php" method="post" name="loginform" onsubmit="doChallengeResponse(1);">
+                                       ';
+                       }
+
+                       $TBE_TEMPLATE->form.= '
+                                       <input type="hidden" name="login_status" value="login" />
                                ';
                        $loginForm = $this->makeLoginForm();
                } else {
@@ -419,11 +441,23 @@ class SC_index {
                if ($BE_USER->user['uid'] && ($this->commandLI || $this->loginRefresh || !$this->interfaceSelector))    {
 
                                // If no cookie has been set previously we tell people that this is a problem. This assumes that a cookie-setting script (like this one) has been hit at least once prior to this instance.
-                       if (!$_COOKIE[$BE_USER->name])  {
-                               t3lib_BEfunc::typo3PrintError ('Login-error',"Yeah, that's a classic. No cookies, no TYPO3.<br /><br />Please accept cookies from TYPO3 - otherwise you'll not be able to use the system.",0);
-                               exit;
+                       if (!$_COOKIE[$BE_USER->name])  {
+                               if ($this->commandLI=='setCookie') {
+                                               // we tried it a second time but still no cookie
+                                               // 26/4 2005: This does not work anymore, because the saving of challenge values in $_SESSION means the system will act as if the password was wrong.
+                                       t3lib_BEfunc::typo3PrintError ('Login-error',"Yeah, that's a classic. No cookies, no TYPO3.<br /><br />Please accept cookies from TYPO3 - otherwise you'll not be able to use the system.",0);
+                                       exit;
+                               } else {
+                                               // try it once again - that might be needed for auto login
+                                       $this->redirectToURL = 'index.php?commandLI=setCookie';
+                               }
                        }
 
+                       if($redirectToURL = (string)$BE_USER->getTSConfigVal('auth.BE.redirectToURL')) {
+                               $this->redirectToURL = $redirectToURL;
+                               $this->GPinterface = '';
+                       }
+
                                // Based on specific setting of interface we set the redirect script:
                        switch ($this->GPinterface)     {
                                case 'backend':
index b6d199b..7302271 100755 (executable)
@@ -453,7 +453,7 @@ if (TYPO3_MODE=='BE')       {
                                'type' => 'check',
                                'items' => Array (
                                        Array('LLL:EXT:cms/locallang_tca.php:pages.l18n_cfg.I.1', ''),
-                                       Array('LLL:EXT:cms/locallang_tca.php:pages.l18n_cfg.I.2', ''),
+                                       Array($GLOBALS['TYPO3_CONF_VARS']['FE']['hidePagesIfNotTranslatedByDefault'] ? 'LLL:EXT:cms/locallang_tca.php:pages.l18n_cfg.I.2a' : 'LLL:EXT:cms/locallang_tca.php:pages.l18n_cfg.I.2', ''),
                                ),
                        )
                ),
index 67c2619..0ddc343 100755 (executable)
@@ -9,13 +9,13 @@
 # Table structure for table 'cache_pages'
 #
 CREATE TABLE cache_pages (
-  id int(11) DEFAULT '0' NOT NULL auto_increment,
+  id int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
   hash varchar(32) DEFAULT '' NOT NULL,
-  page_id int(11) DEFAULT '0' NOT NULL,
-  reg1 int(11) DEFAULT '0' NOT NULL,
+  page_id int(11) unsigned DEFAULT '0' NOT NULL,
+  reg1 int(11) unsigned DEFAULT '0' NOT NULL,
   HTML mediumblob NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
-  expires int(10) DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
+  expires int(10) unsigned DEFAULT '0' NOT NULL,
   cache_data mediumblob NOT NULL,
   KEY page_id (page_id),
   KEY sel (hash,page_id),
@@ -27,10 +27,10 @@ CREATE TABLE cache_pages (
 # Table structure for table 'cache_pagesection'
 #
 CREATE TABLE cache_pagesection (
-  page_id int(11) DEFAULT '0' NOT NULL,
-  mpvar_hash int(11) DEFAULT '0' NOT NULL,
+  page_id int(11) unsigned DEFAULT '0' NOT NULL,
+  mpvar_hash int(11) unsigned DEFAULT '0' NOT NULL,
   content blob NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
   PRIMARY KEY (page_id,mpvar_hash)
 );
 
@@ -67,8 +67,8 @@ CREATE TABLE cache_imagesizes (
   md5filename varchar(32) DEFAULT '' NOT NULL,
   tstamp int(11) DEFAULT '0' NOT NULL,
   filename tinytext NOT NULL,
-  imagewidth mediumint(11) DEFAULT '0' NOT NULL,
-  imageheight mediumint(11) DEFAULT '0' NOT NULL,
+  imagewidth mediumint(11) unsigned DEFAULT '0' NOT NULL,
+  imageheight mediumint(11) unsigned DEFAULT '0' NOT NULL,
   PRIMARY KEY (md5filename)
 );
 
@@ -77,13 +77,13 @@ CREATE TABLE cache_imagesizes (
 # Table structure for table 'fe_groups'
 #
 CREATE TABLE fe_groups (
-  uid int(11) DEFAULT '0' NOT NULL auto_increment,
-  pid int(11) DEFAULT '0' NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
+  uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
+  pid int(11) unsigned DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
   title varchar(20) DEFAULT '' NOT NULL,
-  hidden tinyint(3) DEFAULT '0' NOT NULL,
+  hidden tinyint(3) unsigned DEFAULT '0' NOT NULL,
   lockToDomain varchar(50) DEFAULT '' NOT NULL,
-  deleted tinyint(3) DEFAULT '0' NOT NULL,
+  deleted tinyint(3) unsigned DEFAULT '0' NOT NULL,
   description text NOT NULL,
   TSconfig blob NOT NULL,
   PRIMARY KEY (uid),
@@ -97,7 +97,7 @@ CREATE TABLE fe_groups (
 CREATE TABLE fe_session_data (
   hash varchar(32) DEFAULT '' NOT NULL,
   content mediumblob NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
   PRIMARY KEY (hash)
 );
 
@@ -110,8 +110,8 @@ CREATE TABLE fe_sessions (
   ses_name varchar(32) DEFAULT '' NOT NULL,
   ses_iplock varchar(39) DEFAULT '' NOT NULL,
   ses_hashlock int(11) DEFAULT '0' NOT NULL,
-  ses_userid int(11) DEFAULT '0' NOT NULL,
-  ses_tstamp int(11) DEFAULT '0' NOT NULL,
+  ses_userid int(11) unsigned DEFAULT '0' NOT NULL,
+  ses_tstamp int(11) unsigned DEFAULT '0' NOT NULL,
   ses_data blob NOT NULL,
   PRIMARY KEY (ses_id,ses_name)
 );
@@ -121,24 +121,24 @@ CREATE TABLE fe_sessions (
 # Table structure for table 'fe_users'
 #
 CREATE TABLE fe_users (
-  uid int(11) DEFAULT '0' NOT NULL auto_increment,
-  pid int(11) DEFAULT '0' NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
+  uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
+  pid int(11) unsigned DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
   username varchar(50) DEFAULT '' NOT NULL,
   password varchar(40) DEFAULT '' NOT NULL,
   usergroup tinyblob NOT NULL,
-  disable tinyint(4) DEFAULT '0' NOT NULL,
-  starttime int(11) DEFAULT '0' NOT NULL,
-  endtime int(11) DEFAULT '0' NOT NULL,
+  disable tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  starttime int(11) unsigned DEFAULT '0' NOT NULL,
+  endtime int(11) unsigned DEFAULT '0' NOT NULL,
   name varchar(80) DEFAULT '' NOT NULL,
   address tinytext NOT NULL,
   telephone varchar(20) DEFAULT '' NOT NULL,
   fax varchar(20) DEFAULT '' NOT NULL,
   email varchar(80) DEFAULT '' NOT NULL,
-  crdate int(11) DEFAULT '0' NOT NULL,
-  cruser_id int(11) DEFAULT '0' NOT NULL,
+  crdate int(11) unsigned DEFAULT '0' NOT NULL,
+  cruser_id int(11) unsigned DEFAULT '0' NOT NULL,
   lockToDomain varchar(50) DEFAULT '' NOT NULL,
-  deleted tinyint(3) DEFAULT '0' NOT NULL,
+  deleted tinyint(3) unsigned DEFAULT '0' NOT NULL,
   uc blob NOT NULL,
   title varchar(40) DEFAULT '' NOT NULL,
   zip varchar(10) DEFAULT '' NOT NULL,
@@ -148,11 +148,11 @@ CREATE TABLE fe_users (
   company varchar(80) DEFAULT '' NOT NULL,
   image tinyblob NOT NULL,
   TSconfig blob NOT NULL,
-  module_sys_dmail_category int(10) DEFAULT '0' NOT NULL,
-  module_sys_dmail_html tinyint(3) DEFAULT '0' NOT NULL,
-  fe_cruser_id int(10) DEFAULT '0' NOT NULL,
-  lastlogin int(10) DEFAULT '0' NOT NULL,
-  is_online int(10) DEFAULT '0' NOT NULL,
+  module_sys_dmail_category int(10) unsigned DEFAULT '0' NOT NULL,
+  module_sys_dmail_html tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  fe_cruser_id int(10) unsigned DEFAULT '0' NOT NULL,
+  lastlogin int(10) unsigned DEFAULT '0' NOT NULL,
+  is_online int(10) unsigned DEFAULT '0' NOT NULL,
   PRIMARY KEY (uid),
   KEY parent (pid),
   KEY username (username),
@@ -167,17 +167,17 @@ CREATE TABLE fe_users (
 CREATE TABLE pages_language_overlay (
   uid int(11) DEFAULT '0' NOT NULL auto_increment,
   pid int(11) DEFAULT '0' NOT NULL,
-  t3ver_oid int(11) DEFAULT '0' NOT NULL,
-  t3ver_id int(11) DEFAULT '0' NOT NULL,
+  t3ver_oid int(11) unsigned DEFAULT '0' NOT NULL,
+  t3ver_id int(11) unsigned DEFAULT '0' NOT NULL,
   t3ver_label varchar(30) DEFAULT '' NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
-  crdate int(11) DEFAULT '0' NOT NULL,
-  cruser_id int(11) DEFAULT '0' NOT NULL,
-  sys_language_uid int(11) DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
+  crdate int(11) unsigned DEFAULT '0' NOT NULL,
+  cruser_id int(11) unsigned DEFAULT '0' NOT NULL,
+  sys_language_uid int(11) unsigned DEFAULT '0' NOT NULL,
   title tinytext NOT NULL,
-  hidden tinyint(4) DEFAULT '0' NOT NULL,
-  starttime int(11) DEFAULT '0' NOT NULL,
-  endtime int(11) DEFAULT '0' NOT NULL,
+  hidden tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  starttime int(11) unsigned DEFAULT '0' NOT NULL,
+  endtime int(11) unsigned DEFAULT '0' NOT NULL,
   subtitle tinytext NOT NULL,
   nav_title tinytext NOT NULL,
   media tinyblob NOT NULL,
@@ -199,10 +199,10 @@ CREATE TABLE pages_language_overlay (
 # Table structure for table 'static_template'
 #
 CREATE TABLE static_template (
-  uid int(11) DEFAULT '0' NOT NULL auto_increment,
-  pid int(11) DEFAULT '0' NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
-  crdate int(11) DEFAULT '0' NOT NULL,
+  uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
+  pid int(11) unsigned DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
+  crdate int(11) unsigned DEFAULT '0' NOT NULL,
   title tinytext NOT NULL,
   include_static tinyblob NOT NULL,
   constants blob NOT NULL,
@@ -218,13 +218,13 @@ CREATE TABLE static_template (
 # Table structure for table 'sys_domain'
 #
 CREATE TABLE sys_domain (
-  uid int(11) DEFAULT '0' NOT NULL auto_increment,
-  pid int(11) DEFAULT '0' NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
-  hidden tinyint(4) DEFAULT '0' NOT NULL,
+  uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
+  pid int(11) unsigned DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
+  hidden tinyint(4) unsigned DEFAULT '0' NOT NULL,
   domainName varchar(80) DEFAULT '' NOT NULL,
   redirectTo varchar(120) DEFAULT '' NOT NULL,
-  sorting int(10) DEFAULT '0' NOT NULL,
+  sorting int(10) unsigned DEFAULT '0' NOT NULL,
   prepend_params int(10) DEFAULT '0' NOT NULL,
 
   PRIMARY KEY (uid),
@@ -239,20 +239,20 @@ CREATE TABLE sys_domain (
 CREATE TABLE sys_template (
   uid int(11) DEFAULT '0' NOT NULL auto_increment,
   pid int(11) DEFAULT '0' NOT NULL,
-  t3ver_oid int(11) DEFAULT '0' NOT NULL,
-  t3ver_id int(11) DEFAULT '0' NOT NULL,
+  t3ver_oid int(11) unsigned DEFAULT '0' NOT NULL,
+  t3ver_id int(11) unsigned DEFAULT '0' NOT NULL,
   t3ver_label varchar(30) DEFAULT '' NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
-  sorting int(11) DEFAULT '0' NOT NULL,
-  crdate int(11) DEFAULT '0' NOT NULL,
-  cruser_id int(11) DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
+  sorting int(11) unsigned DEFAULT '0' NOT NULL,
+  crdate int(11) unsigned DEFAULT '0' NOT NULL,
+  cruser_id int(11) unsigned DEFAULT '0' NOT NULL,
   title tinytext NOT NULL,
   sitetitle tinytext NOT NULL,
-  hidden tinyint(4) DEFAULT '0' NOT NULL,
-  starttime int(11) DEFAULT '0' NOT NULL,
-  endtime int(11) DEFAULT '0' NOT NULL,
-  root tinyint(4) DEFAULT '0' NOT NULL,
-  clear tinyint(4) DEFAULT '0' NOT NULL,
+  hidden tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  starttime int(11) unsigned DEFAULT '0' NOT NULL,
+  endtime int(11) unsigned DEFAULT '0' NOT NULL,
+  root tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  clear tinyint(4) unsigned DEFAULT '0' NOT NULL,
   include_static tinyblob NOT NULL,
   include_static_file blob NOT NULL,
   constants blob NOT NULL,
@@ -262,9 +262,9 @@ CREATE TABLE sys_template (
   nextLevel varchar(5) DEFAULT '' NOT NULL,
   description text NOT NULL,
   basedOn tinyblob NOT NULL,
-  deleted tinyint(3) DEFAULT '0' NOT NULL,
-  includeStaticAfterBasedOn tinyint(4) DEFAULT '0' NOT NULL,
-  static_file_mode tinyint(4) DEFAULT '0' NOT NULL,
+  deleted tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  includeStaticAfterBasedOn tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  static_file_mode tinyint(4) unsigned DEFAULT '0' NOT NULL,
   tx_impexp_origuid int(11) DEFAULT '0' NOT NULL,
   PRIMARY KEY (uid),
   KEY t3ver_oid (t3ver_oid),
@@ -278,66 +278,66 @@ CREATE TABLE sys_template (
 CREATE TABLE tt_content (
   uid int(11) DEFAULT '0' NOT NULL auto_increment,
   pid int(11) DEFAULT '0' NOT NULL,
-  t3ver_oid int(11) DEFAULT '0' NOT NULL,
-  t3ver_id int(11) DEFAULT '0' NOT NULL,
+  t3ver_oid int(11) unsigned DEFAULT '0' NOT NULL,
+  t3ver_id int(11) unsigned DEFAULT '0' NOT NULL,
   t3ver_label varchar(30) DEFAULT '' NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
-  hidden tinyint(4) DEFAULT '0' NOT NULL,
-  sorting int(11) DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
+  hidden tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  sorting int(11) unsigned DEFAULT '0' NOT NULL,
   CType varchar(30) DEFAULT '' NOT NULL,
   header tinytext NOT NULL,
   header_position varchar(6) DEFAULT '' NOT NULL,
   bodytext mediumtext NOT NULL,
   image blob NOT NULL,
-  imagewidth mediumint(11) DEFAULT '0' NOT NULL,
-  imageorient tinyint(4) DEFAULT '0' NOT NULL,
+  imagewidth mediumint(11) unsigned DEFAULT '0' NOT NULL,
+  imageorient tinyint(4) unsigned DEFAULT '0' NOT NULL,
   imagecaption text NOT NULL,
-  imagecols tinyint(4) DEFAULT '0' NOT NULL,
-  imageborder tinyint(4) DEFAULT '0' NOT NULL,
+  imagecols tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  imageborder tinyint(4) unsigned DEFAULT '0' NOT NULL,
   media blob NOT NULL,
-  layout tinyint(3) DEFAULT '0' NOT NULL,
-  deleted tinyint(4) DEFAULT '0' NOT NULL,
-  cols tinyint(3) DEFAULT '0' NOT NULL,
+  layout tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  deleted tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  cols tinyint(3) unsigned DEFAULT '0' NOT NULL,
   records blob NOT NULL,
   pages tinyblob NOT NULL,
-  starttime int(11) DEFAULT '0' NOT NULL,
-  endtime int(11) DEFAULT '0' NOT NULL,
-  colPos tinyint(3) DEFAULT '0' NOT NULL,
+  starttime int(11) unsigned DEFAULT '0' NOT NULL,
+  endtime int(11) unsigned DEFAULT '0' NOT NULL,
+  colPos tinyint(3) unsigned DEFAULT '0' NOT NULL,
   subheader tinytext NOT NULL,
-  spaceBefore tinyint(4) DEFAULT '0' NOT NULL,
-  spaceAfter tinyint(4) DEFAULT '0' NOT NULL,
+  spaceBefore tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  spaceAfter tinyint(4) unsigned DEFAULT '0' NOT NULL,
   fe_group int(11) DEFAULT '0' NOT NULL,
   header_link tinytext NOT NULL,
   imagecaption_position varchar(6) DEFAULT '' NOT NULL,
   image_link tinytext NOT NULL,
-  image_zoom tinyint(3) DEFAULT '0' NOT NULL,
-  image_noRows tinyint(3) DEFAULT '0' NOT NULL,
-  image_effects tinyint(3) DEFAULT '0' NOT NULL,
-  image_compression tinyint(3) DEFAULT '0' NOT NULL,
+  image_zoom tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  image_noRows tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  image_effects tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  image_compression tinyint(3) unsigned DEFAULT '0' NOT NULL,
   header_layout varchar(30) DEFAULT '0' NOT NULL,
   text_align varchar(6) DEFAULT '' NOT NULL,
-  text_face tinyint(3) DEFAULT '0' NOT NULL,
-  text_size tinyint(3) DEFAULT '0' NOT NULL,
-  text_color tinyint(3) DEFAULT '0' NOT NULL,
-  text_properties tinyint(3) DEFAULT '0' NOT NULL,
+  text_face tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  text_size tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  text_color tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  text_properties tinyint(3) unsigned DEFAULT '0' NOT NULL,
   menu_type varchar(30) DEFAULT '0' NOT NULL,
   list_type varchar(36) DEFAULT '0' NOT NULL,
-  table_border tinyint(3) DEFAULT '0' NOT NULL,
-  table_cellspacing tinyint(3) DEFAULT '0' NOT NULL,
-  table_cellpadding tinyint(3) DEFAULT '0' NOT NULL,
-  table_bgColor tinyint(3) DEFAULT '0' NOT NULL,
+  table_border tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  table_cellspacing tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  table_cellpadding tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  table_bgColor tinyint(3) unsigned DEFAULT '0' NOT NULL,
   select_key varchar(80) DEFAULT '' NOT NULL,
-  sectionIndex tinyint(3) DEFAULT '0' NOT NULL,
-  linkToTop tinyint(3) DEFAULT '0' NOT NULL,
-  filelink_size tinyint(3) DEFAULT '0' NOT NULL,
-  section_frame tinyint(3) DEFAULT '0' NOT NULL,
-  date int(10) DEFAULT '0' NOT NULL,
+  sectionIndex tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  linkToTop tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  filelink_size tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  section_frame tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  date int(10) unsigned DEFAULT '0' NOT NULL,
   splash_layout varchar(30) DEFAULT '0' NOT NULL,
   multimedia tinyblob NOT NULL,
-  image_frames tinyint(3) DEFAULT '0' NOT NULL,
-  recursive tinyint(3) DEFAULT '0' NOT NULL,
-  imageheight mediumint(8) DEFAULT '0' NOT NULL,
-  module_sys_dmail_category int(10) DEFAULT '0' NOT NULL,
+  image_frames tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  recursive tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  imageheight mediumint(8) unsigned DEFAULT '0' NOT NULL,
+  module_sys_dmail_category int(10) unsigned DEFAULT '0' NOT NULL,
   rte_enabled tinyint(4) DEFAULT '0' NOT NULL,
   sys_language_uid int(11) DEFAULT '0' NOT NULL,
   tx_impexp_origuid int(11) DEFAULT '0' NOT NULL,
@@ -356,37 +356,37 @@ CREATE TABLE tt_content (
 #
 CREATE TABLE pages (
   url tinytext NOT NULL,
-  hidden tinyint(4) DEFAULT '0' NOT NULL,
-  starttime int(11) DEFAULT '0' NOT NULL,
-  endtime int(11) DEFAULT '0' NOT NULL,
-  urltype tinyint(4) DEFAULT '0' NOT NULL,
-  shortcut int(10) DEFAULT '0' NOT NULL,
-  shortcut_mode int(10) DEFAULT '0' NOT NULL,
-  no_cache int(10) DEFAULT '0' NOT NULL,
+  hidden tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  starttime int(11) unsigned DEFAULT '0' NOT NULL,
+  endtime int(11) unsigned DEFAULT '0' NOT NULL,
+  urltype tinyint(4) unsigned DEFAULT '0' NOT NULL,
+  shortcut int(10) unsigned DEFAULT '0' NOT NULL,
+  shortcut_mode int(10) unsigned DEFAULT '0' NOT NULL,
+  no_cache int(10) unsigned DEFAULT '0' NOT NULL,
   fe_group int(11) DEFAULT '0' NOT NULL,
   subtitle tinytext NOT NULL,
-  layout tinyint(3) DEFAULT '0' NOT NULL,
+  layout tinyint(3) unsigned DEFAULT '0' NOT NULL,
   target varchar(20) DEFAULT '' NOT NULL,
   media blob NOT NULL,
-  lastUpdated int(10) DEFAULT '0' NOT NULL,
+  lastUpdated int(10) unsigned DEFAULT '0' NOT NULL,
   keywords text NOT NULL,
-  cache_timeout int(10) DEFAULT '0' NOT NULL,
-  newUntil int(10) DEFAULT '0' NOT NULL,
+  cache_timeout int(10) unsigned DEFAULT '0' NOT NULL,
+  newUntil int(10) unsigned DEFAULT '0' NOT NULL,
   description text NOT NULL,
-  no_search tinyint(3) DEFAULT '0' NOT NULL,
-  SYS_LASTCHANGED int(10) DEFAULT '0' NOT NULL,
+  no_search tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  SYS_LASTCHANGED int(10) unsigned DEFAULT '0' NOT NULL,
   abstract text NOT NULL,
   module varchar(10) DEFAULT '' NOT NULL,
-  extendToSubpages tinyint(3) DEFAULT '0' NOT NULL,
+  extendToSubpages tinyint(3) unsigned DEFAULT '0' NOT NULL,
   author tinytext NOT NULL,
   author_email varchar(80) DEFAULT '' NOT NULL,
   nav_title tinytext NOT NULL,
   nav_hide tinyint(4) DEFAULT '0' NOT NULL,
-  content_from_pid int(10) DEFAULT '0' NOT NULL,
-  mount_pid int(10) DEFAULT '0' NOT NULL,
+  content_from_pid int(10) unsigned DEFAULT '0' NOT NULL,
+  mount_pid int(10) unsigned DEFAULT '0' NOT NULL,
   mount_pid_ol tinyint(4) DEFAULT '0' NOT NULL,
   alias varchar(20) DEFAULT '' NOT NULL,
   l18n_cfg tinyint(4) DEFAULT '0' NOT NULL,
   fe_login_mode tinyint(4) DEFAULT '0' NOT NULL,
   KEY alias (alias)
-);
\ No newline at end of file
+);
index 389ed0e..ae0f817 100644 (file)
@@ -9,10 +9,10 @@
 #
 DROP TABLE IF EXISTS static_template;
 CREATE TABLE static_template (
-  uid int(11) DEFAULT '0' NOT NULL auto_increment,
-  pid int(11) DEFAULT '0' NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
-  crdate int(11) DEFAULT '0' NOT NULL,
+  uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
+  pid int(11) unsigned DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
+  crdate int(11) unsigned DEFAULT '0' NOT NULL,
   title tinytext NOT NULL,
   include_static tinyblob NOT NULL,
   constants blob NOT NULL,
index c61b215..4147d36 100644 (file)
@@ -509,7 +509,6 @@ Contact me: | tv=check | 1
                                'icon'=>'gfx/c_wiz/searchform.gif',
                                'title'=>$LANG->getLL('forms_2_title'),
                                'description'=>$LANG->getLL('forms_2_description'),
-                               'params'=>'&defVals[tt_content][CType]=search',
                                'tt_content_defValues' => array(
                                        'CType' => 'search',
                                )
@@ -564,10 +563,24 @@ Contact me: | tv=check | 1
 
                        // Traverse wizard items:
                foreach($wizardItems as $key => $cfg)   {
-                       if (is_array($cfg['tt_content_defValues']))     {
+
+                               // Exploding parameter string, if any (old style)
+                       if ($wizardItems[$key]['params'])       {
+                                       // Explode GET vars recursively
+                               $tempGetVars = t3lib_div::explodeUrl2Array($wizardItems[$key]['params'],TRUE);
+                                       // If tt_content values are set, merge them into the tt_content_defValues array, unset them from $tempGetVars and re-implode $tempGetVars into the param string (in case remaining parameters are around).
+                               if (is_array($tempGetVars['defVals']['tt_content']))    {
+                                       $wizardItems[$key]['tt_content_defValues'] = array_merge(is_array($wizardItems[$key]['tt_content_defValues']) ? $wizardItems[$key]['tt_content_defValues'] : array(), $tempGetVars['defVals']['tt_content']);
+                                       unset($tempGetVars['defVals']['tt_content']);
+                                       $wizardItems[$key]['params'] = t3lib_div::implodeArrayForUrl('',$tempGetVars);
+                               }
+                       }
+
+                               // If tt_content_defValues are defined...:
+                       if (is_array($wizardItems[$key]['tt_content_defValues']))       {
 
                                        // Traverse field values:
-                               foreach($cfg['tt_content_defValues'] as $fN => $fV)     {
+                               foreach($wizardItems[$key]['tt_content_defValues'] as $fN => $fV)       {
                                        if (is_array($TCA['tt_content']['columns'][$fN]))       {
                                                        // Get information about if the field value is OK:
                                                $config = &$TCA['tt_content']['columns'][$fN]['config'];
index 9aafd23..c55f528 100755 (executable)
@@ -64,6 +64,7 @@
                        <label index="pages.l18n_cfg">Localization settings:</label>
                        <label index="pages.l18n_cfg.I.1">Hide default translation of page</label>
                        <label index="pages.l18n_cfg.I.2">Hide page if no translation for current language exists</label>
+                       <label index="pages.l18n_cfg.I.2a">Show page even if no translation exists</label>
                        <label index="tt_content">Pagecontent</label>
                        <label index="fe_users">Website user</label>
                        <label index="fe_users.username">Username:</label>
index 53b6872..1a9d6ae 100755 (executable)
@@ -4929,7 +4929,9 @@ class tslib_cObj {
                                        }
 
                                                // Looking up the page record to verify its existence:
-                                       $page = $GLOBALS['TSFE']->sys_page->getPage($link_param);
+                                       $disableGroupAccessCheck = $GLOBALS['TSFE']->config['config']['typolinkLinkAccessRestrictedPages'] ? TRUE : FALSE;
+                                       $page = $GLOBALS['TSFE']->sys_page->getPage($link_param,$disableGroupAccessCheck);
+
                                        if (count($page))       {
                                                        // This checks if the linked id is in the rootline of this site and if not it will find the domain for that ID and prefix it:
                                                $tCR_domain='';
@@ -4961,7 +4963,7 @@ class tslib_cObj {
                                                        // Look for overlay Mount Point:
                                                $mount_info = $GLOBALS['TSFE']->sys_page->getMountPointInfo($page['uid'], $page);
                                                if (is_array($mount_info) && $mount_info['overlay'])    {
-                                                       $page = $GLOBALS['TSFE']->sys_page->getPage($mount_info['mount_pid']);
+                                                       $page = $GLOBALS['TSFE']->sys_page->getPage($mount_info['mount_pid'],$disableGroupAccessCheck);
                                                        if (!count($page))      {
                                                                $GLOBALS['TT']->setTSlogMessage("typolink(): Mount point '".$mount_info['mount_pid']."' was not available, so '".$linktxt."' was not linked.",1);
                                                                return $linktxt;
@@ -5013,6 +5015,20 @@ class tslib_cObj {
                                                                }
                                                        }
                                                }
+
+                                                       // If link is to a access restricted page which should be redirected, then find new URL:
+                                               if ($GLOBALS['TSFE']->config['config']['typolinkLinkAccessRestrictedPages'] &&
+                                                               $GLOBALS['TSFE']->config['config']['typolinkLinkAccessRestrictedPages']!=='NONE' &&
+                                                               !$GLOBALS['TSFE']->checkPageGroupAccess($page)) {
+                                                                       $thePage = $GLOBALS['TSFE']->sys_page->getPage($GLOBALS['TSFE']->config['config']['typolinkLinkAccessRestrictedPages']);
+
+                                                                       $addParams = $GLOBALS['TSFE']->config['config']['typolinkLinkAccessRestrictedPages_addParams'];
+                                                                       $addParams = str_replace('###RETURN_URL###',rawurlencode($this->lastTypoLinkUrl),$addParams);
+                                                                       $addParams = str_replace('###PAGE_ID###',$page['uid'],$addParams);
+                                                                       $LD = $GLOBALS['TSFE']->tmpl->linkData($thePage,$target,'','','',$addParams,$theTypeP);
+                                                                       $this->lastTypoLinkUrl = $this->URLqMark($LD['totalURL'],'');
+                                               }
+
                                                        // Rendering the tag.
                                                $finalTagParts['url']=$this->lastTypoLinkUrl;
                                                $finalTagParts['targetParams']=$targetPart;
@@ -6340,7 +6356,8 @@ class tslib_cObj {
 
                        // enablefields
                if ($table=='pages')    {
-                       $query.=' '.$GLOBALS['TSFE']->sys_page->where_hid_del;
+                       $query.=' '.$GLOBALS['TSFE']->sys_page->where_hid_del.
+                                               $GLOBALS['TSFE']->sys_page->where_groupAccess;
                } else {
                        $query.=$this->enableFields($table);
                }
index 8120bfb..aca2d2e 100755 (executable)
        var $jumpurl='';
        var $pageNotFound=0;                            // Is set to 1 if a pageNotFound handler could have been called.
        var $domainStartPage=0;                         // Domain start page
+       var $pageAccessFailureHistory=array();  // Array containing a history of why a requested page was not accessible.
        var $MP='';
        var $RDCT='';
        var $page_cache_reg1=0;                         // This can be set from applications as a way to tag cached versions of a page and later perform some external cache management, like clearing only a part of the cache of a page...
        var $newHash='';                                        // This hash is unique to the template, the $this->id and $this->type vars and the gr_list (list of groups). Used to get and later store the cached data
        var $getMethodUrlIdToken='';            // If config.ftu (Frontend Track User) is set in TypoScript for the current page, the string value of this var is substituted in the rendered source-code with the string, '&ftu=[token...]' which enables GET-method usertracking as opposed to cookie based
        var $noCacheBeforePageGen='';           // This flag is set before inclusion of pagegen.php IF no_cache is set. If this flag is set after the inclusion of pagegen.php, no_cache is forced to be set. This is done in order to make sure that php-code from pagegen does not falsely clear the no_cache flag.
-       var $tempContent='';                            // This flag indicates if temporary content went into the cache during page-generation.
+       var $tempContent = FALSE;                       // This flag indicates if temporary content went into the cache during page-generation.
        var $forceTemplateParsing='';                           // Boolean, passed to TypoScript template class and tells it to render the template forcibly
        var $cHash_array=array();                       // The array which cHash_calc is based on, see ->makeCacheHash().
        var $hash_base='';                                      // Loaded with the serialized array that is used for generating a hashstring for the cache
                } else {
                        $this->loginUser=0;
                        $this->gr_list = '0,-1';        // group -1 is not an existing group, but denotes a 'default' group when not logged in. This is used to let elements be hidden, when a user is logged in!
-                       $gr_array = $this->fe_user->groupData['uid'];
+
+                       if ($this->loginAllowedInBranch)        {
+                               $gr_array = $this->fe_user->groupData['uid'];   // For cases where logins are not banned from a branch usergroups can be set based on IP masks so we should add the usergroups uids.
+                       } else {
+                               $gr_array = array();            // Set to blank since we will NOT risk any groups being set when no logins are allowed!
+                       }
                }
-               // TYPO3_CONF_VARS']['FE']['IPmaskMountGroups'] moved to sysext/sv/class.tx_sv_auth.php service
 
                        // Clean up.
                $gr_array = array_unique($gr_array);    // Make unique...
        }
 
        /**
+        * Checking if a user is logged in or a group constellation different from "0,-1"
+        *
+        * @return      boolean         TRUE if either a login user is found (array fe_user->user) OR if the gr_list is set to something else than '0,-1' (could be done even without a user being logged in!)
+        */
+       function isUserOrGroupSet()     {
+               return is_array($this->fe_user->user) || $this->gr_list!=='0,-1';
+       }
+
+       /**
         * Provides ways to bypass the '?id=[xxx]&type=[xx]' format, using either PATH_INFO or virtual HTML-documents (using Apache mod_rewrite)
         *
         * Three options:
                        // Checks if user logins are blocked for a certain branch and if so, will unset user login and re-fetch ID.
                $this->loginAllowedInBranch = $this->checkIfLoginAllowedInBranch();
                if (!$this->loginAllowedInBranch)       {       // Logins are not allowed:
-                       if (is_array($this->fe_user->user))     {       // Only if there is a login will we run this...
+                       if ($this->isUserOrGroupSet())  {       // Only if there is a login will we run this...
+
+                                       // Clear out user and group:
                                unset($this->fe_user->user);
+                               $this->gr_list = '0,-1';
+
                                        // Fetching the id again, now with the preview settings reset.
                                $this->fetch_the_id();
                        }
                        if (count($this->rootLine))     {
                                $c=count($this->rootLine)-1;
                                while($c>0)     {
+
+                                               // Add to page access failure history:
+                                       $this->pageAccessFailureHistory['direct_access'][] = $this->rootLine[$c];
+
+                                               // Decrease to next page in rootline and check the access to that, if OK, set as page record and ID value.
                                        $c--;
-                                       $this->id=$this->rootLine[$c]['uid'];
+                                       $this->id = $this->rootLine[$c]['uid'];
                                        $this->page = $this->sys_page->getPage($this->id);
-                                       if (count($this->page)){break;}
+                                       if (count($this->page)){ break; }
                                }
                        }
                                // If still no page...
        function checkRootlineForIncludeSection()       {
                $c=count($this->rootLine);
                $removeTheRestFlag=0;
+
                for ($a=0;$a<$c;$a++)   {
                        if (!$this->checkPagerecordForIncludeSection($this->rootLine[$a]))      {
+                                       // Add to page access failure history:
+                               $this->pageAccessFailureHistory['sub_section'][] = $this->rootLine[$a];
                                $removeTheRestFlag=1;
                        }
                        if ($this->rootLine[$a]['doktype']==6)  {
         * Takes notice of the ->showHiddenPage flag and uses SIM_EXEC_TIME for start/endtime evaluation
         *
         * @param       array           The page record to evaluate (needs fields: hidden, starttime, endtime, fe_group)
+        * @param       boolean         Bypass group-check
         * @return      boolean         True, if record is viewable.
         * @see tslib_cObj::getTreeList(), checkPagerecordForIncludeSection()
         */
-       function checkEnableFields($row)        {
+       function checkEnableFields($row,$bypassGroupCheck=FALSE)        {
                if ((!$row['hidden'] || $this->showHiddenPage)
                        && $row['starttime']<=$GLOBALS['SIM_EXEC_TIME']
                        && ($row['endtime']==0 || $row['endtime']>$GLOBALS['SIM_EXEC_TIME'])
-                       && $this->checkPageGroupAccess($row)
-               ) {
-                       return 1;
-               }
+                       && ($bypassGroupCheck || $this->checkPageGroupAccess($row))
+               ) { return TRUE; }
        }
 
        /**
        }
 
        /**
+        * Analysing $this->pageAccessFailureHistory into a summary array telling which features disabled display and on which pages and conditions. That data can be used inside a page-not-found handler
+        *
+        * @return      array   Summary of why page access was not allowed.
+        */
+       function getPageAccessFailureReasons()  {
+               $output = array();
+
+               $combinedRecords = array_merge(
+                       is_array($this->pageAccessFailureHistory['direct_access']) ? $this->pageAccessFailureHistory['direct_access'] : array(array('fe_group'=>0)),    // Adding fake first record for direct access if none, otherwise $k==0 below will be indicating a sub-section record to be first direct_access record which is of course false!
+                       is_array($this->pageAccessFailureHistory['sub_section']) ? $this->pageAccessFailureHistory['sub_section'] : array()
+               );
+
+               if (count($combinedRecords))    {
+                       foreach($combinedRecords as $k => $pagerec)     {
+                               // If $k=0 then it is the very first page the original ID was pointing at and that will get a full check of course
+                               // If $k>0 it is parent pages being tested. They are only significant for the access to the first page IF they had the extendToSubpages flag set, hence checked only then!
+                               if (!$k || $pagerec['extendToSubpages'])        {
+                                       if ($pagerec['hidden']) $output['hidden'][$pagerec['uid']] = TRUE;
+                                       if ($pagerec['starttime'] > $GLOBALS['SIM_EXEC_TIME'])  $output['starttime'][$pagerec['uid']] = $pagerec['starttime'];
+                                       if ($pagerec['endtime']!=0 && $pagerec['endtime'] <= $GLOBALS['SIM_EXEC_TIME']) $output['endtime'][$pagerec['uid']] = $pagerec['endtime'];
+                                       if (!$this->checkPageGroupAccess($pagerec))     $output['fe_group'][$pagerec['uid']] = $pagerec['fe_group'];
+                               }
+                       }
+               }
+
+               return $output;
+       }
+
+       /**
         * This checks if there are ARGV-parameters in the QUERY_STRING and if so, those are used for the id
         * $this->id must be 'false' in order for any processing to happen in here
         * If an id/alias value is extracted from the QUERY_STRING it is set in $this->id
         * @return      void
         * @access private
         */
-        function setSysPageWhereClause() {
-               $this->sys_page->where_hid_del.=' AND doktype<200'.$this->getPagesGroupClause();
+       function setSysPageWhereClause() {
+               $this->sys_page->where_hid_del.=' AND doktype<200';
+               $this->sys_page->where_groupAccess = $this->getPagesGroupClause();
        }
 
        /**
         * @return      string          Group where clause part
         * @access private
         */
-        function getPagesGroupClause() {
+       function getPagesGroupClause() {
                return ' AND fe_group IN ('.$this->gr_list.')';
        }
 
                if ($header)    {header($header);}
 
                        // Create response:
-               if (gettype($code)=='boolean' || !strcmp($code,1))      {
+               if (gettype($code)=='boolean' || !strcmp($code,1))      {       // Simply boolean; Just shows TYPO3 error page with reason:
                        $this->printError('The page did not exist or was inaccessible.'.($reason ? ' Reason: '.htmlspecialchars($reason) : ''));
                        exit;
-               } elseif (t3lib_div::testInt($code))    {
-                       $this->printError('Error '.$code.($reason ? ' Reason: '.htmlspecialchars($reason) : ''));
+               } elseif (t3lib_div::isFirstPartOfStr($code,'USER_FUNCTION:')) {
+                       $funcRef = trim(substr($code,14));
+                       $params = array(
+                               'currentUrl' => t3lib_div::getIndpEnv('REQUEST_URI'),
+                               'reasonText' => $reason,
+                               'pageAccessFailureReasons' => $this->getPageAccessFailureReasons()
+                       );
+                       echo t3lib_div::callUserFunction($funcRef,$params,$this);
                        exit;
                } elseif (t3lib_div::isFirstPartOfStr($code,'READFILE:')) {
                        $readFile = t3lib_div::getFileAbsFileName(trim(substr($code,9)));
                                if ($this->sys_language_uid)    {
 
                                                // If requested translation is not available:
-                                       if ($this->page['l18n_cfg']&2)  {
+                                       if (t3lib_div::hideIfNotTranslated($this->page['l18n_cfg']))    {
                                                $this->pageNotFoundAndExit('Page is not available in the requested language.');
                                        } else {
                                                switch((string)$this->sys_language_mode)        {
         * @return      void
         */
        function tempPageCacheContent() {
-               $this->tempContent = 0;
+               $this->tempContent = FALSE;
 
                if (!$this->no_cache)   {
                        $seconds = 30;
                                        <meta http-equiv="refresh" content="3; URL='.htmlspecialchars(t3lib_div::getIndpEnv('REQUEST_URI')).'" />
                                </head>
                                <body bgcolor="white">
-                                       <span style="font-family:Verdana,Arial,Helvetica" color="#cccccc">
-                                       <div align="center">
+                                       <div align="center" style="font-family:Verdana,Arial,Helvetica" color="#cccccc">
                                                <strong>Page is being generated.</strong><br />
                                                If this message does not disappear within '.$seconds.' seconds, please reload.
                                        </div>
-                                       </span>
                                </body>
                        </html>';
                        $temp_content = $this->config['config']['message_page_is_being_generated'] ? $this->config['config']['message_page_is_being_generated'] : $stdMsg;
 
                        $this->setPageCacheContent($temp_content, '', $GLOBALS['EXEC_TIME']+$seconds);
-                       $this->tempContent = 1;         // This flag shows that temporary content is put in the cache
+                       $this->tempContent = TRUE;              // This flag shows that temporary content is put in the cache
                }
        }
 
                        }
                }
 
+                       // Convert char-set for output: (should be BEFORE indexing of the content (changed 22/4 2005)), because otherwise indexed search might convert from the wrong charset! One thing is that the charset mentioned in the HTML header would be wrong since the output charset (metaCharset) has not been converted to from renderCharset. And indexed search will internally convert from metaCharset to renderCharset so the content MUST be in metaCharset already!
+               $this->content = $this->convOutputCharset($this->content,'mainpage');
+
                        // Hook for indexing pages
                if (is_array($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['pageIndexing'])) {
                        foreach($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['pageIndexing'] as $_classRef) {
                        }
                }
 
-                       // Convert char-set for output:
-               $this->content = $this->convOutputCharset($this->content,'mainpage');
-
                        // Storing for cache:
                if (!$this->no_cache)   {
                        $this->realPageCacheContent();
@@ -2589,6 +2648,7 @@ if (version == "n3") {
 
        /**
         * Send cache headers good for client/reverse proxy caching
+        * This function should not be called if the page content is temporary (like for "Page is being generated..." message, but in that case it is ok because the config-variables are not yet available and so will not allow to send cache headers)
         *
         * @return      void
         * @co-author   Ole Tange, Forbrugernes Hus, Denmark
@@ -2661,12 +2721,10 @@ if (version == "n3") {
         * @return      boolean
         */
        function isStaticCacheble()     {
-
                $doCache = !$this->no_cache
                                && !$this->isINTincScript()
                                && !$this->isEXTincScript()
-                               && !is_array($this->fe_user->user);
-
+                               && !$this->isUserOrGroupSet();
                return $doCache;
        }
 
@@ -3565,7 +3623,7 @@ if (version == "n3") {
         * @param       string          Label (just for fun, no function)
         * @return      string          Converted content string.
         */
-       function convOutputCharset($content,$label)     {
+       function convOutputCharset($content,$label='')  {
                if ($this->renderCharset != $this->metaCharset) {
                        $content = $this->csConvObj->conv($content,$this->renderCharset,$this->metaCharset,TRUE);
                }
index c123da0..c0264d2 100644 (file)
@@ -32,6 +32,7 @@
  * Revised for TYPO3 3.6 June/2003 by Kasper Skaarhoj
  *
  * @author     Kasper Skaarhoj <kasperYYYY@typo3.com>
+ * @author     René Fritz <r.fritz@colorcube.de>
  */
 /**
  * [CLASS/FUNCTION INDEX of SCRIPT]
@@ -71,6 +72,7 @@
  * Extension class for Front End User Authentication.
  *
  * @author     Kasper Skaarhoj <kasperYYYY@typo3.com>
+ * @author     René Fritz <r.fritz@colorcube.de>
  * @package TYPO3
  * @subpackage tslib
  */
@@ -151,38 +153,75 @@ class tslib_feUserAuth extends t3lib_userAuth {
                        // Setting default configuration:
                $this->TSdataArray[]=$GLOBALS['TYPO3_CONF_VARS']['FE']['defaultUserTSconfig'];
 
-               if (is_array($this->user) && $this->user['usergroup'])  {
-                       $groups = t3lib_div::intExplode(',',$this->user['usergroup']);
-                       $list = implode(',',$groups);
-                       $lockToDomain_SQL = ' AND (lockToDomain=\'\' OR lockToDomain=\''.t3lib_div::getIndpEnv('HTTP_HOST').'\')';
-                       if (!$this->showHiddenRecords)  $hiddenP = 'AND hidden=0 ';
-
-                       $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', $this->usergroup_table, 'deleted=0 '.$hiddenP.'AND uid IN ('.$list.')'.$lockToDomain_SQL);
-                       while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))      {
-                               $this->groupData['title'][$row['uid']] = $row['title'];
-                               $this->groupData['uid'][$row['uid']] = $row['uid'];
-                               $this->groupData['pid'][$row['uid']] = $row['pid'];
-                               $this->groupData['TSconfig'][$row['uid']] = $row['TSconfig'];
+                       // get the info data for auth services
+               $authInfo = $this->getAuthInfoArray();
+
+               if ($this->writeDevLog)         t3lib_div::devLog('Get usergroups for user: '.t3lib_div::arrayToLogString($this->user, array($this->userid_column,$this->username_column)), 'tslib_feUserAuth');
+
+               $groupDataArr = array();
+
+                       // use 'auth' service to find the groups for the user
+               $serviceChain='';
+               $subType = 'getGroups'.$this->loginType;
+               while (is_object($serviceObj = t3lib_div::makeInstanceService('auth', $subType, $serviceChain))) {
+                       $serviceChain.=','.$serviceObj->getServiceKey();
+                       $serviceObj->initAuth($subType, array(), $authInfo, $this);
+
+                       $groupData = $serviceObj->getGroups($this->user, $groupDataArr);
+                       if(is_array($groupData) && count($groupData)) {
+                               $groupDataArr = t3lib_div::array_merge($groupDataArr, $groupData);      // Keys in $groupData should be unique ids of the groups (like "uid") so this function will override groups.
                        }
+                       unset($serviceObj);
+               }
+               if ($this->writeDevLog AND $serviceChain)       t3lib_div::devLog($subType.' auth services called: '.$serviceChain, 'tslib_feUserAuth');
+               if ($this->writeDevLog AND !count($groupDataArr))       t3lib_div::devLog('No usergroups found by services', 'tslib_feUserAuth');
+               if ($this->writeDevLog AND count($groupDataArr))        t3lib_div::devLog(count($groupDataArr).' usergroup records found by services', 'tslib_feUserAuth');
+
+
+                       // use 'auth' service to check the usergroups if they are really valid
+               foreach($groupDataArr as $groupData) {
+                               // by default a group is valid
+                       $validGroup = TRUE;
+
+                       $serviceChain='';
+                       $subType = 'authGroups'.$this->loginType;
+                       while (is_object($serviceObj = t3lib_div::makeInstanceService('auth', $subType, $serviceChain))) {
+                               $serviceChain.=','.$serviceObj->getServiceKey();
+                               $serviceObj->initAuth($subType, array(), $authInfo, $this);
+
+                               if (!$serviceObj->authGroup($this->user, $groupData)) {
+                                       $validGroup = FALSE;
+                                       if ($this->writeDevLog)         t3lib_div::devLog($subType.' auth service did not auth group: '.t3lib_div::arrayToLogString($groupData, 'uid,title'), 'tslib_feUserAuth', 2);
 
-                       if ($GLOBALS['TYPO3_DB']->sql_num_rows($res))   {
-                               $GLOBALS['TYPO3_DB']->sql_free_result($res);
-                               // TSconfig:
-                               reset($groups);
-                               while(list(,$TSuid)=each($groups))      {
-                                       $this->TSdataArray[]=$this->groupData['TSconfig'][$TSuid];
+                                       break;
                                }
-                               $this->TSdataArray[]=$this->user['TSconfig'];
+                               unset($serviceObj);
+                       }
+                       unset($serviceObj);
 
-                               // Sort information
-                               ksort($this->groupData['title']);
-                               ksort($this->groupData['uid']);
-                               ksort($this->groupData['pid']);
-                               return count($this->groupData['uid']);
-                       } else {
-                               return 0;
+                       if ($validGroup) {
+                               $this->groupData['title'][$groupData['uid']]=$groupData['title'];
+                               $this->groupData['uid'][$groupData['uid']]=$groupData['uid'];
+                               $this->groupData['pid'][$groupData['uid']]=$groupData['pid'];
+                               $this->groupData['TSconfig'][$groupData['uid']]=$groupData['TSconfig'];
                        }
                }
+
+               if (count($this->groupData) && count($this->groupData['TSconfig']))     {
+                               // TSconfig: collect it in the order it was collected
+                       foreach($this->groupData['TSconfig'] as $TSdata)        {
+                               $this->TSdataArray[]=$TSdata;
+                       }
+
+                       $this->TSdataArray[]=$this->user['TSconfig'];
+
+                               // Sort information
+                       ksort($this->groupData['title']);
+                       ksort($this->groupData['uid']);
+                       ksort($this->groupData['pid']);
+               }
+
+               return count($this->groupData['uid']) ? count($this->groupData['uid']) : 0;
        }
 
        /**
index 838c581..281b3b5 100755 (executable)
@@ -312,6 +312,15 @@ class tslib_menu {
         */
        function makeMenu()     {
                if ($this->id)  {
+
+                               // Initializing showAccessRestrictedPages
+                       if ($this->mconf['showAccessRestrictedPages'])  {
+                                       // SAVING where_groupAccess
+                               $SAVED_where_groupAccess = $this->sys_page->where_groupAccess;
+                               $this->sys_page->where_groupAccess = '';        // Temporarily removing fe_group checking!
+                       }
+
+                               // Begin production of menu:
                        $temp = array();
                        $altSortFieldValue = trim($this->mconf['alternativeSortingField']);
                        $altSortField = $altSortFieldValue ? $altSortFieldValue : 'sorting';
@@ -345,7 +354,7 @@ class tslib_menu {
                                                        } else $lRecs=array();
                                                                // Checking if the "disabled" state should be set.
                                                        if (
-                                                                               ($GLOBALS['TSFE']->page['l18n_cfg']&2 && $sUid && !count($lRecs)) // Blocking for all translations?
+                                                                               (t3lib_div::hideIfNotTranslated($GLOBALS['TSFE']->page['l18n_cfg']) && $sUid && !count($lRecs)) // Blocking for all translations?
                                                                        || ($GLOBALS['TSFE']->page['l18n_cfg']&1 && (!$sUid || !count($lRecs))) // Blocking default translation?
                                                                        || (!$this->conf['special.']['normalWhenNoLanguage'] && $sUid && !count($lRecs))
                                                                )       {
@@ -381,9 +390,9 @@ class tslib_menu {
                                                                        $MP = $MP ? $MP : $mount_info['MPvar'];
                                                                } else {
                                                                        $MP = ($MP ? $MP.',' : '').$mount_info['MPvar'];
-                                                       }
+                                                               }
                                                                $id = $mount_info['mount_pid'];
-                                               }
+                                                       }
 
                                                                // Get sub-pages:
                                                        $res = $GLOBALS['TSFE']->cObj->exec_getQuery('pages',Array('pidInList'=>$id,'orderBy'=>$altSortField));
@@ -806,6 +815,12 @@ class tslib_menu {
                        } else {
                                $this->result=unserialize($serData);
                        }
+
+                               // End showAccessRestrictedPages
+                       if ($this->mconf['showAccessRestrictedPages'])  {
+                                       // RESTORING where_groupAccess
+                               $this->sys_page->where_groupAccess = $SAVED_where_groupAccess;
+                       }
                }
        }
 
@@ -852,7 +867,7 @@ class tslib_menu {
 
                                                                // Checking if a page should be shown in the menu depending on whether a translation exists:
                                                        $tok = TRUE;
-                                                       if ($GLOBALS['TSFE']->sys_language_uid && $data['l18n_cfg']&2)  {       // There is an alternative language active AND the current page requires a translation:
+                                                       if ($GLOBALS['TSFE']->sys_language_uid && t3lib_div::hideIfNotTranslated($data['l18n_cfg']))    {       // There is an alternative language active AND the current page requires a translation:
                                                                if (!$data['_PAGES_OVERLAY'])   {
                                                                        $tok = FALSE;
                                                                }
@@ -864,7 +879,7 @@ class tslib_menu {
                                                                        // Checking if "&L" should be modified so links to non-accessible pages will not happen.
                                                                if ($this->conf['protectLvar']) {
                                                                        $Lvar = intval(t3lib_div::_GP('L'));
-                                                                       if (($this->conf['protectLvar']=='all' || $data['l18n_cfg']&2) && $Lvar!=$GLOBALS['TSFE']->sys_language_uid)    {       // page cannot be access in locaization and Lvar is different than sys_language uid - this means we must check!
+                                                                       if (($this->conf['protectLvar']=='all' || t3lib_div::hideIfNotTranslated($data['l18n_cfg'])) && $Lvar!=$GLOBALS['TSFE']->sys_language_uid)      {       // page cannot be access in locaization and Lvar is different than sys_language uid - this means we must check!
                                                                                $olRec = $GLOBALS['TSFE']->sys_page->getPageOverlay($data['uid'], $Lvar);
                                                                                if (!count($olRec))     {
                                                                                                // If no pages_language_overlay record then page can NOT be accessed in the language pointed to by "&L" and therefore we protect the link by setting "&L=0"
@@ -1107,6 +1122,9 @@ class tslib_menu {
                        $LD = $this->tmpl->linkData($this->menuArr[$key],$mainTarget,'','',$overrideArray, $this->mconf['addParams'].$MP_params.$this->menuArr[$key]['_ADD_GETVARS'], $typeOverride);
                }
 
+                       // Manipulation in case of access restricted pages:
+               $this->changeLinksForAccessRestrictedPages($LD,$this->menuArr[$key],$mainTarget,$typeOverride);
+
                        // Overriding URL / Target if set to do so:
                if ($this->menuArr[$key]['_OVERRIDE_HREF'])     {
                        $LD['totalURL'] = $this->menuArr[$key]['_OVERRIDE_HREF'];
@@ -1133,6 +1151,28 @@ class tslib_menu {
        }
 
        /**
+        * Will change $LD (passed by reference) if the page is access restricted
+        *
+        * @param       array   $LD, the array from the linkData() function
+        * @param       array   Page array
+        * @param       string  Main target value
+        * @param       string  Type number override if any
+        * @return      void    ($LD passed by reference might be changed.)
+        */
+       function changeLinksForAccessRestrictedPages(&$LD, $page, $mainTarget, $typeOverride)   {
+
+                       // If access restricted pages should be shown in menus, change the link of such pages to link to a redirection page:
+               if ($this->mconf['showAccessRestrictedPages'] && $this->mconf['showAccessRestrictedPages']!=='NONE' && !$GLOBALS['TSFE']->checkPageGroupAccess($page))          {
+                       $thePage = $this->sys_page->getPage($this->mconf['showAccessRestrictedPages']);
+
+                       $addParams = $this->mconf['showAccessRestrictedPages.']['addParams'];
+                       $addParams = str_replace('###RETURN_URL###',rawurlencode($LD['totalURL']),$addParams);
+                       $addParams = str_replace('###PAGE_ID###',$page['uid'],$addParams);
+                       $LD = $this->tmpl->linkData($thePage,$mainTarget,'','','', $addParams, $typeOverride);
+               }
+       }
+
+       /**
         * Creates a submenu level to the current level - if configured for.
         *
         * @param       integer         Page id of the current page for which a submenu MAY be produced (if conditions are met)
@@ -2340,6 +2380,9 @@ class tslib_imgmenu extends tslib_menu {
 
                                                                        $LD = $this->tmpl->linkData($this->menuArr[$key],$this->mconf['target'],'','',array(),'',$this->mconf['forceTypeValue']);
 
+                                                                               // If access restricted pages should be shown in menus, change the link of such pages to link to a redirection page:
+                                                                       $this->changeLinksForAccessRestrictedPages($LD, $this->menuArr[$key], $this->mconf['target'], $this->mconf['forceTypeValue']);
+
                                                                                // Overriding URL / Target if set to do so:
                                                                        if ($this->menuArr[$key]['_OVERRIDE_HREF'])     {
                                                                                $LD['totalURL'] = $this->menuArr[$key]['_OVERRIDE_HREF'];
@@ -2638,6 +2681,10 @@ class tslib_jsmenu extends tslib_menu {
                                        $target='';
                                        if ((!$addLines && !$levelConf['noLink']) || $levelConf['alwaysLink']) {
                                                $LD = $this->tmpl->linkData($data,$this->mconf['target'],'','',array(),$MP_params,$this->mconf['forceTypeValue']);
+
+                                                       // If access restricted pages should be shown in menus, change the link of such pages to link to a redirection page:
+                                               $this->changeLinksForAccessRestrictedPages($LD, $data, $this->mconf['target'], $this->mconf['forceTypeValue']);
+
                                                $url = rawurlencode($LD['totalURL']);
                                                $target = rawurlencode($LD['target']);
                                        }
index 510ccb9..5ccbf12 100755 (executable)
@@ -151,8 +151,10 @@ class tslib_pibase {
        );
 
        var $LOCAL_LANG = Array();      // Local Language content
+       var $LOCAL_LANG_charset = Array();      // Local Language content charset for individual labels (overriding)
        var $LOCAL_LANG_loaded = 0;     // Flag that tells if the locallang file has been fetch (or tried to be fetched) already.
        var $LLkey='default';           // Pointer to the language to use.
+       var $altLLkey='';                               // Pointer to alternative fall-back language to use.
        var $LLtestPrefix='';           // You can set this during development to some value that makes it easy for you to spot all labels that ARe delivered by the getLL function.
        var $LLtestPrefixAlt='';        // Save as LLtestPrefix, but additional prefix for the alternative value in getLL() function calls
 
@@ -214,6 +216,9 @@ class tslib_pibase {
                }
                if ($GLOBALS['TSFE']->config['config']['language'])     {
                        $this->LLkey = $GLOBALS['TSFE']->config['config']['language'];
+                       if ($GLOBALS['TSFE']->config['config']['language_alt']) {
+                               $this->altLLkey = $GLOBALS['TSFE']->config['config']['language_alt'];
+                       }
                }
        }
 
@@ -821,7 +826,9 @@ class tslib_pibase {
         */
        function pi_getLL($key,$alt='',$hsc=FALSE)      {
                if (isset($this->LOCAL_LANG[$this->LLkey][$key]))       {
-                       $word = $GLOBALS['TSFE']->csConv($this->LOCAL_LANG[$this->LLkey][$key]);
+                       $word = $GLOBALS['TSFE']->csConv($this->LOCAL_LANG[$this->LLkey][$key], $this->LOCAL_LANG_charset[$this->LLkey][$key]); // The "from" charset is normally empty and thus it will convert from the charset of the system language, but if it is set (see ->pi_loadLL()) it will be used.
+               } elseif ($this->altLLkey && isset($this->LOCAL_LANG[$this->altLLkey][$key]))   {
+                       $word = $GLOBALS['TSFE']->csConv($this->LOCAL_LANG[$this->altLLkey][$key], $this->LOCAL_LANG_charset[$this->altLLkey][$key]);   // The "from" charset is normally empty and thus it will convert from the charset of the system language, but if it is set (see ->pi_loadLL()) it will be used.
                } elseif (isset($this->LOCAL_LANG['default'][$key]))    {
                        $word = $this->LOCAL_LANG['default'][$key];     // No charset conversion because default is english and thereby ASCII
                } else {
@@ -842,16 +849,29 @@ class tslib_pibase {
         */
        function pi_loadLL()    {
                if (!$this->LOCAL_LANG_loaded && $this->scriptRelPath)  {
-                       $basePath = t3lib_extMgm::siteRelPath($this->extKey).dirname($this->scriptRelPath).'/locallang.php';
-                       if (@is_file($basePath))        {
-                               include('./'.$basePath);
-                               $this->LOCAL_LANG = $LOCAL_LANG;
-                               if (is_array($this->conf['_LOCAL_LANG.']))      {
-                                       reset($this->conf['_LOCAL_LANG.']);
-                                       while(list($k,$lA)=each($this->conf['_LOCAL_LANG.']))   {
-                                               if (is_array($lA))      {
-                                                       $k = substr($k,0,-1);
-                                                       $this->LOCAL_LANG[$k] = t3lib_div::array_merge_recursive_overrule(is_array($this->LOCAL_LANG[$k])?$this->LOCAL_LANG[$k]:array(), $lA);
+                       $basePath = t3lib_extMgm::extPath($this->extKey).dirname($this->scriptRelPath).'/locallang.php';
+
+                               // php or xml as source: In any case the charset will be that of the system language.
+                               // However, this function guarantees only return output for default language plus the specified language (which is different from how 3.7.0 dealt with it)
+                       $this->LOCAL_LANG = t3lib_div::readLLfile($basePath,$this->LLkey);
+                       if ($this->altLLkey)    {
+                               $tempLOCAL_LANG = t3lib_div::readLLfile($basePath,$this->altLLkey);
+                               $this->LOCAL_LANG = array_merge(is_array($this->LOCAL_LANG) ? $this->LOCAL_LANG : array(),$tempLOCAL_LANG);
+                       }
+
+                               // Overlaying labels from TypoScript (including fictitious language keys for non-system languages!):
+                       if (is_array($this->conf['_LOCAL_LANG.']))      {
+                               reset($this->conf['_LOCAL_LANG.']);
+                               while(list($k,$lA)=each($this->conf['_LOCAL_LANG.']))   {
+                                       if (is_array($lA))      {
+                                               $k = substr($k,0,-1);
+                                               foreach($lA as $llK => $llV)    {
+                                                       if (!is_array($llV))    {
+                                                               $this->LOCAL_LANG[$k][$llK] = $llV;
+                                                               if ($k != 'default')    {
+                                                                       $this->LOCAL_LANG_charset[$k][$llK] = $GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'];        // For labels coming from the TypoScript (database) the charset is assumed to be "forceCharset" and if that is not set, assumed to be that of the individual system languages (thus no conversion)
+                                                               }
+                                                       }
                                                }
                                        }
                                }
index a160c46..63f67e1 100644 (file)
@@ -199,7 +199,7 @@ class tx_cms_webinfo_lang extends t3lib_extobjbase {
 
                        $info.= '&nbsp;';
                        $info.= $data['row']['l18n_cfg']&1 ? '<span title="'.$LANG->sL('LLL:EXT:cms/locallang_tca.php:pages.l18n_cfg.I.1','1').'">D</span>' : '&nbsp;';
-                       $info.= $data['row']['l18n_cfg']&2 ? '<span title="'.$LANG->sL('LLL:EXT:cms/locallang_tca.php:pages.l18n_cfg.I.2','1').'">N</span>' : '&nbsp;';
+                       $info.= t3lib_div::hideIfNotTranslated($data['row']['l18n_cfg']) ? '<span title="'.$LANG->sL('LLL:EXT:cms/locallang_tca.php:pages.l18n_cfg.I.2','1').'">N</span>' : '&nbsp;';
 
                                // Put into cell:
                        $tCells[] = '<td class="'.$status.' c-leftLine">'.$info.'</td>';
@@ -212,7 +212,7 @@ class tx_cms_webinfo_lang extends t3lib_extobjbase {
 
                                if (is_array($row))     {
                                        $langRecUids[$langRow['uid']][] = $row['uid'];
-                                       $status = $row['_HIDDEN'] ? ($data['row']['l18n_cfg']&2 || $data['row']['l18n_cfg']&1 ? 'c-blocked' : 'c-fallback') : 'c-ok';
+                                       $status = $row['_HIDDEN'] ? (t3lib_div::hideIfNotTranslated($data['row']['l18n_cfg']) || $data['row']['l18n_cfg']&1 ? 'c-blocked' : 'c-fallback') : 'c-ok';
                                        $icon = t3lib_iconWorks::getIconImage(
                                                'pages_language_overlay',
                                                $row,
@@ -242,7 +242,7 @@ class tx_cms_webinfo_lang extends t3lib_extobjbase {
                                        $tCells[] = '<td class="'.$status.'">'.$info.'</td>';
                                        $tCells[] = '<td class="'.$status.'" title="'.$LANG->getLL('lang_renderl10n_CEcount','1').'" align="center">'.$this->getContentElementCount($data['row']['uid'],$langRow['uid']).'</td>';
                                } else {
-                                       $status = $data['row']['l18n_cfg']&2 || $data['row']['l18n_cfg']&1 ? 'c-blocked' : 'c-fallback';
+                                       $status = t3lib_div::hideIfNotTranslated($data['row']['l18n_cfg']) || $data['row']['l18n_cfg']&1 ? 'c-blocked' : 'c-fallback';
                                        $tCells[] = '<td class="'.$status.' c-leftLine">&nbsp;</td>';
                                        $tCells[] = '<td class="'.$status.'">&nbsp;</td>';
 
index 4d51d29..bc9db36 100755 (executable)
@@ -252,7 +252,7 @@ class tx_indexedsearch_indexer {
 
                                                        // Content of page:
                                                $this->conf['content'] = $pObj->content;                                        // Content string (HTML of TYPO3 page)
-                                               $this->conf['indexedDocTitle'] = $pObj->indexedDocTitle;        // Alternative title for indexing
+                                               $this->conf['indexedDocTitle'] = $pObj->convOutputCharset($pObj->indexedDocTitle);      // Alternative title for indexing
                                                $this->conf['metaCharset'] = $pObj->metaCharset;                        // Character set of content (will be converted to utf-8 during indexing)
                                                $this->conf['mtime'] = $pObj->register['SYS_LASTCHANGED'];      // Most recent modification time (seconds) of the content on the page. Used to evaluate whether it should be re-indexed.
 
@@ -1099,7 +1099,7 @@ class tx_indexedsearch_indexer {
                                        $contentArr[$key] = $this->csObj->utf8_encode($contentArr[$key], $charset);
                                }
 
-                                       // decode all numeric / html-entitiesin in the string to real characters:
+                                       // decode all numeric / html-entities in the string to real characters:
                                $contentArr[$key] = $this->csObj->entities_to_utf8($contentArr[$key],TRUE);
                        }
                }
index f828a03..c8f6efd 100755 (executable)
@@ -10,7 +10,7 @@ define('TYPO3_cliMode', TRUE);
 
        // Defining PATH_thisScript here: Must be the ABSOLUTE path of this script in the right context:
        // This will work as long as the script is called by it's absolute path!
-define(PATH_thisScript,$HTTP_ENV_VARS['_']);
+define('PATH_thisScript',$_ENV['_']?$_ENV['_']:$_SERVER['_']);
 
        // Include configuration file:
 require(dirname(PATH_thisScript).'/conf.php');
index edc3a89..46086ea 100755 (executable)
@@ -13,16 +13,16 @@ CREATE TABLE index_phash (
   phash_grouping int(11) DEFAULT '0' NOT NULL,
   cHashParams tinyblob NOT NULL,
   data_filename tinytext NOT NULL,
-  data_page_id int(11) DEFAULT '0' NOT NULL,
-  data_page_reg1 int(11) DEFAULT '0' NOT NULL,
-  data_page_type tinyint(3) DEFAULT '0' NOT NULL,
+  data_page_id int(11) unsigned DEFAULT '0' NOT NULL,
+  data_page_reg1 int(11) unsigned DEFAULT '0' NOT NULL,
+  data_page_type tinyint(3) unsigned DEFAULT '0' NOT NULL,
   data_page_mp tinytext NOT NULL,
   gr_list tinytext NOT NULL,
   item_type varchar(5) DEFAULT '' NOT NULL,
   item_title tinytext NOT NULL,
   item_description tinytext NOT NULL,
   item_mtime int(11) DEFAULT '0' NOT NULL,
-  tstamp int(11) DEFAULT '0' NOT NULL,
+  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
   item_size int(11) DEFAULT '0' NOT NULL,
   contentHash int(11) DEFAULT '0' NOT NULL,
   crdate int(11) DEFAULT '0' NOT NULL,
@@ -51,10 +51,10 @@ CREATE TABLE index_fulltext (
 CREATE TABLE index_rel (
   phash int(11) DEFAULT '0' NOT NULL,
   wid int(11) DEFAULT '0' NOT NULL,
-  count smallint(5) DEFAULT '0' NOT NULL,
-  first smallint(5) DEFAULT '0' NOT NULL,
-  freq smallint(5) DEFAULT '0' NOT NULL,
-  flags smallint(5) DEFAULT '0' NOT NULL,
+  count tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  first tinyint(3) unsigned DEFAULT '0' NOT NULL,
+  freq smallint(5) unsigned DEFAULT '0' NOT NULL,
+  flags tinyint(3) unsigned DEFAULT '0' NOT NULL,
   PRIMARY KEY (phash,wid),
   KEY wid (wid,phash)
 );
@@ -78,9 +78,9 @@ CREATE TABLE index_words (
 CREATE TABLE index_section (
   phash int(11) DEFAULT '0' NOT NULL,
   phash_t3 int(11) DEFAULT '0' NOT NULL,
-  rl0 int(11) DEFAULT '0' NOT NULL,
-  rl1 int(11) DEFAULT '0' NOT NULL,
-  rl2 int(11) DEFAULT '0' NOT NULL,
+  rl0 int(11) unsigned DEFAULT '0' NOT NULL,
+  rl1 int(11) unsigned DEFAULT '0' NOT NULL,
+  rl2 int(11) unsigned DEFAULT '0' NOT NULL,
   page_id int(11) DEFAULT '0' NOT NULL,
   uniqid int(11) DEFAULT '0' NOT NULL auto_increment,
   PRIMARY KEY (uniqid),
@@ -113,7 +113,7 @@ CREATE TABLE index_stat_search (
   searchstring tinytext NOT NULL,
   searchoptions blob NOT NULL,
   tstamp int(11) DEFAULT '0' NOT NULL,
-  feuser_id int(11) DEFAULT '0' NOT NULL,
+  feuser_id int(11) unsigned DEFAULT '0' NOT NULL,
   cookie varchar(10) DEFAULT '' NOT NULL,
   IP tinytext NOT NULL,
   hits int(11) DEFAULT '0' NOT NULL,
@@ -148,21 +148,21 @@ CREATE TABLE index_debug (
 CREATE TABLE index_config (
     uid int(11) DEFAULT '0' NOT NULL auto_increment,
     pid int(11) DEFAULT '0' NOT NULL,
-    tstamp int(11) DEFAULT '0' NOT NULL,
-    crdate int(11) DEFAULT '0' NOT NULL,
-    cruser_id int(11) DEFAULT '0' NOT NULL,
-    hidden tinyint(4) DEFAULT '0' NOT NULL,
-    starttime int(11) DEFAULT '0' NOT NULL,
+    tstamp int(11) unsigned DEFAULT '0' NOT NULL,
+    crdate int(11) unsigned DEFAULT '0' NOT NULL,
+    cruser_id int(11) unsigned DEFAULT '0' NOT NULL,
+    hidden tinyint(4) unsigned DEFAULT '0' NOT NULL,
+    starttime int(11) unsigned DEFAULT '0' NOT NULL,
     title tinytext NOT NULL,
     description text NOT NULL,
-    type int(11) DEFAULT '0' NOT NULL,
-    depth int(11) DEFAULT '0' NOT NULL,
+    type int(11) unsigned DEFAULT '0' NOT NULL,
+    depth int(11) unsigned DEFAULT '0' NOT NULL,
     table2index tinytext NOT NULL,
     alternative_source_pid blob NOT NULL,
     get_params tinytext NOT NULL,
     fieldlist tinytext NOT NULL,
        externalUrl tinytext NOT NULL,
-    chashcalc tinyint(3) DEFAULT '0' NOT NULL,
+    chashcalc tinyint(3) unsigned DEFAULT '0' NOT NULL,
     filepath tinytext NOT NULL,
     extensions tinytext NOT NULL,
 
@@ -170,6 +170,7 @@ CREATE TABLE index_config (
     KEY parent (pid)
 );
 
+
 #
 # Table structure for table 'index_stat_word'
 #
@@ -181,4 +182,4 @@ CREATE TABLE index_stat_word (
   pageid int(11) DEFAULT '0' NOT NULL,
   PRIMARY KEY (uid),
   KEY tstamp (tstamp,word)
-);
+);
\ No newline at end of file
diff --git a/typo3/sysext/indexed_search/pi/locallang.php b/typo3/sysext/indexed_search/pi/locallang.php
deleted file mode 100755 (executable)
index 54c4bee..0000000
+++ /dev/null
@@ -1,1617 +0,0 @@
-<?php
-/**
- * Language labels for plugin "tx_indexedsearch_pi1"
- *
- * This file is detected by the translation tool.
- */
-
-$LOCAL_LANG = Array (
-       'default' => Array (
-               'submit_button_label' => 'Search',
-               'opt_type_0' => 'Distinct word',
-               'opt_type_1' => 'Part of word',
-               'opt_type_2' => 'First part of word',
-               'opt_type_3' => 'Last part of word',
-               'opt_type_10' => 'Sounds like',
-               'opt_type_20' => 'Sentence',
-               'opt_defOp_0' => 'All words (AND)',
-               'opt_defOp_1' => 'Any words (OR)',
-               'opt_sections_0' => 'Whole site',
-               'opt_sections_-1' => 'Only this page',
-               'opt_sections_-2' => 'Top + level 1',
-               'opt_sections_-3' => 'Level 2 and out',
-               'opt_media_-1' => 'All media',
-               'opt_media_0' => 'Internal pages',
-               'opt_media_-2' => 'All External',
-               'opt_order_rank_flag' => 'Weight/Frequency',
-               'opt_order_rank_freq' => 'Frequency',
-               'opt_order_rank_first' => 'Close to top',
-               'opt_order_rank_count' => 'Number of words',
-               'opt_order_mtime' => 'Date Modified',
-               'opt_order_title' => 'Document title',
-               'opt_order_crdate' => 'Creation date',
-               'opt_group_sections' => 'Section hierarchy',
-               'opt_group_flat' => 'Flat list',
-               'opt_lang_-1' => 'All languages',
-               'opt_lang_0' => 'Default',
-               'opt_desc_0' => 'Highest first',
-               'opt_desc_1' => 'Lowest first',
-               'opt_RL1' => 'Level 1:',
-               'opt_RL1ALL' => 'All pages on level 1',
-               'opt_RL2' => '- Level 2:',
-               'opt_RL2ALL' => '- All pages on level 2',
-               'form_searchFor' => 'Search for:',
-               'form_extResume' => 'Extended resume',
-               'form_atATime' => 'at a time',
-               'form_orderBy' => 'Order by:',
-               'form_fromSection' => 'From section:',
-               'form_searchIn' => 'Search in:',
-               'form_match' => 'Match:',
-               'form_style' => 'Style:',
-               'rules_header' => 'Rules:',
-               'rules_text' => '
-                       Only words with 2 or more characters are accepted
-                       Max 200 chars total
-                       Space is used to split words, "" can be used to search for a whole string (not indexed search then)
-                       AND, OR and NOT are prefix words, overruling the default operator
-                       +/|/- equals AND, OR and NOT as operators.
-                       All search words are converted to lowercase.
-               ',
-               'searchFor' => 'Search for',
-               'searchFor_or' => 'or',
-               'searchFor_and' => 'and',
-               'searchFor_butNot' => 'but not',
-               'noResults' => 'NO results found.',
-               'inSection' => 'in the section',
-               'inNsection' => 'i %s section:',
-               'inNsections' => 'in %s sections:',
-               'word_page' => 'page',
-               'word_pages' => 'pages',
-               'unnamedSection' => 'Other',
-               'link_regularSearch' => 'Regular search',
-               'link_advancedSearch' => 'Advanced search',
-               'res_path' => 'Path:',
-               'res_modified' => 'Modified:',
-               'res_created' => 'Created:',
-               'res_size' => 'Size:',
-               'res_noResume' => 'Note: This search hit may not accurately match the content on this page. The page resume cannot be shown.',
-               'res_otherMatching' => 'Other matching pages in the same document:',
-               'res_otherPageAsWell' => 'INFO: There was another page indexed as well... Probably indexed with another or no usergroup.',
-               'res_memberGroups' => 'Require membership of group numbers %s',
-               'pi_list_browseresults_prev' => '< Previous',
-               'pi_list_browseresults_page' => 'Page',
-               'pi_list_browseresults_next' => 'Next >',
-               'pi_list_browseresults_displays' => 'Displaying results ###SPAN_BEGIN###%s to %s</span> out of ###SPAN_BEGIN###%s</span>',
-               'local_operator_AND' => 'AND',
-               'local_operator_OR' => 'OR',
-               'local_operator_NOT' => 'NOT',
-               'makerating_addToCurrentSearch' => 'Add to current search words',
-               'maketitle_matches' => 'matches',
-       ),
-       'dk' => Array (
-               'submit_button_label' => 'Søg',
-               'opt_type_0' => 'Hele ordet',
-               'opt_type_1' => 'Del af ord',
-               'opt_type_2' => 'Første del af ordet',
-               'opt_type_3' => 'Sidste del af ordet',
-               'opt_type_10' => 'Lyder som',
-               'opt_type_20' => 'Sætning',
-               'opt_defOp_0' => 'Alle ord (OG)',
-               'opt_defOp_1' => 'Et af ordene (ELLER)',
-               'opt_sections_0' => 'Hele sitet',
-               'opt_sections_-1' => 'Kun denne side',
-               'opt_sections_-2' => 'Forside + niveau 1',
-               'opt_sections_-3' => 'Niveau 2 og ud',
-               'opt_media_-1' => 'Alle medietyper',
-               'opt_media_0' => 'Interne sider',
-               'opt_media_-2' => 'Alle externe medietyper',
-               'opt_media_1' => 'HTML',
-               'opt_media_2' => 'PDF',
-               'opt_media_3' => 'MS Word',
-               'opt_order_rank_flag' => 'Vægt/Hyppighed',
-               'opt_order_rank_freq' => 'Hyppighed',
-               'opt_order_rank_first' => 'Tæt på toppen',
-               'opt_order_rank_count' => 'Antal ord',
-               'opt_order_mtime' => 'Ændringsdato',
-               'opt_order_title' => 'Dokumenttitel',
-               'opt_order_crdate' => 'Oprettelsesdato',
-               'opt_group_sections' => 'Sektionshierarki',
-               'opt_group_flat' => 'Flad liste',
-               'opt_lang_-1' => 'Alle sprog',
-               'opt_lang_0' => 'Standard',
-               'opt_desc_0' => 'Højeste først',
-               'opt_desc_1' => 'Laveste først',
-               'opt_RL1' => 'Niveau 1:',
-               'opt_RL1ALL' => 'Alle sider på niveau 1',
-               'opt_RL2' => '- Niveau 2:',
-               'opt_RL2ALL' => '- Alle sider på niveau 2',
-               'form_searchFor' => 'Søg efter:',
-               'form_extResume' => 'Udvidet resumé',
-               'form_atATime' => 'på en gang',
-               'form_orderBy' => 'Sortér efter:',
-               'form_fromSection' => 'Fra sektion:',
-               'form_searchIn' => 'Søg i:',
-               'form_match' => 'Sammenlign:',
-               'form_style' => 'Visning:',
-               'rules_header' => 'Regler:',
-               'rules_text' => 'Kun ord med 2 eller flere bogstaver accepteres
-Maksimalt 200 tegn
-Mellemrum bruges til at adskille ord, "" kan bruges til at søge efter hel sætning (ikke indekseret søgning)
-OG, ELLER og IKKE er kommando-ord som overskriver standard søgetypen
-+/|/- svarer til OG, ELLER og IKKE kommandoerne
-Alle søgeord bliver konverteret til små bogstaver',
-               'searchFor' => 'Søger efter',
-               'searchFor_or' => 'eller',
-               'searchFor_and' => 'og',
-               'searchFor_butNot' => 'men ikke',
-               'noResults' => 'Ingen sider fundet.',
-               'inSection' => 'i sektionen',
-               'inNsection' => 'i %s sektion:',
-               'inNsections' => 'i %s sektioner:',
-               'word_page' => 'side',
-               'word_pages' => 'sider',
-               'unnamedSection' => 'Andre',
-               'link_regularSearch' => 'Almindelig søgning',
-               'link_advancedSearch' => 'Avanceret søgning',
-               'res_path' => 'Sti:',
-               'res_modified' => 'Ændret:',
-               'res_created' => 'Oprettet:',
-               'res_size' => 'Størrelse:',
-               'res_noResume' => 'Bemærk: Dette søgeresultat passer måske ikke præcist med sidens indhold. Sidens resume kan derfor ikke vises.',
-               'res_otherMatching' => 'Andre sider med resultat i samme dokument:',
-               'res_otherPageAsWell' => 'INFO: Der var også en anden indekseret side... Muligvis indekseret med en anden eller ingen brugergruppe.',
-               'res_memberGroups' => 'Kræver medlemskab af gruppenumre %s',
-               'pi_list_browseresults_prev' => '< Forrige',
-               'pi_list_browseresults_page' => 'Side',
-               'pi_list_browseresults_next' => 'Næste >',
-               'pi_list_browseresults_displays' => 'Viser resultaterne ###SPAN_BEGIN###%s til %s</span> ud af ###SPAN_BEGIN###%s</span>',
-               'local_operator_AND' => 'OG',
-               'local_operator_OR' => 'ELLER',
-               'local_operator_NOT' => 'IKKE',
-       ),
-       'de' => Array (
-               'submit_button_label' => 'Suche',
-               'opt_type_0' => 'Ganzes Wort',
-               'opt_type_1' => 'Wortteil',
-               'opt_type_2' => 'Wortanfang',
-               'opt_type_3' => 'Wortende',
-               'opt_type_10' => 'Aussprache',
-               'opt_type_20' => 'Ganzer Satz',
-               'opt_defOp_0' => 'Alle Wörter (UND)',
-               'opt_defOp_1' => 'Jedes Wort (ODER)',
-               'opt_sections_0' => 'Ganze Website',
-               'opt_sections_-1' => 'Nur diese Seite',
-               'opt_sections_-2' => 'Homepage + Ebene 1',
-               'opt_sections_-3' => 'Ebene 2 und tiefer',
-               'opt_media_-1' => 'Alle Medien',
-               'opt_media_0' => 'Interne Seiten',
-               'opt_media_-2' => 'Alle externen Seiten',
-               'opt_media_1' => 'HTML',
-               'opt_media_2' => 'PDF',
-               'opt_media_3' => 'MS Word',
-               'opt_order_rank_flag' => 'Trefferquote/Vorkommen',
-               'opt_order_rank_freq' => 'Vorkommen',
-               'opt_order_rank_first' => 'Nähe zum Dokumentanfang',
-               'opt_order_rank_count' => 'Anzahl der Worte',
-               'opt_order_mtime' => 'Letzte Änderung',
-               'opt_order_title' => 'Dokumententitel',
-               'opt_order_crdate' => 'Erstelldatum',
-               'opt_group_sections' => 'Sektionshierarchie',
-               'opt_group_flat' => 'Flache Liste',
-               'opt_lang_-1' => 'Alle Sprachen',
-               'opt_lang_0' => 'Standard',
-               'opt_desc_0' => 'Höchste zuerst',
-               'opt_desc_1' => 'geringste zuerst',
-               'opt_RL1' => 'Ebene 1:',
-               'opt_RL1ALL' => 'Alle Seiten auf Ebene 1',
-               'opt_RL2' => '- Ebene 2:',
-               'opt_RL2ALL' => '- alle Seiten auf Ebene 2',
-               'form_searchFor' => 'Suchen nach:',
-               'form_extResume' => 'Erweiterte Vorschau',
-               'form_atATime' => 'pro Seite',
-               'form_orderBy' => 'Sortieren nach:',
-               'form_fromSection' => 'Aus dem Bereich:',
-               'form_searchIn' => 'Suche in:',
-               'form_match' => 'Vergleich:',
-               'form_style' => 'Ansicht:',
-               'rules_header' => 'Regeln:',
-               'rules_text' => 'Nur Wörter mit 2 oder mehr Zeichen werden akzeptiert.
-Maximal 200 Zeichen insgesamt.
-Leerzeichen werden zur Trennung von Worten verwendet, "" kann für die Suche nach ganzen Zeichenfolgen benutzt werden (keine Indexsuche).
-UND, ODER und NICHT sind Suchoperatoren, die den standardmäßigen Operator überschreiben.
-+/|/- entspricht UND, ODER und NICHT als Operatoren.
-Alle Suchwörter werden zu Kleinschreibung konvertiert.',
-               'searchFor' => 'Suche nach',
-               'searchFor_or' => 'oder',
-               'searchFor_and' => 'und',
-               'searchFor_butNot' => 'aber nicht',
-               'noResults' => 'KEINE Ergebnisse gefunden.',
-               'inSection' => 'im Bereich',
-               'inNsection' => 'in %s Bereich:',
-               'inNsections' => 'in %s Bereichen:',
-               'word_page' => 'Seite',
-               'word_pages' => 'Seiten',
-               'unnamedSection' => 'Andere',
-               'link_regularSearch' => 'Reguläre Suche',
-               'link_advancedSearch' => 'Erweiterte Suche',
-               'res_path' => 'Pfad:',
-               'res_modified' => 'Geändert:',
-               'res_created' => 'Erstellt:',
-               'res_size' => 'Größe:',
-               'res_noResume' => 'Hinweis: Der Inhalt dieser Seite entspricht nicht exakt der Suche. Die Seitenvorschau wird nicht angezeigt.',
-               'res_otherMatching' => 'Andere passenden Seiten im selben Dokument:',
-               'res_otherPageAsWell' => 'Information: Eine andere Seite wurde auch indiziert... Diese wurde vermutlich mit einer anderen oder keiner Benutzergruppe indiziert.',
-               'res_memberGroups' => 'Benötigt Mitgliedschaft der Gruppe Nummer %s',
-               'pi_list_browseresults_prev' => '< Zurück',
-               'pi_list_browseresults_page' => 'Seite',
-               'pi_list_browseresults_next' => 'Nächste >',
-               'pi_list_browseresults_displays' => 'Zeige Ergebnisse ###SPAN_BEGIN###%s bis %s</span> von insgesamt ###SPAN_BEGIN###%s</span>',
-               'local_operator_AND' => 'UND',
-               'local_operator_OR' => 'ODER',
-               'local_operator_NOT' => 'NICHT',
-       ),
-       'no' => Array (
-               'submit_button_label' => 'Søk',
-               'opt_type_0' => 'Hele ordet',
-               'opt_type_1' => 'Del av ord',
-               'opt_type_2' => 'Første del av ordet',
-               'opt_type_3' => 'Siste del av ordet',
-               'opt_type_10' => 'Lyder som',
-               'opt_type_20' => 'Setning',
-               'opt_defOp_0' => 'Alle ord (OG)',
-               'opt_defOp_1' => 'Ett av ordene (ELLER)',
-               'opt_sections_0' => 'Hele nettstedet',
-               'opt_sections_-1' => 'Bare denne siden',
-               'opt_sections_-2' => 'Forside + undernivå 1',
-               'opt_sections_-3' => 'Nivå 2 og utover',
-               'opt_media_-1' => 'Alle medietyper',
-               'opt_media_0' => 'Interne sider',
-               'opt_media_-2' => 'Alle eksterne medietyper',
-               'opt_media_1' => 'HTML',
-               'opt_media_2' => 'PDF',
-               'opt_media_3' => 'MS Word',
-               'opt_order_rank_flag' => 'Vekt/Hyppighet',
-               'opt_order_rank_freq' => 'Hyppighet',
-               'opt_order_rank_first' => 'Nær toppen',
-               'opt_order_rank_count' => 'Antall ord',
-               'opt_order_mtime' => 'Endringsdato',
-               'opt_order_title' => 'Dokumenttittel',
-               'opt_order_crdate' => 'Opprettelsesdato',
-               'opt_group_sections' => 'Seksjonshierarki',
-               'opt_group_flat' => 'Flat liste',
-               'opt_lang_-1' => 'Alle språk',
-               'opt_lang_0' => 'Standard',
-               'opt_desc_0' => 'Høyeste først',
-               'opt_desc_1' => 'Laveste først',
-               'opt_RL1' => 'Nivå 1:',
-               'opt_RL1ALL' => 'Alle sider på nivå 1',
-               'opt_RL2' => '- Nivå 2',
-               'opt_RL2ALL' => 'Alle sider på nivå 2',
-               'form_searchFor' => 'Søk etter:',
-               'form_extResume' => 'Utvidet sammendrag',
-               'form_atATime' => 'på en gang',
-               'form_orderBy' => 'Sorter etter:',
-               'form_fromSection' => 'Fra seksjon',
-               'form_searchIn' => 'Søk i:',
-               'form_match' => 'Sammenlign:',
-               'form_style' => 'Visning:',
-               'rules_header' => 'Regler:',
-               'rules_text' => 'Kun ord med 2 eller flere bokstaver er tillatt
-Maksimalt 200 tegn
-Mellomrom brukes for adskille ord, \94\94 kan brukes for å søke etter en hel setning (ikke indeksert søk)
-OG, ELLER og IKKE er kommandoord som overskriver standard søketypen
-+/|/- tilsvarer OG, ELLER og IKKE kommandoene
- Alle søkeord blir konvertert til små bokstaver',
-               'searchFor' => 'Søk etter',
-               'searchFor_or' => 'eller',
-               'searchFor_and' => 'og',
-               'searchFor_butNot' => 'men ikke',
-               'noResults' => 'Ingen sider funnet',
-               'inSection' => 'i seksjonen',
-               'inNsection' => 'i %s seksjonen:',
-               'inNsections' => 'i %s seksjoner:',
-               'word_page' => 'side',
-               'word_pages' => 'sider',
-               'unnamedSection' => 'Andre',
-               'link_regularSearch' => 'Standard søking',
-               'link_advancedSearch' => 'Avansert søk',
-               'res_path' => 'Sti:',
-               'res_modified' => 'Redigert:',
-               'res_created' => 'Opprettet:',
-               'res_size' => 'Størrelse',
-               'res_noResume' => 'Merk: Dette søkeresultatet passer kanskje ikke helt med innholdet på siden. Sammendraget kan derfor ikke vises.',
-               'res_otherMatching' => 'Andre sider med treff fra samme dokumentet:',
-               'res_otherPageAsWell' => 'INFO: Det var også en annen side som ble indeksert.... Muligens indeksert med en annen eller ingen brukergruppe.',
-               'res_memberGroups' => 'Krever medlemskap av gruppenumre %s',
-               'pi_list_browseresults_prev' => '< Forrige',
-               'pi_list_browseresults_page' => 'Side',
-               'pi_list_browseresults_next' => 'Neste >',
-               'pi_list_browseresults_displays' => 'Viser resultatene ###SPAN_BEGIN###%s til %s</span> av ###SPAN_BEGIN###%s</span>',
-               'local_operator_AND' => 'OG',
-               'local_operator_OR' => 'ELLER',
-               'local_operator_NOT' => 'IKKE',
-       ),
-       'it' => Array (
-               'submit_button_label' => 'Cerca',
-               'opt_type_0' => 'Parole distinte',
-               'opt_type_1' => 'Parte della parola',
-               'opt_type_2' => 'Prima parte della parola',
-               'opt_type_3' => 'Ultima parte della parola',
-               'opt_type_10' => 'Suona come',
-               'opt_type_20' => 'Frase intera',
-               'opt_defOp_0' => 'Tutte le parole (AND)',
-               'opt_defOp_1' => 'Tutte le parole (OR)',
-               'opt_sections_0' => 'Intero sito',
-               'opt_sections_-1' => 'Solo questa pagina',
-               'opt_sections_-2' => 'Top + livello 1',
-               'opt_sections_-3' => 'Livello 2 e successivi',
-               'opt_media_-1' => 'Tutti i media',
-               'opt_media_0' => 'Pagine interne',
-               'opt_media_-2' => 'All External',
-               'opt_media_1' => 'HTML',
-               'opt_media_2' => 'PDF',
-               'opt_media_3' => 'MS WORD',
-               'opt_order_rank_flag' => 'Peso/Frequenza',
-               'opt_order_rank_freq' => 'Frequenza',
-               'opt_order_rank_first' => 'Vicine al massimo',
-               'opt_order_rank_count' => 'Numero di parole',
-               'opt_order_mtime' => 'Data di modifica',
-               'opt_order_title' => 'Titolo del documento',
-               'opt_order_crdate' => 'Data di creazione',
-               'opt_group_sections' => 'Raggruppa per sezione',
-               'opt_group_flat' => 'Nessun raggruppamento',
-               'opt_lang_-1' => 'Tutte le lingue',
-               'opt_lang_0' => 'Default',
-               'opt_desc_0' => 'Più importante prima',
-               'opt_desc_1' => 'Meno importante prima',
-               'opt_RL1' => 'Livello 1:',
-               'opt_RL1ALL' => 'Tutte le pagine al primo livello',
-               'opt_RL2' => '- Livello 2:',
-               'opt_RL2ALL' => '- Tutte le pagine al secondo livello',
-               'form_searchFor' => 'Cerca:',
-               'form_extResume' => 'Resoconto ricerca',
-               'form_atATime' => 'in una volta',
-               'form_orderBy' => 'Ordina per:',
-               'form_fromSection' => 'Dalla sezione:',
-               'form_searchIn' => 'Cerca in:',
-               'form_match' => 'Match:',
-               'form_style' => 'Stile:',
-               'rules_header' => 'Regole:',
-               'rules_text' => 'Sono accettate solo parole con due o più caratteri, per un massimo di 200 caratteri totali.
-Lo spazio è usato per separare le parole, "" può essere usato per cercare un\'intera stringa.
-AND, OR e NOT possono essere usati prefissi alle parole da cercare.
-+/|/- corrispondono agli operatori AND, OR e NOT.
-Tutte le parole sono convertite in caratteri minuscoli.',
-               'searchFor' => 'Cerca',
-               'searchFor_or' => 'o',
-               'searchFor_and' => 'e',
-               'searchFor_butNot' => 'ma non',
-               'noResults' => 'Nessun risultato',
-               'inSection' => 'nella sezione',
-               'inNsection' => 'in % sezione:',
-               'inNsections' => 'in %s sezioni:',
-               'word_page' => 'pagina',
-               'word_pages' => 'pagine',
-               'unnamedSection' => 'Altro',
-               'link_regularSearch' => 'Ricerca normale',
-               'link_advancedSearch' => 'Ricerca avanzata',
-               'res_path' => 'Percorso:',
-               'res_modified' => 'Modificato:',
-               'res_created' => 'Creato:',
-               'res_size' => 'Dimensione:',
-               'res_noResume' => 'Nota: questa ricerca potrebbe non corrispondere al contenuto di questa pagina. Non è possibile visualizzare il riassunto della pagina.',
-               'res_otherMatching' => 'Altre pagine che soddisfano i criteri di ricerca, nello stesso documento:',
-               'res_otherPageAsWell' => 'INFORMAZIONE: C\'era un\'altra pagina indicizzata... Probabilmente era stata indicizzata associata ad un altro gruppo di utenti (o a nessun gruppo).',
-               'res_memberGroups' => 'Richiede di appartenere al gruppo numero %s',
-               'pi_list_browseresults_prev' => '< Precedente',
-               'pi_list_browseresults_page' => 'Pagina',
-               'pi_list_browseresults_next' => 'Successiva >',
-               'pi_list_browseresults_displays' => 'Vengono visualizzati i risultati da ###SPAN_BEGIN###%s a %s</span> su ###SPAN_BEGIN###%s</span>',
-               'local_operator_AND' => 'AND',
-               'local_operator_OR' => 'OR',
-               'local_operator_NOT' => 'NOT',
-       ),
-       'fr' => Array (
-               'submit_button_label' => 'Chercher',
-               'opt_type_0' => 'Mot distinct',
-               'opt_type_1' => 'Portion d\'un mot',
-               'opt_type_2' => 'Première partie d\'un mot',
-               'opt_type_3' => 'Dernière partie d\'un mot',
-               'opt_type_10' => 'Prononciation semblable',
-               'opt_type_20' => 'Phrase',
-               'opt_defOp_0' => 'Tous les mots (ET)',
-               'opt_defOp_1' => 'N\'importe quel mot (OU)',
-               'opt_sections_0' => 'Tout le site',
-               'opt_sections_-1' => 'Seulement cette page',
-               'opt_sections_-2' => 'Accueil + 1e niveau',
-               'opt_media_-1' => 'Tous les médias',
-               'opt_media_0' => 'Pages internes',
-               'opt_media_-2' => 'Tout l\'externe',
-               'opt_media_1' => 'HTML',
-               'opt_media_2' => 'PDF',
-               'opt_media_3' => 'MS Word',
-               'opt_order_rank_flag' => 'Poids/Fréquence',
-               'opt_order_rank_freq' => 'Fréquence',
-               'opt_order_rank_count' => 'Nombre de mots',
-               'opt_order_mtime' => 'Date de modification',
-               'opt_order_title' => 'Titre du document',
-               'opt_order_crdate' => 'Date de création',
-               'opt_group_flat' => 'Liste plate',
-               'opt_lang_-1' => 'Tous les languages',
-               'opt_lang_0' => 'Défaut',
-               'opt_RL1' => '1e niveau:',
-               'opt_RL1ALL' => 'Toutes les pages du 1e niveau',
-               'opt_RL2' => '- 2e niveau:',
-               'opt_RL2ALL' => '- Toutes les pages du 2e niveau',
-               'form_searchFor' => 'Recherche pour:',
-               'form_orderBy' => 'Grouper par:',
-               'form_fromSection' => 'De la section:',
-               'form_searchIn' => 'Rechercher dans:',
-               'searchFor_or' => 'ou',
-               'searchFor_and' => 'et',
-               'searchFor_butNot' => 'mais pas',
-               'noResults' => 'AUCUN résultats.',
-               'inSection' => 'dans la section',
-               'inNsection' => 'dans %s section:',
-               'inNsections' => 'dans %s sections:',
-               'word_page' => 'page',
-               'word_pages' => 'pages',
-               'unnamedSection' => 'Autre',
-               'link_regularSearch' => 'Recherche standart',
-               'link_advancedSearch' => 'Recherche avancée',
-               'res_path' => 'Chemin:',
-               'res_size' => 'Taille:',
-               'pi_list_browseresults_prev' => '< Précédent',
-               'pi_list_browseresults_page' => 'Page',
-               'pi_list_browseresults_next' => 'Suivant >',
-               'local_operator_AND' => 'ET',
-               'local_operator_OR' => 'OU',
-               'local_operator_NOT' => 'PAS',
-       ),
-       'es' => Array (
-               'submit_button_label' => 'Buscar',
-               'opt_type_0' => 'Toda la palabra',
-               'opt_type_1' => 'Parte de la palabra',
-               'opt_type_2' => 'Principio de la palabra',
-               'opt_type_3' => 'Final de la palabra',
-               'opt_type_10' => 'Suena como...',
-               'opt_type_20' => 'Frase',
-               'opt_defOp_0' => 'Todas las palabras (AND)',
-               'opt_defOp_1' => 'Cualquier palabra (OR)',
-               'opt_sections_0' => 'Todo el sitio web',
-               'opt_sections_-1' => 'Sólo esta página',
-               'opt_sections_-2' => 'Inicio + nivel 1',
-               'opt_sections_-3' => 'Nivel 2 y demás',
-               'opt_media_-1' => 'Todos los tipos de contenido',
-               'opt_media_0' => 'Páginas internas',
-               'opt_media_-2' => 'Todas las páginas externas',
-               'opt_media_1' => 'HTML',
-               'opt_media_2' => 'PDF',
-               'opt_media_3' => 'MS Word',
-               'opt_order_rank_flag' => 'Peso/Frecuencia',
-               'opt_order_rank_freq' => 'Frecuencia',
-               'opt_order_rank_first' => 'Cercano al principio de la página',
-               'opt_order_rank_count' => 'Número de palabras',
-               'opt_order_mtime' => 'Fecha de modificación',
-               'opt_order_title' => 'Título del documento',
-               'opt_order_crdate' => 'Fecha de creación',
-               'opt_group_sections' => 'Agrupado por secciones',
-               'opt_group_flat' => 'Sin agrupar',
-               'opt_lang_-1' => 'Todos los idiomas',
-               'opt_lang_0' => 'Por defecto',
-               'opt_desc_0' => 'Ascendente',
-               'opt_desc_1' => 'Descendente',
-               'opt_RL1' => 'Nivel 1:',
-               'opt_RL1ALL' => 'Todas las páginas de nivel 1',
-               'opt_RL2' => '- Nivel 2:',
-               'opt_RL2ALL' => '-