Implement #015359: access.php - new MatchOrder=host_uri
[tinyz:tinyz.git] / index.php
1 <?php
2 //
3 // ## BEGIN COPYRIGHT, LICENSE AND WARRANTY NOTICE ##
4 // SOFTWARE NAME: eZ Publish
5 // SOFTWARE RELEASE: 4.1.x
6 // COPYRIGHT NOTICE: Copyright (C) 1999-2010 eZ Systems AS
7 // SOFTWARE LICENSE: GNU General Public License v2.0
8 // NOTICE: >
9 //   This program is free software; you can redistribute it and/or
10 //   modify it under the terms of version 2.0  of the GNU General
11 //   Public License as published by the Free Software Foundation.
12 //
13 //   This program is distributed in the hope that it will be useful,
14 //   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 //   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 //   GNU General Public License for more details.
17 //
18 //   You should have received a copy of version 2.0 of the GNU General
19 //   Public License along with this program; if not, write to the Free
20 //   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
21 //   MA 02110-1301, USA.
22 //
23 //
24 // ## END COPYRIGHT, LICENSE AND WARRANTY NOTICE ##
25 //
26
27 /**
28  * PHP 5.1 is our hard requirement, but PHP 5.2 or higher is highly recommended
29  */
30 if ( version_compare( PHP_VERSION, '5.1' ) < 0 )
31 {
32     print( "<h1>Unsupported PHP version " . PHP_VERSION . "</h1>" );
33     print( "<p>eZ Publish 4.x does not run with PHP version lower than 5.1.</p>".
34            "<p>For more information about supported software please visit ".
35            "<a href=\"http://ez.no/download/ez_publish\" >eZ Publish download page</a></p>" );
36     exit;
37 }
38
39 // Set a default time zone if none is given to avoid "It is not safe to rely
40 // on the system's timezone settings" warnings. The time zone can be overriden
41 // in config.php or php.ini.
42 if ( !ini_get( "date.timezone" ) )
43 {
44     date_default_timezone_set( "UTC" );
45 }
46
47 require 'autoload.php';
48
49 ignore_user_abort( true );
50
51 $scriptStartTime = microtime( true );
52 ob_start();
53
54 $use_external_css = true;
55 $show_page_layout = true;
56 $moduleRunRequired = true;
57 $policyCheckRequired = true;
58 $urlTranslatorAllowed = true;
59 $validityCheckRequired = false;
60 $userObjectRequired = true;
61 $sessionRequired = true;
62 $dbRequired = true;
63 $noCacheAdviced = false;
64
65 $siteDesignOverride = false;
66
67 // List of module names which will skip policy checking
68 $policyCheckOmitList = array();
69
70 // List of directories to search for modules
71 $moduleRepositories = array();
72
73 $siteBasics = array();
74 $siteBasics['external-css'] =& $use_external_css;
75 $siteBasics['show-page-layout'] =& $show_page_layout;
76 $siteBasics['module-run-required'] =& $moduleRunRequired;
77 $siteBasics['policy-check-required'] =& $policyCheckRequired;
78 $siteBasics['policy-check-omit-list'] =& $policyCheckOmitList;
79 $siteBasics['url-translator-allowed'] =& $urlTranslatorAllowed;
80 $siteBasics['validity-check-required'] =& $validityCheckRequired;
81 $siteBasics['user-object-required'] =& $userObjectRequired;
82 $siteBasics['session-required'] =& $sessionRequired;
83 $siteBasics['db-required'] =& $dbRequired;
84 $siteBasics['no-cache-adviced'] =& $noCacheAdviced;
85 $siteBasics['site-design-override'] =& $siteDesignOverride;
86
87 $siteBasics['module-repositories'] =& $moduleRepositories;
88
89 $GLOBALS['eZSiteBasics'] =& $siteBasics;
90
91 $GLOBALS['eZRedirection'] = false;
92
93 error_reporting ( E_ALL | E_STRICT );
94
95 $debugINI = eZINI::instance( 'debug.ini' );
96 eZDebugSetting::setDebugINI( $debugINI );
97
98
99 /*!
100  Reads settings from site.ini and passes them to eZDebug.
101 */
102 function eZUpdateDebugSettings()
103 {
104     $ini = eZINI::instance();
105
106     $settings = array();
107     list( $settings['debug-enabled'], $settings['debug-by-ip'], $settings['log-only'], $settings['debug-by-user'], $settings['debug-ip-list'], $logList, $settings['debug-user-list'] ) =
108         $ini->variableMulti( 'DebugSettings',
109                              array( 'DebugOutput', 'DebugByIP', 'DebugLogOnly', 'DebugByUser', 'DebugIPList', 'AlwaysLog', 'DebugUserIDList' ),
110                              array( 'enabled', 'enabled', 'disabled', 'enabled' ) );
111     $logMap = array( 'notice' => eZDebug::LEVEL_NOTICE,
112                      'warning' => eZDebug::LEVEL_WARNING,
113                      'error' => eZDebug::LEVEL_ERROR,
114                      'debug' => eZDebug::LEVEL_DEBUG,
115                      'strict' => eZDebug::LEVEL_STRICT );
116     $settings['always-log'] = array();
117     foreach ( $logMap as $name => $level )
118     {
119         $settings['always-log'][$level] = in_array( $name, $logList );
120     }
121     eZDebug::updateSettings( $settings );
122 }
123
124 /*!
125  Reads settings from i18n.ini and passes them to eZTextCodec.
126 */
127 function eZUpdateTextCodecSettings()
128 {
129     $ini = eZINI::instance( 'i18n.ini' );
130
131     list( $i18nSettings['internal-charset'], $i18nSettings['http-charset'], $i18nSettings['mbstring-extension'] ) =
132         $ini->variableMulti( 'CharacterSettings', array( 'Charset', 'HTTPCharset', 'MBStringExtension' ), array( false, false, 'enabled' ) );
133
134     eZTextCodec::updateSettings( $i18nSettings );
135 }
136
137 // Initialize text codec settings
138 eZUpdateTextCodecSettings();
139
140 // Initialize debug settings.
141 eZUpdateDebugSettings();
142
143
144 // Set the different permissions/settings.
145 $ini = eZINI::instance();
146
147 // Set correct site timezone
148 $timezone = $ini->variable( "TimeZoneSettings", "TimeZone");
149 if ( $timezone )
150 {
151     date_default_timezone_set( $timezone );
152 }
153
154
155 list( $iniFilePermission, $iniDirPermission ) =
156     $ini->variableMulti( 'FileSettings', array( 'StorageFilePermissions', 'StorageDirPermissions' ) );
157
158 $iniVarDirectory = eZSys::cacheDirectory() ;
159
160 // OPTIMIZATION:
161 // Sets permission array as global variable, this avoids the eZCodePage include
162 $GLOBALS['EZCODEPAGEPERMISSIONS'] = array( 'file_permission' => octdec( $iniFilePermission ),
163                                            'dir_permission'  => octdec( $iniDirPermission ),
164                                            'var_directory'   => $iniVarDirectory );
165
166 //
167 $warningList = array();
168
169 /*!
170  Appends a new warning item to the warning list.
171  \a $parameters must contain a \c error and \c text key.
172 */
173 function eZAppendWarningItem( $parameters = array() )
174 {
175     global $warningList;
176     $parameters = array_merge( array( 'error' => false,
177                                       'text' => false,
178                                       'identifier' => false ),
179                                $parameters );
180     $error = $parameters['error'];
181     $text = $parameters['text'];
182     $identifier = $parameters['identifier'];
183     $warningList[] = array( 'error' => $error,
184                             'text' => $text,
185                             'identifier' => $identifier );
186 }
187
188 function eZDBCleanup()
189 {
190     if ( class_exists( 'eZDB' )
191          and eZDB::hasInstance() )
192     {
193         $db = eZDB::instance();
194         $db->setIsSQLOutputEnabled( false );
195     }
196 //     session_write_close();
197 }
198
199 function eZFatalError()
200 {
201     header("HTTP/1.1 500 Internal Server Error");
202     print( "<b>Fatal error</b>: eZ Publish did not finish its request<br/>" );
203     if ( ini_get('display_errors') == 1 )
204     {
205         $ini = eZINI::instance();
206         if ( $ini->variable( 'DebugSettings', 'DebugOutput' ) === 'enabled' )
207             print( "<p>The execution of eZ Publish was abruptly ended, the debug output is present below.</p>" );
208         else
209             print( "<p>The execution of eZ Publish was abruptly ended, debug information can be found in the log files normally placed in var/log/*</p>" );
210     }
211     else
212     {
213         print( "<p>The execution of eZ Publish was abruptly ended. Contact website owner with current url and what you did, and owner will be able to debug the issue further.</p>" );
214     }
215     $templateResult = null;
216     eZDisplayResult( $templateResult );
217 }
218
219 eZExecution::addCleanupHandler( 'eZDBCleanup' );
220 eZExecution::addFatalErrorHandler( 'eZFatalError' );
221
222 eZDebug::setScriptStart( $scriptStartTime );
223
224 // Enable this line to get eZINI debug output
225 // eZINI::setIsDebugEnabled( true );
226 // Enable this line to turn off ini caching
227 // eZINI::setIsCacheEnabled( false);
228
229 function eZDisplayDebug()
230 {
231     $ini = eZINI::instance();
232
233     if ( $ini->variable( 'DebugSettings', 'DebugOutput' ) != 'enabled' )
234         return null;
235
236     $type = $ini->variable( "DebugSettings", "Debug" );
237     //eZDebug::setHandleType( eZDebug::HANDLE_NONE );
238     if ( $type == "inline" or $type == "popup" )
239     {
240         $as_html = true;
241
242         if ( $ini->variable( "DebugSettings", "DebugToolbar" ) == 'enabled' &&
243              $ini->variable( "SiteAccessSettings", "CheckValidity" ) !== 'true' &&
244              $as_html == true &&
245              !$GLOBALS['eZRedirection'] )
246
247         {
248             $tpl = eZTemplate::factory();
249             $result = "<tr><td>" . $tpl->fetch( 'design:setup/debug_toolbar.tpl' ) . "</td></tr>";
250             eZDebug::appendTopReport( "Debug toolbar", $result );
251         }
252
253         eZDebug::appendBottomReport( 'Template Usage Statistics', eZTemplatesStatisticsReporter::generateStatistics( $as_html ) );
254
255         return eZDebug::printReport( $type == "popup", $as_html, true );
256     }
257     return null;
258 }
259
260 /*!
261   \private
262 */
263 function eZDisplayResult( $templateResult )
264 {
265     if ( $templateResult !== null )
266     {
267         $classname = eZINI::instance()->variable( "OutputSettings", "OutputFilterName" );
268         if( !empty( $classname ) && class_exists( $classname ) )
269         {
270             $templateResult = call_user_func( array ( $classname, 'filter' ), $templateResult );
271         }
272         $debugMarker = '<!--DEBUG_REPORT-->';
273         $pos = strpos( $templateResult, $debugMarker );
274         if ( $pos !== false )
275         {
276             $debugMarkerLength = strlen( $debugMarker );
277             echo substr( $templateResult, 0, $pos );
278             eZDisplayDebug();
279             echo substr( $templateResult, $pos + $debugMarkerLength );
280         }
281         else
282         {
283             echo $templateResult, eZDisplayDebug();
284         }
285     }
286     else
287     {
288         eZDisplayDebug();
289     }
290 }
291
292 function fetchModule( $uri, $check, &$module, &$module_name, &$function_name, &$params )
293 {
294     $module_name = $uri->element();
295     if ( $check !== null and isset( $check["module"] ) )
296         $module_name = $check["module"];
297
298     // Try to fetch the module object
299     $module = eZModule::exists( $module_name );
300     if ( !( $module instanceof eZModule ) )
301     {
302         return false;
303     }
304
305     $uri->increase();
306     $function_name = "";
307     if ( !$module->singleFunction() )
308     {
309         $function_name = $uri->element();
310         $uri->increase();
311     }
312     // Override it if required
313     if ( $check !== null and isset( $check["function"] ) )
314         $function_name = $check["function"];
315
316     $params = $uri->elements( false );
317     return true;
318 }
319
320 $httpCharset = eZTextCodec::httpCharset();
321 if ( $ini->variable( 'RegionalSettings', 'Debug' ) == 'enabled' )
322     eZLocale::setIsDebugEnabled( true );
323
324
325 eZDebug::setHandleType( eZDebug::HANDLE_FROM_PHP );
326
327 $GLOBALS['eZGlobalRequestURI'] = eZSys::serverVariable( 'REQUEST_URI' );
328
329 // Initialize basic settings, such as vhless dirs and separators
330
331 eZSys::init( 'index.php', $ini->variable( 'SiteAccessSettings', 'ForceVirtualHost' ) == 'true' );
332
333 eZDebug::addTimingPoint( "Script start" );
334
335 $uri = eZURI::instance( eZSys::requestURI() );
336 $GLOBALS['eZRequestedURI'] = $uri;
337 require_once "pre_check.php";
338
339 // Check for extension
340 require_once( 'kernel/common/ezincludefunctions.php' );
341 eZExtension::activateExtensions( 'default' );
342 // Extension check end
343
344 include_once( 'access.php' );
345
346 $access = eZSiteAccess::match( $uri,
347                       eZSys::hostname(),
348                       eZSys::serverPort(),
349                       eZSys::indexFile() );
350 $access = eZSiteAccess::change( $access );
351 eZDebugSetting::writeDebug( 'kernel-siteaccess', $access, 'current siteaccess' );
352
353 // Check for activating Debug by user ID (Final checking. The first was in eZDebug::updateSettings())
354 eZDebug::checkDebugByUser();
355
356 // Check for siteaccess extension
357 eZExtension::activateExtensions( 'access' );
358 // Siteaccess extension check end
359
360 // Make sure template.ini reloads its cache incase
361 // siteaccess or extensions override it
362 $tplINI = eZINI::instance( 'template.ini' );
363 $tplINI->loadCache();
364
365 // Check if this should be run in a cronjob
366 // Need to be run before eZHTTPTool::instance() because of eZSessionStart() which
367 // is called from eZHandlePreChecks() below.
368 $useCronjob = $ini->variable( 'Session', 'BasketCleanup' ) == 'cronjob';
369 if ( !$useCronjob )
370 {
371     // Functions for session to make sure baskets are cleaned up
372     function eZSessionBasketDestroy( $db, $key, $escapedKey )
373     {
374         $basket = eZBasket::fetch( $key );
375         if ( is_object( $basket ) )
376             $basket->remove();
377     }
378
379     function eZSessionBasketGarbageCollector( $db, $time )
380     {
381         eZBasket::cleanupExpired( $time );
382     }
383
384     function eZSessionBasketEmpty( $db )
385     {
386         eZBasket::cleanup();
387     }
388
389     // Fill in hooks
390     eZSession::addCallback( 'destroy_pre', 'eZSessionBasketDestroy');
391     eZSession::addCallback( 'gc_pre', 'eZSessionBasketGarbageCollector');
392     eZSession::addCallback( 'cleanup_pre', 'eZSessionBasketCleanup');
393 }
394
395 // addCallBack to update session id for shop basket on session regenerate
396 function eZSessionBasketRegenerate( $db, $escNewKey, $escOldKey, $escUserID  )
397 {
398     $db->query( "UPDATE ezbasket SET session_id='$escNewKey' WHERE session_id='$escOldKey'" );
399 }
400
401 eZSession::addCallback( 'regenerate_post', 'eZSessionBasketRegenerate');
402
403 // Initialize module loading
404 $moduleRepositories = eZModule::activeModuleRepositories();
405 eZModule::setGlobalPathList( $moduleRepositories );
406
407 $check = eZHandlePreChecks( $siteBasics, $uri );
408
409 require_once( 'kernel/common/i18n.php' );
410
411 if ( $sessionRequired )
412 {
413     $dbRequired = true;
414 }
415
416 $db = false;
417 if ( $dbRequired )
418 {
419     $db = eZDB::instance();
420     if ( $sessionRequired and
421          $db->isConnected() )
422     {
423         eZSession::start();
424     }
425
426     if ( !$db->isConnected() )
427         $warningList[] = array( 'error' => array( 'type' => 'kernel',
428                                                   'number' => eZError::KERNEL_NO_DB_CONNECTION ),
429                                 'text' => 'No database connection could be made, the system might not behave properly.' );
430 }
431
432 // Initialize with locale settings
433 $locale = eZLocale::instance();
434 $languageCode = $locale->httpLocaleCode();
435 $phpLocale = trim( $ini->variable( 'RegionalSettings', 'SystemLocale' ) );
436 if ( $phpLocale != '' )
437 {
438     setlocale( LC_ALL, explode( ',', $phpLocale ) );
439 }
440
441 // send header information
442 $headerList = array( 'Expires' => 'Mon, 26 Jul 1997 05:00:00 GMT',
443                      'Last-Modified' => gmdate( 'D, d M Y H:i:s' ) . ' GMT',
444                      'Cache-Control' => 'no-cache, must-revalidate',
445                      'Pragma' => 'no-cache',
446                      'X-Powered-By' => 'eZ Publish',
447                      'Content-Type' => 'text/html; charset=' . $httpCharset,
448                      'Served-by' => $_SERVER["SERVER_NAME"],
449                      'Content-language' => $languageCode );
450
451 $site = array( 'title' => $ini->variable( 'SiteSettings', 'SiteName' ),
452                'design' => $ini->variable( 'DesignSettings', 'SiteDesign' ),
453                'http_equiv' => array( 'Content-Type' => 'text/html; charset=' . $httpCharset,
454                                       'Content-language' => $languageCode ) );
455
456
457 $headerOverrideArray = eZHTTPHeader::headerOverrideArray( $uri );
458
459 $headerList = array_merge( $headerList, $headerOverrideArray );
460
461 foreach( $headerList as $key => $value )
462 {
463     header( $key . ': ' . $value );
464 }
465
466 eZSection::initGlobalID();
467
468 // Read role settings
469 $globalPolicyCheckOmitList = $ini->variable( 'RoleSettings', 'PolicyOmitList' );
470 $policyCheckOmitList = array_merge( $policyCheckOmitList, $globalPolicyCheckOmitList );
471 $policyCheckViewMap = array();
472 foreach ( $policyCheckOmitList as $omitItem )
473 {
474     $items = explode( '/', $omitItem );
475     if ( count( $items ) > 1 )
476     {
477         $module = $items[0];
478         $view = $items[1];
479         if ( !isset( $policyCheckViewMap[$module] ) )
480             $policyCheckViewMap[$module] = array();
481         $policyCheckViewMap[$module][] = $view;
482     }
483 }
484
485
486 // Start the module loop
487 while ( $moduleRunRequired )
488 {
489     $objectHasMovedError = false;
490     $objectHasMovedURI = false;
491     $actualRequestedURI = $uri->uriString();
492
493     // Extract user specified parameters
494     $userParameters = $uri->userParameters();
495
496     // Generate a URI which also includes the user parameters
497     $completeRequestedURI = $uri->originalURIString();
498
499     // Check for URL translation
500     if ( $urlTranslatorAllowed and
501          eZURLAliasML::urlTranslationEnabledByUri( $uri ) )
502     {
503         $translateResult = eZURLAliasML::translate( $uri );
504
505         if ( !is_string( $translateResult ) )
506         {
507             $useWildcardTranslation = $ini->variable( 'URLTranslator', 'WildcardTranslation' ) == 'enabled';
508             if ( $useWildcardTranslation )
509             {
510                 $translateResult = eZURLWildcard::translate( $uri );
511             }
512         }
513
514         // Check if the URL has moved
515         if ( is_string( $translateResult ) )
516         {
517             $objectHasMovedURI = $translateResult;
518             foreach ( $userParameters as $name => $value )
519             {
520                 $objectHasMovedURI .= '/(' . $name . ')/' . $value;
521             }
522
523             $objectHasMovedError = true;
524         }
525     }
526
527     if ( $uri->isEmpty() )
528     {
529         $tmp_uri = new eZURI( $ini->variable( "SiteSettings", "IndexPage" ) );
530         $moduleCheck = eZModule::accessAllowed( $tmp_uri );
531     }
532     else
533     {
534         $moduleCheck = eZModule::accessAllowed( $uri );
535     }
536
537     if ( !$moduleCheck['result'] )
538     {
539         if ( $ini->variable( "SiteSettings", "ErrorHandler" ) == "defaultpage" )
540         {
541             $defaultPage = $ini->variable( "SiteSettings", "DefaultPage" );
542             $uri->setURIString( $defaultPage );
543             $moduleCheck['result'] = true;
544         }
545     }
546
547     $http = eZHTTPTool::instance();
548
549     $displayMissingModule = false;
550     $oldURI = $uri;
551
552     if ( $uri->isEmpty() )
553     {
554         if ( !fetchModule( $tmp_uri, $check, $module, $module_name, $function_name, $params ) )
555             $displayMissingModule = true;
556     }
557     else if ( !fetchModule( $uri, $check, $module, $module_name, $function_name, $params ) )
558     {
559         if ( $ini->variable( "SiteSettings", "ErrorHandler" ) == "defaultpage" )
560         {
561             $tmp_uri = new eZURI( $ini->variable( "SiteSettings", "DefaultPage" ) );
562             if ( !fetchModule( $tmp_uri, $check, $module, $module_name, $function_name, $params ) )
563                 $displayMissingModule = true;
564         }
565         else
566             $displayMissingModule = true;
567     }
568
569     if ( !$displayMissingModule &&
570          $moduleCheck['result'] &&
571          $module instanceof eZModule )
572     {
573         // Run the module/function
574         eZDebug::addTimingPoint( "Module start '" . $module->attribute( 'name' ) . "'" );
575
576         $moduleAccessAllowed = true;
577         $omitPolicyCheck = true;
578         $runModuleView = true;
579
580         $availableViewsInModule = $module->attribute( 'views' );
581         if ( !isset( $availableViewsInModule[$function_name] )
582                 && !$objectHasMovedError
583                     && !isset( $module->Module['function']['script'] ) )
584         {
585             $moduleResult = $module->handleError( eZError::KERNEL_MODULE_VIEW_NOT_FOUND, 'kernel' );
586             $runModuleView = false;
587             $policyCheckRequired = false;
588             $omitPolicyCheck = true;
589         }
590
591         if ( $policyCheckRequired )
592         {
593             $omitPolicyCheck = false;
594             $moduleName = $module->attribute( 'name' );
595             $viewName = $function_name;
596             if ( in_array( $moduleName, $policyCheckOmitList ) )
597                 $omitPolicyCheck = true;
598             else if ( isset( $policyCheckViewMap[$moduleName] ) and
599                       in_array( $viewName, $policyCheckViewMap[$moduleName] ) )
600                 $omitPolicyCheck = true;
601         }
602         if ( !$omitPolicyCheck )
603         {
604             $currentUser = eZUser::currentUser();
605             $siteAccessResult = $currentUser->hasAccessTo( 'user', 'login' );
606
607             $hasAccessToSite = false;
608             if ( $siteAccessResult[ 'accessWord' ] == 'limited' )
609             {
610                 $policyChecked = false;
611                 foreach ( array_keys( $siteAccessResult['policies'] ) as $key )
612                 {
613                     $policy = $siteAccessResult['policies'][$key];
614                     if ( isset( $policy['SiteAccess'] ) )
615                     {
616                         $policyChecked = true;
617                         $crc32AccessName = eZSys::ezcrc32( $access[ 'name' ] );
618                         eZDebugSetting::writeDebug( 'kernel-siteaccess', $policy['SiteAccess'], $crc32AccessName );
619                         if ( in_array( $crc32AccessName, $policy['SiteAccess'] ) )
620                         {
621                             $hasAccessToSite = true;
622                             break;
623                         }
624                     }
625                     if ( $hasAccessToSite )
626                         break;
627                 }
628                 if ( !$policyChecked )
629                     $hasAccessToSite = true;
630             }
631             else if ( $siteAccessResult[ 'accessWord' ] == 'yes' )
632             {
633                 eZDebugSetting::writeDebug( 'kernel-siteaccess', "access is yes" );
634                 $hasAccessToSite = true;
635             }
636             else if ( $siteAccessResult['accessWord'] == 'no' )
637             {
638                 $accessList = $siteAccessResult['accessList'];
639             }
640
641             if ( $hasAccessToSite )
642             {
643                 $accessParams = array();
644                 $moduleAccessAllowed = $currentUser->hasAccessToView( $module, $function_name, $accessParams );
645                 if ( isset( $accessParams['accessList'] ) )
646                 {
647                     $accessList = $accessParams['accessList'];
648                 }
649             }
650             else
651             {
652                 eZDebugSetting::writeDebug( 'kernel-siteaccess', $access, 'not able to get access to siteaccess' );
653                 $moduleAccessAllowed = false;
654                 $requireUserLogin = ( $ini->variable( "SiteAccessSettings", "RequireUserLogin" ) == "true" );
655                 if ( $requireUserLogin )
656                 {
657                     $module = eZModule::exists( 'user' );
658                     if ( $module instanceof eZModule )
659                     {
660                         $moduleResult = $module->run( 'login', array(),
661                                                        array( 'SiteAccessAllowed' => false,
662                                                               'SiteAccessName' => $access['name'] ) );
663                         $runModuleView = false;
664                     }
665                 }
666             }
667         }
668
669         $GLOBALS['eZRequestedModule'] = $module;
670
671         if ( $runModuleView )
672         {
673             if ( $objectHasMovedError == true )
674             {
675                 $moduleResult = $module->handleError( eZError::KERNEL_MOVED, 'kernel', array( 'new_location' => $objectHasMovedURI ) );
676             }
677             else if ( !$moduleAccessAllowed )
678             {
679                 if ( isset( $availableViewsInModule[$function_name][ 'default_navigation_part' ] ) )
680                 {
681                     $defaultNavigationPart = $availableViewsInModule[$function_name][ 'default_navigation_part' ];
682                 }
683
684                 if ( isset( $accessList ) )
685                     $moduleResult = $module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel', array( 'AccessList' => $accessList ) );
686                 else
687                     $moduleResult = $module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel' );
688
689                 if ( isset( $defaultNavigationPart ) )
690                 {
691                     $moduleResult['navigation_part'] = $defaultNavigationPart;
692                     unset( $defaultNavigationPart );
693                 }
694             }
695             else
696             {
697                 if ( !isset( $userParameters ) )
698                 {
699                     $userParameters = false;
700                 }
701
702                 // Check if we should switch access mode (http/https) for this module view.
703                 eZSSLZone::checkModuleView( $module->attribute( 'name' ), $function_name );
704
705                 $moduleResult = $module->run( $function_name, $params, false, $userParameters );
706
707                 if ( $module->exitStatus() == eZModule::STATUS_FAILED and
708                      $moduleResult == null )
709                     $moduleResult = $module->handleError( eZError::KERNEL_MODULE_VIEW_NOT_FOUND, 'kernel', array( 'module' => $module_name,
710                                                                                                                    'view' => $function_name ) );
711             }
712         }
713     }
714     else if ( $moduleCheck['result'] )
715     {
716         eZDebug::writeError( "Undefined module: $module_name", "index" );
717         $module = new eZModule( "", "", $module_name );
718         $GLOBALS['eZRequestedModule'] = $module;
719         $moduleResult = $module->handleError( eZError::KERNEL_MODULE_NOT_FOUND, 'kernel', array( 'module' => $module_name ) );
720     }
721     else
722     {
723         if ( $moduleCheck['view_checked'] )
724             eZDebug::writeError( "View '" . $moduleCheck['view'] . "' in module '" . $moduleCheck['module'] . "' is disabled", "index" );
725         else
726             eZDebug::writeError( "Module '" . $moduleCheck['module'] . "' is disabled", "index" );
727         $module = new eZModule( "", "", $moduleCheck['module'] );
728         $GLOBALS['eZRequestedModule'] = $module;
729         $moduleResult = $module->handleError( eZError::KERNEL_MODULE_DISABLED, 'kernel', array( 'check' => $moduleCheck ) );
730     }
731     $moduleRunRequired = false;
732     if ( $module->exitStatus() == eZModule::STATUS_RERUN )
733     {
734         if ( isset( $moduleResult['rerun_uri'] ) )
735         {
736             $uri = eZURI::instance( $moduleResult['rerun_uri'] );
737             $moduleRunRequired = true;
738         }
739         else
740             eZDebug::writeError( 'No rerun URI specified, cannot continue', 'index.php' );
741     }
742
743     if ( is_array( $moduleResult ) )
744     {
745         if ( isset( $moduleResult["pagelayout"] ) )
746         {
747             $show_page_layout = $moduleResult["pagelayout"];
748             $GLOBALS['eZCustomPageLayout'] = $moduleResult["pagelayout"];
749         }
750         if ( isset( $moduleResult["external_css"] ) )
751             $use_external_css = $moduleResult["external_css"];
752     }
753 }
754
755 if ( $ini->variable( "SiteAccessSettings", "CheckValidity" ) !== 'true' )
756 {
757     $currentUser = eZUser::currentUser();
758
759     $wwwDir = eZSys::wwwDir();
760     // On host based site accesses this can be empty, causing the cookie to be set for the current dir,
761     // but we want it to be set for the whole eZ publish site
762     $cookiePath = $wwwDir != '' ? $wwwDir : '/';
763
764     if ( $currentUser->isLoggedIn() )
765     {
766         setcookie( 'is_logged_in', 'true', 0, $cookiePath );
767     }
768     else if ( isset( $_COOKIE['is_logged_in'] ) )
769     {
770         setcookie( 'is_logged_in', false, 0, $cookiePath );
771     }
772 }
773
774 if ( $module->exitStatus() == eZModule::STATUS_REDIRECT )
775 {
776     $GLOBALS['eZRedirection'] = true;
777     $ini = eZINI::instance();
778     $automatic_redir = true;
779
780     if ( $GLOBALS['eZDebugAllowed'] && ( $redirUri = $ini->variable( 'DebugSettings', 'DebugRedirection' ) ) != 'disabled' )
781     {
782         if ( $redirUri == "enabled" )
783         {
784             $automatic_redir = false;
785         }
786         else
787         {
788             $redirUris = $ini->variableArray( "DebugSettings", "DebugRedirection" );
789             $uri = eZURI::instance( eZSys::requestURI() );
790             $uri->toBeginning();
791             foreach ( $redirUris as $redirUri )
792             {
793                 $redirUri = new eZURI( $redirUri );
794                 if ( $redirUri->matchBase( $uri ) )
795                 {
796                     $automatic_redir = false;
797                     break;
798                 }
799             }
800         }
801     }
802
803     $redirectURI = eZSys::indexDir();
804
805     $moduleRedirectUri = $module->redirectURI();
806     $redirectStatus = $module->redirectStatus();
807     $translatedModuleRedirectUri = $moduleRedirectUri;
808     if ( $ini->variable( 'URLTranslator', 'Translation' ) == 'enabled' &&
809          eZURLAliasML::urlTranslationEnabledByUri( new eZURI( $moduleRedirectUri ) ) )
810     {
811         if ( eZURLAliasML::translate( $translatedModuleRedirectUri, true ) )
812         {
813             $moduleRedirectUri = $translatedModuleRedirectUri;
814             if ( strlen( $moduleRedirectUri ) > 0 and
815                  $moduleRedirectUri[0] != '/' )
816                 $moduleRedirectUri = '/' . $moduleRedirectUri;
817         }
818     }
819
820     if ( preg_match( '#^(\w+:)|^//#', $moduleRedirectUri ) )
821     {
822         $redirectURI = $moduleRedirectUri;
823     }
824     else
825     {
826         $leftSlash = false;
827         $rightSlash = false;
828         if ( strlen( $redirectURI ) > 0 and
829              $redirectURI[strlen( $redirectURI ) - 1] == '/' )
830             $leftSlash = true;
831         if ( strlen( $moduleRedirectUri ) > 0 and
832              $moduleRedirectUri[0] == '/' )
833             $rightSlash = true;
834
835         if ( !$leftSlash and !$rightSlash ) // Both are without a slash, so add one
836             $moduleRedirectUri = '/' . $moduleRedirectUri;
837         else if ( $leftSlash and $rightSlash ) // Both are with a slash, so we remove one
838             $moduleRedirectUri = substr( $moduleRedirectUri, 1 );
839         $redirectURI .= $moduleRedirectUri;
840     }
841
842     eZStaticCache::executeActions();
843
844     eZDB::checkTransactionCounter();
845
846     if ( $automatic_redir )
847     {
848         eZHTTPTool::redirect( $redirectURI, array(), $redirectStatus );
849     }
850     else
851     {
852         // Make sure any errors or warnings are reported
853         if ( $ini->variable( 'DebugSettings', 'DisplayDebugWarnings' ) == 'enabled' )
854         {
855             if ( isset( $GLOBALS['eZDebugError'] ) and
856                  $GLOBALS['eZDebugError'] )
857             {
858                 eZAppendWarningItem( array( 'error' => array( 'type' => 'error',
859                                                               'number' => 1,
860                                                               'count' => $GLOBALS['eZDebugErrorCount'] ),
861                                             'identifier' => 'ezdebug-first-error',
862                                             'text' => ezpI18n::tr( 'index.php', 'Some errors occurred, see debug for more information.' ) ) );
863             }
864
865             if ( isset( $GLOBALS['eZDebugWarning'] ) and
866                  $GLOBALS['eZDebugWarning'] )
867             {
868                 eZAppendWarningItem( array( 'error' => array( 'type' => 'warning',
869                                                               'number' => 1,
870                                                               'count' => $GLOBALS['eZDebugWarningCount'] ),
871                                             'identifier' => 'ezdebug-first-warning',
872                                             'text' => ezpI18n::tr( 'index.php', 'Some general warnings occured, see debug for more information.' ) ) );
873             }
874         }
875
876         $tpl = eZTemplate::factory();
877         if ( count( $warningList ) == 0 )
878             $warningList = false;
879         $tpl->setVariable( 'site', $site );
880         $tpl->setVariable( 'warning_list', $warningList );
881         $tpl->setVariable( 'redirect_uri', eZURI::encodeURL( $redirectURI ) );
882         $templateResult = $tpl->fetch( 'design:redirect.tpl' );
883
884         eZDebug::addTimingPoint( "End" );
885
886         eZDisplayResult( $templateResult );
887     }
888
889     eZExecution::cleanExit();
890 }
891
892 // Store the last URI for access history for login redirection
893 // Only if database is connected and only if there was no error or no redirects happen
894 if ( is_object( $db ) and $db->isConnected() and
895      $module->exitStatus() == eZModule::STATUS_OK )
896 {
897     $currentURI = $completeRequestedURI;
898     if ( strlen( $currentURI ) > 0 and $currentURI[0] != '/' )
899         $currentURI = '/' . $currentURI;
900
901     $lastAccessedURI = "";
902     $lastAccessedViewURI = "";
903
904     $http = eZHTTPTool::instance();
905
906     // Fetched stored session variables
907     if ( $http->hasSessionVariable( "LastAccessesURI" ) )
908     {
909         $lastAccessedViewURI = $http->sessionVariable( "LastAccessesURI" );
910     }
911     if ( $http->hasSessionVariable( "LastAccessedModifyingURI" ) )
912     {
913         $lastAccessedURI = $http->sessionVariable( "LastAccessedModifyingURI" );
914     }
915
916     // Update last accessed view page
917     if ( $currentURI != $lastAccessedViewURI and
918          !in_array( $module->uiContextName(), array( 'edit', 'administration', 'browse', 'authentication' ) ) )
919     {
920         $http->setSessionVariable( "LastAccessesURI", $currentURI );
921     }
922
923     // Update last accessed non-view page
924     if ( $currentURI != $lastAccessedURI )
925     {
926         $http->setSessionVariable( "LastAccessedModifyingURI", $currentURI );
927     }
928 }
929
930
931 eZDebug::addTimingPoint( "Module end '" . $module->attribute( 'name' ) . "'" );
932 if ( !is_array( $moduleResult ) )
933 {
934     eZDebug::writeError( 'Module did not return proper result: ' . $module->attribute( 'name' ), 'index.php' );
935     $moduleResult = array();
936     $moduleResult['content'] = false;
937 }
938
939 if ( !isset( $moduleResult['ui_context'] ) )
940 {
941     $moduleResult['ui_context'] = $module->uiContextName();
942 }
943 $moduleResult['ui_component'] = $module->uiComponentName();
944
945 $templateResult = null;
946
947 eZDebug::setUseExternalCSS( $use_external_css );
948 if ( $show_page_layout )
949 {
950     $tpl = eZTemplate::factory();
951     if ( $tpl->hasVariable( 'node' ) )
952         $tpl->unsetVariable( 'node' );
953
954     if ( !isset( $moduleResult['path'] ) )
955         $moduleResult['path'] = false;
956     $moduleResult['uri'] = eZSys::requestURI();
957
958     $tpl->setVariable( "module_result", $moduleResult );
959
960     $meta = $ini->variable( 'SiteSettings', 'MetaDataArray' );
961
962     if ( !isset( $meta['description'] ) )
963     {
964         $metaDescription = "";
965         if ( isset( $moduleResult['path'] ) and
966              is_array( $moduleResult['path'] ) )
967         {
968             foreach ( $moduleResult['path'] as $pathPart )
969             {
970                 if ( isset( $pathPart['text'] ) )
971                     $metaDescription .= $pathPart['text'] . " ";
972             }
973         }
974         $meta['description'] = $metaDescription;
975     }
976
977     $site['uri'] = $oldURI;
978     $site['redirect'] = false;
979     $site['meta'] = $meta;
980     $site['version'] = eZPublishSDK::version();
981     $site['page_title'] = $module->title();
982
983     $tpl->setVariable( "site", $site );
984
985     if ( isset( $tpl_vars ) and is_array( $tpl_vars ) )
986     {
987         foreach( $tpl_vars as $tpl_var_name => $tpl_var_value )
988         {
989             $tpl->setVariable( $tpl_var_name, $tpl_var_value );
990         }
991     }
992
993     if ( $show_page_layout )
994     {
995         if ( $ini->variable( 'DebugSettings', 'DisplayDebugWarnings' ) == 'enabled' )
996         {
997             // Make sure any errors or warnings are reported
998             if ( isset( $GLOBALS['eZDebugError'] ) and
999                  $GLOBALS['eZDebugError'] )
1000             {
1001                 eZAppendWarningItem( array( 'error' => array( 'type' => 'error',
1002                                                               'number' => 1 ,
1003                                                               'count' => $GLOBALS['eZDebugErrorCount'] ),
1004                                             'identifier' => 'ezdebug-first-error',
1005                                             'text' => ezpI18n::tr( 'index.php', 'Some errors occurred, see debug for more information.' ) ) );
1006             }
1007
1008             if ( isset( $GLOBALS['eZDebugWarning'] ) and
1009                  $GLOBALS['eZDebugWarning'] )
1010             {
1011                 eZAppendWarningItem( array( 'error' => array( 'type' => 'warning',
1012                                                               'number' => 1,
1013                                                               'count' => $GLOBALS['eZDebugWarningCount'] ),
1014                                             'identifier' => 'ezdebug-first-warning',
1015                                             'text' => ezpI18n::tr( 'index.php', 'Some general warnings occured, see debug for more information.' ) ) );
1016             }
1017         }
1018
1019         if ( $userObjectRequired )
1020         {
1021             $currentUser = eZUser::currentUser();
1022
1023             $tpl->setVariable( "current_user", $currentUser );
1024             $tpl->setVariable( "anonymous_user_id", $ini->variable( 'UserSettings', 'AnonymousUserID' ) );
1025         }
1026         else
1027         {
1028             $tpl->setVariable( "current_user", false );
1029             $tpl->setVariable( "anonymous_user_id", false );
1030         }
1031
1032         $tpl->setVariable( "access_type", $access );
1033
1034         if ( count( $warningList ) == 0 )
1035             $warningList = false;
1036         $tpl->setVariable( 'warning_list', $warningList );
1037
1038         $resource = "design:";
1039         if ( is_string( $show_page_layout ) )
1040         {
1041             if ( strpos( $show_page_layout, ":" ) !== false )
1042             {
1043                 $resource = "";
1044             }
1045         }
1046         else
1047         {
1048             $show_page_layout = "pagelayout.tpl";
1049         }
1050
1051         // Set the navigation part
1052         // Check for navigation part settings
1053         $navigationPartString = 'ezcontentnavigationpart';
1054         if ( isset( $moduleResult['navigation_part'] ) )
1055         {
1056             $navigationPartString = $moduleResult['navigation_part'];
1057
1058             // Fetch the navigation part
1059         }
1060         $navigationPart = eZNavigationPart::fetchPartByIdentifier( $navigationPartString );
1061
1062         $tpl->setVariable( 'navigation_part', $navigationPart );
1063         $tpl->setVariable( 'uri_string', $uri->uriString() );
1064         if ( isset( $moduleResult['requested_uri_string'] ) )
1065         {
1066             $tpl->setVariable( 'requested_uri_string', $moduleResult['requested_uri_string'] );
1067         }
1068         else
1069         {
1070             $tpl->setVariable( 'requested_uri_string', $actualRequestedURI );
1071         }
1072
1073         // Set UI context and component
1074         $tpl->setVariable( 'ui_context', $moduleResult['ui_context'] );
1075         $tpl->setVariable( 'ui_component', $moduleResult['ui_component'] );
1076
1077         $templateResult = $tpl->fetch( $resource . $show_page_layout );
1078     }
1079 }
1080 else
1081 {
1082     $templateResult = $moduleResult['content'];
1083 }
1084
1085
1086 eZDebug::addTimingPoint( "End" );
1087
1088 $out = ob_get_clean();
1089 echo trim( $out );
1090
1091 eZDB::checkTransactionCounter();
1092
1093 eZDisplayResult( $templateResult );
1094
1095 eZExecution::cleanup();
1096 eZExecution::setCleanExit();
1097
1098 ?>