Ignore:
Timestamp:
2012/02/09 18:25:09 (12 years ago)
Author:
h_yoshimoto
Message:

#1632 プラグインインストール時、アップデート時のバリデーションを実装しました。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/version-2_12-dev/data/class/pages/admin/system/LC_Page_Admin_System_Plugin.php

    r21458 r21467  
    8080            case 'install': 
    8181                $file_key = "plugin_file"; 
    82                 $plugin_file = $_FILES[$file_key]; 
    83                 $this->arrErr = $this->checkUploadFile($plugin_file, $file_key); 
     82                $this->arrErr = $this->checkUploadFile($file_key); 
    8483                if($this->isError($this->arrErr) === false){ 
     84                    $plugin_file = $_FILES[$file_key]; 
    8585                    $plugin_file_name = $plugin_file['name']; 
    8686                    $plugin_code = $this->getPluginCode($plugin_file_name); 
     
    159159                $this->arrErr = $objFormParam->checkError(); 
    160160                if($this->isError($this->arrErr) === false){ 
    161                     $file_key = "update_plugin_file"; 
    162                     $update_plugin_file = $_FILES[$file_key]; 
     161                    $plugin_code = $objFormParam->getValue('plugin_code'); // アップデート対象のプラグインコード 
     162                    $this->arrErr = $this->checkUploadFile($plugin_code); 
    163163                     
    164                     $this->arrErr = $this->checkUploadFile($update_plugin_file, $file_key); 
    165164                    if($this->isError($this->arrErr) === false){ 
     165                        $update_plugin_file = $_FILES[$plugin_code]; 
    166166                        $update_plugin_file_name = $update_plugin_file['name']; // アップデートファイルのファイル名. 
    167167                        $update_plugin_code = $this->getPluginCode($update_plugin_file_name); // アップデートファイルのプラグインコード. 
    168                         $plugin_code = $objFormParam->getValue('plugin_code'); // アップデート対象のプラグインコード 
    169                         
    170168                        // インストールされているプラグインかを判定. 
    171169                        if($this->isInstalledPlugin($update_plugin_code) === true && $update_plugin_code === $plugin_code){ 
    172170                            // インストール処理. 
    173                             $this->arrErr = $this->updatePlugin($plugin_code, $update_plugin_file_name, $file_key, $objFormParam->getValue('plugin_id')); 
     171                            $this->arrErr = $this->updatePlugin($plugin_code, $update_plugin_file_name, $plugin_code, $objFormParam->getValue('plugin_id')); 
    174172                            if($this->isError($this->arrErr) === false) { 
    175173                                // テンプレート再生成. 
     
    178176                            } 
    179177                        } else { 
    180                             $this->arrErr[$file_key] = "※ プラグインファイルが不正です。<br/>"; 
    181                         } 
     178                            $this->arrErr[$plugin_code] = "※ プラグインファイルが不正です。<br/>"; 
     179                       } 
    182180                    } 
    183181                } 
    184  
    185182                break; 
    186183            // 優先度. 
     
    246243     */ 
    247244    function lfInitUploadFile(&$objUpFile, $key) { 
    248         $objUpFile->addFile("プラグインファイル", $key, array('tar', 'tar.gz'), FILE_SIZE, true, 0, 0, false); 
     245        $objUpFile->addFile("プラグインファイル", $key, explode(",", PLUGIN_EXTENSION), FILE_SIZE, true, 0, 0, false); 
    249246    } 
    250247 
     
    256253     * @return array エラー情報を格納した連想配列. 
    257254     */ 
    258     function checkUploadFile($file, $file_key) { 
    259         $arrErr = array(); 
    260          
    261         if ($file['size'] <= 0) { 
    262             $arrErr[$file_key] = '※ ファイルがアップロードされていません'; 
    263         } 
    264         return $arrErr; 
     255    function checkUploadFile($file_key) { 
     256        $objErr = new SC_CheckError_Ex(); 
     257        // 拡張子チェック 
     258        $objErr->doFunc(array('プラグインファイル', $file_key, explode(",", PLUGIN_EXTENSION)), array("FILE_EXT_CHECK")); 
     259        // ファイルサイズチェック 
     260        $objErr->doFunc(array('プラグインファイル', $file_key, FILE_SIZE), array("FILE_SIZE_CHECK")); 
     261        // ファイル名チェック 
     262        $objErr->doFunc(array('プラグインファイル', $file_key), array("FILE_NAME_CHECK")); 
     263         
     264        return $objErr->arrErr; 
    265265    } 
    266266     
     
    308308 
    309309    /** 
    310      * プラグインコードを取得する. 
    311      *  
    312      * @param string $upload_file_name アップロードファイル名 
    313      * @return string プラグインコード. 
    314      */ 
    315     function getPluginCode($upload_file_name) { 
    316         $array_ext = explode(".", $upload_file_name); 
    317         return $array_ext[0]; 
     310     * ファイル名からプラグインコードを取得する. 
     311     *  
     312     * ファイル名を「.」で配列に分解. 
     313     * 配列内から拡張子として格納される可能性のある「tar」「gz」を除外すし、再度結合する. 
     314     *  
     315     * @param string $file_name ファイル名 
     316     * @return string $plugin_code プラグインコード. 
     317     */ 
     318    function getPluginCode($file_name) { 
     319        // 分解 
     320        $array_ext = explode(".", $file_name); 
     321        $array_file_name = array_diff($array_ext, array('tar','gz')); 
     322        // 結合 
     323        $plugin_code = implode( '.', $array_file_name ); 
     324        return $plugin_code; 
    318325    } 
    319326 
     
    374381        $arrErr = $this->requirePluginFile($plugin_class_file_path, "plugin_file"); 
    375382        if ($this->isError($arrErr) === true) { 
    376             return $arrErr; 
    377         } 
    378  
     383            SC_Utils_Ex::deleteFile($plugin_dir); 
     384            return $arrErr; 
     385        } 
     386         
     387        // リフレクションオブジェクトを生成. 
     388        $objReflection = new ReflectionClass($plugin_code); 
     389         
     390        // プラグインクラスに必須となるパラメータが定義されているかチェック. 
     391        $arrErr = $this->checkPluginConstants($objReflection); 
     392        if ($this->isError($arrErr) === true) { 
     393            SC_Utils_Ex::deleteFile($plugin_dir); 
     394            return $arrErr; 
     395        } 
     396         
    379397        // プラグイン情報をDB登録 
    380         if ($this->registerData($plugin_code) === false) { 
     398        if ($this->registerData($objReflection) === false) { 
     399            SC_Utils_Ex::deleteFile($plugin_dir); 
    381400            $arrErr['plugin_file'] = "※ DB登録に失敗しました。<br/>"; 
    382401            return $arrErr; 
    383402        } 
    384  
     403         
    385404        // プラグインhtmlディレクトリ作成 
    386405        $plugin_html_dir = PLUGIN_HTML_REALDIR . $plugin_code; 
     
    390409        $arrErr = $this->execPlugin($plugin['plugin_id'], $plugin_code, "install"); 
    391410 
     411        return $arrErr; 
     412    } 
     413     
     414    /** 
     415     * プラグインクラス内の定数をチェックします. 
     416     *  
     417     * @param ReflectionClass $objReflection リフレクションオブジェクト  
     418     * @return array エラー情報を格納した連想配列. 
     419     */ 
     420    function checkPluginConstants(ReflectionClass $objReflection) { 
     421        $arrErr = array(); 
     422         
     423        if($objReflection->getConstant("PLUGIN_NAME") === false){ 
     424            $arrErr['plugin_file'] = "※ PLUGIN_NAMEが定義されていません。<br/>"; 
     425            return $arrErr; 
     426        } 
     427        if($objReflection->getConstant("PLUGIN_VERSION") === false){ 
     428            $arrErr['plugin_file'] = "※ PLUGIN_VERSIONが定義されていません。<br/>"; 
     429            return $arrErr; 
     430        } 
     431        if($objReflection->getConstant("COMPLIANT_VERSION") === false){ 
     432            $arrErr['plugin_file'] = "※ COMPLIANT_VERSIONが定義されていません。<br/>"; 
     433            return $arrErr; 
     434        } 
     435        if($objReflection->getConstant("AUTHOR") === false){ 
     436            $arrErr['plugin_file'] = "※ AUTHORが定義されていません。<br/>"; 
     437            return $arrErr; 
     438        } 
     439        if($objReflection->getConstant("DESCRIPTION") === false){ 
     440            $arrErr['plugin_file'] = "※ DESCRIPTIONが定義されていません。<br/>"; 
     441            return $arrErr; 
     442        } 
     443         
     444        $objErr = new SC_CheckError_Ex($objReflection->getConstants()); 
     445        $objErr->doFunc(array('PLUGIN_NAME', 'PLUGIN_NAME', STEXT_LEN), array("MAX_LENGTH_CHECK", )); 
     446        $objErr->doFunc(array('PLUGIN_VERSION', 'PLUGIN_VERSION', STEXT_LEN), array("MAX_LENGTH_CHECK")); 
     447        $objErr->doFunc(array('COMPLIANT_VERSION', 'COMPLIANT_VERSION', STEXT_LEN), array("MAX_LENGTH_CHECK")); 
     448        $objErr->doFunc(array('AUTHOR', 'AUTHOR', STEXT_LEN), array("MAX_LENGTH_CHECK")); 
     449        $objErr->doFunc(array('DESCRIPTION', 'DESCRIPTION', SLTEXT_LEN), array("MAX_LENGTH_CHECK")); 
     450        if($objReflection->getConstant("PLUGIN_SITE_URL") !== false){ 
     451            $objErr->doFunc(array('PLUGIN_SITE_URL', 'PLUGIN_SITE_URL', URL_LEN), array("MAX_LENGTH_CHECK","GRAPH_CHECK")); 
     452        } 
     453        if($objReflection->getConstant("AUTHOR_SITE_URL") !== false){ 
     454            $objErr->doFunc(array('AUTHOR_SITE_URL', 'AUTHOR_SITE_URL', URL_LEN), array("MAX_LENGTH_CHECK","GRAPH_CHECK")); 
     455        } 
     456        // エラー内容を出力用の配列にセットします. 
     457        if($this->isError($objErr->arrErr)){ 
     458            $arrErr['plugin_file'] = ""; 
     459            foreach ($objErr->arrErr as $error){ 
     460                    $arrErr['plugin_file'] .= $error; 
     461            } 
     462        } 
    392463        return $arrErr; 
    393464    } 
     
    410481         
    411482        // ファイルをチェックし展開します. 
    412         $arrErr = $this->unpackPluginFile($plugin_file_name, $temp_plugin_dir, $plugin_code, $file_key); 
     483        $arrErr = $this->unpackPluginFile($plugin_file_name, $temp_plugin_dir, $plugin_code, $plugin_code); 
    413484        if ($this->isError($arrErr) === true) { 
    414485            return $arrErr; 
     
    558629     * プラグイン情報をDB登録. 
    559630     * 
    560      * @param string $plugin_code プラグインコード. 
    561      * @return array エラー情報を格納した連想配列. 
    562      */ 
    563     function registerData($plugin_code) { 
    564          
     631     * @param ReflectionClass $objReflection リフレクションオブジェクト  
     632     * @return array エラー情報を格納した連想配列. 
     633     */ 
     634    function registerData(ReflectionClass $objReflection) { 
     635 
    565636        // プラグイン情報をDB登録. 
    566         // TODO:エラーチェック. 
    567637        $objQuery =& SC_Query_Ex::getSingletonInstance(); 
    568638        $objQuery->begin(); 
     
    570640        $plugin_id = $objQuery->nextVal('dtb_plugin_plugin_id'); 
    571641        $arr_sqlval_plugin['plugin_id'] = $plugin_id; 
    572         $arr_sqlval_plugin['plugin_name'] = $plugin_code::PLUGIN_NAME; 
    573         $arr_sqlval_plugin['plugin_code'] = $plugin_code; 
    574         $arr_sqlval_plugin['author'] = $plugin_code::AUTHOR; 
    575         $arr_sqlval_plugin['plugin_site_url'] = $plugin_code::PLUGIN_SITE_URL; 
    576         $arr_sqlval_plugin['plugin_version'] = $plugin_code::PLUGIN_VERSION; 
    577         $arr_sqlval_plugin['compliant_version'] = $plugin_code::COMPLIANT_VERSION; 
    578         $arr_sqlval_plugin['plugin_description'] = $plugin_code::DESCRIPTION; 
     642        $arr_sqlval_plugin['plugin_name'] = $objReflection->getConstant("PLUGIN_NAME"); 
     643        $arr_sqlval_plugin['plugin_code'] = $objReflection->getName(); 
     644        $arr_sqlval_plugin['author'] = $objReflection->getConstant("AUTHOR"); 
     645        // AUTHOR_SITE_URLが定義されているか判定. 
     646        $author_site_url = $objReflection->getConstant("AUTHOR_SITE_URL"); 
     647        if($author_site_url !== false) $arr_sqlval_plugin['author_site_url'] = $author_site_url; 
     648        // PLUGIN_SITE_URLが定義されているか判定. 
     649        $plugin_site_url = $objReflection->getConstant("PLUGIN_SITE_URL"); 
     650        if($plugin_site_url !== false) $arr_sqlval_plugin['plugin_site_url'] = $plugin_site_url; 
     651        $arr_sqlval_plugin['plugin_version'] = $objReflection->getConstant("PLUGIN_VERSION"); 
     652        $arr_sqlval_plugin['compliant_version'] = $objReflection->getConstant("COMPLIANT_VERSION"); 
     653        $arr_sqlval_plugin['plugin_description'] = $objReflection->getConstant("DESCRIPTION"); 
    579654        $arr_sqlval_plugin['rank'] = 1 + $objQuery->max('rank', 'dtb_plugin'); 
    580655        $arr_sqlval_plugin['enable'] = PLUGIN_ENABLE_FALSE; 
     
    583658 
    584659        // フックポイントをDB登録. 
    585         $array_hook_point = explode(",", $plugin_code::HOOK_POINTS); 
    586         if(is_array($array_hook_point)){ 
    587             foreach ($array_hook_point as $hook_point) { 
    588                 $arr_sqlval_plugin_hookpoint = array(); 
    589                 $id = $objQuery->nextVal('dtb_plugin_hookpoint_id'); 
    590                 $arr_sqlval_plugin_hookpoint['id'] = $id; 
    591                 $arr_sqlval_plugin_hookpoint['plugin_id'] = $plugin_id; 
    592                 $arr_sqlval_plugin_hookpoint['hook_point'] = $hook_point; 
    593                 $arr_sqlval_plugin_hookpoint['update_date'] = 'CURRENT_TIMESTAMP'; 
    594                 $objQuery->insert('dtb_plugin_hookpoint', $arr_sqlval_plugin_hookpoint); 
     660        $hook_point = $objReflection->getConstant("HOOK_POINTS"); 
     661        if($hook_point !== false){ 
     662            $array_hook_point = explode(",", $hook_point); 
     663            if(is_array($array_hook_point)){ 
     664                foreach ($array_hook_point as $hook_point) { 
     665                    $arr_sqlval_plugin_hookpoint = array(); 
     666                    $id = $objQuery->nextVal('dtb_plugin_hookpoint_id'); 
     667                    $arr_sqlval_plugin_hookpoint['id'] = $id; 
     668                    $arr_sqlval_plugin_hookpoint['plugin_id'] = $plugin_id; 
     669                    $arr_sqlval_plugin_hookpoint['hook_point'] = $hook_point; 
     670                    $arr_sqlval_plugin_hookpoint['update_date'] = 'CURRENT_TIMESTAMP'; 
     671                    $objQuery->insert('dtb_plugin_hookpoint', $arr_sqlval_plugin_hookpoint); 
     672                } 
    595673            } 
    596674        } 
Note: See TracChangeset for help on using the changeset viewer.