📄 kcm.c
字号:
krb5_data response_data; ret = kcm_storage_request(context, KCM_OP_GET_PRINCIPAL, &request); if (ret) return ret; ret = krb5_store_stringz(request, k->name); if (ret) { krb5_storage_free(request); return ret; } ret = kcm_call(context, k, request, &response, &response_data); if (ret) { krb5_storage_free(request); return ret; } ret = krb5_ret_principal(response, principal); if (ret) ret = KRB5_CC_IO; krb5_storage_free(request); krb5_storage_free(response); krb5_data_free(&response_data); return ret;}/* * Request: * NameZ * * Response: * Cursor * */static krb5_error_codekcm_get_first (krb5_context context, krb5_ccache id, krb5_cc_cursor *cursor){ krb5_error_code ret; krb5_kcmcache *k = KCMCACHE(id); krb5_storage *request, *response; krb5_data response_data; int32_t tmp; ret = kcm_storage_request(context, KCM_OP_GET_FIRST, &request); if (ret) return ret; ret = krb5_store_stringz(request, k->name); if (ret) { krb5_storage_free(request); return ret; } ret = kcm_call(context, k, request, &response, &response_data); if (ret) { krb5_storage_free(request); return ret; } ret = krb5_ret_int32(response, &tmp); if (ret || tmp < 0) ret = KRB5_CC_IO; krb5_storage_free(request); krb5_storage_free(response); krb5_data_free(&response_data); if (ret) return ret; *cursor = malloc(sizeof(tmp)); if (*cursor == NULL) return KRB5_CC_NOMEM; KCMCURSOR(*cursor) = tmp; return 0;}/* * Request: * NameZ * Cursor * * Response: * Creds */static krb5_error_codekcm_get_next (krb5_context context, krb5_ccache id, krb5_cc_cursor *cursor, krb5_creds *creds){ krb5_error_code ret; krb5_kcmcache *k = KCMCACHE(id); krb5_storage *request, *response; krb5_data response_data; ret = kcm_storage_request(context, KCM_OP_GET_NEXT, &request); if (ret) return ret; ret = krb5_store_stringz(request, k->name); if (ret) { krb5_storage_free(request); return ret; } ret = krb5_store_int32(request, KCMCURSOR(*cursor)); if (ret) { krb5_storage_free(request); return ret; } ret = kcm_call(context, k, request, &response, &response_data); if (ret) { krb5_storage_free(request); return ret; } ret = krb5_ret_creds(response, creds); if (ret) ret = KRB5_CC_IO; krb5_storage_free(request); krb5_storage_free(response); krb5_data_free(&response_data); return ret;}/* * Request: * NameZ * Cursor * * Response: * */static krb5_error_codekcm_end_get (krb5_context context, krb5_ccache id, krb5_cc_cursor *cursor){ krb5_error_code ret; krb5_kcmcache *k = KCMCACHE(id); krb5_storage *request; ret = kcm_storage_request(context, KCM_OP_END_GET, &request); if (ret) return ret; ret = krb5_store_stringz(request, k->name); if (ret) { krb5_storage_free(request); return ret; } ret = krb5_store_int32(request, KCMCURSOR(*cursor)); if (ret) { krb5_storage_free(request); return ret; } ret = kcm_call(context, k, request, NULL, NULL); if (ret) { krb5_storage_free(request); return ret; } krb5_storage_free(request); KCMCURSOR(*cursor) = 0; free(*cursor); *cursor = NULL; return ret;}/* * Request: * NameZ * WhichFields * MatchCreds * * Response: * */static krb5_error_codekcm_remove_cred(krb5_context context, krb5_ccache id, krb5_flags which, krb5_creds *cred){ krb5_error_code ret; krb5_kcmcache *k = KCMCACHE(id); krb5_storage *request; ret = kcm_storage_request(context, KCM_OP_REMOVE_CRED, &request); if (ret) return ret; ret = krb5_store_stringz(request, k->name); if (ret) { krb5_storage_free(request); return ret; } ret = krb5_store_int32(request, which); if (ret) { krb5_storage_free(request); return ret; } ret = krb5_store_creds_tag(request, cred); if (ret) { krb5_storage_free(request); return ret; } ret = kcm_call(context, k, request, NULL, NULL); krb5_storage_free(request); return ret;}static krb5_error_codekcm_set_flags(krb5_context context, krb5_ccache id, krb5_flags flags){ krb5_error_code ret; krb5_kcmcache *k = KCMCACHE(id); krb5_storage *request; ret = kcm_storage_request(context, KCM_OP_SET_FLAGS, &request); if (ret) return ret; ret = krb5_store_stringz(request, k->name); if (ret) { krb5_storage_free(request); return ret; } ret = krb5_store_int32(request, flags); if (ret) { krb5_storage_free(request); return ret; } ret = kcm_call(context, k, request, NULL, NULL); krb5_storage_free(request); return ret;}static krb5_error_codekcm_get_version(krb5_context context, krb5_ccache id){ return 0;}static krb5_error_codekcm_move(krb5_context context, krb5_ccache from, krb5_ccache to){ krb5_set_error_string(context, "kcm_move not implemented"); return EINVAL;}static krb5_error_codekcm_default_name(krb5_context context, char **str){ return _krb5_expand_default_cc_name(context, KRB5_DEFAULT_CCNAME_KCM, str);}/** * Variable containing the KCM based credential cache implemention. * * @ingroup krb5_ccache */const krb5_cc_ops krb5_kcm_ops = { "KCM", kcm_get_name, kcm_resolve, kcm_gen_new, kcm_initialize, kcm_destroy, kcm_close, kcm_store_cred, kcm_retrieve, kcm_get_principal, kcm_get_first, kcm_get_next, kcm_end_get, kcm_remove_cred, kcm_set_flags, kcm_get_version, NULL, NULL, NULL, kcm_move, kcm_default_name};krb5_boolean_krb5_kcm_is_running(krb5_context context){ krb5_error_code ret; krb5_ccache_data ccdata; krb5_ccache id = &ccdata; krb5_boolean running; ret = kcm_alloc(context, NULL, &id); if (ret) return 0; running = (_krb5_kcm_noop(context, id) == 0); kcm_free(context, &id); return running;}/* * Request: * * Response: * */krb5_error_code_krb5_kcm_noop(krb5_context context, krb5_ccache id){ krb5_error_code ret; krb5_kcmcache *k = KCMCACHE(id); krb5_storage *request; ret = kcm_storage_request(context, KCM_OP_NOOP, &request); if (ret) return ret; ret = kcm_call(context, k, request, NULL, NULL); krb5_storage_free(request); return ret;}/* * Request: * NameZ * Mode * * Response: * */krb5_error_code_krb5_kcm_chmod(krb5_context context, krb5_ccache id, uint16_t mode){ krb5_error_code ret; krb5_kcmcache *k = KCMCACHE(id); krb5_storage *request; ret = kcm_storage_request(context, KCM_OP_CHMOD, &request); if (ret) return ret; ret = krb5_store_stringz(request, k->name); if (ret) { krb5_storage_free(request); return ret; } ret = krb5_store_int16(request, mode); if (ret) { krb5_storage_free(request); return ret; } ret = kcm_call(context, k, request, NULL, NULL); krb5_storage_free(request); return ret;}/* * Request: * NameZ * UID * GID * * Response: * */krb5_error_code_krb5_kcm_chown(krb5_context context, krb5_ccache id, uint32_t uid, uint32_t gid){ krb5_error_code ret; krb5_kcmcache *k = KCMCACHE(id); krb5_storage *request; ret = kcm_storage_request(context, KCM_OP_CHOWN, &request); if (ret) return ret; ret = krb5_store_stringz(request, k->name); if (ret) { krb5_storage_free(request); return ret; } ret = krb5_store_int32(request, uid); if (ret) { krb5_storage_free(request); return ret; } ret = krb5_store_int32(request, gid); if (ret) { krb5_storage_free(request); return ret; } ret = kcm_call(context, k, request, NULL, NULL); krb5_storage_free(request); return ret;}/* * Request: * NameZ * ServerPrincipalPresent * ServerPrincipal OPTIONAL * Key * * Repsonse: * */krb5_error_code_krb5_kcm_get_initial_ticket(krb5_context context, krb5_ccache id, krb5_principal server, krb5_keyblock *key){ krb5_error_code ret; krb5_kcmcache *k = KCMCACHE(id); krb5_storage *request; ret = kcm_storage_request(context, KCM_OP_GET_INITIAL_TICKET, &request); if (ret) return ret; ret = krb5_store_stringz(request, k->name); if (ret) { krb5_storage_free(request); return ret; } ret = krb5_store_int8(request, (server == NULL) ? 0 : 1); if (ret) { krb5_storage_free(request); return ret; } if (server != NULL) { ret = krb5_store_principal(request, server); if (ret) { krb5_storage_free(request); return ret; } } ret = krb5_store_keyblock(request, *key); if (ret) { krb5_storage_free(request); return ret; } ret = kcm_call(context, k, request, NULL, NULL); krb5_storage_free(request); return ret;}/* * Request: * NameZ * KDCFlags * EncryptionType * ServerPrincipal * * Repsonse: * */krb5_error_code_krb5_kcm_get_ticket(krb5_context context, krb5_ccache id, krb5_kdc_flags flags, krb5_enctype enctype, krb5_principal server){ krb5_error_code ret; krb5_kcmcache *k = KCMCACHE(id); krb5_storage *request; ret = kcm_storage_request(context, KCM_OP_GET_TICKET, &request); if (ret) return ret; ret = krb5_store_stringz(request, k->name); if (ret) { krb5_storage_free(request); return ret; } ret = krb5_store_int32(request, flags.i); if (ret) { krb5_storage_free(request); return ret; } ret = krb5_store_int32(request, enctype); if (ret) { krb5_storage_free(request); return ret; } ret = krb5_store_principal(request, server); if (ret) { krb5_storage_free(request); return ret; } ret = kcm_call(context, k, request, NULL, NULL); krb5_storage_free(request); return ret;}#endif /* HAVE_KCM */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -