2016-12-01 11:40:28 +02:00
|
|
|
/*
|
2019-02-01 16:39:33 +02:00
|
|
|
* Copyright © 2016-2019 The Thingsboard Authors
|
2016-12-01 11:40:28 +02:00
|
|
|
*
|
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
|
*
|
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
*
|
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
|
* limitations under the License.
|
|
|
|
|
*/
|
|
|
|
|
import thingsboardApiLogin from './login.service';
|
|
|
|
|
import angularStorage from 'angular-storage';
|
|
|
|
|
|
|
|
|
|
export default angular.module('thingsboard.api.user', [thingsboardApiLogin,
|
|
|
|
|
angularStorage])
|
|
|
|
|
.factory('userService', UserService)
|
|
|
|
|
.name;
|
|
|
|
|
|
|
|
|
|
/*@ngInject*/
|
2018-10-08 20:14:49 +03:00
|
|
|
function UserService($http, $q, $rootScope, adminService, dashboardService, timeService, loginService, toast, store, jwtHelper, $translate, $state, $location) {
|
2016-12-01 11:40:28 +02:00
|
|
|
var currentUser = null,
|
2017-03-07 17:34:46 +02:00
|
|
|
currentUserDetails = null,
|
2017-04-23 18:04:55 +03:00
|
|
|
lastPublicDashboardId = null,
|
2017-03-15 18:55:50 +02:00
|
|
|
allowedDashboardIds = [],
|
2018-11-15 16:34:37 +02:00
|
|
|
redirectParams = null,
|
2018-08-17 15:59:14 +03:00
|
|
|
userTokenAccessEnabled = false,
|
2016-12-01 11:40:28 +02:00
|
|
|
userLoaded = false;
|
|
|
|
|
|
|
|
|
|
var refreshTokenQueue = [];
|
|
|
|
|
|
|
|
|
|
var service = {
|
|
|
|
|
deleteUser: deleteUser,
|
|
|
|
|
getAuthority: getAuthority,
|
2017-04-23 18:04:55 +03:00
|
|
|
isPublic: isPublic,
|
|
|
|
|
getPublicId: getPublicId,
|
|
|
|
|
parsePublicId: parsePublicId,
|
2016-12-01 11:40:28 +02:00
|
|
|
isAuthenticated: isAuthenticated,
|
|
|
|
|
getCurrentUser: getCurrentUser,
|
|
|
|
|
getCustomerUsers: getCustomerUsers,
|
|
|
|
|
getUser: getUser,
|
|
|
|
|
getTenantAdmins: getTenantAdmins,
|
|
|
|
|
isUserLoaded: isUserLoaded,
|
|
|
|
|
saveUser: saveUser,
|
|
|
|
|
sendActivationEmail: sendActivationEmail,
|
2017-07-21 17:31:59 +03:00
|
|
|
getActivationLink: getActivationLink,
|
2016-12-01 11:40:28 +02:00
|
|
|
setUserFromJwtToken: setUserFromJwtToken,
|
|
|
|
|
getJwtToken: getJwtToken,
|
|
|
|
|
clearJwtToken: clearJwtToken,
|
|
|
|
|
isJwtTokenValid : isJwtTokenValid,
|
|
|
|
|
validateJwtToken: validateJwtToken,
|
|
|
|
|
refreshJwtToken: refreshJwtToken,
|
|
|
|
|
refreshTokenPending: refreshTokenPending,
|
|
|
|
|
updateAuthorizationHeader: updateAuthorizationHeader,
|
2018-02-21 20:05:03 +02:00
|
|
|
setAuthorizationRequestHeader: setAuthorizationRequestHeader,
|
2018-11-15 16:34:37 +02:00
|
|
|
setRedirectParams: setRedirectParams,
|
2017-03-07 17:34:46 +02:00
|
|
|
gotoDefaultPlace: gotoDefaultPlace,
|
|
|
|
|
forceDefaultPlace: forceDefaultPlace,
|
2017-04-23 18:04:55 +03:00
|
|
|
updateLastPublicDashboardId: updateLastPublicDashboardId,
|
|
|
|
|
logout: logout,
|
2018-08-17 15:59:14 +03:00
|
|
|
reloadUser: reloadUser,
|
|
|
|
|
isUserTokenAccessEnabled: isUserTokenAccessEnabled,
|
2019-09-10 15:45:20 +03:00
|
|
|
loginAsUser: loginAsUser,
|
|
|
|
|
setUserCredentialsEnabled: setUserCredentialsEnabled
|
2016-12-01 11:40:28 +02:00
|
|
|
}
|
|
|
|
|
|
2017-04-23 18:04:55 +03:00
|
|
|
reloadUser();
|
2016-12-01 11:40:28 +02:00
|
|
|
|
|
|
|
|
return service;
|
|
|
|
|
|
2017-04-23 18:04:55 +03:00
|
|
|
function reloadUser() {
|
|
|
|
|
userLoaded = false;
|
|
|
|
|
loadUser(true).then(function success() {
|
|
|
|
|
notifyUserLoaded();
|
|
|
|
|
}, function fail() {
|
|
|
|
|
notifyUserLoaded();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function updateAndValidateToken(token, prefix, notify) {
|
2016-12-01 11:40:28 +02:00
|
|
|
var valid = false;
|
|
|
|
|
var tokenData = jwtHelper.decodeToken(token);
|
|
|
|
|
var issuedAt = tokenData.iat;
|
|
|
|
|
var expTime = tokenData.exp;
|
|
|
|
|
if (issuedAt && expTime) {
|
|
|
|
|
var ttl = expTime - issuedAt;
|
|
|
|
|
if (ttl > 0) {
|
|
|
|
|
var clientExpiration = new Date().valueOf() + ttl*1000;
|
|
|
|
|
store.set(prefix, token);
|
|
|
|
|
store.set(prefix + '_expiration', clientExpiration);
|
|
|
|
|
valid = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-04-23 18:04:55 +03:00
|
|
|
if (!valid && notify) {
|
2016-12-01 11:40:28 +02:00
|
|
|
$rootScope.$broadcast('unauthenticated');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function clearTokenData() {
|
|
|
|
|
store.remove('jwt_token');
|
|
|
|
|
store.remove('jwt_token_expiration');
|
|
|
|
|
store.remove('refresh_token');
|
|
|
|
|
store.remove('refresh_token_expiration');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function setUserFromJwtToken(jwtToken, refreshToken, notify, doLogout) {
|
|
|
|
|
currentUser = null;
|
2017-03-07 17:34:46 +02:00
|
|
|
currentUserDetails = null;
|
2017-04-23 18:04:55 +03:00
|
|
|
lastPublicDashboardId = null;
|
2018-08-17 15:59:14 +03:00
|
|
|
userTokenAccessEnabled = false;
|
2017-03-15 18:55:50 +02:00
|
|
|
allowedDashboardIds = [];
|
2016-12-01 11:40:28 +02:00
|
|
|
if (!jwtToken) {
|
|
|
|
|
clearTokenData();
|
|
|
|
|
if (notify) {
|
|
|
|
|
$rootScope.$broadcast('unauthenticated', doLogout);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2017-04-23 18:04:55 +03:00
|
|
|
updateAndValidateToken(jwtToken, 'jwt_token', true);
|
|
|
|
|
updateAndValidateToken(refreshToken, 'refresh_token', true);
|
2016-12-01 11:40:28 +02:00
|
|
|
if (notify) {
|
|
|
|
|
loadUser(false).then(function success() {
|
|
|
|
|
$rootScope.$broadcast('authenticated');
|
|
|
|
|
}, function fail() {
|
|
|
|
|
$rootScope.$broadcast('unauthenticated');
|
|
|
|
|
});
|
|
|
|
|
} else {
|
2018-11-15 16:34:37 +02:00
|
|
|
loadUser(false);
|
2016-12-01 11:40:28 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function isAuthenticated() {
|
|
|
|
|
return store.get('jwt_token');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getJwtToken() {
|
|
|
|
|
return store.get('jwt_token');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function logout() {
|
2019-07-18 18:11:58 +03:00
|
|
|
$http.post('/api/auth/logout', null, {ignoreErrors: true}).then(function success() {
|
|
|
|
|
clearJwtToken(true);
|
|
|
|
|
}, function fail() {
|
|
|
|
|
clearJwtToken(true);
|
|
|
|
|
});
|
2016-12-01 11:40:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function clearJwtToken(doLogout) {
|
|
|
|
|
setUserFromJwtToken(null, null, true, doLogout);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function isJwtTokenValid() {
|
|
|
|
|
return isTokenValid('jwt_token');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function isTokenValid(prefix) {
|
|
|
|
|
var clientExpiration = store.get(prefix + '_expiration');
|
|
|
|
|
return clientExpiration && clientExpiration > new Date().valueOf();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function validateJwtToken(doRefresh) {
|
|
|
|
|
var deferred = $q.defer();
|
|
|
|
|
if (!isTokenValid('jwt_token')) {
|
|
|
|
|
if (doRefresh) {
|
|
|
|
|
refreshJwtToken().then(function success() {
|
|
|
|
|
deferred.resolve();
|
|
|
|
|
}, function fail() {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
clearJwtToken(false);
|
|
|
|
|
deferred.reject();
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
deferred.resolve();
|
|
|
|
|
}
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function resolveRefreshTokenQueue(data) {
|
2017-03-24 12:36:53 +02:00
|
|
|
for (var q=0; q < refreshTokenQueue.length;q++) {
|
2016-12-01 11:40:28 +02:00
|
|
|
refreshTokenQueue[q].resolve(data);
|
|
|
|
|
}
|
|
|
|
|
refreshTokenQueue = [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function rejectRefreshTokenQueue(message) {
|
2017-03-24 12:36:53 +02:00
|
|
|
for (var q=0;q<refreshTokenQueue.length;q++) {
|
2016-12-01 11:40:28 +02:00
|
|
|
refreshTokenQueue[q].reject(message);
|
|
|
|
|
}
|
|
|
|
|
refreshTokenQueue = [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function refreshTokenPending() {
|
|
|
|
|
return refreshTokenQueue.length > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function refreshJwtToken() {
|
|
|
|
|
var deferred = $q.defer();
|
|
|
|
|
refreshTokenQueue.push(deferred);
|
|
|
|
|
if (refreshTokenQueue.length === 1) {
|
|
|
|
|
var refreshToken = store.get('refresh_token');
|
|
|
|
|
var refreshTokenValid = isTokenValid('refresh_token');
|
|
|
|
|
setUserFromJwtToken(null, null, false, false);
|
|
|
|
|
if (!refreshTokenValid) {
|
|
|
|
|
rejectRefreshTokenQueue($translate.instant('access.refresh-token-expired'));
|
|
|
|
|
} else {
|
|
|
|
|
var refreshTokenRequest = {
|
|
|
|
|
refreshToken: refreshToken
|
|
|
|
|
};
|
|
|
|
|
$http.post('/api/auth/token', refreshTokenRequest).then(function success(response) {
|
|
|
|
|
var token = response.data.token;
|
|
|
|
|
var refreshToken = response.data.refreshToken;
|
|
|
|
|
setUserFromJwtToken(token, refreshToken, false);
|
|
|
|
|
resolveRefreshTokenQueue(response.data);
|
|
|
|
|
}, function fail() {
|
|
|
|
|
clearJwtToken(false);
|
|
|
|
|
rejectRefreshTokenQueue($translate.instant('access.refresh-token-failed'));
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getCurrentUser() {
|
|
|
|
|
return currentUser;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getAuthority() {
|
|
|
|
|
if (currentUser) {
|
|
|
|
|
return currentUser.authority;
|
|
|
|
|
} else {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-04-23 18:04:55 +03:00
|
|
|
function isPublic() {
|
|
|
|
|
if (currentUser) {
|
|
|
|
|
return currentUser.isPublic;
|
|
|
|
|
} else {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getPublicId() {
|
|
|
|
|
if (isPublic()) {
|
|
|
|
|
return currentUser.sub;
|
|
|
|
|
} else {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function parsePublicId() {
|
|
|
|
|
var token = getJwtToken();
|
|
|
|
|
if (token) {
|
|
|
|
|
var tokenData = jwtHelper.decodeToken(token);
|
|
|
|
|
if (tokenData && tokenData.isPublic) {
|
|
|
|
|
return tokenData.sub;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2016-12-01 11:40:28 +02:00
|
|
|
function isUserLoaded() {
|
|
|
|
|
return userLoaded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function loadUser(doTokenRefresh) {
|
2017-04-23 18:04:55 +03:00
|
|
|
|
2016-12-01 11:40:28 +02:00
|
|
|
var deferred = $q.defer();
|
2017-04-23 18:04:55 +03:00
|
|
|
|
|
|
|
|
function fetchAllowedDashboardIds() {
|
|
|
|
|
var pageLink = {limit: 100};
|
2017-05-24 10:39:33 +03:00
|
|
|
var fetchDashboardsPromise;
|
|
|
|
|
if (currentUser.authority === 'TENANT_ADMIN') {
|
2018-03-01 11:52:52 +02:00
|
|
|
fetchDashboardsPromise = dashboardService.getTenantDashboards(pageLink);
|
2017-05-24 10:39:33 +03:00
|
|
|
} else {
|
2018-03-01 11:52:52 +02:00
|
|
|
fetchDashboardsPromise = dashboardService.getCustomerDashboards(currentUser.customerId, pageLink);
|
2017-05-24 10:39:33 +03:00
|
|
|
}
|
|
|
|
|
fetchDashboardsPromise.then(
|
2017-04-23 18:04:55 +03:00
|
|
|
function success(result) {
|
|
|
|
|
var dashboards = result.data;
|
|
|
|
|
for (var d=0;d<dashboards.length;d++) {
|
|
|
|
|
allowedDashboardIds.push(dashboards[d].id.id);
|
|
|
|
|
}
|
|
|
|
|
deferred.resolve();
|
|
|
|
|
},
|
|
|
|
|
function fail() {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-11 22:00:22 +03:00
|
|
|
function updateUserLang() {
|
|
|
|
|
if (currentUserDetails.additionalInfo && currentUserDetails.additionalInfo.lang) {
|
|
|
|
|
$translate.use(currentUserDetails.additionalInfo.lang);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-04-23 18:04:55 +03:00
|
|
|
function procceedJwtTokenValidate() {
|
2016-12-01 11:40:28 +02:00
|
|
|
validateJwtToken(doTokenRefresh).then(function success() {
|
|
|
|
|
var jwtToken = store.get('jwt_token');
|
|
|
|
|
currentUser = jwtHelper.decodeToken(jwtToken);
|
|
|
|
|
if (currentUser && currentUser.scopes && currentUser.scopes.length > 0) {
|
|
|
|
|
currentUser.authority = currentUser.scopes[0];
|
|
|
|
|
} else if (currentUser) {
|
|
|
|
|
currentUser.authority = "ANONYMOUS";
|
|
|
|
|
}
|
2018-08-17 15:59:14 +03:00
|
|
|
var sysParamsPromise = loadSystemParams();
|
2017-04-23 18:04:55 +03:00
|
|
|
if (currentUser.isPublic) {
|
|
|
|
|
$rootScope.forceFullscreen = true;
|
2018-08-17 15:59:14 +03:00
|
|
|
sysParamsPromise.then(
|
|
|
|
|
() => { fetchAllowedDashboardIds(); },
|
|
|
|
|
() => { deferred.reject(); }
|
|
|
|
|
);
|
2017-04-23 18:04:55 +03:00
|
|
|
} else if (currentUser.userId) {
|
2017-11-16 18:58:10 +02:00
|
|
|
getUser(currentUser.userId, true).then(
|
2017-03-07 17:34:46 +02:00
|
|
|
function success(user) {
|
2018-08-17 15:59:14 +03:00
|
|
|
sysParamsPromise.then(
|
|
|
|
|
() => {
|
|
|
|
|
currentUserDetails = user;
|
|
|
|
|
updateUserLang();
|
|
|
|
|
$rootScope.forceFullscreen = false;
|
|
|
|
|
if (userForceFullscreen()) {
|
|
|
|
|
$rootScope.forceFullscreen = true;
|
|
|
|
|
}
|
|
|
|
|
if ($rootScope.forceFullscreen && (currentUser.authority === 'TENANT_ADMIN' ||
|
|
|
|
|
currentUser.authority === 'CUSTOMER_USER')) {
|
|
|
|
|
fetchAllowedDashboardIds();
|
|
|
|
|
} else {
|
|
|
|
|
deferred.resolve();
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
() => {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
logout();
|
|
|
|
|
}
|
|
|
|
|
);
|
2017-03-07 17:34:46 +02:00
|
|
|
},
|
|
|
|
|
function fail() {
|
|
|
|
|
deferred.reject();
|
2017-11-16 18:58:10 +02:00
|
|
|
logout();
|
2017-03-07 17:34:46 +02:00
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
} else {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
}
|
2016-12-01 11:40:28 +02:00
|
|
|
}, function fail() {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
});
|
2017-04-23 18:04:55 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!currentUser) {
|
|
|
|
|
var locationSearch = $location.search();
|
|
|
|
|
if (locationSearch.publicId) {
|
|
|
|
|
loginService.publicLogin(locationSearch.publicId).then(function success(response) {
|
|
|
|
|
var token = response.data.token;
|
|
|
|
|
var refreshToken = response.data.refreshToken;
|
|
|
|
|
updateAndValidateToken(token, 'jwt_token', false);
|
|
|
|
|
updateAndValidateToken(refreshToken, 'refresh_token', false);
|
|
|
|
|
procceedJwtTokenValidate();
|
|
|
|
|
}, function fail() {
|
2017-10-16 15:32:12 +03:00
|
|
|
$location.search('publicId', null);
|
2017-04-23 18:04:55 +03:00
|
|
|
deferred.reject();
|
|
|
|
|
});
|
2019-03-15 19:07:52 +02:00
|
|
|
} else if (locationSearch.accessToken) {
|
|
|
|
|
var token = locationSearch.accessToken;
|
|
|
|
|
var refreshToken = locationSearch.refreshToken;
|
|
|
|
|
$location.search('accessToken', null);
|
|
|
|
|
if (refreshToken) {
|
|
|
|
|
$location.search('refreshToken', null);
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
updateAndValidateToken(token, 'jwt_token', false);
|
|
|
|
|
if (refreshToken) {
|
|
|
|
|
updateAndValidateToken(refreshToken, 'refresh_token', false);
|
|
|
|
|
} else {
|
|
|
|
|
store.remove('refresh_token');
|
|
|
|
|
store.remove('refresh_token_expiration');
|
|
|
|
|
}
|
|
|
|
|
} catch (e) {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
}
|
|
|
|
|
procceedJwtTokenValidate();
|
2017-04-23 18:04:55 +03:00
|
|
|
} else {
|
|
|
|
|
procceedJwtTokenValidate();
|
|
|
|
|
}
|
2016-12-01 11:40:28 +02:00
|
|
|
} else {
|
|
|
|
|
deferred.resolve();
|
|
|
|
|
}
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
2018-08-17 15:59:14 +03:00
|
|
|
function loadIsUserTokenAccessEnabled() {
|
|
|
|
|
var deferred = $q.defer();
|
|
|
|
|
if (currentUser.authority === 'SYS_ADMIN' || currentUser.authority === 'TENANT_ADMIN') {
|
|
|
|
|
var url = '/api/user/tokenAccessEnabled';
|
|
|
|
|
$http.get(url).then(function success(response) {
|
|
|
|
|
userTokenAccessEnabled = response.data;
|
|
|
|
|
deferred.resolve(response.data);
|
|
|
|
|
}, function fail() {
|
|
|
|
|
userTokenAccessEnabled = false;
|
|
|
|
|
deferred.reject();
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
userTokenAccessEnabled = false;
|
|
|
|
|
deferred.resolve(false);
|
|
|
|
|
}
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function loadSystemParams() {
|
|
|
|
|
var promises = [];
|
|
|
|
|
promises.push(loadIsUserTokenAccessEnabled());
|
2018-10-08 20:14:49 +03:00
|
|
|
promises.push(timeService.loadMaxDatapointsLimit());
|
2018-08-17 15:59:14 +03:00
|
|
|
return $q.all(promises);
|
|
|
|
|
}
|
|
|
|
|
|
2016-12-01 11:40:28 +02:00
|
|
|
function notifyUserLoaded() {
|
|
|
|
|
if (!userLoaded) {
|
|
|
|
|
userLoaded = true;
|
|
|
|
|
$rootScope.$broadcast('userLoaded');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function updateAuthorizationHeader(headers) {
|
|
|
|
|
var jwtToken = store.get('jwt_token');
|
|
|
|
|
if (jwtToken) {
|
|
|
|
|
headers['X-Authorization'] = 'Bearer ' + jwtToken;
|
|
|
|
|
}
|
|
|
|
|
return jwtToken;
|
|
|
|
|
}
|
|
|
|
|
|
2018-02-21 20:05:03 +02:00
|
|
|
function setAuthorizationRequestHeader(request) {
|
|
|
|
|
var jwtToken = store.get('jwt_token');
|
|
|
|
|
if (jwtToken) {
|
|
|
|
|
request.setRequestHeader('X-Authorization', 'Bearer ' + jwtToken);
|
|
|
|
|
}
|
|
|
|
|
return jwtToken;
|
|
|
|
|
}
|
|
|
|
|
|
2016-12-01 11:40:28 +02:00
|
|
|
function getTenantAdmins(tenantId, pageLink) {
|
|
|
|
|
var deferred = $q.defer();
|
|
|
|
|
var url = '/api/tenant/' + tenantId + '/users?limit=' + pageLink.limit;
|
|
|
|
|
if (angular.isDefined(pageLink.textSearch)) {
|
|
|
|
|
url += '&textSearch=' + pageLink.textSearch;
|
|
|
|
|
}
|
|
|
|
|
if (angular.isDefined(pageLink.idOffset)) {
|
|
|
|
|
url += '&idOffset=' + pageLink.idOffset;
|
|
|
|
|
}
|
|
|
|
|
if (angular.isDefined(pageLink.textOffset)) {
|
|
|
|
|
url += '&textOffset=' + pageLink.textOffset;
|
|
|
|
|
}
|
|
|
|
|
$http.get(url, null).then(function success(response) {
|
|
|
|
|
deferred.resolve(response.data);
|
|
|
|
|
}, function fail() {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
});
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getCustomerUsers(customerId, pageLink) {
|
|
|
|
|
var deferred = $q.defer();
|
|
|
|
|
var url = '/api/customer/' + customerId + '/users?limit=' + pageLink.limit;
|
|
|
|
|
if (angular.isDefined(pageLink.textSearch)) {
|
|
|
|
|
url += '&textSearch=' + pageLink.textSearch;
|
|
|
|
|
}
|
|
|
|
|
if (angular.isDefined(pageLink.idOffset)) {
|
|
|
|
|
url += '&idOffset=' + pageLink.idOffset;
|
|
|
|
|
}
|
|
|
|
|
if (angular.isDefined(pageLink.textOffset)) {
|
|
|
|
|
url += '&textOffset=' + pageLink.textOffset;
|
|
|
|
|
}
|
|
|
|
|
$http.get(url, null).then(function success(response) {
|
|
|
|
|
deferred.resolve(response.data);
|
|
|
|
|
}, function fail() {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
});
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-21 17:31:59 +03:00
|
|
|
function saveUser(user, sendActivationMail) {
|
2016-12-01 11:40:28 +02:00
|
|
|
var deferred = $q.defer();
|
|
|
|
|
var url = '/api/user';
|
2017-07-21 17:31:59 +03:00
|
|
|
if (angular.isDefined(sendActivationMail)) {
|
|
|
|
|
url += '?sendActivationMail=' + sendActivationMail;
|
|
|
|
|
}
|
2016-12-01 11:40:28 +02:00
|
|
|
$http.post(url, user).then(function success(response) {
|
|
|
|
|
deferred.resolve(response.data);
|
2017-11-16 18:58:10 +02:00
|
|
|
}, function fail() {
|
2019-09-10 15:45:20 +03:00
|
|
|
deferred.reject();
|
|
|
|
|
});
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function setUserCredentialsEnabled(userId, userCredentialsEnabled) {
|
|
|
|
|
var deferred = $q.defer();
|
|
|
|
|
var url = '/api/user/' + userId + '/userCredentialsEnabled';
|
|
|
|
|
if (angular.isDefined(userCredentialsEnabled)) {
|
|
|
|
|
url += '?userCredentialsEnabled=' + userCredentialsEnabled;
|
|
|
|
|
}
|
|
|
|
|
$http.post(url, null).then(function success() {
|
|
|
|
|
deferred.resolve();
|
|
|
|
|
}, function fail() {
|
2017-11-16 18:58:10 +02:00
|
|
|
deferred.reject();
|
2016-12-01 11:40:28 +02:00
|
|
|
});
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-29 19:09:34 +02:00
|
|
|
function getUser(userId, ignoreErrors, config) {
|
2016-12-01 11:40:28 +02:00
|
|
|
var deferred = $q.defer();
|
|
|
|
|
var url = '/api/user/' + userId;
|
2017-12-29 19:09:34 +02:00
|
|
|
if (!config) {
|
|
|
|
|
config = {};
|
|
|
|
|
}
|
|
|
|
|
config = Object.assign(config, { ignoreErrors: ignoreErrors });
|
|
|
|
|
$http.get(url, config).then(function success(response) {
|
2016-12-01 11:40:28 +02:00
|
|
|
deferred.resolve(response.data);
|
2017-11-16 18:58:10 +02:00
|
|
|
}, function fail() {
|
|
|
|
|
deferred.reject();
|
2016-12-01 11:40:28 +02:00
|
|
|
});
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function deleteUser(userId) {
|
|
|
|
|
var deferred = $q.defer();
|
|
|
|
|
var url = '/api/user/' + userId;
|
|
|
|
|
$http.delete(url).then(function success() {
|
|
|
|
|
deferred.resolve();
|
2017-11-16 18:58:10 +02:00
|
|
|
}, function fail() {
|
|
|
|
|
deferred.reject();
|
2016-12-01 11:40:28 +02:00
|
|
|
});
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function sendActivationEmail(email) {
|
|
|
|
|
var deferred = $q.defer();
|
|
|
|
|
var url = '/api/user/sendActivationMail?email=' + email;
|
|
|
|
|
$http.post(url, null).then(function success(response) {
|
|
|
|
|
deferred.resolve(response);
|
|
|
|
|
}, function fail() {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
});
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-21 17:31:59 +03:00
|
|
|
function getActivationLink(userId) {
|
|
|
|
|
var deferred = $q.defer();
|
|
|
|
|
var url = `/api/user/${userId}/activationLink`
|
|
|
|
|
$http.get(url).then(function success(response) {
|
|
|
|
|
deferred.resolve(response.data);
|
|
|
|
|
}, function fail() {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
});
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
2017-03-07 17:34:46 +02:00
|
|
|
function forceDefaultPlace(to, params) {
|
|
|
|
|
if (currentUser && isAuthenticated()) {
|
2017-05-24 10:39:33 +03:00
|
|
|
if (currentUser.authority === 'TENANT_ADMIN' || currentUser.authority === 'CUSTOMER_USER') {
|
2017-04-23 18:04:55 +03:00
|
|
|
if ((userHasDefaultDashboard() && $rootScope.forceFullscreen) || isPublic()) {
|
|
|
|
|
if (to.name === 'home.profile') {
|
|
|
|
|
if (userHasProfile()) {
|
2017-03-15 18:55:50 +02:00
|
|
|
return false;
|
|
|
|
|
} else {
|
2017-03-07 17:34:46 +02:00
|
|
|
return true;
|
|
|
|
|
}
|
2018-07-05 18:37:09 +03:00
|
|
|
} else if ((to.name === 'home.dashboards.dashboard' || to.name === 'dashboard')
|
|
|
|
|
&& allowedDashboardIds.indexOf(params.dashboardId) > -1) {
|
2017-04-23 18:04:55 +03:00
|
|
|
return false;
|
|
|
|
|
} else {
|
|
|
|
|
return true;
|
2017-03-07 17:34:46 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2018-11-15 16:34:37 +02:00
|
|
|
function setRedirectParams(params) {
|
|
|
|
|
redirectParams = params;
|
|
|
|
|
}
|
|
|
|
|
|
2017-03-07 17:34:46 +02:00
|
|
|
function gotoDefaultPlace(params) {
|
|
|
|
|
if (currentUser && isAuthenticated()) {
|
2018-11-15 16:34:37 +02:00
|
|
|
var place = redirectParams ? redirectParams.toName : 'home.links';
|
|
|
|
|
params = redirectParams ? redirectParams.params : params;
|
|
|
|
|
redirectParams = null;
|
2017-05-24 10:39:33 +03:00
|
|
|
if (currentUser.authority === 'TENANT_ADMIN' || currentUser.authority === 'CUSTOMER_USER') {
|
2017-04-23 18:04:55 +03:00
|
|
|
if (userHasDefaultDashboard()) {
|
2018-07-05 18:37:09 +03:00
|
|
|
place = $rootScope.forceFullscreen ? 'dashboard' : 'home.dashboards.dashboard';
|
2017-03-07 17:34:46 +02:00
|
|
|
params = {dashboardId: currentUserDetails.additionalInfo.defaultDashboardId};
|
2017-04-23 18:04:55 +03:00
|
|
|
} else if (isPublic()) {
|
2018-07-05 18:37:09 +03:00
|
|
|
place = 'dashboard';
|
2017-04-23 18:04:55 +03:00
|
|
|
params = {dashboardId: lastPublicDashboardId};
|
2017-03-07 17:34:46 +02:00
|
|
|
}
|
2017-03-08 20:06:04 +02:00
|
|
|
} else if (currentUser.authority === 'SYS_ADMIN') {
|
|
|
|
|
adminService.checkUpdates().then(
|
|
|
|
|
function (updateMessage) {
|
|
|
|
|
if (updateMessage && updateMessage.updateAvailable) {
|
|
|
|
|
toast.showInfo(updateMessage.message, 0, null, 'bottom right');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
);
|
2017-03-07 17:34:46 +02:00
|
|
|
}
|
2018-08-17 15:59:14 +03:00
|
|
|
$state.go(place, params, {reload: true});
|
2017-03-07 17:34:46 +02:00
|
|
|
} else {
|
|
|
|
|
$state.go('login', params);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-04-23 18:04:55 +03:00
|
|
|
function userHasDefaultDashboard() {
|
|
|
|
|
return currentUserDetails &&
|
|
|
|
|
currentUserDetails.additionalInfo &&
|
|
|
|
|
currentUserDetails.additionalInfo.defaultDashboardId;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function userForceFullscreen() {
|
|
|
|
|
return (currentUser && currentUser.isPublic) ||
|
|
|
|
|
(currentUserDetails.additionalInfo &&
|
|
|
|
|
currentUserDetails.additionalInfo.defaultDashboardFullscreen &&
|
|
|
|
|
currentUserDetails.additionalInfo.defaultDashboardFullscreen === true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function userHasProfile() {
|
|
|
|
|
return currentUser && !currentUser.isPublic;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function updateLastPublicDashboardId(dashboardId) {
|
|
|
|
|
if (isPublic()) {
|
|
|
|
|
lastPublicDashboardId = dashboardId;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-08-17 15:59:14 +03:00
|
|
|
function isUserTokenAccessEnabled() {
|
|
|
|
|
return userTokenAccessEnabled;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function loginAsUser(userId) {
|
|
|
|
|
var url = '/api/user/' + userId + '/token';
|
|
|
|
|
$http.get(url).then(function success(response) {
|
|
|
|
|
var token = response.data.token;
|
|
|
|
|
var refreshToken = response.data.refreshToken;
|
|
|
|
|
setUserFromJwtToken(token, refreshToken, true);
|
|
|
|
|
}, function fail() {
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2016-12-01 11:40:28 +02:00
|
|
|
}
|