    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.resource;
    017
    018import org.opengion.hayabusa.common.HybsSystem ;
    019import org.opengion.fukurou.system.DateSet;                                             // 6.4.2.0 (2016/01/29)
    020import org.opengion.fukurou.util.StringUtil ;
    021import org.opengion.fukurou.db.ApplicationInfo;
    022import org.opengion.fukurou.db.DBUtil;
    023import org.opengion.fukurou.security.HybsCryptography;
    024import static org.opengion.fukurou.system.HybsConst.BUFFER_MIDDLE;      // 6.1.0.0 (2014/12/26) refactoring
    025
    026/**
    027 * 指定のURLをランダムキー化したり、そのキーより実URLへ転送したりします。
    028 *
    029 * 通常のURLは、引数にキーとバリュー値をセットして文字列連結します。そのままでは
    030 * URLが長くなったり、引数の一部を書き換えたりできてしまいます。
    031 * このクラスでは、GE17(URL転送テーブル)に引数付きURLを登録するとともに、
    032 * ランダムキーを作成します。
    033 * また、このランダムキーを元にGE17を検索し、元のURLに転送する機能があります。
    034 *
    035 * @og.rev 4.0.0.0 (2004/12/31) 新規作成
    036 * @og.group リソース管理
    037 *
    038 * @version  4.0
    039 * @author   Kazuhiko Hasegawa
    040 * @since    JDK5.0,
    041 */
    042public final class URLXfer {
    043
    044        // URL転送テーブル(GE17)にデータを書き込むためのSQLです。
    045        private static final String INSERT_SQL = "INSERT INTO GE17 (SYSTEM_ID,RANDOM_KEY,NAME_JA,DYVALID,REDIRECT_URL,"
    046                                                                                        + "FGJ,DYSET,DYUPD,USRSET,USRUPD,PGUPD) "
    047                                                                                        + " VALUES ( ?,?,?,?,?,'1',?,?,?,?,'URLXfer' )" ;
    048
    049        // URL転送テーブル(GE17)からデータを読み込むためのSQLです。
    050        private static final String SELECT_SQL = "SELECT REDIRECT_URL FROM GE17"
    051                                                                                        + " WHERE SYSTEM_ID = ? AND RANDOM_KEY = ? AND DYVALID >= ?" ;
    052
    053        private final String DBID               ;               // ＵＲＬ転送テーブルアクセスの接続先
    054        private final String ADDRESS    ;               // ＵＲＬ転送テーブルアクセスアドレス
    055        private final String SYSTEM_ID  ;               // システムID
    056
    057        /** コネクションにアプリケーション情報を追記するかどうか指定 */
    058        public static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
    059
    060        // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    061        private final ApplicationInfo appInfo;
    062
    063        /**
    064         * コンストラクター
    065         *
    066         * アドレスが存在しない場合は、初期化メソッドを呼び出します。
    067         *
    068         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    069         */
    070        public URLXfer() {
    071                DBID = HybsSystem.sys( "RESOURCE_DBID" );
    072                ADDRESS = StringUtil.nval(
    073                                                                HybsSystem.sys( "RESOURCE_ADDRESS" ) ,
    074                                                                HybsSystem.sys( "CONTEXT_URL" ) + "jsp/index.jsp"
    075                                        )  + "?XFER=";
    076
    077                SYSTEM_ID = HybsSystem.sys( "SYSTEM_ID" );
    078
    079                // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    080                if( USE_DB_APPLICATION_INFO ) {
    081                        appInfo = new ApplicationInfo();
    082                        // ユーザーID,IPアドレス,ホスト名
    083                        appInfo.setClientInfo( SYSTEM_ID,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
    084                        // 画面ID,操作,プログラムID
    085                        appInfo.setModuleInfo( "URLXfer",null,null );
    086                }
    087                else {
    088                        appInfo = null;
    089                }
    090        }
    091
    092        /**
    093         * URL文字列のデータを元に、URLXferオブジェクトを構築します。
    094         * データをGE17(URL転送テーブル)に登録するとともに、ランダムキーを作成(XFER)して、
    095         * そのランダム引数を用いたアドレスを返します。
    096         * アドレスは、システムパラメータ URL_XFER_ADDRESS + "?XFER=" + ランダムキーです。
    097         *
    098         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    099         * @og.rev 5.2.2.0 (2010/11/01) util.StringUtil から security.HybsCryptography へ移動
    100         * @og.rev 6.4.2.0 (2016/01/29) DateSet.getDate( String ) を利用するように修正します。
    101         * @og.rev 8.1.2.0 (2022/03/10) getMD5 ﾒｿｯﾄﾞを getHash ﾒｿｯﾄﾞに変更
    102         *
    103         * @param       redirectURL     転送URL
    104         * @param       name                    表示名称
    105         * @param       validDate               有効日時(yyyyMMdd)
    106         * @param       userid          ユーザーID
    107         *
    108         * @return      RandomURL文字列
    109         * @og.rtnNotNull
    110         */
    111        public String getRandomURL( final String redirectURL,final String name,final String validDate,final String userid ) {
    112
    113                final String DYSET = DateSet.getDate( "yyyyMMddHHmmss" );                                               // 6.4.2.0 (2016/01/29)
    114                final String key = redirectURL + Math.random() ;
    115//              final String randomKey = HybsCryptography.getMD5( key );        // 5.2.2.0 (2010/11/01) クラス変更 8.1.2.0 (2022/03/10) Modify
    116                final String randomKey = HybsCryptography.getHash( "MD5", key );
    117
    118                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
    119                final String validYMD  = validDate == null ? "99999999" : validDate ;
    120
    121                final String[] args = new String[] { SYSTEM_ID,randomKey,name,validYMD,redirectURL,DYSET,DYSET,userid,userid };
    122                DBUtil.dbExecute( INSERT_SQL,args,appInfo,DBID );
    123
    124                return ADDRESS + randomKey ;
    125        }
    126
    127        /**
    128         * ランダムキー(XFER)の文字列より、元のURLを検索します。
    129         * データはランダムキーを元に、GE17(URL転送テーブル)より取り出します。
    130         * 取り出す条件は、SYSTEM_ID 、RANDOM_KEY と DYVALID が 現在時刻より大きい場合です。
    131         *
    132         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    133         * @og.rev 6.4.2.0 (2016/01/29) DateSet.getDate( String ) を利用するように修正します。
    134         *
    135         * @param       randomKey       ハッシュ化されたキー文字列
    136         *
    137         * @return RedirectURL文字列
    138         */
    139        public String getRedirectURL( final String randomKey ) {
    140                final String nowDate = DateSet.getDate( "yyyyMMdd" );                                           // 6.4.2.0 (2016/01/29)
    141
    142                final String[]   args = new String[] { SYSTEM_ID,randomKey,nowDate };
    143                final String[][] vals = DBUtil.dbExecute( SELECT_SQL,args,appInfo,DBID );
    144
    145                // 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method
    146                // 反転注意
    147                return vals == null || vals.length == 0 || vals[0] == null || vals[0].length == 0 ? null : vals[0][0];
    148        }
    149
    150        /**
    151         * オブジェクトの識別子として，詳細なユーザー情報を返します。
    152         *
    153         * @return  詳細なユーザー情報
    154         * @og.rtnNotNull
    155         */
    156        @Override
    157        public String toString() {
    158                final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE )
    159                        .append( "DBID :"               ).append( DBID )
    160                        .append( " ADDRESS :"   ).append( ADDRESS )
    161                        .append( " SYSTEM_ID :" ).append( SYSTEM_ID );
    162                return rtn.toString();
    163        }
    164}