Explorar o código

redirect to /login on failed requests

Brian Gough %!s(int64=10) %!d(string=hai) anos
pai
achega
f54bb9744a

+ 3 - 1
services/web/public/coffee/directives/asyncForm.coffee

@@ -24,8 +24,10 @@ define [
 
 
 					scope[attrs.name].inflight = true
 					scope[attrs.name].inflight = true
 
 
+					# for asyncForm prevent automatic redirect to /login if
+					# authentication fails, we will handle it ourselves
 					$http
 					$http
-						.post(element.attr('action'), formData)
+						.post(element.attr('action'), formData, {disableAutoLoginRedirect: true})
 						.success (data, status, headers, config) ->
 						.success (data, status, headers, config) ->
 							scope[attrs.name].inflight = false
 							scope[attrs.name].inflight = false
 							response.success = true
 							response.success = true

+ 1 - 0
services/web/public/coffee/main/account-settings.coffee

@@ -57,6 +57,7 @@ define [
 							"Content-Type": 'application/json'
 							"Content-Type": 'application/json'
 						data:
 						data:
 							password: $scope.state.password
 							password: $scope.state.password
+						disableAutoLoginRedirect: true # we want to handle errors ourselves
 					})
 					})
 					.success () ->
 					.success () ->
 						$modalInstance.close()
 						$modalInstance.close()

+ 22 - 2
services/web/public/coffee/modules/errorCatcher.coffee

@@ -9,6 +9,26 @@ app.config ['$provide', ($provide) ->
 	]
 	]
 ]
 ]
 
 
-# TODO: add support for an errorHttpInterceptor to catch failing ajax
-# requests as described at
+# Interceptor to check auth failures in all $http requests
 # http://bahmutov.calepin.co/catch-all-errors-in-angular-app.html
 # http://bahmutov.calepin.co/catch-all-errors-in-angular-app.html
+
+app.factory 'unAuthHttpResponseInterceptor', ['$q','$location', ($q, $location) ->
+		responseError: (response) ->
+			# redirect any unauthorised or forbidden responses back to /login
+			#
+			# set disableAutoLoginRedirect:true in the http request config
+			# to disable this behaviour
+			if response.status in [401, 403] and not response.config?.disableAutoLoginRedirect
+				# for /project urls set the ?redir parameter to come back here
+				# otherwise just go to the login page
+				if window.location.pathname.match(/^\/project/)
+					window.location = "/login?redir=#{encodeURI(window.location.pathname)}"
+				else
+					window.location = "/login"
+			# pass the response back to the original requester
+			return $q.reject(response)
+]
+
+app.config ['$httpProvider', ($httpProvider) ->
+	$httpProvider.interceptors.push 'unAuthHttpResponseInterceptor'
+]