From 4d4ddb1005eda2a9ecf49f23d973d784bf6460de Mon Sep 17 00:00:00 2001 From: Matej Habrnal Date: Tue, 22 Mar 2016 15:07:15 +0100 Subject: [PATCH] event config: add support for 'restricted access' The xml event definition must hold the information about availability of creating tickets with restricted access. The tools like report-gtk and report-cli must use this information to: - offer the users the possibility to open the report with restricted access - tell the users whether the ticket will be private or not based on the configuration of the event Signed-off-by: Jakub Filak Signed-off-by: Matej Habrnal --- doc/report_event.conf.txt | 10 ++++ src/include/event_config.h | 7 +++ src/lib/event_config.c | 34 ++++++++++++ src/lib/event_xml_parser.c | 20 ++++++++ tests/Makefile.am | 3 +- .../conf/event_implicit_no_support_restricted.xml | 13 +++++ tests/conf/event_no_support_restricted.xml | 15 ++++++ tests/conf/event_support_restricted_no_option.xml | 15 ++++++ .../conf/event_support_restricted_with_option.xml | 15 ++++++ tests/event_config.at | 60 ++++++++++++++++++++++ tests/testsuite.at | 1 + tests/xml_definition.at | 51 ++++++++++++++++++ 12 files changed, 243 insertions(+), 1 deletion(-) create mode 100644 tests/conf/event_implicit_no_support_restricted.xml create mode 100644 tests/conf/event_no_support_restricted.xml create mode 100644 tests/conf/event_support_restricted_no_option.xml create mode 100644 tests/conf/event_support_restricted_with_option.xml create mode 100644 tests/event_config.at diff --git a/doc/report_event.conf.txt b/doc/report_event.conf.txt index 887c3e8..c7e736e 100644 --- a/doc/report_event.conf.txt +++ b/doc/report_event.conf.txt @@ -71,6 +71,8 @@ Each file has XML formatting with the following DTD: + + @@ -117,6 +119,14 @@ gui-review-elements:: can be published. If "no", the event is executed automatically. If not provided, "yes" is expected. +support-restricted-access:: + If "yes", the UI tools will offer the users to enter the new report with + restricted access. If "no", the UI tools will never offer the users to + enter the report with restricted access. "no" is the default value. The + element should have one argument named 'optionname' which defines name of + an option holding configuration of the restricted access feature. The + option must of 'bool' type. + advanced-options:: List of options which are hidden in the default view. diff --git a/src/include/event_config.h b/src/include/event_config.h index e2fcc23..7d137c1 100644 --- a/src/include/event_config.h +++ b/src/include/event_config.h @@ -80,6 +80,8 @@ typedef struct long ec_minimal_rating; bool ec_skip_review; bool ec_sending_sensitive_data; + bool ec_supports_restricted_access; + char *ec_restricted_access_option; GList *ec_imported_event_names; GList *options; @@ -98,6 +100,11 @@ const char *ec_get_long_desc(event_config_t *ec); void ec_set_long_desc(event_config_t *ec, const char *long_desc); bool ec_is_configurable(event_config_t* ec); +/* Returns True if the event is configured to create ticket with restricted + * access. + */ +bool ec_restricted_access_enabled(event_config_t *ec); + void free_event_config(event_config_t *p); diff --git a/src/lib/event_config.c b/src/lib/event_config.c index 30b94d3..4155938 100644 --- a/src/lib/event_config.c +++ b/src/lib/event_config.c @@ -88,6 +88,39 @@ void ec_print(event_config_t *ec) ); } +bool ec_restricted_access_enabled(event_config_t *ec) +{ + if (!ec->ec_supports_restricted_access) + { + if (ec->ec_restricted_access_option != NULL) + log_warning("Event '%s' does not support restricted access but has the option", ec_get_name(ec)); + + return false; + } + + if (ec->ec_restricted_access_option == NULL) + { + log_debug("Event '%s' supports restricted access but is missing the option", ec_get_name(ec)); + return false; + } + + event_option_t *eo = get_event_option_from_list(ec->ec_restricted_access_option, ec->options); + if (eo == NULL) + { + log_warning("Event '%s' supports restricted access but the option is not defined", ec_get_name(ec)); + return false; + } + + if (eo->eo_type != OPTION_TYPE_BOOL) + { + log_warning("Restricted option '%s' of Event '%s' is not of 'bool' type", + ec->ec_restricted_access_option, ec_get_name(ec)); + return false; + } + + return eo->eo_value != NULL && string_to_bool(eo->eo_value); +} + void free_event_option(event_option_t *p) { if (!p) @@ -112,6 +145,7 @@ void free_event_config(event_config_t *p) free(p->ec_exclude_items_by_default); free(p->ec_include_items_by_default); free(p->ec_exclude_items_always); + free(p->ec_restricted_access_option); g_list_free_full(p->ec_imported_event_names, free); g_list_free_full(p->options, (GDestroyNotify)free_event_option); diff --git a/src/lib/event_xml_parser.c b/src/lib/event_xml_parser.c index a15f1e1..a5e3d3e 100644 --- a/src/lib/event_xml_parser.c +++ b/src/lib/event_xml_parser.c @@ -33,6 +33,8 @@ #define MINIMAL_RATING_ELEMENT "minimal-rating" #define GUI_REVIEW_ELEMENTS "gui-review-elements" #define SENDING_SENSITIVE_DATA_ELEMENT "sending-sensitive-data" +#define SUPPORTS_RESTRICTED_ACCESS_ELEMENT "support-restricted-access" +#define RESTRICTED_ACCESS_OPTION_ATTR "optionname" #define REQUIRES_ELEMENT "requires-items" #define EXCL_BY_DEFAULT_ELEMENT "exclude-items-by-default" @@ -234,6 +236,20 @@ static void start_element(GMarkupParseContext *context, free(parse_data->attribute_lang); parse_data->attribute_lang = get_element_lang(parse_data, attribute_names, attribute_values); } + else + if (strcmp(element_name, SUPPORTS_RESTRICTED_ACCESS_ELEMENT) == 0) + { + if (( attribute_names[0] != NULL + && strcmp(attribute_names[0], RESTRICTED_ACCESS_OPTION_ATTR) != 0) + || attribute_names[1] != NULL) + { + error_msg("XML event configuration error: '%s' element misses attribute '%s'", + SUPPORTS_RESTRICTED_ACCESS_ELEMENT, RESTRICTED_ACCESS_OPTION_ATTR); + return; + } + + parse_data->event_config.values->ec_restricted_access_option = xstrdup(attribute_values[0]); + } } // Called for close tags @@ -489,6 +505,10 @@ static void text(GMarkupParseContext *context, { ui->ec_sending_sensitive_data = string_to_bool(text_copy); } + else if (strcmp(inner_element, SUPPORTS_RESTRICTED_ACCESS_ELEMENT) == 0) + { + ui->ec_supports_restricted_access = string_to_bool(text_copy); + } } free(text_copy); } diff --git a/tests/Makefile.am b/tests/Makefile.am index 825a870..9aa3a07 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -46,7 +46,8 @@ TESTSUITE_AT = \ dump_dir.at \ global_config.at \ iso_date.at \ - uriparser.at + uriparser.at \ + event_config.at TESTSUITE_AT_IN = \ bugzilla_plugin.at diff --git a/tests/conf/event_implicit_no_support_restricted.xml b/tests/conf/event_implicit_no_support_restricted.xml new file mode 100644 index 0000000..eb37be8 --- /dev/null +++ b/tests/conf/event_implicit_no_support_restricted.xml @@ -0,0 +1,13 @@ + + + Bugzilla + Report to Bugzilla bug tracker + Report to Bugzilla bug tracker in long description + + + + + diff --git a/tests/conf/event_no_support_restricted.xml b/tests/conf/event_no_support_restricted.xml new file mode 100644 index 0000000..b2c83b1 --- /dev/null +++ b/tests/conf/event_no_support_restricted.xml @@ -0,0 +1,15 @@ + + + Bugzilla + Report to Bugzilla bug tracker + Report to Bugzilla bug tracker in long description + + no + + + + + diff --git a/tests/conf/event_support_restricted_no_option.xml b/tests/conf/event_support_restricted_no_option.xml new file mode 100644 index 0000000..b70e64b --- /dev/null +++ b/tests/conf/event_support_restricted_no_option.xml @@ -0,0 +1,15 @@ + + + Bugzilla + Report to Bugzilla bug tracker + Report to Bugzilla bug tracker in long description + + yes + + + + + diff --git a/tests/conf/event_support_restricted_with_option.xml b/tests/conf/event_support_restricted_with_option.xml new file mode 100644 index 0000000..ce5a1f9 --- /dev/null +++ b/tests/conf/event_support_restricted_with_option.xml @@ -0,0 +1,15 @@ + + + Bugzilla + Report to Bugzilla bug tracker + Report to Bugzilla bug tracker in long description + + yes + + + + + diff --git a/tests/event_config.at b/tests/event_config.at new file mode 100644 index 0000000..5baf000 --- /dev/null +++ b/tests/event_config.at @@ -0,0 +1,60 @@ +# -*- Autotest -*- + +AT_BANNER([Event config]) + +## ----------------- ## +## restricted_access ## +## ----------------- ## + +AT_TESTFUN([restricted_access], +[[ + +#include "testsuite.h" + +TS_MAIN +{ + event_config_t *ect = new_event_config("restricted_access"); + + TS_ASSERT_FALSE(ect->ec_supports_restricted_access); + TS_ASSERT_PTR_IS_NULL(ect->ec_restricted_access_option); + TS_ASSERT_FALSE(ec_restricted_access_enabled(ect)); + + ect->ec_supports_restricted_access = true; + + TS_ASSERT_PTR_IS_NULL(ect->ec_restricted_access_option); + TS_ASSERT_FALSE(ec_restricted_access_enabled(ect)); + + ect->ec_restricted_access_option = xstrdup("PrivateTicket"); + + TS_ASSERT_FALSE(ec_restricted_access_enabled(ect)); + + event_option_t *eot = new_event_option(); + eot->eo_name = xstrdup("PrivateTicket"); + eot->eo_value = NULL; + + ect->options = g_list_prepend(ect->options, eot); + + TS_ASSERT_FALSE(ec_restricted_access_enabled(ect)); + + eot->eo_type = OPTION_TYPE_BOOL; + eot->eo_value = xstrdup("no"); + + TS_ASSERT_FALSE(ec_restricted_access_enabled(ect)); + + free(eot->eo_value); + eot->eo_value = xstrdup("yes"); + + TS_ASSERT_TRUE(ec_restricted_access_enabled(ect)); + + eot->eo_type = OPTION_TYPE_NUMBER; + + TS_ASSERT_FALSE(ec_restricted_access_enabled(ect)); + + ect->ec_supports_restricted_access = false; + + TS_ASSERT_FALSE(ec_restricted_access_enabled(ect)); + + free_event_config(ect); +} +TS_RETURN_MAIN +]]) diff --git a/tests/testsuite.at b/tests/testsuite.at index c8269b1..392c3db 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -22,3 +22,4 @@ m4_include([global_config.at]) m4_include([iso_date.at]) m4_include([uriparser.at]) m4_include([bugzilla_plugin.at]) +m4_include([event_config.at]) diff --git a/tests/xml_definition.at b/tests/xml_definition.at index 29043f8..7d2140f 100644 --- a/tests/xml_definition.at +++ b/tests/xml_definition.at @@ -137,3 +137,54 @@ int main(void) return EXIT_SUCCESS; } ]]) + +## ----------------- ## +## restricted_access ## +## ----------------- ## + +AT_TESTFUN([restricted_access], +[[ + +#include "testsuite.h" + +TS_MAIN +{ + { + event_config_t *event_config = new_event_config("event_test_definition"); + load_event_description_from_file(event_config, "../../conf/event_no_support_restricted.xml"); + + TS_ASSERT_FALSE(event_config->ec_supports_restricted_access); + TS_ASSERT_PTR_IS_NULL(event_config->ec_restricted_access_option); + + free_event_config(event_config); + } + { + event_config_t *event_config = new_event_config("event_test_definition"); + load_event_description_from_file(event_config, "../../conf/event_implicit_no_support_restricted.xml"); + + TS_ASSERT_FALSE(event_config->ec_supports_restricted_access); + TS_ASSERT_PTR_IS_NULL(event_config->ec_restricted_access_option); + + free_event_config(event_config); + } + { + event_config_t *event_config = new_event_config("event_test_definition"); + load_event_description_from_file(event_config, "../../conf/event_support_restricted_no_option.xml"); + + TS_ASSERT_TRUE(event_config->ec_supports_restricted_access); + TS_ASSERT_PTR_IS_NULL(event_config->ec_restricted_access_option); + + free_event_config(event_config); + } + { + event_config_t *event_config = new_event_config("event_test_definition"); + load_event_description_from_file(event_config, "../../conf/event_support_restricted_with_option.xml"); + + TS_ASSERT_TRUE(event_config->ec_supports_restricted_access); + TS_ASSERT_STRING_EQ(event_config->ec_restricted_access_option, "Bugzilla_RestrictedAccess", "Loaded from configuration"); + + free_event_config(event_config); + } +} +TS_RETURN_MAIN +]]) -- 1.8.3.1