📄 principal.c
字号:
plen = strlen(princ_realm(principal)); if(strcspn(princ_realm(principal), quotable_chars) == plen) len += plen; else len += 2*plen; len++; /* '@' */ } for(i = 0; i < princ_num_comp(principal); i++){ plen = strlen(princ_ncomp(principal, i)); if(strcspn(princ_ncomp(principal, i), quotable_chars) == plen) len += plen; else len += 2*plen; len++; } len++; /* '\0' */ *name = malloc(len); if(*name == NULL) { krb5_set_error_string (context, "malloc: out of memory"); return ENOMEM; } ret = unparse_name_fixed(context, principal, *name, len, flags); if(ret) { free(*name); *name = NULL; } return ret;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_unparse_name(krb5_context context, krb5_const_principal principal, char **name){ return unparse_name(context, principal, name, 0);}krb5_error_code KRB5_LIB_FUNCTIONkrb5_unparse_name_flags(krb5_context context, krb5_const_principal principal, int flags, char **name){ return unparse_name(context, principal, name, flags);}krb5_error_code KRB5_LIB_FUNCTIONkrb5_unparse_name_short(krb5_context context, krb5_const_principal principal, char **name){ return unparse_name(context, principal, name, KRB5_PRINCIPAL_UNPARSE_SHORT);}#if 0 /* not implemented */krb5_error_code KRB5_LIB_FUNCTIONkrb5_unparse_name_ext(krb5_context context, krb5_const_principal principal, char **name, size_t *size){ krb5_abortx(context, "unimplemented krb5_unparse_name_ext called");}#endifkrb5_realm * KRB5_LIB_FUNCTIONkrb5_princ_realm(krb5_context context, krb5_principal principal){ return &princ_realm(principal);}void KRB5_LIB_FUNCTIONkrb5_princ_set_realm(krb5_context context, krb5_principal principal, krb5_realm *realm){ princ_realm(principal) = *realm;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_build_principal(krb5_context context, krb5_principal *principal, int rlen, krb5_const_realm realm, ...){ krb5_error_code ret; va_list ap; va_start(ap, realm); ret = krb5_build_principal_va(context, principal, rlen, realm, ap); va_end(ap); return ret;}static krb5_error_codeappend_component(krb5_context context, krb5_principal p, const char *comp, size_t comp_len){ heim_general_string *tmp; size_t len = princ_num_comp(p); tmp = realloc(princ_comp(p), (len + 1) * sizeof(*tmp)); if(tmp == NULL) { krb5_set_error_string (context, "malloc: out of memory"); return ENOMEM; } princ_comp(p) = tmp; princ_ncomp(p, len) = malloc(comp_len + 1); if (princ_ncomp(p, len) == NULL) { krb5_set_error_string (context, "malloc: out of memory"); return ENOMEM; } memcpy (princ_ncomp(p, len), comp, comp_len); princ_ncomp(p, len)[comp_len] = '\0'; princ_num_comp(p)++; return 0;}static voidva_ext_princ(krb5_context context, krb5_principal p, va_list ap){ while(1){ const char *s; int len; len = va_arg(ap, int); if(len == 0) break; s = va_arg(ap, const char*); append_component(context, p, s, len); }}static voidva_princ(krb5_context context, krb5_principal p, va_list ap){ while(1){ const char *s; s = va_arg(ap, const char*); if(s == NULL) break; append_component(context, p, s, strlen(s)); }}static krb5_error_codebuild_principal(krb5_context context, krb5_principal *principal, int rlen, krb5_const_realm realm, void (*func)(krb5_context, krb5_principal, va_list), va_list ap){ krb5_principal p; p = calloc(1, sizeof(*p)); if (p == NULL) { krb5_set_error_string (context, "malloc: out of memory"); return ENOMEM; } princ_type(p) = KRB5_NT_PRINCIPAL; princ_realm(p) = strdup(realm); if(p->realm == NULL){ free(p); krb5_set_error_string (context, "malloc: out of memory"); return ENOMEM; } (*func)(context, p, ap); *principal = p; return 0;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_make_principal(krb5_context context, krb5_principal *principal, krb5_const_realm realm, ...){ krb5_error_code ret; krb5_realm r = NULL; va_list ap; if(realm == NULL) { ret = krb5_get_default_realm(context, &r); if(ret) return ret; realm = r; } va_start(ap, realm); ret = krb5_build_principal_va(context, principal, strlen(realm), realm, ap); va_end(ap); if(r) free(r); return ret;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_build_principal_va(krb5_context context, krb5_principal *principal, int rlen, krb5_const_realm realm, va_list ap){ return build_principal(context, principal, rlen, realm, va_princ, ap);}krb5_error_code KRB5_LIB_FUNCTIONkrb5_build_principal_va_ext(krb5_context context, krb5_principal *principal, int rlen, krb5_const_realm realm, va_list ap){ return build_principal(context, principal, rlen, realm, va_ext_princ, ap);}krb5_error_code KRB5_LIB_FUNCTIONkrb5_build_principal_ext(krb5_context context, krb5_principal *principal, int rlen, krb5_const_realm realm, ...){ krb5_error_code ret; va_list ap; va_start(ap, realm); ret = krb5_build_principal_va_ext(context, principal, rlen, realm, ap); va_end(ap); return ret;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_copy_principal(krb5_context context, krb5_const_principal inprinc, krb5_principal *outprinc){ krb5_principal p = malloc(sizeof(*p)); if (p == NULL) { krb5_set_error_string (context, "malloc: out of memory"); return ENOMEM; } if(copy_Principal(inprinc, p)) { free(p); krb5_set_error_string (context, "malloc: out of memory"); return ENOMEM; } *outprinc = p; return 0;}/* * return TRUE iff princ1 == princ2 (without considering the realm) */krb5_boolean KRB5_LIB_FUNCTIONkrb5_principal_compare_any_realm(krb5_context context, krb5_const_principal princ1, krb5_const_principal princ2){ int i; if(princ_num_comp(princ1) != princ_num_comp(princ2)) return FALSE; for(i = 0; i < princ_num_comp(princ1); i++){ if(strcmp(princ_ncomp(princ1, i), princ_ncomp(princ2, i)) != 0) return FALSE; } return TRUE;}/* * return TRUE iff princ1 == princ2 */krb5_boolean KRB5_LIB_FUNCTIONkrb5_principal_compare(krb5_context context, krb5_const_principal princ1, krb5_const_principal princ2){ if(!krb5_realm_compare(context, princ1, princ2)) return FALSE; return krb5_principal_compare_any_realm(context, princ1, princ2);}/* * return TRUE iff realm(princ1) == realm(princ2) */krb5_boolean KRB5_LIB_FUNCTIONkrb5_realm_compare(krb5_context context, krb5_const_principal princ1, krb5_const_principal princ2){ return strcmp(princ_realm(princ1), princ_realm(princ2)) == 0;}/* * return TRUE iff princ matches pattern */krb5_boolean KRB5_LIB_FUNCTIONkrb5_principal_match(krb5_context context, krb5_const_principal princ, krb5_const_principal pattern){ int i; if(princ_num_comp(princ) != princ_num_comp(pattern)) return FALSE; if(fnmatch(princ_realm(pattern), princ_realm(princ), 0) != 0) return FALSE; for(i = 0; i < princ_num_comp(princ); i++){ if(fnmatch(princ_ncomp(pattern, i), princ_ncomp(princ, i), 0) != 0) return FALSE; } return TRUE;}static struct v4_name_convert { const char *from; const char *to; } default_v4_name_convert[] = { { "ftp", "ftp" }, { "hprop", "hprop" }, { "pop", "pop" }, { "imap", "imap" }, { "rcmd", "host" }, { "smtp", "smtp" }, { NULL, NULL }};/* * return the converted instance name of `name' in `realm'. * look in the configuration file and then in the default set above. * return NULL if no conversion is appropriate. */static const char*get_name_conversion(krb5_context context, const char *realm, const char *name){ struct v4_name_convert *q; const char *p; p = krb5_config_get_string(context, NULL, "realms", realm, "v4_name_convert", "host", name, NULL); if(p == NULL) p = krb5_config_get_string(context, NULL, "libdefaults", "v4_name_convert", "host", name, NULL); if(p) return p; /* XXX should be possible to override default list */ p = krb5_config_get_string(context, NULL, "realms", realm, "v4_name_convert", "plain", name, NULL); if(p) return NULL; p = krb5_config_get_string(context, NULL, "libdefaults", "v4_name_convert", "plain", name, NULL); if(p) return NULL; for(q = default_v4_name_convert; q->from; q++) if(strcmp(q->from, name) == 0) return q->to; return NULL;}/* * convert the v4 principal `name.instance@realm' to a v5 principal in `princ'. * if `resolve', use DNS. * if `func', use that function for validating the conversion */krb5_error_code KRB5_LIB_FUNCTIONkrb5_425_conv_principal_ext2(krb5_context context, const char *name, const char *instance, const char *realm, krb5_boolean (*func)(krb5_context, void *, krb5_principal), void *funcctx, krb5_boolean resolve, krb5_principal *princ){ const char *p; krb5_error_code ret; krb5_principal pr; char host[MAXHOSTNAMELEN]; char local_hostname[MAXHOSTNAMELEN]; /* do the following: if the name is found in the `v4_name_convert:host' part, is assumed to be a `host' type principal, and the instance is looked up in the `v4_instance_convert' part. if not found there the name is (optionally) looked up as a hostname, and if that doesn't yield anything, the `default_domain' is appended to the instance */ if(instance == NULL) goto no_host; if(instance[0] == 0){ instance = NULL; goto no_host; } p = get_name_conversion(context, realm, name); if(p == NULL) goto no_host; name = p; p = krb5_config_get_string(context, NULL, "realms", realm, "v4_instance_convert", instance, NULL); if(p){ instance = p;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -