int hb_validate_filter_settings(int filter_id, const char *filter_param) { if (filter_param == NULL) return 0; // Regex matches "number" followed by one or more ":number", where number is int or float const char *hb_colon_separated_params_regex = "^(((([\\-])?[0-9]+([.,][0-9]+)?)|(([\\-])?[.,][0-9]+))((:((([\\-])?[0-9]+([,.][0-9]+)?)|(([\\-])?[,.][0-9]+)))+)?)$"; const char *regex_pattern = NULL; switch (filter_id) { case HB_FILTER_ROTATE: case HB_FILTER_DEBLOCK: case HB_FILTER_DETELECINE: case HB_FILTER_DECOMB: case HB_FILTER_DEINTERLACE: case HB_FILTER_NLMEANS: case HB_FILTER_HQDN3D: if (filter_param[0] == 0) { return 0; } regex_pattern = hb_colon_separated_params_regex; break; default: fprintf(stderr, "hb_validate_filter_settings: Unrecognized filter (%d).\n", filter_id); return 1; break; } if (hb_validate_param_string(regex_pattern, filter_param) == 0) { return 0; } return 1; }
int hb_validate_filter_settings(int filter_id, const hb_dict_t * settings) { hb_filter_object_t * filter; hb_dict_t * settings_template; hb_dict_iter_t iter; if (settings == NULL) return 0; // Verify that all keys in settings are in the filter settings template filter = hb_filter_get(filter_id); if (filter == NULL) { hb_log("hb_validate_filter_settings: Unrecognized filter (%d).\n", filter_id); return 1; } if (filter->settings_template == NULL) { // filter has no template to verify settings against return 0; } settings_template = hb_parse_filter_settings(filter->settings_template); if (settings_template == NULL) { hb_log("hb_validate_filter_settings: invalid template!"); return 0; } for (iter = hb_dict_iter_init(settings); iter != HB_DICT_ITER_DONE; iter = hb_dict_iter_next(settings, iter)) { const char * key; hb_value_t * val; key = hb_dict_iter_key(iter); // Check if key found in settings is also found in the template val = hb_dict_get(settings_template, key); if (val == NULL) { // Key is missing from template, indicate invalid settings hb_log("Invalid filter key (%s) for filter %s", key, filter->name); return 1; } // If a string value is found, and it is non-empty, // it is a regex pattern for allowed values. const char * regex_pattern = hb_value_get_string(val); if (regex_pattern != NULL && regex_pattern[0] != 0) { char * param; param = hb_value_get_string_xform(hb_dict_get(settings, key)); if (hb_validate_param_string(regex_pattern, param) != 0) { hb_log("Invalid filter value (%s) for key %s filter %s", param, key, filter->name); free(param); return 1; } free(param); } } hb_value_free(&settings_template); return 0; }