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:
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);
}