From: Chris Porter Date: Mon, 13 Feb 2012 01:46:47 +0000 (+0000) Subject: Merge. X-Git-Url: https://jfr.im/git/irc/quakenet/qwebirc.git/commitdiff_plain/129b197fb5b6c23f2b12f1aa78a149df9357eb1f?hp=a2e51e77e68317f78f8e5f57f1264336784f6d94 Merge. --- diff --git a/bin/compile.py b/bin/compile.py index 151c1ec..5ca4a84 100644 --- a/bin/compile.py +++ b/bin/compile.py @@ -61,6 +61,8 @@ def merge_files(output, files, root_path=lambda x: x): f = open(output, "wb") for x in files: + if x.startswith("//"): + continue f2 = open(root_path(x), "rb") f.write(f2.read() + "\n") f2.close() @@ -139,4 +141,4 @@ def vcheck(): if __name__ == "__main__": main() - \ No newline at end of file + diff --git a/bin/pagegen.py b/bin/pagegen.py index c89102c..1c042d0 100755 --- a/bin/pagegen.py +++ b/bin/pagegen.py @@ -6,14 +6,14 @@ class HGException(Exception): def jslist(name, debug): ui = pages.UIs[name] if debug: - x = [pages.JS_BASE, ui.get("extra", []), pages.DEBUG, ["debug/ui/frontends/%s" % y for y in ui["uifiles"]]] + x = [pages.JS_DEBUG_BASE, ui.get("extra", []), pages.DEBUG, ["debug/ui/frontends/%s" % y for y in ui["uifiles"]]] hgid = "" else: #x = [pages.JS_BASE, ui.get("buildextra", ui.get("extra", [])), pages.BUILD_BASE, name] - x = [name] + x = [pages.JS_RAW_BASE, name] hgid = "-" + gethgid() - return list("js/%s%s.js" % (y, hgid) for y in pages.flatten(x)) + return list(y if y.startswith("//") else "js/%s%s.js" % (y, hgid) for y in pages.flatten(x)) def csslist(name, debug, gen=False): ui = pages.UIs[name] @@ -54,7 +54,7 @@ def producehtml(name, debug): js = jslist(name, debug) css = csslist(name, debug, gen=True) csshtml = "\n".join(" " % (config.STATIC_BASE_URL, x) for x in css) - jshtml = "\n".join(" " % (config.STATIC_BASE_URL, x) for x in js) + jshtml = "\n".join(" " % ("" if x.startswith("//") else config.STATIC_BASE_URL, x) for x in js) div = ui.get("div", "") customjs = ui.get("customjs", "") diff --git a/bin/pages.py b/bin/pages.py index 9251d4b..b387734 100644 --- a/bin/pages.py +++ b/bin/pages.py @@ -1,13 +1,15 @@ #!/usr/bin/env python IRC_BASE = ["ircconnection", "irclib", "numerics", "baseircclient", "irctracker", "commandparser", "commands", "ircclient", "commandhistory", "nicknamevalidator"] PANES = ["connect", "embed", "options", "about", "privacypolicy", "feedback", "faq"] -UI_BASE = ["menuitems", "baseui", "baseuiwindow", "colour", "url", "theme", "notifications", "tabcompleter", "style"] +UI_BASE = ["menuitems", "baseui", "baseuiwindow", "colour", "url", "theme", "notifications", "tabcompleter", "style", "xdomain"] UI_BASE.extend(["panes/%s" % x for x in PANES]) DEBUG_BASE = ["qwebirc", "version", "jslib", "crypto", "md5", ["irc/%s" % x for x in IRC_BASE], ["ui/%s" % x for x in UI_BASE], "qwebircinterface", "auth", "sound"] BUILD_BASE = ["qwebirc"] -JS_BASE = ["mootools-1.2.5-core", "mootools-1.2.5.1-more"] -JS_EXTRA = ["soundmanager2"] +JS_DEBUG_BASE = ["mootools-1.2.5-core-nc", "mootools-1.2.5.1-more-nc", "debug/soundmanager_defer", "soundmanager2"] +JS_RAW_BASE = ["//ajax.googleapis.com/ajax/libs/mootools/1.2.5/mootools-yui-compressed.js"] +JS_BASE = ["mootools-1.2.5.1-more", "../../js/soundmanager_defer", "soundmanager2-nodebug-jsmin"] +JS_EXTRA = [] UIs = { "qui": { 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..c58b85a 100644 --- a/js/auth.js +++ b/js/auth.js @@ -1,19 +1,22 @@ qwebirc.auth.loggedin = function() { var user = Cookie.read("user"); - + var expiry = Cookie.read("ticketexpiry"); + if(expiry && new Date().getTime() > expiry - (5 * 60 * 1000)) + return; + return user; } 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/irc/baseircclient.js b/js/irc/baseircclient.js index 7722b24..948e6f7 100644 --- a/js/irc/baseircclient.js +++ b/js/irc/baseircclient.js @@ -504,5 +504,10 @@ qwebirc.irc.BaseIRCClient = new Class({ this.channelModeIs(channel, modes); return true; + }, + irc_QWEBIRCIMAGE: function(prefix, params) { + var target = params[0]; + var url = params.indexFromEnd(-1); + return this.qwebircImage(target, url); } }); diff --git a/js/irc/ircclient.js b/js/irc/ircclient.js index a26ae86..dc8a097 100644 --- a/js/irc/ircclient.js +++ b/js/irc/ircclient.js @@ -242,6 +242,8 @@ qwebirc.irc.IRCClient = new Class({ this.exec("/AUTOJOIN"); } + + this.ui.signedOn(); }, userJoined: function(user, channel) { var nick = user.hostToNick(); @@ -669,5 +671,22 @@ qwebirc.irc.IRCClient = new Class({ }, channelCreationTime: function(channel, time) { this.newTargetOrActiveLine(channel, "CHANNELCREATIONTIME", {c: channel, m: qwebirc.irc.IRCDate(new Date(time * 1000))}); - } + }, + qwebircImage: function(target, url) { + var w; + if(target == "-STATUS") { + w = this.statusWindow; + } else { + w = this.getWindow(target); + } + + if(!w) + w = this.getActiveWindow(); + + var img = new Element("img", {src: qwebirc.global.dynamicBaseURL + "image?filename=" + url}); + var d = new Element("div", {styles: {"paddingTop": "2px", "paddingBottom": "2px", "paddingLeft": "9px"}}); + d.appendChild(img); + w.scrollAdd(d); + return true; + } }); diff --git a/js/qwebirc.js b/js/qwebirc.js index 03e8b80..8e4b085 100644 --- a/js/qwebirc.js +++ b/js/qwebirc.js @@ -1,4 +1,4 @@ -var qwebirc = {ui: {themes: {}, style: {}}, irc: {}, util: {crypto: {}}, config: {}, auth: {}, sound: {}, connected: false}; +var qwebirc = {ui: {themes: {}, style: {}}, irc: {}, util: {crypto: {}}, config: {}, auth: {}, sound: {}, connected: false, xdomain: {}}; if(typeof QWEBIRC_BUILD != "undefined") { qwebirc.BUILD = QWEBIRC_BUILD; diff --git a/js/qwebircinterface.js b/js/qwebircinterface.js index 1d7f249..44ea44c 100644 --- a/js/qwebircinterface.js +++ b/js/qwebircinterface.js @@ -33,14 +33,31 @@ qwebirc.ui.Interface = new Class({ }, initialize: function(element, ui, options) { this.setOptions(options); + var extractHost = function(uri) { + var start = uri.indexOf('?'); + if(start != -1) + uri = uri.substring(0, start); + var start = uri.indexOf('#'); + if(start != -1) + uri = uri.substring(0, start); + + if(uri.substr(uri.length - 1) != "/") + uri = uri + "/"; + + return uri; + }; + + options.baseURL = extractHost(document.location.href); /* HACK */ qwebirc.global = { dynamicBaseURL: options.dynamicBaseURL, staticBaseURL: options.staticBaseURL, + baseURL: options.baseURL, nicknameValidator: $defined(options.nickValidation) ? new qwebirc.irc.NicknameValidator(options.nickValidation) : new qwebirc.irc.DummyNicknameValidator() }; + window.addEvent("domready", function() { var callback = function(options) { var IRC = new qwebirc.irc.IRCClient(options, ui_); diff --git a/js/sound.js b/js/sound.js index f204382..f882201 100644 --- a/js/sound.js +++ b/js/sound.js @@ -8,6 +8,12 @@ qwebirc.sound.SoundPlayer = new Class({ initialize: function() { this.loadingSWF = false; this.loadedSWF = false; + + var sb = qwebirc.global.staticBaseURL; + if(qwebirc.global.baseURL.substr(qwebirc.global.baseURL.length - 1, 1) == "/" && sb.substr(0, 1) == "/") + sb = sb.substr(1) + + this.soundURL = qwebirc.global.baseURL + sb + "sound/"; }, go: function() { if(qwebirc.sound.domReady) { @@ -22,24 +28,23 @@ qwebirc.sound.SoundPlayer = new Class({ if(this.loadingSWF) return; this.loadingSWF = true; - if(eval("typeof soundManager") != "undefined") { + + var debugMode = false; + + window.soundManager = new SoundManager(); + + var sb = qwebirc.global.staticBaseURL; + if(qwebirc.global.baseURL.substr(-1) == "/" && sb.substr(0, 1) == "/") + sb = sb.substr(1) + + window.soundManager.url = this.soundURL; + window.soundManager.debugMode = debugMode; + window.soundManager.useConsole = debugMode; + window.soundManager.onload = function() { this.loadedSWF = true; this.fireEvent("ready"); - return; - } - - var debugMode = false; - qwebirc.util.importJS(qwebirc.global.staticBaseURL + "js/" + (debugMode?"soundmanager2":"soundmanager2-nodebug-jsmin") + ".js", "soundManager", function() { - soundManager.url = qwebirc.global.staticBaseURL + "sound/"; - - soundManager.debugMode = debugMode; - soundManager.useConsole = debugMode; - soundManager.onload = function() { - this.loadedSWF = true; - this.fireEvent("ready"); - }.bind(this); - soundManager.beginDelayedInit(); - }.bind(this)); + }.bind(this); + window.soundManager.beginDelayedInit(); }, createSound: function(name, src) { soundManager.createSound(name, src); @@ -49,7 +54,7 @@ qwebirc.sound.SoundPlayer = new Class({ }, beep: function() { if(!this.beepLoaded) { - this.createSound("beep", qwebirc.global.staticBaseURL + "sound/beep3.mp3"); + this.createSound("beep", this.soundURL + "beep3.mp3"); this.beepLoaded = true; } this.playSound("beep"); diff --git a/js/soundmanager_defer.js b/js/soundmanager_defer.js new file mode 100644 index 0000000..5255280 --- /dev/null +++ b/js/soundmanager_defer.js @@ -0,0 +1 @@ +window.SM2_DEFER = true; diff --git a/js/ui/baseui.js b/js/ui/baseui.js index ec54d47..1a5c580 100644 --- a/js/ui/baseui.js +++ b/js/ui/baseui.js @@ -197,12 +197,42 @@ qwebirc.ui.BaseUI = new Class({ tricked into getting themselves glined */ loginBox: function(callback, initialNickname, initialChannels, autoConnect, autoNick) { - qwebirc.ui.GenericLoginBox(this.parentElement, callback, initialNickname, initialChannels, autoConnect, autoNick, this.options.networkName); + this.postInitialize(); + + this.addCustomWindow("Connection details", qwebirc.ui.ConnectPane, "connectpane", { + initialNickname: initialNickname, initialChannels: initialChannels, autoConnect: autoConnect, networkName: this.options.networkName, callback: callback, autoNick: autoNick + }, qwebirc.ui.WINDOW_CONNECT); }, focusChange: function(newValue) { var window_ = this.getActiveWindow(); if($defined(window_)) window_.focusChange(newValue); + }, + signedOn: function() { + this.poller = new qwebirc.xdomain.Poller(this.oobMessage.bind(this)); + }, + oobMessage: function(message) { + var c = message.splitMax(" ", 2); + if(c.length != 2) + return; + + var command = c[0]; + if(command != "CMD") + return; + + var d = c[1].splitMax(" ", 2); + if(d.length != 2) + return; + + var command = d[0]; + var args = d[1]; + if(command == "SAY") { + var w = this.getActiveIRCWindow(); + if($defined(w) && (w.type == qwebirc.ui.WINDOW_CHANNEL || w.type == qwebirc.ui.WINDOW_QUERY)) { + w.client.exec("/SAY " + args); + return; + } + } } }); @@ -287,7 +317,7 @@ qwebirc.ui.StandardUI = new Class({ newCustomWindow: function(name, select, type) { if(!type) type = qwebirc.ui.WINDOW_CUSTOM; - + var w = this.newWindow(qwebirc.ui.CUSTOM_CLIENT, type, name); w.addEvent("close", function(w) { delete this.windows[qwebirc.ui.CUSTOM_CLIENT][w.identifier]; @@ -298,7 +328,7 @@ qwebirc.ui.StandardUI = new Class({ return w; }, - addCustomWindow: function(windowName, class_, cssClass, options) { + addCustomWindow: function(windowName, class_, cssClass, options, type) { if(!$defined(options)) options = {}; @@ -307,7 +337,7 @@ qwebirc.ui.StandardUI = new Class({ return; } - var d = this.newCustomWindow(windowName, true); + var d = this.newCustomWindow(windowName, true, type); this.customWindows[windowName] = d; d.addEvent("close", function() { @@ -436,24 +466,8 @@ qwebirc.ui.NotificationUI = new Class({ } }); -qwebirc.ui.NewLoginUI = new Class({ - Extends: qwebirc.ui.NotificationUI, - loginBox: function(callbackfn, initialNickname, initialChannels, autoConnect, autoNick) { - this.postInitialize(); - - /* I'd prefer something shorter and snappier! */ - var w = this.newCustomWindow("Connection details", true, qwebirc.ui.WINDOW_CONNECT); - var callback = function(args) { - w.close(); - callbackfn(args); - }; - - qwebirc.ui.GenericLoginBox(w.lines, callback, initialNickname, initialChannels, autoConnect, autoNick, this.options.networkName); - } -}); - qwebirc.ui.QuakeNetUI = new Class({ - Extends: qwebirc.ui.NewLoginUI, + Extends: qwebirc.ui.NotificationUI, urlDispatcher: function(name, window) { if(name == "qwhois") { return ["span", function(auth) { diff --git a/js/ui/panes/connect.js b/js/ui/panes/connect.js index c7004d7..6f1e7ec 100644 --- a/js/ui/panes/connect.js +++ b/js/ui/panes/connect.js @@ -1,167 +1,231 @@ -qwebirc.ui.GenericLoginBox = function(parentElement, callback, initialNickname, initialChannels, autoConnect, autoNick, networkName) { - if(autoConnect) { - qwebirc.ui.ConfirmBox(parentElement, callback, initialNickname, initialChannels, autoNick, networkName); - } else { - qwebirc.ui.LoginBox(parentElement, callback, initialNickname, initialChannels, networkName); - } -} +qwebirc.ui.ConnectPane = new Class({ + Implements: [Events], + 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); -qwebirc.ui.AuthLogin = function(e) { - var cookie = Cookie.write("redirect", document.location); - document.location = qwebirc.global.dynamicBaseURL + "auth/"; - new Event(e).stop(); -} + var delayfn = function() { parent.set("html", "
Loading. . .
"); }; + var cb = delayfn.delay(500); -qwebirc.ui.ConfirmBox = function(parentElement, callback, initialNickname, initialChannels, autoNick, networkName) { - var outerbox = new Element("table"); - outerbox.addClass("qwebirc-centrebox"); - parentElement.appendChild(outerbox); - var tbody = new Element("tbody"); - outerbox.appendChild(tbody); - var tr = new Element("tr"); - tbody.appendChild(tr); - var td = new Element("td"); - tr.appendChild(td); - - var box = new Element("table"); - box.addClass("qwebirc-confirmbox"); - td.appendChild(box); + var r = qwebirc.ui.RequestTransformHTML({url: qwebirc.global.staticBaseURL + "panes/connect.html", update: parent, onSuccess: function() { + $clear(cb); - var tbody = new Element("tbody"); - box.appendChild(tbody); - - var tr = new Element("tr"); - tbody.appendChild(tr); - tr.addClass("tr1"); - - var text = new Element("td"); - tr.appendChild(text); - - var nick = new Element("b"); - nick.set("text", initialNickname); - - var c = initialChannels.split(" ")[0].split(","); - - text.appendChild(document.createTextNode("To connect to " + networkName + " IRC and join channel" + ((c.length>1)?"s":"") + " ")); + var box = (autoConnect ? "confirm" : "login"); + var rootElement = parent.getElement("[name=" + box + "box]"); + this.rootElement = rootElement; + + this.util.exec = function(n, x) { rootElement.getElements(n).each(x); }; + var util = this.util; + var exec = util.exec; + util.makeVisible(rootElement); - for(var i=0;i 1) && (i == c.length - 1)) { - text.appendChild(document.createTextNode(" and ")); - } else if(i > 0) { - text.appendChild(document.createTextNode(", ")); - } - text.appendChild(new Element("b").set("text", c[i])); - - } - - if(!autoNick) { - text.appendChild(document.createTextNode(" as ")); - text.appendChild(nick); - } - - text.appendChild(document.createTextNode(" click 'Connect'.")); - text.appendChild(new Element("br")); - if(qwebirc.auth.enabled() && qwebirc.auth.quakeNetAuth() && !qwebirc.auth.loggedin()) - text.appendChild(document.createTextNode("If you'd like to connect using your Q auth click 'Log in'.")); - - var tr = new Element("tr"); - tbody.appendChild(tr); - tr.addClass("tr2"); - - var td = new Element("td"); - tr.appendChild(td); + exec("[name=nickname]", util.setText(initialNickname)); + exec("[name=channels]", util.setText(initialChannels)); + exec("[name=prettychannels]", function(node) { this.__buildPrettyChannels(node, initialChannels); }.bind(this)); + exec("[name=networkname]", util.setText(networkName)); - var yes = new Element("input", {"type": "submit", "value": "Connect"}); - td.appendChild(yes); - yes.addEvent("click", function(e) { - parentElement.removeChild(outerbox); - callback({"nickname": initialNickname, "autojoin": initialChannels}); - }); - - if(qwebirc.auth.enabled() && qwebirc.auth.quakeNetAuth() && !qwebirc.auth.loggedin()) { - var auth = new Element("input", {"type": "submit", "value": "Log in"}); - td.appendChild(auth); - auth.addEvent("click", qwebirc.ui.AuthLogin); - } - - if(window == window.top) - yes.focus(); -} + var focus = "connect"; + if(autoConnect) { + if(!autoNick) + exec("[name=nickselected]", util.makeVisible); -qwebirc.ui.LoginBox = function(parentElement, callback, initialNickname, initialChannels, networkName) { - var outerbox = new Element("table"); - outerbox.addClass("qwebirc-centrebox"); - parentElement.appendChild(outerbox); - var tbody = new Element("tbody"); - outerbox.appendChild(tbody); - var tr = new Element("tr"); - tbody.appendChild(tr); - var td = new Element("td"); - tr.appendChild(td); - - var box = new Element("table"); - box.addClass("qwebirc-loginbox"); - td.appendChild(box); - - var tbody = new Element("tbody"); - box.appendChild(tbody); - - var tr = new Element("tr"); - tbody.appendChild(tr); - tr.addClass("tr1"); - - var td = new Element("td"); - tr.appendChild(td); - td.set("html", "

