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    }