Blame src/lib/global_configuration.c

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
}