diff options
| author | Rob van der Linde <rob@catalyst.net.nz> | 2023-05-17 09:46:45 +1200 |
|---|---|---|
| committer | Andrew Bartlett <abartlet@samba.org> | 2023-06-25 23:29:32 +0000 |
| commit | 44aaba8a82dccf4034635229395491c0859da375 (patch) | |
| tree | 62aa9117adbd63a86ffb17b7d8d147138478e14c /python/samba | |
| parent | 3ecea860aaf8f0e7cac2100a605e915973481b3f (diff) | |
| download | samba-44aaba8a82dccf4034635229395491c0859da375.tar.gz samba-44aaba8a82dccf4034635229395491c0859da375.tar.bz2 samba-44aaba8a82dccf4034635229395491c0859da375.zip | |
netcmd: domain: add models for ClassSchema and AttributeSchema
Signed-off-by: Rob van der Linde <rob@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Joseph Sutton <josephsutton@catalyst.net.nz>
Diffstat (limited to 'python/samba')
| -rw-r--r-- | python/samba/netcmd/domain/models/__init__.py | 1 | ||||
| -rw-r--r-- | python/samba/netcmd/domain/models/schema.py | 124 |
2 files changed, 125 insertions, 0 deletions
diff --git a/python/samba/netcmd/domain/models/__init__.py b/python/samba/netcmd/domain/models/__init__.py index cd719559b04..85acb3e32fe 100644 --- a/python/samba/netcmd/domain/models/__init__.py +++ b/python/samba/netcmd/domain/models/__init__.py @@ -24,5 +24,6 @@ from .auth_policy import AuthenticationPolicy from .auth_silo import AuthenticationSilo from .claim_type import ClaimType from .model import MODELS +from .schema import AttributeSchema, ClassSchema from .user import User from .value_type import ValueType diff --git a/python/samba/netcmd/domain/models/schema.py b/python/samba/netcmd/domain/models/schema.py new file mode 100644 index 00000000000..1a9b3fbf8e2 --- /dev/null +++ b/python/samba/netcmd/domain/models/schema.py @@ -0,0 +1,124 @@ +# Unix SMB/CIFS implementation. +# +# Class and attribute schema models. +# +# Copyright (C) Catalyst.Net Ltd. 2023 +# +# Written by Rob van der Linde <rob@catalyst.net.nz> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +from .fields import BinaryField, BooleanField, DnField, GUIDField,\ + IntegerField, StringField +from .model import Model + + +class ClassSchema(Model): + default_object_category = DnField("defaultObjectCategory") + governs_id = StringField("governsID") + schema_id_guid = GUIDField("schemaIDGUID") + subclass_of = StringField("subclassOf") + admin_description = StringField("adminDescription") + admin_display_name = StringField("adminDisplayName") + default_hiding_value = BooleanField("defaultHidingValue") + default_security_descriptor = BinaryField("defaultSecurityDescriptor") + ldap_display_name = StringField("lDAPDisplayName") + may_contain = StringField("mayContain", many=True) + poss_superiors = StringField("possSuperiors", many=True) + rdn_att_id = StringField("rDNAttID") + show_in_advanced_view_only = BooleanField("showInAdvancedViewOnly") + system_only = BooleanField("systemOnly") + + @staticmethod + def get_base_dn(ldb): + """Return the base DN for the ClassSchema model. + + This is the same as AttributeSchema, but the objectClass is different. + + :param ldb: Ldb connection + :return: Dn object of container + """ + return ldb.get_schema_basedn() + + @staticmethod + def get_object_class(): + return "classSchema" + + @classmethod + def lookup(cls, ldb, name): + """Helper function to lookup class or raise LookupError. + + :param ldb: Ldb connection + :param name: Class name + :raises: LookupError if not found + :raises: ValueError if name is not provided + """ + if not name: + raise ValueError("Class name is required.") + + attr = cls.get(ldb, ldap_display_name=name) + if attr is None: + raise LookupError(f"Could not locate {name} in class schema.") + + return attr + + +class AttributeSchema(Model): + attribute_id = StringField("attributeID") + attribute_syntax = StringField("attributeSyntax") + is_single_valued = BooleanField("isSingleValued") + ldap_display_name = StringField("lDAPDisplayName") + om_syntax = IntegerField("oMSyntax") + admin_description = StringField("adminDescription") + admin_display_name = StringField("adminDisplayName") + attribute_security_guid = GUIDField("attributeSecurityGUID") + schema_flags_ex = IntegerField("schemaFlagsEx") + search_flags = IntegerField("searchFlags") + show_in_advanced_view_only = BooleanField("showInAdvancedViewOnly") + system_flags = IntegerField("systemFlags") + system_only = BooleanField("systemOnly") + + @staticmethod + def get_base_dn(ldb): + """Return the base DN for the AttributeSchema model. + + This is the same as ClassSchema, but the objectClass is different. + + :param ldb: Ldb connection + :return: Dn object of container + """ + return ldb.get_schema_basedn() + + @staticmethod + def get_object_class(): + return "attributeSchema" + + @classmethod + def lookup(cls, ldb, name): + """Helper function to lookup attribute or raise LookupError. + + :param ldb: Ldb connection + :param name: Attribute name + :raises: LookupError if not found + :raises: ValueError if name is not provided + """ + if not name: + raise ValueError("Attribute name is required.") + + attr = cls.get(ldb, ldap_display_name=name) + if attr is None: + raise LookupError(f"Could not locate {name} in attribute schema.") + + return attr |
