Added a simple method to replace the value of a rule in auth_cfg_t.

This commit is contained in:
Tobias Brunner
2012-04-16 13:44:27 +02:00
parent 4b32bde48e
commit 68cca941cf
2 changed files with 76 additions and 34 deletions
+47 -14
View File
@@ -1,6 +1,6 @@
/* /*
* Copyright (C) 2008-2012 Tobias Brunner
* Copyright (C) 2007-2009 Martin Willi * Copyright (C) 2007-2009 Martin Willi
* Copyright (C) 2008 Tobias Brunner
* Hochschule fuer Technik Rapperswil * Hochschule fuer Technik Rapperswil
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
@@ -177,19 +177,12 @@ static void destroy_entry_value(entry_t *entry)
} }
/** /**
* Implementation of auth_cfg_t.replace. * Replace the type and value of the given entry.
*/ */
static void replace(private_auth_cfg_t *this, entry_enumerator_t *enumerator, static void replace_entry(entry_t *entry, auth_rule_t type, va_list args)
auth_rule_t type, ...)
{ {
if (enumerator->current) destroy_entry_value(entry);
{ entry->type = type;
va_list args;
va_start(args, type);
destroy_entry_value(enumerator->current);
enumerator->current->type = type;
switch (type) switch (type)
{ {
case AUTH_RULE_AUTH_CLASS: case AUTH_RULE_AUTH_CLASS:
@@ -200,7 +193,7 @@ static void replace(private_auth_cfg_t *this, entry_enumerator_t *enumerator,
case AUTH_RULE_RSA_STRENGTH: case AUTH_RULE_RSA_STRENGTH:
case AUTH_RULE_ECDSA_STRENGTH: case AUTH_RULE_ECDSA_STRENGTH:
/* integer type */ /* integer type */
enumerator->current->value = (void*)(uintptr_t)va_arg(args, u_int); entry->value = (void*)(uintptr_t)va_arg(args, u_int);
break; break;
case AUTH_RULE_IDENTITY: case AUTH_RULE_IDENTITY:
case AUTH_RULE_EAP_IDENTITY: case AUTH_RULE_EAP_IDENTITY:
@@ -216,13 +209,52 @@ static void replace(private_auth_cfg_t *this, entry_enumerator_t *enumerator,
case AUTH_HELPER_SUBJECT_HASH_URL: case AUTH_HELPER_SUBJECT_HASH_URL:
case AUTH_HELPER_REVOCATION_CERT: case AUTH_HELPER_REVOCATION_CERT:
/* pointer type */ /* pointer type */
enumerator->current->value = va_arg(args, void*); entry->value = va_arg(args, void*);
break; break;
} }
}
/**
* Implementation of auth_cfg_t.replace.
*/
static void replace(private_auth_cfg_t *this, entry_enumerator_t *enumerator,
auth_rule_t type, ...)
{
if (enumerator->current)
{
va_list args;
va_start(args, type);
replace_entry(enumerator->current, type, args);
va_end(args); va_end(args);
} }
} }
METHOD(auth_cfg_t, replace_value, bool,
private_auth_cfg_t *this, auth_rule_t type, ...)
{
enumerator_t *enumerator;
entry_t *entry;
bool found = FALSE;
enumerator = this->entries->create_enumerator(this->entries);
while (enumerator->enumerate(enumerator, &entry))
{
if (type == entry->type)
{
va_list args;
va_start(args, type);
replace_entry(entry, type, args);
va_end(args);
found = TRUE;
break;
}
}
enumerator->destroy(enumerator);
return found;
}
METHOD(auth_cfg_t, get, void*, METHOD(auth_cfg_t, get, void*,
private_auth_cfg_t *this, auth_rule_t type) private_auth_cfg_t *this, auth_rule_t type)
{ {
@@ -883,6 +915,7 @@ auth_cfg_t *auth_cfg_create()
.get = _get, .get = _get,
.create_enumerator = _create_enumerator, .create_enumerator = _create_enumerator,
.replace = (void(*)(auth_cfg_t*,enumerator_t*,auth_rule_t,...))replace, .replace = (void(*)(auth_cfg_t*,enumerator_t*,auth_rule_t,...))replace,
.replace_value = _replace_value,
.complies = _complies, .complies = _complies,
.merge = (void(*)(auth_cfg_t*,auth_cfg_t*,bool))merge, .merge = (void(*)(auth_cfg_t*,auth_cfg_t*,bool))merge,
.purge = _purge, .purge = _purge,
+10 -1
View File
@@ -1,6 +1,6 @@
/* /*
* Copyright (C) 2008-2012 Tobias Brunner
* Copyright (C) 2007-2009 Martin Willi * Copyright (C) 2007-2009 Martin Willi
* Copyright (C) 2008 Tobias Brunner
* Hochschule fuer Technik Rapperswil * Hochschule fuer Technik Rapperswil
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
@@ -181,6 +181,15 @@ struct auth_cfg_t {
void (*replace)(auth_cfg_t *this, enumerator_t *pos, void (*replace)(auth_cfg_t *this, enumerator_t *pos,
auth_rule_t rule, ...); auth_rule_t rule, ...);
/**
* Replace the value of the first rule with the given type.
*
* @param rule rule type
* @param ... associated value to rule
* @return TRUE if the rule was found and the value replaced
*/
bool (*replace_value)(auth_cfg_t *this, auth_rule_t rule, ...);
/** /**
* Check if a used config fulfills a set of configured constraints. * Check if a used config fulfills a set of configured constraints.
* *