📄 get_cred.c
字号:
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 + -