Added strongswan.conf and runtime option to enable/disable whitelist plugin
This commit is contained in:
@@ -169,6 +169,14 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
return send_msg(WHITELIST_LIST, argc == 3 ? argv[2] : "%any");
|
return send_msg(WHITELIST_LIST, argc == 3 ? argv[2] : "%any");
|
||||||
}
|
}
|
||||||
|
if (argc == 2 && strcmp(argv[1], "enable") == 0)
|
||||||
|
{
|
||||||
|
return send_msg(WHITELIST_ENABLE, "");
|
||||||
|
}
|
||||||
|
if (argc == 2 && strcmp(argv[1], "disable") == 0)
|
||||||
|
{
|
||||||
|
return send_msg(WHITELIST_DISABLE, "");
|
||||||
|
}
|
||||||
fprintf(stderr, "Usage:\n");
|
fprintf(stderr, "Usage:\n");
|
||||||
fprintf(stderr, " %s add <identity>\n", argv[0]);
|
fprintf(stderr, " %s add <identity>\n", argv[0]);
|
||||||
fprintf(stderr, " %s remove <identity>\n", argv[0]);
|
fprintf(stderr, " %s remove <identity>\n", argv[0]);
|
||||||
@@ -176,5 +184,7 @@ int main(int argc, char *argv[])
|
|||||||
fprintf(stderr, " %s remove-from <file>\n", argv[0]);
|
fprintf(stderr, " %s remove-from <file>\n", argv[0]);
|
||||||
fprintf(stderr, " %s flush [<pattern>]\n", argv[0]);
|
fprintf(stderr, " %s flush [<pattern>]\n", argv[0]);
|
||||||
fprintf(stderr, " %s list [<pattern>]\n", argv[0]);
|
fprintf(stderr, " %s list [<pattern>]\n", argv[0]);
|
||||||
|
fprintf(stderr, " %s enable\n", argv[0]);
|
||||||
|
fprintf(stderr, " %s disable\n", argv[0]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -138,6 +138,12 @@ static void dispatch(private_whitelist_control_t *this,
|
|||||||
case WHITELIST_FLUSH:
|
case WHITELIST_FLUSH:
|
||||||
this->listener->flush(this->listener, id);
|
this->listener->flush(this->listener, id);
|
||||||
break;
|
break;
|
||||||
|
case WHITELIST_ENABLE:
|
||||||
|
this->listener->set_active(this->listener, TRUE);
|
||||||
|
break;
|
||||||
|
case WHITELIST_DISABLE:
|
||||||
|
this->listener->set_active(this->listener, FALSE);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
DBG1(DBG_CFG, "received unknown whitelist command");
|
DBG1(DBG_CFG, "received unknown whitelist command");
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -40,6 +40,11 @@ struct private_whitelist_listener_t {
|
|||||||
* Hashtable with whitelisted identities
|
* Hashtable with whitelisted identities
|
||||||
*/
|
*/
|
||||||
hashtable_t *ids;
|
hashtable_t *ids;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whitelist checking enabled
|
||||||
|
*/
|
||||||
|
bool enabled;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -63,7 +68,7 @@ METHOD(listener_t, authorize, bool,
|
|||||||
bool final, bool *success)
|
bool final, bool *success)
|
||||||
{
|
{
|
||||||
/* check each authentication round */
|
/* check each authentication round */
|
||||||
if (!final)
|
if (this->enabled && !final)
|
||||||
{
|
{
|
||||||
bool whitelisted = FALSE;
|
bool whitelisted = FALSE;
|
||||||
identification_t *id;
|
identification_t *id;
|
||||||
@@ -153,6 +158,13 @@ METHOD(whitelist_listener_t, flush, void,
|
|||||||
this->lock->unlock(this->lock);
|
this->lock->unlock(this->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
METHOD(whitelist_listener_t, set_active, void,
|
||||||
|
private_whitelist_listener_t *this, bool enable)
|
||||||
|
{
|
||||||
|
DBG1(DBG_CFG, "whitelist functionality %sabled", enable ? "en" : "dis");
|
||||||
|
this->enabled = enable;
|
||||||
|
}
|
||||||
|
|
||||||
METHOD(whitelist_listener_t, destroy, void,
|
METHOD(whitelist_listener_t, destroy, void,
|
||||||
private_whitelist_listener_t *this)
|
private_whitelist_listener_t *this)
|
||||||
{
|
{
|
||||||
@@ -186,11 +198,14 @@ whitelist_listener_t *whitelist_listener_create()
|
|||||||
.remove = _remove_,
|
.remove = _remove_,
|
||||||
.create_enumerator = _create_enumerator,
|
.create_enumerator = _create_enumerator,
|
||||||
.flush = _flush,
|
.flush = _flush,
|
||||||
|
.set_active = _set_active,
|
||||||
.destroy = _destroy,
|
.destroy = _destroy,
|
||||||
},
|
},
|
||||||
.lock = rwlock_create(RWLOCK_TYPE_DEFAULT),
|
.lock = rwlock_create(RWLOCK_TYPE_DEFAULT),
|
||||||
.ids = hashtable_create((hashtable_hash_t)hash,
|
.ids = hashtable_create((hashtable_hash_t)hash,
|
||||||
(hashtable_equals_t)equals, 32),
|
(hashtable_equals_t)equals, 32),
|
||||||
|
.enabled = lib->settings->get_bool(lib->settings,
|
||||||
|
"charon.plugins.whitelist.enabled", TRUE),
|
||||||
);
|
);
|
||||||
|
|
||||||
return &this->public;
|
return &this->public;
|
||||||
|
|||||||
@@ -66,6 +66,13 @@ struct whitelist_listener_t {
|
|||||||
*/
|
*/
|
||||||
void (*flush)(whitelist_listener_t *this, identification_t *id);
|
void (*flush)(whitelist_listener_t *this, identification_t *id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable/Disable whitelist checking.
|
||||||
|
*
|
||||||
|
* @param enable TRUE to enable, FALSE to disable
|
||||||
|
*/
|
||||||
|
void (*set_active)(whitelist_listener_t *this, bool enable);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroy a whitelist_listener_t.
|
* Destroy a whitelist_listener_t.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -39,6 +39,10 @@ enum {
|
|||||||
WHITELIST_END = 4,
|
WHITELIST_END = 4,
|
||||||
/* flush identities matching id */
|
/* flush identities matching id */
|
||||||
WHITELIST_FLUSH = 5,
|
WHITELIST_FLUSH = 5,
|
||||||
|
/* enable whitelist checking */
|
||||||
|
WHITELIST_ENABLE = 6,
|
||||||
|
/* disable whitelist checking */
|
||||||
|
WHITELIST_DISABLE = 7,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user