| 
					
				 | 
			
			
				@@ -15,12 +15,14 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package org.springframework.security.oauth2.client.web; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.Map; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationResponse; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.util.LinkedMultiValueMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.util.MultiValueMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.util.StringUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import javax.servlet.http.HttpServletRequest; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * Utility methods for an OAuth 2.0 Authorization Response. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -33,25 +35,36 @@ final class OAuth2AuthorizationResponseUtils { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	private OAuth2AuthorizationResponseUtils() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	static boolean isAuthorizationResponse(HttpServletRequest request) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	static MultiValueMap<String, String> toMultiMap(Map<String, String[]> map) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		MultiValueMap<String, String> params = new LinkedMultiValueMap<>(map.size()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		map.forEach((key, values) -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (values.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				for (String value : values) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					params.add(key, value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return params; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	static boolean isAuthorizationResponse(MultiValueMap<String, String> request) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return isAuthorizationResponseSuccess(request) || isAuthorizationResponseError(request); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	static boolean isAuthorizationResponseSuccess(HttpServletRequest request) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return StringUtils.hasText(request.getParameter(OAuth2ParameterNames.CODE)) && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			StringUtils.hasText(request.getParameter(OAuth2ParameterNames.STATE)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	static boolean isAuthorizationResponseSuccess(MultiValueMap<String, String> request) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return StringUtils.hasText(request.getFirst(OAuth2ParameterNames.CODE)) && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			StringUtils.hasText(request.getFirst(OAuth2ParameterNames.STATE)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	static boolean isAuthorizationResponseError(HttpServletRequest request) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return StringUtils.hasText(request.getParameter(OAuth2ParameterNames.ERROR)) && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			StringUtils.hasText(request.getParameter(OAuth2ParameterNames.STATE)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	static boolean isAuthorizationResponseError(MultiValueMap<String, String> request) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return StringUtils.hasText(request.getFirst(OAuth2ParameterNames.ERROR)) && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			StringUtils.hasText(request.getFirst(OAuth2ParameterNames.STATE)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	static OAuth2AuthorizationResponse convert(HttpServletRequest request) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		String code = request.getParameter(OAuth2ParameterNames.CODE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		String errorCode = request.getParameter(OAuth2ParameterNames.ERROR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		String state = request.getParameter(OAuth2ParameterNames.STATE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		String redirectUri = request.getRequestURL().toString(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	static OAuth2AuthorizationResponse convert(MultiValueMap<String, String> request, String redirectUri) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		String code = request.getFirst(OAuth2ParameterNames.CODE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		String errorCode = request.getFirst(OAuth2ParameterNames.ERROR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		String state = request.getFirst(OAuth2ParameterNames.STATE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if (StringUtils.hasText(code)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return OAuth2AuthorizationResponse.success(code) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -59,8 +72,8 @@ final class OAuth2AuthorizationResponseUtils { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				.state(state) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				.build(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			String errorDescription = request.getParameter(OAuth2ParameterNames.ERROR_DESCRIPTION); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			String errorUri = request.getParameter(OAuth2ParameterNames.ERROR_URI); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			String errorDescription = request.getFirst(OAuth2ParameterNames.ERROR_DESCRIPTION); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			String errorUri = request.getFirst(OAuth2ParameterNames.ERROR_URI); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return OAuth2AuthorizationResponse.error(errorCode) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				.redirectUri(redirectUri) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				.errorDescription(errorDescription) 
			 |