class Computer(User):
"""A Computer is a type of User."""
+ def __init__(self, **kwargs):
+ """Computer constructor automatically adds "$" to username.
+
+ Also applies to GroupManagedServiceAccount subclass.
+ """
+ name = kwargs.get("name", kwargs.get("cn"))
+ username = kwargs.get("username")
+
+ # If the username is missing, use name or cn and add a "$".
+ # If the username is present but lacking "$", add it automatically.
+ if name and not username:
+ kwargs["username"] = name + "$"
+ elif username and not username.endswith("$"):
+ kwargs["username"] = username + "$"
+
+ super().__init__(**kwargs)
+
@staticmethod
def get_base_dn(ldb):
"""Return base Dn for Computers.
from ldb import FLAG_MOD_ADD, MessageElement, SCOPE_ONELEVEL
from samba.dcerpc import security
from samba.dcerpc.misc import GUID
-from samba.netcmd.domain.models import (AccountType, Group, Site, User,
- StrongNTLMPolicy, fields)
+from samba.netcmd.domain.models import (AccountType, Computer, Group, Site,
+ User, StrongNTLMPolicy, fields)
from samba.ndr import ndr_pack, ndr_unpack
from .base import SambaToolCmdTest
self.assertEqual(robots + humans, robots_vs_humans)
+class ComputerModelTests(SambaToolCmdTest):
+
+ @classmethod
+ def setUpClass(cls):
+ cls.samdb = cls.getSamDB("-H", HOST, CREDS)
+ super().setUpClass()
+
+ def test_computer_constructor(self):
+ comp1 = Computer(name="comp1")
+ self.assertEqual(comp1.username, "comp1$")
+
+ comp2 = Computer(cn="comp2")
+ self.assertEqual(comp2.username, "comp2$")
+
+ # User accidentally left out '$' in username.
+ comp3 = Computer(name="comp3", username="comp3")
+ self.assertEqual(comp3.username, "comp3$")
+
+ comp4 = Computer(cn="comp4", username="comp4$")
+ self.assertEqual(comp4.username, "comp4$")
+
+
class FieldTestMixin:
"""Tests a model field to ensure it behaves correctly in both directions.