krb5: consolidate cc_ops enumeration
Consolidate the enumeration of the cc_ops table by using cc_get_prefix_ops() (a variant of krb5_cc_get_prefix_ops that also returns the residual).
This commit is contained in:
		
							
								
								
									
										145
									
								
								lib/krb5/cache.c
									
									
									
									
									
								
							
							
						
						
									
										145
									
								
								lib/krb5/cache.c
									
									
									
									
									
								
							| @@ -100,6 +100,11 @@ main (int argc, char **argv) | ||||
| * @endcode | ||||
| */ | ||||
|  | ||||
| static const krb5_cc_ops * | ||||
| cc_get_prefix_ops(krb5_context context, | ||||
| 		  const char *prefix, | ||||
| 		  const char **residual); | ||||
|  | ||||
| /** | ||||
|  * Add a new ccache type with operations `ops', overwriting any | ||||
|  * existing one if `override'. | ||||
| @@ -235,21 +240,16 @@ krb5_cc_resolve(krb5_context context, | ||||
| 		const char *name, | ||||
| 		krb5_ccache *id) | ||||
| { | ||||
|     int i; | ||||
|     const krb5_cc_ops *ops; | ||||
|     const char *residual = NULL; | ||||
|  | ||||
|     *id = NULL; | ||||
|  | ||||
|     for(i = 0; i < context->num_cc_ops && context->cc_ops[i]->prefix; i++) { | ||||
| 	size_t prefix_len = strlen(context->cc_ops[i]->prefix); | ||||
|     ops = cc_get_prefix_ops(context, name, &residual); | ||||
|     if (ops == NULL) | ||||
| 	ops = &krb5_fcc_ops; /* residual will point to name */ | ||||
|  | ||||
| 	if(strncmp(context->cc_ops[i]->prefix, name, prefix_len) == 0 | ||||
| 	   && name[prefix_len] == ':') { | ||||
| 	    return allocate_ccache (context, context->cc_ops[i], | ||||
| 				    name + prefix_len + 1, NULL, | ||||
| 				    id); | ||||
| 	} | ||||
|     } | ||||
|     return allocate_ccache(context, &krb5_fcc_ops, name, NULL, id); | ||||
|     return allocate_ccache(context, ops, residual, NULL, id); | ||||
| } | ||||
|  | ||||
| #ifdef _WIN32 | ||||
| @@ -299,25 +299,17 @@ get_default_cc_type(krb5_context context, int simple) | ||||
|     const char *def_cccol = | ||||
|         krb5_config_get_string(context, NULL, "libdefaults", | ||||
|                                "default_cc_collection", NULL); | ||||
|     size_t i; | ||||
|     const krb5_cc_ops *ops; | ||||
|  | ||||
|     if (!simple && (def_ccname = krb5_cc_default_name(context))) { | ||||
|         for (i = 0; i < context->num_cc_ops && context->cc_ops[i]->prefix; i++) { | ||||
|             size_t prefix_len = strlen(context->cc_ops[i]->prefix); | ||||
|  | ||||
|             if (!strncmp(context->cc_ops[i]->prefix, def_ccname, prefix_len) && | ||||
|                 def_ccname[prefix_len] == ':') | ||||
|                 return context->cc_ops[i]->prefix; | ||||
|         } | ||||
| 	ops = cc_get_prefix_ops(context, def_ccname, NULL); | ||||
| 	if (ops) | ||||
| 	    return ops->prefix; | ||||
|     } | ||||
|     if (!def_cctype && def_cccol) { | ||||
|         for (i = 0; i < context->num_cc_ops && context->cc_ops[i]->prefix; i++) { | ||||
|             size_t prefix_len = strlen(context->cc_ops[i]->prefix); | ||||
|  | ||||
|             if (!strncmp(context->cc_ops[i]->prefix, def_cccol, prefix_len) && | ||||
|                 def_cccol[prefix_len] == ':') | ||||
|                 return context->cc_ops[i]->prefix; | ||||
|         } | ||||
| 	ops = cc_get_prefix_ops(context, def_cccol, NULL); | ||||
| 	if (ops) | ||||
| 	    return ops->prefix; | ||||
|     } | ||||
| #ifdef _WIN32 | ||||
|     if (def_cctype == NULL) | ||||
| @@ -352,49 +344,24 @@ krb5_cc_resolve_sub(krb5_context context, | ||||
|                     const char *subsidiary, | ||||
|                     krb5_ccache *id) | ||||
| { | ||||
|     size_t i; | ||||
|     const krb5_cc_ops *ops = NULL; | ||||
|  | ||||
|     *id = NULL; | ||||
|  | ||||
|     if (!cctype && collection) { | ||||
|         /* Get the cctype from the collection, maybe */ | ||||
|         for (i = 0; i < context->num_cc_ops && context->cc_ops[i]->prefix; i++) { | ||||
|             size_t plen = strlen(context->cc_ops[i]->prefix); | ||||
|     /* Get the cctype from the collection, maybe */ | ||||
|     if (cctype == NULL && collection) | ||||
| 	ops = cc_get_prefix_ops(context, collection, &collection); | ||||
|  | ||||
|             if ((strncmp(context->cc_ops[i]->prefix, collection, plen) || | ||||
|                  collection[plen] != ':')) | ||||
|                 continue; | ||||
|             cctype = context->cc_ops[i]->prefix; | ||||
|             collection += plen + 1; | ||||
|             break; | ||||
|         } | ||||
|     if (ops == NULL) | ||||
| 	ops = cc_get_prefix_ops(context, get_default_cc_type(context, 0), NULL); | ||||
|  | ||||
|     if (ops == NULL) { | ||||
| 	krb5_set_error_message(context, KRB5_CC_UNKNOWN_TYPE, | ||||
| 			       N_("unknown ccache type %s", ""), cctype); | ||||
| 	return KRB5_CC_UNKNOWN_TYPE; | ||||
|     } | ||||
|  | ||||
|     if (!cctype) | ||||
|         cctype = get_default_cc_type(context, 0); | ||||
|  | ||||
|     /* If either `cctype' is not NULL or `collection' starts with TYPE: */ | ||||
|     if (cctype || collection) { | ||||
|         for (i = 0; i < context->num_cc_ops && context->cc_ops[i]->prefix; i++) { | ||||
|             size_t plen = strlen(context->cc_ops[i]->prefix); | ||||
|  | ||||
|             if (cctype && strcmp(context->cc_ops[i]->prefix, cctype)) | ||||
|                 continue; | ||||
|             if (!cctype && | ||||
|                 (strncmp(context->cc_ops[i]->prefix, collection, plen) || | ||||
|                  collection[plen] != ':')) | ||||
|                 continue; | ||||
|  | ||||
|             return allocate_ccache(context, context->cc_ops[i], | ||||
|                                    cctype ? collection : collection + plen + 1, | ||||
|                                    subsidiary, id); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     krb5_set_error_message(context, KRB5_CC_UNKNOWN_TYPE, | ||||
|                            N_("unknown ccache type %s", ""), | ||||
|                            cctype ? cctype : collection); | ||||
|     return KRB5_CC_UNKNOWN_TYPE; | ||||
|     return allocate_ccache(context, ops, collection, subsidiary, id); | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -1402,9 +1369,35 @@ krb5_cc_clear_mcred(krb5_creds *mcred) | ||||
| KRB5_LIB_FUNCTION const krb5_cc_ops * KRB5_LIB_CALL | ||||
| krb5_cc_get_prefix_ops(krb5_context context, const char *prefix) | ||||
| { | ||||
|     char *p, *p1; | ||||
|     return cc_get_prefix_ops(context, prefix, NULL); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Get the cc ops that is registered in `context' to handle the | ||||
|  * prefix. prefix can be a complete credential cache name or a | ||||
|  * prefix, the function will only use part up to the first colon (:) | ||||
|  * if there is one. If prefix the argument is NULL, the default ccache | ||||
|  * implementation is returned. | ||||
|  * | ||||
|  * If residual is non-NULL, it is set to the residual component of | ||||
|  * prefix (if present) or the prefix itself. | ||||
|  * | ||||
|  * @return Returns NULL if ops not found. | ||||
|  * | ||||
|  * @ingroup krb5_ccache | ||||
|  */ | ||||
|  | ||||
|  | ||||
| static const krb5_cc_ops * | ||||
| cc_get_prefix_ops(krb5_context context, | ||||
| 		  const char *prefix, | ||||
| 		  const char **residual) | ||||
| { | ||||
|     int i; | ||||
|  | ||||
|     if (residual) | ||||
| 	*residual = prefix; | ||||
|  | ||||
|     if (prefix == NULL) | ||||
| 	return KRB5_DEFAULT_CCTYPE; | ||||
|  | ||||
| @@ -1418,22 +1411,22 @@ krb5_cc_get_prefix_ops(krb5_context context, const char *prefix) | ||||
| 	return &krb5_fcc_ops; | ||||
| #endif | ||||
|  | ||||
|     p = strdup(prefix); | ||||
|     if (p == NULL) { | ||||
| 	krb5_enomem(context); | ||||
| 	return NULL; | ||||
|     } | ||||
|     p1 = strchr(p, ':'); | ||||
|     if (p1) | ||||
| 	*p1 = '\0'; | ||||
|  | ||||
|     for(i = 0; i < context->num_cc_ops && context->cc_ops[i]->prefix; i++) { | ||||
| 	if(strcmp(context->cc_ops[i]->prefix, p) == 0) { | ||||
| 	    free(p); | ||||
| 	size_t prefix_len = strlen(context->cc_ops[i]->prefix); | ||||
|  | ||||
| 	if (strncmp(context->cc_ops[i]->prefix, prefix, prefix_len) == 0 && | ||||
| 	    (prefix[prefix_len] == ':' || prefix[prefix_len] == '\0')) { | ||||
| 	    if (residual) { | ||||
| 		if (prefix[prefix_len] == ':' && prefix[prefix_len + 1] != '\0') | ||||
| 		    *residual = &prefix[prefix_len + 1]; | ||||
| 		else | ||||
| 		    *residual = NULL; | ||||
| 	    } | ||||
|  | ||||
| 	    return context->cc_ops[i]; | ||||
| 	} | ||||
|     } | ||||
|     free(p); | ||||
|  | ||||
|     return NULL; | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Luke Howard
					Luke Howard