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

📄 get_cred.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 3 页
字号:
	if(ret) {	    krb5_free_principal(context, tmp_creds.server);	    krb5_free_principal(context, tmp_creds.client);	    return ret;	}    }	    krb5_free_principal(context, tmp_creds.server);    krb5_free_principal(context, tmp_creds.client);    *out_creds = calloc(1, sizeof(**out_creds));    if(*out_creds == NULL) {	krb5_set_error_string(context, "malloc: out of memory");	ret = ENOMEM;    } else {	krb5_boolean noaddr;	krb5_appdefault_boolean(context, NULL, tgt->server->realm,				"no-addresses", KRB5_ADDRESSLESS_DEFAULT,				&noaddr);	if (noaddr)	    ret = get_cred_kdc (context, ccache, flags, NULL,				in_creds, tgt, NULL, NULL,				*out_creds);	else	    ret = get_cred_kdc_la(context, ccache, flags, 				  in_creds, tgt, NULL, NULL,				  *out_creds);	if (ret) {	    free (*out_creds);	    *out_creds = NULL;	}    }    krb5_free_creds(context, tgt);    return ret;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_get_cred_from_kdc_opt(krb5_context context,			   krb5_ccache ccache,			   krb5_creds *in_creds,			   krb5_creds **out_creds,			   krb5_creds ***ret_tgts,			   krb5_flags flags){    krb5_kdc_flags f;    f.i = flags;    return get_cred_from_kdc_flags(context, f, ccache, 				   in_creds, NULL, NULL,				   out_creds, ret_tgts);}krb5_error_code KRB5_LIB_FUNCTIONkrb5_get_cred_from_kdc(krb5_context context,		       krb5_ccache ccache,		       krb5_creds *in_creds,		       krb5_creds **out_creds,		       krb5_creds ***ret_tgts){    return krb5_get_cred_from_kdc_opt(context, ccache, 				      in_creds, out_creds, ret_tgts, 0);}     krb5_error_code KRB5_LIB_FUNCTIONkrb5_get_credentials_with_flags(krb5_context context,				krb5_flags options,				krb5_kdc_flags flags,				krb5_ccache ccache,				krb5_creds *in_creds,				krb5_creds **out_creds){    krb5_error_code ret;    krb5_creds **tgts;    krb5_creds *res_creds;    int i;        *out_creds = NULL;    res_creds = calloc(1, sizeof(*res_creds));    if (res_creds == NULL) {	krb5_set_error_string(context, "malloc: out of memory");	return ENOMEM;    }    if (in_creds->session.keytype)	options |= KRB5_TC_MATCH_KEYTYPE;    /*      * If we got a credential, check if credential is expired before     * returning it.     */    ret = krb5_cc_retrieve_cred(context,                                ccache,                                in_creds->session.keytype ?                                KRB5_TC_MATCH_KEYTYPE : 0,                                in_creds, res_creds);    /*      * If we got a credential, check if credential is expired before     * returning it, but only if KRB5_GC_EXPIRED_OK is not set.     */    if (ret == 0) {	krb5_timestamp timeret;	/* If expired ok, don't bother checking */        if(options & KRB5_GC_EXPIRED_OK) {            *out_creds = res_creds;            return 0;        }	    	krb5_timeofday(context, &timeret);	if(res_creds->times.endtime > timeret) {	    *out_creds = res_creds;	    return 0;	}	if(options & KRB5_GC_CACHED)	    krb5_cc_remove_cred(context, ccache, 0, res_creds);    } else if(ret != KRB5_CC_END) {        free(res_creds);        return ret;    }    free(res_creds);    if(options & KRB5_GC_CACHED) {	not_found(context, in_creds->server);        return KRB5_CC_NOTFOUND;    }    if(options & KRB5_GC_USER_USER)	flags.b.enc_tkt_in_skey = 1;    if (flags.b.enc_tkt_in_skey)	options |= KRB5_GC_NO_STORE;    tgts = NULL;    ret = get_cred_from_kdc_flags(context, flags, ccache, 				  in_creds, NULL, NULL, out_creds, &tgts);    for(i = 0; tgts && tgts[i]; i++) {	krb5_cc_store_cred(context, ccache, tgts[i]);	krb5_free_creds(context, tgts[i]);    }    free(tgts);    if(ret == 0 && (options & KRB5_GC_NO_STORE) == 0)	krb5_cc_store_cred(context, ccache, *out_creds);    return ret;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_get_credentials(krb5_context context,		     krb5_flags options,		     krb5_ccache ccache,		     krb5_creds *in_creds,		     krb5_creds **out_creds){    krb5_kdc_flags flags;    flags.i = 0;    return krb5_get_credentials_with_flags(context, options, flags,					   ccache, in_creds, out_creds);}struct krb5_get_creds_opt_data {    krb5_principal self;    krb5_flags options;    krb5_enctype enctype;    Ticket *ticket;};krb5_error_code KRB5_LIB_FUNCTIONkrb5_get_creds_opt_alloc(krb5_context context, krb5_get_creds_opt *opt){    *opt = calloc(1, sizeof(**opt));    if (*opt == NULL) {	krb5_set_error_string(context, "malloc: out of memory");	return ENOMEM;    }    return 0;}void KRB5_LIB_FUNCTIONkrb5_get_creds_opt_free(krb5_context context, krb5_get_creds_opt opt){    if (opt->self)	krb5_free_principal(context, opt->self);    memset(opt, 0, sizeof(*opt));    free(opt);}void KRB5_LIB_FUNCTIONkrb5_get_creds_opt_set_options(krb5_context context,			       krb5_get_creds_opt opt,			       krb5_flags options){    opt->options = options;}void KRB5_LIB_FUNCTIONkrb5_get_creds_opt_add_options(krb5_context context,			       krb5_get_creds_opt opt,			       krb5_flags options){    opt->options |= options;}void KRB5_LIB_FUNCTIONkrb5_get_creds_opt_set_enctype(krb5_context context,			       krb5_get_creds_opt opt,			       krb5_enctype enctype){    opt->enctype = enctype;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_get_creds_opt_set_impersonate(krb5_context context,				   krb5_get_creds_opt opt,				   krb5_const_principal self){    if (opt->self)	krb5_free_principal(context, opt->self);    return krb5_copy_principal(context, self, &opt->self);}krb5_error_code KRB5_LIB_FUNCTIONkrb5_get_creds_opt_set_ticket(krb5_context context,			      krb5_get_creds_opt opt,			      const Ticket *ticket){    if (opt->ticket) {	free_Ticket(opt->ticket);	free(opt->ticket);	opt->ticket = NULL;    }    if (ticket) {	krb5_error_code ret;	opt->ticket = malloc(sizeof(*ticket));	if (opt->ticket == NULL) {	    krb5_set_error_string(context, "malloc: out of memory");	    return ENOMEM;	}	ret = copy_Ticket(ticket, opt->ticket);	if (ret) {	    free(opt->ticket);	    opt->ticket = NULL;	    krb5_set_error_string(context, "malloc: out of memory");	    return ret;	}    }    return 0;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_get_creds(krb5_context context,	       krb5_get_creds_opt opt,	       krb5_ccache ccache,	       krb5_const_principal inprinc,	       krb5_creds **out_creds){    krb5_kdc_flags flags;    krb5_flags options;    krb5_creds in_creds;    krb5_error_code ret;    krb5_creds **tgts;    krb5_creds *res_creds;    int i;        memset(&in_creds, 0, sizeof(in_creds));    in_creds.server = rk_UNCONST(inprinc);    ret = krb5_cc_get_principal(context, ccache, &in_creds.client);    if (ret)	return ret;    options = opt->options;    flags.i = 0;    *out_creds = NULL;    res_creds = calloc(1, sizeof(*res_creds));    if (res_creds == NULL) {	krb5_free_principal(context, in_creds.client);	krb5_set_error_string(context, "malloc: out of memory");	return ENOMEM;    }    if (opt->enctype) {	in_creds.session.keytype = opt->enctype;	options |= KRB5_TC_MATCH_KEYTYPE;    }    /*      * If we got a credential, check if credential is expired before     * returning it.     */    ret = krb5_cc_retrieve_cred(context,                                ccache,				opt->enctype ? KRB5_TC_MATCH_KEYTYPE : 0,                                &in_creds, res_creds);    /*      * If we got a credential, check if credential is expired before     * returning it, but only if KRB5_GC_EXPIRED_OK is not set.     */    if (ret == 0) {	krb5_timestamp timeret;	/* If expired ok, don't bother checking */        if(options & KRB5_GC_EXPIRED_OK) {            *out_creds = res_creds;	    krb5_free_principal(context, in_creds.client);            return 0;        }	    	krb5_timeofday(context, &timeret);	if(res_creds->times.endtime > timeret) {	    *out_creds = res_creds;	    krb5_free_principal(context, in_creds.client);	    return 0;	}	if(options & KRB5_GC_CACHED)	    krb5_cc_remove_cred(context, ccache, 0, res_creds);    } else if(ret != KRB5_CC_END) {        free(res_creds);	krb5_free_principal(context, in_creds.client);        return ret;    }    free(res_creds);    if(options & KRB5_GC_CACHED) {	not_found(context, in_creds.server);	krb5_free_principal(context, in_creds.client);        return KRB5_CC_NOTFOUND;    }    if(options & KRB5_GC_USER_USER) {	flags.b.enc_tkt_in_skey = 1;	options |= KRB5_GC_NO_STORE;    }    if (options & KRB5_GC_FORWARDABLE)	flags.b.forwardable = 1;    if (options & KRB5_GC_NO_TRANSIT_CHECK)	flags.b.disable_transited_check = 1;    if (options & KRB5_GC_CONSTRAINED_DELEGATION) {	flags.b.request_anonymous = 1; /* XXX ARGH confusion */	flags.b.constrained_delegation = 1;    }    tgts = NULL;    ret = get_cred_from_kdc_flags(context, flags, ccache, 				  &in_creds, opt->self, opt->ticket,				  out_creds, &tgts);    krb5_free_principal(context, in_creds.client);    for(i = 0; tgts && tgts[i]; i++) {	krb5_cc_store_cred(context, ccache, tgts[i]);	krb5_free_creds(context, tgts[i]);    }    free(tgts);    if(ret == 0 && (options & KRB5_GC_NO_STORE) == 0)	krb5_cc_store_cred(context, ccache, *out_creds);    return ret;}/* * */krb5_error_code KRB5_LIB_FUNCTIONkrb5_get_renewed_creds(krb5_context context,		       krb5_creds *creds,		       krb5_const_principal client,		       krb5_ccache ccache,		       const char *in_tkt_service){    krb5_error_code ret;    krb5_kdc_flags flags;    krb5_creds in, *template, *out = NULL;    memset(&in, 0, sizeof(in));    memset(creds, 0, sizeof(*creds));    ret = krb5_copy_principal(context, client, &in.client);    if (ret)	return ret;    if (in_tkt_service) {	ret = krb5_parse_name(context, in_tkt_service, &in.server);	if (ret) {	    krb5_free_principal(context, in.client);	    return ret;	}    } else {	const char *realm = krb5_principal_get_realm(context, client);		ret = krb5_make_principal(context, &in.server, realm, KRB5_TGS_NAME,				  realm, NULL);	if (ret) {	    krb5_free_principal(context, in.client);	    return ret;	}    }    flags.i = 0;    flags.b.renewable = flags.b.renew = 1;    /*     * Get template from old credential cache for the same entry, if     * this failes, no worries.     */    ret = krb5_get_credentials(context, KRB5_GC_CACHED, ccache, &in, &template);    if (ret == 0) {	flags.b.forwardable = template->flags.b.forwardable;	flags.b.proxiable = template->flags.b.proxiable;	krb5_free_creds (context, template);    }    ret = krb5_get_kdc_cred(context, ccache, flags, NULL, NULL, &in, &out);    krb5_free_principal(context, in.client);    krb5_free_principal(context, in.server);    if (ret)	return ret;    ret = krb5_copy_creds_contents(context, out, creds);    krb5_free_creds(context, out);    return ret;}

⌨️ 快捷键说明

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