import qwebirc.util.qjson as json
def get_options():
- options = dict(networkName=config.NETWORK_NAME, networkServices=[config.AUTH_SERVICE], loginRegex=config. AUTH_OK_REGEX, appTitle=config.APP_TITLE, baseURL=config.BASE_URL, staticBaseURL=config.STATIC_BASE_URL, dynamicBaseURL=config.DYNAMIC_BASE_URL)
+ options = dict(
+ networkName=config.NETWORK_NAME,
+ networkServices=[config.AUTH_SERVICE],
+ loginRegex=config.AUTH_OK_REGEX,
+ appTitle=config.APP_TITLE,
+ baseURL=config.BASE_URL,
+ staticBaseURL=config.STATIC_BASE_URL,
+ dynamicBaseURL=config.DYNAMIC_BASE_URL,
+ validateNickname=False
+ )
+
+ if hasattr(config, "NICKNAME_VALIDATE") and config.NICKNAME_VALIDATE:
+ options["nickValidation"] = dict(
+ minLen=config.NICKNAME_MINIMUM_LENGTH,
+ maxLen=config.NICKNAME_MAXIMUM_LENGTH,
+ validFirstChar=config.NICKNAME_VALID_FIRST_CHAR,
+ validSubChars=config.NICKNAME_VALID_SUBSEQUENT_CHARS
+ )
+
return json.dumps(options)
#!/usr/bin/env python
-IRC_BASE = ["ircconnection", "irclib", "numerics", "baseircclient", "irctracker", "commandparser", "commands", "ircclient", "commandhistory"]
+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.extend(["panes/%s" % x for x in PANES])
# The title of the application in the web browser.
APP_TITLE = NETWORK_NAME + " Web IRC"
+# NICKNAME VALIDATION OPTIONS
+# ---------------------------------------------------------------------
+#
+# OPTION: NICKNAME_VALIDATE
+# If True then user nicknames will be validated according to
+# the configuration below, otherwise they will be passed
+# directly to the ircd.
+NICKNAME_VALIDATE = True
+
+# OPTION: NICKNAME_VALID_FIRST_CHAR
+# A string containing valid characters for the first letter of
+# a nickname.
+# Default is as in RFC1459.
+import string
+NICKNAME_VALID_FIRST_CHAR = string.letters + "_[]{}`^\\|"
+
+# OPTION: NICKNAME_VALID_SUBSEQUENT_CHAR
+# A string containing valid characters for the rest of the
+# nickname.
+NICKNAME_VALID_SUBSEQUENT_CHARS = NICKNAME_VALID_FIRST_CHAR + string.digits + "-"
+
+# OPTION: NICKNAME_MINIMUM_LENGTH
+# Minimum characters permitted in a nickname on your network.
+NICKNAME_MINIMUM_LENGTH = 2
+
+# OPTION: NICKNAME_MAXIMUM_LENGTH
+# Maximum characters permitted in a nickname on your network.
+# Ideally we'd extract this from the ircd, but we need to know
+# before we connect.
+NICKNAME_MAXIMUM_LENGTH = 15
# FEEDBACK OPTIONS
# ---------------------------------------------------------------------
--- /dev/null
+qwebirc.irc.DummyNicknameValidator = new Class({\r
+ validate: function(x) {\r
+ return x;\r
+ }\r
+});\r
+\r
+qwebirc.irc.NicknameValidator = new Class({\r
+ initialize: function(options) {\r
+ this.options = options;\r
+ },\r
+ validate: function(nick, permitDot) {\r
+ var r = [];\r
+ \r
+ var max = Math.min(this.options.maxLen, nick.length);\r
+ var exploded = nick.split("");\r
+ for(var i=0;i<max;i++) {\r
+ var c = exploded[i];\r
+ \r
+ var valid = i == 0 ? this.options.validFirstChar : this.options.validSubChars;\r
+ if(valid.indexOf(c) != -1 || permitDot && c == ".") {\r
+ r.push(c);\r
+ } else {\r
+ r.push("_"); /* yeah we assume this is valid... */\r
+ }\r
+ }\r
+\r
+ while(r.length < this.options.minLen)\r
+ r.push("_"); /* yeah we assume this is valid... */\r
+ return r.join("");\r
+ }\r
+});\r
saturation: null,
lightness: null,
uiOptionsArg: null,
+ nickValidation: null,
dynamicBaseURL: "/",
staticBaseURL: "/"
},
initialize: function(element, ui, options) {
- qwebirc.global = {dynamicBaseURL: options.dynamicBaseURL, staticBaseURL: options.staticBaseURL}; /* HACK */
-
this.setOptions(options);
+
+ /* HACK */
+ qwebirc.global = {
+ dynamicBaseURL: options.dynamicBaseURL,
+ staticBaseURL: options.staticBaseURL,
+ nicknameValidator: $defined(options.nickValidation) ? new qwebirc.irc.NicknameValidator(options.nickValidation) : new qwebirc.irc.DummyNicknameValidator()
+ };
window.addEvent("domready", function() {
var callback = function(options) {
nick.focus();
return;
}
-
+ 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 press Connect again.");
+ nick.focus();
+ return;
+ }
+
var data = {"nickname": nickname, "autojoin": chans};
if(qwebirc.auth.enabled()) {
if(qwebirc.auth.passAuth() && authCheckBox.checked) {
this.nicknameBox.focus();
return false;
}
+ var v = qwebirc.global.nicknameValidator.validate(this.nicknameBox.value, true);
+ if(v != this.nicknameBox.value) {
+ this.nicknameBox.value = v;
+ alert("The supplied nickname was invalid and has been corrected.");
+ this.nicknameBox.focus();
+ return false;
+ }
return true;
}.bind(this),
middle: this.nicknameBox,