1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-22 13:34:15 +03:00
samba-mirror/source4/samba3_nmbd.patch
Andrew Tridgell 62560e65bd r4454: This is the patch I use to Samba3 nmbd to allow a WinXP box
to join a Samba4 domain. It is hard-coded for my GUID, so
you will need to edit it to suit.

I'm committing this so others can experiment. Obviously
what we really need is a new nmbd in Samba4.
(This used to be commit a30be712e5)
2007-10-10 13:07:52 -05:00

179 lines
4.5 KiB
Diff

This is a extremely rough patch that 'fixes' Samba3 nmbd to allow a
join from a WinXP client to a Samba4 server. Note that it hard-codes
the domain GUID. Please only use for testing Samba4 - do not apply
this to Samba3 svn.
Index: nmbd/nmbd_processlogon.c
===================================================================
--- nmbd/nmbd_processlogon.c (revision 4247)
+++ nmbd/nmbd_processlogon.c (working copy)
@@ -58,10 +58,37 @@
tdb_close(tdb);
}
+
+int push_components(unsigned char *q, const char *s)
+{
+ char *p;
+ int l, len = 0;
+
+ if (*s == 0) {
+ q[0] = 0;
+ return 1;
+ }
+
+ while ((p = strchr(s, '.'))) {
+ l = (p-s);
+ q[0] = l;
+ memcpy(q+1, s, l);
+ s += l + 1;
+ q += l+1;
+ len += l+1;
+ }
+
+ l = strlen(s);
+ q[0] = l;
+ memcpy(q+1, s, l+1);
+ len += strlen(s)+2;
+
+ return len;
+}
+
/****************************************************************************
Process a domain logon packet
**************************************************************************/
-
void process_logon_packet(struct packet_struct *p, char *buf,int len,
const char *mailslot)
{
@@ -393,6 +420,8 @@
get_mydnsdomname(domain);
get_myname(hostname);
+
+ pstrcpy(domain, "bludom.tridgell.net");
if (SVAL(uniuser, 0) == 0) {
SIVAL(q, 0, SAMLOGON_AD_UNK_R); /* user unknown */
@@ -403,6 +432,9 @@
SIVAL(q, 0, ADS_PDC|ADS_GC|ADS_LDAP|ADS_DS|
ADS_KDC|ADS_TIMESERV|ADS_CLOSEST|ADS_WRITABLE);
+ SIVAL(q, 0, 0x3fd);
+ SIVAL(q, 0, ADS_PDC|ADS_DS|
+ ADS_TIMESERV|ADS_CLOSEST|ADS_WRITABLE);
q += 4;
/* Push Domain GUID */
@@ -411,80 +443,34 @@
return;
}
+ smb_string_to_uuid("b0eac516-4a33-8675-4127-6bf058911234", &domain_guid);
+
+ dump_data(0, domain_guid.node, 6);
+
smb_uuid_pack(domain_guid, &flat_guid);
memcpy(q, &flat_guid.info, UUID_FLAT_SIZE);
- q += UUID_FLAT_SIZE;
- /* Forest */
- str_offset = q - q_orig;
- dc = domain;
- q1 = q;
- while ((component = strtok(dc, "."))) {
- dc = NULL;
- size = push_ascii(&q[1], component, -1, 0);
- SCVAL(q, 0, size);
- q += (size + 1);
- }
+ dump_data(0, q, 16);
- /* Unk0 */
- SCVAL(q, 0, 0);
- q++;
+ q += UUID_FLAT_SIZE;
- /* Domain */
- SCVAL(q, 0, 0xc0 | ((str_offset >> 8) & 0x3F));
- SCVAL(q, 1, str_offset & 0xFF);
- q += 2;
+ const char *dnsname = "192.168.115.1";
- /* Hostname */
- size = push_ascii(&q[1], hostname, -1, 0);
- SCVAL(q, 0, size);
- q += (size + 1);
- SCVAL(q, 0, 0xc0 | ((str_offset >> 8) & 0x3F));
- SCVAL(q, 1, str_offset & 0xFF);
- q += 2;
-
- /* NETBIOS of domain */
- size = push_ascii(&q[1], lp_workgroup(), -1, STR_UPPER);
- SCVAL(q, 0, size);
- q += (size + 1);
-
- /* Unk1 */
- SCVAL(q, 0, 0);
- q++;
-
- /* NETBIOS of hostname */
- size = push_ascii(&q[1], my_name, -1, 0);
- SCVAL(q, 0, size);
- q += (size + 1);
-
- /* Unk2 */
- SCVAL(q, 0, 0);
- q++;
-
- /* User name */
- if (SVAL(uniuser, 0) != 0) {
- size = push_ascii(&q[1], ascuser, -1, 0);
- SCVAL(q, 0, size);
- q += (size + 1);
+ q += push_components(q, domain);
+ q += push_components(q, domain);
+ q += push_components(q, dnsname);
+ q += push_components(q, lp_workgroup());
+ q += push_components(q, my_name);
+ q += push_components(q, "");
+ if (SVAL(uniuser, 0)) {
+ q += push_components(q, ascuser);
}
+ q += push_components(q, "Default-First-Site-Name");
+ q += push_components(q, "Default-First-Site-Name");
- q_orig = q;
- /* Site name */
- size = push_ascii(&q[1], "Default-First-Site-Name", -1, 0);
- SCVAL(q, 0, size);
- q += (size + 1);
-
- /* Site name (2) */
- str_offset = q - q_orig;
- SCVAL(q, 0, 0xc0 | ((str_offset >> 8) & 0x3F));
- SCVAL(q, 1, str_offset & 0xFF);
- q += 2;
-
- SCVAL(q, 0, PTR_DIFF(q,q1));
- SCVAL(q, 1, 0x10); /* unknown */
-
- SIVAL(q, 0, 0x00000002);
- q += 4; /* unknown */
+ SCVAL(q, 0, 0x10); /* unknown */
+ SIVAL(q, 1, 0x00000002);
+ q += 5;
SIVAL(q, 0, (iface_ip(p->ip))->s_addr);
q += 4;
SIVAL(q, 0, 0x00000000);
@@ -495,7 +481,7 @@
#endif
/* tell the client what version we are */
- SIVAL(q, 0, ((ntversion < 11) || (SEC_ADS != lp_security())) ? 1 : 13);
+ SIVAL(q, 0, 13);
/* our ntversion */
SSVAL(q, 4, 0xffff); /* our lmnttoken */
SSVAL(q, 6, 0xffff); /* our lm20token */