From: Chris Porter Date: Mon, 16 Aug 2010 01:17:04 +0000 (+0100) Subject: Add a much better QuakeNet login system. X-Git-Url: https://jfr.im/git/irc/quakenet/qwebirc.git/commitdiff_plain/65f2c94c3860914dd201b27101b4b3cb52153041 Add a much better QuakeNet login system. --- diff --git a/css/dialogs.css b/css/dialogs.css index a40d0ec..35c4b65 100644 --- a/css/dialogs.css +++ b/css/dialogs.css @@ -27,6 +27,10 @@ text-align: left; } +.qwebirc-loginbox input#loginnickname, .qwebirc-loginbox input#loginchannels { + width: 200px; +} + /**************** CONFIRM LOGIN BOX *******************/ .qwebirc-confirmbox { width: 100%; diff --git a/js/auth.js b/js/auth.js index d0e1be4..9f738ce 100644 --- a/js/auth.js +++ b/js/auth.js @@ -5,15 +5,15 @@ qwebirc.auth.loggedin = function() { } qwebirc.auth.enabled = function() { - return false; + return true; } qwebirc.auth.quakeNetAuth = function() { - return false; + return true; } qwebirc.auth.passAuth = function() { - return true; + return false; } qwebirc.auth.bouncerAuth = function() { diff --git a/js/ui/panes/connect.js b/js/ui/panes/connect.js index b496714..7affa3f 100644 --- a/js/ui/panes/connect.js +++ b/js/ui/panes/connect.js @@ -3,6 +3,7 @@ qwebirc.ui.ConnectPane = new Class({ initialize: function(parent, options) { var callback = options.callback, initialNickname = options.initialNickname, initialChannels = options.initialChannels, networkName = options.networkName, autoConnect = options.autoConnect, autoNick = options.autoNick; this.options = options; + this.__windowName = "authgate_" + Math.floor(Math.random() * 100000); var delayfn = function() { parent.set("html", "
Loading. . .
"); }; var cb = delayfn.delay(500); @@ -40,13 +41,31 @@ qwebirc.ui.ConnectPane = new Class({ this.__validate = this.__validateLoginData; } + if(qwebirc.auth.loggedin()) { + exec("[name=authname]", util.setText(qwebirc.auth.loggedin())); + exec("[name=connectbutton]", util.makeVisible); + exec("[name=loginstatus]", util.makeVisible); + } else { + if(qwebirc.ui.isAuthRequired()) { + exec("[name=loginconnectbutton]", util.makeVisible); + if(focus == "connect") + focus = "loginconnect"; + } else { + exec("[name=connectbutton]", util.makeVisible); + exec("[name=loginbutton]", util.makeVisible); + } + } + exec("[name=" + focus + "]", util.focus); exec("[name=connect]", util.attachClick(this.__connect.bind(this))); + exec("[name=loginconnect]", util.attachClick(this.__loginConnect.bind(this))); + exec("[name=login]", util.attachClick(this.__login.bind(this))); }.bind(this)}); r.get(); }, util: { makeVisible: function(x) { x.setStyle("display", ""); }, + setVisible: function(y) { return function(x) { x.setStyle("display", y ? "" : "none"); }; }, focus: function(x) { x.focus(); }, attachClick: function(fn) { return function(x) { x.addListener("click", fn); } }, setText: function(x) { return function(y) { @@ -66,9 +85,97 @@ qwebirc.ui.ConnectPane = new Class({ if(data === false) return; + this.__cancelLogin(); this.fireEvent("close"); this.options.callback(data); }, + __cancelLogin: function(noUIModifications) { + if(this.__cancelLoginCallback) + this.__cancelLoginCallback(noUIModifications); + }, + __loginConnect: function(e) { + new Event(e).stop(); + if(this.validate() === false) + return; + + this.__performLogin(function() { + var data = this.validate(); + if(data === false) { + /* we're logged in -- show the normal join button */ + this.util.exec("[name=connectbutton]", this.util.setVisible(true)); + return; + } + + this.fireEvent("close"); + this.options.callback(data); + }.bind(this), "loginconnectbutton"); + }, + __login: function(e) { + new Event(e).stop(); + + this.__cancelLogin(true); + + this.__performLogin(function() { + var focus = "connect"; + if(!this.options.autoConnect) { + var nick = this.rootElement.getElement("input[name=nickname]").value, chan = this.rootElement.getElement("input[name=channels]").value; + if(!nick) { + focus = "nickname"; + } else if(!chan) { + focus = "channels"; + } + } + this.util.exec("[name=" + focus + "]", this.util.focus); + }.bind(this), "login"); + }, + __performLogin: function(callback, calleename) { + Cookie.write("jslogin", "1"); + + var handle = window.open("/auth", this.__windowName, "status=0,toolbar=0,location=1,menubar=0,directories=0,resizable=0,scrollbars=1,height=280,width=550"); + + if(handle === null || handle === undefined) { + Cookie.dispose("jslogin"); +// Cookie.write("redirect", document.location); +// window.location = "auth?"; + return; + } + + var closeDetector = function() { + if(handle.closed) + this.__cancelLoginCallback(); + }.bind(this); + var closeCallback = closeDetector.periodical(100); + + this.__cancelLoginCallback = function(noUIModifications) { + $clear(closeCallback); + + Cookie.dispose("jslogin"); + + try { + handle.close(); + } catch(e) { + } + + if(!noUIModifications) { + this.util.exec("[name=loggingin]", this.util.setVisible(false)); + this.util.exec("[name=" + calleename + "]", this.util.setVisible(true)); + } + this.__cancelLoginCallback = null; + }.bind(this); + + this.util.exec("[name=loggingin]", this.util.setVisible(true)); + this.util.exec("[name=" + calleename + "]", this.util.setVisible(false)); + + __qwebircAuthCallback = function(username) { + this.__cancelLoginCallback(true); + + this.util.exec("[name=loggingin]", this.util.setVisible(false)); + this.util.exec("[name=loginstatus]", this.util.setVisible(true)); + this.util.exec("[name=authname]", this.util.setText(username)); + callback(); + }.bind(this); + + }, __validateConfirmData: function() { return {nickname: this.options.initialNickname, autojoin: this.options.initialChannels}; }, @@ -178,3 +285,12 @@ qwebirc.ui.authShowHide = function(checkbox, authRow, usernameBox, usernameRow, usernameBox.focus(); } } + +qwebirc.ui.isAuthRequired = (function() { + var args = qwebirc.util.parseURI(String(document.location)); + var value = $defined(args) && args["authrequired"]; + return function() { + return value && qwebirc.auth.enabled(); + }; +})(); + diff --git a/js/ui/panes/options.js b/js/ui/panes/options.js index da3d7ca..2571c33 100644 --- a/js/ui/panes/options.js +++ b/js/ui/panes/options.js @@ -31,7 +31,7 @@ qwebirc.config.DEFAULT_OPTIONS = [ [2, "DEDICATED_MSG_WINDOW", "Send privmsgs to dedicated messages window", false], [4, "DEDICATED_NOTICE_WINDOW", "Send notices to dedicated message window", false], [3, "NICK_OV_STATUS", "Show status (@/+) before nicknames in channel lines", true], - [5, "ACCEPT_SERVICE_INVITES", "Automatically join channels when invited by Q", true, { + [5, "ACCEPT_SERVICE_INVITES", "Automatically join channels when invited by Q", false, { settableByURL: false }], [6, "USE_HIDDENHOST", "Hide your hostmask when authed to Q (+x)", true, { diff --git a/qwebirc/engines/authgateengine.py b/qwebirc/engines/authgateengine.py index bd097b6..f4f29df 100644 --- a/qwebirc/engines/authgateengine.py +++ b/qwebirc/engines/authgateengine.py @@ -2,6 +2,7 @@ from twisted.web import resource, server, static import config, urlparse, urllib, hashlib, re import qwebirc.util.rijndael, qwebirc.util.ciphers import qwebirc.util +import qwebirc.util.qjson as json authgate = config.AUTHGATEPROVIDER.twisted BLOCK_SIZE = 128/8 @@ -35,6 +36,10 @@ class AuthgateEngine(resource.Resource): getSessionData(request)["qticket"] = decodeQTicket(qt) self.__hit() + if request.getCookie("jslogin"): + self.deleteCookie(request, "jslogin") + return """""" % json.dumps(ticket.username) + location = request.getCookie("redirect") if location is None: location = "/" @@ -77,4 +82,4 @@ def getSessionData(request): def login_optional(request): return authgate(request, config.AUTHGATEDOMAIN).login_optional() - \ No newline at end of file + diff --git a/static/panes/connect.html b/static/panes/connect.html index 493262b..8ba69b0 100644 --- a/static/panes/connect.html +++ b/static/panes/connect.html @@ -19,9 +19,27 @@ - + + + + + + + + + + + + + + + - + (logged in as ) + + + + (waiting for you to log in...) @@ -31,11 +49,23 @@ - - + + + + + + + + + + + + + +