Connect to " + networkName + " IRC

"); - - var tr = new Element("tr"); - tbody.appendChild(tr); - tr.addClass("tr2"); - - var td = new Element("td"); - tr.appendChild(td); - - var form = new Element("form"); - td.appendChild(form); + this.__validate = this.__validateConfirmData; + } else { + if(!initialNickname) { + focus = "nickname"; + } else if(initialNickname && !initialChannels) { + focus = "channels"; + } + + 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); + } + } - var boxtable = new Element("table"); - form.appendChild(boxtable); + if(window == window.top) /* don't focus when we're iframe'd */ + 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) { + if(typeof y.value === "undefined") { + y.set("text", x); + } else { + y.value = x === null ? "" : x; + } + } } + }, + validate: function() { + return this.__validate(); + }, + __connect: function(e) { + new Event(e).stop(); + var data = this.validate(); + if(data === false) + return; - var tbody = new Element("tbody"); - boxtable.appendChild(tbody); /* stupid IE */ + 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; - function createRow(label, e2, style) { - var r = new Element("tr"); - tbody.appendChild(r); + 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; + } - var d1 = new Element("td"); - if(label) - d1.set("text", label); - r.appendChild(d1); + this.fireEvent("close"); + this.options.callback(data); + }.bind(this), "loginconnectbutton"); + }, + __login: function(e) { + new Event(e).stop(); - var d2 = new Element("td"); - r.appendChild(d2); - - if($defined(e2)) - d2.appendChild(e2); - if($defined(style)) { - r.setStyles(style); - return [r, d2]; + 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, expiry, serverNow) { + this.__cancelLoginCallback(true); + + var now = new Date().getTime(); + var offset = (serverNow * 1000) - now; + var ourExpiry = expiry * 1000 - offset; + Cookie.write("ticketexpiry", ourExpiry) + + 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}; + }, + __validateLoginData: function() { + var nick = this.rootElement.getElement("input[name=nickname]"), chan = this.rootElement.getElement("input[name=channels]"); + + var nickname = nick.value; + var chans = chan.value; + if(chans == "#") /* sorry channel "#" :P */ + chans = ""; + + if(!nickname) { + alert("You must supply a nickname."); + nick.focus(); + return false; + } + + var stripped = qwebirc.global.nicknameValidator.validate(nickname); + if(stripped != nickname) { + nick.value = stripped; + alert("Your nickname was invalid and has been corrected; please check your altered nickname and try again."); + nick.focus(); + return false; } - return d2; + var data = {nickname: nickname, autojoin: chans}; + return data; + }, + __buildPrettyChannels: function(node, channels) { + var c = channels.split(" ")[0].split(","); + node.appendChild(document.createTextNode("channel" + ((c.length>1)?"s":"") + " ")); + for(var i=0;i 1) && (i == c.length - 1)) { + node.appendChild(document.createTextNode(" and ")); + } else if(i > 0) { + node.appendChild(document.createTextNode(", ")); + } + node.appendChild(new Element("b").set("text", c[i])); + } } +}); - var nick = new Element("input"); - createRow("Nickname:", nick); - - var chanStyle = null; - if(qwebirc.auth.enabled() && qwebirc.auth.bouncerAuth()) - chanStyle = {display: "none"}; - - var chan = new Element("input"); - createRow("Channels:", chan, chanStyle); - +qwebirc.ui.LoginBox2 = function(parentElement, callback, initialNickname, initialChannels, networkName) { +/* if(qwebirc.auth.enabled()) { if(qwebirc.auth.passAuth()) { var authRow = createRow("Auth to services:"); @@ -179,19 +243,15 @@ qwebirc.ui.LoginBox = function(parentElement, callback, initialNickname, initial var passwordBox = qwebirc.util.createInput("password", passwordRow, "connect_auth_password"); } } - + */ + var connbutton = new Element("input", {"type": "submit"}); connbutton.set("value", "Connect"); var r = createRow(undefined, connbutton); - if(qwebirc.auth.enabled() && qwebirc.auth.quakeNetAuth() && !qwebirc.auth.loggedin()) { - var auth = new Element("input", {"type": "submit", "value": "Log in"}); - r.appendChild(auth); - auth.addEvent("click", qwebirc.ui.AuthLogin); - } - form.addEvent("submit", function(e) { new Event(e).stop(); + var nickname = nick.value; var chans = chan.value; if(chans == "#") /* sorry channel "#" :P */ @@ -257,3 +317,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/embed.js b/js/ui/panes/embed.js index baf4cba..c52ce6b 100644 --- a/js/ui/panes/embed.js +++ b/js/ui/panes/embed.js @@ -319,6 +319,6 @@ qwebirc.ui.EmbedWizard = new Class({ URL.push("uio=" + uioptions); } - return this.options.baseURL + (URL.length>0?"?":"") + URL.join("&"); + return qwebirc.global.baseURL + (URL.length>0?"?":"") + URL.join("&"); } }); diff --git a/js/ui/panes/options.js b/js/ui/panes/options.js index ff50c0f..1d6b075 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, { @@ -443,8 +443,12 @@ qwebirc.ui.SuppliedArgOptions = new Class({ var checksum = arg.substr(arg.length - 2, 2); var decoded = qwebirc.util.b64Decode(arg.substr(0, arg.length - 2)); - if(decoded && (new qwebirc.util.crypto.MD5().digest(decoded).slice(0, 2) == checksum)) - p = qwebirc.util.parseURI("?" + decoded); + if(decoded && (new qwebirc.util.crypto.MD5().digest(decoded).slice(0, 2) == checksum)) { + var p2 = qwebirc.util.parseURI("?" + decoded); + for(var k in p2) { + p[k] = JSON.decode(p2[k], true); + } + } } this.parsedOptions = p; @@ -464,7 +468,7 @@ qwebirc.ui.SuppliedArgOptions = new Class({ var result = []; this.getOptionList().forEach(function(x) { if(x.settableByURL && x.default_ != x.value) - result.push(x.optionId + "=" + x.value); + result.push(x.optionId + "=" + JSON.encode(x.value)); }.bind(this)); var raw = result.join("&"); diff --git a/js/ui/xdomain.js b/js/ui/xdomain.js new file mode 100644 index 0000000..a814756 --- /dev/null +++ b/js/ui/xdomain.js @@ -0,0 +1,33 @@ +qwebirc.xdomain.Poller = new Class({ + initialize: function(callback) { + this._callback = callback; + this._poll.periodical(100, this); + this._lastValue = null; + this._counter = -1; + }, + _poll: function() { + var value = window.location.href; + if(value === null || value === undefined || value == this._lastValue) + return; + this._lastValue = value; + var fragment = value.splitMax("#", 2)[1]; + + if(fragment === undefined || fragment.substr(0, 6) != "qwmsg:") + return; + + var components = fragment.substr(6).split(":", 3); + var counter = parseInt(components[0]); + if(counter <= this._counter) + return; + + this._counter = counter; + + var len = parseInt(components[1]); + var message = decodeURIComponent(components[2]); + if(len != message.length) + return; + + message = message.replaceAll("\000", "").replaceAll("\n", "").replaceAll("\r", ""); + this._callback(message); + } +}); 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/api.js b/static/api.js new file mode 100644 index 0000000..ae28ad5 --- /dev/null +++ b/static/api.js @@ -0,0 +1,19 @@ +/* example usage: + * + * var qwebirc = new QWebIRC(document.getElementById("myiframeid")); + * function f() { + * qwebirc.say("hi there mr wibbles"); + * } + */ + +var QWebIRC = function(element) { + var counter = 0; + var send = function(message) { + element.src = element.src.split("#")[0] + "#qwmsg:" + counter++ + ":" + message.length + ":" + encodeURIComponent(message); + }; + + this.say = function(message) { + send("CMD SAY " + message); + }; +}; + diff --git a/static/images/favicon.png b/static/images/favicon.png index d9e13d3..13f5307 100644 Binary files a/static/images/favicon.png and b/static/images/favicon.png differ diff --git a/static/images/hue.png b/static/images/hue.png index 88a8e40..5293e4f 100644 Binary files a/static/images/hue.png and b/static/images/hue.png differ diff --git a/static/images/icon.png b/static/images/icon.png index 4a1ef91..616e70d 100644 Binary files a/static/images/icon.png and b/static/images/icon.png differ diff --git a/static/images/qwebircsmall.png b/static/images/qwebircsmall.png index b1e5d66..784b774 100644 Binary files a/static/images/qwebircsmall.png and b/static/images/qwebircsmall.png differ diff --git a/static/panes/connect.html b/static/panes/connect.html new file mode 100644 index 0000000..8ba69b0 --- /dev/null +++ b/static/panes/connect.html @@ -0,0 +1,73 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +