1# -*- coding: ascii -*-
2"""
3web2ldap plugin classes for attributes defined in SCHAC
4
5See https://www.terena.org/activities/tf-emc2/schac.html
6"""
7
8import re
9import datetime
10
11from ..schema.syntaxes import (
12    DateOfBirth,
13    DirectoryString,
14    IA5String,
15    NumericString,
16    CountryString,
17    DNSDomain,
18    syntax_registry,
19)
20from .msperson import Gender
21
22
23syntax_registry.reg_at(
24    CountryString.oid, [
25        '1.3.6.1.4.1.25178.1.2.5',  # schacCountryOfCitizenship
26        '1.3.6.1.4.1.25178.1.2.11', # schacCountryOfResidence
27    ]
28)
29
30syntax_registry.reg_at(
31    DNSDomain.oid, [
32        '1.3.6.1.4.1.25178.1.2.9', # schacHomeOrganization
33    ]
34)
35
36class SchacMotherTongue(IA5String):
37    oid: str = 'SchacMotherTongue-oid'
38    desc: str = 'Language tag of the language a person learns first (see RFC 3066).'
39    pattern = re.compile('^[a-zA-Z]{2,8}(-[a-zA-Z0-9]{2,8})*$')
40
41syntax_registry.reg_at(
42    SchacMotherTongue.oid, [
43        '1.3.6.1.4.1.25178.1.2.1', # schacMotherTongue
44    ]
45)
46
47
48syntax_registry.reg_at(
49    Gender.oid, [
50        '1.3.6.1.4.1.25178.1.2.2', # schacGender
51    ]
52)
53
54
55class SchacDateOfBirth(DateOfBirth):
56    oid: str = 'SchacDateOfBirth-oid'
57    desc: str = 'Date of birth: syntax YYYYMMDD'
58    storage_format = '%Y%m%d'
59
60syntax_registry.reg_at(
61    SchacDateOfBirth.oid, [
62        '1.3.6.1.4.1.25178.1.2.3', # schacDateOfBirth
63    ]
64)
65
66
67class SchacYearOfBirth(NumericString):
68    oid: str = 'SchacYearOfBirth-oid'
69    desc: str = 'Year of birth: syntax YYYY'
70    max_len: str = 4
71    input_pattern: str = '^[0-9]{4}$'
72    pattern = re.compile(input_pattern)
73
74    def _validate(self, attr_value: bytes) -> bool:
75        try:
76            birth_year = int(attr_value)
77        except ValueError:
78            return False
79        return birth_year <= datetime.date.today().year
80
81syntax_registry.reg_at(
82    SchacYearOfBirth.oid, [
83        '1.3.6.1.4.1.25178.1.0.2.3', # schacYearOfBirth
84    ]
85)
86
87
88class SchacUrn(DirectoryString):
89    oid: str = 'SchacUrn-oid'
90    desc: str = 'Generic URN for SCHAC'
91    input_pattern: str = '^urn:mace:terena.org:schac:.+$'
92    pattern = re.compile(input_pattern)
93
94syntax_registry.reg_at(
95    SchacUrn.oid, [
96        '1.3.6.1.4.1.25178.1.2.10', # schacHomeOrganizationType
97        '1.3.6.1.4.1.25178.1.2.13', # schacPersonalPosition
98        '1.3.6.1.4.1.25178.1.2.14', # schacPersonalUniqueCode
99        '1.3.6.1.4.1.25178.1.2.15', # schacPersonalUniqueID
100        '1.3.6.1.4.1.25178.1.2.19', # schacUserStatus
101    ]
102)
103
104
105# Register all syntax classes in this module
106syntax_registry.reg_syntaxes(__name__)
107