Monotone-Parent: 4c3ef9250b14b8cbfc955a62b1db4aedc143baff Monotone-Revision: 16f5335de7590f257b443a73447490fb19e25986 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2011-11-09T19:48:51
352 lines
12 KiB
JavaScript
352 lines
12 KiB
JavaScript
/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
|
|
var dialogs = {};
|
|
|
|
function initLogin() {
|
|
var date = new Date();
|
|
date.setTime(date.getTime() - 86400000);
|
|
|
|
var href = $("connectForm").action.split("/");
|
|
var appName = href[href.length-2];
|
|
|
|
document.cookie = ("0xHIGHFLYxSOGo=discarded"
|
|
+ "; expires=" + date.toGMTString()
|
|
+ "; path=/" + appName + "/");
|
|
|
|
var about = $("about");
|
|
if (about) {
|
|
about.observe("click", function(event) {
|
|
if (!$("aboutBox").visible())
|
|
Effect.SlideDown("aboutBox", { queue: { position: 'end', scope: 'aboutscope', limit: 2 } });
|
|
event.stop(); });
|
|
var aboutClose = $("aboutClose");
|
|
aboutClose.observe("click", function(event) {
|
|
Effect.SlideUp("aboutBox", { duration: 2.0, queue: { position: 'end', scope: 'aboutscope', limit: 2 } });
|
|
event.stop() });
|
|
}
|
|
|
|
var submit = $("submit");
|
|
submit.observe("click", onLoginClick);
|
|
|
|
var userName = $("userName");
|
|
userName.observe("keydown", onFieldKeyDown);
|
|
|
|
var passw = $("password");
|
|
passw.observe("keydown", onFieldKeyDown);
|
|
|
|
var image = $("preparedAnimation");
|
|
image.parentNode.removeChild(image);
|
|
|
|
var submitBtn = $("submit");
|
|
submitBtn.disabled = false;
|
|
|
|
if (userName.value.empty())
|
|
userName.focus();
|
|
else
|
|
passw.focus();
|
|
}
|
|
|
|
function onFieldKeyDown(event) {
|
|
if (event.keyCode == Event.KEY_RETURN) {
|
|
if ($("password").value.length > 0
|
|
&& $("userName").value.length > 0)
|
|
return onLoginClick(event);
|
|
else
|
|
Event.stop(event);
|
|
} else if (IsCharacterKey(event.keyCode)
|
|
|| event.keyCode == Event.KEY_BACKSPACE) {
|
|
SetLogMessage("errorMessage", null);
|
|
}
|
|
}
|
|
|
|
function onLoginClick(event) {
|
|
var userNameField = $("userName");
|
|
var userName = userNameField.value;
|
|
var password = $("password").value;
|
|
var language = $("language");
|
|
var domain = $("domain");
|
|
|
|
SetLogMessage("errorMessage");
|
|
|
|
if (userName.length > 0 && password.length > 0) {
|
|
this.disabled = true;
|
|
startAnimation($("animation"));
|
|
|
|
if (typeof(loginSuffix) != "undefined"
|
|
&& loginSuffix.length > 0
|
|
&& !userName.endsWith(loginSuffix))
|
|
userName += loginSuffix;
|
|
|
|
var url = $("connectForm").getAttribute("action");
|
|
var parameters = ("userName=" + encodeURIComponent(userName)
|
|
+ "&password=" + encodeURIComponent(password));
|
|
if (language)
|
|
parameters += ((language.value == "WONoSelectionString")
|
|
? ""
|
|
: ("&language=" + language.value));
|
|
if (domain)
|
|
parameters += "&domain=" + domain.value;
|
|
var rememberLogin = $("rememberLogin");
|
|
if (rememberLogin && rememberLogin.checked)
|
|
parameters += "&rememberLogin=1";
|
|
|
|
/// Discarded as it seems to create a cookie for nothing. To discard
|
|
// a cookie in JS, have a look here: http://www.quirksmode.org/js/cookies.html
|
|
//document.cookie = "";\
|
|
triggerAjaxRequest(url, onLoginCallback, null, (parameters),
|
|
{ "Content-type": "application/x-www-form-urlencoded",
|
|
"Content-length": parameters.length,
|
|
"Connection": "close" });
|
|
}
|
|
else
|
|
userNameField.focus();
|
|
|
|
preventDefault(event);
|
|
}
|
|
|
|
function onLoginCallback(http) {
|
|
if (http.readyState == 4) {
|
|
var submitBtn = $("submit");
|
|
|
|
if (http.status == 200) {
|
|
// Make sure browser's cookies are enabled
|
|
var loginCookie = readLoginCookie();
|
|
|
|
if (!loginCookie) {
|
|
SetLogMessage("errorMessage", _("cookiesNotEnabled"));
|
|
submitBtn.disabled = false;
|
|
return;
|
|
}
|
|
|
|
var jsonResponse = http.responseText.evalJSON(false);
|
|
if (jsonResponse
|
|
&& typeof(jsonResponse["expire"]) != "undefined"
|
|
&& typeof(jsonResponse["grace"]) != "undefined") {
|
|
|
|
if (jsonResponse["expire"] < 0 && jsonResponse["grace"] > 0)
|
|
showPasswordDialog("grace", createPasswordGraceDialog, jsonResponse["grace"]);
|
|
else if (jsonResponse["expire"] > 0 && jsonResponse["grace"] == -1)
|
|
showPasswordDialog("expiration", createPasswordExpirationDialog, jsonResponse["expire"]);
|
|
else {
|
|
redirectToUserPage();
|
|
}
|
|
}
|
|
else
|
|
redirectToUserPage();
|
|
}
|
|
else {
|
|
if (http.status == 403
|
|
&& http.getResponseHeader("content-type")
|
|
== "application/json") {
|
|
var jsonResponse = http.responseText.evalJSON(false);
|
|
handlePasswordError(jsonResponse);
|
|
} else {
|
|
SetLogMessage("errorMessage", _("An unhandled error occurred."));
|
|
}
|
|
submitBtn.disabled = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
function redirectToUserPage() {
|
|
// Redirect to proper page
|
|
var userName = $("userName").value;
|
|
var domain = $("domain");
|
|
if (domain)
|
|
userName += '@' + domain.value;
|
|
else if (typeof(loginSuffix) != "undefined"
|
|
&& loginSuffix.length > 0
|
|
&& !userName.endsWith(loginSuffix))
|
|
userName += loginSuffix;
|
|
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(3, 0);
|
|
altBaseAddress = parts.join("/");
|
|
|
|
var newAddress;
|
|
if ((address.startsWith(baseAddress)
|
|
|| address.startsWith(altBaseAddress))
|
|
&& !address.endsWith("/logoff"))
|
|
newAddress = address;
|
|
else
|
|
newAddress = baseAddress;
|
|
window.location.href = newAddress;
|
|
}
|
|
|
|
function handlePasswordError(jsonResponse) {
|
|
var perr = jsonResponse["LDAPPasswordPolicyError"];
|
|
if (perr == PolicyNoError) {
|
|
SetLogMessage("errorMessage", _("Wrong username or password."));
|
|
} else if (perr == PolicyAccountLocked) {
|
|
SetLogMessage("errorMessage",
|
|
_("Your account was locked due to too many failed attempts."));
|
|
} else if (perr == PolicyChangeAfterReset) {
|
|
showPasswordDialog("change", createPasswordChangeDialog, 5);
|
|
} else if (perr == PolicyPasswordExpired) {
|
|
SetLogMessage("errorMessage",
|
|
_("Your account was locked due to an expired password."));
|
|
}
|
|
else
|
|
SetLogMessage("errorMessage",
|
|
_("Login failed due to unhandled error case: " + perr));
|
|
}
|
|
|
|
function showPasswordDialog(dialogType, constructor, parameters) {
|
|
var dialog = dialogs[dialogType];
|
|
if (!dialog) {
|
|
dialog = constructor(parameters);
|
|
var form = $("connectForm");
|
|
form.appendChild(dialog);
|
|
dialogs[dialogType] = dialog;
|
|
}
|
|
var password = $("password");
|
|
var offsets = password.positionedOffset();
|
|
dialog.show();
|
|
var top = offsets[1] - 2;
|
|
var left = offsets[0] + 10 - dialog.clientWidth;
|
|
dialog.setStyle({ "top": top + "px", "left": left + "px"});
|
|
}
|
|
|
|
function createPasswordChangeDialog() {
|
|
var fields = createElement("p");
|
|
createElement("span", "passwordError", null, null, null, fields);
|
|
|
|
var fieldNames = [ "newPassword", "newPassword2" ];
|
|
var fieldLabels = [ _("New password:"), _("Confirmation:") ];
|
|
for (var i = 0; i < fieldNames.length; i++) {
|
|
var label = createElement("label", null, null, null, null, fields);
|
|
label.appendChild(document.createTextNode(fieldLabels[i]));
|
|
createElement("input", fieldNames[i], "textField",
|
|
{ "name": fieldNames[i], "type": "password" },
|
|
null, label);
|
|
createElement("br", null, null, null, null, fields);
|
|
}
|
|
|
|
var button = createButton("passwordOKButton", _("OK"), passwordDialogOK);
|
|
button.addClassName("actionButton");
|
|
fields.appendChild(button);
|
|
fields.appendChild(document.createTextNode(" "));
|
|
button = createButton("passwordCancelButton",
|
|
_("Cancel"), passwordDialogCancel);
|
|
fields.appendChild(button);
|
|
|
|
var dialog = createDialog("passwordChangeDialog",
|
|
_("Change your Password"),
|
|
_("Your password has expired, please enter a new one below:"),
|
|
fields,
|
|
"right");
|
|
|
|
return dialog;
|
|
}
|
|
|
|
function passwordDialogOK(event) {
|
|
var field = $("newPassword");
|
|
var confirmationField = $("newPassword2");
|
|
if (field && confirmationField) {
|
|
var newPassword = field.value;
|
|
if (newPassword == confirmationField.value) {
|
|
if (newPassword.length > 0) {
|
|
var userName = $("userName");
|
|
var password = $("password");
|
|
var policy = new PasswordPolicy(userName.value,
|
|
password.value);
|
|
policy.setCallbacks(onPasswordChangeSuccess,
|
|
onPasswordChangeFailure);
|
|
policy.changePassword(newPassword);
|
|
}
|
|
else
|
|
SetLogMessage("passwordError",
|
|
_("Password must not be empty."));
|
|
}
|
|
else {
|
|
SetLogMessage("passwordError",
|
|
_("The passwords do not match. Please try again."));
|
|
field.focus();
|
|
field.select();
|
|
}
|
|
}
|
|
event.stop();
|
|
}
|
|
|
|
function onPasswordChangeSuccess() {
|
|
SetLogMessage("passwordError", _("Please wait..."));
|
|
redirectToUserPage();
|
|
}
|
|
|
|
function onPasswordChangeFailure(code, message) {
|
|
SetLogMessage("passwordError", message);
|
|
}
|
|
|
|
function passwordDialogCancel(event) {
|
|
var dialog = $("passwordChangeDialog");
|
|
dialog.hide();
|
|
event.stop();
|
|
}
|
|
|
|
function createPasswordGraceDialog(tries) {
|
|
var button = createButton("graceOKButton", _("OK"));
|
|
button.observe("click", passwordGraceDialogOK);
|
|
button.addClassName("actionButton");
|
|
|
|
return createDialog("passwordGraceDialog",
|
|
_("Password Grace Period"),
|
|
_("You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog.").formatted(tries),
|
|
button,
|
|
"right");
|
|
}
|
|
|
|
function passwordGraceDialogOK(event) {
|
|
var dialog = $("passwordGraceDialog");
|
|
dialog.hide();
|
|
event.stop();
|
|
redirectToUserPage();
|
|
}
|
|
|
|
function createPasswordExpirationDialog(expire) {
|
|
var button = createButton("expirationOKButton", _("OK"));
|
|
button.observe("click", passwordExpirationDialogOK);
|
|
button.addClassName("actionButton");
|
|
|
|
var value, string;
|
|
|
|
if (expire > 86400) {
|
|
value = Math.round(expire/86400);
|
|
string = _("days");
|
|
}
|
|
else if (expire > 3600) {
|
|
value = Math.round(expire/3600);
|
|
string = _("hours");
|
|
}
|
|
else if (expire > 60) {
|
|
value = Math.round(expire/60);
|
|
string = _("minutes");
|
|
}
|
|
else {
|
|
value = expire;
|
|
string = _("seconds");
|
|
}
|
|
return createDialog("passwordExpirationDialog",
|
|
_("Password about to expire"),
|
|
_("Your password is going to expire in %{0} %{1}.").formatted(value, string),
|
|
button,
|
|
"right");
|
|
}
|
|
|
|
function passwordExpirationDialogOK(event) {
|
|
var dialog = $("passwordExpirationDialog");
|
|
dialog.hide();
|
|
event.stop();
|
|
redirectToUserPage();
|
|
}
|
|
|
|
document.observe("dom:loaded", initLogin);
|