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 }