libidav/config.c

Thu, 28 Nov 2024 17:53:13 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 28 Nov 2024 17:53:13 +0100
changeset 850
bbe2925eb590
parent 845
8ac8bf29e2ee
permissions
-rw-r--r--

revert property set/remove list changes

795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2023 Olaf Wintermann. All rights reserved.
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include "config.h"
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #include <stdio.h>
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32 #include <stdlib.h>
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 #include <string.h>
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34 #include <sys/types.h>
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 #include <cx/hash_map.h>
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36 #include <errno.h>
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37 #include <libxml/tree.h>
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 #include "utils.h"
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 #define xstreq(a,b) xmlStrEqual(BAD_CAST a, BAD_CAST b)
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 #define xstrEQ(a,b) !xmlStrcasecmp(BAD_CAST a, BAD_CAST b)
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 #define print_error(lineno, ...) \
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 do {\
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 fprintf(stderr, "Error (config.xml line %u): ", lineno); \
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 fprintf(stderr, __VA_ARGS__); \
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 fprintf(stderr, "Abort.\n"); \
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 } while(0);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 #define print_warning(lineno, ...) \
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 do {\
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 fprintf(stderr, "Warning (config.xml line %u): ", lineno); \
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 fprintf(stderr, __VA_ARGS__); \
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 } while(0);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 #ifdef _WIN32
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56 #define ENV_HOME getenv("USERPROFILE")
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57 #else
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58 #define ENV_HOME getenv("HOME")
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59 #endif /* _WIN32 */
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62 static int load_repository(
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 DavConfig *config,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64 DavCfgRepository **list_begin,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 DavCfgRepository **list_end,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66 xmlNode *reponode);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67 static int load_key(
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68 DavConfig *config,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69 DavCfgKey **list_begin,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 DavCfgKey **list_end,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 xmlNode *keynode);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72 static int load_proxy(
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 DavConfig *config, DavCfgProxy *proxy, xmlNode *proxynode, int type);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74 static int load_namespace(
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 DavConfig *config,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 DavCfgNamespace **list_begin,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 DavCfgNamespace **list_end,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 xmlNode *node);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79 static int load_secretstore(DavConfig *config, xmlNode *node);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
82 int dav_cfg_string_set_node_value(DavConfig *config, CfgString *str, xmlNode *node) {
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 str->node = node;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84 char *value = util_xml_get_text(node);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85 if(value) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
86 str->value = cx_strdup_a(config->mp->allocator, cx_str(value));
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87 return 0;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
88 } else {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 str->value = (cxmutstr){NULL, 0};
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90 return 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
94 void dav_cfg_bool_set_node_value(DavConfig *config, CfgBool *cbool, xmlNode *node) {
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95 cbool->node = node;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96 char *value = util_xml_get_text(node);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97 cbool->value = util_getboolean(value);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
100 static void set_xml_content(xmlNode *node, const char *content) {
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
101 xmlNode *child = node->children;
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
102 while(child) {
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
103 xmlNode *next = child->next;
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
104 xmlUnlinkNode(child);
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
105 xmlFreeNode(child);
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
106 child = next;
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
107 }
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
108
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
109 if(content) {
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
110 xmlChar *encoded = xmlEncodeSpecialChars(node->doc, (const xmlChar*)content);
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
111 if(encoded) {
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
112 xmlNodeSetContent(node, encoded);
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
113 xmlFree(encoded);
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
114 }
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
115 }
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
116 }
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
117
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
118 void dav_cfg_string_set_value(DavConfig *config, CfgString *str, xmlNode *parent, cxstring new_value, const char *nodename) {
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
119 if(str->value.ptr) {
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
120 cxFree(config->mp->allocator, str->value.ptr);
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
121 }
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
122 if(new_value.ptr) {
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
123 str->value = cx_strdup_a(config->mp->allocator, new_value);
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
124 } else {
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
125 str->value = cx_mutstrn(NULL, 0);
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
126 }
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
127
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
128 if(!str->node) {
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
129 str->node = xmlNewNode(NULL, (const xmlChar*) nodename);
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
130 xmlAddChild(parent, str->node);
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
131 }
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
132 set_xml_content(str->node, new_value.ptr);
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
133 }
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
134
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
135 void dav_cfg_bool_set_value(DavConfig *config, CfgBool *cbool, xmlNode *parent, DavBool new_value, const char *nodename) {
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
136 const char *content = new_value ? "true" : "false";
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
137 cbool->value = new_value;
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
138 if(!cbool->node) {
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
139 cbool->node = xmlNewNode(NULL, (const xmlChar*) nodename);
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
140 xmlAddChild(parent, cbool->node);
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
141 }
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
142 set_xml_content(cbool->node, content);
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
143 }
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
144
837
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
145 void dav_cfg_int_set_value(DavConfig *config, CfgInt *cint, xmlNode *parent, int64_t new_value, const char *nodename) {
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
146 char content[32];
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
147 snprintf(content, 32, "%" PRId64, new_value);
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
148 cint->value = new_value;
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
149 if(!cint->node) {
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
150 cint->node = xmlNewNode(NULL, (const xmlChar*) nodename);
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
151 xmlAddChild(parent, cint->node);
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
152 }
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
153 set_xml_content(cint->node, content);
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
154 }
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
155
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
156 void dav_cfg_uint_set_value(DavConfig *config, CfgUInt *cint, xmlNode *parent, uint64_t new_value, const char *nodename) {
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
157 char content[32];
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
158 snprintf(content, 32, "%" PRIu64, new_value);
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
159 cint->value = new_value;
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
160 if(!cint->node) {
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
161 cint->node = xmlNewNode(NULL, (const xmlChar*) nodename);
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
162 xmlAddChild(parent, cint->node);
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
163 }
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
164 set_xml_content(cint->node, content);
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
165 }
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
166
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
167 void dav_cfg_string_remove(CfgString *str) {
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
168 if(str->node) {
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
169 xmlUnlinkNode(str->node);
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
170 xmlFreeNode(str->node);
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
171 str->node = NULL;
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
172 }
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
173 }
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
174
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
175 void dav_cfg_bool_remove(CfgBool *cbool) {
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
176 if(cbool->node) {
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
177 xmlUnlinkNode(cbool->node);
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
178 xmlFreeNode(cbool->node);
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
179 cbool->node = NULL;
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
180 }
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
181 }
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
182
837
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
183 void dav_cfg_int_remove(CfgInt *cint) {
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
184 if(cint->node) {
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
185 xmlUnlinkNode(cint->node);
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
186 xmlFreeNode(cint->node);
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
187 cint->node = NULL;
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
188 }
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
189 }
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
190
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
191 void dav_cfg_uint_remove(CfgUInt *cint) {
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
192 if(cint->node) {
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
193 xmlUnlinkNode(cint->node);
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
194 xmlFreeNode(cint->node);
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
195 cint->node = NULL;
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
196 }
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
197 }
b5984d5cc40c add utility functions for setting CfgInt/CfgUInt values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 836
diff changeset
198
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
199
827
d9928f11970f fix load_config stores wrong xml doc pointer in the config object
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 826
diff changeset
200 DavConfig* dav_config_new(xmlDoc *doc) {
826
b6e9fd3f1951 fix dav add-repo crash in case .dav/config.xml doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 823
diff changeset
201 CxMempool *cfg_mp = cxMempoolCreate(128, NULL);
b6e9fd3f1951 fix dav add-repo crash in case .dav/config.xml doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 823
diff changeset
202 DavConfig *config = cxMalloc(cfg_mp->allocator, sizeof(DavConfig));
b6e9fd3f1951 fix dav add-repo crash in case .dav/config.xml doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 823
diff changeset
203 memset(config, 0, sizeof(DavConfig));
b6e9fd3f1951 fix dav add-repo crash in case .dav/config.xml doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 823
diff changeset
204 config->mp = cfg_mp;
b6e9fd3f1951 fix dav add-repo crash in case .dav/config.xml doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 823
diff changeset
205
827
d9928f11970f fix load_config stores wrong xml doc pointer in the config object
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 826
diff changeset
206 if(!doc) {
d9928f11970f fix load_config stores wrong xml doc pointer in the config object
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 826
diff changeset
207 doc = xmlNewDoc(BAD_CAST "1.0");
d9928f11970f fix load_config stores wrong xml doc pointer in the config object
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 826
diff changeset
208 xmlNode *root = xmlNewNode(NULL, BAD_CAST "configuration");
d9928f11970f fix load_config stores wrong xml doc pointer in the config object
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 826
diff changeset
209 xmlDocSetRootElement(doc, root);
d9928f11970f fix load_config stores wrong xml doc pointer in the config object
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 826
diff changeset
210 }
826
b6e9fd3f1951 fix dav add-repo crash in case .dav/config.xml doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 823
diff changeset
211 config->doc = doc;
b6e9fd3f1951 fix dav add-repo crash in case .dav/config.xml doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 823
diff changeset
212
b6e9fd3f1951 fix dav add-repo crash in case .dav/config.xml doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 823
diff changeset
213 return config;
b6e9fd3f1951 fix dav add-repo crash in case .dav/config.xml doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 823
diff changeset
214 }
b6e9fd3f1951 fix dav add-repo crash in case .dav/config.xml doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 823
diff changeset
215
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
216 DavConfig* dav_config_load(cxmutstr xmlfilecontent, int *error) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
217 xmlDoc *doc = xmlReadMemory(xmlfilecontent.ptr, xmlfilecontent.length, NULL, NULL, 0);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
218 if(!doc) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
219 if(error) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
220 *error = DAV_CONFIG_ERROR_XML;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
221 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
222 return NULL;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
223 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
224
827
d9928f11970f fix load_config stores wrong xml doc pointer in the config object
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 826
diff changeset
225 DavConfig *config = dav_config_new(doc);
826
b6e9fd3f1951 fix dav add-repo crash in case .dav/config.xml doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 823
diff changeset
226 CxMempool *cfg_mp = config->mp;
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
227 cxMempoolRegister(cfg_mp, doc, (cx_destructor_func)xmlFreeDoc);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
228
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
229 DavCfgRepository *repos_begin = NULL;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
230 DavCfgRepository *repos_end = NULL;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
231 DavCfgKey *keys_begin = NULL;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
232 DavCfgKey *keys_end = NULL;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
233 DavCfgNamespace *namespaces_begin = NULL;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
234 DavCfgNamespace *namespaces_end = NULL;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
235
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
236 xmlNode *xml_root = xmlDocGetRootElement(doc);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
237 xmlNode *node = xml_root->children;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
238 int ret = 0;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
239 while(node && !ret) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
240 if(node->type == XML_ELEMENT_NODE) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
241 if(xstreq(node->name, "repository")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
242 ret = load_repository(config, &repos_begin, &repos_end, node);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
243 } else if(xstreq(node->name, "key")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
244 ret = load_key(config, &keys_begin, &keys_end, node);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
245 } else if (xstreq(node->name, "http-proxy")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
246 config->http_proxy = cxCalloc(config->mp->allocator, 1, sizeof(DavCfgProxy));
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
247 ret = load_proxy(config, config->http_proxy, node, DAV_HTTP_PROXY);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
248 } else if (xstreq(node->name, "https-proxy")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
249 config->https_proxy = cxCalloc(config->mp->allocator, 1, sizeof(DavCfgProxy));
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
250 ret = load_proxy(config, config->https_proxy, node, DAV_HTTPS_PROXY);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
251 } else if (xstreq(node->name, "namespace")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
252 ret = load_namespace(config, &namespaces_begin, &namespaces_end, node);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
253 } else if (xstreq(node->name, "secretstore")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
254 ret = load_secretstore(config, node);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
255 } else {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
256 fprintf(stderr, "Unknown config element: %s\n", node->name);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
257 ret = 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
258 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
259 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
260 node = node->next;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
261 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
262
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
263 config->repositories = repos_begin;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
264 config->keys = keys_begin;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
265 config->namespaces = namespaces_begin;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
266
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
267 if(ret != 0 && error) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
268 *error = ret;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
269 cxMempoolDestroy(cfg_mp);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
270 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
271
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
272 return config;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
273 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
274
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
275 void dav_config_free(DavConfig *config) {
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
276 cxMempoolDestroy(config->mp);
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
277 }
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
278
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
279 CxBuffer* dav_config2buf(DavConfig *config) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
280 xmlChar* xmlText = NULL;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
281 int textLen = 0;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
282 xmlDocDumpFormatMemory(config->doc, &xmlText, &textLen, 1);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
283
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
284 if(!xmlText) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
285 return NULL;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
286 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
287
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
288 CxBuffer *buf = cxBufferCreate(NULL, textLen, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND|CX_BUFFER_FREE_CONTENTS);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
289 cxBufferWrite(xmlText, 1, textLen, buf);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
290 xmlFree(xmlText);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
291 return buf;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
292 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
293
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
294
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
295 static int repo_add_config(
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
296 DavConfig *config,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
297 DavCfgRepository *repo,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
298 xmlNode* node)
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
299 {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
300 unsigned short lineno = node->line;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
301 char *key = (char*)node->name;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
302 char *value = util_xml_get_text(node);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
303
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
304 /* every key needs a value */
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
305 if(!value) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
306 /* TODO: maybe this should only be reported, if the key is valid
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
307 * But this makes the code very ugly.
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
308 */
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
309 print_error(lineno, "missing value for config element: %s\n", key);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
310 return 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
311 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
312
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
313 if(xstreq(key, "name")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
314 dav_cfg_string_set_node_value(config, &repo->name, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
315 } else if(xstreq(key, "url")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
316 dav_cfg_string_set_node_value(config, &repo->url, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
317 } else if(xstreq(key, "user")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
318 dav_cfg_string_set_node_value(config, &repo->user, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
319 } else if(xstreq(key, "password")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
320 dav_cfg_string_set_node_value(config, &repo->password, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
321 } else if(xstreq(key, "stored-user")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
322 dav_cfg_string_set_node_value(config, &repo->stored_user, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
323 } else if(xstreq(key, "default-key")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
324 dav_cfg_string_set_node_value(config, &repo->default_key, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
325 } else if(xstreq(key, "full-encryption")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
326 dav_cfg_bool_set_node_value(config, &repo->full_encryption, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
327 } else if(xstreq(key, "content-encryption")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
328 dav_cfg_bool_set_node_value(config, &repo->content_encryption, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
329 } else if(xstreq(key, "decrypt-content")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
330 dav_cfg_bool_set_node_value(config, &repo->decrypt_content, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
331 } else if(xstreq(key, "decrypt-name")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
332 dav_cfg_bool_set_node_value(config, &repo->decrypt_name, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
333 } else if(xstreq(key, "cert")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
334 dav_cfg_string_set_node_value(config, &repo->cert, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
335 } else if(xstreq(key, "verification")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
336 dav_cfg_bool_set_node_value(config, &repo->verification, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
337 } else if(xstreq(key, "ssl-version")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
338 repo->ssl_version.node = node;
838
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
339 int ssl_version = dav_str2ssl_version((const char*)value);
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
340 if(ssl_version == -1) {
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
341 print_warning(lineno, "unknown ssl version: %s\n", value);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
342 repo->ssl_version.value = CURL_SSLVERSION_DEFAULT;
838
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
343 } else {
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
344 repo->ssl_version.value = ssl_version;
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
345 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
346 } else if(xstreq(key, "authmethods")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
347 repo->authmethods.node = node;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
348 repo->authmethods.value = CURLAUTH_NONE;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
349 const char *delims = " \t\r\n";
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
350 char *meths = strdup(value);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
351 char *meth = strtok(meths, delims);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
352 while (meth) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
353 if(xstrEQ(meth, "basic")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
354 repo->authmethods.value |= CURLAUTH_BASIC;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
355 } else if(xstrEQ(meth, "digest")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
356 repo->authmethods.value |= CURLAUTH_DIGEST;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
357 } else if(xstrEQ(meth, "negotiate")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
358 repo->authmethods.value |= CURLAUTH_GSSNEGOTIATE;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
359 } else if(xstrEQ(meth, "ntlm")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
360 repo->authmethods.value |= CURLAUTH_NTLM;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
361 } else if(xstrEQ(meth, "any")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
362 repo->authmethods.value = CURLAUTH_ANY;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
363 } else if(xstrEQ(meth, "none")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
364 /* skip */
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
365 } else {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
366 print_warning(lineno,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
367 "unknown authentication method: %s\n", meth);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
368 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
369 meth = strtok(NULL, delims);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
370 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
371 free(meths);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
372 } else {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
373 print_error(lineno, "unkown repository config element: %s\n", key);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
374 return 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
375 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
376 return 0;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
377 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
378
838
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
379 int dav_str2ssl_version(const char *value) {
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
380 if(xstrEQ(value, "TLSv1")) {
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
381 return CURL_SSLVERSION_TLSv1;
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
382 } else if(xstrEQ(value, "SSLv2")) {
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
383 return CURL_SSLVERSION_SSLv2;
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
384 } else if(xstrEQ(value, "SSLv3")) {
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
385 return CURL_SSLVERSION_SSLv3;
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
386 }
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
387 #if LIBCURL_VERSION_MAJOR * 1000 + LIBCURL_VERSION_MINOR >= 7034
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
388 else if(xstrEQ(value, "TLSv1.0")) {
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
389 return CURL_SSLVERSION_TLSv1_0;
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
390 } else if(xstrEQ(value, "TLSv1.1")) {
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
391 return CURL_SSLVERSION_TLSv1_1;
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
392 } else if(xstrEQ(value, "TLSv1.2")) {
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
393 return CURL_SSLVERSION_TLSv1_2;
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
394 }
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
395 #endif
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
396 #if LIBCURL_VERSION_MAJOR * 1000 + LIBCURL_VERSION_MINOR >= 7052
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
397 else if(xstrEQ(value, "TLSv1.3")) {
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
398 return CURL_SSLVERSION_TLSv1_3;
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
399 }
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
400 #endif
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
401 return -1;
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
402 }
d262210f8454 move ssl version parser to new function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 837
diff changeset
403
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
404 static int load_repository(
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
405 DavConfig *config,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
406 DavCfgRepository **list_begin,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
407 DavCfgRepository **list_end,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
408 xmlNode *reponode)
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
409 {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
410 DavCfgRepository *repo = dav_repository_new(config);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
411 repo->node = reponode;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
412
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
413 // add repo config from child nodes
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
414 xmlNode *node = reponode->children;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
415 int ret = 0;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
416 while(node && !ret) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
417 if(node->type == XML_ELEMENT_NODE) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
418 ret = repo_add_config(config, repo, node);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
419 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
420 node = node->next;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
421 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
422
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
423 // success: add repo to the configuration, error: free repo
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
424 if(ret) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
425 return 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
426 } else {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
427 cx_linked_list_add(
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
428 (void**)list_begin,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
429 (void**)list_end,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
430 offsetof(DavCfgRepository, prev),
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
431 offsetof(DavCfgRepository, next),
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
432 repo);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
433 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
434
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
435 return 0;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
436 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
437
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
438 static xmlNode* addXmlNode(xmlNode *node, const char *name, cxmutstr content) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
439 xmlNode *text1 = xmlNewDocText(node->doc, BAD_CAST "\t\t");
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
440 xmlAddChild(node, text1);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
441
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
442 cxmutstr ctn = cx_strdup(cx_strcast(content));
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
443 xmlNode *newNode = xmlNewChild(node, NULL, BAD_CAST name, BAD_CAST ctn.ptr);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
444 free(ctn.ptr);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
445
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
446 xmlNode *text2 = xmlNewDocText(node->doc, BAD_CAST "\n");
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
447 xmlAddChild(node, text2);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
448
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
449 return newNode;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
450 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
451
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
452 void dav_config_add_repository(DavConfig *config, DavCfgRepository *repo) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
453 if(repo->node) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
454 fprintf(stderr, "Error: dav_config_add_repository: node already exists\n");
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
455 return;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
456 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
457
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
458 xmlNode *repoNode = xmlNewNode(NULL, BAD_CAST "repository");
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
459 xmlNode *rtext1 = xmlNewDocText(config->doc, BAD_CAST "\n");
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
460 xmlAddChild(repoNode, rtext1);
839
23f3b02c6725 safe pwdstore decryption status
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 838
diff changeset
461 repo->node = repoNode;
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
462 if(repo->name.value.ptr) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
463 repo->name.node = addXmlNode(repoNode, "name", repo->name.value);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
464 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
465 if(repo->url.value.ptr) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
466 repo->url.node = addXmlNode(repoNode, "url", repo->url.value);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
467 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
468 if(repo->user.value.ptr) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
469 repo->user.node = addXmlNode(repoNode, "user", repo->user.value);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
470 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
471 if(repo->password.value.ptr) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
472 repo->password.node = addXmlNode(repoNode, "password", repo->password.value);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
473 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
474
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
475 if(repo->stored_user.value.ptr) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
476 repo->stored_user.node = addXmlNode(repoNode, "stored-user", repo->stored_user.value);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
477 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
478 if(repo->default_key.value.ptr) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
479 repo->default_key.node = addXmlNode(repoNode, "default-key", repo->default_key.value);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
480 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
481 if(repo->cert.value.ptr) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
482 repo->cert.node = addXmlNode(repoNode, "cert", repo->cert.value);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
483 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
484
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
485 // TODO: implement booleans
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
486
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
487 // indent closing tag
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
488 xmlNode *rtext2 = xmlNewDocText(config->doc, BAD_CAST "\t");
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
489 xmlAddChild(repoNode, rtext2);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
490
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
491 // add repository to internal list
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
492 DavCfgRepository **list_begin = &config->repositories;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
493 cx_linked_list_add(
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
494 (void**)list_begin,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
495 NULL,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
496 offsetof(DavCfgRepository, prev),
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
497 offsetof(DavCfgRepository, next),
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
498 repo);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
499
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
500 // add repository element to the xml document
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
501 xmlNode *xml_root = xmlDocGetRootElement(config->doc);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
502
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
503 xmlNode *text1 = xmlNewDocText(config->doc, BAD_CAST "\n\t");
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
504 xmlAddChild(xml_root, text1);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
505
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
506 xmlAddChild(xml_root, repoNode);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
507
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
508 xmlNode *text2 = xmlNewDocText(config->doc, BAD_CAST "\n");
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
509 xmlAddChild(xml_root, text2);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
510 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
511
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
512 DavCfgRepository* dav_repository_new(DavConfig *config) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
513 DavCfgRepository *repo = cxMalloc(config->mp->allocator, sizeof(DavCfgRepository));
804
1e24f187c362 fix indentation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 803
diff changeset
514 memset(repo, 0, sizeof(DavCfgRepository));
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
515 repo->decrypt_name.value = false;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
516 repo->decrypt_content.value = true;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
517 repo->decrypt_properties.value = false;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
518 repo->verification.value = true;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
519 repo->ssl_version.value = CURL_SSLVERSION_DEFAULT;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
520 repo->authmethods.value = CURLAUTH_BASIC;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
521 return repo;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
522 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
523
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
524 void dav_repository_free(DavConfig *config, DavCfgRepository *repo) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
525 // TODO
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
526 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
527
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
528 void dav_repository_remove_and_free(DavConfig *config, DavCfgRepository *repo) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
529 if(repo->prev) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
530 repo->prev->next = repo->next;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
531 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
532 if(repo->next) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
533 repo->next->prev = repo->prev;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
534 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
535
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
536 if(repo->node) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
537 // TODO: remove newline after repo node
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
538
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
539 xmlUnlinkNode(repo->node);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
540 xmlFreeNode(repo->node);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
541 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
542 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
543
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
544 int dav_repository_get_flags(DavCfgRepository *repo) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
545 int flags = 0;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
546
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
547 DavBool encrypt_content = FALSE;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
548 DavBool encrypt_name = FALSE;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
549 DavBool encrypt_properties = FALSE;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
550 DavBool decrypt_content = FALSE;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
551 DavBool decrypt_name = FALSE;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
552 DavBool decrypt_properties = FALSE;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
553 if(repo->full_encryption.value) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
554 encrypt_content = TRUE;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
555 encrypt_name = TRUE;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
556 encrypt_properties = TRUE;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
557 decrypt_content = TRUE;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
558 decrypt_name = TRUE;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
559 decrypt_properties = TRUE;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
560 } else if(repo->content_encryption.value) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
561 encrypt_content = TRUE;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
562 decrypt_content = TRUE;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
563 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
564
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
565 if(decrypt_content) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
566 flags |= DAV_SESSION_DECRYPT_CONTENT;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
567 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
568 if(decrypt_name) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
569 flags |= DAV_SESSION_DECRYPT_NAME;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
570 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
571 if(decrypt_properties) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
572 flags |= DAV_SESSION_DECRYPT_PROPERTIES;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
573 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
574 if(encrypt_content) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
575 flags |= DAV_SESSION_ENCRYPT_CONTENT;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
576 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
577 if(encrypt_name) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
578 flags |= DAV_SESSION_ENCRYPT_NAME;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
579 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
580 if(encrypt_properties) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
581 flags |= DAV_SESSION_ENCRYPT_PROPERTIES;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
582 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
583 return flags;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
584 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
585
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
586 void dav_repository_set_url(DavConfig *config, DavCfgRepository *repo, cxstring newurl) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
587 if(repo->url.value.ptr) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
588 cxFree(config->mp->allocator, repo->url.value.ptr);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
589 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
590 repo->url.value = cx_strdup_a(config->mp->allocator, newurl);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
591 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
592
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
593 void dav_repository_set_auth(DavConfig *config, DavCfgRepository *repo, cxstring user, cxstring password) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
594 const CxAllocator *a = config->mp->allocator;
827
d9928f11970f fix load_config stores wrong xml doc pointer in the config object
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 826
diff changeset
595 if(user.length > 0) {
d9928f11970f fix load_config stores wrong xml doc pointer in the config object
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 826
diff changeset
596 repo->user.value = cx_strdup_a(a, user);
d9928f11970f fix load_config stores wrong xml doc pointer in the config object
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 826
diff changeset
597 }
d9928f11970f fix load_config stores wrong xml doc pointer in the config object
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 826
diff changeset
598 if(password.length > 0) {
d9928f11970f fix load_config stores wrong xml doc pointer in the config object
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 826
diff changeset
599 char *pwenc = util_base64encode(password.ptr, password.length);
d9928f11970f fix load_config stores wrong xml doc pointer in the config object
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 826
diff changeset
600 repo->password.value = cx_strdup_a(a, cx_str(pwenc));
d9928f11970f fix load_config stores wrong xml doc pointer in the config object
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 826
diff changeset
601 free(pwenc);
d9928f11970f fix load_config stores wrong xml doc pointer in the config object
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 826
diff changeset
602 }
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
603 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
604
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
605 cxmutstr dav_repository_get_decodedpassword(DavCfgRepository *repo) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
606 cxmutstr pw = { NULL, 0 };
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
607 if(repo->password.value.ptr) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
608 pw = cx_mutstr(util_base64decode(repo->password.value.ptr));
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
609 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
610 return pw;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
611 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
612
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
613
845
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
614 void dav_config_add_key(DavConfig *config, DavCfgKey *key) {
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
615 cx_linked_list_add(
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
616 (void**)&config->keys,
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
617 NULL,
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
618 offsetof(DavCfgKey, prev),
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
619 offsetof(DavCfgKey, next),
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
620 key);
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
621
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
622 if(key->node) {
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
623 fprintf(stderr, "Error: dav_config_add_key: node already exists\n");
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
624 return;
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
625 }
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
626
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
627 xmlNode *keyNode = xmlNewNode(NULL, BAD_CAST "key");
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
628 xmlNode *rtext1 = xmlNewDocText(config->doc, BAD_CAST "\n");
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
629 xmlAddChild(keyNode, rtext1);
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
630 key->node = keyNode;
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
631
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
632 if(key->name.value.ptr) {
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
633 key->name.node = addXmlNode(keyNode, "name", key->name.value);
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
634 }
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
635 const char *type = dav_config_keytype_str(key->type);
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
636 if(type) {
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
637 key->type_node = addXmlNode(keyNode, "type", cx_mutstr((char*)type));
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
638 }
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
639 if(key->file.value.ptr) {
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
640 key->file.node = addXmlNode(keyNode, "file", key->file.value);
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
641 }
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
642
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
643 // indent closing tag
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
644 xmlNode *rtext2 = xmlNewDocText(config->doc, BAD_CAST "\t");
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
645 xmlAddChild(keyNode, rtext2);
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
646
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
647 // add key element to the xml document
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
648 xmlNode *xml_root = xmlDocGetRootElement(config->doc);
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
649
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
650 xmlNode *text1 = xmlNewDocText(config->doc, BAD_CAST "\n\t");
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
651 xmlAddChild(xml_root, text1);
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
652
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
653 xmlAddChild(xml_root, keyNode);
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
654
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
655 xmlNode *text2 = xmlNewDocText(config->doc, BAD_CAST "\n");
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
656 xmlAddChild(xml_root, text2);
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
657 }
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
658
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
659 DavCfgKey* dav_key_new(DavConfig *config) {
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
660 DavCfgKey *key = cxMalloc(config->mp->allocator, sizeof(DavCfgKey));
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
661 memset(key, 0, sizeof(DavCfgKey));
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
662 key->type = DAV_KEY_TYPE_AES256;
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
663 return key;
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
664 }
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
665
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
666 void dav_key_remove_and_free(DavConfig *config, DavCfgKey *key) {
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
667 cx_linked_list_remove(
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
668 (void**)&config->keys,
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
669 NULL,
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
670 offsetof(DavCfgKey, prev),
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
671 offsetof(DavCfgKey, next),
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
672 key);
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
673 if(key->node) {
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
674 // TODO: remove newline after key node
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
675
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
676 xmlUnlinkNode(key->node);
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
677 xmlFreeNode(key->node);
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
678 }
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
679 }
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
680
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
681
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
682 static int load_key(
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
683 DavConfig *config,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
684 DavCfgKey **list_begin,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
685 DavCfgKey **list_end,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
686 xmlNode *keynode)
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
687 {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
688 xmlNode *node = keynode->children;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
689 DavCfgKey *key = cxMalloc(config->mp->allocator, sizeof(DavCfgKey));
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
690 memset(key, 0, sizeof(DavCfgKey));
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
691 key->type = DAV_KEY_TYPE_AES256;
845
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
692 key->node = keynode;
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
693
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
694 int error = 0;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
695 while(node) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
696 if(node->type == XML_ELEMENT_NODE) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
697 if(xstreq(node->name, "name")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
698 dav_cfg_string_set_node_value(config, &key->name, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
699 } else if(xstreq(node->name, "file")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
700 dav_cfg_string_set_node_value(config, &key->file, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
701 } else if(xstreq(node->name, "type")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
702 const char *value = util_xml_get_text(node);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
703 key->type_node = node;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
704 if(!strcmp(value, "aes128")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
705 key->type = DAV_KEY_TYPE_AES128;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
706 } else if(!strcmp(value, "aes256")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
707 key->type = DAV_KEY_TYPE_AES256;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
708 } else {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
709 print_error(node->line, "unknown key type %s\n", value);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
710 error = 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
711 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
712 } else {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
713 key->unknown_elements++;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
714 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
715
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
716 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
717 node = node->next;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
718 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
719
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
720 if(!key->name.value.ptr) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
721 error = 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
722 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
723
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
724 if(!error) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
725 error = 0;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
726 size_t expected_length = 0;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
727 if(key->type == DAV_KEY_TYPE_AES128) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
728 expected_length = 16;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
729 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
730 if(key->type == DAV_KEY_TYPE_AES256) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
731 expected_length = 32;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
732 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
733 /*
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
734 if(key->length < expected_length) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
735 print_error(keynode->line, "key %s is too small (%zu < %zu)\n",
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
736 key->name,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
737 key->length,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
738 expected_length);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
739 error = 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
740 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
741
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
742 // add key to context
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
743 if(!error) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
744 cxMapPut(keys, cx_hash_key_str(key->name), key);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
745 dav_context_add_key(context, key);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
746 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
747 */
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
748 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
749
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
750 // cleanup
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
751 if(error) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
752 return 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
753 } else {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
754 // add key to the configuration
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
755 cx_linked_list_add(
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
756 (void**)list_begin,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
757 (void**)list_end,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
758 offsetof(DavCfgKey, prev),
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
759 offsetof(DavCfgKey, next),
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
760 key);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
761
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
762 return 0;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
763 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
764 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
765
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
766 static int load_proxy(
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
767 DavConfig *config, DavCfgProxy *proxy, xmlNode *proxynode, int type)
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
768 {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
769 const char *stype;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
770 if(type == DAV_HTTPS_PROXY) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
771 stype = "https";
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
772 } else if(type == DAV_HTTP_PROXY) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
773 stype = "http";
805
bff983370565 make DavContext mt-safe
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 804
diff changeset
774 } else {
bff983370565 make DavContext mt-safe
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 804
diff changeset
775 fprintf(stderr, "unknown proxy type\n");
bff983370565 make DavContext mt-safe
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 804
diff changeset
776 return 1;
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
777 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
778
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
779 if(!proxy) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
780 // no xml error - so report this directly via fprintf
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
781 fprintf(stderr, "no memory reserved for %s proxy.\n", stype);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
782 return 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
783 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
784
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
785 xmlNode *node = proxynode->children;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
786 int ret = 0;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
787 while(node && !ret) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
788 if(node->type == XML_ELEMENT_NODE) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
789 int reportmissingvalue = 0;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
790 if(xstreq(node->name, "url")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
791 reportmissingvalue = dav_cfg_string_set_node_value(config, &proxy->url, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
792 } else if(xstreq(node->name, "user")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
793 reportmissingvalue = dav_cfg_string_set_node_value(config, &proxy->user, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
794 } else if(xstreq(node->name, "password")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
795 reportmissingvalue = dav_cfg_string_set_node_value(config, &proxy->password, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
796 } else if(xstreq(node->name, "no")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
797 reportmissingvalue = dav_cfg_string_set_node_value(config, &proxy->noproxy, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
798 } else {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
799 proxy->unknown_elements++;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
800 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
801
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
802 if (reportmissingvalue) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
803 print_error(node->line,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
804 "missing value for proxy configuration element: %s\n",
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
805 node->name);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
806 ret = 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
807 break;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
808 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
809 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
810 node = node->next;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
811 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
812
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
813 if(!ret && !proxy->url.value.ptr) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
814 print_error(proxynode->line, "missing url for %s proxy.\n", stype);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
815 return 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
816 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
817
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
818 return ret;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
819 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
820
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
821 static char* get_attr_content(xmlNode *node) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
822 // TODO: remove code duplication (util_xml_get_text)
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
823 while(node) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
824 if(node->type == XML_TEXT_NODE) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
825 return (char*)node->content;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
826 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
827 node = node->next;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
828 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
829 return NULL;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
830 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
831
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
832 static int load_namespace(
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
833 DavConfig *config,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
834 DavCfgNamespace **list_begin,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
835 DavCfgNamespace **list_end,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
836 xmlNode *node)
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
837 {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
838 const char *prefix = NULL;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
839 const char *uri = NULL;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
840 xmlAttr *attr = node->properties;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
841 while(attr) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
842 if(attr->type == XML_ATTRIBUTE_NODE) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
843 char *value = get_attr_content(attr->children);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
844 if(!value) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
845 print_error(
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
846 node->line,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
847 "missing value for attribute %s\n", (char*)attr->name);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
848 return 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
849 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
850 if(xstreq(attr->name, "prefix")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
851 prefix = value;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
852 } else if(xstreq(attr->name, "uri")) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
853 uri = value;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
854 } else {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
855 print_error(
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
856 node->line,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
857 "unexpected attribute %s\n", (char*)attr->name);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
858 return 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
859 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
860 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
861 attr = attr->next;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
862 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
863
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
864 if(!prefix) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
865 print_error(node->line, "missing prefix attribute\n");
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
866 return 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
867 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
868 if(!uri) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
869 print_error(node->line, "missing uri attribute\n");
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
870 return 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
871 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
872
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
873 DavCfgNamespace *ns = cxMalloc(config->mp->allocator, sizeof(DavCfgNamespace));
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
874 memset(ns, 0, sizeof(DavCfgNamespace));
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
875 ns->node = node;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
876 ns->prefix = cx_strdup_a(config->mp->allocator, cx_str(prefix));
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
877 ns->uri = cx_strdup_a(config->mp->allocator, cx_str(uri));
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
878 cx_linked_list_add(
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
879 (void**)list_begin,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
880 (void**)list_end,
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
881 offsetof(DavCfgNamespace, prev),
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
882 offsetof(DavCfgNamespace, next),
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
883 ns);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
884
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
885 return 0;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
886 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
887
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
888 static int load_secretstore(DavConfig *config, xmlNode *node) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
889 // currently only one secretstore is supported
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
890
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
891 if(config->secretstore) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
892 return 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
893 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
894
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
895 config->secretstore = cxCalloc(config->mp->allocator, 1, sizeof(DavCfgSecretStore));
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
896
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
897 node = node->children;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
898 int error = 0;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
899 while(node) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
900 if(node->type == XML_ELEMENT_NODE) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
901 if(xstreq(node->name, "unlock-command")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
902 dav_cfg_string_set_node_value(config, &config->secretstore->unlock_cmd, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
903 } else if(xstreq(node->name, "lock-command")) {
836
7842c7665cd0 add utility functions for setting CfgString/CfgBool values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 827
diff changeset
904 dav_cfg_string_set_node_value(config, &config->secretstore->lock_cmd, node);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
905 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
906 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
907 node = node->next;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
908 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
909
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
910 return error;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
911 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
912
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
913
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
914
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
915
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
916
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
917 DavCfgRepository* dav_config_get_repository(DavConfig *config, cxstring name) {
826
b6e9fd3f1951 fix dav add-repo crash in case .dav/config.xml doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 823
diff changeset
918 if(!config) {
b6e9fd3f1951 fix dav add-repo crash in case .dav/config.xml doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 823
diff changeset
919 return NULL;
b6e9fd3f1951 fix dav add-repo crash in case .dav/config.xml doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 823
diff changeset
920 }
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
921 DavCfgRepository *repo = config->repositories;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
922 while(repo) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
923 if(!cx_strcmp(cx_strcast(repo->name.value), name)) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
924 return repo;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
925 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
926 repo = repo->next;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
927 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
928 return NULL;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
929 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
930
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
931 DavCfgRepository* dav_config_url2repo(DavConfig *config, const char *url, char **path) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
932 cxmutstr p;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
933 DavCfgRepository *repo = dav_config_url2repo_s(config, cx_str(url), &p);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
934 *path = p.ptr;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
935 return repo;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
936 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
937
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
938 DavCfgRepository* dav_config_url2repo_s(DavConfig *config, cxstring url, cxmutstr *path) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
939 path->ptr = NULL;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
940 path->length = 0;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
941
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
942 int s;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
943 if(cx_strprefix(url, CX_STR("http://"))) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
944 s = 7;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
945 } else if(cx_strprefix(url, CX_STR("https://"))) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
946 s = 8;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
947 } else {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
948 s = 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
949 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
950
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
951 // split URL into repository and path
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
952 cxstring r = cx_strsubs(url, s);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
953 cxstring p = cx_strchr(r, '/');
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
954 r = cx_strsubsl(url, 0, url.length-p.length);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
955 if(p.length == 0) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
956 p = cx_strn("/", 1);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
957 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
958
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
959 DavCfgRepository *repo = dav_config_get_repository(config, r);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
960 if(repo) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
961 *path = cx_strdup(p);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
962 } else {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
963 // TODO: who is responsible for freeing this repository?
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
964 // how can the callee know, if he has to call free()?
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
965 repo = dav_repository_new(config);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
966 repo->name.value = cx_strdup_a(config->mp->allocator, CX_STR(""));
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
967 if(url.ptr[url.length-1] == '/') {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
968 repo->url.value = cx_strdup_a(config->mp->allocator, url);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
969 *path = cx_strdup(CX_STR("/"));
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
970 } else if (cx_strchr(url, '/').length > 0) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
971 // TODO: fix the following workaround after
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
972 // fixing the inconsistent behavior of util_url_*()
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
973 cxstring repo_url = util_url_base_s(url);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
974 repo->url.value = cx_strdup_a(config->mp->allocator, repo_url);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
975 *path = cx_strdup(util_url_path_s(url));
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
976 } else {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
977 repo->url.value = cx_strdup(url);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
978 *path = cx_strdup(CX_STR("/"));
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
979 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
980 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
981
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
982 return repo;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
983 }
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
984
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
985 int dav_config_keytype(DavCfgKeyType type) {
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
986 switch(type) {
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
987 default: break;
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
988 case DAV_KEY_TYPE_AES256: return DAV_KEY_AES256;
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
989 case DAV_KEY_TYPE_AES128: return DAV_KEY_AES128;
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
990 }
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
991 return 0;
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
992 }
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
993
845
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
994 const char* dav_config_keytype_str(DavCfgKeyType type) {
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
995 switch(type) {
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
996 default: break;
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
997 case DAV_KEY_TYPE_AES256: return "aes256";
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
998 case DAV_KEY_TYPE_AES128: return "aes128";
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
999 }
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
1000 return NULL;
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
1001 }
8ac8bf29e2ee add cfg functions for modifying keys
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 839
diff changeset
1002
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1003 int dav_config_register_keys(DavConfig *config, DavContext *ctx, dav_loadkeyfile_func loadkey) {
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1004 for(DavCfgKey *key=config->keys;key;key=key->next) {
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1005 char *file = cx_strdup_m(key->file.value).ptr;
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1006 cxmutstr keycontent = loadkey(file);
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1007 free(file);
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1008
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1009 // TODO: check key length
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1010
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1011 if(!keycontent.ptr) {
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1012 return 1;
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1013 }
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1014
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1015 DavKey *davkey = calloc(1, sizeof(DavKey));
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1016 davkey->name = cx_strdup_m(key->name.value).ptr;
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1017 davkey->type = dav_config_keytype(key->type);
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1018 davkey->data = keycontent.ptr;
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1019 davkey->length = keycontent.length;
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1020
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1021 dav_context_add_key(ctx, davkey);
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1022 }
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1023 return 0;
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
1024 }
823
04c60a353331 add configured namespaces to the dav context
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
1025
04c60a353331 add configured namespaces to the dav context
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
1026 int dav_config_register_namespaces(DavConfig *config, DavContext *ctx) {
04c60a353331 add configured namespaces to the dav context
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
1027 DavCfgNamespace *ns = config->namespaces;
04c60a353331 add configured namespaces to the dav context
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
1028 while(ns) {
04c60a353331 add configured namespaces to the dav context
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
1029 dav_add_namespace(ctx, ns->prefix.ptr, ns->uri.ptr);
04c60a353331 add configured namespaces to the dav context
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
1030 ns = ns->next;
04c60a353331 add configured namespaces to the dav context
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
1031 }
04c60a353331 add configured namespaces to the dav context
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
1032 return 0;
04c60a353331 add configured namespaces to the dav context
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
1033 }

mercurial