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