]> jfr.im git - irc/quakenet/qwebirc.git/blobdiff - js/ui/panes/connect.js
Add a much better QuakeNet login system.
[irc/quakenet/qwebirc.git] / js / ui / panes / connect.js
index b496714ad95d92d337f8daa88591bd8feb29a5fe..7affa3fe0c2ca1252e92ca7cbc1d270fb036fee5 100644 (file)
@@ -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", "<div class=\"loading\">Loading. . .</div>"); };
     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();
+  };
+})();
+