Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Creative commons Attribution-NonCommercial license. http://creativecommons.org/licenses/by-nc/2.5/au/deed.en_GB NO WARRANTY IS GIVEN OR IMPLIED, USE AT YOUR OWN RISK.
  
  package base.jee;
  
 import java.net.URL;
 import java.util.Date;
 import java.util.List;
 
 
 import base.KeyValue;
 
 import base.json.Json;
 
 public class AuthorisationFilter implements Filter {
 
 	private String authFailUrl;
 	private String authSuccessUrl;
 	private boolean blockFrames;
 	private JeeBase jee;
 
 	public AuthorisationFilter(JeeBase jeeString authSuccessUrlString authFailUrlthrows IOException {
 
 		if(jee.getSettings().get("cookie.domain"null) == null) {
 			jee.getSettings().set("cookie.domain""");
 		}
 
 		this. = jee;
 		this. = authFailUrl;
 		this. = authSuccessUrl;
 		this. = jee.getSettings().get("frame.protection""").equalsIgnoreCase("true")||jee.getSettings().get("frame.protection""").equalsIgnoreCase("y")||jee.getSettings().get("frame.protection""").equalsIgnoreCase("yes");
 
 		if(jee.getSettings().get("base.url""").toLowerCase().contains("localhost")) {
 			// The sign in process ivolves setting a user cookie and doing a 302 redirect
 			// to send the user to the main/front page. In some browsers, this does not
 			// work if the url contains the domain name "localhost". Warn the user in
 			// the best way possible, aka print to STDERR.
 			..println("WARNING: base.url system setting references localhost. Sign-in will not work on some browsers!!!!");
 		}
 	}
 
 	public void init(FilterConfig configthrows ServletException {
 	}
 
 	public void destroy() {
 	}
 
 	public void doFilter(ServletRequest requestServletResponse responseFilterChain chainthrows IOExceptionServletException {
 		String url = ((HttpServletRequest)request).getRequestURI();
 		String ip = BaseServlet.getIp((HttpServletRequest)request);
 		String token = null;
 		String originalToken = null;
 
 		// Fetch users session token.
 		Cookie[] cookies = ((HttpServletRequest)request).getCookies();
 		if(cookies != null) {
 			for (Cookie cookie : cookies) {
 					token = cookie.getValue();
 					originalToken = cookie.getValue();
 					break;
 				}
 			}
 		}
 
 		if() {
 			((HttpServletResponse)response).setHeader("X-Frame-Options""deny");
 		}
 
 		try {
 			// If the URL references a static resource, the resource contents are returned, no authentication logic required.
 			if(ResourceManager.loadResource(, (HttpServletRequest)request, (HttpServletResponse)response)) {
 				return;
 			}
 
 			if(url.endsWith("/signout")) {
				if(token != null) {
					.getAPI().invalidateToken(tokenip);
				}
				((HttpServletResponse)response).setHeader("Location".getSettings().get("base.url""") + "/");
				attachCookieToResponse(responsetoken);
				return;
			}
			if(request.getParameter("signin_username") != null && request.getParameter("signin_password") != null) {
				String newToken = null;
				List<KeyValuer = .getAPI().authenticate(tokenrequest.getParameter("signin_username"), request.getParameter("signin_password"), ip);
				if(r != null && r.size() > 0 && r.get(0).getKey().equals("token")) {
					newToken = r.get(0).getValue();
				}
				if(newToken == null) {
					.log("DEBUG""Authentication request failed for user " + request.getParameter("signin_username"));
					String includedTarget = "";
					if(request.getParameter("target") != null) {
						try {
							URL target = new URL(request.getParameter("target"));
							URL base = new URL(.getSettings().get("base.url"""));
							if(target.getHost().equalsIgnoreCase(base.getHost())) {
								includedTarget = "&target=" + StringHelper.urlEscape(target.toString());
							}
catch(MalformedURLException e) {
						}
					}
					String suspended = "";
					if(r != null && r.size() > 0 && r.get(0).getValue().toLowerCase().contains("temporarily disabled")) {
						suspended = "&suspended=";
					}
					((HttpServletResponse)response).setHeader("Location".getSettings().get("base.url""") +  + "&u=" + StringHelper.urlEscape(request.getParameter("signin_username")) + suspended + includedTarget);
					token = StringHelper.randomString(.); // Authentication failure includes new cookie token
					attachCookieToResponse(responsetoken);
					return;
				}
				if(token == null || !newToken.equals(token)) {
					// Only output half of the token, to prevent extraction of token in string templates
					String tkn = newToken.substring(0, newToken.length()/2) + "...";
					if(token == null) {
						// Sign in from user that has not loaded the sign in page, ie potential script access
						.log("DEBUG""Authentication from browser that did not have a cookie \"" + tkn + "\".");
else {
						// Sign in from a user while a different user is already signed in using this browser
						String oldTkn = token.substring(0, token.length()/2) + "...";
						.log("DEBUG""User credentials switched from token \"" + oldTkn + "\" to \"" + tkn + "\"");
					}
					token = newToken;
				}
				attachCookieToResponse(responsetoken);
				request.setAttribute(.token);
				// If signin succeeds, target URL parameter may be used to do a custom redirect to a specific page within the same domain
				if(request.getParameter("target") != null) {
					try {
						URL target = new URL(request.getParameter("target"));
						URL base = new URL(.getSettings().get("base.url"""));
						if(target.getHost().equalsIgnoreCase(base.getHost())) {
							.log("DEBUG""Signin redirects to target url: " + target.toString());
							((HttpServletResponse)response).setHeader("Location"target.toString());
							return;
else {
							.log("WARN""Signin request contains external target url: " + request.getParameter("target"));
						}
catch(MalformedURLException e) {
						.log("FINEST""Signin request contains malformed target or base url: [\"" + Json.escape(request.getParameter("target")) + "\",\"" + Json.escape(.getSettings().get("base.url""")) + "\"]");
					}
				}
				// Signin succeeded, go to the "authSuccessUrl" as the starting page.
				((HttpServletResponse)response).setHeader("Location".getSettings().get("base.url""") + );
				return;
			}
			// No token found in either a cookie, or as a result of a sign in
			// request.
			if(token == null) {
				attachCookieToResponse(responsetoken);
			}
			request.setAttribute(.token);
			((HttpServletResponse)response).setHeader("Pragma""nocache");
			((HttpServletResponse)response).setHeader("Cache-Control""no-cache, no-store, max-age=0");
			((HttpServletResponse)response).setDateHeader("Expires", 0);
			chain.doFilter(requestresponse);
catch(Exception e) {
			if(!response.isCommitted()) {
				User u = .getAPI().getSession((String)request.getAttribute(.), BaseServlet.getIp((HttpServletRequest)request)).get(0);
				response.setContentType("text/html; charset=UTF-8");
				response.setCharacterEncoding("UTF-8");
				if(e instanceof PermissionException) {
					String referer = ((HttpServletRequest)request).getHeader("Referer");
					StringBuilder currentRoles = new StringBuilder();
					ST page = .getPage(u"permission_denied");
					if(.getSettings().get("support_team.name""").length() > 0) {
						page.add("support_name".getSettings().get("support_team.name"null));
						if(.getSettings().get("support_team.url""").length() > 0) {
							page.add("support_url".getSettings().get("support_team.url"null));
else {
							page.add("support_url""mailto:" + .getSettings().get("support_team.email"null));
						}
					}
					page.remove("user");
					page.add("url"eurl);
					page.add("breadcrumbs"new Breadcrumb("Authorisation failure"null));
					page.add("time"new Date());
					page.add("referer"referer);
					if(pe.getUser() != null) {
						page.add("user"pe.getUser());
						if(pe.getUser().getRoles().length > 0) {
							page.add("user_roles"pe.getUser().getRoles());
							for(String r : pe.getUser().getRoles()) {
								if(currentRoles.length() > 0) {
									currentRoles.append(",");
								}
								currentRoles.append(r);
							}
else {
							page.add("user_roles"null);
						}
else {
						page.add("user"null);
						page.add("user_roles"null);
					}
					page.add("permission"e);
					page.add("details".getSettings().get("stacktrace.show""").equalsIgnoreCase("true") || .getSettings().get("stacktrace.show""").equalsIgnoreCase("y") || .getSettings().get("stacktrace.show""").equalsIgnoreCase("yes"));
					// Pull cookie that was sent with page request out of request headers.
					page.add("token"originalToken);
					response.getWriter().write(page.render());
					.log("FINE""Permission denied: Command \"" + pe.getCommand() + "\" required role \"" + pe.getRole() + "\" but user had roles \"" + currentRoles + "\". Referer: " + referer + " URL: " + eurlu);
else if(e instanceof ThrottledException) {
					ST page = .getPage(u"throttled");
					page.remove("user");
					page.add("breadcrumbs"new Breadcrumb("Access temporarily suspended"null));
					page.add("time"new Date());
					if(((HttpServletRequest)request).getHeader("Referer") != null){
						page.add("referer", ((HttpServletRequest)request).getHeader("Referer"));
					}
					page.add("exception"e);
					// Pull cookie that was sent with page request out of request headers.
					page.add("token"originalToken);
					response.getWriter().write(page.render());
					.log("FINE""Throttled: " + e.getMessage(), u);
else {
					ST page = .getPage(u"exception");
					page.add("breadcrumbs"new Breadcrumb("System error"null));
					page.add("time"new Date());
					page.add("referer", ((HttpServletRequest)request).getHeader("Referer"));
					if(.getSettings().get("stacktrace.show""").equalsIgnoreCase("true") || .getSettings().get("stacktrace.show""").equalsIgnoreCase("y") || .getSettings().get("stacktrace.show""").equalsIgnoreCase("yes")) {
						page.add("stacktrace", StringHelper.exceptionToString(e"\n"));
					}
					page.add("url"getFullURL((HttpServletRequest)request));
					response.getWriter().write(page.render());
					.log("FINE""Unhandled exception: " + StringHelper.exceptionToString(e"\n"), u);
				}
			}
		}
	}
	public static String getFullURL(HttpServletRequest request) {
		StringBuffer requestURL = request.getRequestURL();
		String queryString = request.getQueryString();
		if (queryString == null) {
			return requestURL.toString();
else {
			return requestURL.append('?').append(queryString).toString();
		}
	}
	public static void attachCookieToResponse(JeeBase jeeServletResponse responseString tokenthrows IOException {
		Cookie cookie = new Cookie(jee.cookieNametoken);
		cookie.setHttpOnly(true);
		cookie.setMaxAge(60*60*24*365);
		String base = jee.getSettings().get("base.url""");
		if(base.length() > 0) {
			try {
				URL u = new URL(base);
				String path = u.getPath();
				if(path.length() == 0) {
					path = "/";
				}
				if(path.length() > 0 && !path.endsWith("/")) {
					path = path + "/";
				}
				String domain = jee.getSettings().get("cookie.domain""");
				if(domain != null && domain.length() > 0) {
					cookie.setDomain(domain);
				}
				cookie.setPath(path);
catch(MalformedURLException e) {
				// No action required if URL can't be read.
			}
		}
		String s = jee.getSettings().get("cookies.secure""");
		if(s.equalsIgnoreCase("true") || s.equalsIgnoreCase("yes") || s.equalsIgnoreCase("y")) {
			cookie.setSecure(true);
		}
		((HttpServletResponse)response).addCookie(cookie);
	}
New to GrepCode? Check out our FAQ X