2 Unix SMB/CIFS implementation.
3 Password and authentication handling
4 Copyright (C) Andrew Bartlett <abartlet@samba.org> 2001-2004
5 Copyright (C) Gerald Carter 2003
6 Copyright (C) Stefan Metzmacher 2005
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "librpc/gen_ndr/ndr_samr.h"
25 #include "system/time.h"
26 #include "auth/auth.h"
27 #include "lib/ldb/include/ldb.h"
28 #include "dsdb/samdb/samdb.h"
29 #include "libcli/ldap/ldap.h"
31 static const char *user_attrs[] = {
32 /* requried for the krb5 kdc*/
36 "servicePrincipalName",
37 "msDS-KeyVersionNumber",
52 /* check 'allowed workstations' */
55 /* required for server_info, not access control: */
70 static const char *domain_ref_attrs[] = {"nETBIOSName", "nCName",
71 "dnsRoot", "objectClass", NULL};
73 /****************************************************************************
74 Do a specific test for an smb password being correct, given a smb_password and
75 the lanman and NT responses.
76 ****************************************************************************/
77 static NTSTATUS authsam_password_ok(struct auth_context *auth_context,
80 const struct samr_Password *lm_pwd,
81 const struct samr_Password *nt_pwd,
82 const struct auth_usersupplied_info *user_info,
83 DATA_BLOB *user_sess_key,
84 DATA_BLOB *lm_sess_key)
88 if (acct_flags & ACB_PWNOTREQ) {
89 if (lp_null_passwords()) {
90 DEBUG(3,("Account for user '%s' has no password and null passwords are allowed.\n",
91 user_info->mapped.account_name));
94 DEBUG(3,("Account for user '%s' has no password and null passwords are NOT allowed.\n",
95 user_info->mapped.account_name));
96 return NT_STATUS_LOGON_FAILURE;
100 switch (user_info->password_state) {
101 case AUTH_PASSWORD_PLAIN:
103 const struct auth_usersupplied_info *user_info_temp;
104 status = encrypt_user_info(mem_ctx, auth_context,
106 user_info, &user_info_temp);
107 if (!NT_STATUS_IS_OK(status)) {
108 DEBUG(1, ("Failed to convert plaintext password to password HASH: %s\n", nt_errstr(status)));
111 user_info = user_info_temp;
115 case AUTH_PASSWORD_HASH:
116 *lm_sess_key = data_blob(NULL, 0);
117 *user_sess_key = data_blob(NULL, 0);
118 status = hash_password_check(mem_ctx,
119 user_info->password.hash.lanman,
120 user_info->password.hash.nt,
121 user_info->mapped.account_name,
123 NT_STATUS_NOT_OK_RETURN(status);
126 case AUTH_PASSWORD_RESPONSE:
127 status = ntlm_password_check(mem_ctx, user_info->logon_parameters,
128 &auth_context->challenge.data,
129 &user_info->password.response.lanman,
130 &user_info->password.response.nt,
131 user_info->mapped.account_name,
132 user_info->client.account_name,
133 user_info->client.domain_name,
135 user_sess_key, lm_sess_key);
136 NT_STATUS_NOT_OK_RETURN(status);
140 if (user_sess_key && user_sess_key->data) {
141 talloc_steal(auth_context, user_sess_key->data);
143 if (lm_sess_key && lm_sess_key->data) {
144 talloc_steal(auth_context, lm_sess_key->data);
151 /****************************************************************************
152 Do a specific test for a SAM_ACCOUNT being vaild for this connection
153 (ie not disabled, expired and the like).
154 ****************************************************************************/
155 NTSTATUS authsam_account_ok(TALLOC_CTX *mem_ctx,
156 struct ldb_context *sam_ctx,
157 uint32_t logon_parameters,
158 struct ldb_message *msg,
159 struct ldb_message *msg_domain_ref,
160 const char *logon_workstation,
161 const char *name_for_logs)
164 const char *workstation_list;
166 NTTIME must_change_time;
167 NTTIME last_set_time;
169 struct ldb_dn *domain_dn = samdb_result_dn(mem_ctx, msg_domain_ref, "nCName", ldb_dn_new(mem_ctx));
172 DEBUG(4,("authsam_account_ok: Checking SMB password for user %s\n", name_for_logs));
174 acct_flags = samdb_result_acct_flags(msg, "userAccountControl");
176 acct_expiry = samdb_result_nttime(msg, "accountExpires", 0);
177 must_change_time = samdb_result_force_password_change(sam_ctx, mem_ctx,
180 last_set_time = samdb_result_nttime(msg, "pwdLastSet", 0);
182 workstation_list = samdb_result_string(msg, "userWorkstations", NULL);
184 /* Quit if the account was disabled. */
185 if (acct_flags & ACB_DISABLED) {
186 DEBUG(1,("authsam_account_ok: Account for user '%s' was disabled.\n", name_for_logs));
187 return NT_STATUS_ACCOUNT_DISABLED;
190 /* Quit if the account was locked out. */
191 if (acct_flags & ACB_AUTOLOCK) {
192 DEBUG(1,("authsam_account_ok: Account for user %s was locked out.\n", name_for_logs));
193 return NT_STATUS_ACCOUNT_LOCKED_OUT;
196 /* Test account expire time */
197 unix_to_nt_time(&now, time(NULL));
198 if (now > acct_expiry) {
199 DEBUG(1,("authsam_account_ok: Account for user '%s' has expired.\n", name_for_logs));
200 DEBUG(3,("authsam_account_ok: Account expired at '%s'.\n",
201 nt_time_string(mem_ctx, acct_expiry)));
202 return NT_STATUS_ACCOUNT_EXPIRED;
205 if (!(acct_flags & ACB_PWNOEXP)) {
206 /* check for immediate expiry "must change at next logon" */
207 if (must_change_time == 0 && last_set_time != 0) {
208 DEBUG(1,("sam_account_ok: Account for user '%s' password must change!.\n",
210 return NT_STATUS_PASSWORD_MUST_CHANGE;
213 /* check for expired password */
214 if ((must_change_time != 0) && (must_change_time < now)) {
215 DEBUG(1,("sam_account_ok: Account for user '%s' password expired!.\n",
217 DEBUG(1,("sam_account_ok: Password expired at '%s' unix time.\n",
218 nt_time_string(mem_ctx, must_change_time)));
219 return NT_STATUS_PASSWORD_EXPIRED;
223 /* Test workstation. Workstation list is comma separated. */
224 if (logon_workstation && workstation_list && *workstation_list) {
225 BOOL invalid_ws = True;
227 const char **workstations = str_list_make(mem_ctx, workstation_list, ",");
229 for (i = 0; workstations && workstations[i]; i++) {
230 DEBUG(10,("sam_account_ok: checking for workstation match '%s' and '%s'\n",
231 workstations[i], logon_workstation));
233 if (strequal(workstations[i], logon_workstation)) {
239 talloc_free(workstations);
242 return NT_STATUS_INVALID_WORKSTATION;
246 if (acct_flags & ACB_DOMTRUST) {
247 DEBUG(2,("sam_account_ok: Domain trust account %s denied by server\n", name_for_logs));
248 return NT_STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT;
251 if (!(logon_parameters & MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT)) {
252 if (acct_flags & ACB_SVRTRUST) {
253 DEBUG(2,("sam_account_ok: Server trust account %s denied by server\n", name_for_logs));
254 return NT_STATUS_NOLOGON_SERVER_TRUST_ACCOUNT;
257 if (!(logon_parameters & MSV1_0_ALLOW_WORKSTATION_TRUST_ACCOUNT)) {
258 if (acct_flags & ACB_WSTRUST) {
259 DEBUG(4,("sam_account_ok: Wksta trust account %s denied by server\n", name_for_logs));
260 return NT_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT;
267 /****************************************************************************
268 Look for the specified user in the sam, return ldb result structures
269 ****************************************************************************/
271 static NTSTATUS authsam_search_account(TALLOC_CTX *mem_ctx, struct ldb_context *sam_ctx,
272 const char *account_name,
273 const char *domain_name,
274 struct ldb_message ***ret_msgs,
275 struct ldb_message ***ret_msgs_domain_ref)
277 struct ldb_message **msgs_tmp;
278 struct ldb_message **msgs;
279 struct ldb_message **msgs_domain_ref;
284 const struct ldb_dn *domain_dn = NULL;
287 char *escaped_domain = ldb_binary_encode_string(mem_ctx, domain_name);
288 /* find the domain's DN */
289 ret_domain = gendb_search(sam_ctx, mem_ctx, NULL, &msgs_domain_ref, domain_ref_attrs,
290 "(&(&(|(&(dnsRoot=%s)(nETBIOSName=*))(nETBIOSName=%s))(objectclass=crossRef))(ncName=*))",
291 escaped_domain, escaped_domain);
292 if (ret_domain == -1) {
293 return NT_STATUS_INTERNAL_DB_CORRUPTION;
296 if (ret_domain == 0) {
297 DEBUG(3,("sam_search_user: Couldn't find domain [%s] in samdb.\n",
299 return NT_STATUS_NO_SUCH_USER;
302 if (ret_domain > 1) {
303 DEBUG(0,("Found %d records matching domain [%s]\n",
304 ret_domain, domain_name));
305 return NT_STATUS_INTERNAL_DB_CORRUPTION;
308 domain_dn = samdb_result_dn(mem_ctx, msgs_domain_ref[0], "nCName", NULL);
311 /* pull the user attributes */
312 ret = gendb_search(sam_ctx, mem_ctx, domain_dn, &msgs, user_attrs,
313 "(&(sAMAccountName=%s)(objectclass=user))",
314 ldb_binary_encode_string(mem_ctx, account_name));
316 return NT_STATUS_INTERNAL_DB_CORRUPTION;
320 DEBUG(3,("sam_search_user: Couldn't find user [%s] in samdb.\n",
322 return NT_STATUS_NO_SUCH_USER;
326 DEBUG(0,("Found %d records matching user [%s]\n", ret, account_name));
327 return NT_STATUS_INTERNAL_DB_CORRUPTION;
331 struct dom_sid *domain_sid;
333 domain_sid = samdb_result_sid_prefix(mem_ctx, msgs[0], "objectSid");
335 return NT_STATUS_INTERNAL_DB_CORRUPTION;
338 /* find the domain's DN */
339 ret = gendb_search(sam_ctx, mem_ctx, NULL, &msgs_tmp, NULL,
340 "(&(objectSid=%s)(objectclass=domain))",
341 ldap_encode_ndr_dom_sid(mem_ctx, domain_sid));
343 return NT_STATUS_INTERNAL_DB_CORRUPTION;
347 DEBUG(3,("check_sam_security: Couldn't find domain_sid [%s] in passdb file.\n",
348 dom_sid_string(mem_ctx, domain_sid)));
349 return NT_STATUS_NO_SUCH_USER;
353 DEBUG(0,("Found %d records matching domain_sid [%s]\n",
354 ret, dom_sid_string(mem_ctx, domain_sid)));
355 return NT_STATUS_INTERNAL_DB_CORRUPTION;
358 ret_domain = gendb_search(sam_ctx, mem_ctx, NULL, &msgs_domain_ref, domain_ref_attrs,
359 "(nCName=%s)", ldb_dn_linearize(msgs_tmp, msgs_tmp[0]->dn));
361 if (ret_domain == -1) {
362 return NT_STATUS_INTERNAL_DB_CORRUPTION;
365 if (ret_domain == 0) {
366 DEBUG(3,("check_sam_security: Couldn't find domain [%s] in passdb file.\n",
367 ldb_dn_linearize(msgs_tmp, msgs_tmp[0]->dn)));
368 return NT_STATUS_NO_SUCH_USER;
371 if (ret_domain > 1) {
372 DEBUG(0,("Found %d records matching domain [%s]\n",
373 ret_domain, ldb_dn_linearize(msgs_tmp, msgs_tmp[0]->dn)));
374 return NT_STATUS_INTERNAL_DB_CORRUPTION;
380 *ret_msgs_domain_ref = msgs_domain_ref;
385 static NTSTATUS authsam_authenticate(struct auth_context *auth_context,
386 TALLOC_CTX *mem_ctx, struct ldb_context *sam_ctx,
387 struct ldb_message **msgs,
388 struct ldb_message **msgs_domain_ref,
389 const struct auth_usersupplied_info *user_info,
390 DATA_BLOB *user_sess_key, DATA_BLOB *lm_sess_key)
392 struct samr_Password *lm_pwd, *nt_pwd;
394 uint16_t acct_flags = samdb_result_acct_flags(msgs[0], "userAccountControl");
396 /* Quit if the account was locked out. */
397 if (acct_flags & ACB_AUTOLOCK) {
398 DEBUG(3,("check_sam_security: Account for user %s was locked out.\n",
399 user_info->mapped.account_name));
400 return NT_STATUS_ACCOUNT_LOCKED_OUT;
403 /* You can only do an interactive login to normal accounts */
404 if (user_info->flags & USER_INFO_INTERACTIVE_LOGON) {
405 if (!(acct_flags & ACB_NORMAL)) {
406 return NT_STATUS_NO_SUCH_USER;
410 nt_status = samdb_result_passwords(mem_ctx, msgs[0], &lm_pwd, &nt_pwd);
411 NT_STATUS_NOT_OK_RETURN(nt_status);
413 nt_status = authsam_password_ok(auth_context, mem_ctx,
414 acct_flags, lm_pwd, nt_pwd,
415 user_info, user_sess_key, lm_sess_key);
416 NT_STATUS_NOT_OK_RETURN(nt_status);
418 nt_status = authsam_account_ok(mem_ctx, sam_ctx,
419 user_info->logon_parameters,
422 user_info->workstation_name,
423 user_info->mapped.account_name);
428 NTSTATUS authsam_make_server_info(TALLOC_CTX *mem_ctx, struct ldb_context *sam_ctx,
429 struct ldb_message *msg,
430 struct ldb_message *msg_domain_ref,
431 DATA_BLOB user_sess_key, DATA_BLOB lm_sess_key,
432 struct auth_serversupplied_info **_server_info)
434 struct auth_serversupplied_info *server_info;
435 struct ldb_message **group_msgs;
437 const char *group_attrs[3] = { "sAMAccountType", "objectSid", NULL };
438 /* find list of sids */
439 struct dom_sid **groupSIDs = NULL;
440 struct dom_sid *account_sid;
441 struct dom_sid *primary_group_sid;
443 struct ldb_dn *ncname;
446 TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
448 group_ret = gendb_search(sam_ctx,
449 tmp_ctx, NULL, &group_msgs, group_attrs,
450 "(&(member=%s)(sAMAccountType=*))",
451 ldb_dn_linearize(tmp_ctx, msg->dn));
452 if (group_ret == -1) {
453 talloc_free(tmp_ctx);
454 return NT_STATUS_INTERNAL_DB_CORRUPTION;
457 server_info = talloc(mem_ctx, struct auth_serversupplied_info);
458 NT_STATUS_HAVE_NO_MEMORY(server_info);
461 groupSIDs = talloc_array(server_info, struct dom_sid *, group_ret);
462 NT_STATUS_HAVE_NO_MEMORY(groupSIDs);
465 /* Need to unroll some nested groups, but not aliases */
466 for (i = 0; i < group_ret; i++) {
467 groupSIDs[i] = samdb_result_dom_sid(groupSIDs,
468 group_msgs[i], "objectSid");
469 NT_STATUS_HAVE_NO_MEMORY(groupSIDs[i]);
472 talloc_free(tmp_ctx);
474 account_sid = samdb_result_dom_sid(server_info, msg, "objectSid");
475 NT_STATUS_HAVE_NO_MEMORY(account_sid);
477 primary_group_sid = dom_sid_dup(server_info, account_sid);
478 NT_STATUS_HAVE_NO_MEMORY(primary_group_sid);
480 rid = samdb_result_uint(msg, "primaryGroupID", ~0);
483 primary_group_sid = groupSIDs[0];
485 primary_group_sid = NULL;
488 primary_group_sid->sub_auths[primary_group_sid->num_auths-1] = rid;
491 server_info->account_sid = account_sid;
492 server_info->primary_group_sid = primary_group_sid;
494 server_info->n_domain_groups = group_ret;
495 server_info->domain_groups = groupSIDs;
497 server_info->account_name = talloc_steal(server_info, samdb_result_string(msg, "sAMAccountName", NULL));
499 server_info->domain_name = talloc_steal(server_info, samdb_result_string(msg_domain_ref, "nETBIOSName", NULL));
501 str = samdb_result_string(msg, "displayName", "");
502 server_info->full_name = talloc_strdup(server_info, str);
503 NT_STATUS_HAVE_NO_MEMORY(server_info->full_name);
505 str = samdb_result_string(msg, "scriptPath", "");
506 server_info->logon_script = talloc_strdup(server_info, str);
507 NT_STATUS_HAVE_NO_MEMORY(server_info->logon_script);
509 str = samdb_result_string(msg, "profilePath", "");
510 server_info->profile_path = talloc_strdup(server_info, str);
511 NT_STATUS_HAVE_NO_MEMORY(server_info->profile_path);
513 str = samdb_result_string(msg, "homeDirectory", "");
514 server_info->home_directory = talloc_strdup(server_info, str);
515 NT_STATUS_HAVE_NO_MEMORY(server_info->home_directory);
517 str = samdb_result_string(msg, "homeDrive", "");
518 server_info->home_drive = talloc_strdup(server_info, str);
519 NT_STATUS_HAVE_NO_MEMORY(server_info->home_drive);
521 server_info->logon_server = talloc_strdup(server_info, lp_netbios_name());
522 NT_STATUS_HAVE_NO_MEMORY(server_info->logon_server);
524 server_info->last_logon = samdb_result_nttime(msg, "lastLogon", 0);
525 server_info->last_logoff = samdb_result_nttime(msg, "lastLogoff", 0);
526 server_info->acct_expiry = samdb_result_nttime(msg, "accountExpires", 0);
527 server_info->last_password_change = samdb_result_nttime(msg, "pwdLastSet", 0);
529 ncname = samdb_result_dn(mem_ctx, msg_domain_ref, "nCName", ldb_dn_new(mem_ctx));
531 server_info->allow_password_change = samdb_result_allow_password_change(sam_ctx, mem_ctx,
532 ncname, msg, "pwdLastSet");
533 server_info->force_password_change = samdb_result_force_password_change(sam_ctx, mem_ctx,
534 ncname, msg, "pwdLastSet");
536 server_info->logon_count = samdb_result_uint(msg, "logonCount", 0);
537 server_info->bad_password_count = samdb_result_uint(msg, "badPwdCount", 0);
539 server_info->acct_flags = samdb_result_acct_flags(msg, "userAccountControl");
541 server_info->user_session_key = user_sess_key;
542 server_info->lm_session_key = lm_sess_key;
544 server_info->authenticated = True;
546 *_server_info = server_info;
551 NTSTATUS sam_get_results_principal(struct ldb_context *sam_ctx,
552 TALLOC_CTX *mem_ctx, const char *principal,
553 struct ldb_message ***msgs,
554 struct ldb_message ***msgs_domain_ref)
556 struct ldb_dn *user_dn, *domain_dn;
558 TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
562 return NT_STATUS_NO_MEMORY;
565 nt_status = crack_user_principal_name(sam_ctx, tmp_ctx, principal, &user_dn, &domain_dn);
566 if (!NT_STATUS_IS_OK(nt_status)) {
567 talloc_free(tmp_ctx);
571 /* grab domain info from the reference */
572 ret = gendb_search(sam_ctx, tmp_ctx, NULL, msgs_domain_ref, domain_ref_attrs,
573 "(ncName=%s)", ldb_dn_linearize(tmp_ctx, domain_dn));
576 talloc_free(tmp_ctx);
577 return NT_STATUS_INTERNAL_DB_CORRUPTION;
580 /* pull the user attributes */
581 ret = gendb_search_dn(sam_ctx, tmp_ctx,
582 user_dn, msgs, user_attrs);
584 talloc_free(tmp_ctx);
585 return NT_STATUS_INTERNAL_DB_CORRUPTION;
587 talloc_steal(mem_ctx, *msgs);
588 talloc_steal(mem_ctx, *msgs_domain_ref);
593 /* Used in the gensec_gssapi and gensec_krb5 server-side code, where the PAC isn't available */
594 NTSTATUS sam_get_server_info_principal(TALLOC_CTX *mem_ctx, const char *principal,
595 struct auth_serversupplied_info **server_info)
598 DATA_BLOB user_sess_key = data_blob(NULL, 0);
599 DATA_BLOB lm_sess_key = data_blob(NULL, 0);
601 struct ldb_message **msgs;
602 struct ldb_message **msgs_domain_ref;
603 struct ldb_context *sam_ctx;
605 TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
607 return NT_STATUS_NO_MEMORY;
610 sam_ctx = samdb_connect(tmp_ctx, system_session(tmp_ctx));
611 if (sam_ctx == NULL) {
612 talloc_free(tmp_ctx);
613 return NT_STATUS_INVALID_SYSTEM_SERVICE;
616 nt_status = sam_get_results_principal(sam_ctx, mem_ctx, principal,
617 &msgs, &msgs_domain_ref);
618 if (!NT_STATUS_IS_OK(nt_status)) {
622 nt_status = authsam_make_server_info(mem_ctx, sam_ctx, msgs[0], msgs_domain_ref[0],
623 user_sess_key, lm_sess_key,
625 if (!NT_STATUS_IS_OK(nt_status)) {
626 talloc_free(tmp_ctx);
632 static NTSTATUS authsam_check_password_internals(struct auth_method_context *ctx,
635 const struct auth_usersupplied_info *user_info,
636 struct auth_serversupplied_info **server_info)
639 const char *account_name = user_info->mapped.account_name;
640 struct ldb_message **msgs;
641 struct ldb_message **domain_ref_msgs;
642 struct ldb_context *sam_ctx;
643 DATA_BLOB user_sess_key, lm_sess_key;
645 if (!account_name || !*account_name) {
647 return NT_STATUS_NOT_IMPLEMENTED;
650 sam_ctx = samdb_connect(mem_ctx, system_session(mem_ctx));
651 if (sam_ctx == NULL) {
652 return NT_STATUS_INVALID_SYSTEM_SERVICE;
655 nt_status = authsam_search_account(mem_ctx, sam_ctx, account_name, domain, &msgs, &domain_ref_msgs);
656 NT_STATUS_NOT_OK_RETURN(nt_status);
658 nt_status = authsam_authenticate(ctx->auth_ctx, mem_ctx, sam_ctx, msgs, domain_ref_msgs, user_info,
659 &user_sess_key, &lm_sess_key);
660 NT_STATUS_NOT_OK_RETURN(nt_status);
662 nt_status = authsam_make_server_info(mem_ctx, sam_ctx, msgs[0], domain_ref_msgs[0],
663 user_sess_key, lm_sess_key,
665 NT_STATUS_NOT_OK_RETURN(nt_status);
668 talloc_free(domain_ref_msgs);
673 static NTSTATUS authsam_ignoredomain_check_password(struct auth_method_context *ctx,
675 const struct auth_usersupplied_info *user_info,
676 struct auth_serversupplied_info **server_info)
678 return authsam_check_password_internals(ctx, mem_ctx, NULL, user_info, server_info);
681 /****************************************************************************
682 Check SAM security (above) but with a few extra checks.
683 ****************************************************************************/
684 static NTSTATUS authsam_check_password(struct auth_method_context *ctx,
686 const struct auth_usersupplied_info *user_info,
687 struct auth_serversupplied_info **server_info)
690 BOOL is_local_name, is_my_domain;
692 is_local_name = is_myname(user_info->mapped.domain_name);
693 is_my_domain = strequal(user_info->mapped.domain_name, lp_workgroup());
695 /* check whether or not we service this domain/workgroup name */
696 switch (lp_server_role()) {
697 case ROLE_STANDALONE:
698 domain = lp_netbios_name();
700 case ROLE_DOMAIN_MEMBER:
701 if (!is_local_name) {
702 DEBUG(6,("authsam_check_password: %s is not one of my local names (%s)\n",
703 user_info->mapped.domain_name, (lp_server_role() == ROLE_DOMAIN_MEMBER
704 ? "ROLE_DOMAIN_MEMBER" : "ROLE_STANDALONE") ));
705 return NT_STATUS_NOT_IMPLEMENTED;
707 domain = lp_netbios_name();
709 case ROLE_DOMAIN_PDC:
710 case ROLE_DOMAIN_BDC:
711 if (!is_local_name && !is_my_domain) {
712 DEBUG(6,("authsam_check_password: %s is not one of my local names or domain name (DC)\n",
713 user_info->mapped.domain_name));
714 return NT_STATUS_NOT_IMPLEMENTED;
716 domain = lp_workgroup();
719 DEBUG(6,("authsam_check_password: lp_server_role() has an undefined value\n"));
720 return NT_STATUS_NOT_IMPLEMENTED;
723 return authsam_check_password_internals(ctx, mem_ctx, domain, user_info, server_info);
726 static const struct auth_operations sam_ignoredomain_ops = {
727 .name = "sam_ignoredomain",
728 .get_challenge = auth_get_challenge_not_implemented,
729 .check_password = authsam_ignoredomain_check_password
732 static const struct auth_operations sam_ops = {
734 .get_challenge = auth_get_challenge_not_implemented,
735 .check_password = authsam_check_password
738 NTSTATUS auth_sam_init(void)
742 ret = auth_register(&sam_ops);
743 if (!NT_STATUS_IS_OK(ret)) {
744 DEBUG(0,("Failed to register 'sam' auth backend!\n"));
748 ret = auth_register(&sam_ignoredomain_ops);
749 if (!NT_STATUS_IS_OK(ret)) {
750 DEBUG(0,("Failed to register 'sam_ignoredomain' auth backend!\n"));