source: branches/feature-module-update/data/class/pages/upgrade/LC_Page_Upgrade_Download.php @ 16840

Revision 16840, 9.8 KB checked in by adachi, 15 years ago (diff)

認証処理修正

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2007 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
24// {{{ requires
25require_once CLASS_PATH . 'pages/upgrade/LC_Page_Upgrade_Base.php';
26require_once DATA_PATH . 'module/Tar.php';
27
28/**
29 * オーナーズストアからダウンロードデータを取得する.
30 *
31 * TODO 要リファクタリング
32 *
33 * @package Page
34 * @author LOCKON CO.,LTD.
35 * @version $Id$
36 */
37class LC_Page_Upgrade_Download extends LC_Page_Upgrade_Base {
38
39    // }}}
40    // {{{ functions
41
42    /**
43     * Page を初期化する.
44     *
45     * @return void
46     */
47    function init() {
48        parent::init();
49    }
50
51    /**
52     * Page のプロセス.
53     *
54     * @return void
55     */
56    function process($mode) {
57        $objLog  = new LC_Upgrade_Helper_Log;
58        $objLog->start($mode);
59
60        $objJson = new LC_Upgrade_Helper_Json;
61
62        // アクセスチェック
63        $objLog->log('* auth start');
64        if ($this->isValidAccess($mode) !== true) {
65            // TODO
66            $objJson->setError(OSTORE_E_C_INVALID_ACCESS);
67            $objJson->display();
68            $objLog->error(OSTORE_E_C_INVALID_ACCESS);
69            return;
70        }
71
72        // パラメーチェック
73        $this->initParam();
74        $objLog->log('* post param check start');
75        if ($this->objForm->checkError()) {
76            // TODO
77            $objJson->setError(OSTORE_E_C_INVALID_PARAM);
78            $objJson->display();
79            $objLog->error(OSTORE_E_C_INVALID_PARAM, $_POST);
80            return;
81        }
82
83        if ($mode == 'auto_update'
84        && $this->autoUpdateEnable($this->objForm->getValue('product_id')) !== true) {
85            // TODO
86            $objJson->setError(OSTORE_E_C_AUTOUP_DISABLE);
87            $objJson->display();
88            $objLog->error(OSTORE_E_C_INVALID_PARAM, $_POST);
89            return;
90        }
91
92        // TODO CSRF対策
93
94        // 認証キーの取得
95        $public_key = $this->getPublicKey();
96        $sha1_key = $this->createSeed();
97
98        // 認証キーチェック
99        $objLog->log('* public key check start');
100        if (empty($public_key)) {
101            $objJson->setError(OSTORE_E_C_NO_KEY);
102            $objJson->display();
103            $objLog->error(OSTORE_E_C_NO_KEY);
104            return;
105        }
106
107        // リクエストを開始
108        $objLog->log('* http request start');
109        $arrPostData = array(
110            'eccube_url' => SITE_URL,
111            'public_key' => sha1($public_key . $sha1_key),
112            'sha1_key'   => $sha1_key,
113            'product_id' => $this->objForm->getValue('product_id')
114        );
115        $objReq = $this->request('download', $arrPostData);
116
117        // リクエストチェック
118        $objLog->log('* http request check start');
119        if (PEAR::isError($objReq)) {
120            $objJson->setError(OSTORE_E_C_HTTP_REQ);
121            $objJson->display();
122            $objLogerr(OSTORE_E_C_HTTP_REQ, $objReq);
123            return;
124        }
125
126        // レスポンスチェック
127        $objLog->log('* http response check start');
128        if ($objReq->getResponseCode() !== 200) {
129            $objJson->setError(OSTORE_E_C_HTTP_RESP);
130            $objJson->display();
131            $objLog->error(OSTORE_E_C_HTTP_RESP, $objReq);
132            return;
133        }
134
135        $body = $objReq->getResponseBody();
136        $objRet = $objJson->decode($body);
137
138        // JSONデータのチェック
139        $objLog->log('* json deta check start');
140        if (empty($objRet)) {
141            $objJson->setError(OSTORE_E_C_FAILED_JSON_PARSE);
142            $objJson->display();
143            $objLog->error(OSTORE_E_C_FAILED_JSON_PARSE, $objReq);
144            return;
145        }
146
147        // ダウンロードデータの保存
148        if ($objRet->status === OSTORE_STATUS_SUCCESS) {
149            $objLog->log('* save file start');
150            $time = time();
151            $dir  = DATA_PATH . 'downloads/tmp/';
152            $filename = $time . '.tar.gz';
153
154            $data = base64_decode($objRet->dl_file);
155
156            $objLog->log("* open ${filename} start");
157            if ($fp = fopen($dir . $filename, "w")) {
158                fwrite($fp, $data);
159                fclose($fp);
160            } else {
161                $objJson->setError(OSTORE_E_C_FILE_WRITE);
162                $objJson->display();
163                $objLog->error(OSTORE_E_C_FILE_WRITE, $objReq);
164                return;
165            }
166
167            // ダウンロードアーカイブを展開する
168            $exract_dir = $dir . $time;
169            $objLog->log("* mkdir ${exract_dir} start");
170            if (!@mkdir($exract_dir)) {
171                $objJson->setError(OSTORE_E_C_MKDIR);
172                $objJson->display();
173                $objLog->error(OSTORE_E_C_MKDIR, $objReq);
174                return;
175            }
176
177            $objLog->log("* extract ${dir}${filename} start");
178            $tar = new Archive_Tar($dir . $filename);
179            $tar->extract($exract_dir);
180
181            $objLog->log("* copy batch start");
182            @include_once CLASS_PATH . 'batch/SC_Batch_Update.php';
183            $objBatch = new SC_Batch_Update();
184            $arrCopyLog = $objBatch->execute($exract_dir);
185
186            // テーブルの更新
187            $objLog->log("* insert/update dtb_module start");
188            $this->updateMdlTable($objRet->data);
189
190            // 配信サーバへ通知
191            $objLog->log("* notify to lockon server start");
192            $objReq = $this->notifyDownload($objReq->getResponseCookies());
193
194            $objLog->log('* dl commi result:' . serialize($objReq));
195
196            $objJson->setSUCCESS(array(), 'インストール/アップデートに成功しました。');
197            $objJson->display();
198            $objLog->end();
199            return;
200        } else {
201            // 配信サーバ側でエラーを補足
202            echo $body;
203            $objLog->error($objRet->errcode, $objReq);
204            return;
205        }
206    }
207
208    /**
209     * デストラクタ
210     *
211     * @return void
212     */
213    function destroy() {
214        parent::destroy();
215    }
216
217    function initParam() {
218        $this->objForm = new SC_FormParam();
219        $this->objForm->addParam(
220            'product_id', 'product_id', INT_LEN, '', array('EXIST_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK')
221        );
222        $this->objForm->setParam($_POST);
223    }
224
225    /**
226     * dtb_moduleを更新する
227     *
228     * @param object $objRet
229     */
230    function updateMdlTable($objRet) {
231        $table = 'dtb_module';
232        $where = 'module_id = ?';
233        $objQuery = new SC_Query;
234
235        $count = $objQuery->count($table, $where, array($objRet->product_id));
236        if ($count) {
237            $arrUpdate = array(
238                'module_name' => $objRet->product_code,
239                'update_date' => 'NOW()'
240            );
241            $objQuery->update($table, $arrUpdate ,$where, array($objRet->product_id));
242        } else {
243            $arrInsert = array(
244                'module_id' => $objRet->product_id,
245                'module_name' => $objRet->product_code,
246                //'sub_data' => $objRet->sub_data,
247                'auto_update_flg' => '0',
248                'create_date'     => 'NOW()',
249                'update_date' => 'NOW()'
250            );
251            $objQuery->insert($table, $arrInsert);
252        }
253    }
254
255    /**
256     * 配信サーバへダウンロード完了を通知する.
257     *
258     * FIXME エラーコード追加
259     * @param array #arrCookies Cookie配列
260     * @retrun
261     */
262    function notifyDownload($arrCookies) {
263        $objReq = $this->request('download_commit', array(), $arrCookies);
264        return $objReq;
265    }
266
267    /**
268     * アクセスチェック
269     *
270     * @return boolean
271     */
272    function isValidAccess($mode) {
273        $objLog = new LC_Upgrade_Helper_Log;
274        switch ($mode) {
275        case 'download':
276            if ($this->isLoggedInAdminPage() === true) {
277                $objLog->log('* admin login ok');
278                return true;
279            }
280            break;
281        case 'auto_update':
282            $objForm = new SC_FormParam;
283            $objForm->addParam('public_key', 'public_key', MTEXT_LEN, '', array('EXIST_CHECK', 'ALNUM_CHECK', 'MAX_LENGTH_CHECK'));
284            $objForm->addParam('sha1_key', 'sha1_key', MTEXT_LEN, '', array('EXIST_CHECK', 'ALNUM_CHECK', 'MAX_LENGTH_CHECK'));
285            $objForm->setParam($_POST);
286
287            if ($objForm->CheckError()) {
288                $objLog->log('* invalid param');
289                return false;
290            }
291
292            $public_key = $this->getPublicKey();
293            if (empty($public_key)) {
294                $objLog->log('* public_key not found');
295                return false;
296            }
297
298            $sha1_key = $objForm->getValue('sha1_key');
299            $public_key_sha1 = $objForm->getValue('public_key');
300
301            if ($this->isValidIP()
302            && $public_key_sha1 === sha1($public_key . $sha1_key)) {
303                $objLog->log('* auto update login ok');
304                return true;
305            }
306            break;
307        default:
308            $objLog->log('* mode invalid ' . $mode);
309            return false;
310        }
311        return false;
312    }
313}
314?>
Note: See TracBrowser for help on using the repository browser.