node-yara-rs

git clone git://archive.git.mtrnord.blog/MTRNord/node-yara-rs.git
Log | Files | Refs | README | LICENSE

commit 5893f4c521e9709b43a40d6d0fda9f1b5a14c63b
parent 2dff3bdfddad5f17ab8884a986b082bec869bfaa
Author: MTRNord <mtrnord1@gmail.com>
Date:   Mon,  9 Oct 2023 21:10:00 +0200

Make dots in keys of json objects work with the json module

Diffstat:
M.vscode/settings.json | 3++-
M__test__/index.spec.mjs | 18++++++++++++++++++
M__test__/json_test.yara | 15+++++++++++++++
M__test__/test.json | 6+++++-
Achangelog.d/+dotted_keys.misc | 2++
Mdeps/json.c | 123++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
6 files changed, 154 insertions(+), 13 deletions(-)

diff --git a/.vscode/settings.json b/.vscode/settings.json @@ -7,6 +7,7 @@ "globals.h": "c", "stdio.h": "c", "jansson.h": "c", - "jansson_config.h": "c" + "jansson_config.h": "c", + "sstream": "c" } } \ No newline at end of file diff --git a/__test__/index.spec.mjs b/__test__/index.spec.mjs @@ -156,6 +156,24 @@ if (process.platform !== "win32") { metadatas: [], tags: [], strings: [] + }, { + identifier: "dotted_key", + namespace: "default", + metadatas: [], + tags: [], + strings: [] + }, { + identifier: "dotted_key_sub", + namespace: "default", + metadatas: [], + tags: [], + strings: [] + }, { + identifier: "has_key_normal", + namespace: "default", + metadatas: [], + tags: [], + strings: [] } ]) }); diff --git a/__test__/json_test.yara b/__test__/json_test.yara @@ -40,4 +40,19 @@ rule float_array_includes_nested { json.float_array_includes("float.floatArray", 1.0) and json.float_array_includes("float.floatArray", 2.0) and json.float_array_includes("float.floatArray", 3.0) +} + +rule dotted_key { + condition: + json.key_exists("dot\\.key") +} + +rule dotted_key_sub { + condition: + json.key_exists("dot\\.key.subkey") +} + +rule has_key_normal { + condition: + json.key_exists("normal_key") } \ No newline at end of file diff --git a/__test__/test.json b/__test__/test.json @@ -46,5 +46,9 @@ 2, 3 ] - } + }, + "dot.key": { + "subkey": {} + }, + "normal_key": {} } \ No newline at end of file diff --git a/changelog.d/+dotted_keys.misc b/changelog.d/+dotted_keys.misc @@ -0,0 +1 @@ +Make dots in keys of json objects work with the json module +\ No newline at end of file diff --git a/deps/json.c b/deps/json.c @@ -44,18 +44,31 @@ define_function(key_exists) // Split key into possible subcomponents - separated by '.' json_t *iter = json; char *token = strtok(key, "."); + char previousChar = '\0'; + char *realToken = strdup(token); while (token != NULL) { - iter = json_object_get(iter, token); + previousChar = token[strlen(token)-1]; + if (previousChar == '\\') { + realToken[strlen(realToken)-1] = '.'; + token = strtok(NULL, "."); + strcat(realToken, token); + } + + iter = json_object_get(iter, realToken); if (iter == NULL) { return_integer(0); } token = strtok(NULL, "."); + if (token != NULL) { + strcpy(realToken, token); + } } free(key); free(token); + free(realToken); return_integer(1); } @@ -76,10 +89,19 @@ define_function(value_exists_string) json_t *iter = json; char *token = strtok(key, "."); char *prevToken = strdup(token); + char previousChar = '\0'; + char *realToken = strdup(token); while (token != NULL) { - iter = json_object_get(iter, token); + previousChar = token[strlen(token)-1]; + if (previousChar == '\\') { + realToken[strlen(realToken)-1] = '.'; + token = strtok(NULL, "."); + strcat(realToken, token); + } + + iter = json_object_get(iter, realToken); if (iter == NULL) { return_integer(0); @@ -87,6 +109,9 @@ define_function(value_exists_string) strcpy(prevToken, token); token = strtok(NULL, "."); + if (token != NULL) { + strcpy(realToken, token); + } } const char *found = json_string_value(iter); @@ -104,6 +129,7 @@ define_function(value_exists_string) free(value); free(prevToken); free(token); + free(realToken); return_integer(1); } @@ -124,10 +150,19 @@ define_function(value_exists_integer) json_t *iter = json; char *token = strtok(key, "."); char *prevToken = strdup(token); + char previousChar = '\0'; + char *realToken = strdup(token); while (token != NULL) { - iter = json_object_get(iter, token); + previousChar = token[strlen(token)-1]; + if (previousChar == '\\') { + realToken[strlen(realToken)-1] = '.'; + token = strtok(NULL, "."); + strcat(realToken, token); + } + + iter = json_object_get(iter, realToken); if (iter == NULL) { return_integer(0); @@ -135,6 +170,9 @@ define_function(value_exists_integer) strcpy(prevToken, token); token = strtok(NULL, "."); + if (token != NULL) { + strcpy(realToken, token); + } } double foundNumber = json_number_value(iter); @@ -152,6 +190,7 @@ define_function(value_exists_integer) free(key); free(prevToken); free(token); + free(realToken); return_integer(1); } @@ -173,10 +212,19 @@ define_function(value_exists_regex) json_t *iter = json; char *token = strtok(key, "."); char *prevToken = strdup(token); + char previousChar = '\0'; + char *realToken = strdup(token); while (token != NULL) { - iter = json_object_get(iter, token); + previousChar = token[strlen(token)-1]; + if (previousChar == '\\') { + realToken[strlen(realToken)-1] = '.'; + token = strtok(NULL, "."); + strcat(realToken, token); + } + + iter = json_object_get(iter, realToken); if (iter == NULL) { return_integer(0); @@ -184,6 +232,9 @@ define_function(value_exists_regex) strcpy(prevToken, token); token = strtok(NULL, "."); + if (token != NULL) { + strcpy(realToken, token); + } } const char *found = json_string_value(iter); @@ -200,6 +251,7 @@ define_function(value_exists_regex) free(key); free(prevToken); free(token); + free(realToken); return_integer(1); } @@ -220,10 +272,19 @@ define_function(value_exists_float) json_t *iter = json; char *token = strtok(key, "."); char *prevToken = strdup(token); + char previousChar = '\0'; + char *realToken = strdup(token); while (token != NULL) { - iter = json_object_get(iter, token); + previousChar = token[strlen(token)-1]; + if (previousChar == '\\') { + realToken[strlen(realToken)-1] = '.'; + token = strtok(NULL, "."); + strcat(realToken, token); + } + + iter = json_object_get(iter, realToken); if (iter == NULL) { return_integer(0); @@ -231,6 +292,9 @@ define_function(value_exists_float) strcpy(prevToken, token); token = strtok(NULL, "."); + if (token != NULL) { + strcpy(realToken, token); + } } double found = json_number_value(iter); @@ -247,6 +311,7 @@ define_function(value_exists_float) free(key); free(prevToken); free(token); + free(realToken); return_integer(1); } @@ -267,10 +332,19 @@ define_function(string_array_includes) json_t *iter = json; char *token = strtok(key, "."); char *prevToken = strdup(token); + char previousChar = '\0'; + char *realToken = strdup(token); while (token != NULL) { - iter = json_object_get(iter, token); + previousChar = token[strlen(token)-1]; + if (previousChar == '\\') { + realToken[strlen(realToken)-1] = '.'; + token = strtok(NULL, "."); + strcat(realToken, token); + } + + iter = json_object_get(iter, realToken); if (iter == NULL) { return_integer(0); @@ -278,6 +352,9 @@ define_function(string_array_includes) strcpy(prevToken, token); token = strtok(NULL, "."); + if (token != NULL) { + strcpy(realToken, token); + } } json_t *array = iter; @@ -298,10 +375,10 @@ define_function(string_array_includes) free(array); free(key); - free(key); free(value); free(prevToken); free(token); + free(realToken); return_integer(0); } @@ -321,10 +398,19 @@ define_function(integer_array_includes) json_t *iter = json; char *token = strtok(key, "."); char *prevToken = strdup(token); + char previousChar = '\0'; + char *realToken = strdup(token); while (token != NULL) { - iter = json_object_get(iter, token); + previousChar = token[strlen(token)-1]; + if (previousChar == '\\') { + realToken[strlen(realToken)-1] = '.'; + token = strtok(NULL, "."); + strcat(realToken, token); + } + + iter = json_object_get(iter, realToken); if (iter == NULL) { return_integer(0); @@ -332,6 +418,9 @@ define_function(integer_array_includes) strcpy(prevToken, token); token = strtok(NULL, "."); + if (token != NULL) { + strcpy(realToken, token); + } } json_t *array = iter; @@ -359,10 +448,10 @@ define_function(integer_array_includes) free(array); free(key); - free(key); free(value); free(prevToken); free(token); + free(realToken); return_integer(0); } @@ -382,10 +471,19 @@ define_function(float_array_includes) json_t *iter = json; char *token = strtok(key, "."); char *prevToken = strdup(token); + char previousChar = '\0'; + char *realToken = strdup(token); while (token != NULL) { - iter = json_object_get(iter, token); + previousChar = token[strlen(token)-1]; + if (previousChar == '\\') { + realToken[strlen(realToken)-1] = '.'; + token = strtok(NULL, "."); + strcat(realToken, token); + } + + iter = json_object_get(iter, realToken); if (iter == NULL) { return_integer(0); @@ -393,6 +491,9 @@ define_function(float_array_includes) strcpy(prevToken, token); token = strtok(NULL, "."); + if (token != NULL) { + strcpy(realToken, token); + } } json_t *array = iter; @@ -419,9 +520,9 @@ define_function(float_array_includes) free(array); free(key); - free(key); free(prevToken); free(token); + free(realToken); return_integer(0); }