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

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