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 }