libidav/resource.c

Sat, 22 Jun 2019 16:36:52 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 22 Jun 2019 16:36:52 +0200
changeset 607
5dc7fe41e8f8
parent 605
bbc66c72661a
child 609
dc3d70848c7c
permissions
-rw-r--r--

move some properties to new namespace

for properties encryption we need to decide which props must be encrypted and the plan is, to decide by namespace

33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
4 * Copyright 2018 Olaf Wintermann. All rights reserved.
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0bbbb0341606 some code cleanup and bug fixes
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
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include <stdio.h>
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 #include <stdlib.h>
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #include <string.h>
182
ca07f14f7bfe added override option for copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 181
diff changeset
32 #include <stdbool.h>
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 #include <libxml/tree.h>
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 #include "utils.h"
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
36 #include "session.h"
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37 #include "methods.h"
40
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
38 #include "crypto.h"
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 #include "ucx/buffer.h"
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 #include "ucx/utils.h"
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 #include "resource.h"
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
43 #include "xml.h"
139
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
44 #include "davqlexec.h"
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 #define xstreq(a,b) xmlStrEqual(BAD_CAST a, BAD_CAST b)
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 DavResource* dav_resource_new(DavSession *sn, char *path) {
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
49 //char *href = util_url_path(url);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
50 //DavResource *res = dav_resource_new_href(sn, href);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
51 char *parent = util_parent_path(path);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
52 char *name = util_resource_name(path);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
53 char *href = dav_session_create_plain_href(sn, path);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
54
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
55 DavResource *res = dav_resource_new_full(sn, parent, name, href);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
56 free(parent);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57 return res;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59
42
6518b035a9df added some api functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
60 DavResource* dav_resource_new_child(DavSession *sn, DavResource *parent, char *name) {
6518b035a9df added some api functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
61 char *path = util_concat_path(parent->path, name);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
62 char *href = dav_session_create_plain_href(sn, path);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
63 DavResource *res = dav_resource_new_full(sn, parent->path, name, href);
42
6518b035a9df added some api functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
64 free(path);
6518b035a9df added some api functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
65 return res;
6518b035a9df added some api functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
66 }
6518b035a9df added some api functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
67
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68
40
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
69 DavResource* dav_resource_new_href(DavSession *sn, char *href) {
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
70 DavResource *res = ucx_mempool_calloc(sn->mp, 1, sizeof(DavResource));
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 res->session = sn;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 // set name, path and href
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74 resource_set_info(res, href);
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 // initialize resource data
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 res->data = resource_data_new(sn);
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79 return res;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
82 DavResource* dav_resource_new_full(DavSession *sn, char *parent_path, char *name, char *href) {
268
2610eecfc5e5 adds resource name validation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 261
diff changeset
83 sstr_t n = sstr(name);
2610eecfc5e5 adds resource name validation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 261
diff changeset
84 // the name must not contain path separators
518
cca3e7aa30ed fix null pointer dereferenciation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 505
diff changeset
85 if(n.length > 0 && href) {
280
6d8784bee427 fixes dav_resource_new_full
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 269
diff changeset
86 for(int i=0;i<n.length-1;i++) {
6d8784bee427 fixes dav_resource_new_full
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 269
diff changeset
87 char c = n.ptr[i];
6d8784bee427 fixes dav_resource_new_full
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 269
diff changeset
88 if(c == '/' || c == '\\') {
6d8784bee427 fixes dav_resource_new_full
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 269
diff changeset
89 n = sstr(util_resource_name(href));
6d8784bee427 fixes dav_resource_new_full
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 269
diff changeset
90 break;
6d8784bee427 fixes dav_resource_new_full
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 269
diff changeset
91 }
268
2610eecfc5e5 adds resource name validation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 261
diff changeset
92 }
2610eecfc5e5 adds resource name validation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 261
diff changeset
93 }
2610eecfc5e5 adds resource name validation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 261
diff changeset
94 // remove trailing '/'
2610eecfc5e5 adds resource name validation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 261
diff changeset
95 if(n.length > 0 && n.ptr[n.length-1] == '/') {
2610eecfc5e5 adds resource name validation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 261
diff changeset
96 n.length--;
2610eecfc5e5 adds resource name validation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 261
diff changeset
97 }
2610eecfc5e5 adds resource name validation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 261
diff changeset
98
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
99 DavResource *res = ucx_mempool_calloc(sn->mp, 1, sizeof(DavResource));
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
100 res->session = sn;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
101
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
102 // set name, path and href
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
103 res->name = sstrdup_a(sn->mp->allocator, n).ptr;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
104
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
105 char *path = util_concat_path(parent_path, name);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
106 res->path = dav_session_strdup(sn, path);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
107
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
108 res->href = href;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
109
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
110 // initialize resource data
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
111 res->data = resource_data_new(sn);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
112
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
113 // cache href/path
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
114 if(href) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
115 dav_session_cache_path(sn, sstr(path), sstr(href));
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
116 }
74
da079dc0724c fixed many memory leaks
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 70
diff changeset
117 free(path);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
118
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
119 return res;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
120 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
121
134
4bccc18820e8 implemented execution of field list expressions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 100
diff changeset
122 void resource_free_properties(DavSession *sn, UcxMap *properties) {
4bccc18820e8 implemented execution of field list expressions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 100
diff changeset
123 UcxMapIterator i = ucx_map_iterator(properties);
348
b79fb94f9e0a davqlexec handles xml properties now (not really, but it doesn't destroy everything)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
124 DavXmlNode *node;
b79fb94f9e0a davqlexec handles xml properties now (not really, but it doesn't destroy everything)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
125 UCX_MAP_FOREACH(key, node, i) {
b79fb94f9e0a davqlexec handles xml properties now (not really, but it doesn't destroy everything)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
126 // TODO: free everything
b79fb94f9e0a davqlexec handles xml properties now (not really, but it doesn't destroy everything)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
127 dav_session_free(sn, node);
134
4bccc18820e8 implemented execution of field list expressions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 100
diff changeset
128 }
4bccc18820e8 implemented execution of field list expressions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 100
diff changeset
129 ucx_map_free(properties);
4bccc18820e8 implemented execution of field list expressions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 100
diff changeset
130 }
4bccc18820e8 implemented execution of field list expressions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 100
diff changeset
131
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
132 void dav_resource_free(DavResource *res) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
133 DavSession *sn = res->session;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
134
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
135 dav_session_free(sn, res->name);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
136 dav_session_free(sn, res->path);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
137 if(res->href) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
138 dav_session_free(sn, res->href);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
139 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
140
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
141 DavResourceData *data = res->data;
134
4bccc18820e8 implemented execution of field list expressions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 100
diff changeset
142 resource_free_properties(sn, data->properties);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
143
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
144 UCX_FOREACH(elm, data->set) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
145 DavProperty *p = elm->data;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
146 dav_session_free(sn, p->ns->name);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
147 if(p->ns->prefix) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
148 dav_session_free(sn, p->ns->prefix);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
149 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
150 dav_session_free(sn, p->ns);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
151
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
152 dav_session_free(sn, p->name);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
153 dav_session_free(sn, p->value);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
154 dav_session_free(sn, p);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
155 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
156
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
157 UCX_FOREACH(elm, data->remove) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
158 DavProperty *p = elm->data;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
159 dav_session_free(sn, p->ns->name);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
160 if(p->ns->prefix) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
161 dav_session_free(sn, p->ns->prefix);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
162 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
163 dav_session_free(sn, p->ns);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
164
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
165 dav_session_free(sn, p->name);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
166 dav_session_free(sn, p);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
167 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
168
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
169 if(!data->read && data->content) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
170 dav_session_free(sn, data->content);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
171 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
172 dav_session_free(sn, data);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
173
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
174 dav_session_free(sn, res);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
175 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
176
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
177 void dav_resource_free_all(DavResource *res) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
178 DavResource *child = res->children;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
179 dav_resource_free(res);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
180 while(child) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
181 DavResource *next = child->next;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
182 dav_resource_free_all(child);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
183 child = next;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
184 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
185 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
186
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
187 void resource_set_href(DavResource *res, sstr_t href) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
188 res->href = sstrdup_a(res->session->mp->allocator, href).ptr;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
189 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
190
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
191 void resource_set_info(DavResource *res, char *href_str) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
192 char *url_str = NULL;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
193 curl_easy_getinfo(res->session->handle, CURLINFO_EFFECTIVE_URL, &url_str);
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
194 sstr_t name = sstr(util_resource_name(href_str));
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
195 sstr_t href = sstr(href_str);
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
196
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
197 sstr_t base_href = sstr(util_url_path(res->session->base_url));
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
198 sstr_t path = sstrsubs(href, base_href.length - 1);
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
199
40
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
200 UcxAllocator *a = res->session->mp->allocator;
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
201 CURL *handle = res->session->handle;
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
202
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
203 int nlen = 0;
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
204 char *uname = curl_easy_unescape(handle, name.ptr, name.length , &nlen);
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
205 int plen = 0;
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
206 char *upath = curl_easy_unescape(handle, path.ptr, path.length, &plen);
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
207
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
208 res->name = sstrdup_a(a, sstrn(uname, nlen)).ptr;
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
209 res->href = sstrdup_a(a, href).ptr;
40
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
210 res->path = sstrdup_a(a, sstrn(upath, plen)).ptr;
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
211
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
212 curl_free(uname);
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
213 curl_free(upath);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
214 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
215
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
216 DavResourceData* resource_data_new(DavSession *sn) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
217 DavResourceData *data = ucx_mempool_malloc(
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
218 sn->mp,
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
219 sizeof(DavResourceData));
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
220 if(!data) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
221 return NULL;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
222 }
40
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
223 data->properties = ucx_map_new_a(sn->mp->allocator, 32);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
224 data->set = NULL;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
225 data->remove = NULL;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
226 data->content = NULL;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
227 data->read = NULL;
478
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 477
diff changeset
228 data->seek = NULL;
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
229 data->length = 0;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
230 return data;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
231 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
232
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
233 char* dav_resource_get_href(DavResource *resource) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
234 if(!resource->href) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
235 resource->href = dav_session_get_href(
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
236 resource->session,
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
237 resource->path);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
238 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
239 return resource->href;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
240 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
241
505
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
242 void resource_add_property(DavResource *res, const char *ns, const char *name, xmlNode *val) {
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
243 if(!val) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
244 return;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
245 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
246
505
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
247 sstr_t key = dav_property_key(ns, name);
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
248 DavXmlNode *v = dav_convert_xml(res->session, val);
505
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
249 ucx_map_sstr_put(((DavResourceData*)res->data)->properties, key, v);
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
250 free(key.ptr);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
251 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
252
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
253 void resource_add_string_property(DavResource *res, char *ns, char *name, char *val) {
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
254 if(!val) {
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
255 return;
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
256 }
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
257
505
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
258 sstr_t key = dav_property_key(ns, name);
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
259 DavXmlNode *v = dav_text_node(res->session, val);
505
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
260 ucx_map_sstr_put(((DavResourceData*)res->data)->properties, key, v);
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
261 free(key.ptr);
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
262 }
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
263
505
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
264 DavXmlNode* resource_get_property(DavResource *res, const char *ns, const char *name) {
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
265 sstr_t keystr = dav_property_key(ns, name);
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
266 UcxKey key = ucx_key(keystr.ptr, keystr.length);
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
267 DavXmlNode *property = resource_get_property_k(res, key);
505
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
268 free(keystr.ptr);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
269 return property;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
270 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
271
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
272 DavXmlNode* resource_get_property_k(DavResource *res, UcxKey key) {
139
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
273 DavResourceData *data = (DavResourceData*)res->data;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
274 return ucx_map_get(data->properties, key);
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
275 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
276
505
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
277 sstr_t dav_property_key(const char *ns, const char *name) {
139
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
278 return dav_property_key_a(ucx_default_allocator(), ns, name);
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
279 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
280
505
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
281 sstr_t dav_property_key_a(UcxAllocator *a, const char *ns, const char *name) {
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
282 scstr_t ns_str = scstr(ns);
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
283 scstr_t name_str = scstr(name);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
284
505
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
285 return sstrcat_a(a, 4, ns_str, S("\0"), name_str, S("\0"));
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
286 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
287
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
288
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
289
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
290
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
291 void resource_add_child(DavResource *parent, DavResource *child) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
292 child->next = NULL;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
293 if(parent->children) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
294 DavResource *last = parent->children;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
295 while(last->next) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
296 last = last->next;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
297 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
298 last->next = child;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
299 child->prev = last;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
300 } else {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
301 child->prev = NULL;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
302 parent->children = child;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
303 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
304 child->parent = parent;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
305 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
306
139
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
307 static int resource_cmp(DavResource *res1, DavResource *res2, DavOrderCriterion *cr) {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
308 if(!(res1 && res2)) {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
309 return 0;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
310 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
311
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
312 int ret;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
313 if(cr->type == 0) {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
314 switch(cr->column.resprop) {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
315 case DAVQL_RES_NAME: {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
316 ret = strcmp(res1->name, res2->name);
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
317 break;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
318 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
319 case DAVQL_RES_PATH: {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
320 ret = strcmp(res1->path, res2->path);
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
321 break;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
322 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
323 case DAVQL_RES_HREF: {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
324 ret = strcmp(res1->href, res2->href);
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
325 break;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
326 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
327 case DAVQL_RES_CONTENTLENGTH: {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
328 int c = res1->contentlength == res2->contentlength;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
329 ret = c ? 0 : (res1->contentlength < res2->contentlength?-1:1);
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
330 break;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
331 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
332 case DAVQL_RES_CONTENTTYPE: {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
333 ret = strcmp(res1->contenttype, res2->contenttype);
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
334 break;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
335 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
336 case DAVQL_RES_CREATIONDATE: {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
337 int c = res1->creationdate == res2->creationdate;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
338 ret = c ? 0 : (res1->creationdate < res2->creationdate?-1:1);
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
339 break;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
340 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
341 case DAVQL_RES_LASTMODIFIED: {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
342 int c = res1->lastmodified == res2->lastmodified;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
343 ret = c ? 0 : (res1->lastmodified < res2->lastmodified?-1:1);
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
344 break;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
345 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
346 case DAVQL_RES_ISCOLLECTION: {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
347 int c = res1->iscollection == res2->iscollection;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
348 ret = c ? 0 : (res1->iscollection < res2->iscollection?-1:1);
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
349 break;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
350 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
351 default: ret = 0;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
352 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
353 } else if(cr->type == 1) {
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
354 DavXmlNode *xvalue1 = resource_get_property_k(res1, cr->column.property);
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
355 DavXmlNode *xvalue2 = resource_get_property_k(res2, cr->column.property);
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
356 char *value1 = dav_xml_getstring(xvalue1);
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
357 char *value2 = dav_xml_getstring(xvalue2);
139
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
358 if(!value1) {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
359 ret = value2 ? -1 : 0;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
360 } else if(!value2) {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
361 ret = value1 ? 1 : 0;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
362 } else {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
363 ret = strcmp(value1, value2);
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
364 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
365 } else {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
366 return 0;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
367 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
368
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
369 return cr->descending ? -ret : ret;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
370 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
371
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
372 void resource_add_ordered_child(DavResource *parent, DavResource *child, UcxList *ordercr) {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
373 if(!ordercr) {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
374 resource_add_child(parent, child);
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
375 return;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
376 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
377
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
378 child->parent = parent;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
379
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
380 if(!parent->children) {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
381 child->next = NULL;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
382 child->prev = NULL;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
383 parent->children = child;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
384 } else {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
385 DavResource *resource = parent->children;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
386 while(resource) {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
387 int r = 0;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
388 UCX_FOREACH(elm, ordercr) {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
389 DavOrderCriterion *cr = elm->data;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
390 r = resource_cmp(child, resource, cr);
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
391 if(r != 0) {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
392 break;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
393 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
394 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
395
140
0a06bed068a1 fixed order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 139
diff changeset
396 if(r < 0) {
139
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
397 // insert child before resource
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
398 child->prev = resource->prev;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
399 child->next = resource;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
400 if(resource->prev) {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
401 resource->prev->next = child;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
402 } else {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
403 parent->children = child;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
404 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
405 resource->prev = child;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
406 break;
140
0a06bed068a1 fixed order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 139
diff changeset
407 } if(!resource->next) {
0a06bed068a1 fixed order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 139
diff changeset
408 // append child
0a06bed068a1 fixed order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 139
diff changeset
409 child->prev = resource;
0a06bed068a1 fixed order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 139
diff changeset
410 child->next = NULL;
0a06bed068a1 fixed order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 139
diff changeset
411 resource->next = child;
0a06bed068a1 fixed order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 139
diff changeset
412 break;
139
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
413 } else {
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
414 resource = resource->next;
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
415 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
416 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
417 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
418 }
c6424aebcf5e implemented davql order by
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
419
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
420 char* dav_get_string_property(DavResource *res, char *name) {
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
421 char *pns;
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
422 char *pname;
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
423 dav_get_property_namespace_str(res->session->context, name, &pns, &pname);
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
424 if(!pns || !pname) {
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
425 return NULL;
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
426 }
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
427 return dav_get_string_property_ns(res, pns, pname);
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
428 }
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
429
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
430 char* dav_get_string_property_ns(DavResource *res, char *ns, char *name) {
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
431 DavXmlNode *prop = dav_get_property_ns(res, ns, name);
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
432 if(!prop) {
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
433 return NULL;
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
434 }
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
435 return dav_xml_getstring(prop);
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
436 }
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
437
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
438 DavXmlNode* dav_get_property(DavResource *res, char *name) {
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
439 char *pns;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
440 char *pname;
134
4bccc18820e8 implemented execution of field list expressions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 100
diff changeset
441 dav_get_property_namespace_str(res->session->context, name, &pns, &pname);
269
c89633916e36 fixes crash when using invalid namespace prefix
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 268
diff changeset
442 if(!pns || !pname) {
c89633916e36 fixes crash when using invalid namespace prefix
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 268
diff changeset
443 return NULL;
c89633916e36 fixes crash when using invalid namespace prefix
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 268
diff changeset
444 }
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
445 return dav_get_property_ns(res, pns, pname);
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
446 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
447
505
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
448 DavXmlNode* dav_get_property_ns(DavResource *res, const char *ns, const char *name) {
269
c89633916e36 fixes crash when using invalid namespace prefix
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 268
diff changeset
449 if(!ns || !name) {
c89633916e36 fixes crash when using invalid namespace prefix
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 268
diff changeset
450 return NULL;
c89633916e36 fixes crash when using invalid namespace prefix
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 268
diff changeset
451 }
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
452 DavXmlNode *property = resource_get_property(res, ns, name);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
453 DavResourceData *data = res->data;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
454 // resource_get_property only returns persistent properties
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
455 // check the remove and set list
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
456 if(property) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
457 // if the property is in the remove list, we return NULL
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
458 UCX_FOREACH(elm, data->remove) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
459 DavProperty *p = elm->data;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
460 if(!strcmp(p->name, name) && !strcmp(p->ns->name, ns)) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
461 return NULL;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
462 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
463 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
464 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
465 // the set list contains property updates
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
466 // we return an updated property if possible
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
467 UCX_FOREACH(elm, data->set) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
468 DavProperty *p = elm->data;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
469 if(!strcmp(p->name, name) && !strcmp(p->ns->name, ns)) {
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
470 return p->value; // TODO: fix
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
471 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
472 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
473 // no property update
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
474 return property;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
475 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
476
605
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
477 static DavProperty* createprop(DavSession *sn, const char *ns, const char *name) {
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
478 DavProperty *property = dav_session_malloc(sn, sizeof(DavProperty));
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
479 property->name = dav_session_strdup(sn, name);
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
480 property->value = NULL;
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
481
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
482 DavNamespace *namespace = dav_session_malloc(sn, sizeof(DavNamespace));
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
483 namespace->prefix = NULL;
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
484 namespace->name = dav_session_strdup(sn, ns);
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
485
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
486 property->ns = namespace;
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
487
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
488 return property;
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
489 }
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
490
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
491 void dav_set_string_property(DavResource *res, char *name, char *value) {
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
492 char *pns;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
493 char *pname;
134
4bccc18820e8 implemented execution of field list expressions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 100
diff changeset
494 dav_get_property_namespace_str(res->session->context, name, &pns, &pname);
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
495 dav_set_string_property_ns(res, pns, pname, value);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
496 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
497
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
498 void dav_set_string_property_ns(DavResource *res, char *ns, char *name, char *value) {
40
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
499 UcxAllocator *a = res->session->mp->allocator;
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
500 DavResourceData *data = res->data;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
501
605
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
502 DavProperty *property = createprop(res->session, ns, name);
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
503 property->value = dav_text_node(res->session, value);
40
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
504
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
505 data->set = ucx_list_append_a(a, data->set, property);
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
506 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
507
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
508 void dav_set_property(DavResource *res, char *name, DavXmlNode *value) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
509 char *pns;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
510 char *pname;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
511 dav_get_property_namespace_str(res->session->context, name, &pns, &pname);
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
512 dav_set_property_ns(res, pns, pname, value);
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
513 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
514
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
515 void dav_set_property_ns(DavResource *res, char *ns, char *name, DavXmlNode *value) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
516 UcxAllocator *a = res->session->mp->allocator;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
517 DavResourceData *data = res->data;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
518
605
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
519 DavProperty *property = createprop(res->session, ns, name);
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
520 property->value = value; // TODO: copy node?
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
521
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
522 data->set = ucx_list_append_a(a, data->set, property);
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
523 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 355
diff changeset
524
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
525 void dav_remove_property(DavResource *res, char *name) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
526 char *pns;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
527 char *pname;
134
4bccc18820e8 implemented execution of field list expressions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 100
diff changeset
528 dav_get_property_namespace_str(res->session->context, name, &pns, &pname);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
529 dav_remove_property_ns(res, pns, pname);
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
530 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
531
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
532 void dav_remove_property_ns(DavResource *res, char *ns, char *name) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
533 DavResourceData *data = res->data;
40
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
534 UcxAllocator *a = res->session->mp->allocator;
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
535
605
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
536 DavProperty *property = createprop(res->session, ns, name);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
537
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
538 data->remove = ucx_list_append_a(a, data->remove, property);
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
539 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
540
605
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
541 void dav_set_encrypted_property_ns(DavResource *res, char *ns, char *name, DavXmlNode *value) {
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
542 UcxAllocator *a = res->session->mp->allocator;
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
543 DavResourceData *data = res->data;
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
544
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
545 DavProperty *property = createprop(res->session, ns, name);
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
546 property->value = value; // TODO: copy node?
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
547
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
548 data->crypto_set = ucx_list_append_a(a, data->crypto_set, property);
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
549 }
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
550
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
551 void dav_set_encrypted_string_property_ns(DavResource *res, char *ns, char *name, char *value) {
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
552 UcxAllocator *a = res->session->mp->allocator;
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
553 DavResourceData *data = res->data;
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
554
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
555 DavProperty *property = createprop(res->session, ns, name);
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
556 property->value = dav_text_node(res->session, value);
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
557
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
558 data->crypto_set = ucx_list_append_a(a, data->crypto_set, property);
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
559 }
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
560
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
561 void dav_remove_encrypted_property_ns(DavResource *res, char *ns, char *name) {
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
562 DavResourceData *data = res->data;
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
563 UcxAllocator *a = res->session->mp->allocator;
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
564
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
565 DavProperty *property = createprop(res->session, ns, name);
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
566
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
567 data->crypto_remove = ucx_list_append_a(a, data->crypto_remove, property);
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
568 }
bbc66c72661a add new api for encrypted properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 589
diff changeset
569
84
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
570 static int compare_propname(const void *a, const void *b) {
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
571 const DavPropName *p1 = a;
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
572 const DavPropName *p2 = b;
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
573
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
574 int result = strcmp(p1->ns, p2->ns);
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
575 if(result) {
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
576 return result;
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
577 } else {
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
578 return strcmp(p1->name, p2->name);
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
579 }
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
580 }
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
581
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
582 DavPropName* dav_get_property_names(DavResource *res, size_t *count) {
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
583 DavResourceData *data = res->data;
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
584
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
585 *count = data->properties->count;
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
586 DavPropName *names = dav_session_calloc(
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
587 res->session,
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
588 *count,
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
589 sizeof(DavPropName));
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
590
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
591
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
592 UcxMapIterator i = ucx_map_iterator(data->properties);
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
593 void *value;
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
594 int j = 0;
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
595 UCX_MAP_FOREACH(key, value, i) {
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
596 DavPropName *name = &names[j];
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
597 // the map key is namespace + '\0' + name
505
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
598 name->ns = (char*)key.data;
84
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
599 for(int k=0;j<key.len;k++) {
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
600 if(((char*)key.data)[k] == '\0') {
146
e48048334602 hidden password input
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
601 name->name = (char*)key.data + k + 1;
84
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
602 break;
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
603 }
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
604 }
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
605 j++;
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
606 }
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
607
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
608 qsort(names, *count, sizeof(DavPropName), compare_propname);
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
609
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
610 return names;
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
611 }
7fca3788261d added info command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 75
diff changeset
612
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
613
478
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 477
diff changeset
614 void dav_set_content(DavResource *res, void *stream, dav_read_func read_func, dav_seek_func seek_func) {
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
615 DavResourceData *data = res->data;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
616 data->content = stream;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
617 data->read = read_func;
478
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 477
diff changeset
618 data->seek = seek_func;
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
619 data->length = 0;
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
620 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
621
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
622 void dav_set_content_data(DavResource *res, char *content, size_t length) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
623 DavSession *sn = res->session;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
624 DavResourceData *data = res->data;
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
625 data->content = dav_session_malloc(sn, length);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
626 memcpy(data->content, content, length);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
627 data->read = NULL;
478
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 477
diff changeset
628 data->seek = NULL;
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
629 data->length = length;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
630 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
631
178
e137883e620f using content-length header in dav put
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 155
diff changeset
632 void dav_set_content_length(DavResource *res, size_t length) {
e137883e620f using content-length header in dav put
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 155
diff changeset
633 DavResourceData *data = res->data;
e137883e620f using content-length header in dav put
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 155
diff changeset
634 data->length = length;
e137883e620f using content-length header in dav put
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 155
diff changeset
635 }
e137883e620f using content-length header in dav put
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 155
diff changeset
636
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
637
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
638 int dav_load(DavResource *res) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
639 UcxBuffer *rqbuf = create_allprop_propfind_request();
135
664aeaec8d25 replaced old davql (still buggy)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 134
diff changeset
640 int ret = dav_propfind(res->session, res, rqbuf);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
641 ucx_buffer_free(rqbuf);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
642 return ret;
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
643 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
644
298
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
645 int dav_load_prop(DavResource *res, DavPropName *properties, size_t numprop) {
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
646 UcxMempool *mp = ucx_mempool_new(64);
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
647
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
648 UcxList *proplist = NULL;
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
649 for(size_t i=0;i<numprop;i++) {
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
650 DavProperty *p = ucx_mempool_malloc(mp, sizeof(DavProperty));
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
651 p->name = properties[i].name;
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
652 p->ns = ucx_mempool_malloc(mp, sizeof(DavNamespace));
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
653 p->ns->name = properties[i].ns;
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
654 if(!strcmp(properties[i].ns, "DAV:")) {
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
655 p->ns->prefix = "D";
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
656 } else {
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
657 p->ns->prefix = ucx_asprintf(mp->allocator, "x%d", i).ptr;
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
658 }
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
659 p->value = NULL;
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
660 proplist = ucx_list_append_a(mp->allocator, proplist, p);
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
661 }
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
662
475
52e4171d42ce adds minimal deltav implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 441
diff changeset
663 UcxBuffer *rqbuf = create_propfind_request(res->session, proplist, "propfind", 0);
298
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
664 int ret = dav_propfind(res->session, res, rqbuf);
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
665 ucx_buffer_free(rqbuf);
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
666 ucx_mempool_destroy(mp);
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
667 return ret;
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
668 }
755b8198b071 dav get-property shouldn't send an allprop propfind request
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 280
diff changeset
669
555
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
670
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
671 /*
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
672 * read wrapper with integrated hashing
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
673 */
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
674
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
675 typedef struct {
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
676 DAV_SHA_CTX *sha;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
677 void *stream;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
678 dav_read_func read;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
679 dav_seek_func seek;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
680 int error;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
681 } HashStream;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
682
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
683 static void init_hash_stream(HashStream *hstr, void *stream, dav_read_func readfn, dav_seek_func seekfn) {
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
684 hstr->sha = NULL;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
685 hstr->stream = stream;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
686 hstr->read = readfn;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
687 hstr->seek = seekfn;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
688 hstr->error = 0;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
689 }
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
690
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
691 static size_t dav_read_h(void *buf, size_t size, size_t nelm, void *stream) {
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
692 HashStream *s = stream;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
693 if(!s->sha) {
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
694 s->sha = dav_hash_init();
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
695 }
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
696
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
697 size_t r = s->read(buf, size, nelm, s->stream);
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
698 dav_hash_update(s->sha, buf, r);
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
699 return r;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
700 }
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
701
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
702 static int dav_seek_h(void *stream, long offset, int whence) {
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
703 HashStream *s = stream;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
704 if(offset == 0 && whence == SEEK_SET) {
558
1a9e6a5c1e79 fixes several signedness issues
Mike Becker <universe@uap-core.de>
parents: 555
diff changeset
705 unsigned char buf[DAV_SHA256_DIGEST_LENGTH];
555
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
706 dav_hash_final(s->sha, buf);
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
707 s->sha = NULL;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
708 } else {
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
709 s->error = 1;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
710 }
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
711 return s->seek(s->stream, offset, whence);
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
712 }
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
713
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
714
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
715 int dav_store(DavResource *res) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
716 DavSession *sn = res->session;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
717 DavResourceData *data = res->data;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
718
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
719 util_set_url(sn, dav_resource_get_href(res));
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
720
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
721 DavLock *lock = dav_get_lock(sn, res->path);
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
722 char *locktoken = lock ? lock->token : NULL;
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
723
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
724 // store content
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
725 if(data->content) {
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
726 int encryption = DAV_ENCRYPT_CONTENT(sn) && sn->key;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
727 CURLcode ret;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
728 if(encryption) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
729 AESEncrypter *enc = NULL;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
730 UcxBuffer *buf = NULL;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
731 if(data->read) {
478
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 477
diff changeset
732 enc = aes_encrypter_new(
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 477
diff changeset
733 sn->key,
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 477
diff changeset
734 data->content,
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 477
diff changeset
735 data->read,
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 477
diff changeset
736 data->seek);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
737 } else {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
738 buf = ucx_buffer_new(data->content, data->length, 0);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
739 buf->size = data->length;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
740 enc = aes_encrypter_new(
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
741 sn->key,
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
742 buf,
478
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 477
diff changeset
743 (dav_read_func)ucx_buffer_read,
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 477
diff changeset
744 (dav_seek_func)dav_buffer_seek);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
745 }
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
746
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
747 // put resource
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
748 ret = do_put_request(
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 349
diff changeset
749 sn,
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
750 locktoken,
227
bf485439222a fixed locking in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 225
diff changeset
751 TRUE,
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
752 enc,
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
753 (dav_read_func)aes_read,
478
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 477
diff changeset
754 (dav_seek_func)aes_encrypter_reset,
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
755 0);
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
756
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
757 // get sha256 hash
555
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
758 dav_get_hash(&enc->sha256, (unsigned char*)data->hash);
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
759 char *enc_hash = aes_encrypt(data->hash, DAV_SHA256_DIGEST_LENGTH, sn->key);
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
760
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
761 aes_encrypter_close(enc);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
762 if(buf) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
763 ucx_buffer_free(buf);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
764 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
765
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
766 // add crypto properties
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
767 // TODO: store the properties later
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
768 if(resource_add_crypto_info(sn, res->href, res->name, enc_hash)) {
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
769 free(enc_hash);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
770 return 1;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
771 }
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
772 resource_add_string_property(res, DAV_NS, "crypto-hash", enc_hash);
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
773 free(enc_hash);
555
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
774 } else if((sn->flags & DAV_SESSION_STORE_HASH) == DAV_SESSION_STORE_HASH) {
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
775 HashStream hstr;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
776 UcxBuffer *iobuf = NULL;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
777 if(!data->read) {
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
778 iobuf = ucx_buffer_new(data->content, data->length, 0);
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
779 iobuf->size = data->length;
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
780 init_hash_stream(
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
781 &hstr,
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
782 iobuf,
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
783 (dav_read_func)ucx_buffer_read,
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
784 (dav_seek_func)ucx_buffer_seek);
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
785 } else {
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
786 init_hash_stream(
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
787 &hstr,
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
788 data->content,
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
789 data->read,
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
790 data->seek);
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
791 }
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
792
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
793 ret = do_put_request(
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
794 sn,
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
795 locktoken,
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
796 TRUE,
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
797 &hstr,
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
798 dav_read_h,
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
799 (dav_seek_func)dav_seek_h,
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
800 data->length);
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
801
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
802 if(hstr.sha) {
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
803 dav_hash_final(hstr.sha, (unsigned char*)data->hash);
558
1a9e6a5c1e79 fixes several signedness issues
Mike Becker <universe@uap-core.de>
parents: 555
diff changeset
804 char *hash = util_hexstr((unsigned char*)data->hash, 32);
555
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
805 dav_set_string_property_ns(res, DAV_NS, "content-hash", hash);
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
806 free(hash);
c9ada14ee90e add session flag for content hash creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
807 }
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
808 } else {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
809 ret = do_put_request(
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 349
diff changeset
810 sn,
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
811 locktoken,
227
bf485439222a fixed locking in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 225
diff changeset
812 TRUE,
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
813 data->content,
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
814 data->read,
478
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 477
diff changeset
815 data->seek,
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
816 data->length);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
817 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
818
205
bf756f6c3581 fixed some warnings and wrong usage of curl_easy_getinfo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 186
diff changeset
819 long status = 0;
40
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
820 curl_easy_getinfo(sn->handle, CURLINFO_RESPONSE_CODE, &status);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
821 if(ret == CURLE_OK && (status >= 200 && status < 300)) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
822 res->session->error = 0;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
823 // cleanup node data
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
824 if(!data->read) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
825 ucx_mempool_free(sn->mp, data->content);
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
826 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
827 data->content = NULL;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
828 data->read = NULL;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
829 data->length = 0;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
830 } else {
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
831 dav_session_set_error(sn, ret, status);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
832 return 1;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
833 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
834 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
835
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
836 // store properties
223
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
837 int r = 0;
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
838 sn->error = DAV_OK;
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
839 if(data->set || data->remove) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
840 UcxBuffer *request = create_proppatch_request(data);
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
841 UcxBuffer *response = ucx_buffer_new(NULL, 1024, UCX_BUFFER_AUTOEXTEND);
181
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
842 //printf("request:\n%.*s\n\n", request->pos, request->space);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
843
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 349
diff changeset
844 CURLcode ret = do_proppatch_request(sn, locktoken, request, response);
205
bf756f6c3581 fixed some warnings and wrong usage of curl_easy_getinfo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 186
diff changeset
845 long status = 0;
40
a95ee94b9204 supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 33
diff changeset
846 curl_easy_getinfo (sn->handle, CURLINFO_RESPONSE_CODE, &status);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
847 if(ret == CURLE_OK && status == 207) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
848 //printf("%s\n", response->space);
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
849 // TODO: parse response
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
850 // TODO: cleanup node data correctly
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
851 data->set = NULL;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
852 data->remove = NULL;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
853 } else {
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
854 dav_session_set_error(sn, ret, status);
223
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
855 r = -1;
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
856 }
223
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
857
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
858 ucx_buffer_free(request);
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
859 ucx_buffer_free(response);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
860 }
223
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
861
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
862 return r;
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
863 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
864
477
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
865 #if LIBCURL_VERSION_MAJOR >= 7 && LIBCURL_VERSION_MINOR >= 32
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
866 static void set_progressfunc(DavResource *res) {
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
867 CURL *handle = res->session->handle;
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
868 curl_easy_setopt(handle, CURLOPT_XFERINFOFUNCTION, dav_session_get_progress);
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
869 curl_easy_setopt(handle, CURLOPT_XFERINFODATA, res);
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
870 curl_easy_setopt(handle, CURLOPT_NOPROGRESS, 0L);
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
871 }
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
872
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
873 static void unset_progressfunc(DavResource *res) {
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
874 CURL *handle = res->session->handle;
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
875 curl_easy_setopt(handle, CURLOPT_XFERINFOFUNCTION, NULL);
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
876 curl_easy_setopt(handle, CURLOPT_XFERINFODATA, NULL);
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
877 curl_easy_setopt(handle, CURLOPT_NOPROGRESS, 1L);
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
878 }
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
879 #else
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
880 static void set_progressfunc(DavResource *res) {
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
881
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
882 }
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
883 static void unset_progressfunc(DavResource *res) {
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
884
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
885 }
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
886 #endif
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
887
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
888 int dav_get_content(DavResource *res, void *stream, dav_write_func write_fnc) {
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
889 DavSession *sn = res->session;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
890 CURL *handle = sn->handle;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
891 util_set_url(res->session, dav_resource_get_href(res));
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
892
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 143
diff changeset
893 // check encryption
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
894 AESDecrypter *dec = NULL;
151
a316613205dc fixed some memory leaks, content verification and dav info
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 150
diff changeset
895 DavKey *key = NULL;
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
896 if(DAV_DECRYPT_CONTENT(sn)) {
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
897 char *keyname = dav_get_string_property_ns(res, DAV_NS, "crypto-key");
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
898 if(keyname) {
151
a316613205dc fixed some memory leaks, content verification and dav info
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 150
diff changeset
899 key = dav_context_get_key(sn->context, keyname);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
900 if(key) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
901 dec = aes_decrypter_new(key, stream, write_fnc);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
902 stream = dec;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
903 write_fnc = (dav_write_func)aes_write;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
904 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
905 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
906 }
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
907
74
da079dc0724c fixed many memory leaks
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 70
diff changeset
908 curl_easy_setopt(handle, CURLOPT_HTTPHEADER, NULL);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
909 curl_easy_setopt(handle, CURLOPT_CUSTOMREQUEST, NULL);
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
910 curl_easy_setopt(handle, CURLOPT_PUT, 0L);
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
911 curl_easy_setopt(handle, CURLOPT_UPLOAD, 0L);
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
912
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
913 curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, write_fnc);
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
914 curl_easy_setopt(handle, CURLOPT_WRITEDATA, stream);
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
915
355
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
916 if(sn->get_progress) {
477
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
917 set_progressfunc(res);
355
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
918 }
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
919
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 349
diff changeset
920 long status = 0;
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 349
diff changeset
921 CURLcode ret = dav_session_curl_perform(sn, &status);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
922
355
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
923 if(sn->get_progress) {
477
9a406db6729b makes libidav compatible with libcurl < 7.32
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 475
diff changeset
924 unset_progressfunc(res);
355
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
925 }
5da2cf15eb44 adds primitive progress indicator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 354
diff changeset
926
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
927 char *hash = NULL;
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
928 if(dec) {
207
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
929 aes_decrypter_shutdown(dec); // get final bytes
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
930
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
931 // get hash
349
0b4ecadaf3f9 ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 348
diff changeset
932 unsigned char sha[DAV_SHA256_DIGEST_LENGTH];
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
933 dav_get_hash(&dec->sha256, sha);
349
0b4ecadaf3f9 ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 348
diff changeset
934 hash = util_hexstr(sha, DAV_SHA256_DIGEST_LENGTH);
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
935
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
936 aes_decrypter_close(dec);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
937 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
938
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
939 if(ret == CURLE_OK && (status >= 200 && status < 300)) {
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
940 int verify_failed = 0;
151
a316613205dc fixed some memory leaks, content verification and dav info
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 150
diff changeset
941 if(DAV_DECRYPT_CONTENT(sn) && key) {
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
942 // try to verify the content
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 315
diff changeset
943 char *res_hash = dav_get_string_property_ns(res, DAV_NS, "crypto-hash");
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
944
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
945 if(res_hash) {
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
946 size_t len = 0;
151
a316613205dc fixed some memory leaks, content verification and dav info
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 150
diff changeset
947 char *dec_hash = aes_decrypt(res_hash, &len, key);
542
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
948 char *hex_hash = util_hexstr((unsigned char*)dec_hash, len);
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
949 if(strcmp(hash, hex_hash)) {
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
950 verify_failed = 1;
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
951 }
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
952 free(dec_hash);
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
953 free(hex_hash);
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
954 }
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
955 }
151
a316613205dc fixed some memory leaks, content verification and dav info
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 150
diff changeset
956 if(hash) {
a316613205dc fixed some memory leaks, content verification and dav info
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 150
diff changeset
957 free(hash);
a316613205dc fixed some memory leaks, content verification and dav info
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 150
diff changeset
958 }
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
959
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
960 if(verify_failed) {
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
961 res->session->error = DAV_CONTENT_VERIFICATION_ERROR;
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
962 return 1;
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
963 }
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
964
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
965 res->session->error = DAV_OK;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
966 return 0;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
967 } else {
151
a316613205dc fixed some memory leaks, content verification and dav info
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 150
diff changeset
968 if(hash) {
a316613205dc fixed some memory leaks, content verification and dav info
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 150
diff changeset
969 free(hash);
a316613205dc fixed some memory leaks, content verification and dav info
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 150
diff changeset
970 }
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
971 dav_session_set_error(res->session, ret, status);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
972 return 1;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
973 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
974 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
975
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
976 DavResource* dav_create_child(DavResource *parent, char *name) {
42
6518b035a9df added some api functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
977 DavResource *res = dav_resource_new_child(parent->session, parent, name);
6518b035a9df added some api functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
978 if(dav_create(res)) {
225
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
979 dav_resource_free(res);
42
6518b035a9df added some api functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
980 return NULL;
6518b035a9df added some api functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
981 } else {
6518b035a9df added some api functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
982 return res;
6518b035a9df added some api functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
983 }
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
984 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
985
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
986 int dav_delete(DavResource *res) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
987 CURL *handle = res->session->handle;
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
988 util_set_url(res->session, dav_resource_get_href(res));
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
989
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
990 DavLock *lock = dav_get_lock(res->session, res->path);
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
991 char *locktoken = lock ? lock->token : NULL;
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
992
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
993 UcxBuffer *response = ucx_buffer_new(NULL, 4096, UCX_BUFFER_AUTOEXTEND);
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 349
diff changeset
994 CURLcode ret = do_delete_request(res->session, locktoken, response);
205
bf756f6c3581 fixed some warnings and wrong usage of curl_easy_getinfo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 186
diff changeset
995 long status = 0;
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
996 curl_easy_getinfo (handle, CURLINFO_RESPONSE_CODE, &status);
223
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
997 int r = 0;
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
998 if(ret == CURLE_OK && (status >= 200 && status < 300)) {
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
999 res->session->error = DAV_OK;
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 518
diff changeset
1000 res->exists = 0;
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1001
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1002 // TODO: parse response
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1003 // TODO: free res
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1004 } else {
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1005 dav_session_set_error(res->session, ret, status);
223
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
1006 r = 1;
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1007 }
223
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
1008
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
1009 ucx_buffer_free(response);
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
1010 return r;
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1011 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1012
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1013 static int create_ancestors(DavSession *sn, char *href, char *path) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1014 CURL *handle = sn->handle;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1015 CURLcode code;
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1016
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1017 DavLock *lock = dav_get_lock(sn, path);
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1018 char *locktoken = lock ? lock->token : NULL;
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1019
205
bf756f6c3581 fixed some warnings and wrong usage of curl_easy_getinfo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 186
diff changeset
1020 long status = 0;
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1021 int ret = 0;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1022
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1023 if(strlen(path) <= 1) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1024 return 0;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1025 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1026
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1027 char *p = util_parent_path(path);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1028 char *h = util_parent_path(href);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1029
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1030 for(int i=0;i<2;i++) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1031 util_set_url(sn, h);
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 349
diff changeset
1032 code = do_mkcol_request(sn, locktoken);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1033 curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &status);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1034 if(status == 201) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1035 // resource successfully created
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1036 char *name = util_resource_name(p);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1037 int len = strlen(name);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1038 if(name[len - 1] == '/') {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1039 name[len - 1] = '\0';
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1040 }
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
1041 if(resource_add_crypto_info(sn, h, name, NULL)) {
225
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
1042 sn->error = DAV_ERROR;
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
1043 dav_session_set_errstr(sn, "Cannot set crypto properties for ancestor");
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1044 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1045 break;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1046 } else if(status == 405) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1047 // parent already exists
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1048 break;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1049 } else if(status == 409) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1050 // parent doesn't exist
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1051 if(create_ancestors(sn, h, p)) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1052 ret = 1;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1053 break;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1054 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1055 } else {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1056 dav_session_set_error(sn, code, status);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1057 ret = 1;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1058 break;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1059 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1060 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1061
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1062 free(p);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1063 free(h);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1064 return ret;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1065 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1066
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1067 static int create_resource(DavResource *res, int *status) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1068 DavSession *sn = res->session;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1069 CURL *handle = sn->handle;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1070 util_set_url(sn, dav_resource_get_href(res));
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1071
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1072 DavLock *lock = dav_get_lock(res->session, res->path);
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1073 char *locktoken = lock ? lock->token : NULL;
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1074
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1075 CURLcode code;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1076 if(res->iscollection) {
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 349
diff changeset
1077 code = do_mkcol_request(sn, locktoken);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1078 } else {
478
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 477
diff changeset
1079 code = do_put_request(sn, locktoken, TRUE, "", NULL, NULL, 0);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1080 }
205
bf756f6c3581 fixed some warnings and wrong usage of curl_easy_getinfo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 186
diff changeset
1081 long s = 0;
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1082 curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &s);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1083 *status = s;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1084 if(code == CURLE_OK && (s >= 200 && s < 300)) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1085 sn->error = DAV_OK;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1086 // if the session has encrypted file names, add crypto infos
225
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
1087 if(!resource_add_crypto_info(sn, res->href, res->name, NULL)) {
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
1088 // do a minimal propfind request
475
52e4171d42ce adds minimal deltav implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 441
diff changeset
1089 UcxBuffer *rqbuf = create_propfind_request(sn, NULL, "propfind", 0);
225
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
1090 int ret = dav_propfind(sn, res, rqbuf);
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
1091 ucx_buffer_free(rqbuf);
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
1092 return ret;
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
1093 } else {
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
1094 return 1;
a297c2e28fa1 improved error handling in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
1095 }
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1096 } else {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1097 dav_session_set_error(sn, code, s);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1098 return 1;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1099 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1100 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1101
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1102 int dav_create(DavResource *res) {
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1103 int status;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1104 if(!create_resource(res, &status)) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1105 // resource successfully created
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 518
diff changeset
1106 res->exists = 1;
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1107 return 0;
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1108 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1109
441
99c26b1b7327 improves compatibility with owncloud/nextcloud when uploading files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
1110 if(status == 403 || status == 409 || status == 404) {
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1111 // create intermediate collections
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1112 if(create_ancestors(res->session, res->href, res->path)) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1113 return 1;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1114 }
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1115 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1116
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1117 return create_resource(res, &status);
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1118 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1119
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1120 int dav_exists(DavResource *res) {
493
75a259ec8dea fixes control flow in cmd_push()
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 478
diff changeset
1121 // TODO: reimplement with PROPFIND
75a259ec8dea fixes control flow in cmd_push()
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 478
diff changeset
1122
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1123 DavSession *sn = res->session;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1124 CURL *handle = sn->handle;
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1125 util_set_url(sn, dav_resource_get_href(res));
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1126
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 349
diff changeset
1127 CURLcode ret = do_head_request(sn);
205
bf756f6c3581 fixed some warnings and wrong usage of curl_easy_getinfo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 186
diff changeset
1128 long status = 0;
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1129 curl_easy_getinfo (handle, CURLINFO_RESPONSE_CODE, &status);
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1130 if(ret == CURLE_OK && (status >= 200 && status < 300)) {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 518
diff changeset
1131 res->exists = 1;
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1132 return 1;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1133 } else {
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1134 dav_session_set_error(sn, ret, status);
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 518
diff changeset
1135 if(status == 404) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 518
diff changeset
1136 res->exists = 0;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 518
diff changeset
1137 }
33
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1138 return 0;
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1139 }
0bbbb0341606 some code cleanup and bug fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1140 }
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1141
186
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1142 static int dav_cp_mv_url(DavResource *res, char *desturl, _Bool copy, _Bool override) {
181
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1143 DavSession *sn = res->session;
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1144 CURL *handle = sn->handle;
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1145 util_set_url(sn, dav_resource_get_href(res));
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1146
236
6b4ce32d0c4e copy/move with lock tokens works now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 227
diff changeset
1147 DavLock *lock = dav_get_lock(sn, res->path);
6b4ce32d0c4e copy/move with lock tokens works now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 227
diff changeset
1148 char *locktoken = lock ? lock->token : NULL;
6b4ce32d0c4e copy/move with lock tokens works now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 227
diff changeset
1149
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 349
diff changeset
1150 CURLcode ret = do_copy_move_request(sn, desturl, locktoken, copy, override);
181
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1151
205
bf756f6c3581 fixed some warnings and wrong usage of curl_easy_getinfo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 186
diff changeset
1152 long status = 0;
181
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1153 curl_easy_getinfo (handle, CURLINFO_RESPONSE_CODE, &status);
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1154 if(ret == CURLE_OK && (status >= 200 && status < 300)) {
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1155 return 0;
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1156 } else {
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1157 dav_session_set_error(sn, ret, status);
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1158 return 1;
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1159 }
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1160 }
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1161
186
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1162 static int dav_cp_mv(DavResource *res, char *newpath, _Bool copy, _Bool override) {
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1163 char *dest = dav_session_get_href(res->session, newpath);
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1164 char *desturl = util_get_url(res->session, dest);
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1165 dav_session_free(res->session, dest);
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1166
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1167 int ret = dav_cp_mv_url(res, desturl, copy, override);
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1168 free(desturl);
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1169 return ret;
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1170 }
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1171
181
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1172 int dav_copy(DavResource *res, char *newpath) {
182
ca07f14f7bfe added override option for copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 181
diff changeset
1173 return dav_cp_mv(res, newpath, true, false);
181
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1174 }
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1175
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1176 int dav_move(DavResource *res, char *newpath) {
182
ca07f14f7bfe added override option for copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 181
diff changeset
1177 return dav_cp_mv(res, newpath, false, false);
ca07f14f7bfe added override option for copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 181
diff changeset
1178 }
ca07f14f7bfe added override option for copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 181
diff changeset
1179
ca07f14f7bfe added override option for copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 181
diff changeset
1180 int dav_copy_o(DavResource *res, char *newpath, DavBool override) {
ca07f14f7bfe added override option for copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 181
diff changeset
1181 return dav_cp_mv(res, newpath, true, override);
ca07f14f7bfe added override option for copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 181
diff changeset
1182 }
ca07f14f7bfe added override option for copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 181
diff changeset
1183
ca07f14f7bfe added override option for copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 181
diff changeset
1184 int dav_move_o(DavResource *res, char *newpath, DavBool override) {
ca07f14f7bfe added override option for copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 181
diff changeset
1185 return dav_cp_mv(res, newpath, false, override);
181
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1186 }
a8f8cdbf85df implemented webdav copy and move method
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 178
diff changeset
1187
186
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1188 int dav_copyto(DavResource *res, char *url, DavBool override) {
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1189 return dav_cp_mv_url(res, url, true, override);
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1190 }
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1191
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1192 int dav_moveto(DavResource *res, char *url, DavBool override) {
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1193 return dav_cp_mv_url(res, url, false, override);
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1194 }
05d11fbcaeb3 improved copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1195
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1196 int dav_lock(DavResource *res) {
315
7db4dbf4e6f9 adds lock timeout
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
1197 return dav_lock_t(res, 0);
7db4dbf4e6f9 adds lock timeout
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
1198 }
7db4dbf4e6f9 adds lock timeout
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
1199
7db4dbf4e6f9 adds lock timeout
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 298
diff changeset
1200 int dav_lock_t(DavResource *res, time_t timeout) {
207
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1201 DavSession *sn = res->session;
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1202 CURL *handle = sn->handle;
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1203 util_set_url(sn, dav_resource_get_href(res));
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1204
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1205 UcxBuffer *request = create_lock_request();
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1206 UcxBuffer *response = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOEXTEND);
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 349
diff changeset
1207 CURLcode ret = do_lock_request(sn, request, response, timeout);
207
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1208
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1209 //printf("\nlock\n");
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1210 //printf("%.*s\n\n", request->size, request->space);
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1211 //printf("%.*s\n\n", response->size, response->space);
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1212
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 208
diff changeset
1213 ucx_buffer_free(request);
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 208
diff changeset
1214
207
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1215 long status = 0;
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1216 curl_easy_getinfo (handle, CURLINFO_RESPONSE_CODE, &status);
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1217 if(ret == CURLE_OK && (status >= 200 && status < 300)) {
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1218 LockDiscovery lock;
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1219 if(parse_lock_response(sn, response, &lock)) {
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1220 sn->error = DAV_ERROR;
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 208
diff changeset
1221 ucx_buffer_free(response);
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1222 return -1;
207
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1223 }
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 208
diff changeset
1224 ucx_buffer_free(response);
207
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1225
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1226 DavLock *l = dav_create_lock(sn, lock.locktoken, lock.timeout);
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1227 free(lock.locktoken);
207
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1228 free(lock.timeout);
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1229
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1230 int r = 0;
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1231 if(res->iscollection) {
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1232 r = dav_add_collection_lock(sn, res->path, l);
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1233 } else {
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1234 r = dav_add_resource_lock(sn, res->path, l);
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1235 }
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1236
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1237 if(r == 0) {
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1238 return 0;
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1239 } else {
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1240 (void)dav_unlock(res);
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1241 sn->error = DAV_ERROR;
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1242 dav_destroy_lock(sn, l);
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1243 return -1;
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1244 }
207
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1245 } else {
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1246 dav_session_set_error(sn, ret, status);
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 208
diff changeset
1247 ucx_buffer_free(response);
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1248 return -1;
207
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1249 }
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1250 }
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1251
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1252 int dav_unlock(DavResource *res) {
207
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1253 DavSession *sn = res->session;
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1254 CURL *handle = sn->handle;
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1255 util_set_url(sn, dav_resource_get_href(res));
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1256
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1257 DavLock *lock = dav_get_lock(res->session, res->path);
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1258 if(!lock) {
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1259 sn->error = DAV_ERROR;
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1260 return -1;
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1261 }
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1262
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 349
diff changeset
1263 CURLcode ret = do_unlock_request(sn, lock->token);
207
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1264 long status = 0;
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1265 curl_easy_getinfo (handle, CURLINFO_RESPONSE_CODE, &status);
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1266 if(ret == CURLE_OK && (status >= 200 && status < 300)) {
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1267 dav_remove_lock(sn, res->path, lock);
207
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1268 } else {
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1269 dav_session_set_error(sn, ret, status);
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1270 return 1;
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1271 }
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1272
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1273 return 0;
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1274 }
de23f8881e9f fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
1275
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1276
505
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 493
diff changeset
1277 int resource_add_crypto_info(DavSession *sn, const char *href, const char *name, const char *hash) {
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1278 if(!DAV_IS_ENCRYPTED(sn)) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1279 return 0;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1280 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1281
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
1282 UcxBuffer *request = create_crypto_proppatch_request(sn, sn->key, name, hash);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1283 UcxBuffer *response = ucx_buffer_new(NULL, 1024, UCX_BUFFER_AUTOEXTEND);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1284
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1285 util_set_url(sn, href);
208
1fb26aca5093 added API for webdav locking
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 207
diff changeset
1286 // TODO: lock
354
067ea2315a8a moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 349
diff changeset
1287 CURLcode ret = do_proppatch_request(sn, NULL, request, response);
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
1288 ucx_buffer_free(request);
205
bf756f6c3581 fixed some warnings and wrong usage of curl_easy_getinfo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 186
diff changeset
1289 long status = 0;
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1290 curl_easy_getinfo (sn->handle, CURLINFO_RESPONSE_CODE, &status);
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1291 if(ret == CURLE_OK && status == 207) {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1292 // TODO: parse response
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
1293 sn->error = DAV_OK;
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
1294 ucx_buffer_free(response);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1295 return 0;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1296 } else {
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1297 dav_session_set_error(sn, ret, status);
150
37fb12574acd added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 146
diff changeset
1298 ucx_buffer_free(response);
43
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1299 return 1;
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1300 }
03076907b58a added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
1301 }
587
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1302
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1303 /* ----------------------------- crypto-prop ----------------------------- */
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1304
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1305 DavXmlNode* create_crypto_prop(DavSession *sn, UcxMap *properties) {
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1306 if(!sn->key) {
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1307 return NULL;
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1308 }
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1309
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1310 UcxBuffer *content = ucx_buffer_new(NULL, 2048, UCX_BUFFER_AUTOEXTEND);
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1311
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1312 // create an xml document containing all properties
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1313 UcxMap *nsmap = ucx_map_new(8);
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1314 ucx_map_cstr_put(nsmap, "DAV:", strdup("D"));
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1315
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1316 ucx_buffer_puts(content, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1317 ucx_buffer_puts(content, "<D:prop xmlns:D=\"DAV:\">\n");
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1318
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1319 UcxMapIterator i = ucx_map_iterator(properties);
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1320 DavProperty *prop;
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1321 UCX_MAP_FOREACH(key, prop, i) {
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1322 DavXmlNode pnode;
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1323 pnode.type = DAV_XML_ELEMENT;
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1324 pnode.namespace = prop->ns->name;
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1325 pnode.name = prop->name;
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1326 pnode.prev = NULL;
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1327 pnode.next = NULL;
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1328 pnode.children = prop->value;
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1329 pnode.parent = NULL;
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1330 pnode.attributes = NULL;
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1331 pnode.content = NULL;
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1332 pnode.contentlength = 0;
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1333
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1334 dav_print_node(content, (write_func)ucx_buffer_write, nsmap, &pnode);
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1335 ucx_buffer_putc(content, '\n');
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1336 }
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1337
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1338 ucx_buffer_puts(content, "</D:prop>");
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1339
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1340 ucx_map_free_content(nsmap, (ucx_destructor)free);
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1341 ucx_map_free(nsmap);
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1342
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1343 // encrypt xml document
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1344 char *crypto_prop_content = aes_encrypt(content->space, content->size, sn->key);
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1345 ucx_buffer_free(content);
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1346
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1347 DavXmlNode *ret = NULL;
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1348 if(crypto_prop_content) {
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1349 ret = dav_text_node(sn, crypto_prop_content);
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1350 free(crypto_prop_content);
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1351 }
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1352 return ret;
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1353 }
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1354
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1355 UcxMap* parse_crypto_prop(DavSession *sn, DavXmlNode *node) {
589
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1356 if(!node || node->type != DAV_XML_TEXT || node->contentlength == 0) {
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1357 return NULL;
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1358 }
587
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1359
589
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1360 size_t len = 0;
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1361 char *dec_str = aes_decrypt(node->content, &len, sn->key);
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1362
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1363 xmlDoc *doc = xmlReadMemory(dec_str, len, NULL, NULL, 0);
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1364 free(dec_str);
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1365 if(!doc) {
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1366 return NULL;
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1367 }
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1368
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1369 int err = 0;
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1370 xmlNode *xml_root = xmlDocGetRootElement(doc);
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1371 if(xml_root) {
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1372 if(
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1373 !xml_root->ns ||
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1374 !xstreq(xml_root->name, "prop") ||
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1375 !xstreq(xml_root->ns->href, "DAV:"))
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1376 {
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1377 err = 1;
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1378 }
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1379 } else {
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1380 err = 1;
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1381 }
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1382
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1383 if(err) {
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1384 xmlFreeDoc(doc);
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1385 return NULL;
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1386 }
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1387
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1388 // ready to get the properties
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1389 UcxMap *map = ucx_map_new(32);
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1390 xmlNode *n = xml_root->children;
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1391 while(n) {
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1392 if(n->type == XML_ELEMENT_NODE && n->ns && n->ns->href) {
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1393 DavProperty *property = dav_session_malloc(sn, sizeof(DavProperty));
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1394 property->name = dav_session_strdup(sn, (const char*)n->name);
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1395 property->ns = dav_session_malloc(sn, sizeof(DavNamespace));
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1396 property->ns->name = dav_session_strdup(sn, (const char*)n->ns->href);
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1397 property->ns->prefix = n->ns->prefix ?
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1398 dav_session_strdup(sn, (const char*)n->ns->prefix) : NULL;
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1399 property->value = n->children ? dav_convert_xml(sn, n->children) : NULL;
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1400
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1401 sstr_t key = dav_property_key(property->ns->name, property->name);
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1402 ucx_map_sstr_put(map, key, property);
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1403 free(key.ptr);
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1404 }
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1405 n = n->next;
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1406 }
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1407
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1408 xmlFreeDoc(doc);
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1409 if(map->count == 0) {
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1410 ucx_map_free(map);
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1411 return NULL;
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1412 }
2514559a6367 add function for decrypting and parsing crypto-prop elements
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 587
diff changeset
1413 return map;
587
3c917df041b8 add func for creating the content of crypto-prop properties
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 558
diff changeset
1414 }

mercurial