static krb5_error_code fcc_get_cache_next(krb5_context context, krb5_cc_cursor cursor, krb5_ccache *id) { struct fcache_iter *iter = cursor; krb5_error_code ret; const char *fn; char *expandedfn = NULL; if (!iter->first) { krb5_clear_error_message(context); return KRB5_CC_END; } iter->first = 0; fn = krb5_cc_default_name(context); if (fn == NULL || strncasecmp(fn, "FILE:", 5) != 0) { ret = _krb5_expand_default_cc_name(context, KRB5_DEFAULT_CCNAME_FILE, &expandedfn); if (ret) return ret; fn = expandedfn; } ret = krb5_cc_resolve(context, fn, id); if (expandedfn) free(expandedfn); return ret; }
static krb5_error_code fcc_get_default_name(krb5_context context, char **str) { return _krb5_expand_default_cc_name(context, KRB5_DEFAULT_CCNAME_FILE, str); }
static krb5_error_code kcm_get_default_name(krb5_context context, const krb5_cc_ops *ops, const char *defstr, char **str) { krb5_error_code ret; krb5_storage *request, *response; krb5_data response_data; char *name; *str = NULL; ret = krb5_kcm_storage_request(context, KCM_OP_GET_DEFAULT_CACHE, &request); if (ret) return ret; ret = krb5_kcm_call(context, request, &response, &response_data); krb5_storage_free(request); if (ret) return _krb5_expand_default_cc_name(context, defstr, str); ret = krb5_ret_stringz(response, &name); krb5_storage_free(response); krb5_data_free(&response_data); if (ret) return ret; asprintf(str, "%s:%s", ops->prefix, name); free(name); if (str == NULL) return ENOMEM; return 0; }
static void test_def_cc_name(krb5_context context) { krb5_error_code ret; char *str; int i; for (i = 0; i < sizeof(cc_names)/sizeof(cc_names[0]); i++) { ret = _krb5_expand_default_cc_name(context, cc_names[i].str, &str); if (ret) { if (cc_names[i].fail == 0) krb5_errx(context, 1, "test %d \"%s\" failed", i, cc_names[i].str); } else { if (cc_names[i].fail) krb5_errx(context, 1, "test %d \"%s\" was successful", i, cc_names[i].str); if (cc_names[i].res && strcmp(cc_names[i].res, str) != 0) krb5_errx(context, 1, "test %d %s != %s", i, cc_names[i].res, str); #if 0 printf("%s => %s\n", cc_names[i].str, str); #endif free(str); } } }
static krb5_scache * KRB5_CALLCONV scc_alloc(krb5_context context, const char *name) { krb5_error_code ret; krb5_scache *s; ALLOC(s, 1); if(s == NULL) return NULL; s->cid = SCACHE_INVALID_CID; if (name) { char *file; if (*name == '\0') { krb5_error_code ret; ret = get_def_name(context, &s->name); if (ret) s->name = strdup(SCACHE_DEF_NAME); } else s->name = strdup(name); file = strrchr(s->name, ':'); if (file) { *file++ = '\0'; s->file = strdup(file); ret = 0; } else { ret = _krb5_expand_default_cc_name(context, KRB5_SCACHE_DB, &s->file); } } else { _krb5_expand_default_cc_name(context, KRB5_SCACHE_DB, &s->file); ret = asprintf(&s->name, "unique-%p", s); } if (ret < 0 || s->file == NULL || s->name == NULL) { scc_free(s); return NULL; } return s; }
static krb5_error_code KRB5_CALLCONV scc_get_default_name(krb5_context context, char **str) { krb5_error_code ret; char *name; *str = NULL; ret = get_def_name(context, &name); if (ret) return _krb5_expand_default_cc_name(context, KRB5_SCACHE_NAME, str); ret = asprintf(str, "SCC:%s", name); free(name); if (ret < 0 || *str == NULL) return krb5_enomem(context); return 0; }
static krb5_error_code KRB5_CALLCONV scc_get_default_name(krb5_context context, char **str) { krb5_error_code ret; char *name; *str = NULL; ret = get_def_name(context, &name); if (ret) return _krb5_expand_default_cc_name(context, KRB5_SCACHE_NAME, str); ret = asprintf(str, "SCC:%s", name); free(name); if (ret < 0 || *str == NULL) { krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); return ENOMEM; } return 0; }
static krb5_error_code default_db(krb5_context context, sqlite3 **db) { char *name; int ret; ret = _krb5_expand_default_cc_name(context, KRB5_SCACHE_DB, &name); if (ret) return ret; ret = sqlite3_open_v2(name, db, SQLITE_OPEN_READWRITE, NULL); free(name); if (ret != SQLITE_OK) { krb5_clear_error_message(context); return ENOENT; } #ifdef TRACEME sqlite3_trace(*db, trace, NULL); #endif return 0; }
static krb5_error_code KRB5_CALLCONV get_default_name(krb5_context context, const krb5_cc_ops *ops, const char *cachename, char **str) { CFUUIDRef uuid = NULL; CFUUIDBytes bytes; uuid = HeimCredCopyDefaultCredential(kHEIMTypeKerberos, NULL); if (uuid == NULL) { return _krb5_expand_default_cc_name(context, cachename, str); } bytes = CFUUIDGetUUIDBytes(uuid); char uuidstr[37]; uuid_unparse((void *)&bytes, uuidstr); CFRELEASE_NULL(uuid); asprintf(str, "%s:%s", ops->prefix, uuidstr); return 0; }