Replace contents with keyvalue. Prepare for use of asn1-types.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@1890 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -4,15 +4,27 @@ RCSID("$Id$");
|
||||
|
||||
/* Public principal handling functions */
|
||||
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
#define num_components(P) ((P)->name.name_string.len)
|
||||
#define princ_type(P) ((P)->name.name_type)
|
||||
#else
|
||||
#define num_components(P) ((P)->ncomp)
|
||||
#define princ_type(P) ((P)->type)
|
||||
#endif
|
||||
|
||||
void
|
||||
krb5_free_principal(krb5_context context,
|
||||
krb5_principal p)
|
||||
{
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
free_Principal(p);
|
||||
#else
|
||||
int i;
|
||||
for(i = 0; i < p->ncomp; i++)
|
||||
for(i = 0; i < num_components(p); i++)
|
||||
krb5_data_free(&p->comp[i]);
|
||||
free(p->comp);
|
||||
krb5_data_free(&p->realm);
|
||||
#endif
|
||||
free(p);
|
||||
}
|
||||
|
||||
@@ -22,9 +34,14 @@ krb5_parse_name(krb5_context context,
|
||||
krb5_principal *principal)
|
||||
{
|
||||
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
general_string *comp;
|
||||
general_string realm;
|
||||
#else
|
||||
krb5_data *comp;
|
||||
int ncomp;
|
||||
krb5_data realm;
|
||||
#endif
|
||||
int ncomp;
|
||||
|
||||
char *p;
|
||||
char *q;
|
||||
@@ -45,7 +62,11 @@ krb5_parse_name(krb5_context context,
|
||||
} else if(*p == '/')
|
||||
ncomp++;
|
||||
}
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
comp = calloc(ncomp, sizeof(*comp));
|
||||
#else
|
||||
comp = ALLOC(ncomp, krb5_data);
|
||||
#endif
|
||||
|
||||
n = 0;
|
||||
start = q = p = s = strdup(name);
|
||||
@@ -63,15 +84,27 @@ krb5_parse_name(krb5_context context,
|
||||
c = '\0';
|
||||
}else if(c == '/' || c == '@'){
|
||||
if(got_realm){
|
||||
while(n>0)
|
||||
exit:
|
||||
while(n>0){
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
free(comp[--n]);
|
||||
#else
|
||||
free(comp[--n].data);
|
||||
#endif
|
||||
}
|
||||
free(comp);
|
||||
free(s);
|
||||
return KRB5_PARSE_MALFORMED;
|
||||
}else{
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
comp[n] = malloc(q - start + 1);
|
||||
strncpy(comp[n], start, q - start);
|
||||
comp[n][q - start] = 0;
|
||||
#else
|
||||
comp[n].length = q - start;
|
||||
comp[n].data = (krb5_pointer)malloc(comp[n].length);
|
||||
memmove(comp[n].data, start, comp[n].length);
|
||||
#endif
|
||||
n++;
|
||||
}
|
||||
if(c == '@')
|
||||
@@ -79,30 +112,42 @@ krb5_parse_name(krb5_context context,
|
||||
start = q;
|
||||
continue;
|
||||
}
|
||||
if(got_realm && (c == ':' || c == '/' || c == '\0')){
|
||||
while(n>0)
|
||||
free(comp[--n].data);
|
||||
free(comp);
|
||||
free(s);
|
||||
return KRB5_PARSE_MALFORMED;
|
||||
}
|
||||
if(got_realm && (c == ':' || c == '/' || c == '\0'))
|
||||
goto exit;
|
||||
*q++ = c;
|
||||
}
|
||||
if(got_realm){
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
realm = malloc(q - start + 1);
|
||||
strncpy(realm, start, q - start);
|
||||
realm[q - start] = 0;
|
||||
#else
|
||||
realm.length = q - start;
|
||||
realm.data = (krb5_pointer)malloc(realm.length);
|
||||
memmove(realm.data, start, realm.length);
|
||||
#endif
|
||||
}else{
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
comp[n] = malloc(q - start + 1);
|
||||
strncpy(comp[n], start, q - start);
|
||||
comp[n][q - start] = 0;
|
||||
#else
|
||||
comp[n].length = q - start;
|
||||
comp[n].data = (krb5_pointer)malloc(comp[n].length);
|
||||
memmove(comp[n].data, start, comp[n].length);
|
||||
#endif
|
||||
n++;
|
||||
}
|
||||
*principal = ALLOC(1, krb5_principal_data);
|
||||
*principal = malloc(sizeof(**principal));
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
(*principal)->name.name_type = KRB5_NT_PRINCIPAL;
|
||||
(*principal)->name.name_string.val = comp;
|
||||
#else
|
||||
(*principal)->type = KRB5_NT_PRINCIPAL;
|
||||
(*principal)->realm = realm;
|
||||
(*principal)->comp = comp;
|
||||
(*principal)->ncomp = n;
|
||||
#endif
|
||||
num_components(*principal) = n;
|
||||
(*principal)->realm = realm;
|
||||
free(s);
|
||||
return 0;
|
||||
}
|
||||
@@ -112,6 +157,9 @@ static void quote_string(char *s, int len, char **out)
|
||||
char *q;
|
||||
char *p = *out;
|
||||
int c=0;
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
len = strlen(s);
|
||||
#endif
|
||||
for(q = s; q < s + len; q++){
|
||||
if(*q == '\n')
|
||||
c = 'n';
|
||||
@@ -141,24 +189,40 @@ krb5_unparse_name(krb5_context context,
|
||||
krb5_principal principal,
|
||||
char **name)
|
||||
{
|
||||
int size = 0;
|
||||
int size;
|
||||
char *p;
|
||||
char *s;
|
||||
int i;
|
||||
for(i = 0; i < principal->ncomp; i++)
|
||||
size += 2*principal->comp[i].length + 1;
|
||||
size += 2*principal->realm.length + 1;
|
||||
s = ALLOC(size, char);
|
||||
int ncomp = num_components(principal);
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
size = 2 * strlen(principal->realm) + 1;
|
||||
for (i = 0; i < ncomp; i++)
|
||||
size += 2 * strlen(principal->name.name_string.val[i]) + 1;
|
||||
#else
|
||||
size = 2 * principal->realm.length + 1;
|
||||
for(i = 0; i < ncomp; i++)
|
||||
size += 2 * principal->comp[i].length + 1;
|
||||
#endif
|
||||
s = malloc(size);
|
||||
p = s;
|
||||
for(i = 0; i < principal->ncomp; i++){
|
||||
for(i = 0; i < ncomp; i++){
|
||||
if(i) *p++ = '/';
|
||||
quote_string(principal->comp[i].data, principal->comp[i].length, &p);
|
||||
quote_string(
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
principal->name.name_string.val[i], 0,
|
||||
#else
|
||||
principal->comp[i].data, principal->comp[i].length,
|
||||
#endif
|
||||
&p);
|
||||
}
|
||||
*p++ = '@';
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
quote_string(principal->realm, 0, &p);
|
||||
#else
|
||||
quote_string(principal->realm.data, principal->realm.length, &p);
|
||||
#endif
|
||||
*p = 0;
|
||||
*name = strdup(s);
|
||||
free(s);
|
||||
*name = s;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -174,7 +238,7 @@ krb5_unparse_name_ext(krb5_context context,
|
||||
}
|
||||
|
||||
|
||||
krb5_data*
|
||||
krb5_realm*
|
||||
krb5_princ_realm(krb5_context context,
|
||||
krb5_principal principal)
|
||||
{
|
||||
@@ -185,7 +249,7 @@ krb5_princ_realm(krb5_context context,
|
||||
void
|
||||
krb5_princ_set_realm(krb5_context context,
|
||||
krb5_principal principal,
|
||||
krb5_data *realm)
|
||||
krb5_realm *realm)
|
||||
{
|
||||
principal->realm = *realm;
|
||||
}
|
||||
@@ -210,21 +274,36 @@ krb5_error_code
|
||||
krb5_principal_set_component(krb5_context context, krb5_principal p,
|
||||
int n, void *data, size_t len)
|
||||
{
|
||||
krb5_data *tmp;
|
||||
if(p->ncomp <= n){
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
general_string *tmp = p->name.name_string.val;
|
||||
#else
|
||||
krb5_data *tmp = p->comp;
|
||||
#endif
|
||||
if(num_components(p) <= n){
|
||||
int s = n + 10;
|
||||
if(p->comp)
|
||||
tmp = (krb5_data*)realloc(p->comp, s * sizeof(krb5_data));
|
||||
else
|
||||
tmp = ALLOC(s, krb5_data);
|
||||
tmp = realloc(tmp, s * sizeof(*tmp));
|
||||
if(!tmp)
|
||||
return ENOMEM;
|
||||
memset(tmp + num_components(p), 0,
|
||||
(s - num_components(p)) * sizeof(*tmp));
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
p->name.name_string.val = tmp;
|
||||
#else
|
||||
p->comp = tmp;
|
||||
p->ncomp = s;
|
||||
#endif
|
||||
num_components(p)= s;
|
||||
}
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
if(p->name.name_string.val[n])
|
||||
free(p->name.name_string.val[n]);
|
||||
p->name.name_string.val[n] = malloc(len + 1);
|
||||
strncpy(p->name.name_string.val[n], data, len);
|
||||
p->name.name_string.val[n][len] = 0;
|
||||
#else
|
||||
p->comp[n].length = 0;
|
||||
p->comp[n].data = NULL;
|
||||
krb5_data_copy(&p->comp[n], data, len);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -242,7 +321,7 @@ va_ext_princ(krb5_context context, krb5_principal p, va_list ap)
|
||||
krb5_principal_set_component(context, p, n, s, len);
|
||||
n++;
|
||||
}
|
||||
p->ncomp = n;
|
||||
num_components(p) = n;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -259,7 +338,7 @@ va_princ(krb5_context context, krb5_principal p, va_list ap)
|
||||
krb5_principal_set_component(context, p, n, s, len);
|
||||
n++;
|
||||
}
|
||||
p->ncomp = n;
|
||||
num_components(p) = n;
|
||||
}
|
||||
|
||||
|
||||
@@ -277,12 +356,20 @@ build_principal(krb5_context context,
|
||||
p = calloc(1, sizeof(*p));
|
||||
if (p == NULL)
|
||||
return ENOMEM;
|
||||
p->type = KRB5_NT_PRINCIPAL;
|
||||
princ_type(p) = KRB5_NT_PRINCIPAL;
|
||||
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
p->realm = strdup(realm);
|
||||
if(p->realm == NULL){
|
||||
free(p);
|
||||
return ENOMEM;
|
||||
}
|
||||
#else
|
||||
if(krb5_data_copy(&p->realm, (void*)realm, rlen)){
|
||||
free(p);
|
||||
return ENOMEM;
|
||||
}
|
||||
#endif
|
||||
|
||||
(*func)(context, p, ap);
|
||||
*principal = p;
|
||||
@@ -337,7 +424,11 @@ krb5_copy_principal(krb5_context context,
|
||||
p = calloc(1, sizeof(*p));
|
||||
if (p == NULL)
|
||||
return ENOMEM;
|
||||
p->type = inprinc->type;
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
copy_PrincipalName(&inprinc->name, &p->name);
|
||||
copy_Realm(&inprinc->realm, &p->realm);
|
||||
#else
|
||||
princ_type(p) = princ_type(inprinc);
|
||||
if(krb5_data_copy(&p->realm, inprinc->realm.data, inprinc->realm.length)){
|
||||
krb5_free_principal(context, p);
|
||||
return ENOMEM;
|
||||
@@ -357,6 +448,7 @@ krb5_copy_principal(krb5_context context,
|
||||
}
|
||||
p->ncomp = i+1;
|
||||
}
|
||||
#endif
|
||||
*outprinc = p;
|
||||
return 0;
|
||||
}
|
||||
@@ -370,14 +462,20 @@ krb5_principal_compare(krb5_context context,
|
||||
int i;
|
||||
if(!krb5_realm_compare(context, princ1, princ2))
|
||||
return FALSE;
|
||||
if(princ1->ncomp != princ2->ncomp)
|
||||
if(num_components(princ1) != num_components(princ2))
|
||||
return FALSE;
|
||||
for(i=0; i<princ1->ncomp; i++){
|
||||
for(i = 0; i < num_components(princ1); i++){
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
if(strcmp(princ1->name.name_string.val[i],
|
||||
princ2->name.name_string.val[i]) != 0)
|
||||
return FALSE;
|
||||
#else
|
||||
if(princ1->comp[i].length != princ2->comp[i].length)
|
||||
return FALSE;
|
||||
if(memcmp(princ1->comp[i].data, princ2->comp[i].data,
|
||||
princ1->comp[i].length))
|
||||
return FALSE;
|
||||
#endif
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
@@ -388,11 +486,15 @@ krb5_realm_compare(krb5_context context,
|
||||
krb5_const_principal princ1,
|
||||
krb5_const_principal princ2)
|
||||
{
|
||||
#ifdef USE_ASN1_PRINCIPAL
|
||||
return strcmp(princ1->realm, princ2->realm) == 0;
|
||||
#else
|
||||
if(princ1->realm.length != princ2->realm.length)
|
||||
return FALSE;
|
||||
if(memcmp(princ1->realm.data, princ2->realm.data, princ1->realm.length))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user