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.filter;
017    
018    import org.opengion.fukurou.util.Closer;
019    import org.opengion.fukurou.util.HybsDateUtil;
020    
021    import javax.servlet.ServletRequest;
022    import javax.servlet.http.HttpServletRequest;
023    import javax.servlet.ServletResponse;
024    import javax.servlet.ServletException;
025    import javax.servlet.ServletContext;
026    import javax.servlet.Filter;
027    import javax.servlet.FilterChain;
028    import javax.servlet.FilterConfig;
029    
030    // import java.util.Date;
031    // import java.util.Locale ;
032    // import java.text.DateFormat;
033    // import java.text.SimpleDateFormat;
034    
035    import java.io.File;                                                    // 5.7.3.2 (2014/02/28) Tomcat8 対å¿?
036    import java.io.PrintWriter;
037    import java.io.BufferedReader;
038    import java.io.IOException;
039    import java.io.FileInputStream;
040    import java.io.InputStreamReader;
041    import java.io.UnsupportedEncodingException;
042    
043    /**
044     * AccessStopFilter は、Filter インターフェースを継承した アクセス制御クラスですã?
045     * web.xml で filter 設定することにより、Webアプリケーションへのアクセスを制御できますã?
046     * またã?SYSTEM ユーザーは、このフィルターを常に通過しますã?
047     *
048     * フィルターに対してweb.xml でパラメータを設定しますã?
049     *   ・startTime:停止開始時刻
050     *   ・stopTime :停止終äº?™‚刻
051     *   ・filename :停止時メãƒ?‚»ージ表示ファイルå�?
052     *
053     * 【WEB-INF/web.xmlã€?
054     *     <filter>
055     *         <filter-name>AccessStopFilter</filter-name>
056     *         <filter-class>org.opengion.hayabusa.filter.AccessStopFilter</filter-class>
057     *         <init-param>
058     *             <param-name>startTime</param-name>
059     *             <param-value>070000</param-value>
060     *         </init-param>
061     *         <init-param>
062     *             <param-name>stopTime</param-name>
063     *             <param-value>070000</param-value>
064     *         </init-param>
065     *         <init-param>
066     *             <param-name>filename</param-name>
067     *             <param-value>jsp/custom/stopFile.html</param-value>
068     *         </init-param>
069     *     </filter>
070     *
071     *     <filter-mapping>
072     *         <filter-name>AccessStopFilter</filter-name>
073     *         <url-pattern>/jsp/*</url-pattern>
074     *     </filter-mapping>
075     *
076     * @og.group フィルター処ç�?
077     *
078     * @version  4.0
079     * @author   Kazuhiko Hasegawa
080     * @since    JDK5.0,
081     */
082    public final class AccessStopFilter implements Filter {
083    
084            private static boolean stopFilter = false;
085            private String startTime = "230000";            // 停止開始時刻
086            private String stopTime  = "070000";            // 停止終äº?™‚刻
087            private String filename  = null;                        // 停止時メãƒ?‚»ージ表示ファイルå�?
088            private int    startStop = 0;
089    
090            /**
091             * フィルター処ç�?œ¬体ã?メソãƒ?ƒ‰ですã?
092             *
093             * @og.rev 3.1.3.0 (2003/04/10) UTF-8 決め打ちで、stopFile.html を返é?するã€?
094             * @og.rev 3.1.8.0 (2003/05/16) æ–?­—エンコードが、UTF-8 になってã�?�ªã�??を修正ã€?
095             *
096             * @param       request         ServletRequestオブジェクãƒ?
097             * @param       response        ServletResponseオブジェクãƒ?
098             * @param       chain           FilterChainオブジェクãƒ?
099             * @throws IOException 入出力エラーが発生したå?合ã?throw されますã?
100             * @throws ServletException サーブレãƒ?ƒˆ関係ã?エラーが発生したå?合ã?throw されますã?
101             */
102            public void doFilter( final ServletRequest request,
103                                                            final ServletResponse response,
104                                                            final FilterChain chain)
105                                                                    throws IOException, ServletException {
106    
107                    if( isStop( request ) ) {
108                            BufferedReader in = null ;
109                            try {
110                                    response.setContentType( "text/html; charset=UTF-8" );
111                                    PrintWriter out = response.getWriter();
112                                    in = new BufferedReader( new InputStreamReader(
113                                                                    new FileInputStream( filename ) ,"UTF-8" ) );
114                                    String str ;
115                                    while( (str = in.readLine()) != null ) {
116                                            out.println( str );
117                                    }
118                                    out.flush();
119                            }
120                            catch( UnsupportedEncodingException ex ) {
121                                    String errMsg = "æŒ?®šされたエンコーãƒ?‚£ングがサポã?トされてã�?�¾せんã€?UTF-8]" ;
122                                    throw new RuntimeException( errMsg,ex );
123                            }
124                            catch( IOException ex ) {
125                                    String errMsg = "ストリーãƒ?�Œオープン出来ませんでしたã€?" + filename + "]" ;
126                                    throw new RuntimeException( errMsg,ex );
127                            }
128                            finally {
129                                    Closer.ioClose( in );
130                            }
131                            return;
132                    }
133    
134                    chain.doFilter(request, response);
135            }
136    
137            /**
138             * フィルターの初期処ç�?ƒ¡ソãƒ?ƒ‰ですã?
139             *
140             * フィルターに対してweb.xml で初期パラメータを設定しますã?
141             *   ・startTime:停止開始時刻
142             *   ・stopTime :停止終äº?™‚刻
143             *   ・filename :停止時メãƒ?‚»ージ表示ファイルå�?
144             *
145             * @og.rev 5.7.3.2 (2014/02/28) Tomcat8 対応ã?getRealPath( "/" ) の互換性のための修正ã€?
146             *
147             * @param       filterConfig    FilterConfigオブジェクãƒ?
148             */
149            public void init(final FilterConfig filterConfig) {
150    
151                    ServletContext context = filterConfig.getServletContext();
152    //              String realPath = context.getRealPath( "/" );
153                    String realPath = context.getRealPath( "" ) + File.separator;   // 5.7.3.2 (2014/02/28) Tomcat8 対å¿?
154    
155                    startTime = filterConfig.getInitParameter("startTime");
156                    stopTime  = filterConfig.getInitParameter("stopTime");
157                    filename  = realPath + filterConfig.getInitParameter("filename");
158    
159                    if( startTime == null || stopTime == null ) {
160                            startStop = 0;
161                    }
162                    else {
163                            startStop = startTime.compareTo( stopTime );
164                    }
165            }
166    
167            /**
168             * フィルターの終äº??ç�?ƒ¡ソãƒ?ƒ‰ですã?
169             *
170             */
171            public void destroy() {
172                    // ここでは処ç�?‚’行いませんã€?
173            }
174    
175            /**
176             * フィルターのå†?ƒ¨状態をチェãƒ?‚¯するメソãƒ?ƒ‰ですã?
177             * å†?ƒ¨のフラグをもとに、停止/許可を求めますã?
178             *
179             * @og.rev 3.1.8.0 (2003/05/16) 開始時刻と終äº?™‚刻を同ä¸?�«してã�?‚‹と、画面からの制御が効かなã�?ƒ�グを修正ã€?
180             * @og.rev 5.5.3.2 (2012/06/08) 通過させるユーザーに、admin を追åŠ?�—ますã?
181             * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正しますã?
182             *
183             * @param request ServletRequestオブジェクãƒ?
184             *
185             * @return      (true:停止  false:実行許可)
186             */
187            private boolean isStop( final ServletRequest request ) {
188                    String userID = ((HttpServletRequest)request).getRemoteUser() ;
189                    // 5.5.3.2 (2012/06/08) 通過させるユーザーに、admin を追åŠ?
190    //              if( "SYSTEM".equalsIgnoreCase( userID ) ) {
191                    if( "SYSTEM".equalsIgnoreCase( userID ) || "admin".equalsIgnoreCase( userID ) ) {
192                            return false;
193                    }
194    
195                    // 4.0.0 (2005/01/31)
196    //              DateFormat formatter = new SimpleDateFormat( "HHmmss",Locale.JAPAN );
197    //              String time = formatter.format( new Date() );
198                    String time = HybsDateUtil.getDate( "HHmmss" );         // 5.5.7.2 (2012/10/09) HybsDateUtil を利用
199    
200                    boolean rtnFlag = stopFilter;
201                    if( startStop < 0 ) {
202                            if( startTime.compareTo( time ) < 0 &&
203                                    time.compareTo( stopTime )  < 0 ) {
204                                            rtnFlag = true;
205                            }
206                    }
207                    else if( startStop > 0 ) {
208                            if( startTime.compareTo( time ) < 0 ||
209                                    time.compareTo( stopTime )  < 0 ) {
210                                            rtnFlag = true;
211                                    }
212                    }
213                    return rtnFlag;
214            }
215    
216            /**
217             * フィルターの強制停止/解除を設定するメソãƒ?ƒ‰ですã?
218             *
219             * @og.rev 4.0.0.0 (2005/01/31) synchronized のå»?­¢
220             *
221             * @param flag (true:停止  false:実行許可)
222             */
223            public static void setStopFilter( final boolean flag ) {
224                    stopFilter = flag;
225            }
226    
227            /**
228             * フィルターのå†?ƒ¨状æ…?強制停止/解除)を取得するメソãƒ?ƒ‰ですã?
229             * これは、現在、アクセス制限がどã�?�ªってã�?‚‹かとã�?�†状態ではなくã?
230             * 強制停止されてã�?‚‹かどã�?�‹の確認メソãƒ?ƒ‰ですã?
231             *
232             * @og.rev 4.0.0.0 (2007/11/29) getStopFilter() â‡?isStopFilter() に変更
233             *
234             * @return      (true:停止  false:実行許可)
235             */
236    //      public static boolean getStopFilter() {
237            public static boolean isStopFilter() {
238                    return stopFilter;
239            }
240    
241            /**
242             * å†?ƒ¨状態をæ–?­—å?で返しますã?
243             *
244             * @return      こã?クラスのæ–?­—å?表示
245             */
246            @Override
247            public String toString() {
248                    StringBuilder sb = new StringBuilder();
249                    sb.append( "AccessStopFilter" );
250                    sb.append( "[" ).append( startTime ).append( "],");
251                    sb.append( "[" ).append( stopTime  ).append( "],");
252                    sb.append( "[" ).append( filename  ).append( "],");
253                    return (sb.toString());
254            }
255    }