From 0daab4a8b33738898a5dae51e5fddb36856835fe Mon Sep 17 00:00:00 2001
From: Jakob Olsson <Jakob Olsson>
Date: Tue, 3 Dec 2019 11:06:58 +0100
Subject: [PATCH] wip validator accepting blob_attr as args
---
src/json-validator.cpp | 130 +++++++++++++++++++++++++++++++++++++++--
src/json-validator.h | 12 +++-
2 files changed, 134 insertions(+), 8 deletions(-)
diff --git a/src/json-validator.cpp b/src/json-validator.cpp
index c6d3004..29f009b 100644
--- a/src/json-validator.cpp
+++ b/src/json-validator.cpp
@@ -28,6 +28,8 @@ using nlohmann::json;
using nlohmann::json_uri;
using nlohmann::json_schema::json_validator;
+bool json_object_validate_schema(nlohmann::json obj, nlohmann::json sch);
+
int schema_validator_destroy(void)
{
schema_flush_objects();
@@ -42,6 +44,121 @@ int schema_validator_init(void)
return 0;
}
+/*
+{"jsonrpc":"2.0","id":2,"result":[0,{"netmode":{"repeat":{"network":"string","wireless":"object","connect_bssid":"string"},"repeat_wifilife":{"wifilife":"object"},"sync":{},"sync_wifilife":{}},...}
+
+*/
+/*
+bool schema_validator_validate_rpcd(struct json_object *in, enum schema_call_t type)
+{
+ char *obj, *method;
+ struct json_object *type, *params, *j_obj, *j_method, *args;
+
+ if (type == SCHEMA_INPUT_CALL) {
+ // TODO: what should be 'failure' policy?
+ if (!json_object_object_get_ex(in, "method", &type))
+ return 1;
+ if (strncmp(json_object_get_string(type), "call", 5) != 0)
+ return 1;
+ if (!json_object_object_get_ex(in, "params", ¶ms))
+ return 1;
+
+ object = json_object_array_get_idx(params, 1);
+ if (!object)
+ return 0;
+ obj = json_object_get_string(object);
+ if (!obj)
+ return 0;
+ j_method = json_object_array_get_idx(params, 2);
+ if (!j_method)
+ return 0;
+ method = json_object_get_string(j_method)
+ if (!method)
+ return 0;
+ args = json_object_array_get_idx(params, 3);
+ if (!args)
+ return 0;
+ } else if (type == SCHEMA_OUTPUT_CALL) {
+ if (!json_object_object_get_ex(in, "method", &type))
+ return 1;
+ if (strncmp(json_object_get_string(type), "call", 5) != 0)
+ return 1;
+ if (!json_object_object_get_ex(in, "params", ¶ms))
+ return 1;
+
+ object = json_object_array_get_idx(params, 1);
+ if (!object)
+ return 0;
+ obj = json_object_get_string(object);
+ if (!obj)
+ return 0;
+ j_method = json_object_array_get_idx(params, 2);
+ if (!j_method)
+ return 0;
+ method = json_object_get_string(j_method)
+ if (!method)
+ return 0;
+ args = json_object_array_get_idx(params, 3);
+ if (!args)
+ return 0;
+ }
+
+ rv = schema_validator_validate(in, obj, , SCHEMA_INPUT_CALL);
+}
+*/
+bool schema_validator_validate_blob(struct blob_attr *msg, char *object, char *method, enum schema_call_t type)
+{
+ //struct json_object *definitions, *schema;
+ struct schema_object *s_object;
+ struct schema_method *s_method;
+ json schema, definitions, obj;
+ int rv = 1;
+ char *str;
+
+ s_object = schema_get_object_schema(object);
+ if (!s_object)
+ return rv;
+
+ rv = 0;
+
+ s_method = schema_get_method_schema(object, method);
+ if (!s_method)
+ goto out;
+
+ if (type == SCHEMA_INPUT_CALL)
+ schema = json::parse(s_method->input);
+ //schema = json_tokener_parse(s_method->input);
+ else if (type == SCHEMA_OUTPUT_CALL)
+ schema = json::parse(s_method->output);
+ //schema = json_tokener_parse(s_method->output);
+ else
+ goto out;
+
+ if (!schema)
+ goto out;
+
+ str = blobmsg_format_json(msg, true);
+ obj = json::parse(str);
+ if (s_object->definitions) {
+ //definitions = json_tokener_parse(s_object->definitions);
+ definitions = json::parse(s_object->definitions);
+ if (definitions)
+ //json_object_object_add(schema, "definitions", definitions);
+ obj += definitions;
+ }
+
+ /*std::cout << "jobject" << json_object_get_string(j_object) << std::endl;
+ std::cout << "schema" << json_object_get_string(schema) << std::endl;*/
+
+ rv = json_object_validate_schema(obj, schema);
+
+ //json_object_put(schema);
+ free(str);
+out:
+ return rv;
+}
+
+/*
bool schema_validator_validate(struct json_object *j_object, char *object, char *method, enum schema_call_t type)
{
struct json_object *definitions, *schema;
@@ -75,6 +192,9 @@ bool schema_validator_validate(struct json_object *j_object, char *object, char
json_object_object_add(schema, "definitions", definitions);
}
+ std::cout << "jobject" << json_object_get_string(j_object) << std::endl;
+ std::cout << "schema" << json_object_get_string(schema) << std::endl;
+
rv = json_object_validate_schema(j_object, schema);
json_object_put(schema);
@@ -86,12 +206,12 @@ bool json_object_validate_schema_inject_definitions(struct json_object *j_object
{
json_object_object_add(j_object, "definitions", definitions);
return json_object_validate_schema(j_object, j_schema);
-}
+}*/
-bool json_object_validate_schema(struct json_object *j_object, struct json_object *j_schema)
+bool json_object_validate_schema(json obj, json sch)
{
std::cout << "hello" << std::endl;
- const char *sch_str, *obj_str;
+ /*const char *sch_str, *obj_str;
obj_str = json_object_get_string(j_object);
sch_str = json_object_get_string(j_schema);
@@ -100,7 +220,7 @@ bool json_object_validate_schema(struct json_object *j_object, struct json_objec
std::cout << "sch_str " << sch_str << std::endl;
json sch = json::parse(sch_str);
- json obj = json::parse(obj_str);
+ json obj = json::parse(obj_str);*/
/* json-parse the schema */
@@ -129,4 +249,4 @@ bool json_object_validate_schema(struct json_object *j_object, struct json_objec
if (err)
return 0;
return 1;
-}
\ No newline at end of file
+}
diff --git a/src/json-validator.h b/src/json-validator.h
index 6b3b3f2..1bf2667 100644
--- a/src/json-validator.h
+++ b/src/json-validator.h
@@ -5,6 +5,8 @@ extern "C"
{
#endif
+#include <stdbool.h>
+
enum schema_call_t {
SCHEMA_INPUT_CALL,
SCHEMA_OUTPUT_CALL
@@ -12,9 +14,13 @@ enum schema_call_t {
int schema_validator_destroy(void);
int schema_validator_init(void);
-bool schema_validator_validate(struct json_object *j_object, char *object, char *method, enum schema_call_t type);
-bool json_object_validate_schema_inject_definitions(struct json_object *j_object, struct json_object *definitions, struct json_object *j_schema);
-bool json_object_validate_schema(struct json_object *j_obj, struct json_object *j_schema);
+bool schema_validator_validate(struct json_object *j_object, const char *object, const char *method, enum schema_call_t type);
+
+//bool schema_validator_validate(struct json_object *j_object, char *object, char *method, enum schema_call_t type);
+//bool json_object_validate_schema_inject_definitions(struct json_object *j_object, struct json_object *definitions, struct json_object *j_schema);
+//bool json_object_validate_schema(struct json_object *j_obj, struct json_object *j_schema);
+//bool json_object_validate_schema(nlohmann::json obj, nlohmann::json sch);
+bool schema_validator_validate_blob(struct blob_attr *msg, const char *object, const char *method, enum schema_call_t type);
#ifdef __cplusplus
}
#endif
--
GitLab