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