return -1;
}
+/** \brief add serialized data to set
+ * \retval int 1 added
+ * \retval int 0 already in hash
+ * \retval int -1 API error (not added)
+ * \retval int -2 DATA error
+ */
+int DatasetLookupSerialized(Dataset *set, const char *string)
+{
+ if (set == NULL)
+ return -1;
+
+ switch (set->type) {
+ case DATASET_TYPE_STRING: {
+ // coverity[alloc_strlen : FALSE]
+ uint8_t decoded[strlen(string)];
+ uint32_t consumed = 0, num_decoded = 0;
+ Base64Ecode code = DecodeBase64(decoded, strlen(string), (const uint8_t *)string,
+ strlen(string), &consumed, &num_decoded, BASE64_MODE_STRICT);
+ if (code == BASE64_ECODE_ERR)
+ FatalError(SC_ERR_FATAL, "bad base64 encoding %s/%s", set->name, set->load);
+ return DatasetLookup(set, decoded, num_decoded);
+ }
+ case DATASET_TYPE_MD5: {
+ if (strlen(string) != 32)
+ return -2;
+ uint8_t hash[16];
+ if (HexToRaw((const uint8_t *)string, 32, hash, sizeof(hash)) < 0)
+ return -2;
+ return DatasetLookup(set, hash, 16);
+ }
+ case DATASET_TYPE_SHA256: {
+ if (strlen(string) != 64)
+ return -2;
+ uint8_t hash[32];
+ if (HexToRaw((const uint8_t *)string, 64, hash, sizeof(hash)) < 0)
+ return -2;
+ return DatasetLookup(set, hash, 32);
+ }
+ }
+ return -1;
+}
+
/**
* \retval 1 data was removed from the hash
* \retval 0 data not removed (busy)
int DatasetAddSerialized(Dataset *set, const char *string);
int DatasetRemoveSerialized(Dataset *set, const char *string);
+int DatasetLookupSerialized(Dataset *set, const char *string);
#endif /* __DATASETS_H__ */
return TM_ECODE_OK;
}
+TmEcode UnixSocketDatasetLookup(json_t *cmd, json_t *answer, void *data)
+{
+ /* 1 get dataset name */
+ json_t *narg = json_object_get(cmd, "setname");
+ if (!json_is_string(narg)) {
+ json_object_set_new(answer, "message", json_string("setname is not a string"));
+ return TM_ECODE_FAILED;
+ }
+ const char *set_name = json_string_value(narg);
+
+ /* 2 get the data type */
+ json_t *targ = json_object_get(cmd, "settype");
+ if (!json_is_string(targ)) {
+ json_object_set_new(answer, "message", json_string("settype is not a string"));
+ return TM_ECODE_FAILED;
+ }
+ const char *type = json_string_value(targ);
+
+ /* 3 get value */
+ json_t *varg = json_object_get(cmd, "datavalue");
+ if (!json_is_string(varg)) {
+ json_object_set_new(answer, "message", json_string("datavalue is not string"));
+ return TM_ECODE_FAILED;
+ }
+ const char *value = json_string_value(varg);
+
+ SCLogDebug("dataset-exist: %s type %s value %s", set_name, type, value);
+
+ enum DatasetTypes t = DatasetGetTypeFromString(type);
+ if (t == DATASET_TYPE_NOTSET) {
+ json_object_set_new(answer, "message", json_string("unknown settype"));
+ return TM_ECODE_FAILED;
+ }
+
+ Dataset *set = DatasetFind(set_name, t);
+ if (set == NULL) {
+ json_object_set_new(answer, "message", json_string("set not found or wrong type"));
+ return TM_ECODE_FAILED;
+ }
+
+ if (DatasetLookupSerialized(set, value) > 0) {
+ json_object_set_new(answer, "message", json_string("item found in set"));
+ return TM_ECODE_OK;
+ } else {
+ json_object_set_new(answer, "message", json_string("item not found in set"));
+ return TM_ECODE_FAILED;
+ }
+}
+
/**
* \brief Command to add a tenant handler
*
TmEcode UnixSocketDatasetRemove(json_t *cmd, json_t* answer, void *data);
TmEcode UnixSocketDatasetDump(json_t *cmd, json_t *answer, void *data);
TmEcode UnixSocketDatasetClear(json_t *cmd, json_t *answer, void *data);
+TmEcode UnixSocketDatasetLookup(json_t *cmd, json_t *answer, void *data);
TmEcode UnixSocketRegisterTenantHandler(json_t *cmd, json_t* answer, void *data);
TmEcode UnixSocketUnregisterTenantHandler(json_t *cmd, json_t* answer, void *data);
TmEcode UnixSocketRegisterTenant(json_t *cmd, json_t* answer, void *data);
UnixManagerRegisterCommand("dataset-dump", UnixSocketDatasetDump, NULL, 0);
UnixManagerRegisterCommand(
"dataset-clear", UnixSocketDatasetClear, &command, UNIX_CMD_TAKE_ARGS);
+ UnixManagerRegisterCommand(
+ "dataset-lookup", UnixSocketDatasetLookup, &command, UNIX_CMD_TAKE_ARGS);
return 0;
}