⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 changepw.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
	    str2data (result_string,		      "client: bad length in result");	    return 0;	}        p = result_code_string->data;              *result_code = (p[0] << 8) | p[1];        krb5_data_copy (result_string,                        (unsigned char*)result_code_string->data + 2,                        result_code_string->length - 2);        return 0;    } else {	KRB_ERROR error;	size_t size;	u_char *p;      	ret = decode_KRB_ERROR(reply + 6, len - 6, &error, &size);	if (ret) {	    return ret;	}	if (error.e_data->length < 2) {	    krb5_warnx (context, "too short e_data to print anything usable");	    return 1;		/* XXX */	}	p = error.e_data->data;	*result_code = (p[0] << 8) | p[1];	krb5_data_copy (result_string,			p + 2,			error.e_data->length - 2);	return 0;    }}/* * change the password using the credentials in `creds' (for the * principal indicated in them) to `newpw', storing the result of * the operation in `result_*' and an error code or 0. */typedef krb5_error_code (*kpwd_send_request) (krb5_context,					      krb5_auth_context *,					      krb5_creds *,					      krb5_principal,					      int,					      int,					      const char *,					      const char *);typedef krb5_error_code (*kpwd_process_reply) (krb5_context,					       krb5_auth_context,					       int,					       int,					       int *,					       krb5_data *,					       krb5_data *,					       const char *);static struct kpwd_proc {    const char *name;    int flags;#define SUPPORT_TCP	1#define SUPPORT_UDP	2    kpwd_send_request send_req;    kpwd_process_reply process_rep;} procs[] = {    {	"MS set password", 	SUPPORT_TCP|SUPPORT_UDP,	setpw_send_request, 	process_reply    },    {	"change password",	SUPPORT_UDP,	chgpw_send_request,	process_reply    },    { NULL }};static struct kpwd_proc *find_chpw_proto(const char *name){    struct kpwd_proc *p;    for (p = procs; p->name != NULL; p++) {	if (strcmp(p->name, name) == 0)	    return p;    }    return NULL;}/* * */static krb5_error_codechange_password_loop (krb5_context	context,		      krb5_creds	*creds,		      krb5_principal	targprinc,		      const char	*newpw,		      int		*result_code,		      krb5_data		*result_code_string,		      krb5_data		*result_string,		      struct kpwd_proc	*proc){    krb5_error_code ret;    krb5_auth_context auth_context = NULL;    krb5_krbhst_handle handle = NULL;    krb5_krbhst_info *hi;    int sock;    int i;    int done = 0;    krb5_realm realm;    if (targprinc)	realm = targprinc->realm;    else	realm = creds->client->realm;    ret = krb5_auth_con_init (context, &auth_context);    if (ret)	return ret;    krb5_auth_con_setflags (context, auth_context,			    KRB5_AUTH_CONTEXT_DO_SEQUENCE);    ret = krb5_krbhst_init (context, realm, KRB5_KRBHST_CHANGEPW, &handle);    if (ret)	goto out;    while (!done && (ret = krb5_krbhst_next(context, handle, &hi)) == 0) {	struct addrinfo *ai, *a;	int is_stream;	switch (hi->proto) {	case KRB5_KRBHST_UDP:	    if ((proc->flags & SUPPORT_UDP) == 0)		continue;	    is_stream = 0;	    break;	case KRB5_KRBHST_TCP:	    if ((proc->flags & SUPPORT_TCP) == 0)		continue;	    is_stream = 1;	    break;	default:	    continue;	}	ret = krb5_krbhst_get_addrinfo(context, hi, &ai);	if (ret)	    continue;	for (a = ai; !done && a != NULL; a = a->ai_next) {	    int replied = 0;	    sock = socket (a->ai_family, a->ai_socktype, a->ai_protocol);	    if (sock < 0)		continue;	    ret = connect(sock, a->ai_addr, a->ai_addrlen);	    if (ret < 0) {		close (sock);		goto out;	    }	    ret = krb5_auth_con_genaddrs (context, auth_context, sock,					  KRB5_AUTH_CONTEXT_GENERATE_LOCAL_ADDR);	    if (ret) {		close (sock);		goto out;	    }	    for (i = 0; !done && i < 5; ++i) {		fd_set fdset;		struct timeval tv;		if (!replied) {		    replied = 0;		    		    ret = (*proc->send_req) (context,					     &auth_context,					     creds,					     targprinc,					     is_stream,					     sock,					     newpw,					     hi->hostname);		    if (ret) {			close(sock);			goto out;		    }		}	    		if (sock >= FD_SETSIZE) {		    krb5_set_error_string(context, "fd %d too large", sock);		    ret = ERANGE;		    close (sock);		    goto out;		}		FD_ZERO(&fdset);		FD_SET(sock, &fdset);		tv.tv_usec = 0;		tv.tv_sec  = 1 + (1 << i);		ret = select (sock + 1, &fdset, NULL, NULL, &tv);		if (ret < 0 && errno != EINTR) {		    close(sock);		    goto out;		}		if (ret == 1) {		    ret = (*proc->process_rep) (context,						auth_context,						is_stream,						sock,						result_code,						result_code_string,						result_string,						hi->hostname);		    if (ret == 0)			done = 1;		    else if (i > 0 && ret == KRB5KRB_AP_ERR_MUT_FAIL)			replied = 1;		} else {		    ret = KRB5_KDC_UNREACH;		}	    }	    close (sock);	}    } out:    krb5_krbhst_free (context, handle);    krb5_auth_con_free (context, auth_context);    if (done)	return 0;    else {	if (ret == KRB5_KDC_UNREACH) {	    krb5_set_error_string(context,				  "unable to reach any changepw server "				  " in realm %s", realm);	    *result_code = KRB5_KPASSWD_HARDERROR;	}	return ret;    }}/* * change the password using the credentials in `creds' (for the * principal indicated in them) to `newpw', storing the result of * the operation in `result_*' and an error code or 0. */krb5_error_code KRB5_LIB_FUNCTIONkrb5_change_password (krb5_context	context,		      krb5_creds	*creds,		      const char	*newpw,		      int		*result_code,		      krb5_data		*result_code_string,		      krb5_data		*result_string){    struct kpwd_proc *p = find_chpw_proto("change password");    *result_code = KRB5_KPASSWD_MALFORMED;    result_code_string->data = result_string->data = NULL;    result_code_string->length = result_string->length = 0;    if (p == NULL)	return KRB5_KPASSWD_MALFORMED;    return change_password_loop(context, creds, NULL, newpw, 				result_code, result_code_string, 				result_string, p);}/* * */krb5_error_code KRB5_LIB_FUNCTIONkrb5_set_password(krb5_context context,		  krb5_creds *creds,		  const char *newpw,		  krb5_principal targprinc,		  int *result_code,		  krb5_data *result_code_string,		  krb5_data *result_string){    krb5_principal principal = NULL;    krb5_error_code ret = 0;    int i;    *result_code = KRB5_KPASSWD_MALFORMED;    result_code_string->data = result_string->data = NULL;    result_code_string->length = result_string->length = 0;    if (targprinc == NULL) {	ret = krb5_get_default_principal(context, &principal);	if (ret)	    return ret;    } else	principal = targprinc;    for (i = 0; procs[i].name != NULL; i++) {	*result_code = 0;	ret = change_password_loop(context, creds, principal, newpw, 				   result_code, result_code_string, 				   result_string, 				   &procs[i]);	if (ret == 0 && *result_code == 0)	    break;    }    if (targprinc == NULL)	krb5_free_principal(context, principal);    return ret;}/* * */krb5_error_code KRB5_LIB_FUNCTIONkrb5_set_password_using_ccache(krb5_context context,			       krb5_ccache ccache,			       const char *newpw,			       krb5_principal targprinc,			       int *result_code,			       krb5_data *result_code_string,			       krb5_data *result_string){    krb5_creds creds, *credsp;    krb5_error_code ret;    krb5_principal principal = NULL;    *result_code = KRB5_KPASSWD_MALFORMED;    result_code_string->data = result_string->data = NULL;    result_code_string->length = result_string->length = 0;    memset(&creds, 0, sizeof(creds));    if (targprinc == NULL) {	ret = krb5_cc_get_principal(context, ccache, &principal);	if (ret)	    return ret;    } else	principal = targprinc;    ret = krb5_make_principal(context, &creds.server, 			      krb5_principal_get_realm(context, principal),			      "kadmin", "changepw", NULL);    if (ret)	goto out;    ret = krb5_cc_get_principal(context, ccache, &creds.client);    if (ret) {        krb5_free_principal(context, creds.server);	goto out;    }    ret = krb5_get_credentials(context, 0, ccache, &creds, &credsp);    krb5_free_principal(context, creds.server);    krb5_free_principal(context, creds.client);    if (ret)	goto out;    ret = krb5_set_password(context,			    credsp,			    newpw,			    principal,			    result_code,			    result_code_string,			    result_string);    krb5_free_creds(context, credsp);     return ret; out:    if (targprinc == NULL)	krb5_free_principal(context, principal);    return ret;}/* * */const char* KRB5_LIB_FUNCTIONkrb5_passwd_result_to_string (krb5_context context,			      int result){    static const char *strings[] = {	"Success",	"Malformed",	"Hard error",	"Auth error",	"Soft error" ,	"Access denied",	"Bad version",	"Initial flag needed"    };    if (result < 0 || result > KRB5_KPASSWD_INITIAL_FLAG_NEEDED)	return "unknown result code";    else	return strings[result];}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -