@@ -7292,7 +7292,8 @@ static FnCallResult FnCallReadJson(ARG_UNUSED EvalContext *ctx,
7292
7292
7293
7293
static FnCallResult ValidateDataGeneric (const char * const fname ,
7294
7294
const char * data ,
7295
- const DataFileType requested_mode )
7295
+ const DataFileType requested_mode ,
7296
+ bool strict )
7296
7297
{
7297
7298
assert (data != NULL );
7298
7299
if (requested_mode != DATAFILETYPE_JSON )
@@ -7310,7 +7311,13 @@ static FnCallResult ValidateDataGeneric(const char *const fname,
7310
7311
Log (LOG_LEVEL_VERBOSE , "%s: %s" , fname , JsonParseErrorToString (err ));
7311
7312
}
7312
7313
7313
- FnCallResult ret = FnReturnContext (json != NULL );
7314
+ bool isvalid = json != NULL ;
7315
+ if (strict )
7316
+ {
7317
+ isvalid = isvalid && JsonGetElementType (json ) != JSON_ELEMENT_TYPE_PRIMITIVE ;
7318
+ }
7319
+
7320
+ FnCallResult ret = FnReturnContext (isvalid );
7314
7321
JsonDestroy (json );
7315
7322
return ret ;
7316
7323
}
@@ -7326,12 +7333,17 @@ static FnCallResult FnCallValidData(ARG_UNUSED EvalContext *ctx,
7326
7333
Log (LOG_LEVEL_ERR , "Function '%s' requires two arguments" , fp -> name );
7327
7334
return FnFailure ();
7328
7335
}
7336
+ bool strict = false;
7337
+ if (args -> next != NULL )
7338
+ {
7339
+ strict = BooleanFromString (RlistScalarValue (args -> next ));
7340
+ }
7329
7341
7330
7342
const char * data = RlistScalarValue (args );
7331
7343
const char * const mode_string = RlistScalarValue (args -> next );
7332
7344
DataFileType requested_mode = GetDataFileTypeFromString (mode_string );
7333
7345
7334
- return ValidateDataGeneric (fp -> name , data , requested_mode );
7346
+ return ValidateDataGeneric (fp -> name , data , requested_mode , strict );
7335
7347
}
7336
7348
7337
7349
static FnCallResult FnCallValidJson (ARG_UNUSED EvalContext * ctx ,
@@ -7345,9 +7357,14 @@ static FnCallResult FnCallValidJson(ARG_UNUSED EvalContext *ctx,
7345
7357
Log (LOG_LEVEL_ERR , "Function '%s' requires one argument" , fp -> name );
7346
7358
return FnFailure ();
7347
7359
}
7360
+ bool strict = false;
7361
+ if (args -> next != NULL )
7362
+ {
7363
+ strict = BooleanFromString (RlistScalarValue (args -> next ));
7364
+ }
7348
7365
7349
7366
const char * data = RlistScalarValue (args );
7350
- return ValidateDataGeneric (fp -> name , data , DATAFILETYPE_JSON );
7367
+ return ValidateDataGeneric (fp -> name , data , DATAFILETYPE_JSON , strict );
7351
7368
}
7352
7369
7353
7370
static FnCallResult FnCallReadModuleProtocol (
@@ -9969,6 +9986,7 @@ static const FnCallArg READFILE_ARGS[] =
9969
9986
static const FnCallArg VALIDDATATYPE_ARGS [] =
9970
9987
{
9971
9988
{CF_ANYSTRING , CF_DATA_TYPE_STRING , "String to validate as JSON" },
9989
+ {CF_BOOL , CF_DATA_TYPE_OPTION , "Enable more strict validation, requiring the result to be a valid data container, matching the requirements of parsejson()." },
9972
9990
{NULL , CF_DATA_TYPE_NONE , NULL }
9973
9991
};
9974
9992
@@ -10025,6 +10043,7 @@ static const FnCallArg VALIDDATA_ARGS[] =
10025
10043
{
10026
10044
{CF_ANYSTRING , CF_DATA_TYPE_STRING , "String to validate as JSON" },
10027
10045
{"JSON" , CF_DATA_TYPE_OPTION , "Type of data to validate" },
10046
+ {CF_BOOL , CF_DATA_TYPE_OPTION , "Enable more strict validation, requiring the result to be a valid data container, matching the requirements of parsejson()." },
10028
10047
{NULL , CF_DATA_TYPE_NONE , NULL }
10029
10048
};
10030
10049
@@ -10777,7 +10796,7 @@ const FnCallType CF_FNCALL_TYPES[] =
10777
10796
FnCallTypeNew ("userexists" , CF_DATA_TYPE_CONTEXT , USEREXISTS_ARGS , & FnCallUserExists , "True if user name or numerical id exists on this host" ,
10778
10797
FNCALL_OPTION_NONE , FNCALL_CATEGORY_SYSTEM , SYNTAX_STATUS_NORMAL ),
10779
10798
FnCallTypeNew ("validdata" , CF_DATA_TYPE_CONTEXT , VALIDDATA_ARGS , & FnCallValidData , "Check for errors in JSON or YAML data" ,
10780
- FNCALL_OPTION_NONE , FNCALL_CATEGORY_DATA , SYNTAX_STATUS_NORMAL ),
10799
+ FNCALL_OPTION_VARARG , FNCALL_CATEGORY_DATA , SYNTAX_STATUS_NORMAL ),
10781
10800
FnCallTypeNew ("validjson" , CF_DATA_TYPE_CONTEXT , VALIDDATATYPE_ARGS , & FnCallValidJson , "Check for errors in JSON data" ,
10782
10801
FNCALL_OPTION_VARARG , FNCALL_CATEGORY_DATA , SYNTAX_STATUS_NORMAL ),
10783
10802
FnCallTypeNew ("variablesmatching" , CF_DATA_TYPE_STRING_LIST , CLASSMATCH_ARGS , & FnCallVariablesMatching , "List the variables matching regex arg1 and tag regexes arg2,arg3,..." ,
0 commit comments