source: branches/version-2_13_1/data/class/pages/admin/contents/LC_Page_Admin_Contents_FileManager.php @ 23269

Revision 23269, 18.4 KB checked in by michael_nelson, 8 years ago (diff)

#2441 コンテンツ管理 -> ファイル管理 のファイル指定処理が不正 の修正

  • 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-2013 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
24require_once CLASS_EX_REALDIR . 'page_extends/admin/LC_Page_Admin_Ex.php';
25
26/**
27 * ファイル管理 のページクラス.
28 *
29 * @package Page
30 * @author LOCKON CO.,LTD.
31 * @version $Id$
32 */
33class LC_Page_Admin_Contents_FileManager extends LC_Page_Admin_Ex
34{
35    /**
36     * Page を初期化する.
37     *
38     * @return void
39     */
40    public function init()
41    {
42        parent::init();
43        $this->tpl_mainpage = 'contents/file_manager.tpl';
44        $this->tpl_mainno = 'contents';
45        $this->tpl_subno = 'file';
46        $this->tpl_maintitle = 'コンテンツ管理';
47        $this->tpl_subtitle = 'ファイル管理';
48    }
49
50    /**
51     * Page のプロセス.
52     *
53     * @return void
54     */
55    public function process()
56    {
57        $this->action();
58        $this->sendResponse();
59    }
60
61    /**
62     * Page のアクション.
63     *
64     * @return void
65     */
66    public function action()
67    {
68        // フォーム操作クラス
69        $objFormParam = new SC_FormParam_Ex();
70        // パラメーター情報の初期化
71        $this->lfInitParam($objFormParam);
72        $objFormParam->setParam($this->createSetParam($_POST));
73        $objFormParam->convParam();
74
75        // ファイル管理クラス
76        $objUpFile = new SC_UploadFile_Ex($objFormParam->getValue('now_dir'), $objFormParam->getValue('now_dir'));
77        // ファイル情報の初期化
78        $this->lfInitFile($objUpFile);
79
80        // ファイル操作クラス
81        $objFileManager = new SC_Helper_FileManager_Ex();
82
83        switch ($this->getMode()) {
84            // フォルダ移動
85            case 'move':
86                $objFormParam = new SC_FormParam_Ex();
87                $this->lfInitParamModeMove($objFormParam);
88                $objFormParam->setParam($this->createSetParam($_POST));
89                $objFormParam->convParam();
90
91                $this->arrErr = $objFormParam->checkError();
92                if (SC_Utils_Ex::isBlank($this->arrErr)) {
93                    $now_dir = $this->lfCheckSelectDir($objFormParam, $objFormParam->getValue('tree_select_file'));
94                    $objFormParam->setValue('now_dir', $now_dir);
95                }
96                break;
97
98            // ファイル表示
99            case 'view':
100                $objFormParam = new SC_FormParam_Ex();
101                $this->lfInitParamModeView($objFormParam);
102                $objFormParam->setParam($this->createSetParam($_POST));
103                $objFormParam->convParam();
104
105                $this->arrErr = $objFormParam->checkError();
106                if (SC_Utils_Ex::isBlank($this->arrErr)) {
107                    if ($this->tryView($objFormParam)) {
108                        $pattern = '/' . preg_quote($objFormParam->getValue('top_dir'), '/') . '/';
109                        $file_url = htmlspecialchars(preg_replace($pattern, '', $objFormParam->getValue('select_file')));
110                        $tpl_onload = "eccube.openWindow('./file_view.php?file=". $file_url ."', 'user_data', '600', '400');";
111                        $this->setTplOnLoad($tpl_onload);
112                    }
113                }
114                break;
115
116            // ファイルダウンロード
117            case 'download':
118                $objFormParam = new SC_FormParam_Ex();
119                $this->lfInitParamModeView($objFormParam);
120                $objFormParam->setParam($this->createSetParam($_POST));
121                $objFormParam->convParam();
122
123                $this->arrErr = $objFormParam->checkError();
124                if (SC_Utils_Ex::isBlank($this->arrErr)) {
125                    if (is_dir($objFormParam->getValue('select_file'))) {
126                        $disp_error = '※ ディレクトリをダウンロードすることは出来ません。<br/>';
127                        $this->setDispError('select_file', $disp_error);
128                    } else {
129                       $path_exists = SC_Utils::checkFileExistsWithInBasePath($objFormParam->getValue('select_file'),USER_REALDIR);
130                       if ($path_exists) {
131                         // ファイルダウンロード
132                         $objFileManager->sfDownloadFile($objFormParam->getValue('select_file'));
133                         SC_Response_Ex::actionExit();
134                      }
135                  }
136                }
137                break;
138            // ファイル削除
139            case 'delete':
140                $objFormParam = new SC_FormParam_Ex();
141                $this->lfInitParamModeView($objFormParam);
142                $objFormParam->setParam($this->createSetParam($_POST));
143                $objFormParam->convParam();
144                $this->arrErr = $objFormParam->checkError();
145                $path_exists = SC_Utils::checkFileExistsWithInBasePath($objFormParam->getValue('select_file'),USER_REALDIR);
146                if (SC_Utils_Ex::isBlank($this->arrErr) && ($path_exists)) {
147                    $objFileManager->deleteFile($objFormParam->getValue('select_file'));
148                }
149                break;
150            // ファイル作成
151            case 'create':
152                $objFormParam = new SC_FormParam_Ex();
153                $this->lfInitParamModeCreate($objFormParam);
154                $objFormParam->setParam($this->createSetParam($_POST));
155                $objFormParam->convParam();
156
157                $this->arrErr = $objFormParam->checkError();
158                if (SC_Utils_Ex::isBlank($this->arrErr)) {
159                    if (!$this->tryCreateDir($objFileManager, $objFormParam)) {
160                        $disp_error = '※ '.htmlspecialchars($objFormParam->getValue('create_file'), ENT_QUOTES).'の作成に失敗しました。<br/>';
161                        $this->setDispError('create_file', $disp_error);
162                    } else {
163                        $tpl_onload = "alert('フォルダを作成しました。');";
164                        $this->setTplOnLoad($tpl_onload);
165                    }
166                }
167                break;
168            // ファイルアップロード
169            case 'upload':
170                // 画像保存処理
171                $ret = $objUpFile->makeTempFile('upload_file', false);
172                if (SC_Utils_Ex::isBlank($ret)) {
173                    $tpl_onload = "alert('ファイルをアップロードしました。');";
174                    $this->setTplOnLoad($tpl_onload);
175                } else {
176                    $this->setDispError('upload_file', $ret);
177                }
178                break;
179            // 初期表示
180            default:
181                break;
182        }
183
184        // 値をテンプレートに渡す
185        $this->arrParam = $objFormParam->getHashArray();
186        // 現在の階層がルートディレクトリかどうかテンプレートに渡す
187        $this->setIsTopDir($objFormParam);
188        // 現在の階層より一つ上の階層をテンプレートに渡す
189        $this->setParentDir($objFormParam);
190        // 現在いる階層(表示用)をテンプレートに渡す
191        $this->setDispPath($objFormParam);
192        // 現在のディレクトリ配下のファイル一覧を取得
193        $this->arrFileList = $objFileManager->sfGetFileList($objFormParam->getValue('now_dir'));
194        // 現在の階層のディレクトリをテンプレートに渡す
195        $this->setDispParam('tpl_now_file', $objFormParam->getValue('now_dir'));
196        // ディレクトリツリー表示
197        $this->setDispTree($objFileManager, $objFormParam);
198    }
199
200    /**
201     * 初期化を行う.
202     *
203     * @param  SC_FormParam $objFormParam SC_FormParamインスタンス
204     * @return void
205     */
206    public function lfInitParam(&$objFormParam)
207    {
208        // 共通定義
209        $this->lfInitParamCommon($objFormParam);
210    }
211
212    /**
213     * ディレクトリ移動時、パラメーター定義
214     *
215     * @param  SC_FormParam $objFormParam SC_FormParam インスタンス
216     * @return void
217     */
218    public function lfInitParamModeMove(&$objFormParam)
219    {
220        // 共通定義
221        $this->lfInitParamCommon($objFormParam);
222        $objFormParam->addParam('選択ファイル', 'select_file', MTEXT_LEN, 'a', array());
223    }
224
225    /**
226     * ファイル表示時、パラメーター定義
227     *
228     * @param  SC_FormParam $objFormParam SC_FormParam インスタンス
229     * @return void
230     */
231    public function lfInitParamModeView(&$objFormParam)
232    {
233        // 共通定義
234        $this->lfInitParamCommon($objFormParam);
235        $objFormParam->addParam('選択ファイル', 'select_file', MTEXT_LEN, 'a', array('SELECT_CHECK'));
236    }
237
238    /**
239     * ファイル表示時、パラメーター定義
240     *
241     * @param  SC_FormParam $objFormParam SC_FormParam インスタンス
242     * @return void
243     */
244    public function lfInitParamModeCreate(&$objFormParam)
245    {
246        // 共通定義
247        $this->lfInitParamCommon($objFormParam);
248        $objFormParam->addParam('選択ファイル', 'select_file', MTEXT_LEN, 'a', array());
249        $objFormParam->addParam('作成ファイル名', 'create_file', MTEXT_LEN, 'a', array('EXIST_CHECK', 'FILE_NAME_CHECK_BY_NOUPLOAD'));
250    }
251
252    /**
253     * ファイル表示時、パラメーター定義
254     *
255     * @param  SC_FormParam $objFormParam SC_FormParam インスタンス
256     * @return void
257     */
258    public function lfInitParamCommon(&$objFormParam)
259    {
260        $objFormParam->addParam('ルートディレクトリ', 'top_dir', MTEXT_LEN, 'a', array());
261        $objFormParam->addParam('現在の階層ディレクトリ', 'now_dir', MTEXT_LEN, 'a', array());
262        $objFormParam->addParam('現在の階層ファイル', 'now_file', MTEXT_LEN, 'a', array());
263        $objFormParam->addParam('ツリー選択状態', 'tree_status', MTEXT_LEN, 'a', array());
264        $objFormParam->addParam('ツリー選択ディレクトリ', 'tree_select_file', MTEXT_LEN, 'a', array());
265    }
266
267    /*
268     * ファイル情報の初期化
269     *
270     * @param  object $objUpFile SC_UploadFileインスタンス
271     * @return void
272     */
273    public function lfInitFile(&$objUpFile)
274    {
275        $objUpFile->addFile('ファイル', 'upload_file', array(), FILE_SIZE, true, 0, 0, false);
276    }
277
278    /**
279     * テンプレートに渡す値を整形する
280     *
281     * @param  array $arrVal $_POST
282     * @return array $setParam テンプレートに渡す値
283     */
284    public function createSetParam($arrVal)
285    {
286        $setParam = $arrVal;
287        // Windowsの場合は, ディレクトリの区切り文字を\から/に変換する
288        $setParam['top_dir'] = (strpos(PHP_OS, 'WIN') === false) ? USER_REALDIR : str_replace('\\', '/', USER_REALDIR);
289        // 初期表示はルートディレクトリ(user_data/)を表示
290        if (SC_Utils_Ex::isBlank($this->getMode())) {
291            $setParam['now_dir'] = $setParam['top_dir'];
292        }
293
294        return $setParam;
295    }
296
297    /**
298     * テンプレートに値を渡す
299     *
300     * @param  string $key キー名
301     * @param  string $val 値
302     * @return void
303     */
304    public function setDispParam($key, $val)
305    {
306        $this->$key = $val;
307    }
308
309    /**
310     * ディレクトリを作成
311     *
312     * @param  object       $objFileManager SC_Helper_FileManager_Exインスタンス
313     * @param  SC_FormParam $objFormParam   SC_FormParamインスタンス
314     * @return boolean      ディレクトリ作成できたかどうか
315     */
316    public function tryCreateDir($objFileManager, $objFormParam)
317    {
318        $create_dir_flg = false;
319        $create_dir = rtrim($objFormParam->getValue('now_dir'), '/');
320        // ファイル作成
321        if ($objFileManager->sfCreateFile($create_dir.'/'.$objFormParam->getValue('create_file'), 0755)) {
322            $create_dir_flg = true;
323        }
324
325        return $create_dir_flg;
326    }
327
328    /**
329     * ファイル表示を行う
330     *
331     * @param  SC_FormParam $objFormParam SC_FormParamインスタンス
332     * @return boolean      ファイル表示するかどうか
333     */
334    public function tryView(&$objFormParam)
335    {
336        $view_flg = false;
337        $now_dir = $this->lfCheckSelectDir($objFormParam, dirname($objFormParam->getValue('select_file')));
338        $objFormParam->setValue('now_dir', $now_dir);
339        if (!strpos($objFormParam->getValue('select_file'), $objFormParam->getValue('top_dir'))) {
340            $view_flg = true;
341        }
342
343        return $view_flg;
344    }
345
346    /**
347     * 現在の階層の一つ上の階層のディレクトリをテンプレートに渡す
348     *
349     * @param  SC_FormParam $objFormParam SC_FormParamインスタンス
350     * @return void
351     */
352    public function setParentDir($objFormParam)
353    {
354        $parent_dir = $this->lfGetParentDir($objFormParam->getValue('now_dir'));
355        $this->setDispParam('tpl_parent_dir', $parent_dir);
356    }
357
358    /**
359     * 現在の階層のパスをテンプレートに渡す
360     *
361     * @param  SC_FormParam $objFormParam SC_FormParamインスタンス
362     * @return void
363     */
364    public function setDispPath($objFormParam)
365    {
366        // Windows 環境で DIRECTORY_SEPARATOR が JavaScript に渡るとエスケープ文字と勘違いするので置換
367        $html_realdir = str_replace(DIRECTORY_SEPARATOR, '/', HTML_REALDIR);
368        $arrNowDir = preg_split('/\//', str_replace($html_realdir, '', $objFormParam->getValue('now_dir')));
369        $this->setDispParam('tpl_now_dir', SC_Utils_Ex::jsonEncode($arrNowDir));
370        $this->setDispParam('tpl_file_path', $html_realdir);
371    }
372
373    /**
374     * エラーを表示用の配列に格納
375     *
376     * @param  string $key   キー名
377     * @param  string $value エラー内容
378     * @return void
379     */
380    public function setDispError($key, $value)
381    {
382        // 既にエラーがある場合は、処理しない
383        if (SC_Utils_Ex::isBlank($this->arrErr[$key])) {
384            $this->arrErr[$key] = $value;
385        }
386    }
387
388    /**
389     * javascriptをテンプレートに渡す
390     *
391     * @param  string $tpl_onload javascript
392     * @return void
393     */
394    public function setTplOnLoad($tpl_onload)
395    {
396        $this->tpl_onload .= $tpl_onload;
397    }
398
399    /*
400     * 選択ディレクトリがUSER_REALDIR以下かチェック
401     *
402     * @param  object $objFormParam SC_FormParamインスタンス
403     * @param  string $dir          ディレクトリ
404     * @return string $select_dir 選択ディレクトリ
405     */
406    public function lfCheckSelectDir($objFormParam, $dir)
407    {
408        $select_dir = '';
409        $top_dir = $objFormParam->getValue('top_dir');
410        // USER_REALDIR以下の場合
411        if (preg_match("@^\Q". $top_dir. "\E@", $dir) > 0) {
412            // 相対パスがある場合、USER_REALDIRを返す.
413            if (preg_match("@\Q..\E@", $dir) > 0) {
414                $select_dir = $top_dir;
415            // 相対パスがない場合、そのままディレクトリパスを返す.
416            } else {
417                $select_dir= $dir;
418            }
419        // USER_REALDIR以下でない場合、USER_REALDIRを返す.
420        } else {
421            $select_dir = $top_dir;
422        }
423
424        return $select_dir;
425    }
426
427    /**
428     * 親ディレクトリ取得
429     *
430     * @param  string $dir 現在いるディレクトリ
431     * @return string $parent_dir 親ディレクトリ
432     */
433    public function lfGetParentDir($dir)
434    {
435        $parent_dir = '';
436        $dir = rtrim($dir, '/');
437        $arrDir = explode('/', $dir);
438        array_pop($arrDir);
439        foreach ($arrDir as $val) {
440            $parent_dir .= "$val/";
441        }
442        $parent_dir = rtrim($parent_dir, '/');
443
444        return $parent_dir;
445    }
446
447    /**
448     * ディレクトリツリー生成
449     *
450     * @param  object       $objFileManager SC_Helper_FileManager_Exインスタンス
451     * @param  SC_FormParam $objFormParam   SC_FormParamインスタンス
452     * @return void
453     */
454    public function setDispTree($objFileManager, $objFormParam)
455    {
456        $tpl_onload = '';
457        // ツリーを表示する divタグid, ツリー配列変数名, 現在ディレクトリ, 選択ツリーhidden名, ツリー状態hidden名, mode hidden名
458        $now_dir = $objFormParam->getValue('now_dir');
459        $treeView = "eccube.fileManager.viewFileTree('tree', arrTree, '$now_dir', 'tree_select_file', 'tree_status', 'move');";
460        if (!empty($this->tpl_onload)) {
461            $tpl_onload .= $treeView;
462        } else {
463            $tpl_onload = $treeView;
464        }
465        $this->setTplOnLoad($tpl_onload);
466
467        $tpl_javascript = '';
468        $arrTree = $objFileManager->sfGetFileTree($objFormParam->getValue('top_dir'), $objFormParam->getValue('tree_status'));
469        $tpl_javascript .= "arrTree = new Array();\n";
470        foreach ($arrTree as $arrVal) {
471            $tpl_javascript .= 'arrTree['.$arrVal['count'].'] = new Array('.$arrVal['count'].", '".$arrVal['type']."', '".$arrVal['path']."', ".$arrVal['rank'].',';
472            if ($arrVal['open']) {
473                $tpl_javascript .= "true);\n";
474            } else {
475                $tpl_javascript .= "false);\n";
476            }
477        }
478        $this->setDispParam('tpl_javascript', $tpl_javascript);
479    }
480
481    /**
482     * 現在の階層がルートディレクトリかどうかテンプレートに渡す
483     *
484     * @param  object $objFormParam SC_FormParamインスタンス
485     * @return void
486     */
487    public function setIsTopDir($objFormParam)
488    {
489        // トップディレクトリか調査
490        $is_top_dir = false;
491        // 末尾の/をとる
492        $top_dir_check = rtrim($objFormParam->getValue('top_dir'), '/');
493        $now_dir_check = rtrim($objFormParam->getValue('now_dir'), '/');
494        if ($top_dir_check == $now_dir_check) {
495            $is_top_dir = true;
496        }
497        $this->setDispParam('tpl_is_top_dir', $is_top_dir);
498    }
499}
Note: See TracBrowser for help on using the repository browser.