]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
output: add storing boolean for files
authorPhilippe Antoine <pantoine@oisf.net>
Mon, 26 Dec 2022 11:24:11 +0000 (12:24 +0100)
committerVictor Julien <vjulien@oisf.net>
Tue, 25 Jul 2023 13:10:08 +0000 (15:10 +0200)
When filestore keyword is triggered, the file is not yet stored,
when the alert is generated, but only marked for storing.

Ticket: 4881

etc/schema.json
src/output-json-alert.c
src/output-json-file.c
src/output-json.c
src/output-json.h

index e8a543e69f2c12a673d61f459297fad966c3bf8a..9c9559c5ebc664ff638585e84b8c452bffffd42d 100644 (file)
                     "stored": {
                         "type": "boolean"
                     },
+                    "storing": {
+                        "description": "the file is set to be stored when completed",
+                        "type": "boolean"
+                    },
                     "tx_id": {
                         "type": "integer"
                     },
                 "stored": {
                     "type": "boolean"
                 },
+                "storing": {
+                    "description": "the file is set to be stored when completed",
+                    "type": "boolean"
+                },
                 "tx_id": {
                     "type": "integer"
                 },
index c9b5c6a0e0220fe5da9b989acb52626dd16f74d3..a7df1065509ee755b5181634ba3ea1675d198197 100644 (file)
@@ -619,7 +619,7 @@ static void AlertAddFiles(const Packet *p, JsonBuilder *jb, const uint64_t tx_id
                 jb_open_array(jb, "files");
             }
             jb_start_object(jb);
-            EveFileInfo(jb, file, tx_id, file->flags & FILE_STORED);
+            EveFileInfo(jb, file, tx_id, file->flags);
             jb_close(jb);
             file = file->next;
         }
index a0ce76d71f01ef8f0e7fb8b29662c0e47c56609a..3b015ea88e06b9f2aac26a08cf48a88e65b71566 100644 (file)
@@ -186,7 +186,13 @@ JsonBuilder *JsonBuildFileInfoRecord(const Packet *p, const File *ff, void *tx,
     jb_set_string(js, "app_proto", AppProtoToString(p->flow->alproto));
 
     jb_open_object(js, "fileinfo");
-    EveFileInfo(js, ff, tx_id, stored);
+    if (stored) {
+        // the file has just been stored on disk cf OUTPUT_FILEDATA_FLAG_CLOSE
+        // but the flag is not set until the loggers have been called
+        EveFileInfo(js, ff, tx_id, ff->flags | FILE_STORED);
+    } else {
+        EveFileInfo(js, ff, tx_id, ff->flags);
+    }
     jb_close(js);
 
     /* xff header */
@@ -206,8 +212,7 @@ static void FileWriteJsonRecord(JsonFileLogThread *aft, const Packet *p, const F
 {
     HttpXFFCfg *xff_cfg = aft->filelog_ctx->xff_cfg != NULL ? aft->filelog_ctx->xff_cfg
                                                             : aft->filelog_ctx->parent_xff_cfg;
-    JsonBuilder *js = JsonBuildFileInfoRecord(
-            p, ff, tx, tx_id, ff->flags & FILE_STORED ? true : false, dir, xff_cfg, eve_ctx);
+    JsonBuilder *js = JsonBuildFileInfoRecord(p, ff, tx, tx_id, false, dir, xff_cfg, eve_ctx);
     if (unlikely(js == NULL)) {
         return;
     }
index de176e632313e4a03b1b3d209841533cf52e95b0..62232a4157c5a021ba6bd13501749c8f46a7eb19 100644 (file)
@@ -128,7 +128,7 @@ json_t *SCJsonString(const char *val)
 /* Default Sensor ID value */
 static int64_t sensor_id = -1; /* -1 = not defined */
 
-void EveFileInfo(JsonBuilder *jb, const File *ff, const uint64_t tx_id, const bool stored)
+void EveFileInfo(JsonBuilder *jb, const File *ff, const uint64_t tx_id, const uint16_t flags)
 {
     jb_set_string_from_bytes(jb, "filename", ff->name, ff->name_len);
 
@@ -170,11 +170,14 @@ void EveFileInfo(JsonBuilder *jb, const File *ff, const uint64_t tx_id, const bo
         jb_set_hex(jb, "sha256", (uint8_t *)ff->sha256, (uint32_t)sizeof(ff->sha256));
     }
 
-    if (stored) {
+    if (flags & FILE_STORED) {
         JB_SET_TRUE(jb, "stored");
         jb_set_uint(jb, "file_id", ff->file_store_id);
     } else {
         JB_SET_FALSE(jb, "stored");
+        if (flags & FILE_STORE) {
+            JB_SET_TRUE(jb, "storing");
+        }
     }
 
     jb_set_uint(jb, "size", FileTrackedSize(ff));
index 4999d2b5800992dc94462ee266aa0dcf52534a84..6fe6c5898d7409ea81fa3b0b8f705d2583e8698b 100644 (file)
@@ -95,7 +95,7 @@ typedef struct OutputJsonThreadCtx_ {
 json_t *SCJsonString(const char *val);
 
 void CreateEveFlowId(JsonBuilder *js, const Flow *f);
-void EveFileInfo(JsonBuilder *js, const File *file, const uint64_t tx_id, const bool stored);
+void EveFileInfo(JsonBuilder *js, const File *file, const uint64_t tx_id, const uint16_t flags);
 void EveTcpFlags(uint8_t flags, JsonBuilder *js);
 void EvePacket(const Packet *p, JsonBuilder *js, unsigned long max_length);
 JsonBuilder *CreateEveHeader(const Packet *p, enum OutputJsonLogDirection dir,