RADIUS server: Accept ERP keyName-NAI as user identity
Previously the EAP user database had to include a wildcard entry for ERP to work since the keyName-NAI as User-Name in Access-Request would not be recognized without such wildcard entry (that could point to any EAP method). This is not ideal, so add a separate check to allow any stored ERP keyName-NAI to be used for ERP without any requirement for the EAP user database to contain a matching entry. Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
This commit is contained in:
		
							parent
							
								
									8f5b1c40bd
								
							
						
					
					
						commit
						3580ed8266
					
				
					 1 changed files with 31 additions and 8 deletions
				
			
		|  | @ -676,6 +676,23 @@ static void radius_server_testing_options(struct radius_session *sess, | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| #ifdef CONFIG_ERP | ||||
| static struct eap_server_erp_key * | ||||
| radius_server_erp_find_key(struct radius_server_data *data, const char *keyname) | ||||
| { | ||||
| 	struct eap_server_erp_key *erp; | ||||
| 
 | ||||
| 	dl_list_for_each(erp, &data->erp_keys, struct eap_server_erp_key, | ||||
| 			 list) { | ||||
| 		if (os_strcmp(erp->keyname_nai, keyname) == 0) | ||||
| 			return erp; | ||||
| 	} | ||||
| 
 | ||||
| 	return NULL; | ||||
| } | ||||
| #endif /* CONFIG_ERP */ | ||||
| 
 | ||||
| 
 | ||||
| static struct radius_session * | ||||
| radius_server_get_new_session(struct radius_server_data *data, | ||||
| 			      struct radius_client *client, | ||||
|  | @ -702,6 +719,19 @@ radius_server_get_new_session(struct radius_server_data *data, | |||
| 		return NULL; | ||||
| 
 | ||||
| 	res = data->get_eap_user(data->conf_ctx, user, user_len, 0, tmp); | ||||
| #ifdef CONFIG_ERP | ||||
| 	if (res != 0 && data->erp) { | ||||
| 		char *username; | ||||
| 
 | ||||
| 		username = os_zalloc(user_len + 1); | ||||
| 		if (username) { | ||||
| 			os_memcpy(username, user, user_len); | ||||
| 			if (radius_server_erp_find_key(data, username)) | ||||
| 				res = 0; | ||||
| 			os_free(username); | ||||
| 		} | ||||
| 	} | ||||
| #endif /* CONFIG_ERP */ | ||||
| 	if (res != 0) { | ||||
| 		RADIUS_DEBUG("User-Name not found from user database"); | ||||
| 		eap_user_free(tmp); | ||||
|  | @ -2706,15 +2736,8 @@ radius_server_erp_get_key(void *ctx, const char *keyname) | |||
| { | ||||
| 	struct radius_session *sess = ctx; | ||||
| 	struct radius_server_data *data = sess->server; | ||||
| 	struct eap_server_erp_key *erp; | ||||
| 
 | ||||
| 	dl_list_for_each(erp, &data->erp_keys, struct eap_server_erp_key, | ||||
| 			 list) { | ||||
| 		if (os_strcmp(erp->keyname_nai, keyname) == 0) | ||||
| 			return erp; | ||||
| 	} | ||||
| 
 | ||||
| 	return NULL; | ||||
| 	return radius_server_erp_find_key(data, keyname); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Jouni Malinen
						Jouni Malinen