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

📄 principal.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -