|
Packit |
4f15d5 |
/*
|
|
Packit |
4f15d5 |
Copyright (C) 2015 ABRT team
|
|
Packit |
4f15d5 |
Copyright (C) 2015 RedHat Inc
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
This program is free software; you can redistribute it and/or modify
|
|
Packit |
4f15d5 |
it under the terms of the GNU General Public License as published by
|
|
Packit |
4f15d5 |
the Free Software Foundation; either version 2 of the License, or
|
|
Packit |
4f15d5 |
(at your option) any later version.
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
This program is distributed in the hope that it will be useful,
|
|
Packit |
4f15d5 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
4f15d5 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
4f15d5 |
GNU General Public License for more details.
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
You should have received a copy of the GNU General Public License along
|
|
Packit |
4f15d5 |
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
Packit |
4f15d5 |
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
Packit |
4f15d5 |
*/
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
#include "global_configuration.h"
|
|
Packit |
4f15d5 |
#include "internal_libreport.h"
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
#define OPT_NAME_SCRUBBED_VARIABLES "ScrubbedENVVariables"
|
|
Packit |
4f15d5 |
#define OPT_NAME_EXCLUDED_ELEMENTS "AlwaysExcludedElements"
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
static const char *const s_recognized_options[] = {
|
|
Packit |
4f15d5 |
OPT_NAME_SCRUBBED_VARIABLES,
|
|
Packit |
4f15d5 |
OPT_NAME_EXCLUDED_ELEMENTS,
|
|
Packit |
4f15d5 |
NULL,
|
|
Packit |
4f15d5 |
};
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
static map_string_t *s_global_settings;
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
bool load_global_configuration(void)
|
|
Packit |
4f15d5 |
{
|
|
Packit |
4f15d5 |
static const char *dirs[] = {
|
|
Packit |
4f15d5 |
CONF_DIR,
|
|
Packit |
4f15d5 |
NULL,
|
|
Packit |
4f15d5 |
NULL,
|
|
Packit |
4f15d5 |
};
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
static int dir_flags[] = {
|
|
Packit |
4f15d5 |
CONF_DIR_FLAG_NONE,
|
|
Packit |
4f15d5 |
CONF_DIR_FLAG_OPTIONAL,
|
|
Packit |
4f15d5 |
-1,
|
|
Packit |
4f15d5 |
};
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
if (dirs[1] == NULL)
|
|
Packit |
4f15d5 |
dirs[1] = get_user_conf_base_dir();
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
return load_global_configuration_from_dirs(dirs, dir_flags);
|
|
Packit |
4f15d5 |
}
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
bool load_global_configuration_from_dirs(const char *dirs[], int dir_flags[])
|
|
Packit |
4f15d5 |
{
|
|
Packit |
4f15d5 |
if (s_global_settings == NULL)
|
|
Packit |
4f15d5 |
{
|
|
Packit |
4f15d5 |
s_global_settings = new_map_string();
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
bool ret = load_conf_file_from_dirs_ext("libreport.conf", dirs, dir_flags, s_global_settings,
|
|
Packit |
4f15d5 |
/*don't skip without value*/ false);
|
|
Packit |
4f15d5 |
if (!ret)
|
|
Packit |
4f15d5 |
{
|
|
Packit |
4f15d5 |
error_msg("Failed to load libreport global configuration");
|
|
Packit |
4f15d5 |
free_global_configuration();
|
|
Packit |
4f15d5 |
return false;
|
|
Packit |
4f15d5 |
}
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
map_string_iter_t iter;
|
|
Packit |
4f15d5 |
init_map_string_iter(&iter, s_global_settings);
|
|
Packit |
4f15d5 |
const char *key, *value;
|
|
Packit |
4f15d5 |
while(next_map_string_iter(&iter, &key, &value))
|
|
Packit |
4f15d5 |
{
|
|
Packit |
4f15d5 |
/* Die to avoid security leaks in case where someone made a typo in a option name */
|
|
Packit |
4f15d5 |
if (!is_in_string_list(key, s_recognized_options))
|
|
Packit |
4f15d5 |
{
|
|
Packit |
4f15d5 |
error_msg("libreport global configuration contains unrecognized option : '%s'", key);
|
|
Packit |
4f15d5 |
free_global_configuration();
|
|
Packit |
4f15d5 |
return false;
|
|
Packit |
4f15d5 |
}
|
|
Packit |
4f15d5 |
}
|
|
Packit |
4f15d5 |
}
|
|
Packit |
4f15d5 |
else
|
|
Packit |
4f15d5 |
log_notice("libreport global configuration already loaded");
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
return true;
|
|
Packit |
4f15d5 |
}
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
void free_global_configuration(void)
|
|
Packit |
4f15d5 |
{
|
|
Packit |
4f15d5 |
if (s_global_settings != NULL)
|
|
Packit |
4f15d5 |
{
|
|
Packit |
4f15d5 |
free_map_string(s_global_settings);
|
|
Packit |
4f15d5 |
s_global_settings = NULL;
|
|
Packit |
4f15d5 |
}
|
|
Packit |
4f15d5 |
}
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
static void assert_global_configuration_initialized(void)
|
|
Packit |
4f15d5 |
{
|
|
Packit |
4f15d5 |
if (NULL == s_global_settings)
|
|
Packit |
4f15d5 |
{
|
|
Packit |
4f15d5 |
error_msg("libreport global configuration is not initialized");
|
|
Packit |
4f15d5 |
abort();
|
|
Packit |
4f15d5 |
}
|
|
Packit |
4f15d5 |
}
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
#define get_helper(type, getter, name) \
|
|
Packit |
4f15d5 |
({ \
|
|
Packit |
4f15d5 |
assert_global_configuration_initialized(); \
|
|
Packit |
4f15d5 |
type opt; \
|
|
Packit |
4f15d5 |
if (getter(s_global_settings, name, &opt)) \
|
|
Packit |
4f15d5 |
/* Die to avoid security leaks in case where someone made a error */ \
|
|
Packit |
4f15d5 |
error_msg_and_die("libreport global settings contains invalid data: '"name"'"); \
|
|
Packit |
4f15d5 |
opt;\
|
|
Packit |
4f15d5 |
})
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
string_vector_ptr_t get_global_always_excluded_elements(void)
|
|
Packit |
4f15d5 |
{
|
|
Packit |
4f15d5 |
assert_global_configuration_initialized();
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
char *env_exclude = getenv("EXCLUDE_FROM_REPORT");
|
|
Packit |
4f15d5 |
const char *gc_exclude = get_map_string_item_or_NULL(s_global_settings, OPT_NAME_EXCLUDED_ELEMENTS);
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
if (env_exclude != NULL && gc_exclude == NULL)
|
|
Packit |
4f15d5 |
return string_vector_new_from_string(env_exclude);
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
if (env_exclude == NULL && gc_exclude != NULL)
|
|
Packit |
4f15d5 |
return string_vector_new_from_string(gc_exclude);
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
if (env_exclude == NULL && gc_exclude == NULL)
|
|
Packit |
4f15d5 |
return string_vector_new_from_string(NULL);
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
char *joined_exclude = xasprintf("%s, %s", env_exclude, gc_exclude);
|
|
Packit |
4f15d5 |
string_vector_ptr_t ret = string_vector_new_from_string(joined_exclude);
|
|
Packit |
4f15d5 |
free(joined_exclude);
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
return ret;
|
|
Packit |
4f15d5 |
}
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
bool get_global_create_private_ticket(void)
|
|
Packit |
4f15d5 |
{
|
|
Packit |
4f15d5 |
assert_global_configuration_initialized();
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
char *env_create_private = getenv(CREATE_PRIVATE_TICKET);
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
if (env_create_private == NULL)
|
|
Packit |
4f15d5 |
return false;
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
return string_to_bool(env_create_private);
|
|
Packit |
4f15d5 |
}
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
void set_global_create_private_ticket(bool enabled, int flags/*unused - persistent*/)
|
|
Packit |
4f15d5 |
{
|
|
Packit |
4f15d5 |
assert_global_configuration_initialized();
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
if (enabled)
|
|
Packit |
4f15d5 |
xsetenv(CREATE_PRIVATE_TICKET, "1");
|
|
Packit |
4f15d5 |
else
|
|
Packit |
4f15d5 |
safe_unsetenv(CREATE_PRIVATE_TICKET);
|
|
Packit |
4f15d5 |
}
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
bool get_global_stop_on_not_reportable(void)
|
|
Packit |
4f15d5 |
{
|
|
Packit |
4f15d5 |
assert_global_configuration_initialized();
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
char *env_create_private = getenv(STOP_ON_NOT_REPORTABLE);
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
if (env_create_private == NULL)
|
|
Packit |
4f15d5 |
return true;
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
return string_to_bool(env_create_private);
|
|
Packit |
4f15d5 |
}
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
void set_global_stop_on_not_reportable(bool enabled, int flags/*unused - persistent*/)
|
|
Packit |
4f15d5 |
{
|
|
Packit |
4f15d5 |
assert_global_configuration_initialized();
|
|
Packit |
4f15d5 |
|
|
Packit |
4f15d5 |
if (enabled)
|
|
Packit |
4f15d5 |
xsetenv(STOP_ON_NOT_REPORTABLE, "1");
|
|
Packit |
4f15d5 |
else
|
|
Packit |
4f15d5 |
xsetenv(STOP_ON_NOT_REPORTABLE, "0");
|
|
Packit |
4f15d5 |
}
|