]> git.ipfire.org Git - thirdparty/squid.git/blobdiff - src/acl/Note.cc
Source Format Enforcement (#763)
[thirdparty/squid.git] / src / acl / Note.cc
index 8bf88504f9dd64f916bfed3ade0cbd944777a8bc..4cb3e6605a92141f6ed4cb93b9be43c8b5af8003 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
+ * Copyright (C) 1996-2021 The Squid Software Foundation and contributors
  *
  * Squid software is distributed under GPLv2+ license and includes
  * contributions from numerous individuals and organizations.
@@ -7,26 +7,49 @@
  */
 
 #include "squid.h"
-#include "acl/Checklist.h"
+#include "acl/FilledChecklist.h"
 #include "acl/HttpHeaderData.h"
 #include "acl/Note.h"
+#include "acl/NoteData.h"
 #include "HttpRequest.h"
-#include "Notes.h"
 
-int
-ACLNoteStrategy::match (ACLData<MatchType> * &data, ACLFilledChecklist *checklist, ACLFlags &)
+/* Acl::AnnotationStrategy */
+
+const Acl::Options &
+Acl::AnnotationStrategy::options()
 {
-    if (checklist->request != NULL)
-        return data->match(checklist->request);
+    static const Acl::CharacterSetOption Delimiters;
+    static const Acl::Options MyOptions = {
+        { "-m", &Delimiters }
+    };
+    Delimiters.linkWith(&delimiters);
+    return MyOptions;
+}
+
+/* ACLNoteStrategy */
 
+int
+ACLNoteStrategy::match(ACLData<MatchType> * &data, ACLFilledChecklist *checklist)
+{
+    if (const auto request = checklist->request) {
+        if (request->hasNotes() && matchNotes(data, request->notes().getRaw()))
+            return 1;
+#if USE_ADAPTATION
+        const Adaptation::History::Pointer ah = request->adaptLogHistory();
+        if (ah != NULL && ah->metaHeaders != NULL && matchNotes(data, ah->metaHeaders.getRaw()))
+            return 1;
+#endif
+    }
     return 0;
 }
 
-ACLNoteStrategy *
-ACLNoteStrategy::Instance()
+bool
+ACLNoteStrategy::matchNotes(ACLData<MatchType> *noteData, const NotePairs *note) const
 {
-    return &Instance_;
+    const NotePairs::Entries &entries = note->expandListEntries(&delimiters.value);
+    for (auto e: entries)
+        if (noteData->match(e.getRaw()))
+            return true;
+    return false;
 }
 
-ACLNoteStrategy ACLNoteStrategy::Instance_;
-