Philipp Hörist pushed to branch master at gajim / python-nbxmpp

Commits:

3 changed files:

Changes:

  • nbxmpp/precis.py
    1
    +
    
    2
    +
    
    3
    +from precis_i18n import get_profile
    
    4
    +
    
    5
    +
    
    6
    +_localpart_disallowed_chars = set('"&\'/:<>@')
    
    7
    +
    
    8
    +
    
    9
    +def enforce_precis_username(localpart: str) -> str:
    
    10
    +    if _localpart_disallowed_chars & set(localpart):
    
    11
    +        raise ValueError('Input contains prohibited codepoint: %s' % localpart)
    
    12
    +
    
    13
    +    username = get_profile('UsernameCaseMapped')
    
    14
    +    return username.enforce(localpart)
    
    15
    +
    
    16
    +
    
    17
    +def enforce_precis_opaque(resourcepart: str) -> str:
    
    18
    +    opaque = get_profile('OpaqueString')
    
    19
    +    return opaque.enforce(resourcepart)

  • nbxmpp/protocol.py
    ... ... @@ -37,11 +37,12 @@ from dataclasses import asdict
    37 37
     from gi.repository import GLib
    
    38 38
     
    
    39 39
     import idna
    
    40
    -from precis_i18n import get_profile
    
    41 40
     from nbxmpp.simplexml import Node
    
    42 41
     from nbxmpp.namespaces import Namespace
    
    43 42
     from nbxmpp.stringprep import nodeprep
    
    44 43
     from nbxmpp.stringprep import resourceprep
    
    44
    +from nbxmpp.precis import enforce_precis_username
    
    45
    +from nbxmpp.precis import enforce_precis_opaque
    
    45 46
     
    
    46 47
     
    
    47 48
     def ascii_upper(s):
    
    ... ... @@ -256,7 +257,6 @@ _errorcodes = {
    256 257
     }
    
    257 258
     
    
    258 259
     
    
    259
    -_localpart_disallowed_chars = set('"&\'/:<>@')
    
    260 260
     _localpart_escape_chars = ' "&\'/:<>@'
    
    261 261
     
    
    262 262
     
    
    ... ... @@ -487,18 +487,17 @@ def validate_localpart(localpart: str) -> str:
    487 487
         if not localpart or len(localpart.encode()) > 1023:
    
    488 488
             raise LocalpartByteLimit
    
    489 489
     
    
    490
    -    if os.environ.get('NBXMPP_USE_PRECIS') is None:
    
    490
    +    if os.environ.get('NBXMPP_ENFORCE_PRECIS') is None:
    
    491 491
             try:
    
    492 492
                 return nodeprep(localpart)
    
    493 493
             except Exception:
    
    494
    -            raise LocalpartNotAllowedChar
    
    495
    -
    
    496
    -    if _localpart_disallowed_chars & set(localpart):
    
    497
    -        raise LocalpartNotAllowedChar
    
    494
    +            try:
    
    495
    +                return enforce_precis_username(localpart)
    
    496
    +            except Exception:
    
    497
    +                raise LocalpartNotAllowedChar
    
    498 498
     
    
    499 499
         try:
    
    500
    -        username = get_profile('UsernameCaseMapped')
    
    501
    -        return username.enforce(localpart)
    
    500
    +        return enforce_precis_username(localpart)
    
    502 501
         except Exception:
    
    503 502
             raise LocalpartNotAllowedChar
    
    504 503
     
    
    ... ... @@ -508,15 +507,17 @@ def validate_resourcepart(resourcepart: str) -> str:
    508 507
         if not resourcepart or len(resourcepart.encode()) > 1023:
    
    509 508
             raise ResourcepartByteLimit
    
    510 509
     
    
    511
    -    if os.environ.get('NBXMPP_USE_PRECIS') is None:
    
    510
    +    if os.environ.get('NBXMPP_ENFORCE_PRECIS') is None:
    
    512 511
             try:
    
    513 512
                 return resourceprep(resourcepart)
    
    514 513
             except Exception:
    
    515
    -            raise ResourcepartNotAllowedChar
    
    514
    +            try:
    
    515
    +                return enforce_precis_opaque(resourcepart)
    
    516
    +            except Exception:
    
    517
    +                raise ResourcepartNotAllowedChar
    
    516 518
     
    
    517 519
         try:
    
    518
    -        opaque = get_profile('OpaqueString')
    
    519
    -        return opaque.enforce(resourcepart)
    
    520
    +        return enforce_precis_opaque(resourcepart)
    
    520 521
         except Exception:
    
    521 522
             raise ResourcepartNotAllowedChar
    
    522 523
     
    

  • test/unit/test_jid_parsing.py
    ... ... @@ -51,7 +51,7 @@ class JIDParsing(unittest.TestCase):
    51 51
                     JID.from_string(jid)
    
    52 52
     
    
    53 53
         def test_invalid_precis_jids(self):
    
    54
    -        os.environ['NBXMPP_USE_PRECIS'] = 'true'
    
    54
    +        os.environ['NBXMPP_ENFORCE_PRECIS'] = 'true'
    
    55 55
             tests = [
    
    56 56
                 ('henry\U00002163@example.com', LocalpartNotAllowedChar),
    
    57 57
                 ('\U0000265A@example.com', LocalpartNotAllowedChar),
    
    ... ... @@ -61,7 +61,7 @@ class JIDParsing(unittest.TestCase):
    61 61
                 with self.assertRaises(exception):
    
    62 62
                     JID.from_string(jid)
    
    63 63
     
    
    64
    -        del os.environ['NBXMPP_USE_PRECIS']
    
    64
    +        del os.environ['NBXMPP_ENFORCE_PRECIS']
    
    65 65
     
    
    66 66
         def test_ip_literals(self):
    
    67 67
             tests = [