static JsonElement *ExportBodyAsJson(Body *body) { JsonElement *json_body = JsonObjectCreate(10); JsonObjectAppendInteger(json_body, "offset", body->offset.start); JsonObjectAppendInteger(json_body, "offset-end", body->offset.end); JsonObjectAppendString(json_body, "name", body->name); JsonObjectAppendString(json_body, "body-type", body->type); { JsonElement *json_args = JsonArrayCreate(10); Rlist *argp = NULL; for (argp = body->args; argp != NULL; argp = argp->next) { JsonArrayAppendString(json_args, argp->item); } JsonObjectAppendArray(json_body, "arguments", json_args); } JsonObjectAppendArray(json_body, "classes", ExportBodyClassesAsJson(body->conlist)); return json_body; }
static JsonElement *ReadPolicyValidatedFile(const char *filename) { bool missing = true; struct stat sb; if (stat(filename, &sb) != -1) { missing = false; } JsonElement *validated_doc = ReadJsonFile(filename); if (NULL == validated_doc) { Log(missing ? LOG_LEVEL_DEBUG : LOG_LEVEL_VERBOSE, "Could not parse policy_validated JSON file '%s', using dummy data", filename); validated_doc = JsonObjectCreate(2); if (missing) { JsonObjectAppendInteger(validated_doc, "timestamp", 0); } else { JsonObjectAppendInteger(validated_doc, "timestamp", sb.st_mtime); } } return validated_doc; }
static JsonElement *ExportBundleClassesAsJson(Promise *promises) { JsonElement *json_contexts = JsonArrayCreate(10); JsonElement *json_promises = JsonArrayCreate(10); char *current_context = "any"; size_t context_offset_start = -1; size_t context_offset_end = -1; Promise *pp = NULL; for (pp = promises; pp != NULL; pp = pp->next) { JsonElement *json_promise = JsonObjectCreate(10); JsonObjectAppendInteger(json_promise, "offset", pp->offset.start); { JsonElement *json_promise_attributes = JsonArrayCreate(10); Constraint *cp = NULL; for (cp = pp->conlist; cp != NULL; cp = cp->next) { JsonElement *json_attribute = JsonObjectCreate(10); JsonObjectAppendInteger(json_attribute, "offset", cp->offset.start); JsonObjectAppendInteger(json_attribute, "offset-end", cp->offset.end); context_offset_end = cp->offset.end; JsonObjectAppendString(json_attribute, "lval", cp->lval); JsonObjectAppendObject(json_attribute, "rval", ExportAttributeValueAsJson(cp->rval)); JsonArrayAppendObject(json_promise_attributes, json_attribute); } JsonObjectAppendInteger(json_promise, "offset-end", context_offset_end); JsonObjectAppendString(json_promise, "promiser", pp->promiser); /* FIXME: does not work for lists */ if (pp->promisee.rtype == CF_SCALAR || pp->promisee.rtype == CF_NOPROMISEE) { JsonObjectAppendString(json_promise, "promisee", pp->promisee.item); } JsonObjectAppendArray(json_promise, "attributes", json_promise_attributes); } JsonArrayAppendObject(json_promises, json_promise); if (pp->next == NULL || strcmp(current_context, pp->next->classes) != 0) { JsonArrayAppendObject(json_contexts, CreateContextAsJson(current_context, context_offset_start, context_offset_end, "promises", json_promises)); current_context = pp->classes; } } return json_contexts; }
static JsonElement *CreateContextAsJson(const char *name, size_t offset, size_t offset_end, const char *children_name, JsonElement *children) { JsonElement *json = JsonObjectCreate(10); JsonObjectAppendString(json, "name", name); JsonObjectAppendInteger(json, "offset", offset); JsonObjectAppendInteger(json, "offset-end", offset_end); JsonObjectAppendArray(json, children_name, children); return json; }
static void test_remove_key_from_object(void) { JsonElement *object = JsonObjectCreate(3); JsonObjectAppendInteger(object, "one", 1); JsonObjectAppendInteger(object, "two", 2); JsonObjectAppendInteger(object, "three", 3); JsonObjectRemoveKey(object, "two"); assert_int_equal(2, JsonLength(object)); JsonDestroy(object); }
/** * @brief Writes a file with a contained timestamp to mark a policy file as validated * @param filename the filename * @return True if successful. */ static bool WritePolicyValidatedFile(ARG_UNUSED const GenericAgentConfig *config, const char *filename) { if (!MakeParentDirectory(filename, true)) { Log(LOG_LEVEL_ERR, "While writing policy validated marker file '%s', could not create directory (MakeParentDirectory: %s)", filename, GetErrorStr()); return false; } int fd = creat(filename, 0600); if (fd == -1) { Log(LOG_LEVEL_ERR, "While writing policy validated marker file '%s', could not create file (creat: %s)", filename, GetErrorStr()); return false; } JsonElement *info = JsonObjectCreate(3); JsonObjectAppendInteger(info, "timestamp", time(NULL)); Writer *w = FileWriter(fdopen(fd, "w")); JsonWrite(w, info, 0); WriterClose(w); JsonDestroy(info); Log(LOG_LEVEL_VERBOSE, "Saved policy validated marker file '%s'", filename); return true; }
static void test_detach_key_from_object(void) { JsonElement *object = JsonObjectCreate(3); JsonObjectAppendInteger(object, "one", 1); JsonObjectAppendInteger(object, "two", 2); JsonObjectAppendInteger(object, "three", 3); JsonElement *detached = JsonObjectDetachKey(object, "two"); assert_int_equal(2, JsonLength(object)); JsonDestroy(object); assert_int_equal(1, JsonLength(detached)); JsonDestroy(detached); }
static void test_object_iterator(void **state) { JsonElement *obj = JsonObjectCreate(10); JsonObjectAppendString(obj, "first", "one"); JsonObjectAppendString(obj, "second", "two"); JsonObjectAppendInteger(obj, "third", 3); JsonObjectAppendBool(obj, "fourth", true); JsonObjectAppendBool(obj, "fifth", false); { JsonIterator it = JsonIteratorInit(obj); assert_string_equal("first", JsonIteratorNextKey(&it)); assert_string_equal("second", JsonIteratorNextKey(&it)); assert_string_equal("third", JsonIteratorNextKey(&it)); assert_string_equal("fourth", JsonIteratorNextKey(&it)); assert_string_equal("fifth", JsonIteratorNextKey(&it)); assert_false(JsonIteratorNextKey(&it)); } { JsonIterator it = JsonIteratorInit(obj); assert_string_equal("one", JsonPrimitiveGetAsString(JsonIteratorNextValue(&it))); assert_string_equal("two", JsonPrimitiveGetAsString(JsonIteratorNextValue(&it))); assert_int_equal(3, JsonPrimitiveGetAsInteger(JsonIteratorNextValue(&it))); assert_true(JsonPrimitiveGetAsBool(JsonIteratorNextValue(&it))); assert_false(JsonPrimitiveGetAsBool(JsonIteratorNextValue(&it))); assert_false(JsonIteratorNextValue(&it)); } JsonElementDestroy(obj); }
static JsonElement *ExportBundleAsJson(Bundle *bundle) { JsonElement *json_bundle = JsonObjectCreate(10); JsonObjectAppendInteger(json_bundle, "offset", bundle->offset.start); JsonObjectAppendInteger(json_bundle, "offset-end", bundle->offset.end); JsonObjectAppendString(json_bundle, "name", bundle->name); JsonObjectAppendString(json_bundle, "bundle-type", bundle->type); { JsonElement *json_args = JsonArrayCreate(10); Rlist *argp = NULL; for (argp = bundle->args; argp != NULL; argp = argp->next) { JsonArrayAppendString(json_args, argp->item); } JsonObjectAppendArray(json_bundle, "arguments", json_args); } { JsonElement *json_promise_types = JsonArrayCreate(10); SubType *sp = NULL; for (sp = bundle->subtypes; sp != NULL; sp = sp->next) { JsonElement *json_promise_type = JsonObjectCreate(10); JsonObjectAppendInteger(json_promise_type, "offset", sp->offset.start); JsonObjectAppendInteger(json_promise_type, "offset-end", sp->offset.end); JsonObjectAppendString(json_promise_type, "name", sp->name); JsonObjectAppendArray(json_promise_type, "classes", ExportBundleClassesAsJson(sp->promiselist)); JsonArrayAppendObject(json_promise_types, json_promise_type); } JsonObjectAppendArray(json_bundle, "promise-types", json_promise_types); } return json_bundle; }
static JsonElement *ExportBodyClassesAsJson(Constraint *constraints) { JsonElement *json_contexts = JsonArrayCreate(10); JsonElement *json_attributes = JsonArrayCreate(10); char *current_context = "any"; size_t context_offset_start = -1; size_t context_offset_end = -1; Constraint *cp = NULL; for (cp = constraints; cp != NULL; cp = cp->next) { JsonElement *json_attribute = JsonObjectCreate(10); JsonObjectAppendInteger(json_attribute, "offset", cp->offset.start); JsonObjectAppendInteger(json_attribute, "offset-end", cp->offset.end); context_offset_start = cp->offset.context; context_offset_end = cp->offset.end; JsonObjectAppendString(json_attribute, "lval", cp->lval); JsonObjectAppendObject(json_attribute, "rval", ExportAttributeValueAsJson(cp->rval)); JsonArrayAppendObject(json_attributes, json_attribute); if (cp->next == NULL || strcmp(current_context, cp->next->classes) != 0) { JsonArrayAppendObject(json_contexts, CreateContextAsJson(current_context, context_offset_start, context_offset_end, "attributes", json_attributes)); current_context = cp->classes; } } return json_contexts; }
static void test_show_object_numeric(void **state) { JsonElement *json = JsonObjectCreate(10); JsonObjectAppendReal(json, "real", 1234.5678); JsonObjectAppendInteger(json, "int", -1234567890); Writer *writer = StringWriter(); JsonElementPrint(writer, json, 0); assert_string_equal(OBJECT_NUMERIC, StringWriterData(writer)); JsonElementDestroy(json); }
static void test_show_object_numeric(void) { JsonElement *json = JsonObjectCreate(10); JsonObjectAppendReal(json, "real", 1234.5678); JsonObjectAppendInteger(json, "int", -1234567890); Writer *writer = StringWriter(); JsonWrite(writer, json, 0); char *output = StringWriterClose(writer); assert_string_equal(OBJECT_NUMERIC, output); JsonDestroy(json); free(output); }