dav/config.c

Sun, 17 Dec 2023 14:25:34 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 17 Dec 2023 14:25:34 +0100
changeset 797
edbb20b1438d
parent 796
81e0f67386a6
child 798
d7f5067a27ce
permissions
-rw-r--r--

[Makefile] fix missing rules preventing dry-runs

We have to support dry-runs, because many IDEs are using
dry-runs to collect build information.

Some rules have dependencies that expect certain files or
directories to be just present. We added respective build
rules which invoke the test program. This way, the behavior
when running make normally is exactly the same, but dry-runs
are also not failing now.

5
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
364
3769ba002fd1 updates copyright date
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
4 * Copyright 2018 Olaf Wintermann. All rights reserved.
5
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
88625853ae74 new webdav api + repository and key configuration + aes encryption
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
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include <stdio.h>
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 #include <stdlib.h>
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #include <string.h>
8
4503498deb22 creates a .dav dir if it doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 7
diff changeset
32 #include <sys/types.h>
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
33 #include <cx/hash_map.h>
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
34 #include <cx/utils.h>
8
4503498deb22 creates a .dav dir if it doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 7
diff changeset
35 #include <errno.h>
5
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36 #include <libxml/tree.h>
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37
470
6bf798ad3aec adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
38 #include "pwd.h"
5
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 #include "config.h"
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 247
diff changeset
40 #include "main.h"
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
41 #include "pwd.h"
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
42 #include "system.h"
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
43
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 32
diff changeset
44 #include <libidav/utils.h>
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
45 #include <libidav/config.h>
5
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 #define xstreq(a,b) xmlStrEqual(BAD_CAST a, BAD_CAST b)
73
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 43
diff changeset
48 #define xstrEQ(a,b) !xmlStrcasecmp(BAD_CAST a, BAD_CAST b)
5
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49
254
d7c4ba50b7d8 implements xmlErrorFunc for dav sync + adds line numbers to error reporting in both config checkers
Mike Becker <universe@uap-core.de>
parents: 252
diff changeset
50 #define print_error(lineno, ...) \
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 247
diff changeset
51 do {\
254
d7c4ba50b7d8 implements xmlErrorFunc for dav sync + adds line numbers to error reporting in both config checkers
Mike Becker <universe@uap-core.de>
parents: 252
diff changeset
52 fprintf(stderr, "Error (config.xml line %u): ", lineno); \
d7c4ba50b7d8 implements xmlErrorFunc for dav sync + adds line numbers to error reporting in both config checkers
Mike Becker <universe@uap-core.de>
parents: 252
diff changeset
53 fprintf(stderr, __VA_ARGS__); \
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 247
diff changeset
54 fprintf(stderr, "Abort.\n"); \
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 247
diff changeset
55 } while(0);
254
d7c4ba50b7d8 implements xmlErrorFunc for dav sync + adds line numbers to error reporting in both config checkers
Mike Becker <universe@uap-core.de>
parents: 252
diff changeset
56 #define print_warning(lineno, ...) \
d7c4ba50b7d8 implements xmlErrorFunc for dav sync + adds line numbers to error reporting in both config checkers
Mike Becker <universe@uap-core.de>
parents: 252
diff changeset
57 do {\
d7c4ba50b7d8 implements xmlErrorFunc for dav sync + adds line numbers to error reporting in both config checkers
Mike Becker <universe@uap-core.de>
parents: 252
diff changeset
58 fprintf(stderr, "Warning (config.xml line %u): ", lineno); \
d7c4ba50b7d8 implements xmlErrorFunc for dav sync + adds line numbers to error reporting in both config checkers
Mike Becker <universe@uap-core.de>
parents: 252
diff changeset
59 fprintf(stderr, __VA_ARGS__); \
d7c4ba50b7d8 implements xmlErrorFunc for dav sync + adds line numbers to error reporting in both config checkers
Mike Becker <universe@uap-core.de>
parents: 252
diff changeset
60 } while(0);
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 247
diff changeset
61
32
c9d37bb97ea8 mingw support
Mike Becker <universe@uap-core.de>
parents: 21
diff changeset
62 #ifdef _WIN32
c9d37bb97ea8 mingw support
Mike Becker <universe@uap-core.de>
parents: 21
diff changeset
63 #define ENV_HOME getenv("USERPROFILE")
c9d37bb97ea8 mingw support
Mike Becker <universe@uap-core.de>
parents: 21
diff changeset
64 #else
c9d37bb97ea8 mingw support
Mike Becker <universe@uap-core.de>
parents: 21
diff changeset
65 #define ENV_HOME getenv("HOME")
c9d37bb97ea8 mingw support
Mike Becker <universe@uap-core.de>
parents: 21
diff changeset
66 #endif /* _WIN32 */
c9d37bb97ea8 mingw support
Mike Becker <universe@uap-core.de>
parents: 21
diff changeset
67
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
68 static CxMap *repos;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
69 static CxMap *keys;
5
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
71 static DavConfig *davconfig;
470
6bf798ad3aec adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
72 static PwdStore *pstore;
6bf798ad3aec adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
73
730
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
74 static char *secretstore_unlock_cmd;
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
75 static char *secretstore_lock_cmd;
729
5433f0f3dd48 disable error in case of unknown config elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 606
diff changeset
76
215
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
77 int check_config_dir(void) {
32
c9d37bb97ea8 mingw support
Mike Becker <universe@uap-core.de>
parents: 21
diff changeset
78 char *file = util_concat_path(ENV_HOME, ".dav");
8
4503498deb22 creates a .dav dir if it doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 7
diff changeset
79 int ret = 0;
32
c9d37bb97ea8 mingw support
Mike Becker <universe@uap-core.de>
parents: 21
diff changeset
80 if(util_mkdir(file, S_IRWXU)) {
8
4503498deb22 creates a .dav dir if it doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 7
diff changeset
81 if(errno != EEXIST) {
4503498deb22 creates a .dav dir if it doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 7
diff changeset
82 ret = 1;
4503498deb22 creates a .dav dir if it doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 7
diff changeset
83 }
4503498deb22 creates a .dav dir if it doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 7
diff changeset
84 }
4503498deb22 creates a .dav dir if it doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 7
diff changeset
85 free(file);
4503498deb22 creates a .dav dir if it doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 7
diff changeset
86 return ret;
4503498deb22 creates a .dav dir if it doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 7
diff changeset
87 }
4503498deb22 creates a .dav dir if it doesn't exist
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 7
diff changeset
88
40
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 38
diff changeset
89 static DavContext *context;
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 38
diff changeset
90
142
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
91 void create_default_config(char *file) {
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
92 xmlDoc *doc = xmlNewDoc(BAD_CAST "1.0");
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
93 xmlNode *root = xmlNewNode(NULL, BAD_CAST "configuration");
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
94 xmlDocSetRootElement(doc, root);
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
95 xmlSaveFormatFileEnc(file, doc, "UTF-8", 1);
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
96 xmlFreeDoc(doc);
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
97 }
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
98
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
99 char* config_file_path(char *name) {
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
100 char *davd = util_concat_path(ENV_HOME, ".dav");
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
101 if(!davd) {
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
102 return NULL;
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
103 }
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
104 char *path = util_concat_path(davd, name);
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
105 free(davd);
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
106 return path;
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
107 }
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 295
diff changeset
108
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
109 cxmutstr config_load_file(const char *path) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
110 FILE *file = sys_fopen(path, "r");
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
111 if(!file) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
112 return (cxmutstr){NULL,0};
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
113 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
114
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
115 CxBuffer buf;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
116 cxBufferInit(&buf, NULL, 1024, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
117 cx_stream_copy(file, &buf, (cx_read_func)fread, (cx_write_func)cxBufferWrite);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
118 fclose(file);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
119
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
120 return cx_mutstrn(buf.space, buf.size);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
121 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
122
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 247
diff changeset
123 int load_config(DavContext *ctx) {
40
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 38
diff changeset
124 context = ctx;
36
c8755c87ce7f added proxy config
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
125 // TODO: free the config somewhere
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
126 repos = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 16);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
127 keys = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 16);
5
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
128
472
08d2d1263429 new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 470
diff changeset
129 char *pwfile = util_concat_path(ENV_HOME, ".dav/secrets.crypt");
470
6bf798ad3aec adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
130 pstore = pwdstore_open(pwfile);
6bf798ad3aec adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
131 free(pwfile);
6bf798ad3aec adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
132
32
c9d37bb97ea8 mingw support
Mike Becker <universe@uap-core.de>
parents: 21
diff changeset
133 char *file = util_concat_path(ENV_HOME, ".dav/config.xml");
142
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
134
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
135 struct stat s;
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
136 if(stat(file, &s)) {
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
137 switch(errno) {
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
138 case ENOENT: {
294
dd5c0ebdf54f fixes dav startup without .dav dir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 254
diff changeset
139 return 0;
142
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
140 }
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
141 default: {
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
142 perror("Cannot load config.xml");
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
143 }
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
144 }
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 247
diff changeset
145 return 1;
6
9c64d2a3d101 creates an empty configuration file if needed
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 5
diff changeset
146 }
142
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
147
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
148 cxmutstr config_content = config_load_file(file);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
149 int config_error;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
150 davconfig = dav_config_load(config_content, &config_error);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
151 free(config_content.ptr);
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
152 free(file);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
153
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
154 if(!davconfig) {
142
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
155 fprintf(stderr, "Cannot load config.xml\n");
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 247
diff changeset
156 return 1;
142
0c0ccb7f71ba startup doesn't override broken config.xml anymore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 119
diff changeset
157 }
5
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
158
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
159 return dav_config_register_keys(davconfig, ctx, load_key_file);
5
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
160 }
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
161
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
162 DavConfig* get_config(void) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
163 return davconfig;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
164 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
165
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
166 int store_config(void) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
167 if(check_config_dir()) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
168 return 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
169 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
170
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
171 CxBuffer *buf = dav_config2buf(davconfig);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
172 if(!buf) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
173 return 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
174 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
175
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
176 char *file = util_concat_path(ENV_HOME, ".dav/config.xml");
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
177 FILE *cout = sys_fopen(file, "w");
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
178 if(!cout) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
179 cxBufferFree(buf);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
180 return 1;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
181 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
182
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
183 // should only fail if we run out of disk space or something like that
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
184 // in that case, the config file is only destroyed
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
185 // could only be prevented, if we write to a temp file first and than
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
186 // rename it
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
187 fwrite(buf->space, buf->size, 1, cout);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
188
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
189 cxBufferFree(buf);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
190 fclose(cout);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
191
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
192 return 0;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
193 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
194
215
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
195 void free_config(void) {
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
196 if(davconfig) {
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
197 dav_config_free(davconfig);
5
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
198 }
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
199 }
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
200
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
201 cxmutstr load_key_file(const char *filename) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
202 cxmutstr k;
5
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
203 k.ptr = NULL;
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
204 k.length = 0;
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
205
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
206 FILE *file = NULL;
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
207 if(filename[0] == '/') {
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
208 file = sys_fopen(filename, "r");
5
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
209 } else {
32
c9d37bb97ea8 mingw support
Mike Becker <universe@uap-core.de>
parents: 21
diff changeset
210 char *path = util_concat_path(ENV_HOME, ".dav/");
5
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
211 char *p2 = util_concat_path(path, filename);
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
212 file = sys_fopen(p2, "r");
5
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
213 free(path);
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
214 free(p2);
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
215 }
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
216
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
217 if(!file) {
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
218 fprintf(stderr, "Error: cannot load keyfile %s\n", filename);
5
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
219 return k;
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
220 }
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
221
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
222 char *data = malloc(256);
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
223 size_t r = fread(data, 1, 256, file);
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
224 k.ptr = data;
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
225 k.length = r;
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
226
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
227 fclose(file);
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
228 return k;
317
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
229 }
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
230
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
231 int list_repositories(void) {
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
232 if(!davconfig) {
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
233 return 1;
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
234 }
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
235 for(DavCfgRepository *repo=davconfig->repositories;repo;repo=repo->next) {
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
236 printf("%.*s\n", (int)repo->name.value.length, repo->name.value.ptr);
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
237 }
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
238 return 0;
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
239 }
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
240
317
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
241 static char* get_attr_content(xmlNode *node) {
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
242 // TODO: remove code duplication (util_xml_get_text)
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
243 while(node) {
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
244 if(node->type == XML_TEXT_NODE) {
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
245 return (char*)node->content;
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
246 }
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
247 node = node->next;
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
248 }
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
249 return NULL;
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
250 }
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
251
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
252 int load_namespace(const xmlNode *node) {
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
253 const char *prefix = NULL;
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
254 const char *uri = NULL;
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
255
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
256 xmlAttr *attr = node->properties;
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
257 while(attr) {
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
258 if(attr->type == XML_ATTRIBUTE_NODE) {
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
259 char *value = get_attr_content(attr->children);
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
260 if(!value) {
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
261 print_error(
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
262 node->line,
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
263 "missing value for attribute %s\n", (char*)attr->name);
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
264 return 1;
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
265 }
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
266 if(xstreq(attr->name, "prefix")) {
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
267 prefix = value;
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
268 } else if(xstreq(attr->name, "uri")) {
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
269 uri = value;
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
270 } else {
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
271 print_error(
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
272 node->line,
321
eb8885a87866 adds namespace config element to XSD + fixes error message for duplicate namespace prefixes
Mike Becker <universe@uap-core.de>
parents: 319
diff changeset
273 "unexpected attribute %s\n", (char*)attr->name);
317
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
274 return 1;
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
275 }
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
276 }
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
277 attr = attr->next;
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
278 }
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
279
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
280 if(!prefix) {
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
281 print_error(node->line, "missing prefix attribute\n");
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
282 return 1;
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
283 }
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
284 if(!uri) {
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
285 print_error(node->line, "missing uri attribute\n");
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
286 return 1;
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
287 }
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
288
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
289 if(dav_get_namespace(context, prefix)) {
321
eb8885a87866 adds namespace config element to XSD + fixes error message for duplicate namespace prefixes
Mike Becker <universe@uap-core.de>
parents: 319
diff changeset
290 print_error(node->line, "namespace prefix '%s' already used\n", prefix);
317
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
291 return 1;
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
292 }
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
293
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
294 return dav_add_namespace(context, prefix, uri);
7eea57f6d847 adds namespace config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
295 }
5
88625853ae74 new webdav api + repository and key configuration + aes encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
296
730
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
297 int load_secretstore(const xmlNode *node) {
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
298 // currently only one secretstore is supported
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
299
731
e0358fa1a3b1 implement secretstore unlock command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 730
diff changeset
300 if(!pstore) {
e0358fa1a3b1 implement secretstore unlock command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 730
diff changeset
301 return 0;
e0358fa1a3b1 implement secretstore unlock command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 730
diff changeset
302 }
e0358fa1a3b1 implement secretstore unlock command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 730
diff changeset
303
730
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
304 node = node->children;
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
305 int error = 0;
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
306 while(node) {
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
307 if(node->type == XML_ELEMENT_NODE) {
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
308 char *value = util_xml_get_text(node);
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
309 if(value) {
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
310 if(xstreq(node->name, "unlock-command")) {
731
e0358fa1a3b1 implement secretstore unlock command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 730
diff changeset
311 pstore->unlock_cmd = strdup(value);
730
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
312 } else if(xstreq(node->name, "lock-command")) {
731
e0358fa1a3b1 implement secretstore unlock command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 730
diff changeset
313 pstore->lock_cmd = strdup(value);
730
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
314 }
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
315 }
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
316 }
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
317 node = node->next;
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
318 }
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
319
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
320 return error;
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
321 }
83f832e345e0 implement secretstore config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 729
diff changeset
322
470
6bf798ad3aec adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
323 PwdStore* get_pwdstore(void) {
6bf798ad3aec adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
324 return pstore;
6bf798ad3aec adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
325 }
6bf798ad3aec adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
326
6bf798ad3aec adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
327 int pwdstore_save(PwdStore *pwdstore) {
732
b0eb645cd26e fix error in dav add-user, if .dav dir doesn't exists
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 731
diff changeset
328 if(check_config_dir()) {
b0eb645cd26e fix error in dav add-user, if .dav dir doesn't exists
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 731
diff changeset
329 return 1;
b0eb645cd26e fix error in dav add-user, if .dav dir doesn't exists
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 731
diff changeset
330 }
b0eb645cd26e fix error in dav add-user, if .dav dir doesn't exists
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 731
diff changeset
331
472
08d2d1263429 new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 470
diff changeset
332 char *pwfile = util_concat_path(ENV_HOME, ".dav/secrets.crypt");
470
6bf798ad3aec adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
333 int ret = pwdstore_store(pwdstore, pwfile);
6bf798ad3aec adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
334 free(pwfile);
6bf798ad3aec adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
335 return ret;
6bf798ad3aec adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
336 }
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
337
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
338
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
339
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
340 /*
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
341 Repository* url2repo_s(cxstring url, char **path) {
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
342 *path = NULL;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
343
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
344 int s;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
345 if(cx_strprefix(url, CX_STR("http://"))) {
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
346 s = 7;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
347 } else if(cx_strprefix(url, CX_STR("https://"))) {
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
348 s = 8;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
349 } else {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
350 s = 1;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
351 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
352
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
353 // split URL into repository and path
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
354 cxstring r = cx_strsubs(url, s);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
355 cxstring p = cx_strchr(r, '/');
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
356 r = cx_strsubsl(url, 0, url.length-p.length);
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
357 if(p.length == 0) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
358 p = cx_strn("/", 1);
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
359 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
360
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
361 Repository *repo = get_repository(r);
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
362 if(repo) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
363 *path = cx_strdup(p).ptr;
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
364 } else {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
365 // TODO: who is responsible for freeing this repository?
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
366 // how can the callee know, if he has to call free()?
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
367 repo = calloc(1, sizeof(Repository));
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
368 repo->name = strdup("");
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
369 repo->decrypt_content = true;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
370 repo->verification = true;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
371 repo->authmethods = CURLAUTH_BASIC;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
372 if(url.ptr[url.length-1] == '/') {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
373 repo->url = cx_strdup(url).ptr;
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
374 *path = strdup("/");
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
375 } else if (cx_strchr(url, '/').length > 0) {
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
376 // TODO: fix the following workaround after
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
377 // fixing the inconsistent behavior of util_url_*()
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
378 repo->url = util_url_base_s(url);
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
379 cxmutstr truncated = cx_strdup(url);
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
380 *path = strdup(util_url_path(truncated.ptr));
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
381 free(truncated.ptr);
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
382 } else {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
383 repo->url = cx_strdup(url).ptr;
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
384 *path = strdup("/");
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
385 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
386 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
387
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
388 return repo;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
389 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
390
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
391 Repository* url2repo(const char *url, char **path) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
392 return url2repo_s(cx_str(url), path);
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
393 }
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
394 */
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
395
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
396 static int decrypt_secrets(CmdArgs *a, PwdStore *secrets) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
397 if(cmd_getoption(a, "noinput")) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
398 return 1;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
399 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
400
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
401 char *ps_password = NULL;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
402 if(secrets->unlock_cmd && strlen(secrets->unlock_cmd) > 0) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
403 CxBuffer *cmd_out = cxBufferCreate(NULL, 128, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
404 if(!util_exec_command(secrets->unlock_cmd, cmd_out)) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
405 // command successful, get first line from output without newline
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
406 // and use that as password for the secretstore
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
407 size_t len = 0;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
408 for(size_t i=0;i<=cmd_out->size;i++) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
409 if(i == cmd_out->size || cmd_out->space[i] == '\n') {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
410 len = i;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
411 break;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
412 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
413 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
414 if(len > 0) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
415 ps_password = malloc(len + 1);
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
416 memcpy(ps_password, cmd_out->space, len);
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
417 ps_password[len] = 0;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
418 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
419 }
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
420 cxBufferFree(cmd_out);
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
421 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
422
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
423 if(!ps_password) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
424 ps_password = util_password_input("Master password: ");
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
425 if(!ps_password) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
426 return 1;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
427 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
428 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
429
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
430 if(pwdstore_setpassword(secrets, ps_password)) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
431 fprintf(stderr, "Error: cannot create key from password\n");
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
432 return 1;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
433 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
434 if(pwdstore_decrypt(secrets)) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
435 fprintf(stderr, "Error: cannot decrypt secrets store\n");
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
436 return 1;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
437 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
438 return 0;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
439 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
440
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
441 typedef struct CredLocation {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
442 char *id;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
443 char *location;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
444 } CredLocation;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
445
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
446 static int cmp_url_cred_entry(CredLocation *e1, CredLocation *e2, void *n) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
447 return strcmp(e2->location, e1->location);
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
448 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
449
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
450 static void free_cred_location(CredLocation *c) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
451 // c->id is not a copy, therefore we don't have to free it
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
452 free(c->location);
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
453 free(c);
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
454 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
455
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
456 static int get_stored_credentials(CmdArgs *a, char *credid, char **user, char **password) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
457 if(!credid) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
458 return 0;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
459 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
460
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
461 PwdStore *secrets = get_pwdstore();
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
462 if(!secrets) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
463 fprintf(stderr, "Error: no secrets store available\n");
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
464 return 0;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
465 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
466
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
467 if(pwdstore_has_id(secrets, credid)) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
468 if(!secrets->isdecrypted) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
469 if(decrypt_secrets(a, secrets)) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
470 return 0;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
471 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
472 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
473
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
474 PwdEntry *s_cred = pwdstore_get(secrets, credid);
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
475 if(s_cred) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
476 *user = s_cred->user;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
477 *password = s_cred->password;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
478 return 1;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
479 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
480 } else {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
481 fprintf(stderr, "Error: credentials id '%s' not found\n", credid);
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
482 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
483
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
484 return 0;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
485 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
486
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
487
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
488 static int get_location_credentials(CmdArgs *a, DavCfgRepository *repo, const char *path, char **user, char **password) {
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
489 PwdStore *secrets = get_pwdstore();
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
490 if(!secrets) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
491 return 0;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
492 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
493
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
494 /*
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
495 * The list secrets->location contains urls or repo names as
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
496 * location strings. We need a list, that contains only urls
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
497 */
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
498 CxList *locations = cxLinkedListCreate(cxDefaultAllocator, (cx_compare_func)cmp_url_cred_entry, CX_STORE_POINTERS);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
499 locations->simple_destructor = (cx_destructor_func)free_cred_location;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
500 CxIterator i = cxListIterator(secrets->locations);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
501 cx_foreach(PwdIndexEntry*, e, i) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
502 CxIterator entry_iter = cxListIterator(e->locations);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
503 cx_foreach(char *, loc, entry_iter) {
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
504 cxmutstr rpath;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
505 DavCfgRepository *r = dav_config_url2repo_s(davconfig, cx_str(loc), &rpath);
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
506 CredLocation *urlentry = calloc(1, sizeof(CredLocation));
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
507 urlentry->id = e->id;
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
508 urlentry->location = util_concat_path_s(cx_strcast(r->url.value), cx_strcast(rpath)).ptr;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
509 cxListAdd(locations, urlentry);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
510 free(rpath.ptr);
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
511 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
512 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
513 // the list must be sorted
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
514 cxListSort(locations);
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
515
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
516 // create full request url string and remove protocol prefix
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
517 cxmutstr req_url_proto = util_concat_path_s(cx_strcast(repo->url.value), cx_str(path));
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
518 cxstring req_url = cx_strcast(req_url_proto);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
519 if(cx_strprefix(req_url, CX_STR("http://"))) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
520 req_url = cx_strsubs(req_url, 7);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
521 } else if(cx_strprefix(req_url, CX_STR("https://"))) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
522 req_url = cx_strsubs(req_url, 8);
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
523 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
524
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
525 // iterate over sorted locations and check if a location is a prefix
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
526 // of the requested url
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
527 char *id = NULL;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
528 int ret = 0;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
529 i = cxListIterator(locations);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
530 cx_foreach(CredLocation*, cred, i) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
531 cxstring cred_url = cx_str(cred->location);
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
532
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
533 // remove protocol prefix
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
534 if(cx_strprefix(cred_url, CX_STR("http://"))) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
535 cred_url = cx_strsubs(cred_url, 7);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
536 } else if(cx_strprefix(cred_url, CX_STR("https://"))) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
537 cred_url = cx_strsubs(cred_url, 8);
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
538 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
539
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
540 if(cx_strprefix(req_url, cred_url)) {
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
541 id = cred->id;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
542 break;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
543 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
544 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
545
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
546 // if an id is found and we can access the decrypted secret store
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
547 // we can set the user/password
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
548 if(id && (secrets->isdecrypted || !decrypt_secrets(a, secrets))) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
549 PwdEntry *cred = pwdstore_get(secrets, id);
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
550 if(cred) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
551 *user = cred->user;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
552 *password = cred->password;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
553 ret = 1;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
554 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
555 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
556
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
557 free(req_url_proto.ptr);
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 735
diff changeset
558 cxListDestroy(locations);
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
559
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
560 return ret;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
561 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
562
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
563 DavSession* connect_to_repo(DavContext *ctx, DavCfgRepository *repo, const char *path, dav_auth_func authfunc, CmdArgs *a) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
564 cxmutstr decodedpw = dav_repository_get_decodedpassword(repo);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
565
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
566 char *user = repo->user.value.ptr;
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
567 char *password = decodedpw.ptr;
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
568
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
569 if(!user && !password) {
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
570 if(!get_stored_credentials(a, repo->stored_user.value.ptr, &user, &password)) {
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
571 get_location_credentials(a, repo, path, &user, &password);
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
572 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
573 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
574
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
575 DavSession *sn = dav_session_new_auth(ctx, repo->url.value.ptr, user, password);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
576 if(password) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
577 free(password);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
578 }
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
579
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
580 sn->flags = dav_repository_get_flags(repo);
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
581 sn->key = dav_context_get_key(ctx, repo->default_key.value.ptr);
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
582 curl_easy_setopt(sn->handle, CURLOPT_HTTPAUTH, repo->authmethods);
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
583 curl_easy_setopt(sn->handle, CURLOPT_SSLVERSION, repo->ssl_version);
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
584 if(repo->cert.value.ptr) {
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
585 curl_easy_setopt(sn->handle, CURLOPT_CAINFO, repo->cert.value.ptr);
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
586 }
795
05647e862a17 add new config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
587 if(!repo->verification.value || cmd_getoption(a, "insecure")) {
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
588 curl_easy_setopt(sn->handle, CURLOPT_SSL_VERIFYPEER, 0);
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
589 curl_easy_setopt(sn->handle, CURLOPT_SSL_VERIFYHOST, 0);
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
590 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
591 if(!cmd_getoption(a, "noinput")) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
592 dav_session_set_authcallback(sn, authfunc, repo);
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
593 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
594 return sn;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
595 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
596
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
597 int request_auth(DavSession *sn, void *userdata) {
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
598 DavCfgRepository *repo = userdata;
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
599
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
600 cxstring user = {NULL, 0};
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
601 char ubuf[256];
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
602 if(repo->user.value.ptr) {
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
603 user = cx_strcast(repo->user.value);
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
604 } else {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
605 fprintf(stderr, "User: ");
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
606 fflush(stderr);
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
607 user = cx_str(fgets(ubuf, 256, stdin));
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
608 }
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
609 if(!user.ptr) {
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
610 return 0;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
611 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
612
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
613 char *password = util_password_input("Password: ");
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
614 if(!password || strlen(password) == 0) {
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
615 return 0;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
616 }
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
617
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 795
diff changeset
618 dav_session_set_auth_s(sn, user, cx_str(password));
734
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
619 free(password);
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
620
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
621 return 0;
b2cd82149116 add support for the secret store to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 732
diff changeset
622 }

mercurial