libidav/session.c

Sun, 05 Jul 2026 20:08:44 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 05 Jul 2026 20:08:44 +0200
branch
dav-2
changeset 922
42ecf0e5075a
parent 919
7f250903d903
permissions
-rw-r--r--

make some session function args const

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>
816
839fefbdedc7 compatibility with UCX 3.1 plus several minor code fixes
Mike Becker <universe@uap-core.de>
parents: 806
diff changeset
34 #include <cx/mempool.h>
747
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/hash_map.h>
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37 #include "utils.h"
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 #include "session.h"
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 #include "resource.h"
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 #include "methods.h"
914
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
41 #include "atomic.h"
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42
922
42ecf0e5075a make some session function args const
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
43 DavSession* dav_session_new(DavContext *context, const char *base_url) {
43
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));
854
1c8401ece69e update ucx to version 3.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 853
diff changeset
53 sn->mp = cxMempoolCreateSimple(DAV_SESSION_MEMPOOL_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
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
891
4d58cbcc9efa update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 854
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
805
bff983370565 make DavContext mt-safe
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 796
diff changeset
97 dav_context_add_session(context, sn);
68
f6d3db6113d3 added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents: 43
diff changeset
98 sn->context = context;
914
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
99 dav_context_ref(context);
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
100
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
101 sn->ref = 1;
43
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 return sn;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 DavSession* dav_session_new_auth(
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107 DavContext *context,
922
42ecf0e5075a make some session function args const
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
108 const char *base_url,
42ecf0e5075a make some session function args const
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
109 const char *user,
42ecf0e5075a make some session function args const
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
110 const char *password)
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112 DavSession *sn = dav_session_new(context, base_url);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
113 if(!sn) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
114 return NULL;
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 dav_session_set_auth(sn, user, password);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
117 return sn;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
118 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
119
806
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
120 DavSession* dav_session_clone(DavSession *sn) {
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
121 CURL *newhandle = curl_easy_duphandle(sn->handle);
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
122
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
123 DavSession *newsn = malloc(sizeof(DavSession));
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
124 memset(newsn, 0, sizeof(DavSession));
854
1c8401ece69e update ucx to version 3.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 853
diff changeset
125 newsn->mp = cxMempoolCreateSimple(DAV_SESSION_MEMPOOL_SIZE);
828
e082e5d7d75b fix dav_session_clone using the wrong allocator for the pathcache
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 816
diff changeset
126 newsn->pathcache = cxHashMapCreate(newsn->mp->allocator, CX_STORE_POINTERS, DAV_PATH_CACHE_SIZE);
806
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
127 newsn->key = sn->key;
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
128 newsn->errorstr = NULL;
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
129 newsn->error = DAV_OK;
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
130 newsn->flags = 0;
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
131
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
132 newsn->handle = newhandle;
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
133
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
134 newsn->base_url = cx_strdup_a(newsn->mp->allocator, cx_str(sn->base_url)).ptr;
919
7f250903d903 dav_session_clone should not clone anything that relies on userdata
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
135
806
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
136 newsn->logfunc = sn->logfunc;
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
137
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
138 // add to context
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
139 dav_context_add_session(sn->context, newsn);
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
140 newsn->context = sn->context;
914
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
141 dav_context_ref(sn->context);
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
142
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
143 newsn->ref = 1;
806
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
144
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
145 return newsn;
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
146 }
673a803d2203 fix session dup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 805
diff changeset
147
914
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
148 void dav_session_ref(DavSession *sn) {
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
149 dav_atomic_inc32(&sn->ref);
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
150 }
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
151
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
152 void dav_session_unref(DavSession *sn) {
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
153 if(dav_atomic_dec32(&sn->ref) == 0) {
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
154 dav_session_destroy(sn);
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
155 }
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
156 }
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
157
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 790
diff changeset
158 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
159 if(user && password) {
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 790
diff changeset
160 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
161 }
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 790
diff changeset
162 }
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 790
diff changeset
163
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 790
diff changeset
164 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
165 if(user.length > 0 && password.length > 0) {
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 790
diff changeset
166 size_t upwdlen = user.length + password.length + 2;
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
167 char *upwdbuf = malloc(upwdlen);
796
81e0f67386a6 remove old config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 790
diff changeset
168 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
169 curl_easy_setopt(sn->handle, CURLOPT_USERPWD, upwdbuf);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
170 free(upwdbuf);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
171 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
172 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
173
922
42ecf0e5075a make some session function args const
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
174 void dav_session_set_baseurl(DavSession *sn, const 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
175 const CxAllocator *a = sn->mp->allocator;
922
42ecf0e5075a make some session function args const
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
176 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
177
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
178 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
179 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
180 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
181 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
182 } 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
183 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
184 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
185 url_str[url.length] = '/';
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 496
diff changeset
186 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
187 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
188 }
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 496
diff changeset
189 }
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 496
diff changeset
190
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
191 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
192 sn->key = key;
68
f6d3db6113d3 added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents: 43
diff changeset
193 // TODO: review sanity
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
194 if(flags != 0) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
195 sn->flags |= flags;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
196 } else {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
197 sn->flags |= DAV_SESSION_ENCRYPT_CONTENT;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
198 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
199 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
200
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
201 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
202 sn->auth_prompt = func;
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
203 sn->authprompt_userdata = userdata;
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
204 }
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
205
355
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
206 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
207 sn->get_progress = get;
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
208 sn->put_progress = put;
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
209 sn->progress_userdata = userdata;
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
210 }
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
211
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
212 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
213 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
214 }
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
215
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
216 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
217 CURLcode ret = curl_easy_perform(sn->handle);
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
218 long http_status;
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
219 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
220 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
221 if(sn->logfunc) {
9b9420041d8e add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 777
diff changeset
222 char *log_method;
9b9420041d8e add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 777
diff changeset
223 char *log_url;
9b9420041d8e add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 777
diff changeset
224 curl_easy_getinfo(sn->handle, CURLINFO_EFFECTIVE_URL, &log_url);
851
55c5d36b82b7 fix compatibility with older libcurl versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 828
diff changeset
225 #if LIBCURL_VERSION_NUM >= 0x074800
788
9b9420041d8e add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 777
diff changeset
226 curl_easy_getinfo(sn->handle, CURLINFO_EFFECTIVE_METHOD , &log_method);
851
55c5d36b82b7 fix compatibility with older libcurl versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 828
diff changeset
227 #else
55c5d36b82b7 fix compatibility with older libcurl versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 828
diff changeset
228 long opt_upload = 0;
55c5d36b82b7 fix compatibility with older libcurl versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 828
diff changeset
229 curl_easy_getinfo(sn->handle, CURLOPT_UPLOAD, &opt_upload);
55c5d36b82b7 fix compatibility with older libcurl versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 828
diff changeset
230 char *opt_custom = NULL;
55c5d36b82b7 fix compatibility with older libcurl versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 828
diff changeset
231 curl_easy_getinfo(sn->handle, CURLOPT_CUSTOMREQUEST, &opt_custom);
55c5d36b82b7 fix compatibility with older libcurl versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 828
diff changeset
232 if(opt_custom) {
55c5d36b82b7 fix compatibility with older libcurl versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 828
diff changeset
233 log_method = opt_custom;
55c5d36b82b7 fix compatibility with older libcurl versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 828
diff changeset
234 } else if(opt_upload) {
55c5d36b82b7 fix compatibility with older libcurl versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 828
diff changeset
235 log_method = "PUT";
55c5d36b82b7 fix compatibility with older libcurl versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 828
diff changeset
236 } else {
55c5d36b82b7 fix compatibility with older libcurl versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 828
diff changeset
237 log_method = "GET";
55c5d36b82b7 fix compatibility with older libcurl versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 828
diff changeset
238 }
55c5d36b82b7 fix compatibility with older libcurl versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 828
diff changeset
239 #endif
788
9b9420041d8e add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 777
diff changeset
240 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
241 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
242 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
243 size_t log_rpbodylen = 0;
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
244 if(request) {
788
9b9420041d8e add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 777
diff changeset
245 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
246 log_reqbodylen = request->size;
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
247 }
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
248 if(response) {
788
9b9420041d8e add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 777
diff changeset
249 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
250 log_rpbodylen = response->size;
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
251 }
788
9b9420041d8e add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 777
diff changeset
252 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
253 }
788
9b9420041d8e add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 777
diff changeset
254
9b9420041d8e add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 777
diff changeset
255 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
256 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
257 if(request) {
9b9420041d8e add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 777
diff changeset
258 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
259 }
9b9420041d8e add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 777
diff changeset
260 if(response) {
9b9420041d8e add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 777
diff changeset
261 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
262 }
9b9420041d8e add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 777
diff changeset
263 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
264 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
265 }
9b9420041d8e add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 777
diff changeset
266 }
9b9420041d8e add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 777
diff changeset
267
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
268 }
788
9b9420041d8e add request/response body to verbose output / add DavSession logfunc
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 777
diff changeset
269
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
270 if(status) {
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
271 *status = http_status;
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
272 }
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
273 return ret;
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
274 }
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 292
diff changeset
275
355
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
276 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
277 DavResource *res = clientp;
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
278 DavSession *sn = res->session;
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
279 if(sn->get_progress) {
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
280 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
281 }
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
282 return 0;
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
283 }
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
284
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
285 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
286 DavResource *res = clientp;
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
287 DavSession *sn = res->session;
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
288 if(sn->put_progress) {
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
289 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
290 }
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
291 return 0;
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
292 }
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
293
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
294 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
295 if(status > 0) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
296 switch(status) {
100
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
297 default: {
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
298 switch(c) {
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
299 default: sn->error = DAV_ERROR;
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
300 }
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
301 break;
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
302 }
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
303 case 401: sn->error = DAV_UNAUTHORIZED; break;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
304 case 403: sn->error = DAV_FORBIDDEN; break;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
305 case 404: sn->error = DAV_NOT_FOUND; break;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
306 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
307 case 407: sn->error = DAV_PROXY_AUTH_REQUIRED; break;
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
308 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
309 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
310 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
311 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
312 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
313 case 511: sn->error = DAV_NET_AUTH_REQUIRED; break;
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
314 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
315 } else {
100
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
316 switch(c) {
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
317 case CURLE_UNSUPPORTED_PROTOCOL: sn->error = DAV_UNSUPPORTED_PROTOCOL; break;
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
318 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
319 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
320 case CURLE_COULDNT_CONNECT: sn->error = DAV_COULDNT_CONNECT; break;
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
321 case CURLE_OPERATION_TIMEDOUT: sn->error = DAV_TIMEOUT; break;
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
322 case CURLE_SSL_CONNECT_ERROR:
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
323 case CURLE_PEER_FAILED_VERIFICATION:
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
324 case CURLE_SSL_ENGINE_NOTFOUND:
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
325 case CURLE_SSL_ENGINE_SETFAILED:
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
326 case CURLE_SSL_CERTPROBLEM:
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
327 case CURLE_SSL_CIPHER:
742
7e67689241fd new build system
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 601
diff changeset
328 //#ifndef CURLE_SSL_CACERT
7e67689241fd new build system
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 601
diff changeset
329 // case CURLE_SSL_CACERT:
7e67689241fd new build system
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 601
diff changeset
330 //#endif
100
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
331 case CURLE_SSL_CACERT_BADFILE:
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
332 case CURLE_SSL_SHUTDOWN_FAILED:
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
333 case CURLE_SSL_CRL_BADFILE:
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
334 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
335 default: sn->error = DAV_ERROR; break;
f4127c4d1018 improved error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
336 }
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
337 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
338 if(c != CURLE_OK) {
225
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
339 dav_session_set_errstr(sn, curl_easy_strerror(c));
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
340 } else {
225
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
341 dav_session_set_errstr(sn, NULL);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
342 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
343 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
344
225
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
345 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
346 if(sn->errorstr) {
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
347 dav_session_free(sn, sn->errorstr);
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
348 }
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
349 char *errstr = NULL;
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
350 if(str) {
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
351 errstr = dav_session_strdup(sn, str);
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
352 }
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
353 sn->errorstr = errstr;
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
354 }
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
355
915
8f9dbd755fdb add functions for getting the current DavSession error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 914
diff changeset
356 DavError dav_session_get_error(DavSession *sn) {
8f9dbd755fdb add functions for getting the current DavSession error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 914
diff changeset
357 return sn->error;
8f9dbd755fdb add functions for getting the current DavSession error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 914
diff changeset
358 }
8f9dbd755fdb add functions for getting the current DavSession error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 914
diff changeset
359
8f9dbd755fdb add functions for getting the current DavSession error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 914
diff changeset
360 const char* dav_session_get_errorstr(DavSession *sn) {
8f9dbd755fdb add functions for getting the current DavSession error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 914
diff changeset
361 return sn->errorstr;
8f9dbd755fdb add functions for getting the current DavSession error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 914
diff changeset
362 }
8f9dbd755fdb add functions for getting the current DavSession error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 914
diff changeset
363
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
364 void dav_session_destroy(DavSession *sn) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
365 // remove session from context
914
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
366 DavContext *ctx = sn->context;
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
367 dav_context_ref(ctx);
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
368 if (dav_context_remove_session(ctx, sn)) {
805
bff983370565 make DavContext mt-safe
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 796
diff changeset
369 fprintf(stderr, "Error: session not found in ctx->sessions\n");
790
7110b37f2a6b fix dav_context_destroy
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 788
diff changeset
370 dav_session_destructor(sn);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
371 }
914
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
372 dav_context_unref(ctx);
790
7110b37f2a6b fix dav_context_destroy
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 788
diff changeset
373 }
7110b37f2a6b fix dav_context_destroy
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 788
diff changeset
374
7110b37f2a6b fix dav_context_destroy
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 788
diff changeset
375 void dav_session_destructor(DavSession *sn) {
852
83fdf679df99 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 828
diff changeset
376 cxMempoolFree(sn->mp);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
377 curl_easy_cleanup(sn->handle);
914
42c6b071b231 implement reference counting for DavContext and DavSession
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 893
diff changeset
378 dav_context_unref(sn->context);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
379 free(sn);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
380 }
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 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
384 return cxMalloc(sn->mp->allocator, size);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
385 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
386
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
387 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
388 return cxCalloc(sn->mp->allocator, nelm, size);
43
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
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
391 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
392 return cxRealloc(sn->mp->allocator, ptr, size);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
393 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
394
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
395 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
396 cxFree(sn->mp->allocator, ptr);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
397 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
398
225
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
399 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
400 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
401 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
402
918
ca393d39e5cd add dav_session_reg_destructor
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 915
diff changeset
403 void dav_session_reg_destructor(DavSession *sn, void *data, cx_destructor_func destr) {
ca393d39e5cd add dav_session_reg_destructor
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 915
diff changeset
404 cxMempoolRegister(sn->mp, data, destr);
ca393d39e5cd add dav_session_reg_destructor
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 915
diff changeset
405 }
ca393d39e5cd add dav_session_reg_destructor
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 915
diff changeset
406
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
407
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
408 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
409 if(!DAV_ENCRYPT_NAME(sn) && !DAV_DECRYPT_NAME(sn)) {
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
410 // non encrypted file names
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
411 char *url = util_path_to_url(sn, path);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
412 char *href = dav_session_strdup(sn, util_url_path(url));
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
413 free(url);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
414 return href;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
415 } else {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
416 return NULL;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
417 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
418 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
419
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
420 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
421 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
422 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
423 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
424 CxBuffer pbuf;
891
4d58cbcc9efa update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 854
diff changeset
425 cxBufferInit(&href, cxDefaultAllocator, NULL, 256, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
4d58cbcc9efa update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 854
diff changeset
426 cxBufferInit(&pbuf, cxDefaultAllocator, NULL, 256, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
427
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
428 int start = 0;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
429 int begin = 0;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
430
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
431 // check path cache
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
432 char *cp = strdup(path);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
433 //printf("cp: %s\n", cp);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
434 while(strlen(cp) > 1) {
893
38800d479cd4 remove unnecessary usage of cx_hash_key_str
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 891
diff changeset
435 char *cached = cxMapGet(sn->pathcache, cp);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
436 if(cached) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
437 start = strlen(cp);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
438 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
439 cxBufferPutString(&href, cached);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
440 break;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
441 } else {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
442 // check, if the parent path is cached
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
443 char *f = cp;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
444 cp = util_parent_path(cp);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
445 free(f);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
446 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
447 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
448 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
449 if(href.pos == 0) {
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
450 // 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
451 // 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
452 cxBufferPutString(&href, util_url_path(sn->base_url));
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
453 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
454
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
455 // 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
456 cxmutstr rp = cx_strdup(cx_strn(path, start));
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
457 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
458 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
459 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
460
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
461 // 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
462 CxBuffer *rqbuf = create_basic_propfind_request();
43
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 cxstring remaining = cx_strsubs(p, start);
891
4d58cbcc9efa update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 854
diff changeset
465 CxStrtokCtx elms = cx_strtok(remaining, cx_str("/"), INT_MAX);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
466 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
467 cxBufferPutString(&pbuf, res->path);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
468 // 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
469 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
470 while(cx_strtok_next(&elms, &elm)) {
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
471 if(elm.length > 0) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
472 //printf("elm: %.*s\n", elm.length, elm.ptr);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
473 DavResource *child = dav_find_child(sn, res, rqbuf, elm.ptr);
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 // 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
476 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
477 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
478 cxBufferPut(&href, '/');
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
479 }
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
480 cxBufferPut(&pbuf, '/');
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
481 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
482 // 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
483 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
484 cxstring hh = cx_strn(href.space, href.size);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
485 dav_session_cache_path(sn, pp, hh);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
486
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
487 cxBufferWrite(elm.ptr, 1, elm.length, &pbuf);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
488 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
489 // 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
490 cxBufferPutString(&href, util_resource_name(child->href));
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
491 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
492 } else if(DAV_ENCRYPT_NAME(sn)) {
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
493 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
494 cxBufferPutString(&href, random_name);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
495 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
496 } 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
497 // 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
498 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
499 // 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
500 // 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
501 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
502 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
503 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
504 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
505 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
506 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
507 } else {
8e7f02fd7b9b fixes incorrect URL encoding of the trailing slash for collection names
Mike Becker <universe@uap-core.de>
parents: 591
diff changeset
508 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
509 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
510 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
511 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
512 }
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
513 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
514 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
515 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
516
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
517 // if necessary add a path separator
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
518 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
519 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
520 cxBufferPut(&href, '/');
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
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 cxBufferPut(&pbuf, '/');
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
523 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
524 // 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
525 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
526 cxstring hh = cx_strn(href.space, href.size);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
527 dav_session_cache_path(sn, pp, hh);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
528
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
529 cxmutstr href_str = cx_strdup_a(
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
530 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
531 cx_strn(href.space, href.size));
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
532
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
533 // cleanup
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
534 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
535 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
536
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
537 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
538 cxBufferDestroy(&href);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
539
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
540 return href_str.ptr;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
541 } else {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
542 return dav_session_create_plain_href(sn, path);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
543 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
544 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
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 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
547 if(res && !dav_propfind(sn, res, rqbuf)) {
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
548 DavResource *child = res->children;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
549 while(child) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
550 if(!strcmp(child->name, name)) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
551 return child;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
552 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
553 child = child->next;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
554 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
555 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
556 return NULL;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
557 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
558
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
559 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
560 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
561 char *elm = cxMapGet(sn->pathcache, path_key);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
562 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
563 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
564 cxMapPut(sn->pathcache, path_key, href_s.ptr);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
565 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
566 }
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
567
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
568
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
569 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
570 DavLock *lock = dav_session_malloc(sn, sizeof(DavLock));
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
571 lock->path = NULL;
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
572 lock->token = dav_session_strdup(sn, token);
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
573
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
574 // TODO: timeout
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 return lock;
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
577 }
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
578
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
579 void dav_destroy_lock(DavSession *sn, DavLock *lock) {
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
580 dav_session_free(sn, lock->token);
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
581 if(lock->path) {
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
582 dav_session_free(sn, lock->path);
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
583 }
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
584 dav_session_free(sn, lock);
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
585 }
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
586
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
587
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
588 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
589 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
590 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
591 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
592 }
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
593
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
594 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
595 // 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
596 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
597 locks->resource_locks = cxHashMapCreate(sn->mp->allocator, CX_STORE_POINTERS, 16);
891
4d58cbcc9efa update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 854
diff changeset
598 locks->collection_locks = cxLinkedListCreate(sn->mp->allocator, CX_STORE_POINTERS);
4d58cbcc9efa update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 854
diff changeset
599 cxSetCompareFunc(locks->collection_locks, dav_lock_cmp);
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
600 sn->locks = locks;
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
601 return 0;
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
602 }
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
603
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
604 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
605 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
606 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
607 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
608 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
609 }
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
610 locks = sn->locks;
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
611 }
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
612 return locks;
208
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 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
616 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
617 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
618 return -1;
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
619 }
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
620
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
621 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
622 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
623 return -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
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
626 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
627 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
628 }
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
629
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
630 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
631 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
632 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
633 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
634 }
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
635
777
15006651a5d1 fix dav_add_collection_lock() setting the lock path
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
636 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
637 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
638 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
639
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
640 return 0;
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
641 }
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
642
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
643 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
644 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
645 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
646 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
647 }
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
648
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
649 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
650
893
38800d479cd4 remove unnecessary usage of cx_hash_key_str
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 891
diff changeset
651 DavLock *lock = cxMapGet(locks->resource_locks, p);
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
652 if(lock) {
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
653 return lock;
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
654 }
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
655
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
656 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
657 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
658 int cmd = strcmp(path, col_lock->path);
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
659 if(cmd == 0) {
777
15006651a5d1 fix dav_add_collection_lock() setting the lock path
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
660 return col_lock;
15006651a5d1 fix dav_add_collection_lock() setting the lock path
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 747
diff changeset
661 } 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
662 return col_lock;
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
663 } else if(cmd > 0) {
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
664 break;
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
665 }
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
666 }
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
667
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
668 return NULL;
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
669 }
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
670
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
671 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
672 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
673 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
674 return;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 742
diff changeset
675 }
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
676
893
38800d479cd4 remove unnecessary usage of cx_hash_key_str
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 891
diff changeset
677 if(!cxMapRemove(locks->resource_locks, path)) {
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
678 return;
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
679 }
816
839fefbdedc7 compatibility with UCX 3.1 plus several minor code fixes
Mike Becker <universe@uap-core.de>
parents: 806
diff changeset
680
839fefbdedc7 compatibility with UCX 3.1 plus several minor code fixes
Mike Becker <universe@uap-core.de>
parents: 806
diff changeset
681 cxListFindRemove(locks->collection_locks, lock);
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
682 }

mercurial