Hi Andrew,

I have written a small patch for this issue. I would appreciate if someone 
could take a look at and comment. I have tested it on XP machines and seems to 
work properly.

Cheers.

-- 
Samuel Cabrero - Developer
scabr...@zentyal.com

Easy IT for small business
www.zentyal.com
diff --git a/source4/auth/ntlm/auth_sam.c b/source4/auth/ntlm/auth_sam.c
index f234f72..582eb0d 100644
--- a/source4/auth/ntlm/auth_sam.c
+++ b/source4/auth/ntlm/auth_sam.c
@@ -69,6 +69,58 @@ static NTSTATUS authsam_search_account(TALLOC_CTX *mem_ctx, struct ldb_context *
 }
 
 /****************************************************************************
+ Look for the guest account in the sam, return ldb result structures
+****************************************************************************/
+
+static NTSTATUS authsam_search_guest_account(TALLOC_CTX *mem_ctx,
+		struct ldb_context *sam_ctx,
+		struct ldb_dn *domain_dn,
+		struct ldb_message **ret_msg)
+{
+	int ret;
+	const struct dom_sid *domain_sid;
+	struct dom_sid *guest_sid;
+
+	domain_sid = samdb_domain_sid(sam_ctx);
+	if (domain_sid == NULL) {
+		return NT_STATUS_INTERNAL_DB_CORRUPTION;
+	}
+
+	guest_sid = dom_sid_add_rid(mem_ctx, domain_sid, DOMAIN_RID_GUEST);
+	if (guest_sid == NULL) {
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	/* pull the user attributes */
+	ret = dsdb_search_one(sam_ctx, mem_ctx, ret_msg, domain_dn,
+			LDB_SCOPE_SUBTREE,
+			user_attrs,
+			DSDB_SEARCH_SHOW_EXTENDED_DN,
+			"(&(objectSID=%s)(objectclass=user))",
+			ldap_encode_ndr_dom_sid(mem_ctx, guest_sid));
+	if (ret == LDB_ERR_NO_SUCH_OBJECT) {
+		DEBUG(3,("%s: Couldn't find guest user in samdb, under %s\n",
+					__func__,
+					ldb_dn_get_linearized(domain_dn)));
+		return NT_STATUS_NO_SUCH_USER;
+	}
+	if (ret != LDB_SUCCESS) {
+		return NT_STATUS_INTERNAL_DB_CORRUPTION;
+	}
+
+	/* Return no such user if the account is disabled */
+	uint16_t acct_flags = samdb_result_acct_flags(sam_ctx, mem_ctx,
+			*ret_msg, domain_dn);
+	if (acct_flags & ACB_DISABLED) {
+		DEBUG(3,("%s: Account for guest user is disabled.\n",
+					__func__));
+		return NT_STATUS_NO_SUCH_USER;
+	}
+
+	return NT_STATUS_OK;
+}
+
+/****************************************************************************
  Do a specific test for an smb password being correct, given a smb_password and
  the lanman and NT responses.
 ****************************************************************************/
@@ -269,15 +321,28 @@ static NTSTATUS authsam_check_password_internals(struct auth_method_context *ctx
 		return NT_STATUS_NO_SUCH_DOMAIN;
 	}
 
-	nt_status = authsam_search_account(tmp_ctx, ctx->auth_ctx->sam_ctx, account_name, domain_dn, &msg);
-	if (!NT_STATUS_IS_OK(nt_status)) {
-		talloc_free(tmp_ctx);
-		return nt_status;
-	}
-
-	nt_status = authsam_authenticate(ctx->auth_ctx, tmp_ctx, ctx->auth_ctx->sam_ctx, domain_dn, msg, user_info,
-					 &user_sess_key, &lm_sess_key);
-	if (!NT_STATUS_IS_OK(nt_status)) {
+	nt_status = authsam_search_account(tmp_ctx, ctx->auth_ctx->sam_ctx,
+			account_name, domain_dn, &msg);
+	if (NT_STATUS_IS_OK(nt_status)) {
+		nt_status = authsam_authenticate(ctx->auth_ctx,
+				tmp_ctx, ctx->auth_ctx->sam_ctx, domain_dn,
+				msg, user_info, &user_sess_key, &lm_sess_key);
+		if (!NT_STATUS_IS_OK(nt_status)) {
+			talloc_free(tmp_ctx);
+			return nt_status;
+		}
+	} else if (NT_STATUS_EQUAL(nt_status, NT_STATUS_NO_SUCH_USER)) {
+		DEBUG(3, ("%s: User %s not found, mapping to guest account\n",
+					__func__, account_name));
+		nt_status = authsam_search_guest_account(tmp_ctx,
+				ctx->auth_ctx->sam_ctx, domain_dn, &msg);
+		if (!NT_STATUS_IS_OK(nt_status)) {
+			talloc_free(tmp_ctx);
+			return nt_status;
+		}
+		user_sess_key = data_blob(NULL, 0);
+		lm_sess_key = data_blob(NULL, 0);
+	} else {
 		talloc_free(tmp_ctx);
 		return nt_status;
 	}
-- 
To unsubscribe from this list go to the following URL and read the
instructions:  https://lists.samba.org/mailman/options/samba

Reply via email to