Sun, 17 Dec 2023 15:33:50 +0100
fix faulty string to int conversion utilities
Probably it was expected that errno is set to EINVAL when illegal characters are encountered. But this is not standard and does not happen on every system, allowing illegal strings to be parsed as valid integers.
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
1 | /* |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
3 | * |
404
5c08b8e14df8
updates copyright notice
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
355
diff
changeset
|
4 | * Copyright 2018 Olaf Wintermann. All rights reserved. |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
5 | * |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
8 | * |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
11 | * |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
15 | * |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
03076907b58a
added file name 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 |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
27 | */ |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
28 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
29 | #include <stdio.h> |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
30 | #include <stdlib.h> |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
31 | #include <string.h> |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
32 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
33 | #include <cx/buffer.h> |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
34 | #include <cx/utils.h> |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
35 | #include <cx/basic_mempool.h> |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
36 | #include <cx/hash_map.h> |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
37 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
38 | #include "utils.h" |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
39 | #include "session.h" |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
40 | #include "resource.h" |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
41 | #include "methods.h" |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
42 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
43 | DavSession* dav_session_new(DavContext *context, char *base_url) { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
44 | if(!base_url) { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
45 | return NULL; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
46 | } |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
47 | cxstring url = cx_str(base_url); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
48 | if(url.length == 0) { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
49 | return NULL; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
50 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
51 | DavSession *sn = malloc(sizeof(DavSession)); |
355
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
52 | memset(sn, 0, sizeof(DavSession)); |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
53 | sn->mp = cxBasicMempoolCreate(DAV_SESSION_MEMPOOL_SIZE); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
54 | sn->pathcache = cxHashMapCreate(sn->mp->allocator, CX_STORE_POINTERS, DAV_PATH_CACHE_SIZE); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
55 | sn->key = NULL; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
56 | sn->errorstr = NULL; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
57 | sn->error = DAV_OK; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
58 | sn->flags = 0; |
497
411bd1098175
fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
496
diff
changeset
|
59 | |
411bd1098175
fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
496
diff
changeset
|
60 | dav_session_set_baseurl(sn, base_url); |
411bd1098175
fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
496
diff
changeset
|
61 | |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
62 | sn->handle = curl_easy_init(); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
63 | curl_easy_setopt(sn->handle, CURLOPT_FOLLOWLOCATION, 1L); |
208
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
64 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
65 | // lock manager is created on-demand |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
66 | sn->locks = NULL; |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
67 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
68 | // set proxy |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
69 | DavProxy *proxy = cx_strprefix(url, CX_STR("https")) ? context->https_proxy |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
70 | : context->http_proxy; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
71 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
72 | if (proxy->url) { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
73 | curl_easy_setopt(sn->handle, CURLOPT_PROXY, proxy->url); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
74 | if (proxy->username) { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
75 | curl_easy_setopt(sn->handle, CURLOPT_PROXYUSERNAME, |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
76 | proxy->username); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
77 | if (proxy->password) { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
78 | curl_easy_setopt(sn->handle, CURLOPT_PROXYPASSWORD, |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
79 | proxy->password); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
80 | } else { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
81 | // TODO: prompt |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
82 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
83 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
84 | if(proxy->no_proxy) { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
85 | curl_easy_setopt(sn->handle, CURLOPT_NOPROXY, |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
86 | proxy->no_proxy); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
87 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
88 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
89 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
90 | // set url |
420
ad419882e06e
sets curl default protocol to http
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
404
diff
changeset
|
91 | #if LIBCURL_VERSION_NUM >= 0x072D00 |
ad419882e06e
sets curl default protocol to http
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
404
diff
changeset
|
92 | curl_easy_setopt(sn->handle, CURLOPT_DEFAULT_PROTOCOL, "http"); |
ad419882e06e
sets curl default protocol to http
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
404
diff
changeset
|
93 | #endif |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
94 | curl_easy_setopt(sn->handle, CURLOPT_URL, base_url); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
95 | |
68
f6d3db6113d3
added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents:
43
diff
changeset
|
96 | // add to context |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
97 | cxListAdd(context->sessions, sn); |
68
f6d3db6113d3
added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents:
43
diff
changeset
|
98 | sn->context = context; |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
99 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
100 | return sn; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
101 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
102 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
103 | DavSession* dav_session_new_auth( |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
104 | DavContext *context, |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
105 | char *base_url, |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
106 | char *user, |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
107 | char *password) |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
108 | { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
109 | DavSession *sn = dav_session_new(context, base_url); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
110 | if(!sn) { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
111 | return NULL; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
112 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
113 | dav_session_set_auth(sn, user, password); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
114 | return sn; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
115 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
116 | |
796
81e0f67386a6
remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
790
diff
changeset
|
117 | void dav_session_set_auth(DavSession *sn, const char *user, const char *password) { |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
118 | if(user && password) { |
796
81e0f67386a6
remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
790
diff
changeset
|
119 | dav_session_set_auth_s(sn, cx_str(user), cx_str(password)); |
81e0f67386a6
remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
790
diff
changeset
|
120 | } |
81e0f67386a6
remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
790
diff
changeset
|
121 | } |
81e0f67386a6
remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
790
diff
changeset
|
122 | |
81e0f67386a6
remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
790
diff
changeset
|
123 | void dav_session_set_auth_s(DavSession *sn, cxstring user, cxstring password) { |
81e0f67386a6
remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
790
diff
changeset
|
124 | if(user.length > 0 && password.length > 0) { |
81e0f67386a6
remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
790
diff
changeset
|
125 | size_t upwdlen = user.length + password.length + 2; |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
126 | char *upwdbuf = malloc(upwdlen); |
796
81e0f67386a6
remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
790
diff
changeset
|
127 | snprintf(upwdbuf, upwdlen, "%.*s:%.*s", (int)user.length, user.ptr, (int)password.length, password.ptr); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
128 | curl_easy_setopt(sn->handle, CURLOPT_USERPWD, upwdbuf); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
129 | free(upwdbuf); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
130 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
131 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
132 | |
497
411bd1098175
fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
496
diff
changeset
|
133 | void dav_session_set_baseurl(DavSession *sn, char *base_url) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
134 | const CxAllocator *a = sn->mp->allocator; |
497
411bd1098175
fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
496
diff
changeset
|
135 | if(sn->base_url) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
136 | cxFree(a, sn->base_url); |
497
411bd1098175
fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
496
diff
changeset
|
137 | } |
411bd1098175
fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
496
diff
changeset
|
138 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
139 | cxstring url = cx_str(base_url); |
497
411bd1098175
fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
496
diff
changeset
|
140 | 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:
742
diff
changeset
|
141 | cxmutstr url_m = cx_strdup_a(a, cx_str(base_url)); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
142 | sn->base_url = url_m.ptr; |
497
411bd1098175
fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
496
diff
changeset
|
143 | } else { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
144 | char *url_str = cxMalloc(a, url.length + 2); |
497
411bd1098175
fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
496
diff
changeset
|
145 | memcpy(url_str, base_url, url.length); |
411bd1098175
fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
496
diff
changeset
|
146 | url_str[url.length] = '/'; |
411bd1098175
fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
496
diff
changeset
|
147 | url_str[url.length + 1] = '\0'; |
411bd1098175
fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
496
diff
changeset
|
148 | sn->base_url = url_str; |
411bd1098175
fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
496
diff
changeset
|
149 | } |
411bd1098175
fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
496
diff
changeset
|
150 | } |
411bd1098175
fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
496
diff
changeset
|
151 | |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
152 | void dav_session_enable_encryption(DavSession *sn, DavKey *key, int flags) { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
153 | sn->key = key; |
68
f6d3db6113d3
added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents:
43
diff
changeset
|
154 | // TODO: review sanity |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
155 | if(flags != 0) { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
156 | sn->flags |= flags; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
157 | } else { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
158 | sn->flags |= DAV_SESSION_ENCRYPT_CONTENT; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
159 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
160 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
161 | |
354
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
162 | void dav_session_set_authcallback(DavSession *sn, dav_auth_func func, void *userdata) { |
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
163 | sn->auth_prompt = func; |
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
164 | sn->authprompt_userdata = userdata; |
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
165 | } |
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
166 | |
355
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
167 | void dav_session_set_progresscallback(DavSession *sn, dav_progress_func get, dav_progress_func put, void *userdata) { |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
168 | sn->get_progress = get; |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
169 | sn->put_progress = put; |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
170 | sn->progress_userdata = userdata; |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
171 | } |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
172 | |
354
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
173 | CURLcode dav_session_curl_perform(DavSession *sn, long *status) { |
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
174 | return dav_session_curl_perform_buf(sn, NULL, NULL, status); |
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
175 | } |
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
176 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
177 | CURLcode dav_session_curl_perform_buf(DavSession *sn, CxBuffer *request, CxBuffer *response, long *status) { |
354
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
178 | CURLcode ret = curl_easy_perform(sn->handle); |
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
179 | long http_status; |
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
180 | curl_easy_getinfo(sn->handle, CURLINFO_RESPONSE_CODE, &http_status); |
788
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
181 | if(ret == CURLE_OK) { |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
182 | if(sn->logfunc) { |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
183 | char *log_method; |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
184 | char *log_url; |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
185 | curl_easy_getinfo(sn->handle, CURLINFO_EFFECTIVE_URL, &log_url); |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
186 | curl_easy_getinfo(sn->handle, CURLINFO_EFFECTIVE_METHOD , &log_method); |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
187 | char *log_reqbody = NULL; |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
188 | size_t log_reqbodylen = 0; |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
189 | char *log_rpbody = NULL; |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
190 | size_t log_rpbodylen = 0; |
354
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
191 | if(request) { |
788
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
192 | log_reqbody = request->space; |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
193 | log_reqbodylen = request->size; |
354
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
194 | } |
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
195 | if(response) { |
788
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
196 | log_rpbody = response->space; |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
197 | log_rpbodylen = response->size; |
354
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
198 | } |
788
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
199 | sn->logfunc(sn, log_method, log_url, log_reqbody, log_reqbodylen, http_status, log_rpbody, log_rpbodylen); |
354
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
200 | } |
788
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
201 | |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
202 | if(http_status == 401 && sn->auth_prompt) { |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
203 | if(!sn->auth_prompt(sn, sn->authprompt_userdata)) { |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
204 | if(request) { |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
205 | cxBufferSeek(request, 0, SEEK_SET); |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
206 | } |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
207 | if(response) { |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
208 | cxBufferSeek(response, 0, SEEK_SET); |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
209 | } |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
210 | ret = curl_easy_perform(sn->handle); |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
211 | curl_easy_getinfo(sn->handle, CURLINFO_RESPONSE_CODE, &http_status); |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
212 | } |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
213 | } |
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
214 | |
354
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
215 | } |
788
9b9420041d8e
add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
777
diff
changeset
|
216 | |
354
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
217 | if(status) { |
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
218 | *status = http_status; |
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
219 | } |
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
220 | return ret; |
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
221 | } |
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
292
diff
changeset
|
222 | |
355
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
223 | int dav_session_get_progress(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) { |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
224 | DavResource *res = clientp; |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
225 | DavSession *sn = res->session; |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
226 | if(sn->get_progress) { |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
227 | sn->get_progress(res, (int64_t)dltotal, (int64_t)dlnow, sn->progress_userdata); |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
228 | } |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
229 | return 0; |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
230 | } |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
231 | |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
232 | int dav_session_put_progress(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) { |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
233 | DavResource *res = clientp; |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
234 | DavSession *sn = res->session; |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
235 | if(sn->put_progress) { |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
236 | sn->put_progress(res, (int64_t)ultotal, (int64_t)ulnow, sn->progress_userdata); |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
237 | } |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
238 | return 0; |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
239 | } |
5da2cf15eb44
adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
240 | |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
241 | void dav_session_set_error(DavSession *sn, CURLcode c, int status) { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
242 | if(status > 0) { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
243 | switch(status) { |
100
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
244 | default: { |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
245 | switch(c) { |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
246 | default: sn->error = DAV_ERROR; |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
247 | } |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
248 | break; |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
249 | } |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
250 | case 401: sn->error = DAV_UNAUTHORIZED; break; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
251 | case 403: sn->error = DAV_FORBIDDEN; break; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
252 | case 404: sn->error = DAV_NOT_FOUND; break; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
253 | case 405: sn->error = DAV_METHOD_NOT_ALLOWED; break; |
238
b167226fb804
added support for error codes 407,413,414 and 511
Mike Becker <universe@uap-core.de>
parents:
225
diff
changeset
|
254 | case 407: sn->error = DAV_PROXY_AUTH_REQUIRED; break; |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
255 | case 409: sn->error = DAV_CONFLICT; break; |
491
fdc2fb090cc7
adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
437
diff
changeset
|
256 | case 412: sn->error = DAV_PRECONDITION_FAILED; break; |
238
b167226fb804
added support for error codes 407,413,414 and 511
Mike Becker <universe@uap-core.de>
parents:
225
diff
changeset
|
257 | case 413: sn->error = DAV_REQUEST_ENTITY_TOO_LARGE; break; |
b167226fb804
added support for error codes 407,413,414 and 511
Mike Becker <universe@uap-core.de>
parents:
225
diff
changeset
|
258 | case 414: sn->error = DAV_REQUEST_URL_TOO_LONG; break; |
207
de23f8881e9f
fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
199
diff
changeset
|
259 | case 423: sn->error = DAV_LOCKED; break; |
238
b167226fb804
added support for error codes 407,413,414 and 511
Mike Becker <universe@uap-core.de>
parents:
225
diff
changeset
|
260 | case 511: sn->error = DAV_NET_AUTH_REQUIRED; break; |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
261 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
262 | } else { |
100
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
263 | switch(c) { |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
264 | case CURLE_UNSUPPORTED_PROTOCOL: sn->error = DAV_UNSUPPORTED_PROTOCOL; break; |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
265 | case CURLE_COULDNT_RESOLVE_PROXY: sn->error = DAV_COULDNT_RESOLVE_PROXY; break; |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
266 | case CURLE_COULDNT_RESOLVE_HOST: sn->error = DAV_COULDNT_RESOLVE_HOST; break; |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
267 | case CURLE_COULDNT_CONNECT: sn->error = DAV_COULDNT_CONNECT; break; |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
268 | case CURLE_OPERATION_TIMEDOUT: sn->error = DAV_TIMEOUT; break; |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
269 | case CURLE_SSL_CONNECT_ERROR: |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
270 | case CURLE_PEER_FAILED_VERIFICATION: |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
271 | case CURLE_SSL_ENGINE_NOTFOUND: |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
272 | case CURLE_SSL_ENGINE_SETFAILED: |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
273 | case CURLE_SSL_CERTPROBLEM: |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
274 | case CURLE_SSL_CIPHER: |
742
7e67689241fd
new build system
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
601
diff
changeset
|
275 | //#ifndef CURLE_SSL_CACERT |
7e67689241fd
new build system
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
601
diff
changeset
|
276 | // case CURLE_SSL_CACERT: |
7e67689241fd
new build system
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
601
diff
changeset
|
277 | //#endif |
100
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
278 | case CURLE_SSL_CACERT_BADFILE: |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
279 | case CURLE_SSL_SHUTDOWN_FAILED: |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
280 | case CURLE_SSL_CRL_BADFILE: |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
281 | case CURLE_SSL_ISSUER_ERROR: sn->error = DAV_SSL_ERROR; break; |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
282 | default: sn->error = DAV_ERROR; break; |
f4127c4d1018
improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
283 | } |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
284 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
285 | if(c != CURLE_OK) { |
225
a297c2e28fa1
improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
222
diff
changeset
|
286 | dav_session_set_errstr(sn, curl_easy_strerror(c)); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
287 | } else { |
225
a297c2e28fa1
improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
222
diff
changeset
|
288 | dav_session_set_errstr(sn, NULL); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
289 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
290 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
291 | |
225
a297c2e28fa1
improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
222
diff
changeset
|
292 | void dav_session_set_errstr(DavSession *sn, const char *str) { |
a297c2e28fa1
improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
222
diff
changeset
|
293 | if(sn->errorstr) { |
a297c2e28fa1
improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
222
diff
changeset
|
294 | dav_session_free(sn, sn->errorstr); |
a297c2e28fa1
improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
222
diff
changeset
|
295 | } |
a297c2e28fa1
improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
222
diff
changeset
|
296 | char *errstr = NULL; |
a297c2e28fa1
improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
222
diff
changeset
|
297 | if(str) { |
a297c2e28fa1
improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
222
diff
changeset
|
298 | errstr = dav_session_strdup(sn, str); |
a297c2e28fa1
improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
222
diff
changeset
|
299 | } |
a297c2e28fa1
improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
222
diff
changeset
|
300 | sn->errorstr = errstr; |
a297c2e28fa1
improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
222
diff
changeset
|
301 | } |
a297c2e28fa1
improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
222
diff
changeset
|
302 | |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
303 | void dav_session_destroy(DavSession *sn) { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
304 | // remove session from context |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
305 | CxList *sessions = sn->context->sessions; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
306 | ssize_t i = cxListFind(sessions, sn); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
307 | if(i >= 0) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
308 | cxListRemove(sessions, i); |
790
7110b37f2a6b
fix dav_context_destroy
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
788
diff
changeset
|
309 | } else { |
7110b37f2a6b
fix dav_context_destroy
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
788
diff
changeset
|
310 | printf("Error: session not found in ctx->sessions\n"); |
7110b37f2a6b
fix dav_context_destroy
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
788
diff
changeset
|
311 | dav_session_destructor(sn); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
312 | } |
790
7110b37f2a6b
fix dav_context_destroy
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
788
diff
changeset
|
313 | } |
7110b37f2a6b
fix dav_context_destroy
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
788
diff
changeset
|
314 | |
7110b37f2a6b
fix dav_context_destroy
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
788
diff
changeset
|
315 | void dav_session_destructor(DavSession *sn) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
316 | cxMempoolDestroy(sn->mp); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
317 | curl_easy_cleanup(sn->handle); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
318 | free(sn); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
319 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
320 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
321 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
322 | void* dav_session_malloc(DavSession *sn, size_t size) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
323 | return cxMalloc(sn->mp->allocator, size); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
324 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
325 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
326 | void* dav_session_calloc(DavSession *sn, size_t nelm, size_t size) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
327 | return cxCalloc(sn->mp->allocator, nelm, size); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
328 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
329 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
330 | void* dav_session_realloc(DavSession *sn, void *ptr, size_t size) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
331 | return cxRealloc(sn->mp->allocator, ptr, size); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
332 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
333 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
334 | void dav_session_free(DavSession *sn, void *ptr) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
335 | cxFree(sn->mp->allocator, ptr); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
336 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
337 | |
225
a297c2e28fa1
improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
222
diff
changeset
|
338 | char* dav_session_strdup(DavSession *sn, const char *str) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
339 | return cx_strdup_a(sn->mp->allocator, cx_str((char*)str)).ptr; |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
340 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
341 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
342 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
343 | char* dav_session_create_plain_href(DavSession *sn, const char *path) { |
437
70c7d8e437f9
fixes that decrypt-name can decrypt a path and not only the name
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
420
diff
changeset
|
344 | if(!DAV_ENCRYPT_NAME(sn) && !DAV_DECRYPT_NAME(sn)) { |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
345 | // non encrypted file names |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
346 | char *url = util_path_to_url(sn, path); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
347 | char *href = dav_session_strdup(sn, util_url_path(url)); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
348 | free(url); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
349 | return href; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
350 | } else { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
351 | return NULL; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
352 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
353 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
354 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
355 | char* dav_session_get_href(DavSession *sn, const char *path) { |
437
70c7d8e437f9
fixes that decrypt-name can decrypt a path and not only the name
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
420
diff
changeset
|
356 | if(DAV_DECRYPT_NAME(sn) || DAV_ENCRYPT_NAME(sn)) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
357 | cxstring p = cx_str(path); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
358 | CxBuffer href; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
359 | CxBuffer pbuf; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
360 | cxBufferInit(&href, NULL, 256, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
361 | cxBufferInit(&pbuf, NULL, 256, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
362 | |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
363 | int start = 0; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
364 | int begin = 0; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
365 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
366 | // check path cache |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
367 | char *cp = strdup(path); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
368 | //printf("cp: %s\n", cp); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
369 | while(strlen(cp) > 1) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
370 | char *cached = cxMapGet(sn->pathcache, cx_hash_key_str(cp)); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
371 | if(cached) { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
372 | start = strlen(cp); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
373 | begin = start; |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
374 | cxBufferPutString(&href, cached); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
375 | break; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
376 | } else { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
377 | // check, if the parent path is cached |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
378 | char *f = cp; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
379 | cp = util_parent_path(cp); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
380 | free(f); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
381 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
382 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
383 | free(cp); |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
384 | if(href.pos == 0) { |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
385 | // if there are no cached elements we have to add the base url path |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
386 | // to the href buffer |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
387 | cxBufferPutString(&href, util_url_path(sn->base_url)); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
388 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
389 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
390 | // create resource for name lookup |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
391 | cxmutstr rp = cx_strdup(cx_strn(path, start)); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
392 | DavResource *root = dav_resource_new(sn, rp.ptr); |
150
37fb12574acd
added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
393 | free(rp.ptr); |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
394 | resource_set_href(root, cx_strn(href.space, href.pos)); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
395 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
396 | // create request buffer for propfind requests |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
397 | CxBuffer *rqbuf = create_basic_propfind_request(); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
398 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
399 | cxstring remaining = cx_strsubs(p, start); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
400 | CxStrtokCtx elms = cx_strtok(remaining, CX_STR("/"), INT_MAX); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
401 | DavResource *res = root; |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
402 | cxBufferPutString(&pbuf, res->path); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
403 | // iterate over all remaining path elements |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
404 | cxstring elm; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
405 | while(cx_strtok_next(&elms, &elm)) { |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
406 | if(elm.length > 0) { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
407 | //printf("elm: %.*s\n", elm.length, elm.ptr); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
408 | DavResource *child = dav_find_child(sn, res, rqbuf, elm.ptr); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
409 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
410 | // if necessary add a path separator |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
411 | if(pbuf.space[pbuf.pos-1] != '/') { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
412 | if(href.space[href.pos-1] != '/') { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
413 | cxBufferPut(&href, '/'); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
414 | } |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
415 | cxBufferPut(&pbuf, '/'); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
416 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
417 | // add last path/href to the cache |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
418 | cxstring pp = cx_strn(pbuf.space, pbuf.size); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
419 | cxstring hh = cx_strn(href.space, href.size); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
420 | dav_session_cache_path(sn, pp, hh); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
421 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
422 | cxBufferWrite(elm.ptr, 1, elm.length, &pbuf); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
423 | if(child) { |
591
793af8666b3a
fixes missing url encoding in dav_session_get_href() with enabled name decryption
Mike Becker <universe@uap-core.de>
parents:
505
diff
changeset
|
424 | // href is already URL encoded, so don't encode again |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
425 | cxBufferPutString(&href, util_resource_name(child->href)); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
426 | res = child; |
496
5979ea04175e
fixes dav_session_get_href() generating random names when encrypt-name is disabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
491
diff
changeset
|
427 | } else if(DAV_ENCRYPT_NAME(sn)) { |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
428 | char *random_name = util_random_str(); |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
429 | cxBufferPutString(&href, random_name); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
430 | free(random_name); |
496
5979ea04175e
fixes dav_session_get_href() generating random names when encrypt-name is disabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
491
diff
changeset
|
431 | } else { |
591
793af8666b3a
fixes missing url encoding in dav_session_get_href() with enabled name decryption
Mike Becker <universe@uap-core.de>
parents:
505
diff
changeset
|
432 | // path is not URL encoded, so we have to do this here |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
433 | cxstring resname = cx_str(util_resource_name((const char*)path)); |
600
8e7f02fd7b9b
fixes incorrect URL encoding of the trailing slash for collection names
Mike Becker <universe@uap-core.de>
parents:
591
diff
changeset
|
434 | // the name of collections ends with |
8e7f02fd7b9b
fixes incorrect URL encoding of the trailing slash for collection names
Mike Becker <universe@uap-core.de>
parents:
591
diff
changeset
|
435 | // a trailing slash, which MUST NOT be encoded |
8e7f02fd7b9b
fixes incorrect URL encoding of the trailing slash for collection names
Mike Becker <universe@uap-core.de>
parents:
591
diff
changeset
|
436 | if(resname.ptr[resname.length-1] == '/') { |
8e7f02fd7b9b
fixes incorrect URL encoding of the trailing slash for collection names
Mike Becker <universe@uap-core.de>
parents:
591
diff
changeset
|
437 | char *esc = curl_easy_escape(sn->handle, |
8e7f02fd7b9b
fixes incorrect URL encoding of the trailing slash for collection names
Mike Becker <universe@uap-core.de>
parents:
591
diff
changeset
|
438 | resname.ptr, resname.length-1); |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
439 | cxBufferWrite(esc, 1, strlen(esc), &href); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
440 | cxBufferPut(&href, '/'); |
600
8e7f02fd7b9b
fixes incorrect URL encoding of the trailing slash for collection names
Mike Becker <universe@uap-core.de>
parents:
591
diff
changeset
|
441 | curl_free(esc); |
8e7f02fd7b9b
fixes incorrect URL encoding of the trailing slash for collection names
Mike Becker <universe@uap-core.de>
parents:
591
diff
changeset
|
442 | } else { |
8e7f02fd7b9b
fixes incorrect URL encoding of the trailing slash for collection names
Mike Becker <universe@uap-core.de>
parents:
591
diff
changeset
|
443 | char *esc = curl_easy_escape(sn->handle, |
8e7f02fd7b9b
fixes incorrect URL encoding of the trailing slash for collection names
Mike Becker <universe@uap-core.de>
parents:
591
diff
changeset
|
444 | resname.ptr, resname.length); |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
445 | cxBufferWrite(esc, 1, strlen(esc), &href); |
600
8e7f02fd7b9b
fixes incorrect URL encoding of the trailing slash for collection names
Mike Becker <universe@uap-core.de>
parents:
591
diff
changeset
|
446 | curl_free(esc); |
8e7f02fd7b9b
fixes incorrect URL encoding of the trailing slash for collection names
Mike Becker <universe@uap-core.de>
parents:
591
diff
changeset
|
447 | } |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
448 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
449 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
450 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
451 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
452 | // if necessary add a path separator |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
453 | if(p.ptr[p.length-1] == '/') { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
454 | if(href.space[href.pos-1] != '/') { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
455 | cxBufferPut(&href, '/'); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
456 | } |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
457 | cxBufferPut(&pbuf, '/'); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
458 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
459 | // add the final path to the cache |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
460 | cxstring pp = cx_strn(pbuf.space, pbuf.size); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
461 | cxstring hh = cx_strn(href.space, href.size); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
462 | dav_session_cache_path(sn, pp, hh); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
463 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
464 | cxmutstr href_str = cx_strdup_a( |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
465 | sn->mp->allocator, |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
466 | cx_strn(href.space, href.size)); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
467 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
468 | // cleanup |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
469 | dav_resource_free_all(root); |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
470 | cxBufferFree(rqbuf); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
471 | |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
472 | cxBufferDestroy(&pbuf); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
473 | cxBufferDestroy(&href); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
474 | |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
475 | return href_str.ptr; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
476 | } else { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
477 | return dav_session_create_plain_href(sn, path); |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
478 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
479 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
480 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
481 | DavResource* dav_find_child(DavSession *sn, DavResource *res, CxBuffer *rqbuf, const char *name) { |
135
664aeaec8d25
replaced old davql (still buggy)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
104
diff
changeset
|
482 | if(res && !dav_propfind(sn, res, rqbuf)) { |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
483 | DavResource *child = res->children; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
484 | while(child) { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
485 | if(!strcmp(child->name, name)) { |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
486 | return child; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
487 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
488 | child = child->next; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
489 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
490 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
491 | return NULL; |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
492 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
493 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
494 | void dav_session_cache_path(DavSession *sn, cxstring path, cxstring href) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
495 | CxHashKey path_key = cx_hash_key(path.ptr, path.length); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
496 | char *elm = cxMapGet(sn->pathcache, path_key); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
497 | if(!elm) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
498 | cxmutstr href_s = cx_strdup_a(sn->mp->allocator, href); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
499 | cxMapPut(sn->pathcache, path_key, href_s.ptr); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
500 | } |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
501 | } |
208
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
502 | |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
503 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
504 | DavLock* dav_create_lock(DavSession *sn, const char *token, char *timeout) { |
208
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
505 | DavLock *lock = dav_session_malloc(sn, sizeof(DavLock)); |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
506 | lock->path = NULL; |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
507 | lock->token = dav_session_strdup(sn, token); |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
508 | |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
509 | // TODO: timeout |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
510 | |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
511 | return lock; |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
512 | } |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
513 | |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
514 | void dav_destroy_lock(DavSession *sn, DavLock *lock) { |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
515 | dav_session_free(sn, lock->token); |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
516 | if(lock->path) { |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
517 | dav_session_free(sn, lock->path); |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
518 | } |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
519 | dav_session_free(sn, lock); |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
520 | } |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
521 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
522 | |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
523 | static int dav_lock_cmp(void const *left, void const *right) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
524 | const DavLock *l = left; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
525 | const DavLock *r = right; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
526 | return strcmp(l->path, r->path); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
527 | } |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
528 | |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
529 | static int create_lock_manager(DavSession *sn) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
530 | // create lock manager |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
531 | DavLockManager *locks = cxMalloc(sn->mp->allocator, sizeof(DavLockManager)); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
532 | locks->resource_locks = cxHashMapCreate(sn->mp->allocator, CX_STORE_POINTERS, 16); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
533 | locks->collection_locks = cxLinkedListCreate(sn->mp->allocator, dav_lock_cmp, CX_STORE_POINTERS); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
534 | sn->locks = locks; |
208
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
535 | return 0; |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
536 | } |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
537 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
538 | static DavLockManager* get_lock_manager(DavSession *sn) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
539 | DavLockManager *locks = sn->locks; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
540 | if(!locks) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
541 | if(create_lock_manager(sn)) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
542 | return NULL; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
543 | } |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
544 | locks = sn->locks; |
208
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
545 | } |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
546 | return locks; |
208
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
547 | } |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
548 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
549 | int dav_add_resource_lock(DavSession *sn, const char *path, DavLock *lock) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
550 | DavLockManager *locks = get_lock_manager(sn); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
551 | if(!locks) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
552 | return -1; |
208
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
553 | } |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
554 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
555 | CxHashKey path_key = cx_hash_key_str(path); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
556 | if(cxMapGet(locks->resource_locks, path_key)) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
557 | return -1; |
208
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
558 | } |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
559 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
560 | cxMapPut(locks->resource_locks, path_key, lock); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
561 | return 0; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
562 | } |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
563 | |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
564 | int dav_add_collection_lock(DavSession *sn, const char *path, DavLock *lock) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
565 | DavLockManager *locks = get_lock_manager(sn); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
566 | if(!locks) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
567 | return -1; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
568 | } |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
569 | |
777
15006651a5d1
fix dav_add_collection_lock() setting the lock path
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
747
diff
changeset
|
570 | lock->path = dav_session_strdup(sn, path); |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
571 | cxListAdd(locks->collection_locks, lock); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
572 | cxListSort(locks->collection_locks); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
573 | |
208
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
574 | return 0; |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
575 | } |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
576 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
577 | DavLock* dav_get_lock(DavSession *sn, const char *path) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
578 | DavLockManager *locks = get_lock_manager(sn); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
579 | if(!locks) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
580 | return NULL; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
581 | } |
208
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
582 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
583 | cxstring p = cx_str(path); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
584 | |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
585 | DavLock *lock = cxMapGet(locks->resource_locks, cx_hash_key(p.ptr, p.length)); |
208
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
586 | if(lock) { |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
587 | return lock; |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
588 | } |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
589 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
590 | CxIterator i = cxListIterator(locks->collection_locks); |
777
15006651a5d1
fix dav_add_collection_lock() setting the lock path
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
747
diff
changeset
|
591 | cx_foreach(DavLock*, col_lock, i) { |
15006651a5d1
fix dav_add_collection_lock() setting the lock path
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
747
diff
changeset
|
592 | int cmd = strcmp(path, col_lock->path); |
208
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
593 | if(cmd == 0) { |
777
15006651a5d1
fix dav_add_collection_lock() setting the lock path
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
747
diff
changeset
|
594 | return col_lock; |
15006651a5d1
fix dav_add_collection_lock() setting the lock path
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
747
diff
changeset
|
595 | } else if(cx_strprefix(p, cx_str(col_lock->path))) { |
15006651a5d1
fix dav_add_collection_lock() setting the lock path
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
747
diff
changeset
|
596 | return col_lock; |
208
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
597 | } else if(cmd > 0) { |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
598 | break; |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
599 | } |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
600 | } |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
601 | |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
602 | return NULL; |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
603 | } |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
604 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
605 | void dav_remove_lock(DavSession *sn, const char *path, DavLock *lock) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
606 | DavLockManager *locks = get_lock_manager(sn); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
607 | if(!locks) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
608 | return; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
609 | } |
208
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
610 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
611 | if(cxMapRemoveAndGet(locks->resource_locks, cx_hash_key_str(path))) { |
208
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
612 | return; |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
613 | } |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
614 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
615 | CxMutIterator i = cxListMutIterator(locks->collection_locks); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
616 | int rm = 0; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
617 | cx_foreach(DavLock* , cl, i) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
618 | if(rm) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
619 | break; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
620 | } |
208
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
621 | if(cl == lock) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
622 | cxIteratorFlagRemoval(i); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
742
diff
changeset
|
623 | rm = 1; |
208
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
624 | } |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
625 | } |
1fb26aca5093
added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
626 | } |