    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}