diff options
Diffstat (limited to '')
-rw-r--r-- | content/manager/createAccount.js | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/content/manager/createAccount.js b/content/manager/createAccount.js new file mode 100644 index 0000000..72c266b --- /dev/null +++ b/content/manager/createAccount.js @@ -0,0 +1,244 @@ +/* + * This file is part of EAS-4-TbSync. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + + "use strict"; + +var { TbSync } = ChromeUtils.import("chrome://tbsync/content/tbsync.jsm"); + +const eas = TbSync.providers.eas; + +var tbSyncEasNewAccount = { + + startTime: 0, + maxTimeout: 30, + validating: false, + + onClose: function () { + //disallow closing of wizard while validating + return !this.validating; + }, + + onCancel: function (event) { + //disallow closing of wizard while validating + if (this.validating) { + event.preventDefault(); + } + }, + + onLoad: function () { + this.providerData = new TbSync.ProviderData("eas"); + + this.elementName = document.getElementById('tbsync.newaccount.name'); + this.elementUser = document.getElementById('tbsync.newaccount.user'); + this.elementUrl = document.getElementById('tbsync.newaccount.url'); + this.elementPass = document.getElementById('tbsync.newaccount.password'); + this.elementServertype = document.getElementById('tbsync.newaccount.servertype'); + + document.getElementById("tbsync.newaccount.wizard").getButton("back").hidden = true; + this.onUserDropdown(); + + document.getElementById("tbsync.error").hidden = true; + document.getElementById("tbsync.spinner").hidden = true; + + document.addEventListener("wizardfinish", tbSyncEasNewAccount.onFinish.bind(this)); + document.addEventListener("wizardcancel", tbSyncEasNewAccount.onCancel.bind(this)); + // bug https://bugzilla.mozilla.org/show_bug.cgi?id=1618252 + document.getElementById('tbsync.newaccount.wizard')._adjustWizardHeader(); + }, + + onUnload: function () { + }, + + onUserTextInput: function () { + document.getElementById("tbsync.error").hidden = true; + switch (this.elementServertype.value) { + case "select": + document.getElementById("tbsync.newaccount.wizard").getButton("finish").disabled = true; + break; + + case "auto": + document.getElementById("tbsync.newaccount.wizard").getButton("finish").disabled = (this.elementName.value.trim() == "" || this.elementUser.value == "" || this.elementPass.value == ""); + break; + + case "office365": + document.getElementById("tbsync.newaccount.wizard").getButton("finish").disabled = (this.elementName.value.trim() == "" || this.elementUser.value == ""); + break; + + case "custom": + default: + document.getElementById("tbsync.newaccount.wizard").getButton("finish").disabled = (this.elementName.value.trim() == "" || this.elementUser.value == "" || this.elementPass.value == "" || this.elementUrl.value.trim() == ""); + break; + } + }, + + onUserDropdown: function () { + if (this.elementServertype) { + switch (this.elementServertype.value) { + case "select": + document.getElementById('tbsync.newaccount.user.box').hidden = true; + document.getElementById('tbsync.newaccount.url.box').hidden = true; + document.getElementById('tbsync.newaccount.password.box').hidden = true; + document.getElementById("tbsync.newaccount.wizard").getButton("finish").label = TbSync.getString("newaccount.add_custom","eas"); + break; + + case "auto": + document.getElementById('tbsync.newaccount.user.box').hidden = false; + document.getElementById('tbsync.newaccount.url.box').hidden = true; + document.getElementById('tbsync.newaccount.password.box').hidden = false; + document.getElementById("tbsync.newaccount.wizard").getButton("finish").label = TbSync.getString("newaccount.add_auto","eas"); + break; + + case "office365": + document.getElementById('tbsync.newaccount.user.box').hidden = false; + document.getElementById('tbsync.newaccount.url.box').hidden = true; + document.getElementById('tbsync.newaccount.password.box').hidden = true; + document.getElementById("tbsync.newaccount.wizard").getButton("finish").label = TbSync.getString("newaccount.add_custom","eas"); + break; + + case "custom": + default: + document.getElementById('tbsync.newaccount.user.box').hidden = false; + document.getElementById('tbsync.newaccount.url.box').hidden = false; + document.getElementById('tbsync.newaccount.password.box').hidden = false; + document.getElementById("tbsync.newaccount.wizard").getButton("finish").label = TbSync.getString("newaccount.add_custom","eas"); + break; + } + this.onUserTextInput(); + //document.getElementById("tbsync.newaccount.name").focus(); + } + }, + + onFinish: function (event) { + if (document.getElementById("tbsync.newaccount.wizard").getButton("finish").disabled == false) { + //initiate validation of server connection + this.validate(); + } + event.preventDefault(); + }, + + validate: async function () { + let user = this.elementUser.value; + let servertype = this.elementServertype.value; + let accountname = this.elementName.value.trim(); + + let url = (servertype == "custom") ?this.elementUrl.value.trim() : ""; + let password = (servertype == "auto" || servertype == "custom") ? this.elementPass.value : ""; + + if ((servertype == "auto" || servertype == "office365") && user.split("@").length != 2) { + alert(TbSync.getString("autodiscover.NeedEmail","eas")) + return; + } + + this.validating = true; + let error = ""; + + //document.getElementById("tbsync.newaccount.wizard").canRewind = false; + document.getElementById("tbsync.error").hidden = true; + document.getElementById("tbsync.newaccount.wizard").getButton("cancel").disabled = true; + document.getElementById("tbsync.newaccount.wizard").getButton("finish").disabled = true; + document.getElementById("tbsync.newaccount.name").disabled = true; + document.getElementById("tbsync.newaccount.user").disabled = true; + document.getElementById("tbsync.newaccount.password").disabled = true; + document.getElementById("tbsync.newaccount.servertype").disabled = true; + + tbSyncEasNewAccount.startTime = Date.now(); + tbSyncEasNewAccount.updateAutodiscoverStatus(); + document.getElementById("tbsync.spinner").hidden = false; + + //do autodiscover + if (servertype == "office365" || servertype == "auto") { + let updateTimer = Components.classes["@mozilla.org/timer;1"].createInstance(Components.interfaces.nsITimer); + updateTimer.initWithCallback({notify : function () {tbSyncEasNewAccount.updateAutodiscoverStatus()}}, 1000, 3); + + if (servertype == "office365") { + let v2 = await eas.network.getServerConnectionViaAutodiscoverV2JsonRequest("https://autodiscover-s.outlook.com/autodiscover/autodiscover.json?Email="+encodeURIComponent(user)+"&Protocol=ActiveSync"); + let oauthData = eas.network.getOAuthObj({ host: v2.server, user, accountname, servertype }); + if (oauthData) { + // ask for token + document.getElementById("tbsync.spinner").hidden = true; + let _rv = {}; + if (await oauthData.asyncConnect(_rv)) { + password = _rv.tokens; + } else { + error = TbSync.getString("status." + _rv.error, "eas"); + } + document.getElementById("tbsync.spinner").hidden = false; + url=v2.server; + } else { + error = TbSync.getString("status.404", "eas"); + } + } else { + let result = await eas.network.getServerConnectionViaAutodiscover(user, password, tbSyncEasNewAccount.maxTimeout*1000); + if (result.server) { + user = result.user; + url = result.server; + } else { + error = result.error; // is a localized string + } + } + + updateTimer.cancel(); + } + + //now validate the information + if (!error) { + if (!password) error = TbSync.getString("status.401", "eas"); + } + + //add if valid + if (!error) { + tbSyncEasNewAccount.addAccount(user, password, servertype, accountname, url); + } + + //end validation + document.getElementById("tbsync.newaccount.name").disabled = false; + document.getElementById("tbsync.newaccount.user").disabled = false; + document.getElementById("tbsync.newaccount.password").disabled = false; + document.getElementById("tbsync.newaccount.servertype").disabled = false; + document.getElementById("tbsync.newaccount.wizard").getButton("cancel").disabled = false; + document.getElementById("tbsync.newaccount.wizard").getButton("finish").disabled = false; + document.getElementById("tbsync.spinner").hidden = true; + //document.getElementById("tbsync.newaccount.wizard").canRewind = true; + + this.validating = false; + + //close wizard, if done + if (!error) { + document.getElementById("tbsync.newaccount.wizard").cancel(); + } else { + document.getElementById("tbsync.error.message").textContent = error; + document.getElementById("tbsync.error").hidden = false; + } + }, + + updateAutodiscoverStatus: function () { + let offset = Math.round(((Date.now() - tbSyncEasNewAccount.startTime)/1000)); + let timeout = (offset>2) ? " (" + (tbSyncEasNewAccount.maxTimeout - offset) + ")" : ""; + + document.getElementById('tbsync.newaccount.autodiscoverstatus').value = TbSync.getString("autodiscover.Querying","eas") + timeout; + }, + + addAccount (user, password, servertype, accountname, url) { + let newAccountEntry = this.providerData.getDefaultAccountEntries(); + newAccountEntry.user = user; + newAccountEntry.servertype = servertype; + + if (url) { + //if no protocoll is given, prepend "https://" + if (url.substring(0,4) != "http" || url.indexOf("://") == -1) url = "https://" + url.split("://").join("/"); + newAccountEntry.host = eas.network.stripAutodiscoverUrl(url); + newAccountEntry.https = (url.substring(0,5) == "https"); + } + + // Add the new account. + let newAccountData = this.providerData.addAccount(accountname, newAccountEntry); + eas.network.getAuthData(newAccountData).updateLoginData(user, password); + + window.close(); + } +}; |