|
18 | 18 | from sqlalchemy.sql.elements import ColumnElement, UnaryExpression |
19 | 19 | from sqlalchemy.sql.expression import Select |
20 | 20 |
|
21 | | -from config import Settings |
22 | 21 | from entities import ( |
23 | 22 | Attribute, |
24 | 23 | AttributeType, |
|
42 | 41 | SearchResultEntry, |
43 | 42 | SearchResultReference, |
44 | 43 | ) |
45 | | -from ldap_protocol.netlogon import NetLogonAttributeHandler |
46 | 44 | from ldap_protocol.objects import DerefAliases, ProtocolRequests, Scope |
47 | 45 | from ldap_protocol.roles.access_manager import AccessManager |
| 46 | +from ldap_protocol.rootdse.netlogon import NetLogonAttributeHandler |
48 | 47 | from ldap_protocol.utils.cte import get_all_parent_group_directories |
49 | 48 | from ldap_protocol.utils.helpers import ( |
50 | 49 | dt_to_ft, |
51 | | - get_generalized_now, |
52 | 50 | get_windows_timestamp, |
53 | 51 | string_to_sid, |
54 | 52 | ) |
@@ -217,70 +215,6 @@ async def _get_subschema(self, session: AsyncSession) -> SearchResultEntry: |
217 | 215 | ], |
218 | 216 | ) |
219 | 217 |
|
220 | | - async def get_root_dse( |
221 | | - self, |
222 | | - session: AsyncSession, |
223 | | - settings: Settings, |
224 | | - ) -> defaultdict[str, list[str]]: |
225 | | - """Get RootDSE. |
226 | | -
|
227 | | - :return defaultdict[str, list[str]]: queried attrs |
228 | | - """ |
229 | | - data = defaultdict(list) |
230 | | - domain_query = select(Directory).filter_by(object_class="domain") |
231 | | - domain = (await session.scalars(domain_query)).one() |
232 | | - |
233 | | - schema = "CN=Schema" |
234 | | - if self.requested_attrs == ["subschemasubentry"]: |
235 | | - data["subschemaSubentry"].append(schema) |
236 | | - return data |
237 | | - |
238 | | - data["dnsHostName"].append(domain.name) |
239 | | - data["serverName"].append(domain.name) |
240 | | - data["serviceName"].append(domain.name) |
241 | | - data["dsServiceName"].append(domain.name) |
242 | | - data["LDAPServiceName"].append(domain.name) |
243 | | - data["dnsForestName"].append(domain.name) |
244 | | - data["dnsDomainName"].append(domain.name) |
245 | | - data["domainGuid"].append(str(domain.object_guid)) |
246 | | - data["vendorName"].append(settings.VENDOR_NAME) |
247 | | - data["vendorVersion"].append(settings.VENDOR_VERSION) |
248 | | - data["namingContexts"].append(domain.path_dn) |
249 | | - data["namingContexts"].append(schema) |
250 | | - data["rootDomainNamingContext"].append(domain.path_dn) |
251 | | - data["supportedLDAPVersion"].append("3") |
252 | | - data["defaultNamingContext"].append(domain.path_dn) |
253 | | - data["currentTime"].append(get_generalized_now(settings.TIMEZONE)) |
254 | | - data["subschemaSubentry"].append(schema) |
255 | | - data["schemaNamingContext"].append(schema) |
256 | | - data["supportedSASLMechanisms"] = [ |
257 | | - "ANONYMOUS", |
258 | | - "PLAIN", |
259 | | - "GSSAPI", |
260 | | - "GSS-SPNEGO", |
261 | | - ] |
262 | | - data["highestCommittedUSN"].append("126991") |
263 | | - data["supportedExtension"] = [ |
264 | | - "1.3.6.1.4.1.4203.1.11.3", # whoami |
265 | | - "1.3.6.1.4.1.4203.1.11.1", # password modify |
266 | | - ] |
267 | | - data["supportedControl"] = [ |
268 | | - "2.16.840.1.113730.3.4.4", # password expire policy |
269 | | - ] |
270 | | - data["domainFunctionality"].append("0") |
271 | | - data["supportedLDAPPolicies"] = [ |
272 | | - "MaxConnIdleTime", |
273 | | - "MaxPageSize", |
274 | | - "MaxValRange", |
275 | | - ] |
276 | | - data["supportedCapabilities"] = [ |
277 | | - "1.2.840.113556.1.4.800", # ACTIVE_DIRECTORY_OID |
278 | | - "1.2.840.113556.1.4.1670", # ACTIVE_DIRECTORY_V51_OID |
279 | | - "1.2.840.113556.1.4.1791", # ACTIVE_DIRECTORY_LDAP_INTEG_OID |
280 | | - ] |
281 | | - |
282 | | - return data |
283 | | - |
284 | 218 | def _cast_filter(self) -> UnaryExpression | ColumnElement: |
285 | 219 | """Convert asn1 row filter_ to sqlalchemy obj. |
286 | 220 |
|
@@ -308,7 +242,7 @@ def check_netlogon_filter(self) -> bool: |
308 | 242 | return "netlogon" in self.requested_attrs |
309 | 243 |
|
310 | 244 | async def _get_netlogon(self, ctx: LDAPSearchRequestContext) -> bytes: |
311 | | - rootdse = await self.get_root_dse(ctx.session, ctx.settings) |
| 245 | + rootdse = await ctx.rootdse_rd.get(self.requested_attrs) |
312 | 246 | nl = NetLogonAttributeHandler.from_filter(rootdse, self.filter) |
313 | 247 | return nl.get_attr() |
314 | 248 |
|
@@ -343,7 +277,7 @@ async def get_result( |
343 | 277 | ], |
344 | 278 | ) |
345 | 279 | elif is_root_dse: |
346 | | - attrs = await self.get_root_dse(ctx.session, ctx.settings) |
| 280 | + attrs = await ctx.rootdse_rd.get(self.requested_attrs) |
347 | 281 | yield SearchResultEntry( |
348 | 282 | object_name="", |
349 | 283 | partial_attributes=[ |
|
0 commit comments