From: Henrik Nordstrom Date: Tue, 14 May 2013 17:53:18 +0000 (-0600) Subject: Port from 2.6: external acl %ACL and %DATA tags X-Git-Tag: SQUID_3_4_0_1~142 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ec2d5242d1f2a13f2ea503500acac9579e3138e6;p=thirdparty%2Fsquid.git Port from 2.6: external acl %ACL and %DATA tags --- diff --git a/src/cf.data.pre b/src/cf.data.pre index 5ea1568b9b..f5b794a907 100644 --- a/src/cf.data.pre +++ b/src/cf.data.pre @@ -709,6 +709,13 @@ DOC_START list separator. ; can be any non-alphanumeric character. + %ACL The name of the ACL being tested. + %DATA The ACL arguments. If not used then any arguments + is automatically added at the end of the line + sent to the helper. + NOTE: this will encode the arguments as one token, + whereas the default will pass each separately. + %% The percent sign. Useful for helpers which need an unchanging input format. diff --git a/src/external_acl.cc b/src/external_acl.cc index c6a5b6f376..3fa1944eb7 100644 --- a/src/external_acl.cc +++ b/src/external_acl.cc @@ -194,6 +194,8 @@ struct _external_acl_format { #endif EXT_ACL_EXT_LOG, EXT_ACL_TAG, + EXT_ACL_ACLNAME, + EXT_ACL_ACLDATA, EXT_ACL_PERCENT, EXT_ACL_END } type; @@ -482,6 +484,10 @@ parse_externalAclHelper(external_acl ** list) 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 { @@ -681,6 +687,7 @@ external_acl::trimCache() struct _external_acl_data { external_acl *def; + const char *name; wordlist *arguments; }; @@ -689,6 +696,7 @@ static void free_external_acl_data(void *data) { external_acl_data *p = static_cast(data); + safe_free(p->name); wordlistDestroy(&p->arguments); cbdataReferenceDone(p->def); } @@ -715,6 +723,10 @@ ACLExternal::parse() 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); } @@ -952,6 +964,7 @@ makeExternalAclKey(ACLFilledChecklist * ch, external_acl_data * acl_data) 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; @@ -1142,6 +1155,29 @@ makeExternalAclKey(ACLFilledChecklist * ch, external_acl_data * acl_data) 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; @@ -1174,18 +1210,20 @@ makeExternalAclKey(ACLFilledChecklist * ch, external_acl_data * acl_data) 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;