diff --git a/.gitignore b/.gitignore index 2b0a5c7..e6a85b5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .coverage *flymake.py .ropeproject +*.pyc diff --git a/src/jcl/jabber/register.py b/src/jcl/jabber/register.py index 160050c..a7849cd 100644 --- a/src/jcl/jabber/register.py +++ b/src/jcl/jabber/register.py @@ -38,7 +38,7 @@ class SetRegisterHandler(object): self.component = component self.account_manager = component.account_manager self.__logger = logging.getLogger("jcl.jabber.SetRegisterHandler") - self.field_name_regexp = re.compile("^[^@]+$") + self.field_name_regexp = re.compile("^[^@\s]+$") def filter(self, info_query, lang_class, x_data): """Filter requests to be handled""" diff --git a/src/jcl/jabber/tests/register.py b/src/jcl/jabber/tests/register.py index 8a873a7..185e6c1 100644 --- a/src/jcl/jabber/tests/register.py +++ b/src/jcl/jabber/tests/register.py @@ -56,7 +56,7 @@ class SetRegisterHandler_TestCase(JCLTestCase): result = self.handler.handle(iq_set, Lang.en, None, x_data) self.assertEquals(result, None) - def test_handle_invalid_name(self): + def test_handle_invalid_name_with_invalid_char(self): """Test with invalid supplied name""" iq_set = Iq(stanza_type="set", from_jid="user1@test.com/res", @@ -73,6 +73,23 @@ class SetRegisterHandler_TestCase(JCLTestCase): self.assertEquals(error.get_text(), Lang.en.field_error \ % ("name", Lang.en.arobase_in_name_forbidden)) + def test_handle_invalid_name_with_whitespace(self): + """Test with invalid supplied name""" + iq_set = Iq(stanza_type="set", + from_jid="user1@test.com/res", + to_jid="jcl.test.com") + x_data = Form("submit") + x_data.add_field(name="name", + value="wrong name", + field_type="text-single") + result = self.handler.handle(iq_set, Lang.en, None, x_data) + self.assertEquals(len(result), 1) + self.assertEquals(result[0].xmlnode.prop("type"), "error") + error = result[0].get_error() + self.assertEquals(error.get_condition().name, "not-acceptable") + self.assertEquals(error.get_text(), Lang.en.field_error \ + % ("name", Lang.en.arobase_in_name_forbidden)) + def test_handle_invalid_empty_name(self): """Test with empty supplied name""" iq_set = Iq(stanza_type="set", diff --git a/src/jcl/model/account.py b/src/jcl/model/account.py index 7bc6998..439de82 100644 --- a/src/jcl/model/account.py +++ b/src/jcl/model/account.py @@ -27,6 +27,7 @@ __revision__ = "$Id: account.py,v 1.3 2005/09/18 20:24:07 dax Exp $" import datetime +import re from sqlobject.inheritance import InheritableSQLObject from sqlobject.col import StringCol, IntCol, BoolCol, ForeignKey, DateTimeCol @@ -34,7 +35,7 @@ from sqlobject.joins import MultipleJoin from sqlobject.sqlbuilder import AND from jcl.lang import Lang -from jcl.error import MandatoryFieldError +from jcl.error import FieldError, MandatoryFieldError import jcl.model as model OFFLINE = "offline" @@ -61,6 +62,16 @@ def mandatory_field(field_name, field_value): raise MandatoryFieldError(field_name) return field_value +def no_whitespace_field(field_name, field_value): + """ Check that `field_value` does not contain any whitespace character + Arguments: + - `field_name`: Field name + - `field_value`: Field value to check + """ + if re.compile("\s").search(field_value) is not None: + raise FieldError(field_name, message_property="no_whitespace_in_field") + return field_value + class User(InheritableSQLObject): class sqlmeta: table = "user_table"