libidav/config.h

Thu, 14 Nov 2024 23:22:35 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 14 Nov 2024 23:22:35 +0100
changeset 85
44ebbb4c8a13
parent 72
d5307e9ee384
permissions
-rw-r--r--

add support for secret store credentials when connecting to repositories, resolves #496

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2023 Olaf Wintermann. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *
 *   2. Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef LIBIDAV_CONFIG_H
#define LIBIDAV_CONFIG_H

#include "webdav.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef struct DavConfig         DavConfig;
typedef struct DavCfgRepository  DavCfgRepository;
typedef struct DavCfgProxy       DavCfgProxy;
typedef struct DavCfgKey         DavCfgKey;
typedef struct DavCfgNamespace   DavCfgNamespace;
typedef struct DavCfgSecretStore DavCfgSecretStore;

typedef struct CfgString  CfgString;
typedef struct CfgInt     CfgInt;
typedef struct CfgUInt    CfgUInt;
typedef struct CfgBool    CfgBool;

typedef enum dav_cfg_key_type DavCfgKeyType;

typedef cxmutstr (*dav_loadkeyfile_func)(const char *filename);

#define DAV_HTTP_PROXY 1
#define DAV_HTTPS_PROXY 2
    
enum dav_cfg_key_type {
    DAV_KEY_TYPE_AES256 = 0,
    DAV_KEY_TYPE_AES128,
    DAV_KEY_TYPE_UNKNOWN
};

struct DavConfig {
    CxMempool         *mp;
    
    DavCfgRepository  *repositories;
    DavCfgKey         *keys;
    DavCfgNamespace   *namespaces;
    DavCfgProxy       *http_proxy;
    DavCfgProxy       *https_proxy;
    DavCfgSecretStore *secretstore;
    
    xmlDoc *doc;
};

struct CfgString {
    cxmutstr value;
    xmlNode *node;
};

struct CfgInt {
    int64_t value;
    xmlNode *node;
};

struct CfgUInt {
    uint64_t value;
    xmlNode *node;
};

struct CfgBool {
    bool value;
    xmlNode *node;
};


struct DavCfgRepository {
    xmlNode *node;
    
    CfgString     name;
    CfgString     url;
    CfgString     user;
    CfgString     password;
    CfgString     stored_user;
    CfgString     default_key;
    CfgString     cert;
    CfgBool       verification;
    
    CfgBool       full_encryption;
    CfgBool       content_encryption;
    CfgBool       decrypt_content;
    CfgBool       decrypt_name;
    CfgBool       decrypt_properties;
    
    CfgInt        ssl_version;
    CfgUInt       authmethods;
    
    int           unknown_elements;
    
    DavCfgRepository    *prev;
    DavCfgRepository    *next;
};

struct DavCfgProxy {
    CfgString  url;
    CfgString  user;
    CfgString  password;
    CfgString  noproxy;
    
    int     unknown_elements;
};

struct DavCfgKey {
    xmlNode *node;
    
    CfgString  name;
    CfgString  file;
    DavCfgKeyType type;
    xmlNode *type_node;
    
    DavCfgKey *prev;
    DavCfgKey *next;
    
    int       unknown_elements;
};

struct DavCfgNamespace {
    xmlNode *node;
    cxmutstr prefix;
    cxmutstr uri;
    
    DavCfgNamespace *prev;
    DavCfgNamespace *next;
};

struct DavCfgSecretStore {
    CfgString unlock_cmd;
    CfgString lock_cmd;
};

enum DavConfigError {
    DAV_CONFIG_ERROR_XML = 0
};

DavConfig* dav_config_new(xmlDoc *doc);

DavConfig* dav_config_load(cxmutstr xmlfilecontent, int *error);

void dav_config_free(DavConfig *config);

CxBuffer* dav_config2buf(DavConfig *config);

void dav_config_add_repository(DavConfig *config, DavCfgRepository *repo);

DavCfgRepository* dav_repository_new(DavConfig *config);
void dav_repository_free(DavConfig *config, DavCfgRepository *repo);
void dav_repository_remove_and_free(DavConfig *config, DavCfgRepository *repo);
int dav_repository_get_flags(DavCfgRepository *repo);
void dav_repository_set_url(DavConfig *config, DavCfgRepository *repo, cxstring newurl);
void dav_repository_set_auth(DavConfig *config, DavCfgRepository *repo, cxstring user, cxstring password);
cxmutstr dav_repository_get_decodedpassword(DavCfgRepository *repo);

void dav_config_add_key(DavConfig *config, DavCfgKey *key);

DavCfgKey* dav_key_new(DavConfig *config);
void dav_key_remove_and_free(DavConfig *config, DavCfgKey *key);

int dav_str2ssl_version(const char *str);

int dav_cfg_string_set_node_value(DavConfig *config, CfgString *str, xmlNode *node);
void dav_cfg_bool_set_node_value(DavConfig *config, CfgBool *cbool, xmlNode *node);

void dav_cfg_string_set_value(DavConfig *config, CfgString *str, xmlNode *parent, cxstring new_value, const char *nodename);
void dav_cfg_bool_set_value(DavConfig *config, CfgBool *cbool, xmlNode *parent, DavBool new_value, const char *nodename);
void dav_cfg_int_set_value(DavConfig *config, CfgInt *cint, xmlNode *parent, int64_t new_value, const char *nodename);
void dav_cfg_uint_set_value(DavConfig *config, CfgUInt *cint, xmlNode *parent, uint64_t new_value, const char *nodename);

void dav_cfg_string_remove(CfgString *str);
void dav_cfg_bool_remove(CfgBool *cbool);
void dav_cfg_int_remove(CfgInt *cint);
void dav_cfg_uint_remove(CfgUInt *cint);

DavCfgRepository* dav_config_get_repository(DavConfig *config, cxstring name);
DavCfgRepository* dav_config_url2repo(DavConfig *config, const char *url, char **path);
DavCfgRepository* dav_config_url2repo_s(DavConfig *config, cxstring url, cxmutstr *path);

int dav_config_keytype(DavCfgKeyType type);
const char* dav_config_keytype_str(DavCfgKeyType type);
int dav_config_register_keys(DavConfig *config, DavContext *ctx, dav_loadkeyfile_func loadkey);

int dav_config_register_namespaces(DavConfig *config, DavContext *ctx);

#ifdef __cplusplus
}
#endif

#endif /* LIBIDAV_CONFIG_H */

mercurial