refactor htpconfigure()

pull/112/merge
Anoop Saldanha 14 years ago committed by Victor Julien
parent 33b0b07107
commit 340542c44e

@ -2089,325 +2089,185 @@ static int HTPCallbackResponse(htp_connp_t *connp) {
SCReturnInt(HOOK_OK);
}
static void HTPConfigure(void)
static void HTPConfigSetDefaults(HTPCfgRec *cfg_prec)
{
SCEnter();
ConfNode *default_config;
ConfNode *server_config;
cfglist.next = NULL;
cfg_prec->request_body_limit = HTP_CONFIG_DEFAULT_REQUEST_BODY_LIMIT;
cfg_prec->response_body_limit = HTP_CONFIG_DEFAULT_RESPONSE_BODY_LIMIT;
htp_config_register_request(cfg_prec->cfg, HTPCallbackRequest);
htp_config_register_response(cfg_prec->cfg, HTPCallbackResponse);
#ifdef HAVE_HTP_URI_NORMALIZE_HOOK
htp_config_register_request_uri_normalize(cfg_prec->cfg, HTPCallbackRequestUriNormalizeQuery);
#endif
htp_config_set_generate_request_uri_normalized(cfg_prec->cfg, 1);
htp_config_register_request_body_data(cfg_prec->cfg, HTPCallbackRequestBodyData);
htp_config_register_response_body_data(cfg_prec->cfg, HTPCallbackResponseBodyData);
cfgtree = SCRadixCreateRadixTree(NULL, NULL);
if (NULL == cfgtree) {
SCLogError(SC_ERR_MEM_ALLOC, "Error initializing HTP config tree");
return;
}
if (SCLogDebugEnabled()) {
abort();
}
else {
exit(EXIT_FAILURE);
}
}
static void HTPConfigParseParameters(HTPCfgRec *cfg_prec, ConfNode *node,
SCRadixTree *tree)
{
if (cfg_prec == NULL || node == NULL || tree == NULL)
return;
/* Default Config */
cfglist.cfg = htp_config_create();
if (NULL == cfglist.cfg) {
SCLogError(SC_ERR_MEM_ALLOC, "Failed to create HTP default config");
ConfNode *p = NULL;
/* Default Parameters */
TAILQ_FOREACH(p, &node->head, next) {
if (strcasecmp("address", p->name) == 0) {
ConfNode *pval;
/* Addresses */
TAILQ_FOREACH(pval, &p->head, next) {
SCLogDebug("LIBHTP server %s: %s=%s", s->name, p->name,
pval->val);
/* IPV6 or IPV4? */
if (strchr(pval->val, ':') != NULL) {
SCLogDebug("LIBHTP adding ipv6 server %s at %s: %p",
s->name, pval->val, htp);
if (SCRadixAddKeyIPV6String(pval->val, tree, cfg_prec) == NULL) {
SCLogWarning(SC_ERR_INVALID_VALUE, "LIBHTP failed to "
"add ipv6 server %s, ignoring", pval->val);
}
} else {
SCLogDebug("LIBHTP adding ipv4 server %s at %s: %p",
s->name, pval->val, htp);
if (SCRadixAddKeyIPV4String(pval->val, tree, cfg_prec) == NULL) {
SCLogWarning(SC_ERR_INVALID_VALUE, "LIBHTP failed "
"to add ipv4 server %s, ignoring",
pval->val);
}
} /* else - if (strchr(pval->val, ':') != NULL) */
} /* TAILQ_FOREACH(pval, &p->head, next) */
} else if (strcasecmp("personality", p->name) == 0) {
/* Personalities */
int personality = HTPLookupPersonality(p->val);
SCLogDebug("LIBHTP default: %s = %s", p->name, p->val);
SCLogDebug("LIBHTP default: %s = %s", p->name, p->val);
if (personality >= 0) {
SCLogDebug("LIBHTP default: %s=%s (%d)", p->name, p->val,
personality);
if (htp_config_set_server_personality(cfg_prec->cfg, personality) == HTP_ERROR){
SCLogWarning(SC_ERR_INVALID_VALUE, "LIBHTP Failed adding "
"personality \"%s\", ignoring", p->val);
} else {
SCLogDebug("LIBHTP personality set to %s",
HTPLookupPersonalityString(personality));
}
if (SCLogDebugEnabled()) {
abort();
}
else {
exit(EXIT_FAILURE);
}
}
/* The IDS personality by default converts the path (and due to
* our query string callback also the query string) to lowercase.
* Signatures do not expect this, so override it. */
htp_config_set_path_case_insensitive(cfg_prec->cfg, 0);
} else {
SCLogWarning(SC_ERR_UNKNOWN_VALUE, "LIBHTP Unknown personality "
"\"%s\", ignoring", p->val);
continue;
}
SCLogDebug("LIBHTP default config: %p", cfglist.cfg);
} else if (strcasecmp("request-body-limit", p->name) == 0 ||
strcasecmp("request_body_limit", p->name) == 0) {
if (ParseSizeStringU32(p->val, &cfg_prec->request_body_limit) < 0) {
SCLogError(SC_ERR_SIZE_PARSE, "Error parsing request-body-limit "
"from conf file - %s. Killing engine", p->val);
exit(EXIT_FAILURE);
}
cfglist.request_body_limit = HTP_CONFIG_DEFAULT_REQUEST_BODY_LIMIT;
cfglist.response_body_limit = HTP_CONFIG_DEFAULT_RESPONSE_BODY_LIMIT;
htp_config_register_request(cfglist.cfg, HTPCallbackRequest);
htp_config_register_response(cfglist.cfg, HTPCallbackResponse);
#ifdef HAVE_HTP_URI_NORMALIZE_HOOK
htp_config_register_request_uri_normalize(cfglist.cfg,
HTPCallbackRequestUriNormalizeQuery);
#endif
htp_config_set_generate_request_uri_normalized(cfglist.cfg, 1);
htp_config_register_request_body_data(cfglist.cfg,
HTPCallbackRequestBodyData);
htp_config_register_response_body_data(cfglist.cfg,
HTPCallbackResponseBodyData);
default_config = ConfGetNode("libhtp.default-config");
if (NULL != default_config) {
ConfNode *p = NULL;
/* Default Parameters */
TAILQ_FOREACH(p, &default_config->head, next) {
//ConfNode *pval;
if (strcasecmp("personality", p->name) == 0) {
/* Personalities */
int personality = HTPLookupPersonality(p->val);
SCLogDebug("LIBHTP default: %s=%s",
p->name, p->val);
SCLogDebug("LIBHTP default: %s=%s",
p->name, p->val);
if (personality >= 0) {
SCLogDebug("LIBHTP default: %s=%s (%d)",
p->name, p->val,
personality);
if (htp_config_set_server_personality(cfglist.cfg,
personality) == HTP_ERROR)
{
SCLogWarning(SC_ERR_INVALID_VALUE,
"LIBHTP Failed adding personality "
"\"%s\", ignoring", p->val);
} else {
SCLogDebug("LIBHTP personality set to %s",
HTPLookupPersonalityString(personality));
}
} else if (strcasecmp("response-body-limit", p->name) == 0) {
if (ParseSizeStringU32(p->val, &cfg_prec->response_body_limit) < 0) {
SCLogError(SC_ERR_SIZE_PARSE, "Error parsing response-body-limit "
"from conf file - %s. Killing engine", p->val);
exit(EXIT_FAILURE);
}
/* The IDS personality by default converts the path (and due to
* our query string callback also the query string) to lowercase.
* Signatures do not expect this, so override it. */
htp_config_set_path_case_insensitive(cfglist.cfg, 0);
}
else {
SCLogWarning(SC_ERR_UNKNOWN_VALUE,
"LIBHTP Unknown personality "
"\"%s\", ignoring", p->val);
continue;
}
} else if (strcasecmp("request-body-limit", p->name) == 0 ||
strcasecmp("request_body_limit", p->name) == 0) {
if (ParseSizeStringU32(p->val, &cfglist.request_body_limit) < 0) {
SCLogError(SC_ERR_SIZE_PARSE, "Error parsing request-body-limit "
"from conf file - %s. Killing engine",
p->val);
exit(EXIT_FAILURE);
}
} else if (strcasecmp("response-body-limit", p->name) == 0) {
if (ParseSizeStringU32(p->val, &cfglist.response_body_limit) < 0) {
SCLogError(SC_ERR_SIZE_PARSE, "Error parsing response-body-limit "
"from conf file - %s. Killing engine",
p->val);
exit(EXIT_FAILURE);
}
} else if (strcasecmp("double-decode-path", p->name) == 0) {
if (ConfValIsTrue(p->val)) {
} else if (strcasecmp("double-decode-path", p->name) == 0) {
if (ConfValIsTrue(p->val)) {
#ifdef HAVE_HTP_URI_NORMALIZE_HOOK
htp_config_register_request_uri_normalize(cfglist.cfg,
HTPCallbackRequestUriNormalizePath);
htp_config_register_request_uri_normalize(cfg_prec->cfg,
HTPCallbackRequestUriNormalizePath);
#else
SCLogWarning(SC_WARN_OUTDATED_LIBHTP, "\"double-decode-path\" "
"option requires at least libhtp version 0.2.5");
SCLogWarning(SC_WARN_OUTDATED_LIBHTP, "\"double-decode-path\" "
"option requires at least libhtp version 0.2.5");
#endif
}
} else if (strcasecmp("double-decode-query", p->name) == 0) {
if (ConfValIsTrue(p->val)) {
} /* if */
} else if (strcasecmp("double-decode-query", p->name) == 0) {
if (ConfValIsTrue(p->val)) {
#ifdef HAVE_HTP_URI_NORMALIZE_HOOK
htp_config_register_request_uri_normalize(cfglist.cfg,
HTPCallbackRequestUriNormalizeQuery);
htp_config_register_request_uri_normalize(cfg_prec->cfg,
HTPCallbackRequestUriNormalizeQuery);
#else
SCLogWarning(SC_WARN_OUTDATED_LIBHTP, "\"double-decode-query\" "
"option requires at least libhtp version 0.2.5");
SCLogWarning(SC_WARN_OUTDATED_LIBHTP, "\"double-decode-query\" "
"option requires at least libhtp version 0.2.5");
#endif
}
} else {
SCLogWarning(SC_ERR_UNKNOWN_VALUE,
"LIBHTP Ignoring unknown default config: %s",
p->name);
}
} /* if */
} else {
SCLogWarning(SC_ERR_UNKNOWN_VALUE, "LIBHTP Ignoring unknown "
"default config: %s", p->name);
}
} /* TAILQ_FOREACH(p, &default_config->head, next) */
return;
}
static void HTPConfigure(void)
{
SCEnter();
cfglist.next = NULL;
cfgtree = SCRadixCreateRadixTree(NULL, NULL);
if (NULL == cfgtree)
exit(EXIT_FAILURE);
/* Default Config */
cfglist.cfg = htp_config_create();
if (NULL == cfglist.cfg) {
SCLogError(SC_ERR_MEM_ALLOC, "Failed to create HTP default config");
exit(EXIT_FAILURE);
}
SCLogDebug("LIBHTP default config: %p", cfglist.cfg);
HTPConfigSetDefaults(&cfglist);
HTPConfigParseParameters(&cfglist, ConfGetNode("libhtp.default-config"),
cfgtree);
/* Read server config and create a parser for each IP in radix tree */
server_config = ConfGetNode("libhtp.server-config");
ConfNode *server_config = ConfGetNode("libhtp.server-config");
SCLogDebug("LIBHTP Configuring %p", server_config);
if (server_config != NULL) {
ConfNode *si;
ConfNode *s;
HTPCfgRec *htprec;
HTPCfgRec *nextrec;
htp_cfg_t *htp;
/* Server Nodes */
TAILQ_FOREACH(si, &server_config->head, next) {
ConfNode *p = NULL;
/* Need the named node, not the index */
s = TAILQ_FIRST(&si->head);
if (NULL == s) {
SCLogDebug("LIBHTP s NULL");
continue;
}
SCLogDebug("LIBHTP server %s", s->name);
if (server_config == NULL)
SCReturn;
nextrec = cfglist.next;
htprec = cfglist.next = SCMalloc(sizeof(HTPCfgRec));
if (NULL == htprec) {
SCLogError(SC_ERR_MEM_ALLOC, "Failed to create HTP server config rec");
if (SCLogDebugEnabled()) {
abort();
}
else {
exit(EXIT_FAILURE);
}
}
ConfNode *si;
/* Server Nodes */
TAILQ_FOREACH(si, &server_config->head, next) {
/* Need the named node, not the index */
ConfNode *s = TAILQ_FIRST(&si->head);
if (NULL == s) {
SCLogDebug("LIBHTP s NULL");
continue;
}
cfglist.next->next = nextrec;
htp = cfglist.next->cfg = htp_config_create();
if (NULL == htp) {
SCLogError(SC_ERR_MEM_ALLOC, "Failed to create HTP server config");
if (SCLogDebugEnabled()) {
abort();
}
else {
exit(EXIT_FAILURE);
}
}
SCLogDebug("LIBHTP server %s", s->name);
htprec->request_body_limit = HTP_CONFIG_DEFAULT_REQUEST_BODY_LIMIT;
htprec->response_body_limit = HTP_CONFIG_DEFAULT_REQUEST_BODY_LIMIT;
htp_config_register_request(htp, HTPCallbackRequest);
htp_config_register_response(htp, HTPCallbackResponse);
htp_config_register_request_body_data(htp,
HTPCallbackRequestBodyData);
htp_config_register_response_body_data(htp,
HTPCallbackResponseBodyData);
#ifdef HAVE_HTP_URI_NORMALIZE_HOOK
htp_config_register_request_uri_normalize(htp,
HTPCallbackRequestUriNormalizeQuery);
#endif
htp_config_set_generate_request_uri_normalized(htp, 1);
/* Server Parameters */
TAILQ_FOREACH(p, &s->head, next) {
ConfNode *pval;
if (strcasecmp("address", p->name) == 0) {
/* Addresses */
TAILQ_FOREACH(pval, &p->head, next) {
SCLogDebug("LIBHTP server %s: %s=%s",
s->name, p->name, pval->val);
/* IPV6 or IPV4? */
if (strchr(pval->val, ':') != NULL) {
SCLogDebug("LIBHTP adding ipv6 server %s at %s: %p",
s->name, pval->val, htp);
if (SCRadixAddKeyIPV6String(pval->val,
cfgtree, htprec) == NULL)
{
SCLogWarning(SC_ERR_INVALID_VALUE,
"LIBHTP failed to add "
"ipv6 server %s, ignoring",
pval->val);
}
} else {
SCLogDebug("LIBHTP adding ipv4 server %s at %s: %p",
s->name, pval->val, htp);
if (SCRadixAddKeyIPV4String(pval->val,
cfgtree, htprec) == NULL)
{
SCLogWarning(SC_ERR_INVALID_VALUE,
"LIBHTP failed to add "
"ipv4 server %s, ignoring",
pval->val);
}
}
}
} else if (strcasecmp("personality", p->name) == 0) {
/* Personalitie */
int personality = HTPLookupPersonality(p->val);
SCLogDebug("LIBHTP server %s: %s=%s",
s->name, p->name, p->val);
SCLogDebug("LIBHTP server %s: %s=%s",
s->name, p->name, p->val);
if (personality >= 0) {
SCLogDebug("LIBHTP %s: %s=%s (%d)",
s->name, p->name, p->val,
personality);
if (htp_config_set_server_personality(htp,
personality) == HTP_ERROR)
{
SCLogWarning(SC_ERR_INVALID_VALUE,
"LIBHTP Failed adding personality "
"\"%s\", ignoring", p->val);
} else {
SCLogDebug("LIBHTP personality set to %s",
HTPLookupPersonalityString(personality));
}
HTPCfgRec *nextrec = cfglist.next;
HTPCfgRec *htprec = cfglist.next = SCMalloc(sizeof(HTPCfgRec));
if (NULL == htprec)
exit(EXIT_FAILURE);
cfglist.next->next = nextrec;
cfglist.next->cfg = htp_config_create();
if (NULL == cfglist.next->cfg) {
SCLogError(SC_ERR_MEM_ALLOC, "Failed to create HTP server config");
exit(EXIT_FAILURE);
}
/* The IDS personality by default converts the path (and due to
* our query string callback also the query string) to lowercase.
* Signatures do not expect this, so override it. */
htp_config_set_path_case_insensitive(htp, 0);
}
else {
SCLogWarning(SC_ERR_UNKNOWN_VALUE,
"LIBHTP Unknown personality "
"\"%s\", ignoring", p->val);
continue;
}
/* VJ the non underscore version was a typo but keeping it for
* compatibility with existing installs */
} else if (strcasecmp("request-body-limit", p->name) == 0 ||
strcasecmp("request_body_limit", p->name) == 0) {
/* limit */
SCLogDebug("LIBHTP default: %s=%s",
p->name, p->val);
if (ParseSizeStringU32(p->val, &htprec->request_body_limit) < 0) {
SCLogError(SC_ERR_SIZE_PARSE, "Error parsing request-body-limit "
"from conf file - %s. Killing engine",
p->val);
exit(EXIT_FAILURE);
}
} else if (strcasecmp("response-body-limit", p->name) == 0) {
if (ParseSizeStringU32(p->val, &htprec->response_body_limit) < 0) {
SCLogError(SC_ERR_SIZE_PARSE, "Error parsing response-body-limit "
"from conf file - %s. Killing engine",
p->val);
exit(EXIT_FAILURE);
}
} else if (strcasecmp("double-decode-path", p->name) == 0) {
if (ConfValIsTrue(p->val)) {
#ifdef HAVE_HTP_URI_NORMALIZE_HOOK
htp_config_register_request_uri_normalize(htp,
HTPCallbackRequestUriNormalizePath);
#else
SCLogWarning(SC_WARN_OUTDATED_LIBHTP, "\"double-decode-path\" "
"option requires at least libhtp version 0.2.5");
#endif
}
} else if (strcasecmp("double-decode-query", p->name) == 0) {
if (ConfValIsTrue(p->val)) {
#ifdef HAVE_HTP_URI_NORMALIZE_HOOK
htp_config_register_request_uri_normalize(htp,
HTPCallbackRequestUriNormalizeQuery);
#else
SCLogWarning(SC_WARN_OUTDATED_LIBHTP, "\"double-decode-query\" "
"option requires at least libhtp version 0.2.5");
#endif
}
} else {
SCLogWarning(SC_ERR_UNKNOWN_VALUE,
"LIBHTP Ignoring unknown server config: %s",
p->name);
}
}
}
HTPConfigSetDefaults(htprec);
HTPConfigParseParameters(htprec, s, cfgtree);
}
SCReturn;

Loading…
Cancel
Save