104 lines
3.3 KiB
JavaScript
104 lines
3.3 KiB
JavaScript
/*
|
|
* Axelor Business Solutions
|
|
*
|
|
* Copyright (C) 2005-2019 Axelor (<http://axelor.com>).
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License, version 3,
|
|
* as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
/**
|
|
* @license HTTP Auth Interceptor Module for AngularJS
|
|
* (c) 2012 Witold Szczerba
|
|
* License: MIT
|
|
*/
|
|
(function () {
|
|
|
|
"use strict";
|
|
|
|
angular.module('axelor.auth', []).provider('authService', function() {
|
|
/**
|
|
* Holds all the requests which failed due to 401 response,
|
|
* so they can be re-requested in future, once login is completed.
|
|
*/
|
|
var buffer = [];
|
|
|
|
/**
|
|
* Required by HTTP interceptor.
|
|
* Function is attached to provider to be invisible for regular users of this service.
|
|
*/
|
|
this.pushToBuffer = function(config, deferred) {
|
|
buffer.push({
|
|
config: config,
|
|
deferred: deferred
|
|
});
|
|
};
|
|
|
|
this.$get = ['$rootScope','$injector', function($rootScope, $injector) {
|
|
var $http; //initialized later because of circular dependency problem
|
|
function retry(config, deferred) {
|
|
setTimeout(axelor.blockUI);
|
|
$http = $http || $injector.get('$http');
|
|
$http(config).then(function(response) {
|
|
deferred.resolve(response);
|
|
});
|
|
}
|
|
function retryAll() {
|
|
for (var i = 0; i < buffer.length; ++i) {
|
|
retry(buffer[i].config, buffer[i].deferred);
|
|
}
|
|
buffer = [];
|
|
}
|
|
return {
|
|
loginConfirmed: function() {
|
|
$rootScope.$broadcast('event:auth-loginConfirmed');
|
|
retryAll();
|
|
}
|
|
};
|
|
}];
|
|
})
|
|
|
|
/**
|
|
* $http interceptor.
|
|
* On 401 response - it stores the request and broadcasts 'event:angular-auth-loginRequired'.
|
|
*/
|
|
.config(['$httpProvider', 'authServiceProvider', function($httpProvider, authServiceProvider) {
|
|
|
|
$httpProvider.interceptors.push(['$rootScope', '$q', function($rootScope, $q) {
|
|
return {
|
|
responseError: function error(response) {
|
|
if (response.status === 401 && axelor.config['auth.central.client']) {
|
|
// redirect to central login page
|
|
window.location.href = './?client_name=' + axelor.config['auth.central.client']
|
|
+ "&hash_location=" + encodeURIComponent(window.location.hash);
|
|
return $q.reject(response);
|
|
}
|
|
if (response.status === 401 || response.status === 502 || (response.status === 0 && !response.data)) {
|
|
var deferred = $q.defer();
|
|
authServiceProvider.pushToBuffer(response.config, deferred);
|
|
if (!response.config.silent) {
|
|
$rootScope.$broadcast('event:auth-loginRequired', response.status);
|
|
}
|
|
return deferred.promise;
|
|
}
|
|
// redirect to the CAS login page
|
|
if (response.status === 302 || response.status === 307) {
|
|
window.location.reload();
|
|
}
|
|
// otherwise
|
|
return $q.reject(response);
|
|
}
|
|
};
|
|
}]);
|
|
}]);
|
|
|
|
})();
|