sogo/UI/WebServerResources/js/Common/SOGoAuthentication.js
2015-06-11 15:25:26 -04:00

170 lines
6.8 KiB
JavaScript

/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* JavaScript for SOGoContacts */
(function() {
'use strict';
angular.module('SOGo.Authentication', [])
.constant('passwordPolicyConfig', {
'PolicyPasswordChangeUnsupported': -3,
'PolicyPasswordSystemUnknown': -2,
'PolicyPasswordUnknown': -1,
'PolicyPasswordExpired': 0,
'PolicyAccountLocked': 1,
'PolicyChangeAfterReset': 2,
'PolicyPasswordModNotAllowed': 3,
'PolicyMustSupplyOldPassword': 4,
'PolicyInsufficientPasswordQuality': 5,
'PolicyPasswordTooShort': 6,
'PolicyPasswordTooYoung': 7,
'PolicyPasswordInHistory': 8,
'PolicyNoError': 65535
})
// TODO: convert to a Factory recipe?
.provider('Authentication', function(passwordPolicyConfig) {
this.readCookie = function(name) {
var foundCookie = null;
var prefix = name + "=";
var pairs = document.cookie.split(';');
for (var i = 0; !foundCookie && i < pairs.length; i++) {
var currentPair = pairs[i];
var start = 0;
while (currentPair.charAt(start) == " ")
start++;
if (start > 0)
currentPair = currentPair.substr(start);
if (currentPair.indexOf(prefix) == 0)
foundCookie = currentPair.substr(prefix.length);
}
return foundCookie;
};
this.readLoginCookie = function() {
var loginValues = null;
var cookie = this.readCookie("0xHIGHFLYxSOGo");
if (cookie && cookie.length > 8) {
var value = decodeURIComponent(cookie.substr(8));
loginValues = value.base64decode().split(":");
}
return loginValues;
};
this.redirectUrl = function(username, domain) {
var userName = username;
if (domain)
userName += '@' + domain.value;
var address = "" + window.location.href;
var baseAddress = ApplicationBaseURL + "/" + encodeURIComponent(userName);
var altBaseAddress;
if (baseAddress[0] == "/") {
var parts = address.split("/");
var hostpart = parts[2];
var protocol = parts[0];
baseAddress = protocol + "//" + hostpart + baseAddress;
}
var altBaseAddress;
var parts = baseAddress.split("/");
parts.splice(0, 3);
altBaseAddress = parts.join("/");
var newAddress;
if ((address.startsWith(baseAddress)
|| address.startsWith(altBaseAddress))
&& !address.endsWith("/logoff")) {
newAddress = address;
} else {
newAddress = baseAddress;
}
if (/theme=mobile/.test(window.location.search)) {
newAddress = baseAddress + '/Contacts' + '?theme=mobile';
}
else {
newAddress = baseAddress + '/Contacts';
}
return newAddress;
};
this.$get = ['$q', '$http', function($q, $http) {
var self = this;
var service = {
// login: function(username, password, domain, language, rememberLogin) {
// var d = $q.defer();
login: function(data) {
var d = $q.defer(),
username = data.username,
password = data.password,
domain = data.domain,
language,
rememberLogin = data.rememberLogin ? 1 : 0;
if (data.loginSuffix && !username.endsWith(data.loginSuffix)) {
username += loginSuffix;
domain = false;
}
if (data.language && data.language != 'WONoSelectionString') {
language = data.language;
}
$http({
method: 'POST',
url: '/SOGo/connect',
data: {'userName': username,
'password': password,
'domain': domain,
'language': language,
'rememberLogin': rememberLogin}
}).success(function(data, status) {
// Make sure browser's cookies are enabled
var loginCookie = self.readLoginCookie();
if (!loginCookie) {
d.reject(l("cookiesNotEnabled"));
}
else {
// Check password policy
if (typeof(data['expire']) != 'undefined' && typeof(data['grace']) != 'undefined') {
if (data['expire'] < 0 && data['grace'] > 0) {
d.reject({'grace': data['grace']});
//showPasswordDialog('grace', createPasswordGraceDialog, data['grace']);
} else if (data['expire'] > 0 && data['grace'] == -1) {
d.reject({'expire': data['expire']});
//showPasswordDialog('expiration', createPasswordExpirationDialog, data['expire']);
}
else {
d.resolve(self.redirectUrl(username, domain));
}
}
else {
d.resolve(self.redirectUrl(username, domain));
}
}
}).error(function(data, status) {
var msg;
if (data && data['LDAPPasswordPolicyError']) {
var perr = data['LDAPPasswordPolicyError'];
if (perr == passwordPolicyConfig.PolicyNoError) {
msg = l("Wrong username or password.");
}
else {
msg = l("Login failed due to unhandled error case: " + perr);
}
}
else {
msg = l("Unhandled error response");
}
d.reject({error: msg});
});
return d.promise;
}
};
return service;
}];
});
})();