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     */
016    package org.opengion.hayabusa.taglib;
017    
018    import org.opengion.hayabusa.common.HybsSystem;
019    
020    import static org.opengion.fukurou.util.StringUtil.nval ;
021    
022    /**
023     * æŒ?®šされた value 値の{@XXXX} 変数が設定された場合ã?み表示するタグですã?
024     *
025     * value 値に、{@XXXX} 変数を使用して、リクエストå?が設定された場合ã?み
026     * そã?値を表示しますã?これは、{@XXXX} 変数と固定å?をçµ?�¿合わせた場合でã‚?
027     * 同様に、å?が設定されてã�?�ªã�??合ã?、使用されませんã€?
028     * defaultVal が設定されており、リクエストå?が設定されてã�?�ªã�??合ã?defaultVal 値ã�?
029     * 使用されますã?
030     * こã?タグが使用されるケースの代表は、SQLでの order by 句ですã?ä¸?ˆ¬のリクエスト時にはã€?
031     * order by 句をリクエストで設定して、ユーザーが検索する時に、å?り替えができるように
032     * しますã?別画面から、リンク等で画面を呼び出すå?合ã?ã€??常 order by 句の条件までã€?
033     * æŒ?®šしません。そのような場合に備えて、og:appear タグでdefaultVal 値を設定しておきã€?
034     * 未æŒ?®š時の検索é ?‚’予めæŒ?®šしておきますã?
035     *
036     * @og.formSample
037     * ●形式ï¼?lt;og:appear startKey="[order by|…]" value="…" defaultVal="[…]" />
038     * ●body?šなã�?
039     *
040     * ●Tag定義
041     *   <og:appear
042     *       startKey           【TAG】開始文字å?を設定しまã�?初期値:"")
043     *       value            ○ã?TAG】å?をセãƒ?ƒˆしまã�?æŒ?®šされた値ã�?設定されてã�?‚‹場合ã?み使用されまã�?(å¿??)
044     *       defaultVal         【TAG】å?期å?を設定しまã�?value値がNULLの場合に、この初期値が表示)
045     *       quotCheck          【TAG】リクエスト情報の クォーãƒ?‚£ション(') 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?(初期値:USE_SQL_INJECTION_CHECK[=true])
046     *       xssCheck           【TAG】リクエスト情報の HTMLTag開å§?終äº?–‡å­?><) 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?(初期値:USE_XSS_CHECK[=true])
047     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
048     *   />
049     *
050     * ●使用ä¾?
051     * <!-- DB検索 SQLæ–?¨˜述 debug="true" でSQLæ–?‚’確認できますã?-->
052     * <og:query command="{@command}" debug="{@debug}" maxRowCount="{@maxRowCount}">
053     *         select CLM,NAME_JA,LABEL_NAME,URL,KBSAKU,
054     *                 SYSTEM_ID,LANG,FGJ,(CASE WHEN URL IS NULL THEN 0 ELSE 1 END) AS ONMARK
055     *         from GF41
056     *     <!-- 検索条件でWhereTagを使用すれば{@xxxx}がNULLの場合ã?そã?条件は無視されますã? -->
057     *     <og:where>
058     *         <og:and value = "FGJ        in  ('0','1')"      />
059     *         <og:and value = "SYSTEM_ID  =  '{@SYSTEM_ID}'"     />
060     *         <og:and value = "LANG       =  '{@LANG}'"          />
061     *         <og:and value = "CLM        like '{@CLM}%'"        />
062     *         <og:and value = "NAME_JA    like '{@NAME_JA}%'"    />
063     *         <og:and value = "LABEL_NAME like '{@LABEL_NAME}%'" />
064     *         <og:and value = "KBSAKU     =    '{@KBSAKU}'"      />
065     *     </og:where>
066     *     <!-- ORDER BY句でAppearTagを使用すれば{@ORDER_BY}がNULLの場合ã?ORDER BY句は無視されますã? -->
067     *     <!-- またã?{@ORDER_BY}がNULLの場合に、defaultVal属æ?を指定すれã?、その値でORDER BY表示されますã? -->
068     *     <og:appear startKey = "order by" value = "{@ORDER_BY}"
069     *                 defaultVal = "SYSTEM_ID,CLM,LANG" />
070     * </og:query>
071     *
072     * @og.group 画面部å“?
073     *
074     * @version  4.0
075     * @author      Kazuhiko Hasegawa
076     * @since    JDK5.0,
077     */
078    public class AppearTag extends CommonTagSupport {
079            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
080            private static final String VERSION = "5.7.8.1 (2014/07/18)" ;
081    
082            private static final long serialVersionUID = 578120140718L ;
083    
084            private String  startKey        = "";
085            private String  value           = null;
086            private String  defaultVal      = null;
087            private boolean quotCheck       = HybsSystem.sysBool( "USE_SQL_INJECTION_CHECK" );      // 5.7.8.1 (2014/07/18)
088            private boolean xssCheck        = HybsSystem.sysBool( "USE_XSS_CHECK" );                        // 5.7.8.1 (2014/07/18)
089    
090            /**
091             * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
092             *
093             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応ã?release2() ã‚?doEndTag()で呼ぶã€?
094             * @og.rev 5.7.8.1 (2014/07/18) quotCheck,xssCheck 追åŠ?
095             *
096             * @return      後続å?ç�??æŒ?¤º(EVAL_PAGE)
097             */
098            @Override
099            public int doEndTag() {
100                    debugPrint();           // 4.0.0 (2005/02/28)
101    
102                    // 5.7.8.1 (2014/07/18) quotCheck,xssCheck 追åŠ?
103                    useQuotCheck( quotCheck );
104                    useXssCheck( xssCheck );
105    
106                    String output = getRequestParameter( value );
107                    if( isNull() ) {
108                            output = defaultVal;
109                    }
110    
111                    if( output != null ) {
112                            jspPrint( startKey + " " + output );
113                    }
114    
115                    return EVAL_PAGE ;
116            }
117    
118            /**
119             * タグリブオブジェクトをリリースしますã?
120             *
121             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
122             *
123             * @og.rev 2.0.0.4 (2002/09/27) カスタãƒ?‚¿グの release() メソãƒ?ƒ‰をã?追åŠ?
124             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応ã?release2() ã‚?doEndTag()で呼ぶã€?
125             * @og.rev 5.7.8.1 (2014/07/18) quotCheck , xssCheck 追åŠ?
126             *
127             */
128            @Override
129            protected void release2() {
130                    super.release2();
131                    startKey    = "";
132                    value       = null;
133                    defaultVal  = null;
134                    quotCheck       = HybsSystem.sysBool( "USE_SQL_INJECTION_CHECK" );      // 5.7.8.1 (2014/07/18)
135                    xssCheck        = HybsSystem.sysBool( "USE_XSS_CHECK" );                        // 5.7.8.1 (2014/07/18)
136            }
137    
138            /**
139             * 【TAG】開始文字å?を設定しまã�?初期値:"")ã€?
140             *
141             * @og.tag
142             * こã?キーは、バリューと接続される場合に空白æ–?­—をä¸?�¤挿入しますã?
143             *
144             * @param       val 開始文字å?(例:startKey="order by")
145             */
146            public void setStartKey( final String val ) {
147                    startKey = nval( getRequestParameter( val ),startKey );
148            }
149    
150            /**
151             * 【TAG】å?をセãƒ?ƒˆしまã�?æŒ?®šされた値ã�?設定されてã�?‚‹場合ã?み使用されまã�?ã€?
152             *
153             * @og.tag
154             * æŒ?®šされた値ã�?設定されてã�?‚‹場合ã?みã€?–‹始文字å?(startKey)とçµ?�¿合わせれて、使用されますã?
155             * これは、ä¸?ˆ¬にvalue値が変動する場合に、defaultVal 等に重è¤?�™るå?ã‚?
156             * 設定したくなã�??合に使用しますã?{@XXXX}æ–?­—が使用できますã?
157             *
158             * @param       val 値
159             */
160            public void setValue( final String val ) {
161                    value = val;
162            }
163    
164            /**
165             * 【TAG】å?期å?を設定しまã�?value値がNULLの場合に、この初期値が表示)ã€?
166             *
167             * @og.tag
168             * value値がNULL(æŒ?®šされなã�?の場合に、この初期値がå?として使用されますã?
169             *
170             * @param       val 初期値
171             */
172            public void setDefaultVal( final String val ) {
173                    defaultVal = nval( getRequestParameter( val ),defaultVal );
174            }
175    
176            /**
177             * 【TAG】リクエスト情報の クォーãƒ?‚£ション(') 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?
178             *              (初期値:USE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])ã€?
179             *
180             * @og.tag
181             * ?³?±?¬インジェクション対策ã?ä¸?�¤として、暫定的ではありますが、SQLのパラメータに
182             * 渡す文字å?にクォーãƒ?‚£ション(') を許さなã�?¨­定にすれば、ある程度は防止できますã?
183             * 数字タイプã?引数にはã€?or 5=5 などのクォーãƒ?‚£ションを使用しなã�?‚³ードを埋めてもã?
184             * 数字チェãƒ?‚¯で検å?可能ですã?æ–?­—タイプã?場合ã?、å¿?�š (')をã?ずしてã€?
185             * ' or 'A' like 'A のような形式になる為ã€?')チェãƒ?‚¯ã�?�‘でも有効ですã?
186             * (') が含まれてã�?�Ÿエラーにする(true)?�かノã?チェãƒ?‚¯ã�?false)を指定しますã?
187             * (初期値:シスãƒ?ƒ 定数のUSE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])ã€?
188             *
189             * @og.rev 4.0.0.0 (2005/08/31) 新規追åŠ?
190             *
191             * @param   flag クォーãƒ?‚£ションチェãƒ?‚¯ [true:する/それ以å¤?しない]
192             * @see         org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK
193             */
194            public void setQuotCheck( final String flag ) {
195                    quotCheck = nval( getRequestParameter( flag ),quotCheck );
196            }
197    
198            /**
199             * 【TAG】リクエスト情報の HTMLTag開å§?終äº?–‡å­?><) 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?
200             *              (初期値:USE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])ã€?
201             *
202             * @og.tag
203             * クロスサイトスクリプティング(XSS)対策ã?ä¸?’°としてless/greater than signにつã�?�¦のチェãƒ?‚¯を行いますã?
204             * (><) が含まれてã�?�Ÿエラーにする(true)?�かノã?チェãƒ?‚¯ã�?false)を指定しますã?
205             * (初期値:シスãƒ?ƒ 定数のUSE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])ã€?
206             *
207             * @og.rev 5.0.0.2 (2009/09/15) 新規追åŠ?
208             *
209             * @param       flag    XSSチェãƒ?‚¯ [true:する/false:しない]
210             * @see         org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK
211             */
212            public void setXssCheck( final String flag ) {
213                    xssCheck = nval( getRequestParameter( flag ),xssCheck );
214            }
215    
216            /**
217             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
218             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
219             *
220             * @return こã?クラスのæ–?­—å?表現
221             */
222            @Override
223            public String toString() {
224                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
225                                    .println( "VERSION"             ,VERSION        )
226                                    .println( "startKey"    ,startKey       )
227                                    .println( "value"               ,value          )
228                                    .println( "defaultVal"  ,defaultVal     )
229                                    .println( "Other..."    ,getAttributes().getAttribute() )
230                                    .fixForm().toString() ;
231            }
232    }