--- samba/source/rpc_server/srv_netlog_nt.c.orig	2004-12-10 16:41:32.000000000 -0800
+++ samba/source/rpc_server/srv_netlog_nt.c	2004-12-10 16:39:49.000000000 -0800
@@ -312,11 +312,55 @@
 	DOM_CHAL srv_cred;
 	UTIME srv_time;
 	fstring mach_acct;
+#ifdef WITH_OPENDIRECTORY
+	tDirStatus dirStatus = eDSNullParameter;
+#endif
 
 	srv_time.time = 0;
 
 	rpcstr_pull(mach_acct, q_u->clnt_id.uni_acct_name.buffer,sizeof(fstring),q_u->clnt_id.uni_acct_name.uni_str_len*2,0);
 
+#ifdef WITH_OPENDIRECTORY
+	if (p->dc.challenge_sent) {
+
+		/* from client / server challenges and md4 password, generate sess key */
+		if (lp_opendirectory()) {
+			//check acct_ctrl flags
+			become_root();
+			dirStatus = opendirectory_cred_session_key(&p->dc.clnt_chal, &p->dc.srv_chal, mach_acct, p->dc.sess_key, NULL);
+			unbecome_root();
+			DEBUG(4, ("_net_auth opendirectory_cred_session_key [%d]\n", dirStatus));
+		} else if (get_md4pw((char *)p->dc.md4pw, mach_acct)) {
+			cred_session_key(&p->dc.clnt_chal, &p->dc.srv_chal,
+					 p->dc.md4pw, p->dc.sess_key);
+		} else {
+			status = NT_STATUS_ACCESS_DENIED;
+			goto exit;
+		}
+		
+		/* check that the client credentials are valid */
+		if (cred_assert(&q_u->clnt_chal, p->dc.sess_key, &p->dc.clnt_cred.challenge, srv_time)) {
+			
+			/* create server challenge for inclusion in the reply */
+			cred_create(p->dc.sess_key, &p->dc.srv_cred.challenge, srv_time, &srv_cred);
+		
+			/* copy the received client credentials for use next time */
+			memcpy(p->dc.clnt_cred.challenge.data, q_u->clnt_chal.data, sizeof(q_u->clnt_chal.data));
+			memcpy(p->dc.srv_cred .challenge.data, q_u->clnt_chal.data, sizeof(q_u->clnt_chal.data));
+			
+			/* Save the machine account name. */
+			fstrcpy(p->dc.mach_acct, mach_acct);
+		
+			p->dc.authenticated = True;
+
+		} else {
+			status = NT_STATUS_ACCESS_DENIED;
+		}
+	} else {
+		status = NT_STATUS_ACCESS_DENIED;
+	}
+exit:
+#else
 	if (p->dc.challenge_sent && get_md4pw((char *)p->dc.md4pw, mach_acct)) {
 
 		/* from client / server challenges and md4 password, generate sess key */
@@ -344,6 +388,7 @@
 	} else {
 		status = NT_STATUS_ACCESS_DENIED;
 	}
+#endif
 	
 	/* set up the LSA AUTH response */
 	init_net_r_auth(r_u, &srv_cred, status);
@@ -374,6 +419,9 @@
 	UTIME srv_time;
 	NEG_FLAGS srv_flgs;
 	fstring mach_acct;
+#ifdef WITH_OPENDIRECTORY
+	tDirStatus dirStatus = eDSNullParameter;
+#endif
 
 	srv_time.time = 0;
 
@@ -385,7 +433,49 @@
 	}
 
 	rpcstr_pull(mach_acct, q_u->clnt_id.uni_acct_name.buffer,sizeof(fstring),q_u->clnt_id.uni_acct_name.uni_str_len*2,0);
