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.plugin.column;
017
018import org.opengion.fukurou.util.ErrorMessage;
019import org.opengion.fukurou.util.StringUtil;
020import org.opengion.hayabusa.db.AbstractDBType;
021import org.opengion.hayabusa.db.DBTypeCheckUtil;
022
023import java.util.Locale ;
024
025/**
026 * 半角文字+半角カタカナの大文字のみに制限された文字列を扱う為の、カラム属性を定義します。
027 *
028 * ホスト送信用なので、半角カタカナ小文字を半角カタカナ大文字に変換します。
029 * 通常の半角文字や半角カタカナを入力すると、大文字に変換後に、チェックを行います。
030 * 半角カタカナの小文字とは、「ァ,ィ,ゥ,ェ,ォ,ャ,ュ,ョ,ッ」のことで、これらの文字列を、
031 * 「ア,イ,ウ,エ,オ,ヤ,ユ,ヨ,シ」に置き換えます。
032 *
033 * タイプチェックとして、以下の条件を判定します。
034 * ・文字列長は、Byte換算での文字数との比較
035 * ・半角文字+半角カタカナチェック
036 * ・文字パラメータの 正規表現チェック
037 * ・クロスサイトスクリプティングチェック
038 *
039 * @og.group データ属性
040 *
041 * @version  4.0
042 * @author   Kazuhiko Hasegawa
043 * @since    JDK5.0,
044 */
045public class DBType_XHU extends AbstractDBType {
046        //* このプログラムのVERSION文字列を設定します。   {@value} */
047        private static final String VERSION = "5.2.2.0 (2010/11/01)" ;
048
049        /**
050         * エディターで編集されたデータを登録する場合に、データそのものを
051         * 変換して、実登録データを作成します。
052         * 例えば,大文字のみのフィールドなら、大文字化します。
053         * 実登録データの作成は、DBType オブジェクトを利用しますので,
054         * これと Editor とがアンマッチの場合は、うまくデータ変換
055         * されない可能性がありますので、注意願います。
056         *
057         * @og.rev 3.3.3.0 (2003/07/09) 前後のスペースを取り除いておく。
058         * @og.rev 3.3.3.1 (2003/07/18) 後ろスペースを取り除く。(StringUtil#rTrim)
059         * @og.rev 3.4.0.0 (2003/09/01) 半角カナ文字化け対策(ア,エ,カ,ー,ラ)の変換処理の廃止
060         *
061         * @param       value   (一般に編集データとして登録されたデータ)
062         *
063         * @return  修正後の文字列(一般にデータベースに登録するデータ)
064         */
065        @Override
066        public String valueSet( final String value ) {
067                if( value == null ) { return null; }
068                String rtnVal = StringUtil.rTrim( value );
069                char[] ch = rtnVal.toCharArray();               // 3.3.3.1 (2003/07/18)
070
071                boolean flag = false;
072                for( int i=0; i<ch.length; i++ ) {
073                        switch( ch[i] ) {
074        // 3.4.0.0 (2003/09/01) 半角カナ文字化け対策(ア,エ,カ,ー,ラ)の変換処理の廃止
075        //                      case '±' : ch[i] = 'ア'; flag = true; break;
076        //                      case '´' : ch[i] = 'エ'; flag = true; break;
077        //                      case '¶' : ch[i] = 'カ'; flag = true; break;
078        //                      case '°' : ch[i] = 'ー'; flag = true; break;
079        //                      case '×' : ch[i] = 'ラ'; flag = true; break;
080                                case 'ァ'  : ch[i] = 'ア'; flag = true; break;
081                                case 'ィ'  : ch[i] = 'イ'; flag = true; break;
082                                case 'ゥ'  : ch[i] = 'ウ'; flag = true; break;
083                                case 'ェ'  : ch[i] = 'エ'; flag = true; break;
084                                case 'ォ'  : ch[i] = 'オ'; flag = true; break;
085                                case 'ャ'  : ch[i] = 'ヤ'; flag = true; break;
086                                case 'ュ'  : ch[i] = 'ユ'; flag = true; break;
087                                case 'ョ'  : ch[i] = 'ヨ'; flag = true; break;
088                                case 'ッ'  : ch[i] = 'シ'; flag = true; break;
089                                default   : break;
090                        }
091                }
092                if( flag ) {
093                        rtnVal = new String( ch );
094                }
095                return rtnVal.toUpperCase(Locale.JAPAN);
096        }
097
098        /**
099         * データが登録可能かどうかをチェックします。
100         * データがエラーの場合は、そのエラー内容を返します。
101         *
102         * @og.rev 3.0.1.3 (2003/03/11) DBTypeCheckUtilクラスを利用するように修正
103         * @og.rev 3.6.0.0 (2004/09/22) dbType パラメータを引数に追加
104         * @og.rev 3.6.1.0 (2005/01/05) 半角カタカナに、『、』を含めます。(0xff65 以上 → 0xff64以上)
105         * @og.rev 5.2.2.0 (2010/11/01) 厳密にチェック(isStrict=true)するフラグを追加
106         *
107         * @param   key         キー
108         * @param   value       値
109         * @param   sizeX       整数部分の文字列の長さ
110         * @param   sizeY       少数部分の文字列の長さ
111         * @param   typeParam   dbType パラメータ
112         * @param   isStrict    厳密にチェックするかどうか[true:する/false:標準的]
113         *
114         * @return  エラー内容
115         */
116        @Override
117        public ErrorMessage valueCheck( final String key ,final String value ,
118                                                                        final int sizeX ,final int sizeY ,final String typeParam ,final boolean isStrict) {
119
120                ErrorMessage msg = new ErrorMessage();
121                if( value == null || value.length() == 0 ) { return msg; }
122
123                int len = (sizeY == 0) ? sizeX : sizeX + sizeY + 1;
124                String check = DBTypeCheckUtil.byteLengthCheck( value,len );
125                if( check != null ) {
126                        // 文字列の長さが指定の長さよりも長いです。
127                        msg.addMessage( 0,ErrorMessage.NG,"ERR0006",key,value,check,String.valueOf( len ) );
128                }
129
130                StringBuilder val = new StringBuilder();
131                boolean isError = false;
132                for( int i=0; i<value.length(); i++ ) {
133                        char ch = value.charAt( i );
134                        // 半角カタカナの小文字(ァ ィ ゥ ェ ォ ャ ュ ョ ッ)も、NG
135                        if( ch < 0x20 || ( ch > 0x7e && ch < 0xff64 ) ||
136                                ( ch > 0xff66 && ch < 0xff70 ) || ( ch >= 0xffa0 ) ) {
137                                        val.append( "<span class=\"NG\">" ).append( ch ).append( "</span>" );
138                                        isError = true;
139                        }
140                        else {
141                                val.append( ch );
142                        }
143                }
144                if( isError ) {
145                        // 指定の文字以外の文字が使われています。
146                        msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,val.toString() );
147                }
148
149                // 3.6.0.0 (2004/09/22) dbType パラメータを使用したマッチチェック
150                check = DBTypeCheckUtil.matcheCheck( value,typeParam );
151                if( check != null ) {
152                        // 指定の文字以外の文字が使われています。
153                        msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,check );
154                }
155
156                // クロスサイトスクリプティング対策:'<', '>' は登録させない。
157                msg = xssCheck( key ,value, msg );
158
159                return msg;
160        }
161}