From a04597492981f4da55ce1159d34d0667a979b56b Mon Sep 17 00:00:00 2001
From: uhensler <none@none>
Date: Mon, 7 Aug 2017 10:34:43 +0200
Subject: [PATCH] OO-2945: respond a http error code if the json can not be
 parsed

---
 .../restapi/security/RestApiLoginFilter.java  | 91 ++++++++++---------
 1 file changed, 49 insertions(+), 42 deletions(-)

diff --git a/src/main/java/org/olat/restapi/security/RestApiLoginFilter.java b/src/main/java/org/olat/restapi/security/RestApiLoginFilter.java
index 0611a56cfa3..20a2d536a40 100644
--- a/src/main/java/org/olat/restapi/security/RestApiLoginFilter.java
+++ b/src/main/java/org/olat/restapi/security/RestApiLoginFilter.java
@@ -59,25 +59,25 @@ import org.olat.login.auth.OLATAuthManager;
 import org.olat.restapi.RestModule;
 
 /**
- * 
+ *
  * Description:<br>
  * Filter which protects the REST Api.
- * 
+ *
  * <P>
  * Initial Date:  7 apr. 2010 <br>
  * @author srosse, stephane.rosse@frentix.com
  */
 public class RestApiLoginFilter implements Filter {
-	
+
 	private static OLog log = Tracing.createLoggerFor(RestApiLoginFilter.class);
-	
+
 	private static final String BASIC_AUTH_REALM = "OLAT Rest API";
-	
+
 	private static List<String> openUrls;
 	private static List<String> alwaysEnabledUrls;
 	private static List<String> ipProtectedUrls;
 	private static String LOGIN_URL;
-	
+
 	/**
 	 * The survive time of the session used by token based authentication. For every request
 	 * is a new session created.
@@ -88,30 +88,30 @@ public class RestApiLoginFilter implements Filter {
 	public void init(FilterConfig filterConfig) {
 		//
 	}
-	
+
 	@Override
 	public void destroy() {
 		//
 	}
-	
-	
+
+
 
 	@Override
 	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
 	throws ServletException {
-		
+
 		if(request instanceof HttpServletRequest) {
 			try {
 				HttpServletRequest httpRequest = (HttpServletRequest)request;
 				HttpServletResponse httpResponse = (HttpServletResponse)response;
-				
+
 				String requestURI = httpRequest.getRequestURI();
 				RestModule restModule = (RestModule)CoreSpringFactory.getBean("restModule");
 				if(restModule == null || !restModule.isEnabled() && !isRequestURIAlwaysEnabled(requestURI)) {
 					httpResponse.sendError(403);
 					return;
 				}
-				
+
 				// initialize tracing with request, this allows debugging information as IP, User-Agent.
 				Tracing.setUreq(httpRequest);
 				I18nManager.attachI18nInfoToThread(httpRequest);
@@ -131,7 +131,7 @@ public class RestApiLoginFilter implements Filter {
 						followWithoutAuthentication(httpRequest, httpResponse, chain);
 					} else if (isRequestTokenValid(httpRequest)) {
 						String token = httpRequest.getHeader(RestSecurityHelper.SEC_TOKEN);
-						
+
 						followToken(token, httpRequest, httpResponse, chain);
 					} else if (isBasicAuthenticated(httpRequest, httpResponse, requestURI)) {
 						followBasicAuthenticated(request, response, chain);
@@ -142,6 +142,13 @@ public class RestApiLoginFilter implements Filter {
 				}
 			} catch (Exception e) {
 				log.error("", e);
+				try {
+					HttpServletResponse httpResponse = (HttpServletResponse)response;
+					httpResponse.sendError(500);
+				} catch (Exception ex) {
+					log.error("", ex);
+				}
+
 			} finally {
 				ThreadLocalUserActivityLoggerInstaller.resetUserActivityLogger();
 				I18nManager.remove18nInfoFromThread();
@@ -174,7 +181,7 @@ public class RestApiLoginFilter implements Filter {
 						if(identity == null) {
 							return false;
 						}
-						
+
 						UserRequest ureq = null;
 						try{
 							//upon creation URL is checked for
@@ -183,7 +190,7 @@ public class RestApiLoginFilter implements Filter {
 							return false;
 						}
 						request.setAttribute(RestSecurityHelper.SEC_USER_REQUEST, ureq);
-						
+
 						int loginStatus = AuthHelper.doHeadlessLogin(identity, BaseSecurityModule.getDefaultAuthProviderIdentifier(), ureq, true);
 						if (loginStatus == AuthHelper.LOGIN_OK) {
 							UserDeletionManager.getInstance().setIdentityAsActiv(identity);
@@ -199,18 +206,18 @@ public class RestApiLoginFilter implements Filter {
 		}
 		return false;
 	}
-	
+
 	private void followBasicAuthenticated(ServletRequest request, ServletResponse response, FilterChain chain)
 	throws ServletException, IOException {
 		chain.doFilter(request, response);
 	}
-	
+
 	private boolean isRequestTokenValid(HttpServletRequest request) {
 		String token = request.getHeader(RestSecurityHelper.SEC_TOKEN);
 		RestSecurityBean securityBean =  CoreSpringFactory.getImpl(RestSecurityBean.class);
 		return securityBean.isTokenRegistrated(token, request.getSession(true));
 	}
-	
+
 	private boolean isRequestURIInLoginSpace(String requestURI) {
 		String loginUrl = getLoginUrl();
 		if(loginUrl != null && requestURI.startsWith(loginUrl)) {
@@ -218,7 +225,7 @@ public class RestApiLoginFilter implements Filter {
 		}
 		return false;
 	}
-	
+
 	private boolean isRequestURIInOpenSpace(String requestURI) {
 		List<String> uris = getOpenURIs();
 		if(uris == null) return false;
@@ -229,7 +236,7 @@ public class RestApiLoginFilter implements Filter {
 		}
 		return false;
 	}
-	
+
 	private boolean isRequestURIInIPProtectedSpace(String requestURI, HttpServletRequest httpRequest, RestModule restModule) {
 		List<String> uris = getIPProtectedURIs();
 		if(uris == null) return false;
@@ -243,7 +250,7 @@ public class RestApiLoginFilter implements Filter {
 		}
 		return false;
 	}
-	
+
 	private boolean isRequestURIAlwaysEnabled(String requestURI) {
 		List<String> uris = getAlwaysEnabledURIs();
 		if(uris == null) return false;
@@ -254,8 +261,8 @@ public class RestApiLoginFilter implements Filter {
 		}
 		return false;
 	}
-	
-	private void followForAuthentication(String requestURI, UserSession uress, HttpServletRequest request, HttpServletResponse response, FilterChain chain) 
+
+	private void followForAuthentication(String requestURI, UserSession uress, HttpServletRequest request, HttpServletResponse response, FilterChain chain)
 	throws IOException, ServletException {
 	//create a session for login without security check
 		if(uress == null) {
@@ -263,18 +270,18 @@ public class RestApiLoginFilter implements Filter {
 		}
 		UserRequest ureq = null;
 		try{
-			//upon creation URL is checked for 
+			//upon creation URL is checked for
 			ureq = new UserRequestImpl(requestURI, request, response);
 		} catch(NumberFormatException nfe) {
 			response.sendError(401);
 			return;
 		}
-		
+
 		request.setAttribute(RestSecurityHelper.SEC_USER_REQUEST, ureq);
 		chain.doFilter(request, response);
 	}
-	
-	private void followWithoutAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain) 
+
+	private void followWithoutAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
 	throws IOException, ServletException {
 		UserSession uress = CoreSpringFactory.getImpl(UserSessionManager.class).getUserSessionIfAlreadySet(request);
 		if(uress != null && uress.isAuthenticated()) {
@@ -282,7 +289,7 @@ public class RestApiLoginFilter implements Filter {
 			followSession(request, response, chain);
 			return;
 		}
-		
+
 		String token = request.getHeader(RestSecurityHelper.SEC_TOKEN);
 		RestSecurityBean securityBean = (RestSecurityBean)CoreSpringFactory.getBean(RestSecurityBean.class);
 		if(StringHelper.containsNonWhitespace(token) && securityBean.isTokenRegistrated(token, request.getSession(true))) {
@@ -301,12 +308,12 @@ public class RestApiLoginFilter implements Filter {
 			return;
 		}
 		request.setAttribute(RestSecurityHelper.SEC_USER_REQUEST, ureq);
-		
+
 		//no authentication, but no authentication needed, go further
 		chain.doFilter(request, response);
 	}
-	
-	private void upgradeIpAuthentication(HttpServletRequest request, HttpServletResponse response) 
+
+	private void upgradeIpAuthentication(HttpServletRequest request, HttpServletResponse response)
 	throws IOException, ServletException {
 		UserSessionManager sessionManager = CoreSpringFactory.getImpl(UserSessionManager.class);
 		UserSession usess = sessionManager.getUserSessionIfAlreadySet(request);
@@ -315,7 +322,7 @@ public class RestApiLoginFilter implements Filter {
 		}
 		if(usess.getIdentity() == null) {
 			usess.setRoles(new Roles(false, false, false, false, false, false, false));
-			
+
 			String remoteAddr = request.getRemoteAddr();
 			SessionInfo sinfo = new SessionInfo(new Long(-1), "REST", request.getSession());
 			sinfo.setFirstname("REST");
@@ -336,7 +343,7 @@ public class RestApiLoginFilter implements Filter {
 			// set session info for this session
 			usess.setSessionInfo(sinfo);
 		}
-		
+
 		UserRequest ureq = null;
 		try{
 			//upon creation URL is checked for
@@ -349,8 +356,8 @@ public class RestApiLoginFilter implements Filter {
 		}
 		request.setAttribute(RestSecurityHelper.SEC_USER_REQUEST, ureq);
 	}
-	
-	private void followToken(String token, HttpServletRequest request, HttpServletResponse response, FilterChain chain) 
+
+	private void followToken(String token, HttpServletRequest request, HttpServletResponse response, FilterChain chain)
 	throws IOException, ServletException {
 		HttpSession session = request.getSession(true);
 		session.setMaxInactiveInterval(TOKEN_BASED_SESSION_TIMEOUT);
@@ -365,7 +372,7 @@ public class RestApiLoginFilter implements Filter {
 				response.sendError(500);
 				return;
 			}
-			
+
 			request.setAttribute(RestSecurityHelper.SEC_USER_REQUEST, ureq);
 			RestSecurityBean securityBean = (RestSecurityBean)CoreSpringFactory.getBean(RestSecurityBean.class);
 			Identity identity = securityBean.getIdentity(token);
@@ -378,7 +385,7 @@ public class RestApiLoginFilter implements Filter {
 			} else response.sendError(401);
 		} else response.sendError(401);
 	}
-	
+
 	private void followSession(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
 	throws IOException, ServletException {
 		UserSession uress = CoreSpringFactory.getImpl(UserSessionManager.class).getUserSessionIfAlreadySet(request);
@@ -400,14 +407,14 @@ public class RestApiLoginFilter implements Filter {
 			response.sendError(401);
 		}
 	}
-	
+
 	private boolean isWebappHelperInitiated() {
 		if(Settings.isJUnitTest()) {
 			return true;
 		}
 		return WebappHelper.getServletContextPath() != null;
 	}
-	
+
 	private String getLoginUrl() {
 		if(LOGIN_URL == null && isWebappHelperInitiated()) {
 			String context = (Settings.isJUnitTest() ? "/olat" : WebappHelper.getServletContextPath() + RestSecurityHelper.SUB_CONTEXT);
@@ -415,7 +422,7 @@ public class RestApiLoginFilter implements Filter {
 		}
 		return LOGIN_URL;
 	}
-	
+
 	private List<String> getAlwaysEnabledURIs() {
 		if(alwaysEnabledUrls == null && isWebappHelperInitiated() ) {
 			String context = (Settings.isJUnitTest() ? "/olat" : WebappHelper.getServletContextPath() + RestSecurityHelper.SUB_CONTEXT);
@@ -429,7 +436,7 @@ public class RestApiLoginFilter implements Filter {
 		}
 		return alwaysEnabledUrls;
 	}
-	
+
 	private List<String> getOpenURIs() {
 		if(openUrls == null && isWebappHelperInitiated()) {
 			String context = (Settings.isJUnitTest() ? "/olat" : WebappHelper.getServletContextPath() + RestSecurityHelper.SUB_CONTEXT);
@@ -446,7 +453,7 @@ public class RestApiLoginFilter implements Filter {
 		}
 		return openUrls;
 	}
-	
+
 	private List<String> getIPProtectedURIs() {
 		if(ipProtectedUrls == null && isWebappHelperInitiated()) {
 			String context = (Settings.isJUnitTest() ? "/olat" : WebappHelper.getServletContextPath() + RestSecurityHelper.SUB_CONTEXT);
-- 
GitLab