+#ifdef WITH_OPENDIRECTORY
+	if (p->dc.challenge_sent) {
+		
+		/* from client / server challenges and md4 password, generate sess key */
+		if (lp_opendirectory()) {
+			//check acct_ctrl flags
+			become_root();
+			dirStatus = opendirectory_cred_session_key(&p->dc.clnt_chal, &p->dc.srv_chal, mach_acct, p->dc.sess_key, NULL);
+			unbecome_root();
+			DEBUG(4, ("_net_auth_2 opendirectory_cred_session_key [%d]\n", dirStatus));
+		} else if (get_md4pw((char *)p->dc.md4pw, mach_acct)) {
+		cred_session_key(&p->dc.clnt_chal, &p->dc.srv_chal,
+				 p->dc.md4pw, p->dc.sess_key);
+		} else {
+			DEBUG(0, ("_net_auth_2 CAN NOT COMPUTE SESSION KEY \n"));
+			status = NT_STATUS_ACCESS_DENIED;
+			goto exit;
+		}
+		
+		/* check that the client credentials are valid */
+		if (cred_assert(&q_u->clnt_chal, p->dc.sess_key, &p->dc.clnt_cred.challenge, srv_time)) {
+			
+			/* create server challenge for inclusion in the reply */
+			cred_create(p->dc.sess_key, &p->dc.srv_cred.challenge, srv_time, &srv_cred);
 
+			/* copy the received client credentials for use next time */
+			memcpy(p->dc.clnt_cred.challenge.data, q_u->clnt_chal.data, sizeof(q_u->clnt_chal.data));
+			memcpy(p->dc.srv_cred .challenge.data, q_u->clnt_chal.data, sizeof(q_u->clnt_chal.data));
+			
+			/* Save the machine account name. */
+			fstrcpy(p->dc.mach_acct, mach_acct);
+			
+			p->dc.authenticated = True;
+
+		} else {
+			status = NT_STATUS_ACCESS_DENIED;
+		}
+	} else {
+		status = NT_STATUS_ACCESS_DENIED;
+	}
+	
+exit:
+#else
 	if (p->dc.challenge_sent && get_md4pw((char *)p->dc.md4pw, mach_acct)) {
 		
 		/* from client / server challenges and md4 password, generate sess key */
@@ -413,7 +503,7 @@
 	} else {
 		status = NT_STATUS_ACCESS_DENIED;
 	}
-	
+#endif	
 	srv_flgs.neg_flags = 0x000001ff;
 
 	if (lp_server_schannel() != False) {
@@ -446,6 +536,9 @@
 	int i;
 	uint32 acct_ctrl;
 	const uchar *old_pw;
+#ifdef WITH_OPENDIRECTORY
+	tDirStatus dirStatus = eDSNullParameter;
+#endif
 
 	/* checks and updates credentials.  creates reply credentials */
 	if (!(p->dc.authenticated && deal_with_creds(p->dc.sess_key, &p->dc.clnt_cred, &q_u->clnt_id.cred, &srv_cred)))
@@ -490,6 +583,21 @@
 		DEBUG(100,("%02X ", pwd[i]));
 	DEBUG(100,("\n"));
 
+#ifdef WITH_OPENDIRECTORY
+	if (lp_opendirectory()) {
+		become_root();
+		dirStatus = opendirectory_set_workstation_nthash(p->dc.mach_acct, pwd, NULL);
+		unbecome_root();
+		DEBUG(2, ("_net_srv_pwset opendirectory_set_workstation_nthash [%d]\n", dirStatus));
+		if (dirStatus != eDSNoErr) {
+			pdb_free_sam(&sampass);
+			return NT_STATUS_UNSUCCESSFUL;
+		} else {
+			status = NT_STATUS_OK;
+		}
+	} else {
+#endif
+
 	old_pw = pdb_get_nt_passwd(sampass);
 
 	if (old_pw && memcmp(pwd, old_pw, 16) == 0) {
@@ -522,7 +630,9 @@
 	}
 	if (ret)
 		status = NT_STATUS_OK;
-
+#ifdef WITH_OPENDIRECTORY
+ 	}
+#endif
 	/* set up the LSA Server Password Set response */
 	init_net_r_srv_pwset(r_u, &srv_cred, status);
 
