#endif
EXT_ACL_EXT_LOG,
EXT_ACL_TAG,
+ EXT_ACL_ACLNAME,
+ EXT_ACL_ACLDATA,
EXT_ACL_PERCENT,
EXT_ACL_END
} type;
format->type = _external_acl_format::EXT_ACL_EXT_LOG;
else if (strcmp(token, "%TAG") == 0)
format->type = _external_acl_format::EXT_ACL_TAG;
+ else if (strcmp(token, "%ACL") == 0)
+ format->type = _external_acl_format::EXT_ACL_ACLNAME;
+ else if (strcmp(token, "%DATA") == 0)
+ format->type = _external_acl_format::EXT_ACL_ACLDATA;
else if (strcmp(token, "%%") == 0)
format->type = _external_acl_format::EXT_ACL_PERCENT;
else {
struct _external_acl_data {
external_acl *def;
+ const char *name;
wordlist *arguments;
};
free_external_acl_data(void *data)
{
external_acl_data *p = static_cast<external_acl_data *>(data);
+ safe_free(p->name);
wordlistDestroy(&p->arguments);
cbdataReferenceDone(p->def);
}
if (!data->def)
self_destruct();
+ // def->name is the name of the external_acl_type.
+ // this is the name of the 'acl' directive being tested
+ data->name = xstrdup(AclMatchedName);
+
while ((token = strtokFile())) {
wordlistAdd(&data->arguments, token);
}
HttpRequest *request = ch->request;
HttpReply *reply = ch->reply;
mb.reset();
+ bool data_used = false;
for (format = acl_data->def->format; format; format = format->next) {
const char *str = NULL;
case _external_acl_format::EXT_ACL_TAG:
str = request->tag.termedBuf();
break;
+ case _external_acl_format::EXT_ACL_ACLNAME:
+ str = acl_data->name;
+ break;
+ case _external_acl_format::EXT_ACL_ACLDATA:
+ data_used = true;
+ for (arg = acl_data->arguments; arg; arg = arg->next) {
+ if (!first)
+ sb.append(" ", 1);
+
+ if (acl_data->def->quote == external_acl::QUOTE_METHOD_URL) {
+ const char *quoted = rfc1738_escape(arg->key);
+ sb.append(quoted, strlen(quoted));
+ } else {
+ static MemBuf mb2;
+ mb2.init();
+ strwordquote(&mb2, arg->key);
+ sb.append(mb2.buf, mb2.size);
+ mb2.clean();
+ }
+
+ first = 0;
+ }
+ break;
case _external_acl_format::EXT_ACL_PERCENT:
str = "%";
break;
first = 0;
}
- for (arg = acl_data->arguments; arg; arg = arg->next) {
- if (!first)
- mb.append(" ", 1);
+ if (!data_used) {
+ for (arg = acl_data->arguments; arg; arg = arg->next) {
+ if (!first)
+ mb.append(" ", 1);
- if (acl_data->def->quote == external_acl::QUOTE_METHOD_URL) {
- const char *quoted = rfc1738_escape(arg->key);
- mb.append(quoted, strlen(quoted));
- } else {
- strwordquote(&mb, arg->key);
- }
+ if (acl_data->def->quote == external_acl::QUOTE_METHOD_URL) {
+ const char *quoted = rfc1738_escape(arg->key);
+ mb.append(quoted, strlen(quoted));
+ } else {
+ strwordquote(&mb, arg->key);
+ }
- first = 0;
+ first = 0;
+ }
}
return mb.buf;