Implement #015359: access.php - new MatchOrder=host_uri
[tinyz:tinyz.git] / pre_check.php
1 <?php
2 /**
3  * File containing pre check functions as used to validate request
4  *
5  * @copyright Copyright (C) 1999-2010 eZ Systems AS. All rights reserved.
6  * @license http://ez.no/licenses/gnu_gpl GNU GPL v2
7  * @version //autogentag//
8  * @package index
9  * @deprecated This file and its compatibility functions/constants will be removed in "4.6"
10  */
11
12 /**
13  * Checks if the installation is valid and returns a module redirect if required.
14  * If CheckValidity in SiteAccessSettings is false then no check is done.
15  *
16  * @param array $siteBasics
17  * @param eZURI $uri
18  */
19 function eZCheckValidity( array &$siteBasics, eZURI $uri )
20 {
21     $ini = eZINI::instance();
22     $checkValidity = ( $ini->variable( "SiteAccessSettings", "CheckValidity" ) == "true" );
23     $check = null;
24     if ( $checkValidity )
25     {
26         $check = array( "module" => "setup",
27                         'function' => 'init' );
28         // Turn off some features that won't bee needed yet
29 //        $siteBasics['policy-check-required'] = false;
30         $siteBasics['policy-check-omit-list'][] = 'setup';
31         $siteBasics['url-translator-allowed'] = false;
32         $siteBasics['show-page-layout'] = $ini->variable( 'SetupSettings', 'PageLayout' );
33         $siteBasics['validity-check-required'] = true;
34         $siteBasics['user-object-required'] = false;
35         $siteBasics['session-required'] = false;
36         $siteBasics['db-required'] = false;
37         $siteBasics['no-cache-adviced'] = false;
38         $siteBasics['site-design-override'] = $ini->variable( 'SetupSettings', 'OverrideSiteDesign' );
39         $access = array( 'name' => 'setup',
40                          'type' => eZSiteAccess::TYPE_URI );
41         $access = eZSiteAccess::change( $access );
42
43         eZTranslatorManager::enableDynamicTranslations();
44     }
45     return $check;
46 }
47
48 /**
49  * List of functions that should be checked by key identifier
50  *
51  * @return array An associative array with items to run a check on, each items
52  * is an associative array. The item must contain: function -> name of the function
53  */
54 function eZCheckList()
55 {
56     $checks = array();
57     $checks['validity'] = array( 'function' => 'eZCheckValidity' );
58     $checks['user'] = array( 'function' => 'eZCheckUser' );
59     return $checks;
60 }
61
62 /**
63  * Check if user login is required. If so, use login handler to redirect user.
64  *
65  * @param array $siteBasics
66  * @param eZURI $uri
67  * @return array|true|false|null An associative array on redirect with 'module' and 'function' keys, true on successful
68  *                               and false/null on #fail.  
69  */
70 function eZCheckUser( array &$siteBasics, eZURI $uri )
71 {
72     if ( !$siteBasics['user-object-required'] )
73     {
74         return null;
75     }
76
77     // if( !include_once( 'kernel/classes/datatypes/ezuser/ezuserloginhandler.php' ) )
78     //     return null;
79
80     $http = eZHTTPTool::instance();
81     $ini = eZINI::instance();
82     $requireUserLogin = ( $ini->variable( 'SiteAccessSettings', 'RequireUserLogin' ) == 'true' );
83     $forceLogin = $http->hasSessionVariable( eZUserLoginHandler::FORCE_LOGIN );
84     if ( !$requireUserLogin &&
85          !$forceLogin )
86     {
87         return null;
88     }
89
90     return eZUserLoginHandler::checkUser( $siteBasics, $uri );
91 }
92
93 /**
94  * Return the order that prechecks should be checked
95  *
96  * @return array
97  */
98 function eZCheckOrder()
99 {
100     return array( 'validity', 'user' );
101 }
102
103 /**
104  * Executes pre checks
105  *
106  * @param array $siteBasics
107  * @param eZURI $uri
108  * @return array|null A structure with redirection information or null if nothing should be done.
109  */
110 function eZHandlePreChecks( array &$siteBasics, eZURI $uri )
111 {
112     $checks = eZCheckList();
113     $checks = precheckAllowed( $checks );
114     $checkOrder = eZCheckOrder();
115     foreach( $checkOrder as $checkItem )
116     {
117         if ( !isset( $checks[$checkItem] ) )
118             continue;
119         $check = $checks[$checkItem];
120         if ( !isset( $check['allow'] ) || $check['allow'] )
121         {
122             $func = $check['function'];
123             $check = $func( $siteBasics, $uri );
124             if ( $check !== null )
125                 return $check;
126         }
127     }
128     return null;
129 }
130
131 /**
132  * Uses [SitePrecheckRules] to check if a precheck is allowed or not.
133  * Setting seems to be able to be defined like this (site.ini):
134  *  [SitePrecheckRules]
135  *  Rules[]
136  *  # access can be enabled or disabled, and will affect the later
137  *  Rules[]=access;enabled
138  *  # precheckall can be true (makes prior access rule affect all prechecks)
139  *  Rules[]=precheckall;true
140  *  # precheck needs to be set to the same key as the precheck you want to allow / disallow
141  *  Rules[]=precheck;validity
142  *
143  * @deprecated As of 4.4, since SitePrecheckRules setting is not used or documented anywhere
144  *             (documentation above was added when it was deprecated)
145  * @param array $prechecks
146  * @return array The same $prechecks array but adjusted according to the SitePrecheckRules rules
147  */
148 function precheckAllowed( array $prechecks )
149 {
150     $ini = eZINI::instance();
151
152     if ( !$ini->hasGroup( 'SitePrecheckRules' ) )
153         return $prechecks;
154
155     $tmp_allow = true;
156     $items     = $ini->variableArray( 'SitePrecheckRules', 'Rules' );
157     foreach( $items as $item )
158     {
159         $name  = strtolower( $item[0] );
160         $value = $item[1];
161         switch( $name )
162         {
163             case 'access':
164             {
165                 $tmp_allow = ($value === 'enable');
166             } break;
167             case 'precheckall':
168             {
169                 if ( $value === 'true' )
170                 {
171                     foreach( $prechecks as $key => $value )
172                     {
173                         $prechecks[$key]['allow'] = $tmp_allow;
174                     }
175                 }
176             } break;
177             case 'precheck':
178             {
179                 if ( isset( $prechecks[$value] ) )
180                     $prechecks[$value]['allow'] = $tmp_allow;
181             } break;
182             default:
183             {
184                 eZDebug::writeError( "Unknown precheck rule: $name=$value", 'Access' );
185             } break;
186         }
187     }
188     return $prechecks;
189 }
190
191 ?>