diff options
| -rw-r--r-- | source3/nsswitch/wbinfo.c | 62 | ||||
| -rw-r--r-- | source3/nsswitch/winbindd.c | 1 | ||||
| -rw-r--r-- | source3/nsswitch/winbindd_misc.c | 21 | ||||
| -rw-r--r-- | source3/nsswitch/winbindd_nss.h | 2 | ||||
| -rw-r--r-- | source3/nsswitch/winbindd_pam.c | 34 | ||||
| -rw-r--r-- | source3/nsswitch/winbindd_proto.h | 2 | 
6 files changed, 84 insertions, 38 deletions
diff --git a/source3/nsswitch/wbinfo.c b/source3/nsswitch/wbinfo.c index 9c012eb85d..56cccee3b8 100644 --- a/source3/nsswitch/wbinfo.c +++ b/source3/nsswitch/wbinfo.c @@ -31,6 +31,23 @@ NSS_STATUS winbindd_request(int req_type,  			    struct winbindd_request *request,  			    struct winbindd_response *response); +/* Copy of parse_domain_user from winbindd_util.c.  Parse a string of the +   form DOMAIN/user into a domain and a user */ + +static BOOL parse_domain_user(const char *domuser, fstring domain, fstring user) +{ +	char *p = strchr(domuser,*lp_winbind_separator()); + +	if (!p) +		return False; +         +	fstrcpy(user, p+1); +	fstrcpy(domain, domuser); +	domain[PTR_DIFF(p, domuser)] = 0; +	strupper(domain); +	return True; +} +  /* List groups a user is a member of */  static BOOL wbinfo_get_usergroups(char *user) @@ -282,8 +299,10 @@ static BOOL wbinfo_auth(char *username)  	 * Don't do the lookup if the name has no separator.  	 */ -	if (!strchr(username, *lp_winbind_separator())) +	if (!strchr(username, *lp_winbind_separator())) { +		printf("no domain seperator (%s) in username - failing\n", lp_winbind_separator());  		return False; +	}  	/* Send off request */ @@ -317,6 +336,8 @@ static BOOL wbinfo_auth_crap(char *username)  	struct winbindd_request request;  	struct winbindd_response response;          NSS_STATUS result; +        fstring name_user; +        fstring name_domain;          fstring pass;          char *p; @@ -324,8 +345,10 @@ static BOOL wbinfo_auth_crap(char *username)  	 * Don't do the lookup if the name has no separator.  	 */ -	if (!strchr(username, *lp_winbind_separator())) +	if (!strchr(username, *lp_winbind_separator())) { +		printf("no domain seperator (%s) in username - failing\n", lp_winbind_separator());  		return False; +	}  	/* Send off request */ @@ -336,11 +359,14 @@ static BOOL wbinfo_auth_crap(char *username)          if (p) {                  *p = 0; -                fstrcpy(request.data.auth_crap.user, username);                  fstrcpy(pass, p + 1); -                *p = '%'; -        } else -                fstrcpy(request.data.auth_crap.user, username); +	} +		 +	parse_domain_user(username, name_domain, name_user); + +	fstrcpy(request.data.auth_crap.user, name_user); + +	fstrcpy(request.data.auth_crap.domain, name_domain);  	generate_random_buffer(request.data.auth_crap.chal, 8, False); @@ -447,6 +473,20 @@ static BOOL wbinfo_set_auth_user(char *username)  	return True;  } +static BOOL wbinfo_ping(void) +{ +        NSS_STATUS result; +	 +	result = winbindd_request(WINBINDD_PING, NULL, NULL); + +	/* Display response */ + +        printf("'ping' to winbindd %s\n",  +               (result == NSS_STATUS_SUCCESS) ? "succeeded" : "failed"); + +        return result == NSS_STATUS_SUCCESS; +} +  /* Print program usage */  static void usage(void) @@ -465,6 +505,7 @@ static void usage(void)  	printf("\t-m\t\t\tlist trusted domains\n");  	printf("\t-r user\t\t\tget user groups\n");  	printf("\t-a user%%password\tauthenticate user\n"); +	printf("\t-p 'ping' winbindd to see if it is alive\n");  }  /* Main program */ @@ -500,6 +541,7 @@ int main(int argc, char **argv)  		{ "user-groups", 'r', POPT_ARG_STRING, &string_arg, 'r' },   		{ "authenticate", 'a', POPT_ARG_STRING, &string_arg, 'a' },  		{ "set-auth-user", 0, POPT_ARG_STRING, &string_arg, OPT_SET_AUTH_USER }, +		{ "ping", 'p', POPT_ARG_NONE, 0, 'p' },  		{ 0, 0, 0, 0 }  	}; @@ -640,6 +682,14 @@ int main(int argc, char **argv)                                  return 1;                          break;  		} +                case 'p': { + +                        if (!wbinfo_ping()) { +                                printf("could not ping winbindd!\n"); +                                return 1; +			} +                        break; +		}  		case OPT_SET_AUTH_USER:  			if (!(wbinfo_set_auth_user(string_arg))) {  				return 1; diff --git a/source3/nsswitch/winbindd.c b/source3/nsswitch/winbindd.c index 7da20d8b01..631b71961d 100644 --- a/source3/nsswitch/winbindd.c +++ b/source3/nsswitch/winbindd.c @@ -329,6 +329,7 @@ static struct dispatch_table dispatch_table[] = {  	/* Miscellaneous */  	{ WINBINDD_CHECK_MACHACC, winbindd_check_machine_acct, "CHECK_MACHACC" }, +	{ WINBINDD_PING, winbindd_ping, "PING" },  	/* End of list */ diff --git a/source3/nsswitch/winbindd_misc.c b/source3/nsswitch/winbindd_misc.c index 2718a75385..2cfea9bbb6 100644 --- a/source3/nsswitch/winbindd_misc.c +++ b/source3/nsswitch/winbindd_misc.c @@ -31,18 +31,9 @@ extern pstring global_myname;  static BOOL _get_trust_account_password(char *domain, unsigned char *ret_pwd,   					time_t *pass_last_set_time)  { -	struct machine_acct_pass *pass; -	size_t size; - -	if (!(pass = secrets_fetch(trust_keystr(domain), &size)) || -	    size != sizeof(*pass))  +	if (!secrets_fetch_trust_account_password(domain, ret_pwd, pass_last_set_time)) {                  return False; -         -	if (pass_last_set_time)  -                *pass_last_set_time = pass->mod_time; - -	memcpy(ret_pwd, pass->hash, 16); -	SAFE_FREE(pass); +	}  	return True;  } @@ -150,3 +141,11 @@ enum winbindd_result winbindd_list_trusted_domains(struct winbindd_cli_state  	return WINBINDD_OK;  } + +enum winbindd_result winbindd_ping(struct winbindd_cli_state +						   *state) +{ +	DEBUG(3, ("[%5d]: ping\n", state->pid)); + +	return WINBINDD_OK; +} diff --git a/source3/nsswitch/winbindd_nss.h b/source3/nsswitch/winbindd_nss.h index 07c67dd558..4d836a21cf 100644 --- a/source3/nsswitch/winbindd_nss.h +++ b/source3/nsswitch/winbindd_nss.h @@ -83,6 +83,7 @@ enum winbindd_cmd {  	/* Miscellaneous other stuff */  	WINBINDD_CHECK_MACHACC,     /* Check machine account pw works */ +	WINBINDD_PING,              /* Just tell me winbind is running */  	/* Placeholder for end of cmd list */ @@ -107,6 +108,7 @@ struct winbindd_request {                  struct {                          unsigned char chal[8];                          fstring user; +                        fstring domain;                          fstring lm_resp;                          uint16 lm_resp_len;                          fstring nt_resp; diff --git a/source3/nsswitch/winbindd_pam.c b/source3/nsswitch/winbindd_pam.c index f168ce9e35..87086586ec 100644 --- a/source3/nsswitch/winbindd_pam.c +++ b/source3/nsswitch/winbindd_pam.c @@ -53,10 +53,12 @@ enum winbindd_result winbindd_pam_auth(struct winbindd_cli_state *state)  	}  	/* Parse domain and username */ - +	  	if (!parse_domain_user(state->request.data.auth.user, name_domain,  -                          name_user)) +			       name_user)) { +		DEBUG(5,("no domain seperator (%s) in username (%s) - failing fauth\n", lp_winbind_separator(), state->request.data.auth.user));  		return WINBINDD_ERROR; +	}  	passlen = strlen(state->request.data.auth.pass); @@ -71,8 +73,8 @@ enum winbindd_result winbindd_pam_auth(struct winbindd_cli_state *state)  		SMBNTencrypt((const uchar *)state->request.data.auth.pass, chal, local_nt_response); -		lm_resp = data_blob(local_lm_response, sizeof(local_lm_response)); -		nt_resp = data_blob(local_nt_response, sizeof(local_nt_response)); +		lm_resp = data_blob_talloc(mem_ctx, local_lm_response, sizeof(local_lm_response)); +		nt_resp = data_blob_talloc(mem_ctx, local_nt_response, sizeof(local_nt_response));  	}  	/* @@ -106,8 +108,6 @@ enum winbindd_result winbindd_pam_auth(struct winbindd_cli_state *state)  						&info3);  done: -	data_blob_free(&lm_resp); -	data_blob_free(&nt_resp);  	cli_shutdown(cli); @@ -115,13 +115,12 @@ done:  	return NT_STATUS_IS_OK(result) ? WINBINDD_OK : WINBINDD_ERROR;  } - +	  /* Challenge Response Authentication Protocol */  enum winbindd_result winbindd_pam_auth_crap(struct winbindd_cli_state *state)   {  	NTSTATUS result; -	fstring name_domain, name_user;  	unsigned char trust_passwd[16];  	time_t last_change_time;          NET_USER_INFO_3 info3; @@ -132,23 +131,16 @@ enum winbindd_result winbindd_pam_auth_crap(struct winbindd_cli_state *state)  	extern pstring global_myname; -	DEBUG(3, ("[%5d]: pam auth crap %s\n", state->pid, -		  state->request.data.auth_crap.user)); +	DEBUG(3, ("[%5d]: pam auth crap domain: %s user: %s\n", state->pid, +		  state->request.data.auth_crap.user, state->request.data.auth_crap.user)); -	if (!(mem_ctx = talloc_init_named("winbind pam auth for %s", state->request.data.auth.user))) { +	if (!(mem_ctx = talloc_init_named("winbind pam auth crap for %s", state->request.data.auth.user))) {  		DEBUG(0, ("winbindd_pam_auth_crap: could not talloc_init()!\n"));  		return WINBINDD_ERROR;  	} -	/* Parse domain and username */ -	if (!parse_domain_user(state->request.data.auth_crap.user, name_domain,  -			       name_user)) -		return WINBINDD_ERROR; -	 -	 -	 -	lm_resp = data_blob(state->request.data.auth_crap.lm_resp, state->request.data.auth_crap.lm_resp_len); -	nt_resp = data_blob(state->request.data.auth_crap.nt_resp, state->request.data.auth_crap.nt_resp_len); +	lm_resp = data_blob_talloc(mem_ctx, state->request.data.auth_crap.lm_resp, state->request.data.auth_crap.lm_resp_len); +	nt_resp = data_blob_talloc(mem_ctx, state->request.data.auth_crap.nt_resp, state->request.data.auth_crap.nt_resp_len);  	/*  	 * Get the machine account password for our primary domain @@ -171,7 +163,7 @@ enum winbindd_result winbindd_pam_auth_crap(struct winbindd_cli_state *state)          }  	result = cli_netlogon_sam_network_logon(cli, mem_ctx, -						name_user, name_domain,  +						state->request.data.auth_crap.user, state->request.data.auth_crap.domain,   						global_myname, state->request.data.auth_crap.chal,   						lm_resp, nt_resp,   						&info3); diff --git a/source3/nsswitch/winbindd_proto.h b/source3/nsswitch/winbindd_proto.h index ac72768ea4..bedd5a0352 100644 --- a/source3/nsswitch/winbindd_proto.h +++ b/source3/nsswitch/winbindd_proto.h @@ -68,6 +68,8 @@ void winbindd_idmap_status(void);  enum winbindd_result winbindd_check_machine_acct(struct winbindd_cli_state *state);  enum winbindd_result winbindd_list_trusted_domains(struct winbindd_cli_state  						   *state); +enum winbindd_result winbindd_ping(struct winbindd_cli_state +						   *state);  /* The following definitions come from nsswitch/winbindd_pam.c  */  | 
