source: branches/version-2_12-dev/html/install/index.php @ 21481

Revision 21481, 38.1 KB checked in by Seasoft, 12 years ago (diff)

#1613 (ソース整形・ソースコメントの改善)

  • Zend Framework PHP 標準コーディング規約への準拠を高めた
  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23// ▼require.php 相当
24// rtrim は PHP バージョン依存対策
25define('HTML_REALDIR', rtrim(realpath(rtrim(realpath(dirname(__FILE__)), '/\\') . '/../'), '/\\') . '/');
26
27require_once HTML_REALDIR . 'define.php';
28define('INSTALL_FUNCTION', true);
29define('INSTALL_INFO_URL', "http://www.ec-cube.net/install_info/index.php");
30while (ob_get_level() >= 1) {
31    ob_end_clean();
32}
33require_once HTML_REALDIR . HTML2DATA_DIR . 'require_base.php';
34ob_start();
35// ▲require.php 相当
36
37$ownDir = realpath(dirname(__FILE__)) . '/';
38require_once DATA_REALDIR . 'module/HTTP/Request.php';
39
40if (!defined('ADMIN_DIR')) {
41    define('ADMIN_DIR',"admin/");
42}
43
44define('INSTALL_LOG', "./temp/install.log");
45ini_set('max_execution_time', 300);
46
47$objPage = new StdClass;
48$objPage->arrDB_TYPE = array(
49    'pgsql' => 'PostgreSQL',
50    'mysql' => 'MySQL'
51);
52$objPage->arrDB_PORT = array(
53    'pgsql' => '',
54    'mysql' => ''
55);
56
57$objDb = new SC_Helper_DB_Ex();
58
59// テンプレートコンパイルディレクトリの書込み権限チェック
60$temp_dir = $ownDir . 'temp';
61
62if (!is_writable($temp_dir)) {
63    SC_Utils_Ex::sfErrorHeader($temp_dir . "にユーザ書込み権限(777, 707等)を付与して下さい。", true);
64    exit;
65}
66
67$objView = new SC_InstallView_Ex($ownDir . 'templates', $ownDir . 'temp');
68
69// パラメーター管理クラス
70$objWebParam = new SC_FormParam();
71$objDBParam = new SC_FormParam();
72// パラメーター情報の初期化
73$objWebParam = lfInitWebParam($objWebParam);
74$objDBParam = lfInitDBParam($objDBParam);
75
76//フォーム配列の取得
77$objWebParam->setParam($_POST);
78$objDBParam->setParam($_POST);
79
80$mode = isset($_POST['mode_overwrite']) ? $_POST['mode_overwrite'] : $_POST['mode'];
81
82switch ($mode) {
83// ようこそ
84case 'welcome':
85    //$objPage = lfDispAgreement($objPage);
86    $objPage = lfDispStep0($objPage);
87    //$objPage->tpl_onload .= "fnChangeVisible('agreement_yes', 'next');";
88    break;
89
90/* 現在保留中
91
92// 使用許諾契約書の同意
93case 'agreement':
94    $objPage = lfDispStep0($objPage);
95    break;
96*/
97
98// アクセス権限のチェック
99case 'step0':
100    $objPage = lfDispStep0_1($objPage);
101    break;
102// ファイルのコピー
103case 'step0_1':
104    $objPage = lfDispStep1($objPage);
105    break;
106// WEBサイトの設定
107case 'step1':
108    //入力値のエラーチェック
109    $objPage->arrErr = lfCheckWebError($objWebParam);
110    if (count($objPage->arrErr) == 0) {
111        $objPage = lfDispStep2($objPage);
112    } else {
113        $objPage = lfDispStep1($objPage);
114    }
115    break;
116// データベースの設定
117case 'step2':
118    //入力値のエラーチェック
119    $objPage->arrErr = lfCheckDBError($objDBParam);
120    if (count($objPage->arrErr) == 0) {
121        if ($err = renameAdminDir($objWebParam->getValue('admin_dir')) !== true) {
122            $objPage->arrErr['all'] .= $err;
123            $objPage = lfDispStep2($objPage);
124        } else {
125            $objPage = lfDispStep3($objPage);
126        }
127    } else {
128        $objPage = lfDispStep2($objPage);
129    }
130    break;
131// テーブルの作成
132case 'step3':
133    // 入力データを渡す。
134    $arrRet =  $objDBParam->getHashArray();
135    define('DB_TYPE', $arrRet['db_type']);
136    $dsn = $arrRet['db_type']."://".$arrRet['db_user'].":".$arrRet['db_password']."@".$arrRet['db_server'].":".$arrRet['db_port']."/".$arrRet['db_name'];
137
138    if (count($objPage->arrErr) == 0) {
139        // スキップする場合には次画面へ遷移
140        $skip = $_POST['db_skip'];
141        if ($skip == 'on') {
142            $objPage = lfDispStep4($objPage);
143            break;
144        }
145    }
146
147    // テーブルの作成
148    $objPage->arrErr = lfExecuteSQL("./sql/create_table_".$arrRet['db_type'].".sql", $dsn);
149    if (count($objPage->arrErr) == 0) {
150        $objPage->tpl_message.="○:テーブルの作成に成功しました。<br />";
151    } else {
152        $objPage->tpl_message.="×:テーブルの作成に失敗しました。<br />";
153    }
154
155    // 初期データの作成
156    if (count($objPage->arrErr) == 0) {
157        $objPage->arrErr = lfExecuteSQL("./sql/insert_data.sql", $dsn);
158        if (count($objPage->arrErr) == 0) {
159            $objPage->tpl_message.="○:初期データの作成に成功しました。<br />";
160        } else {
161            $objPage->tpl_message.="×:初期データの作成に失敗しました。<br />";
162        }
163    }
164
165    // シーケンスの作成
166    if (count($objPage->arrErr) == 0) {
167        $objPage->arrErr = lfCreateSequence(getSequences(), $dsn);
168        if (count($objPage->arrErr) == 0) {
169            $objPage->tpl_message.="○:シーケンスの作成に成功しました。<br />";
170        } else {
171            $objPage->tpl_message.="×:シーケンスの作成に失敗しました。<br />";
172        }
173    }
174
175    if (count($objPage->arrErr) == 0) {
176        $objPage = lfDispStep3($objPage);
177        $objPage->tpl_mode = 'step4';
178    } else {
179        $objPage = lfDispStep3($objPage);
180    }
181    break;
182case 'step4':
183    $objPage = lfDispStep4($objPage);
184    break;
185
186// テーブル類削除
187case 'drop':
188    // 入力データを渡す。
189    $arrRet =  $objDBParam->getHashArray();
190    if (!defined('DB_TYPE')) {
191        define('DB_TYPE', $arrRet['db_type']);
192    }
193    $dsn = $arrRet['db_type']."://".$arrRet['db_user'].":".$arrRet['db_password']."@".$arrRet['db_server'].":".$arrRet['db_port']."/".$arrRet['db_name'];
194
195    // テーブルの削除
196    if (count($objPage->arrErr) == 0) {
197        $objPage->arrErr = lfExecuteSQL("./sql/drop_table.sql", $dsn, false);
198        if (count($objPage->arrErr) == 0) {
199            $objPage->tpl_message.="○:テーブルの削除に成功しました。<br />";
200        } else {
201            $objPage->tpl_message.="×:テーブルの削除に失敗しました。<br />";
202        }
203    }
204
205    // シーケンスの削除
206    if (count($objPage->arrErr) == 0) {
207        $objPage->arrErr = lfDropSequence(getSequences(), $dsn);
208        if (count($objPage->arrErr) == 0) {
209            $objPage->tpl_message.="○:シーケンスの削除に成功しました。<br />";
210        } else {
211            $objPage->tpl_message.="×:シーケンスの削除に失敗しました。<br />";
212        }
213    }
214
215    $objPage = lfDispStep3($objPage);
216    break;
217// 完了画面
218case 'complete':
219
220    $GLOBAL_ERR = "";
221    $objPage = lfDispComplete($objPage);
222
223    if (isset($_POST['send_info']) && $_POST['send_info'] === 'true') {
224        // サイト情報を送信
225        $req = new HTTP_Request("http://www.ec-cube.net/mall/use_site.php");
226        $req->setMethod(HTTP_REQUEST_METHOD_POST);
227
228        $arrSendData = array();
229        foreach ($_POST as $key => $val) {
230            if (ereg("^senddata_*", $key)) {
231                $arrSendDataTmp = array(str_replace('senddata_', "", $key) => $val);
232                $arrSendData = array_merge($arrSendData, $arrSendDataTmp);
233            }
234        }
235
236        foreach ($arrSendData as $key => $val) {
237            $req->addPostData($key, $val);
238        }
239
240        if (!PEAR::isError($req->sendRequest())) {
241            $response1 = $req->getResponseBody();
242        } else {
243            $response1 = "";
244        }
245        $req->clearPostData();
246    }
247
248    break;
249case 'return_step0':
250    $objPage = lfDispStep0($objPage);
251    break;
252case 'return_step1':
253    $objPage = lfDispStep1($objPage);
254    break;
255case 'return_step2':
256    $objPage = lfDispStep2($objPage);
257    break;
258case 'return_step3':
259    $objPage = lfDispStep3($objPage);
260    break;
261case 'return_agreement':
262    $objPage = lfDispAgreement($objPage);
263    $objPage->tpl_onload .= "fnChangeVisible('agreement_yes', 'next');";
264    break;
265case 'return_welcome':
266default:
267    $objPage = lfDispWelcome($objPage);
268    break;
269}
270
271//フォーム用のパラメーターを返す
272$objPage->arrForm = $objWebParam->getFormParamList();
273$objPage->arrForm = array_merge($objPage->arrForm, $objDBParam->getFormParamList());
274
275// SiteInfoを読み込まない
276$objView->assignobj($objPage);
277$objView->display('install_frame.tpl');
278//-----------------------------------------------------------------------------------------------------------------------------------
279// ようこそ画面の表示
280function lfDispWelcome($objPage) {
281    global $objWebParam;
282    global $objDBParam;
283    // hiddenに入力値を保持
284    $objPage->arrHidden = $objWebParam->getHashArray();
285    // hiddenに入力値を保持
286    $objPage->arrHidden = array_merge($objPage->arrHidden, $objDBParam->getHashArray());
287    $objPage->arrHidden['db_skip'] = $_POST['db_skip'];
288    $objPage->arrHidden['agreement'] = $_POST['agreement'];
289    $objPage->tpl_mainpage = 'welcome.tpl';
290    $objPage->tpl_mode = 'welcome';
291    return $objPage;
292}
293
294// 使用許諾契約書の表示
295function lfDispAgreement($objPage) {
296    global $objWebParam;
297    global $objDBParam;
298    // hiddenに入力値を保持
299    $objPage->arrHidden = $objWebParam->getHashArray();
300    // hiddenに入力値を保持
301    $objPage->arrHidden = array_merge($objPage->arrHidden, $objDBParam->getHashArray());
302    $objPage->arrHidden['db_skip'] = $_POST['db_skip'];
303    $objPage->arrHidden['agreement'] = $_POST['agreement'];
304    $objPage->tpl_mainpage = 'agreement.tpl';
305    $objPage->tpl_mode = 'agreement';
306    return $objPage;
307}
308
309// STEP0画面の表示(チェック)
310function lfDispStep0($objPage) {
311    global $objWebParam;
312    global $objDBParam;
313    // hiddenに入力値を保持
314    $objPage->arrHidden = $objWebParam->getHashArray();
315    // hiddenに入力値を保持
316    $objPage->arrHidden = array_merge($objPage->arrHidden, $objDBParam->getHashArray());
317    $objPage->arrHidden['db_skip'] = $_POST['db_skip'];
318    $objPage->arrHidden['agreement'] = $_POST['agreement'];
319    $objPage->tpl_mainpage = 'step0.tpl';
320
321    // プログラムで書込みされるファイル・ディレクトリ
322    $arrWriteFile = array(
323        USER_REALDIR,
324        HTML_REALDIR . 'upload/',
325        DATA_REALDIR . 'cache/',
326        DATA_REALDIR . 'class/',
327        DATA_REALDIR . 'Smarty/',
328        DATA_REALDIR . 'logs/',
329        DATA_REALDIR . 'downloads/',
330        DATA_REALDIR . 'upload/',
331        HTML_REALDIR,
332        DATA_REALDIR . 'config/',
333    );
334
335    $mess = "";
336    $hasErr = false;
337    foreach ($arrWriteFile as $val) {
338        // listdirsの保持データを初期化
339        initdirs();
340        if (is_dir($val) and $val != HTML_REALDIR) {
341            $arrDirs = listdirs($val);
342        } else {
343            $arrDirs = array($val);
344        }
345
346        foreach ($arrDirs as $path) {
347            if (file_exists($path)) {
348                $filemode = lfGetFileMode($path);
349                $real_path = realpath($path);
350
351                // ディレクトリの場合
352                if (is_dir($path)) {
353                    if (!is_writable($path)) {
354                        $mess.= ">> ×:$real_path($filemode) \nユーザ書込み権限(777, 707等)を付与して下さい。\n";
355                        $hasErr = true;
356                    } else {
357                        GC_Utils_Ex::gfPrintLog("WRITABLE:".$path, INSTALL_LOG);
358                    }
359                } else {
360                    if (!is_writable($path)) {
361                        $mess.= ">> ×:$real_path($filemode) \nユーザ書込み権限(666, 606等)を付与して下さい。\n";
362                        $hasErr = true;
363                    } else {
364                        GC_Utils_Ex::gfPrintLog("WRITABLE:".$path, INSTALL_LOG);
365                    }
366                }
367            } else {
368                $mess.= ">> ×:$path が見つかりません。\n";
369                $hasErr = true;
370            }
371        }
372    }
373
374    if (ini_get('safe_mode')) {
375        $mess .= ">> ×:PHPのセーフモードが有効になっています。\n";
376        $hasErr = true;
377    }
378
379    if (get_magic_quotes_gpc()) {
380        $mess .= ">> ×:PHPの設定ディレクティブ「magic_quotes_gpc」が有効になっています。\n";
381        $hasErr = true;
382    }
383
384    // 問題点を検出している場合
385    if ($hasErr) {
386        $objPage->tpl_mode = 'return_step0';
387    }
388    // 問題点を検出していない場合
389    else {
390        $objPage->tpl_mode = 'step0';
391        umask(0);
392        $path = HTML_REALDIR . "upload/temp_template";
393        if (!file_exists($path)) {
394            mkdir($path);
395        }
396        $path = HTML_REALDIR . "upload/save_image";
397        if (!file_exists($path)) {
398            mkdir($path);
399        }
400        $path = HTML_REALDIR . "upload/temp_image";
401        if (!file_exists($path)) {
402            mkdir($path);
403        }
404        $path = HTML_REALDIR . "upload/graph_image";
405        if (!file_exists($path)) {
406            mkdir($path);
407        }
408        $path = HTML_REALDIR . "upload/mobile_image";
409        if (!file_exists($path)) {
410            mkdir($path);
411        }
412        $path = DATA_REALDIR . "downloads/module";
413        if (!file_exists($path)) {
414            mkdir($path);
415        }
416        $path = DATA_REALDIR . "downloads/update";
417        if (!file_exists($path)) {
418            mkdir($path);
419        }
420        $path = DATA_REALDIR . "upload/csv";
421        if (!file_exists($path)) {
422            mkdir($path);
423        }
424        $mess.= ">> ○:アクセス権限は正常です。";
425    }
426
427    $objPage->mess = $mess;
428    $objPage->hasErr = $hasErr;
429
430    return $objPage;
431}
432
433// STEP0_1画面の表示(ファイルのコピー)
434function lfDispStep0_1($objPage) {
435    global $objWebParam;
436    global $objDBParam;
437
438    // hiddenに入力値を保持
439    $objPage->arrHidden = $objWebParam->getHashArray();
440    // hiddenに入力値を保持
441    $objPage->arrHidden = array_merge($objPage->arrHidden, $objDBParam->getHashArray());
442    $objPage->arrHidden['db_skip'] = $_POST['db_skip'];
443    $objPage->arrHidden['agreement'] = $_POST['agreement'];
444    $objPage->tpl_mainpage = 'step0_1.tpl';
445    $objPage->tpl_mode = 'step0_1';
446    // ファイルコピー
447    $objPage->copy_mess = SC_Utils_Ex::sfCopyDir("./save_image/", HTML_REALDIR . "upload/save_image/", $objPage->copy_mess);
448    return $objPage;
449}
450
451function lfGetFileMode($path) {
452    $mode = substr(sprintf('%o', fileperms($path)), -3);
453    return $mode;
454}
455
456// STEP1画面の表示
457function lfDispStep1($objPage) {
458    global $objDBParam;
459    // hiddenに入力値を保持
460    $objPage->arrHidden = $objDBParam->getHashArray();
461    $objPage->arrHidden['db_skip'] = $_POST['db_skip'];
462    $objPage->arrHidden['agreement'] = $_POST['agreement'];
463    $objPage->tpl_mainpage = 'step1.tpl';
464    $objPage->tpl_mode = 'step1';
465    return $objPage;
466}
467
468// STEP2画面の表示
469function lfDispStep2($objPage) {
470    global $objWebParam;
471    global $objDBParam;
472    // hiddenに入力値を保持
473    $objPage->arrHidden = $objWebParam->getHashArray();
474    $objPage->arrHidden['db_skip'] = $_POST['db_skip'];
475    $objPage->arrHidden['agreement'] = $_POST['agreement'];
476    $objPage->tpl_mainpage = 'step2.tpl';
477    $objPage->tpl_mode = 'step2';
478    return $objPage;
479}
480
481// STEP3画面の表示
482function lfDispStep3($objPage) {
483    global $objWebParam;
484    global $objDBParam;
485    // hiddenに入力値を保持
486    $objPage->arrHidden = $objWebParam->getHashArray();
487    // hiddenに入力値を保持
488    $objPage->arrHidden = array_merge($objPage->arrHidden, $objDBParam->getHashArray());
489    $objPage->arrHidden['agreement'] = $_POST['agreement'];
490    $objPage->tpl_db_skip = $_POST['db_skip'];
491    $objPage->tpl_mainpage = 'step3.tpl';
492    $objPage->tpl_mode = 'step3';
493    return $objPage;
494}
495
496// STEP4画面の表示
497function lfDispStep4($objPage) {
498    global $objWebParam;
499    global $objDBParam;
500    global $objDb;
501
502    // 設定ファイルの生成
503    lfMakeConfigFile();
504
505    // hiddenに入力値を保持
506    $objPage->arrHidden = $objWebParam->getHashArray();
507    $objPage->arrHidden = array_merge($objPage->arrHidden, $objDBParam->getHashArray());
508    // hiddenに入力値を保持
509    $objPage->arrHidden['agreement'] = $_POST['agreement'];
510
511    $normal_url = $objWebParam->getValue('normal_url');
512    // 語尾に'/'をつける
513    if (!ereg("/$", $normal_url)) $normal_url = $normal_url . "/";
514
515    $arrDbParam = $objDBParam->getHashArray();
516    if (!defined('DB_TYPE')) {
517        define('DB_TYPE', $arrDbParam['db_type']);
518    }
519    $dsn = $arrDbParam['db_type']."://".$arrDbParam['db_user'].":".$arrDbParam['db_password']."@".$arrDbParam['db_server'].":".$arrDbParam['db_port']."/".$arrDbParam['db_name'];
520    if (!defined('DEFAULT_DSN')) {
521        define('DEFAULT_DSN', $dsn);
522    }
523
524    $objPage->tpl_site_url = $normal_url;
525    $objPage->tpl_shop_name = $objWebParam->getValue('shop_name');
526    $objPage->tpl_cube_ver = ECCUBE_VERSION;
527    $objPage->tpl_php_ver = phpversion();
528    $dbFactory = SC_DB_DBFactory_Ex::getInstance($arrDbParam['db_type']);
529    $objPage->tpl_db_ver = $dbFactory->sfGetDBVersion($dsn);
530    $objPage->tpl_db_skip = $_POST['db_skip'];
531    $objPage->tpl_mainpage = 'step4.tpl';
532    $objPage->tpl_mode = 'complete';
533    return $objPage;
534}
535
536// 完了画面の表示
537function lfDispComplete($objPage) {
538    global $objWebParam;
539    global $objDBParam;
540    // hiddenに入力値を保持
541    $objPage->arrHidden = $objWebParam->getHashArray();
542    // hiddenに入力値を保持
543    $objPage->arrHidden = array_merge($objPage->arrHidden, $objDBParam->getHashArray());
544
545    // ショップマスター情報の書き込み
546    $arrRet =  $objDBParam->getHashArray();
547
548    $dsn = $arrRet['db_type']."://".$arrRet['db_user'].":".$arrRet['db_password']."@".$arrRet['db_server'].":".$arrRet['db_port']."/".$arrRet['db_name'];
549    $sqlval['shop_name'] = $objWebParam->getValue('shop_name');
550    $sqlval['email01'] = $objWebParam->getValue('admin_mail');
551    $sqlval['email02'] = $objWebParam->getValue('admin_mail');
552    $sqlval['email03'] = $objWebParam->getValue('admin_mail');
553    $sqlval['email04'] = $objWebParam->getValue('admin_mail');
554    $sqlval['email05'] = $objWebParam->getValue('admin_mail');
555    $sqlval['top_tpl'] = 'default1';
556    $sqlval['product_tpl'] = 'default1';
557    $sqlval['detail_tpl'] = 'default1';
558    $sqlval['mypage_tpl'] = 'default1';
559    $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
560    $objQuery = new SC_Query($dsn);
561    $cnt = $objQuery->count('dtb_baseinfo');
562    if ($cnt > 0) {
563        $objQuery->update('dtb_baseinfo', $sqlval);
564    } else {
565        $objQuery->insert('dtb_baseinfo', $sqlval);
566    }
567
568    // 管理者登録
569    $login_id = $objWebParam->getValue('login_id');
570    $salt = SC_Utils_Ex::sfGetRandomString(10);
571    $login_pass = SC_Utils_Ex::sfGetHashString($objWebParam->getValue('login_pass'), $salt);
572
573    $arrVal = array(
574        'login_id' => $login_id,
575        'password' => $login_pass,
576        'salt' => $salt,
577        'work' => 1,
578        'del_flg' => 0,
579        'update_date' => 'CURRENT_TIMESTAMP',
580    );
581
582    $member_id = $objQuery->get('member_id', 'dtb_member', 'login_id = ? AND del_flg = 0', array($login_id));
583
584    if (strlen($member_id) == 0) {
585        $member_id = $objQuery->nextVal('dtb_member_member_id');
586        $arrVal['member_id'] = $member_id;
587        $arrVal['name'] = '管理者';
588        $arrVal['creator_id'] = 0;
589        $arrVal['authority'] = 0;
590        $arrVal['rank'] = 1;
591        $objQuery->insert('dtb_member', $arrVal);
592    } else {
593        $objQuery->update('dtb_member', $arrVal, 'member_id = ?', array($member_id));
594    }
595
596    $objPage->arrHidden['db_skip'] = $_POST['db_skip'];
597    $objPage->tpl_mainpage = 'complete.tpl';
598    $objPage->tpl_mode = 'complete';
599
600    $secure_url = $objWebParam->getValue('secure_url');
601    // 語尾に'/'をつける
602    if (!ereg("/$", $secure_url)) {
603        $secure_url = $secure_url . "/";
604    }
605    $objPage->tpl_sslurl = $secure_url;
606    //EC-CUBEオフィシャルサイトからのお知らせURL
607    $objPage->install_info_url = INSTALL_INFO_URL;
608    return $objPage;
609}
610
611// WEBパラメーター情報の初期化
612function lfInitWebParam($objWebParam) {
613    global $objDb;
614
615    if (defined('HTTP_URL')) {
616        $normal_url = HTTP_URL;
617    } else {
618        $dir = ereg_replace("install/.*$", "", $_SERVER['REQUEST_URI']);
619        $normal_url = "http://" . $_SERVER['HTTP_HOST'] . $dir;
620    }
621
622    if (defined('HTTPS_URL')) {
623        $secure_url = HTTPS_URL;
624    } else {
625        $dir = ereg_replace("install/.*$", "", $_SERVER['REQUEST_URI']);
626        $secure_url = "http://" . $_SERVER['HTTP_HOST'] . $dir;
627    }
628
629    // 店名、管理者メールアドレスを取得する。(再インストール時)
630    if (defined('DEFAULT_DSN')) {
631        $objQuery = new SC_Query();
632        $tables = $objQuery->listTables();
633
634        if (!PEAR::isError($tables) && in_array('dtb_baseinfo', $tables)) {
635            $arrRet = $objQuery->select("shop_name, email01", 'dtb_baseinfo');
636            $shop_name = $arrRet[0]['shop_name'];
637            $admin_mail = $arrRet[0]['email01'];
638        }
639    }
640
641    // 管理機能のディレクトリ名を取得(再インストール時)
642    $oldAdminDir = SC_Utils_Ex::sfTrimURL(ADMIN_DIR);
643
644    if (defined('ADMIN_FORCE_SSL')) {
645        $admin_force_ssl = ADMIN_FORCE_SSL;
646    } else {
647        $admin_force_ssl = '';
648    }
649
650    if (defined('ADMIN_ALLOW_HOSTS')) {
651        $arrAllowHosts = unserialize(ADMIN_ALLOW_HOSTS);
652        $admin_allow_hosts = '';
653        foreach ($arrAllowHosts as $val) {
654            $admin_allow_hosts .= $val . "\n";
655        }
656
657    } else {
658        $admin_allow_hosts = '';
659    }
660
661    $objWebParam->addParam("店名", 'shop_name', MTEXT_LEN, "", array('EXIST_CHECK','MAX_LENGTH_CHECK'), $shop_name);
662    $objWebParam->addParam("管理者:メールアドレス", 'admin_mail', null, "", array('EXIST_CHECK','EMAIL_CHECK','EMAIL_CHAR_CHECK'), $admin_mail);
663    $objWebParam->addParam("管理者:ログインID", 'login_id', ID_MAX_LEN, "", array('EXIST_CHECK','SPTAB_CHECK', 'ALNUM_CHECK'));
664    $objWebParam->addParam("管理者:パスワード", 'login_pass', ID_MAX_LEN, "", array('EXIST_CHECK','SPTAB_CHECK', 'ALNUM_CHECK'));
665    $objWebParam->addParam("管理機能:ディレクトリ", 'admin_dir', ID_MAX_LEN, 'a', array('EXIST_CHECK','SPTAB_CHECK', 'ALNUM_CHECK'), $oldAdminDir);
666    $objWebParam->addParam("管理機能:SSL制限", 'admin_force_ssl', 1, 'n', array('SPTAB_CHECK', 'NUM_CHECK','MAX_LENGTH_CHECK'), $admin_force_ssl);
667    $objWebParam->addParam("管理機能:IP制限", 'admin_allow_hosts', LTEXT_LEN, 'an', array('IP_CHECK','MAX_LENGTH_CHECK'), $admin_allow_hosts);
668    $objWebParam->addParam("URL(通常)", 'normal_url', MTEXT_LEN, "", array('EXIST_CHECK','URL_CHECK','MAX_LENGTH_CHECK'), $normal_url);
669    $objWebParam->addParam("URL(セキュア)", 'secure_url', MTEXT_LEN, "", array('EXIST_CHECK','URL_CHECK','MAX_LENGTH_CHECK'), $secure_url);
670    $objWebParam->addParam("ドメイン", 'domain', MTEXT_LEN, "", array('MAX_LENGTH_CHECK'));
671
672    return $objWebParam;
673}
674
675// DBパラメーター情報の初期化
676function lfInitDBParam($objDBParam) {
677
678    if (defined('DB_SERVER')) {
679        $db_server = DB_SERVER;
680    } else {
681        $db_server = "127.0.0.1";
682    }
683
684    if (defined('DB_TYPE')) {
685        $db_type = DB_TYPE;
686    } else {
687        $db_type = "";
688    }
689
690    if (defined('DB_PORT')) {
691        $db_port = DB_PORT;
692    } else {
693        $db_port = "";
694    }
695
696    if (defined('DB_NAME')) {
697        $db_name = DB_NAME;
698    } else {
699        $db_name = 'eccube_db';
700    }
701
702    if (defined('DB_USER')) {
703        $db_user = DB_USER;
704    } else {
705        $db_user = 'eccube_db_user';
706    }
707
708    $objDBParam->addParam("DBの種類", 'db_type', INT_LEN, "", array('EXIST_CHECK','MAX_LENGTH_CHECK'), $db_type);
709    $objDBParam->addParam("DBサーバー", 'db_server', MTEXT_LEN, "", array('EXIST_CHECK','MAX_LENGTH_CHECK'), $db_server);
710    $objDBParam->addParam("DBポート", 'db_port', INT_LEN, "", array('MAX_LENGTH_CHECK'), $db_port);
711    $objDBParam->addParam("DB名", 'db_name', MTEXT_LEN, "", array('EXIST_CHECK','MAX_LENGTH_CHECK'), $db_name);
712    $objDBParam->addParam("DBユーザ", 'db_user', MTEXT_LEN, "", array('EXIST_CHECK','MAX_LENGTH_CHECK'), $db_user);
713    $objDBParam->addParam("DBパスワード", 'db_password', MTEXT_LEN, "", array('EXIST_CHECK','MAX_LENGTH_CHECK'));
714
715    return $objDBParam;
716}
717
718// 入力内容のチェック
719function lfCheckWebError($objFormParam) {
720    // 入力データを渡す。
721    $arrRet =  $objFormParam->getHashArray();
722    $objErr = new SC_CheckError($arrRet);
723    $objErr->arrErr = $objFormParam->checkError();
724
725    // ディレクトリ名のみ取得する
726    $normal_dir = ereg_replace("^https?://[a-zA-Z0-9_~=&\?\.\-]+", "", $arrRet['normal_url']);
727    $secure_dir = ereg_replace("^https?://[a-zA-Z0-9_~=&\?\.\-]+", "", $arrRet['secure_url']);
728
729    if ($normal_dir != $secure_dir) {
730        $objErr->arrErr['normal_url'] = "※ URLに異なる階層を指定することはできません。";
731        $objErr->arrErr['secure_url'] = "※ URLに異なる階層を指定することはできません。";
732    }
733
734    // ログインIDチェック
735    $objErr->doFunc(array("管理者:ログインID",'login_id',ID_MIN_LEN , ID_MAX_LEN) ,array('SPTAB_CHECK' ,'NUM_RANGE_CHECK'));
736
737    // パスワードのチェック
738    $objErr->doFunc( array("管理者:パスワード",'login_pass',ID_MIN_LEN , ID_MAX_LEN) ,array('SPTAB_CHECK' ,'NUM_RANGE_CHECK'));
739
740    // 管理機能ディレクトリのチェック
741    $objErr->doFunc( array("管理機能:ディレクトリ", 'admin_dir', ID_MIN_LEN, ID_MAX_LEN), array('SPTAB_CHECK' ,'NUM_RANGE_CHECK'));
742
743    $oldAdminDir = SC_Utils_Ex::sfTrimURL(ADMIN_DIR);
744    $newAdminDir = $objFormParam->getValue('admin_dir');
745    if ($oldAdminDir !== $newAdminDir AND file_exists(HTML_REALDIR . $newAdminDir) and $newAdminDir != 'admin') {
746        $objErr->arrErr['admin_dir'] = "※ 指定した管理機能ディレクトリは既に存在しています。別の名前を指定してください。";
747    }
748
749    return $objErr->arrErr;
750}
751
752// 入力内容のチェック
753function lfCheckDBError($objFormParam) {
754    global $objPage;
755
756    // 入力データを渡す。
757    $arrRet =  $objFormParam->getHashArray();
758
759    $objErr = new SC_CheckError($arrRet);
760    $objErr->arrErr = $objFormParam->checkError();
761
762    if (count($objErr->arrErr) == 0) {
763        if (!defined('DB_TYPE')) {
764            define('DB_TYPE', $arrRet['db_type']);
765        }
766        // 接続確認
767        $dsn = $arrRet['db_type']."://".$arrRet['db_user'].":".$arrRet['db_password']."@".$arrRet['db_server'].":".$arrRet['db_port']."/".$arrRet['db_name'];
768        // Debugモード指定
769        $options['debug'] = PEAR_DB_DEBUG;
770        $objDB = MDB2::connect($dsn, $options);
771        // 接続成功
772        if (!PEAR::isError($objDB)) {
773            $dbFactory = SC_DB_DBFactory_Ex::getInstance($arrRet['db_type']);
774            // データベースバージョン情報の取得
775            $objPage->tpl_db_version = $dbFactory->sfGetDBVersion($dsn);
776        } else {
777            $objErr->arrErr['all'] = ">> " . $objDB->message . "<br />";
778            // エラー文を取得する
779            ereg("\[(.*)\]", $objDB->userinfo, $arrKey);
780            $objErr->arrErr['all'].= $arrKey[0] . "<br />";
781            GC_Utils_Ex::gfPrintLog($objDB->userinfo, INSTALL_LOG);
782        }
783    }
784    return $objErr->arrErr;
785}
786
787// SQL文の実行
788function lfExecuteSQL($filepath, $dsn, $disp_err = true) {
789    $arrErr = array();
790
791    if (!file_exists($filepath)) {
792        $arrErr['all'] = ">> スクリプトファイルが見つかりません";
793    } else {
794        if ($fp = fopen($filepath,'r')) {
795            $sql = fread($fp, filesize($filepath));
796            fclose($fp);
797        }
798        // Debugモード指定
799        $options['debug'] = PEAR_DB_DEBUG;
800        $objDB = MDB2::connect($dsn, $options);
801        // 接続エラー
802        if (!PEAR::isError($objDB)) {
803            $objDB->setCharset('utf8');
804            $sql_split = split(";",$sql);
805            foreach ($sql_split as $key => $val) {
806                SC_Utils::sfFlush(true);
807                if (trim($val) != "") {
808                    $ret = $objDB->query($val);
809                    if (PEAR::isError($ret) && $disp_err) {
810                        $arrErr['all'] = ">> " . $ret->message . "<br />";
811                        // エラー文を取得する
812                        ereg("\[(.*)\]", $ret->userinfo, $arrKey);
813                        $arrErr['all'].= $arrKey[0] . "<br />";
814                        $objPage->update_mess.=">> テーブル構成の変更に失敗しました。<br />";
815                        GC_Utils_Ex::gfPrintLog($ret->userinfo, INSTALL_LOG);
816                        break;
817                    } else {
818                        GC_Utils_Ex::gfPrintLog("OK:". $val, INSTALL_LOG);
819                    }
820                }
821            }
822        } else {
823            $arrErr['all'] = ">> " . $objDB->message;
824            GC_Utils_Ex::gfPrintLog($objDB->userinfo, INSTALL_LOG);
825        }
826    }
827    return $arrErr;
828}
829
830/**
831 * シーケンスを削除する.
832 *
833 * @param array $arrSequences シーケンスのテーブル名, カラム名の配列
834 * @param string $dsn データソース名
835 * @return array エラーが発生した場合はエラーメッセージの配列
836 */
837function lfDropSequence($arrSequences, $dsn) {
838    $arrErr = array();
839
840    // Debugモード指定
841    $options['debug'] = PEAR_DB_DEBUG;
842    $objDB = MDB2::connect($dsn, $options);
843    $objManager =& $objDB->loadModule('Manager');
844
845    // 接続エラー
846    if (!PEAR::isError($objDB)) {
847
848        $exists = $objManager->listSequences();
849        foreach ($arrSequences as $seq) {
850            SC_Utils::sfFlush(true);
851            $seq_name = $seq[0] . '_' . $seq[1];
852            if (in_array($seq_name, $exists)) {
853                $result = $objManager->dropSequence($seq_name);
854                if (PEAR::isError($result)) {
855                    $arrErr['all'] = ">> " . $result->message . "<br />";
856                    GC_Utils_Ex::gfPrintLog($result->userinfo, INSTALL_LOG);
857                } else {
858                    GC_Utils_Ex::gfPrintLog("OK:". $seq_name, INSTALL_LOG);
859                }
860            }
861        }
862    } else {
863        $arrErr['all'] = ">> " . $objDB->message;
864        GC_Utils_Ex::gfPrintLog($objDB->userinfo, INSTALL_LOG);
865    }
866    return $arrErr;
867}
868
869/**
870 * シーケンスを生成する.
871 *
872 * @param array $arrSequences シーケンスのテーブル名, カラム名の配列
873 * @param string $dsn データソース名
874 * @return array エラーが発生した場合はエラーメッセージの配列
875 */
876function lfCreateSequence($arrSequences, $dsn) {
877   $arrErr = array();
878
879    // Debugモード指定
880    $options['debug'] = PEAR_DB_DEBUG;
881    $objDB = MDB2::connect($dsn, $options);
882    $objManager =& $objDB->loadModule('Manager');
883
884    // 接続エラー
885    if (!PEAR::isError($objDB)) {
886
887        $exists = $objManager->listSequences();
888        foreach ($arrSequences as $seq) {
889            SC_Utils::sfFlush(true);
890            $res = $objDB->query("SELECT max(" . $seq[1] . ") FROM ". $seq[0]);
891            if (PEAR::isError($res)) {
892                $arrErr['all'] = ">> " . $res->userinfo . "<br />";
893                GC_Utils_Ex::gfPrintLog($res->userinfo, INSTALL_LOG);
894                return $arrErr;
895            }
896            $max = $res->fetchOne();
897
898            $seq_name = $seq[0] . '_' . $seq[1];
899            $result = $objManager->createSequence($seq_name, $max + 1);
900            if (PEAR::isError($result)) {
901                $arrErr['all'] = ">> " . $result->message . "<br />";
902                GC_Utils_Ex::gfPrintLog($result->userinfo, INSTALL_LOG);
903            } else {
904                GC_Utils_Ex::gfPrintLog("OK:". $seq_name, INSTALL_LOG);
905            }
906        }
907    } else {
908        $arrErr['all'] = ">> " . $objDB->message;
909        GC_Utils_Ex::gfPrintLog($objDB->userinfo, INSTALL_LOG);
910    }
911    return $arrErr;
912}
913
914// 設定ファイルの作成
915function lfMakeConfigFile() {
916    global $objWebParam;
917    global $objDBParam;
918
919    $normal_url = $objWebParam->getValue('normal_url');
920    // 語尾に'/'をつける
921    if (!ereg("/$", $normal_url)) {
922        $normal_url = $normal_url . "/";
923    }
924
925    $secure_url = $objWebParam->getValue('secure_url');
926    // 語尾に'/'をつける
927    if (!ereg("/$", $secure_url)) {
928        $secure_url = $secure_url . "/";
929    }
930
931    // ディレクトリの取得
932    $url_dir = ereg_replace("^https?://[a-zA-Z0-9_:~=&\?\.\-]+", "", $normal_url);
933
934    //管理機能SSL制限
935    if ($objWebParam->getValue('admin_force_ssl') == 1 and strpos($secure_url,"https://") !== FALSE) {
936        $force_ssl = 'TRUE';
937    } else {
938        $force_ssl = 'FALSE';
939    }
940    //管理機能IP制限
941    $allow_hosts = array();
942    $hosts = $objWebParam->getValue('admin_allow_hosts');
943    if (!empty($hosts)) {
944        $hosts = str_replace("\r","",$hosts);
945        if (strpos($hosts,"\n") === false) {
946            $hosts .= "\n";
947        }
948        $hosts = explode("\n",$hosts);
949        foreach ($hosts as $key=>$host) {
950            $host = trim($host);
951            if (strlen($host) >= 8) {
952                $allow_hosts[] = $host;
953            }
954        }
955    }
956    //パスワード暗号化方式決定
957    $arrAlgos = hash_algos();
958    if (array_search('sha256', $arrAlgos) !== FALSE) {
959        $algos = 'sha256';
960    } elseif (array_search('sha1', $arrAlgos) !== FALSE) {
961        $algos = 'sha1';
962    } elseif (array_search('md5', $arrAlgos) !== FALSE) {
963        $algos = 'md5';
964    } else {
965        $algos = '';
966    }
967    //MAGICハッシュワード決定
968    if ($_POST['db_skip'] && defined('AUTH_MAGIC')) {
969        $auth_magic = AUTH_MAGIC;
970    } else {
971        $auth_magic = SC_Utils_Ex::sfGetRandomString(40);
972        define('AUTH_MAGIC', $auth_magic);
973    }
974
975    $config_data =
976    "<?php\n".
977    "    define ('ECCUBE_INSTALL', 'ON');\n" .
978    "    define ('HTTP_URL', '" . $normal_url . "');\n" .
979    "    define ('HTTPS_URL', '" . $secure_url . "');\n" .
980    "    define ('ROOT_URLPATH', '" . $url_dir . "');\n" .
981    "    define ('DOMAIN_NAME', '" . $objWebParam->getValue('domain') . "');\n" .
982    "    define ('DB_TYPE', '" . $objDBParam->getValue('db_type') . "');\n" .
983    "    define ('DB_USER', '" . $objDBParam->getValue('db_user') . "');\n" .
984    "    define ('DB_PASSWORD', '" . $objDBParam->getValue('db_password') . "');\n" .
985    "    define ('DB_SERVER', '" . $objDBParam->getValue('db_server') . "');\n" .
986    "    define ('DB_NAME', '" . $objDBParam->getValue('db_name') . "');\n" .
987    "    define ('DB_PORT', '" . $objDBParam->getValue('db_port') .  "');\n" .
988    "    define ('ADMIN_DIR', '" . $objWebParam->getValue('admin_dir') .  "/');\n" .
989    "    define ('ADMIN_FORCE_SSL', " . $force_ssl .  ");\n".
990    "    define ('ADMIN_ALLOW_HOSTS', '".serialize($allow_hosts)."');\n".
991    "    define ('AUTH_MAGIC', '" . $auth_magic . "');\n".
992    "    define ('PASSWORD_HASH_ALGOS', '" . $algos . "');\n".
993    "    define ('RELEASE_YEAR', '" . date('Y') . "');\n".   
994    "?>";
995
996    if ($fp = fopen(CONFIG_REALFILE, 'w')) {
997        fwrite($fp, $config_data);
998        fclose($fp);
999    }
1000}
1001
1002/**
1003 * $dir を再帰的に辿ってパス名を配列で返す.
1004 *
1005 * @param string 任意のパス名
1006 * @return array $dir より下層に存在するパス名の配列
1007 * @see http://www.php.net/glob
1008 */
1009$alldirs = array();
1010function listdirs($dir) {
1011    global $alldirs;
1012    $dirs = glob($dir . '/*');
1013    if (is_array($dirs) && count($dirs) > 0) {
1014        foreach ($dirs as $d) {
1015            $alldirs[] = $d;
1016            listdirs($d);
1017        }
1018    }
1019    return $alldirs;
1020}
1021
1022/**
1023 * 保持したスタティック変数をクリアする。
1024 */
1025function initdirs() {
1026    global $alldirs;
1027    $alldirs = array();
1028}
1029
1030/**
1031 * シーケンスを使用するテーブル名とカラム名の配列を返す.
1032 *
1033 * @return array シーケンスを使用するテーブル名とカラム名の配列
1034 */
1035function getSequences() {
1036    return array(array('dtb_best_products','best_id'),
1037                 array('dtb_bloc', 'bloc_id'),
1038                 array('dtb_category', 'category_id'),
1039                 array('dtb_class', 'class_id'),
1040                 array('dtb_classcategory', 'classcategory_id'),
1041                 array('dtb_csv', 'no'),
1042                 array('dtb_csv_sql', 'sql_id'),
1043                 array('dtb_customer', 'customer_id'),
1044                 array('dtb_deliv', 'deliv_id'),
1045                 array('dtb_holiday', 'holiday_id'),
1046                 array('dtb_kiyaku', 'kiyaku_id'),
1047                 array('dtb_mail_history', 'send_id'),
1048                 array('dtb_maker', 'maker_id'),
1049                 array('dtb_member', 'member_id'),
1050                 array('dtb_module_update_logs', 'log_id'),
1051                 array('dtb_news', 'news_id'),
1052                 array('dtb_order', 'order_id'),
1053                 array('dtb_order_detail', 'order_detail_id'),
1054                 array('dtb_other_deliv', 'other_deliv_id'),
1055                 array('dtb_pagelayout', 'page_id'),
1056                 array('dtb_payment', 'payment_id'),
1057                 array('dtb_products_class', 'product_class_id'),
1058                 array('dtb_products', 'product_id'),
1059                 array('dtb_class_combination', 'class_combination_id'),
1060                 array('dtb_review', 'review_id'),
1061                 array('dtb_send_history', 'send_id'),
1062                 array('dtb_mailmaga_template', 'template_id'));
1063}
1064
1065
1066/**
1067 * 管理機能のディレクトリ名の変更
1068 *
1069 * @param string 設定する管理機能のディレクトリ名
1070 */
1071function renameAdminDir($adminDir) {
1072    $oldAdminDir = SC_Utils_Ex::sfTrimURL(ADMIN_DIR);
1073    if ($adminDir === $oldAdminDir) {
1074        return true;
1075    }
1076    if (file_exists(HTML_REALDIR . $adminDir)) {
1077        return '※ 指定した管理機能ディレクトリは既に存在しています。別の名前を指定してください。';
1078    }
1079    if (!rename(HTML_REALDIR . $oldAdminDir, HTML_REALDIR . $adminDir)) {
1080        return '※ ' . HTML_REALDIR . $adminDir . 'へのリネームに失敗しました。ディレクトリの権限を確認してください。';
1081    }
1082    return true;
1083}
Note: See TracBrowser for help on using the repository browser.