1 # Unix SMB/CIFS implementation.
2 # Copyright (C) Andrew Bartlett <abartlet@samba.org> 2018
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 3 of the License, or
7 # (at your option) any later version.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 Tests GetDCNameEx calls in NETLOGON
22 from samba
import WERRORError
, werror
25 from samba
.credentials
import Credentials
26 from samba
.dcerpc
import netlogon
, nbt
27 from samba
.dcerpc
.misc
import GUID
28 from samba
.net
import Net
30 class GetDCNameEx(samba
.tests
.TestCase
):
33 self
.lp
= samba
.tests
.env_loadparm()
34 self
.creds
= Credentials()
36 self
.netlogon_conn
= None
37 self
.server
= os
.environ
.get('SERVER')
38 self
.realm
= os
.environ
.get('REALM')
39 self
.domain
= os
.environ
.get('DOMAIN')
40 self
.trust_realm
= os
.environ
.get('TRUST_REALM')
41 self
.trust_domain
= os
.environ
.get('TRUST_DOMAIN')
42 self
.trust_server
= os
.environ
.get('TRUST_SERVER')
44 def _call_get_dc_name(self
, domain
=None, domain_guid
=None,
45 site_name
=None, ex2
=False, flags
=0):
46 if self
.netlogon_conn
is None:
47 self
.netlogon_conn
= netlogon
.netlogon(f
"ncacn_ip_tcp:{self.server}",
51 return self
.netlogon_conn
.netr_DsRGetDCNameEx2(self
.server
,
58 return self
.netlogon_conn
.netr_DsRGetDCNameEx(self
.server
,
64 def test_get_dc_ex2(self
):
65 """Check the most trivial requirements of Ex2 (no domain or site)
67 a) The paths are prefixed with two backslashes
68 b) The returned domains conform to the format requested
69 c) The domain matches our own domain
71 response
= self
._call
_get
_dc
_name
(ex2
=True)
73 self
.assertIsNotNone(response
.dc_unc
)
74 self
.assertTrue(response
.dc_unc
.startswith('\\\\'))
75 self
.assertIsNotNone(response
.dc_address
)
76 self
.assertTrue(response
.dc_address
.startswith('\\\\'))
78 self
.assertTrue(response
.domain_name
.lower() ==
80 response
.domain_name
.lower() ==
83 response
= self
._call
_get
_dc
_name
(ex2
=True,
84 flags
=netlogon
.DS_RETURN_DNS_NAME
)
85 self
.assertEqual(response
.domain_name
.lower(),
88 response
= self
._call
_get
_dc
_name
(ex2
=True,
89 flags
=netlogon
.DS_RETURN_FLAT_NAME
)
90 self
.assertEqual(response
.domain_name
.lower(),
93 def test_get_dc_over_winbind_ex2(self
):
94 """Check what happens to Ex2 requests after being forwarded to winbind
96 a) The paths must still have the same backslash prefixes
97 b) The returned domain does not match our own domain
98 c) The domain matches the format requested
100 self
.assertIsNotNone(self
.trust_realm
)
102 response_trust
= self
._call
_get
_dc
_name
(domain
=self
.trust_realm
,
104 response
= self
._call
_get
_dc
_name
(domain
=self
.realm
,
107 self
.assertIsNotNone(response_trust
.dc_unc
)
108 self
.assertTrue(response_trust
.dc_unc
.startswith('\\\\'))
109 self
.assertIsNotNone(response_trust
.dc_address
)
110 self
.assertTrue(response_trust
.dc_address
.startswith('\\\\'))
112 self
.assertNotEqual(response_trust
.dc_unc
,
114 self
.assertNotEqual(response_trust
.dc_address
,
117 self
.assertTrue(response_trust
.domain_name
.lower() ==
118 self
.trust_realm
.lower() or
119 response_trust
.domain_name
.lower() ==
120 self
.trust_domain
.lower())
122 response_trust
= self
._call
_get
_dc
_name
(domain
=self
.trust_realm
,
123 flags
=netlogon
.DS_RETURN_DNS_NAME
,
125 self
.assertEqual(response_trust
.domain_name
.lower(),
126 self
.trust_realm
.lower())
128 response_trust
= self
._call
_get
_dc
_name
(domain
=self
.trust_realm
,
129 flags
=netlogon
.DS_RETURN_FLAT_NAME
,
131 self
.assertEqual(response_trust
.domain_name
.lower(),
132 self
.trust_domain
.lower())
134 def test_get_dc_over_winbind(self
):
135 """Test the standard Ex version (not Ex2)
137 Ex calls Ex2 anyways, from now on, just test Ex.
139 self
.assertIsNotNone(self
.trust_realm
)
141 response_trust
= self
._call
_get
_dc
_name
(domain
=self
.trust_realm
,
142 flags
=netlogon
.DS_RETURN_DNS_NAME
)
144 self
.assertIsNotNone(response_trust
.dc_unc
)
145 self
.assertTrue(response_trust
.dc_unc
.startswith('\\\\'))
146 self
.assertIsNotNone(response_trust
.dc_address
)
147 self
.assertTrue(response_trust
.dc_address
.startswith('\\\\'))
149 self
.assertEqual(response_trust
.domain_name
.lower(),
150 self
.trust_realm
.lower())
152 def test_get_dc_over_winbind_with_site(self
):
153 """Test the standard Ex version (not Ex2)
155 We assume that there is a Default-First-Site-Name site.
157 self
.assertIsNotNone(self
.trust_realm
)
159 site
= 'Default-First-Site-Name'
160 response_trust
= self
._call
_get
_dc
_name
(domain
=self
.trust_realm
,
162 flags
=netlogon
.DS_RETURN_DNS_NAME
)
164 self
.assertIsNotNone(response_trust
.dc_unc
)
165 self
.assertTrue(response_trust
.dc_unc
.startswith('\\\\'))
166 self
.assertIsNotNone(response_trust
.dc_address
)
167 self
.assertTrue(response_trust
.dc_address
.startswith('\\\\'))
169 self
.assertEqual(response_trust
.domain_name
.lower(),
170 self
.trust_realm
.lower())
172 self
.assertEqual(site
.lower(), response_trust
.dc_site_name
.lower())
174 def test_get_dc_over_winbind_invalid_site(self
):
175 """Test the standard Ex version (not Ex2)
177 We assume that there is no Invalid-First-Site-Name site.
179 self
.assertIsNotNone(self
.trust_realm
)
181 site
= 'Invalid-First-Site-Name'
183 response_trust
= self
._call
_get
_dc
_name
(domain
=self
.trust_realm
,
185 flags
=netlogon
.DS_RETURN_DNS_NAME
,
187 self
.fail("Failed to give the correct error for incorrect site")
188 except WERRORError
as e
:
190 if enum
!= werror
.WERR_NO_SUCH_DOMAIN
:
191 self
.fail("Failed to detect an invalid site name")
193 def test_get_dc_over_winbind_invalid_site_ex2(self
):
194 """Test the Ex2 version.
196 We assume that there is no Invalid-First-Site-Name site.
198 self
.assertIsNotNone(self
.trust_realm
)
200 site
= 'Invalid-First-Site-Name'
202 response_trust
= self
._call
_get
_dc
_name
(domain
=self
.trust_realm
,
204 flags
=netlogon
.DS_RETURN_DNS_NAME
,
206 self
.fail("Failed to give the correct error for incorrect site")
207 except WERRORError
as e
:
209 if enum
!= werror
.WERR_NO_SUCH_DOMAIN
:
210 self
.fail("Failed to detect an invalid site name")
212 def test_get_dc_over_winbind_empty_string_site(self
):
213 """Test the standard Ex version (not Ex2)
215 We assume that there is a Default-First-Site-Name site.
217 self
.assertIsNotNone(self
.trust_realm
)
221 response_trust
= self
._call
_get
_dc
_name
(domain
=self
.trust_realm
,
223 flags
=netlogon
.DS_RETURN_DNS_NAME
)
224 except WERRORError
as e
:
225 self
.fail("Unable to get empty string site result: " + str(e
))
227 self
.assertIsNotNone(response_trust
.dc_unc
)
228 self
.assertTrue(response_trust
.dc_unc
.startswith('\\\\'))
229 self
.assertIsNotNone(response_trust
.dc_address
)
230 self
.assertTrue(response_trust
.dc_address
.startswith('\\\\'))
232 self
.assertEqual(response_trust
.domain_name
.lower(),
233 self
.trust_realm
.lower())
235 self
.assertIsNotNone(response_trust
.dc_site_name
)
236 self
.assertNotEqual('', response_trust
.dc_site_name
)
238 def test_get_dc_over_winbind_netbios(self
):
239 """Supply a NETBIOS trust domain name."""
240 self
.assertIsNotNone(self
.trust_realm
)
243 response_trust
= self
._call
_get
_dc
_name
(domain
=self
.trust_domain
,
244 flags
=netlogon
.DS_RETURN_DNS_NAME
,
246 except WERRORError
as e
:
247 self
.fail("Failed to succeed over winbind: " + str(e
))
249 self
.assertIsNotNone(response_trust
)
250 self
.assertEqual(response_trust
.domain_name
.lower(),
251 self
.trust_realm
.lower())
253 def test_get_dc_over_winbind_with_site_netbios(self
):
254 """Supply a NETBIOS trust domain name.
256 Sporadically fails because NETBIOS queries do not return site name in
257 winbind. The site check in NETLOGON will trigger and fail the request.
259 Currently marked in flapping...
261 self
.assertIsNotNone(self
.trust_realm
)
263 site
= 'Default-First-Site-Name'
265 response_trust
= self
._call
_get
_dc
_name
(domain
=self
.trust_domain
,
267 flags
=netlogon
.DS_RETURN_DNS_NAME
,
269 except WERRORError
as e
:
270 self
.fail("get_dc_name (domain=%s,site=%s) over winbind failed: %s"
271 % (self
.trust_domain
, site
, e
))
273 self
.assertIsNotNone(response_trust
)
274 self
.assertEqual(response_trust
.domain_name
.lower(),
275 self
.trust_realm
.lower())
277 self
.assertEqual(site
.lower(), response_trust
.dc_site_name
.lower())
279 def test_get_dc_over_winbind_domain_guid(self
):
280 """Ensure that we do not reject requests supplied with a NULL GUID"""
282 self
.assertIsNotNone(self
.trust_realm
)
286 response_trust
= self
._call
_get
_dc
_name
(domain
=self
.trust_realm
,
287 domain_guid
=null_guid
,
288 flags
=netlogon
.DS_RETURN_DNS_NAME
)
289 except WERRORError
as e
:
290 self
.fail("Unable to get NULL domain GUID result: " + str(e
))
292 self
.assertIsNotNone(response_trust
.dc_unc
)
293 self
.assertTrue(response_trust
.dc_unc
.startswith('\\\\'))
294 self
.assertIsNotNone(response_trust
.dc_address
)
295 self
.assertTrue(response_trust
.dc_address
.startswith('\\\\'))
297 self
.assertEqual(response_trust
.domain_name
.lower(),
298 self
.trust_realm
.lower())
300 def test_get_dc_with_site(self
):
301 """Test the standard Ex version (not Ex2)
303 We assume that there is a Default-First-Site-Name site.
306 site
= 'Default-First-Site-Name'
307 response
= self
._call
_get
_dc
_name
(domain
=self
.realm
,
309 flags
=netlogon
.DS_RETURN_DNS_NAME
)
311 self
.assertIsNotNone(response
.dc_unc
)
312 self
.assertTrue(response
.dc_unc
.startswith('\\\\'))
313 self
.assertIsNotNone(response
.dc_address
)
314 self
.assertTrue(response
.dc_address
.startswith('\\\\'))
316 self
.assertEqual(response
.domain_name
.lower(),
319 self
.assertEqual(site
.lower(), response
.dc_site_name
.lower())
321 def test_get_dc_invalid_site(self
):
322 """Test the standard Ex version (not Ex2)
324 We assume that there is no Invalid-First-Site-Name site.
326 self
.assertIsNotNone(self
.realm
)
328 site
= 'Invalid-First-Site-Name'
330 response
= self
._call
_get
_dc
_name
(domain
=self
.realm
,
332 flags
=netlogon
.DS_RETURN_DNS_NAME
,
334 self
.fail("Failed to give the correct error for incorrect site")
335 except WERRORError
as e
:
337 if enum
!= werror
.WERR_NO_SUCH_DOMAIN
:
338 self
.fail("Failed to detect an invalid site name")
340 def test_get_dc_invalid_site_ex2(self
):
341 """Test the Ex2 version
343 We assume that there is no Invalid-First-Site-Name site.
346 site
= 'Invalid-First-Site-Name'
348 response
= self
._call
_get
_dc
_name
(domain
=self
.realm
,
350 flags
=netlogon
.DS_RETURN_DNS_NAME
,
352 self
.fail("Failed to give the correct error for incorrect site")
353 except WERRORError
as e
:
355 if enum
!= werror
.WERR_NO_SUCH_DOMAIN
:
356 self
.fail("Failed to detect an invalid site name")
358 def test_get_dc_empty_string_site(self
):
359 """Test the standard Ex version (not Ex2)
361 We assume that there is a Default-First-Site-Name site.
366 response
= self
._call
_get
_dc
_name
(domain
=self
.realm
,
368 flags
=netlogon
.DS_RETURN_DNS_NAME
)
369 except WERRORError
as e
:
370 self
.fail("Unable to get empty string site result: " + str(e
))
372 self
.assertIsNotNone(response
.dc_unc
)
373 self
.assertTrue(response
.dc_unc
.startswith('\\\\'))
374 self
.assertIsNotNone(response
.dc_address
)
375 self
.assertTrue(response
.dc_address
.startswith('\\\\'))
377 self
.assertEqual(response
.domain_name
.lower(),
380 self
.assertIsNotNone(response
.dc_site_name
)
381 self
.assertNotEqual('', response
.dc_site_name
)
383 def test_get_dc_netbios(self
):
384 """Supply a NETBIOS domain name."""
387 response
= self
._call
_get
_dc
_name
(domain
=self
.domain
,
388 flags
=netlogon
.DS_RETURN_DNS_NAME
,
390 except WERRORError
as e
:
391 self
.fail("Failed to succeed over winbind: " + str(e
))
393 self
.assertIsNotNone(response
)
394 self
.assertEqual(response
.domain_name
.lower(),
397 def test_get_dc_with_site_netbios(self
):
398 """Supply a NETBIOS domain name."""
400 site
= 'Default-First-Site-Name'
402 response
= self
._call
_get
_dc
_name
(domain
=self
.domain
,
404 flags
=netlogon
.DS_RETURN_DNS_NAME
,
406 except WERRORError
as e
:
407 self
.fail("Failed to succeed over winbind: " + str(e
))
409 self
.assertIsNotNone(response
)
410 self
.assertEqual(response
.domain_name
.lower(),
413 self
.assertEqual(site
.lower(), response
.dc_site_name
.lower())
415 def test_get_dc_with_domain_guid(self
):
416 """Ensure that we do not reject requests supplied with a NULL GUID"""
419 response
= self
._call
_get
_dc
_name
(domain
=self
.realm
,
420 domain_guid
=null_guid
,
421 flags
=netlogon
.DS_RETURN_DNS_NAME
)
423 self
.assertIsNotNone(response
.dc_unc
)
424 self
.assertTrue(response
.dc_unc
.startswith('\\\\'))
425 self
.assertIsNotNone(response
.dc_address
)
426 self
.assertTrue(response
.dc_address
.startswith('\\\\'))
428 self
.assertEqual(response
.domain_name
.lower(),
431 def test_get_dc_with_empty_string_domain(self
):
432 """Ensure that empty domain resolve to the DC domain"""
433 response
= self
._call
_get
_dc
_name
(domain
='',
434 flags
=netlogon
.DS_RETURN_DNS_NAME
)
436 self
.assertIsNotNone(response
.dc_unc
)
437 self
.assertTrue(response
.dc_unc
.startswith('\\\\'))
438 self
.assertIsNotNone(response
.dc_address
)
439 self
.assertTrue(response
.dc_address
.startswith('\\\\'))
441 self
.assertEqual(response
.domain_name
.lower(),
444 def test_get_dc_winbind_need_2012r2(self
):
445 """Test requiring that we have a FL2012R2 DC as answer
447 self
.assertIsNotNone(self
.trust_realm
)
450 response_trust
= self
._call
_get
_dc
_name
(domain
=self
.trust_realm
,
451 flags
=netlogon
.DS_RETURN_DNS_NAME|netlogon
.DS_DIRECTORY_SERVICE_9_REQUIRED
)
452 except WERRORError
as e
:
454 self
.fail(f
"netr_DsRGetDCNameEx failed: {estr}")
456 self
.assertIsNotNone(response_trust
.dc_unc
)
457 self
.assertTrue(response_trust
.dc_unc
.startswith('\\\\'))
458 self
.assertIsNotNone(response_trust
.dc_address
)
459 self
.assertTrue(response_trust
.dc_address
.startswith('\\\\'))
461 self
.assertEqual(response_trust
.domain_name
.lower(),
462 self
.trust_realm
.lower())
464 # Now check the CLDAP netlogon response matches the above
465 dc_ip
= response_trust
.dc_address
[2:]
467 net
= Net(creds
=self
.creds
, lp
=self
.lp
)
468 cldap_netlogon_reply
= net
.finddc(domain
=self
.trust_realm
, address
=dc_ip
,
469 flags
=(nbt
.NBT_SERVER_LDAP |
471 self
.assertTrue(cldap_netlogon_reply
.server_type
& nbt
.NBT_SERVER_DS_9
)
473 def test_get_dc_direct_need_2012r2_but_not_found(self
):
474 """Test requiring that we have a FL2012R2 DC as answer, against the FL2008R2 domain
476 This test requires that the DC in the FL2008R2 does not claim
477 to be 2012R2 capable (off by default in Samba)
480 self
.assertIsNotNone(self
.realm
)
484 response
= self
._call
_get
_dc
_name
(domain
=self
.realm
,
485 flags
=netlogon
.DS_RETURN_DNS_NAME|netlogon
.DS_DIRECTORY_SERVICE_9_REQUIRED
)
487 self
.fail("Failed to detect that requirement for 2012R2 was not met")
488 except WERRORError
as e
:
490 if enum
!= werror
.WERR_NO_SUCH_DOMAIN
:
491 self
.fail(f
"Incorrect error {estr} from GetDcNameEx looking for 2012R2 DC that was not available")
493 def test_get_dc_direct_need_web_but_not_found(self
):
494 """Test requiring that we (do not) have a AD Web Services on the DC
496 This test requires that the DC does not advertise AD Web Services
498 This is used as a test that is easy for a modern windows
499 version to fail, as (say) Windows 2022 will succeed for all
500 the DS_DIRECTORY_SERVICE_* flags. Disable AD Web services in
501 services.mmc to run this test successfully.
504 self
.assertIsNotNone(self
.realm
)
508 response
= self
._call
_get
_dc
_name
(domain
=self
.realm
,
509 flags
=netlogon
.DS_RETURN_DNS_NAME|netlogon
.DS_WEB_SERVICE_REQUIRED
)
511 self
.fail("Failed to detect that requirement for Web Services was not")
512 except WERRORError
as e
:
514 if enum
!= werror
.WERR_NO_SUCH_DOMAIN
:
515 self
.fail(f
"Incorrect error {estr} from GetDcNameEx looking for AD Web Services enabled DC that should not be available")
517 # Now check the CLDAP netlogon response matches the above - that the bit was not set
518 net
= Net(creds
=self
.creds
, lp
=self
.lp
)
519 cldap_netlogon_reply
= net
.finddc(domain
=self
.realm
,
520 flags
=(nbt
.NBT_SERVER_LDAP |
522 # We can assert this, even without looking for a particular
523 # DC, as if any DC has WEB_SERVICE we would have got it above.
524 self
.assertFalse(cldap_netlogon_reply
.server_type
& nbt
.NBT_SERVER_ADS_WEB_SERVICE
)
526 def test_get_dc_winbind_need_web_but_not_found(self
):
527 """Test requiring that we (do not) have a AD Web Services on the trusted DC
529 This test requires that the DC does not advertise AD Web Services
531 This is used as a test that is easy for a modern windows
532 version to fail, as (say) Windows 2022 will succeed for all
533 the DS_DIRECTORY_SERVICE_* flags. Disable AD Web services in
534 services.mmc to run this test successfully.
537 self
.assertIsNotNone(self
.trust_realm
)
541 response
= self
._call
_get
_dc
_name
(domain
=self
.trust_realm
,
542 flags
=netlogon
.DS_RETURN_DNS_NAME|netlogon
.DS_WEB_SERVICE_REQUIRED
)
544 self
.fail("Failed to detect that requirement for Web Services was not")
545 except WERRORError
as e
:
547 if enum
!= werror
.WERR_NO_SUCH_DOMAIN
:
548 self
.fail(f
"Incorrect error {estr} from GetDcNameEx looking for AD Web Services enabled DC that should not be available")
550 # Now check the CLDAP netlogon response matches the above - that the bit was not set
551 net
= Net(creds
=self
.creds
, lp
=self
.lp
)
552 cldap_netlogon_reply
= net
.finddc(domain
=self
.trust_realm
,
553 flags
=(nbt
.NBT_SERVER_LDAP |
555 # We can assert this, even without looking for a particular
556 # DC, as if any DC has WEB_SERVICE we would have got it above.
557 self
.assertFalse(cldap_netlogon_reply
.server_type
& nbt
.NBT_SERVER_ADS_WEB_SERVICE
)
559 def test_get_dc_direct_need_2012r2(self
):
560 """Test requiring that we have a FL2012R2 DC as answer
562 self
.assertIsNotNone(self
.trust_realm
)
564 self
.netlogon_conn
= netlogon
.netlogon(f
"ncacn_ip_tcp:{self.trust_server}",
567 response_trust
= self
._call
_get
_dc
_name
(domain
=self
.trust_realm
,
568 flags
=netlogon
.DS_RETURN_DNS_NAME|netlogon
.DS_DIRECTORY_SERVICE_9_REQUIRED
)
570 self
.assertIsNotNone(response_trust
.dc_unc
)
571 self
.assertTrue(response_trust
.dc_unc
.startswith('\\\\'))
572 self
.assertIsNotNone(response_trust
.dc_address
)
573 self
.assertTrue(response_trust
.dc_address
.startswith('\\\\'))
575 self
.assertEqual(response_trust
.domain_name
.lower(),
576 self
.trust_realm
.lower())
578 # Now check the CLDAP netlogon response matches the above
579 dc_ip
= response_trust
.dc_address
[2:]
581 net
= Net(creds
=self
.creds
, lp
=self
.lp
)
582 cldap_netlogon_reply
= net
.finddc(domain
=self
.trust_realm
, address
=dc_ip
,
583 flags
=(nbt
.NBT_SERVER_LDAP |
585 self
.assertTrue(cldap_netlogon_reply
.server_type
& nbt
.NBT_SERVER_DS_9
)
587 def test_get_dc_winbind_need_2012r2_but_not_found(self
):
588 """Test requiring that we have a FL2012R2 DC as answer, against the FL2008R2 domain
590 This test requires that the DC in the FL2008R2 does not claim
591 to be 2012R2 capable (off by default in Samba)
594 self
.assertIsNotNone(self
.realm
)
596 self
.netlogon_conn
= netlogon
.netlogon(f
"ncacn_ip_tcp:{self.trust_server}",
601 response
= self
._call
_get
_dc
_name
(domain
=self
.realm
,
602 flags
=netlogon
.DS_RETURN_DNS_NAME|netlogon
.DS_DIRECTORY_SERVICE_9_REQUIRED
)
604 self
.fail("Failed to detect requirement for 2012R2 that is not met")
605 except WERRORError
as e
:
607 if enum
!= werror
.WERR_NO_SUCH_DOMAIN
:
608 self
.fail("Failed to detect requirement for 2012R2 that is not met")
610 # Now check the CLDAP netlogon response matches the above - that the DS_9 bit was not set
611 net
= Net(creds
=self
.creds
, lp
=self
.lp
)
612 cldap_netlogon_reply
= net
.finddc(domain
=self
.realm
,
613 flags
=(nbt
.NBT_SERVER_LDAP |
615 self
.assertFalse(cldap_netlogon_reply
.server_type
& nbt
.NBT_SERVER_DS_9
)
617 def test_get_dc_winbind_need_2012r2_but_not_found_fallback(self
):
618 """Test requiring that we have a FL2012R2 DC as answer, against the
619 FL2008R2 domain, then trying for just FL2008R2 (to show caching bugs)
621 This test requires that the DC in the FL2008R2 does not claim
622 to be 2012R2 capable (off by default in Samba)
625 self
.assertIsNotNone(self
.realm
)
627 self
.netlogon_conn
= netlogon
.netlogon(f
"ncacn_ip_tcp:{self.trust_server}",
632 response
= self
._call
_get
_dc
_name
(domain
=self
.realm
,
633 flags
=netlogon
.DS_RETURN_DNS_NAME|netlogon
.DS_DIRECTORY_SERVICE_9_REQUIRED
)
635 self
.fail("Failed to detect requirement for 2012R2 that is not met")
636 except WERRORError
as e
:
638 if enum
!= werror
.WERR_NO_SUCH_DOMAIN
:
639 self
.fail("Failed to detect requirement for 2012R2 that is not met")
642 response
= self
._call
_get
_dc
_name
(domain
=self
.realm
,
643 flags
=netlogon
.DS_RETURN_DNS_NAME|netlogon
.DS_DIRECTORY_SERVICE_6_REQUIRED
)
645 except WERRORError
as e
:
647 self
.fail("Unexpectedly failed to find 2008 DC")
649 dc_ip
= response
.dc_address
[2:]
651 net
= Net(creds
=self
.creds
, lp
=self
.lp
)
652 cldap_netlogon_reply
= net
.finddc(domain
=self
.realm
, address
=dc_ip
,
653 flags
=(nbt
.NBT_SERVER_LDAP |
655 self
.assertTrue(cldap_netlogon_reply
.server_type
& nbt
.NBT_SERVER_FULL_SECRET_DOMAIN_6
)
657 def test_get_dc_direct_need_2012r2_but_not_found_fallback(self
):
658 """Test requiring that we have a FL2012R2 DC as answer, against the
659 FL2008R2 domain, then trying for just FL2008R2 (to show caching bugs)
661 This test requires that the DC in the FL2008R2 does not claim
662 to be 2012R2 capable (off by default in Samba)
665 self
.assertIsNotNone(self
.realm
)
667 self
.netlogon_conn
= netlogon
.netlogon(f
"ncacn_ip_tcp:{self.server}",
672 response
= self
._call
_get
_dc
_name
(domain
=self
.realm
,
673 flags
=netlogon
.DS_RETURN_DNS_NAME|netlogon
.DS_DIRECTORY_SERVICE_9_REQUIRED
)
675 self
.fail("Failed to detect requirement for 2012R2 that is not met")
676 except WERRORError
as e
:
678 if enum
!= werror
.WERR_NO_SUCH_DOMAIN
:
679 self
.fail("Failed to detect requirement for 2012R2 that is not met")
682 response
= self
._call
_get
_dc
_name
(domain
=self
.realm
,
683 flags
=netlogon
.DS_RETURN_DNS_NAME|netlogon
.DS_DIRECTORY_SERVICE_6_REQUIRED
)
685 except WERRORError
as e
:
687 self
.fail("Unexpectedly failed to find 2008 DC")
689 dc_ip
= response
.dc_address
[2:]
691 net
= Net(creds
=self
.creds
, lp
=self
.lp
)
692 cldap_netlogon_reply
= net
.finddc(domain
=self
.realm
, address
=dc_ip
,
693 flags
=(nbt
.NBT_SERVER_LDAP |
695 self
.assertTrue(cldap_netlogon_reply
.server_type
& nbt
.NBT_SERVER_FULL_SECRET_DOMAIN_6
)
697 # TODO Thorough tests of domain GUID
699 # The domain GUID does not seem to be authoritative, and seems to be a
700 # fallback case for renamed domains.