ここの情報は古いです。ご理解頂いた上でお取り扱いください。

source: OpenPNE/branches/stable-2.10.x/webapp/lib/controller.php @ 8578

Last change on this file since 8578 was 8578, checked in by ebihara, 12 years ago

#2842:ファイルダウンロード時には常にキャッシュをさせないヘッダを出力するように修正

File size: 10.9 KB
Line 
1<?php
2/**
3 * @copyright 2005-2007 OpenPNE Project
4 * @license   http://www.php.net/license/3_01.txt PHP License 3.01
5 */
6
7require_once 'OpenPNE/Action.php';
8
9// __Framework
10$GLOBALS['__Framework']['current_module'] = '';
11$GLOBALS['__Framework']['current_type']   = '';
12$GLOBALS['__Framework']['current_action'] = '';
13$GLOBALS['__Framework']['default_type']   = 'page';
14$GLOBALS['__Framework']['default_page']   = '';
15$GLOBALS['__Framework']['is_secure']   = true;
16
17/**
18 * 初期実行 index.php から呼ばれる
19 */
20function openpne_execute()
21{
22    $module = '';
23    $type   = '';
24    $action = '';
25
26    if (!($module = get_request_var('m'))) {
27        // モジュール名の自動設定
28        if (!db_admin_user_exists()) {
29            $module = 'setup';
30        } elseif (isKtaiUserAgent()) {
31            $module = 'ktai';
32        } else {
33            $module = 'pc';
34        }
35    }
36
37    $types = array('page', 'do');
38    if ($a = get_request_var('a')) {
39        $arr = explode('_', $a, 2);
40        if (!empty($arr[1]) && in_array($arr[0], $types)) {
41            $type   = $arr[0];
42            $action = $arr[1];
43        }
44    }
45    openpne_forward($module, $type, $action);
46}
47
48/**
49 * J-PHONE 旧機種対応のため GET 優先でリクエスト変数を取得
50 */
51function get_request_var($key)
52{
53    if (isset($_GET[$key])) {
54        return $_GET[$key];
55    } elseif (isset($_POST[$key])) {
56        return $_POST[$key];
57    } elseif (isset($_REQUEST[$key])) {
58        return $_REQUEST[$key];
59    } else {
60        return '';
61    }
62}
63
64/**
65 * openpne_forward
66 *
67 * @param string $module a requested module name.
68 * @param string $type request type. 'page' or 'do'
69 * @param string $action requested page/command name.
70 * @param array  $errors error message strings.
71 */
72function openpne_forward($module, $type = '', $action = '', $errors = array())
73{
74    /// module ///
75    if (!$module = _check_module($module)) {
76        openpne_display_error('モジュールが見つかりません', true);
77    }
78    $GLOBALS['__Framework']['current_module'] = $module;
79
80    // disable modules
81    if (in_array($module, (array)$GLOBALS['_OPENPNE_DISABLE_MODULES'])) {
82        openpne_display_error('モジュールが無効になっています', true);
83    }
84    // maintenace mode
85    if (OPENPNE_UNDER_MAINTENANCE &&
86        !in_array($module, (array)$GLOBALS['_OPENPNE_MAINTENANCE_MODULES'])) {
87        openpne_display_error();
88    }
89
90    // init
91    if ($init = openpne_ext_search("{$module}/init.inc")) {
92        require_once $init;
93    }
94
95    /// type ///
96    if (!$type) {
97        $type = $GLOBALS['__Framework']['default_type'];
98    }
99    if (!_check_type($type)) {
100        openpne_display_error('リクエストの種類が正しくありません', true);
101    }
102    $GLOBALS['__Framework']['current_type'] = $type;
103
104    /// action ///
105    if (!$action = _check_action($action)) {
106        openpne_display_error('アクションの指定が正しくありません', true);
107    }
108
109    if (!$file = openpne_ext_search("{$module}/{$type}/{$action}.php")) {
110        openpne_display_error('アクションファイルが見つかりません', true);
111    }
112    require_once $file;
113    $class_name = "{$module}_{$type}_{$action}";
114    if (!class_exists($class_name)) {
115        openpne_display_error('アクションが見つかりません', true);
116    }
117    $action_obj = new $class_name();
118    $GLOBALS['__Framework']['current_action'] = $action;
119
120    // auth
121    if ($GLOBALS['__Framework']['is_secure'] = $action_obj->isSecure()) {
122        if ($auth = openpne_ext_search("{$module}/auth.inc")) {
123            require_once $auth;
124        } else {
125            require_once 'auth.inc';
126        }
127    }
128
129    // ---------- リクエストバリデーション ----------
130
131    require_once 'OpenPNE/Validator.php';
132    require_once 'OpenPNE/Validator/Common.php';
133    $validator = new OpenPNE_Validator_Common();
134
135    $files = array();
136    if ($ini = openpne_ext_search("{$module}/validate/{$type}/{$action}.ini")) {
137        $files[] = $ini;
138    }
139    list($result, $requests) = $validator->common_validate($files);
140    $action_obj->requests = $requests;
141    if ($result === false) {
142        $errors = $validator->getErrors();
143        $action_obj->handleError($errors);
144    }
145
146    // ----------------------------------------------
147
148    switch ($type) {
149    case 'page':
150        $smarty = new OpenPNE_Smarty($GLOBALS['SMARTY']);
151        $smarty->templates_dir = $module . '/templates';
152
153        $smarty->assign('requests', $requests);
154
155        $smarty->assign('msg', $requests['msg']);
156        $smarty->assign('msg1', $requests['msg1']);
157        $smarty->assign('msg2', $requests['msg2']);
158        $smarty->assign('msg3', $requests['msg3']);
159        if ($errors) {
160            $smarty->assign('errors', $errors);
161        }
162
163        if (OPENPNE_USE_PARTIAL_SSL) {
164            $a = "{$type}_{$action}";
165            if ($_SERVER['REQUEST_METHOD'] == 'POST') {
166                $p = $_POST;
167            } else {
168                $p = $_GET;
169            }
170            switch (openpne_ssl_type($module, $a)) {
171            case 'SSL_REQUIRED':
172                if (!is_ssl()) {
173                    openpne_redirect($module, $a, $p);
174                }
175                break;
176            case 'SSL_DISABLED':
177                if (is_ssl()) {
178                    openpne_redirect($module, $a, $p);
179                }
180                break;
181            case 'SSL_SELECTABLE':
182                if ($https = is_ssl()) {
183                    $url = openpne_gen_url($module, $a, $p, true, 'nonssl');
184                } else {
185                    $url = openpne_gen_url($module, $a, $p, true, 'ssl');
186                }
187                $smarty->assign('HTTPS', $https);
188                $smarty->assign('SSL_SELECT_URL', $url);
189                break;
190            }
191        }
192
193        $action_obj->view =& $smarty;
194        break;
195    }
196
197    // init function
198    $init_func = "init_{$module}_{$type}";
199    if (function_exists($init_func)) {
200        if (isset($smarty)) {
201            $init_func($smarty);
202        } else {
203            $init_func();
204        }
205    }
206
207    $result = $action_obj->execute($requests);
208    if ($result == 'success') {
209        send_nocache_headers();
210        $smarty->ext_display("{$action}.tpl");
211    }
212    // ----------------------------------------------
213
214    // c_access_log
215    if (LOG_C_ACCESS_LOG) {
216        if ($GLOBALS['__Framework']['is_secure'] && $type == 'page') {
217            if ($module == 'pc') {
218                p_access_log($GLOBALS['AUTH']->uid(), $action);
219            } elseif ($module == 'ktai') {
220                p_access_log($GLOBALS['KTAI_C_MEMBER_ID'], $action, 1);
221            }
222        }
223    }
224
225    // カスタムログ用関数の呼び出し
226    if (OPENPNE_LOG_FUNCTION && is_callable(OPENPNE_LOG_FUNCTION)) {
227        // c_member_id を取得
228        $c_member_id = 0;
229        if ($GLOBALS['__Framework']['is_secure']) {
230            if ($module == 'pc') {
231                $c_member_id = $GLOBALS['AUTH']->uid();
232            } else if ($module == 'ktai') {
233                $c_member_id = $GLOBALS['KTAI_C_MEMBER_ID'];
234            }
235        }
236
237        $params = array(
238            'module' => $module,
239            'type' => $type,
240            'action' => $action,
241            'c_member_id' => $c_member_id,
242            'is_secure' => $GLOBALS['__Framework']['is_secure'],
243        );
244        call_user_func(OPENPNE_LOG_FUNCTION, $params);
245    }
246
247    return true;
248}
249
250function openpne_display_error($errors = array(), $notfound = false)
251{
252    $smarty = new OpenPNE_Smarty($GLOBALS['SMARTY']);
253    $smarty->setOutputCharset('SJIS');
254    $smarty->assign('notfound', $notfound);
255    if (OPENPNE_DEBUGGING) {
256        $smarty->assign('errors', (array)$errors);
257    }
258    $smarty->ext_display('error.tpl');
259    exit;
260}
261
262function openpne_ext_search($path)
263{
264    $dft = OPENPNE_MODULES_DIR . '/' . $path;
265    $ext = OPENPNE_MODULES_EXT_DIR . '/' . $path;
266    $biz = OPENPNE_MODULES_BIZ_DIR . '/' . $path;
267
268    if (USE_EXT_DIR && is_readable($ext)) {
269        return $ext;
270    } elseif (USE_BIZ_DIR && is_readable($biz)) {
271        return $biz;
272    } elseif (is_readable($dft)) {
273        return $dft;
274    }
275
276    return false;
277}
278
279/**
280 * モジュール名を取得
281 * 空の場合はデフォルトモジュールを返す
282 *
283 * 間違ったモジュール名を指定した
284 * デフォルトモジュールが存在しない場合は false
285 *
286 * @param string $module module name
287 */
288function _check_module($module)
289{
290    // 英数字とアンダーバーのみ
291    // 「../」等は許さない
292    if (preg_match('/\W/', $module)) {
293        // モジュール名が不正です
294        return false;
295    }
296
297    if (empty($module)) {
298        // モジュールが指定されていません
299        return false;
300    }
301
302    if ($module == ADMIN_MODULE_NAME) {
303        $module = 'admin';
304    } elseif ($module == 'admin') {
305        return false;
306    }
307
308    if (!openpne_ext_search($module)) {
309        return false;
310    }
311
312    return $module;
313}
314
315function _check_type($type)
316{
317    switch ($type) {
318        case 'page':
319        case 'do':
320            break;
321        default:
322            // unknown type
323            return false;
324    }
325
326    return $type;
327}
328
329function _check_action($action)
330{
331    // 英数字とアンダーバーのみ
332    // 「../」等は許さない
333    if (preg_match('/\W/', $action)) {
334        // アクション名が不正です
335        return false;
336    }
337
338    if (empty($action)) {
339        $type = $GLOBALS['__Framework']['current_type'];
340        if (empty($GLOBALS['__Framework']['default_' . $type])) {
341            // ページが指定されていません
342            return false;
343        } else {
344            $action = $GLOBALS['__Framework']['default_' . $type];
345        }
346    }
347
348    return $action;
349}
350
351function send_nocache_headers($is_force = false)
352{
353    if (!headers_sent()) {
354        if ((!empty($GLOBALS['__Framework']['carrier']) && $GLOBALS['__Framework']['carrier'] === 'e')  // au の場合は常に no-cache ヘッダを送信
355            || OPENPNE_SEND_NO_CACHE_HEADER || $is_force) {
356            // no-cache
357            // 日付が過去
358            header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
359   
360            // 常に修正されている
361            header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
362   
363            // HTTP/1.1
364            header('Cache-Control: no-store, no-cache, must-revalidate');
365            header('Cache-Control: post-check=0, pre-check=0', false);
366            // HTTP/1.0
367            header('Pragma: no-cache');
368        }
369
370        return true;
371    } else {
372        return false;
373    }
374}
375
376function handle_kengen_error()
377{
378    switch ($GLOBALS['__Framework']['current_module']) {
379    case 'pc':
380        openpne_forward('pc', 'page', 'h_err_forbidden');
381        break;
382    case 'ktai':
383        ktai_display_error('このページにはアクセスすることができません。');
384        break;
385    default:
386        openpne_display_error('このページにはアクセスすることができません。');
387        break;
388    }
389    exit;
390}
391
392?>
Note: See TracBrowser for help on using the repository browser.