From: Rob van der Linde Date: Wed, 20 Sep 2023 00:50:15 +0000 (+1200) Subject: netcmd: models: field to_db_value needs ldb param X-Git-Tag: tevent-0.16.0~317 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=950a70a190ab986c646a77d14295f6b1697db407;p=thirdparty%2Fsamba.git netcmd: models: field to_db_value needs ldb param Required by SDDL field type added in next commit Signed-off-by: Rob van der Linde Reviewed-by: Douglas Bagnall Reviewed-by: Andrew Bartlett --- diff --git a/python/samba/netcmd/domain/models/fields.py b/python/samba/netcmd/domain/models/fields.py index 523b7d69d57..b60f2e4d4b4 100644 --- a/python/samba/netcmd/domain/models/fields.py +++ b/python/samba/netcmd/domain/models/fields.py @@ -74,12 +74,13 @@ class Field(metaclass=ABCMeta): pass @abstractmethod - def to_db_value(self, value, flags): + def to_db_value(self, ldb, value, flags): """Converts value to database value. This should return a MessageElement or None, where None means the field will be unset on the next save. + :param ldb: Ldb connection :param value: Input value from Python field :param flags: MessageElement flags :returns: MessageElement or None @@ -99,7 +100,7 @@ class IntegerField(Field): else: return int(value[0]) - def to_db_value(self, value, flags): + def to_db_value(self, ldb, value, flags): """Convert int or list of int to MessageElement.""" if value is None: return @@ -129,7 +130,7 @@ class BinaryField(Field): else: return bytes(value[0]) - def to_db_value(self, value, flags): + def to_db_value(self, ldb, value, flags): """Convert bytes or list of bytes to MessageElement.""" if value is None: return @@ -152,7 +153,7 @@ class StringField(Field): else: return str(value) - def to_db_value(self, value, flags): + def to_db_value(self, ldb, value, flags): """Convert str or list of str to MessageElement.""" if value is None: return @@ -190,7 +191,7 @@ class EnumField(Field): else: return self.enum_from_value(value) - def to_db_value(self, value, flags): + def to_db_value(self, ldb, value, flags): """Convert enum or list of enum to MessageElement.""" if value is None: return @@ -214,7 +215,7 @@ class DateTimeField(Field): else: return datetime.fromtimestamp(string_to_time(str(value))) - def to_db_value(self, value, flags): + def to_db_value(self, ldb, value, flags): """Convert datetime or list of datetime to MessageElement.""" if value is None: return @@ -251,7 +252,7 @@ class RelatedField(Field): else: return self.model.get(ldb, dn=Dn(ldb, str(value))) - def to_db_value(self, value, flags): + def to_db_value(self, ldb, value, flags): """Convert related object or list of objects to MessageElement.""" if value is None: return @@ -276,7 +277,7 @@ class DnField(Field): else: return Dn(ldb, str(value)) - def to_db_value(self, value, flags): + def to_db_value(self, ldb, value, flags): """Convert Dn object or list of Dn objects into a MessageElement.""" if value is None: return @@ -299,7 +300,7 @@ class GUIDField(Field): else: return str(ndr_unpack(GUID, value[0])) - def to_db_value(self, value, flags): + def to_db_value(self, ldb, value, flags): """Convert str with GUID into MessageElement.""" if value is None: return @@ -322,7 +323,7 @@ class BooleanField(Field): else: return str(value) == "TRUE" - def to_db_value(self, value, flags): + def to_db_value(self, ldb, value, flags): """Convert bool or list of bool into a MessageElement.""" if value is None: return @@ -378,7 +379,7 @@ class PossibleClaimValuesField(Field): return values - def to_db_value(self, value, flags): + def to_db_value(self, ldb, value, flags): """Convert list of dicts back to XML as a MessageElement.""" if value is None: return diff --git a/python/samba/netcmd/domain/models/model.py b/python/samba/netcmd/domain/models/model.py index 00722c04272..3a95595736a 100644 --- a/python/samba/netcmd/domain/models/model.py +++ b/python/samba/netcmd/domain/models/model.py @@ -27,8 +27,8 @@ from ldb import ERR_NO_SUCH_OBJECT, FLAG_MOD_ADD, FLAG_MOD_REPLACE, LdbError,\ Message, MessageElement, SCOPE_BASE, SCOPE_SUBTREE, binary_encode from samba.sd_utils import SDUtils -from .exceptions import DeleteError, DoesNotExist, MultipleObjectsReturned,\ - ProtectError, UnprotectError +from .exceptions import DeleteError, DoesNotExist, ModelError,\ + MultipleObjectsReturned, ProtectError, UnprotectError from .fields import DateTimeField, DnField, Field, GUIDField, IntegerField,\ StringField @@ -359,7 +359,10 @@ class Model(metaclass=ModelMeta): for attr, field in self.fields.items(): if attr != "dn": value = getattr(self, attr) - db_value = field.to_db_value(value, FLAG_MOD_ADD) + try: + db_value = field.to_db_value(ldb, value, FLAG_MOD_ADD) + except ValueError as e: + raise ModelError(e) # Don't add empty fields. if db_value is not None and len(db_value): @@ -384,7 +387,11 @@ class Model(metaclass=ModelMeta): old_value = getattr(existing_obj, attr) if value != old_value: - db_value = field.to_db_value(value, FLAG_MOD_REPLACE) + try: + db_value = field.to_db_value(ldb, value, + FLAG_MOD_REPLACE) + except ValueError as e: + raise ModelError(e) # When a field returns None or empty list, delete attr. if db_value in (None, []): diff --git a/python/samba/tests/samba_tool/domain_models.py b/python/samba/tests/samba_tool/domain_models.py index 4b0b10ead2e..54505018446 100644 --- a/python/samba/tests/samba_tool/domain_models.py +++ b/python/samba/tests/samba_tool/domain_models.py @@ -58,7 +58,7 @@ class FieldTestMixin: # If the expected value is callable, treat it as a validation callback. # NOTE: perhaps we should be using subtests for this. for (value, expected) in self.to_db_value: - db_value = self.field.to_db_value(value, FLAG_MOD_ADD) + db_value = self.field.to_db_value(self.samdb, value, FLAG_MOD_ADD) if callable(expected): self.assertTrue(expected(db_value)) else: