angular.module('sn.$sp').factory('spAuthModal', function($q, spModal, i18n, $http, spAuthentication, glideUserSession, cabrillo, $cookies, $window, spUtil, $uibModal, spEsignature) {
"use strict";
function _showAuthenticationModal(requestParams, username, userSysId) {
var currentUser;
var deferred = $q.defer();
glideUserSession.loadCurrentUser({reload: true}).then(function(user) {
if (!user) {
deferred.reject({
error: {
status: 'ANONYMOUS',
message: i18n.getMessage('Not logged in')
}
});
return;
}
currentUser = user;
var serializedUser = {
sysId: currentUser.userID,
userName: currentUser.userName,
firstName: currentUser.firstName,
lastName: currentUser.lastName
};
// hand off to native clients
if (cabrillo.isNative()) {
cabrillo.auth.reauthenticate(currentUser).then(function() {
deferred.resolve(serializedUser);
}, function(error) {
if (error && error.status) {
deferred.reject({
error: error
});
}
//TODO: Handle rejection a little more gracefully
deferred.reject();
});
return;
}
var loginMethod = currentUser.$private.loginMethod;
if (!loginMethod) {
// As we were unable to determine the login method via the HTTP session, trying to get glide_sso_id cookie which is set in case of multisso login
var providerSysId = $cookies.get('glide_sso_id');
loginMethod = providerSysId ? 'multisso' : 'db';
}
if (loginMethod === 'saml' || loginMethod === 'oidc' || loginMethod === 'multisso') {
spEsignature.isWindowChosen().then(function(result) {
var modal;
if (!spUtil.isMobile() && loginMethod !== 'oidc' && result === true) {
// If enabled, Opening a new window for desktop saml login
spEsignature.initiateEsignature();
} else {
glideUserSession.getSsoReauthenticationUrl().then(function(url) {
requestParams.externalLoginURL = url;
openExternalAuthModal(requestParams).then(function(m) {
modal = m;
});
});
}
$window.onReauthenticationComplete = function(result) {
deferred.resolve(serializedUser);
if (modal)
modal.close();
};
});
} else {
spModal.open({
title:i18n.getMessage("Approver authentication"),
message:i18n.getMessage("Additional authentication is required, enter your usename and password to continue."),
footerStyle: {border: 'none', 'padding-top': 0},
widget: 'simpleloginui',
widgetInput: {},
shared: requestParams,
onSubmit: function() {
return onLoginModalSubmit(requestParams, username);
}
}).then(function(confirm) {
if (confirm.label == i18n.getMessage("OK")) {
deferred.resolve(serializedUser);
} else {
deferred.reject();
}
});
}
});
return deferred.promise;
}
function onLoginModalSubmit(requestParams, username) {
//(1) call login service to verify auth
//(2) verify same user
return $q(function(resolve, reject) {
var errorMessage = null;
if(!requestParams.username || requestParams.username.trim() === "" ||
!requestParams.password || requestParams.password.trim() === "") {
errorMessage = i18n.getMessage("User name or password invalid");
} else if(requestParams.username !== username) {
errorMessage = i18n.getMessage("Attempted to authenticate as a different user");
}
if(!errorMessage || errorMessage === "") {
spAuthentication.validateCreds(requestParams.username, requestParams.password).then(function(res) {
resolve({status: res.success, errorMessage: res.message});
});
} else {
resolve({status: !errorMessage || errorMessage === "", errorMessage: errorMessage});
}
});
}
function openExternalAuthModal(requestParams) {
var deferred = $q.defer();
var options = {
title: i18n.getMessage("Approver authentication"),
message: '',
messageOnly: false,
errorMessage: '',
input: false,
label: '',
size: 'lg',
value: '',
required: false,
footerStyle: {border: 'none', 'padding-top': 0},
values: false,
onSubmit: null,
widget: 'simpleloginui',
widgetInput: {},
shared: requestParams,
buttons: [{label: i18n.getMessage('Cancel'), cancel:true}]
};
var widgetURL = spUtil.getWidgetURL(options.widget);
$http.post(widgetURL, options.widgetInput).success(function(response) {
options.widget = response.result;
options.widget.options.shared = options.shared;
var modal = $uibModal.open({
templateUrl:'sp-modal.html',
controller: spModalCtrl,
size: options.size,
resolve: {
options: function() {
return options;
}
}
});
deferred.resolve(modal);
});
return deferred.promise;
}
function spModalCtrl($scope, options) {
$scope.options = options;
$scope.form = {};
$scope.buttonClicked = function(button){
if (button.cancel) {
$scope.$dismiss();
return;
}
}
}
return {
prompt: _showAuthenticationModal
}
}).decorator("spAuthModal", function($delegate) { return( $delegate );});