Sat, 22 Jun 2019 16:36:52 +0200
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
517
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
1 | /* |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
3 | * |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
4 | * Copyright 2019 Olaf Wintermann. All rights reserved. |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
5 | * |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
8 | * |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
11 | * |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
15 | * |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
8531b63accae
adds option to store a file info property
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 |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
27 | */ |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
28 | |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
29 | #include "finfo.h" |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
30 | |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
31 | #include <stdio.h> |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
32 | #include <stdlib.h> |
520
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
33 | #include <string.h> |
517
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
34 | #include <unistd.h> |
526
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
35 | #include <errno.h> |
517
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
36 | #include <sys/stat.h> |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
37 | |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
38 | #include <ucx/string.h> |
526
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
39 | #include <ucx/list.h> |
520
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
40 | #include <libidav/crypto.h> |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
41 | #include <libidav/utils.h> |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
42 | |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
43 | #include "libxattr.h" |
517
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
44 | |
526
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
45 | uint32_t parse_finfo_settings(const char *str, char **error) { |
517
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
46 | scstr_t s = scstr(str); |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
47 | |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
48 | if(!sstrcmp(s, SC("*")) || !sstrcmp(s, SC("a")) || !sstrcmp(s, SC("all"))) { |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
49 | return FINFO_DATE|FINFO_OWNER|FINFO_MODE; |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
50 | } |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
51 | |
539
8deb52292c99
fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
527
diff
changeset
|
52 | ssize_t count = 0; |
517
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
53 | sstr_t *fs = sstrsplit(s, SC(","), &count); |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
54 | |
522
46f96dcd6eab
adds metadata config element for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
55 | char *err = NULL; |
46f96dcd6eab
adds metadata config element for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
56 | |
517
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
57 | uint32_t finfo = 0; |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
58 | for(int i=0;i<count;i++) { |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
59 | sstr_t f = fs[i]; |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
60 | if(!sstrcasecmp(f, SC("date"))) { |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
61 | finfo |= FINFO_DATE; |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
62 | } else if(!sstrcasecmp(f, SC("owner"))) { |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
63 | finfo |= FINFO_OWNER; |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
64 | } else if(!sstrcasecmp(f, SC("mode"))) { |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
65 | finfo |= FINFO_MODE; |
520
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
66 | } else if(!sstrcasecmp(f, SC("xattr"))) { |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
67 | finfo |= FINFO_XATTR; |
522
46f96dcd6eab
adds metadata config element for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
68 | } else if(error && !err) { |
46f96dcd6eab
adds metadata config element for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
69 | err = fs[i].ptr; |
46f96dcd6eab
adds metadata config element for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
70 | continue; |
517
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
71 | } |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
72 | free(f.ptr); |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
73 | } |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
74 | |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
75 | free(fs); |
522
46f96dcd6eab
adds metadata config element for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
76 | return err ? 0 : finfo; |
517
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
77 | } |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
78 | |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
79 | int resource_set_finfo(const char *path, DavResource *res, uint32_t finfo) { |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
80 | if(!path || finfo == 0) { |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
81 | return 0; |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
82 | } |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
83 | |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
84 | struct stat s; |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
85 | if(stat(path, &s)) { |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
86 | fprintf(stderr, "failed to stat: %s\n", path); |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
87 | return 1; |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
88 | } |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
89 | return resource_set_finfo_s(&s, res, finfo); |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
90 | } |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
91 | |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
92 | int resource_set_finfo_s(struct stat *s, DavResource *res, uint32_t finfo) { |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
93 | if(finfo == 0) { |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
94 | return 0; |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
95 | } |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
96 | |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
97 | DavXmlNode *content = NULL; |
519
ac5ac55b1b2e
adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
517
diff
changeset
|
98 | DavXmlNode *last = NULL; |
517
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
99 | |
539
8deb52292c99
fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
527
diff
changeset
|
100 | if((finfo & FINFO_DATE) == FINFO_DATE) { |
517
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
101 | char str[32]; |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
102 | struct tm *date = gmtime(&s->st_mtime); |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
103 | strftime(str, 32, "%a, %d %b %Y %H:%M:%S GMT", date); |
607
5dc7fe41e8f8
move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
539
diff
changeset
|
104 | DavXmlNode *mtime = dav_xml_createnode_with_text(DAV_PROPS_NS, "mtime", str); |
517
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
105 | content = mtime; |
519
ac5ac55b1b2e
adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
517
diff
changeset
|
106 | last = mtime; |
517
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
107 | } |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
108 | #ifndef _WIN32 |
539
8deb52292c99
fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
527
diff
changeset
|
109 | if((finfo & FINFO_OWNER) == FINFO_OWNER) { |
517
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
110 | // TODO |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
111 | } |
539
8deb52292c99
fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
527
diff
changeset
|
112 | if((finfo & FINFO_MODE) == FINFO_MODE) { |
519
ac5ac55b1b2e
adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
517
diff
changeset
|
113 | mode_t mode = s->st_mode & 07777; |
ac5ac55b1b2e
adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
517
diff
changeset
|
114 | char str[32]; |
ac5ac55b1b2e
adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
517
diff
changeset
|
115 | snprintf(str, 32, "%o", (int)mode); |
607
5dc7fe41e8f8
move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
539
diff
changeset
|
116 | DavXmlNode *xmode = dav_xml_createnode_with_text(DAV_PROPS_NS, "mode", str); |
519
ac5ac55b1b2e
adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
517
diff
changeset
|
117 | if(last) { |
ac5ac55b1b2e
adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
517
diff
changeset
|
118 | last->next = xmode; |
ac5ac55b1b2e
adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
517
diff
changeset
|
119 | } else { |
ac5ac55b1b2e
adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
517
diff
changeset
|
120 | content = xmode; |
ac5ac55b1b2e
adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
517
diff
changeset
|
121 | } |
ac5ac55b1b2e
adds file mode to fileinfo property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
517
diff
changeset
|
122 | last = xmode; |
517
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
123 | } |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
124 | #endif |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
125 | |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
126 | |
607
5dc7fe41e8f8
move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
539
diff
changeset
|
127 | dav_set_property_ns(res, DAV_PROPS_NS, "finfo", content);; |
517
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
128 | |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
129 | return 0; |
8531b63accae
adds option to store a file info property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
130 | } |
520
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
131 | |
526
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
132 | XAttributes* xml_get_attributes(DavXmlNode *xml) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
133 | UcxList *names = NULL; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
134 | UcxList *values = NULL; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
135 | |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
136 | size_t count = 0; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
137 | |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
138 | char *hash = NULL; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
139 | |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
140 | DavXmlNode *node = xml; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
141 | while(node) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
142 | if(node->type == DAV_XML_ELEMENT) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
143 | if(!strcmp(node->name, "hash")) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
144 | hash = dav_xml_getstring(node->children); |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
145 | } else if(!strcmp(node->name, "xattr")) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
146 | char *xattr_name = dav_xml_get_attr(node, "name"); |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
147 | if(xattr_name) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
148 | names = ucx_list_append(names, strdup(xattr_name)); |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
149 | |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
150 | char *text = dav_xml_getstring(node->children); |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
151 | if(!text) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
152 | text = ""; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
153 | } |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
154 | |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
155 | int len = 0; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
156 | char *val = util_base64decode_len(text, &len); |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
157 | |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
158 | sstr_t *value = malloc(sizeof(sstr_t)); |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
159 | value->ptr = val; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
160 | value->length = len; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
161 | |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
162 | values = ucx_list_append(values, value); |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
163 | |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
164 | count++; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
165 | } |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
166 | } |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
167 | } |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
168 | |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
169 | node = node->next; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
170 | } |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
171 | |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
172 | XAttributes *attributes = NULL; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
173 | if(count > 0) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
174 | attributes = calloc(1, sizeof(XAttributes)); |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
175 | attributes->hash = hash ? strdup(hash) : NULL; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
176 | attributes->nattr = count; |
527
d0e37224eba1
adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
526
diff
changeset
|
177 | attributes->names = calloc(count, sizeof(char*)); |
d0e37224eba1
adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
526
diff
changeset
|
178 | attributes->values = calloc(count, sizeof(sstr_t)); |
526
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
179 | int i=0; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
180 | UCX_FOREACH(elm, names) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
181 | attributes->names[i] = elm->data; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
182 | i++; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
183 | } |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
184 | i=0; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
185 | UCX_FOREACH(elm, values) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
186 | attributes->values[i] = *(sstr_t*)elm->data; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
187 | i++; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
188 | } |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
189 | } |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
190 | return attributes; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
191 | } |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
192 | |
520
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
193 | XAttributes* file_get_attributes(const char *path) { |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
194 | ssize_t nelm = 0; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
195 | char **attributes = xattr_list(path, &nelm); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
196 | if(nelm <= 0) { |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
197 | return NULL; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
198 | } |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
199 | |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
200 | XAttributes *xattr = malloc(sizeof(XAttributes)); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
201 | xattr->nattr = 0; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
202 | xattr->names = calloc(nelm, sizeof(char*)); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
203 | xattr->values = calloc(nelm, sizeof(sstr_t)); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
204 | |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
205 | DAV_SHA_CTX *sha256 = dav_hash_init(); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
206 | |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
207 | size_t nattr = 0; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
208 | for(int i=0;i<nelm;i++) { |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
209 | ssize_t valuelen = 0; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
210 | char *value = xattr_get(path, attributes[i], &valuelen); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
211 | if(valuelen >= 0) { |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
212 | dav_hash_update(sha256, attributes[i], strlen(attributes[i])); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
213 | dav_hash_update(sha256, value, valuelen); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
214 | // add name and value |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
215 | xattr->names[nattr] = attributes[i]; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
216 | sstr_t v; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
217 | v.ptr = value; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
218 | v.length = valuelen; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
219 | xattr->values[nattr] = v; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
220 | nattr++; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
221 | } else { |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
222 | // discard not readable attributes |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
223 | free(attributes[i]); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
224 | } |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
225 | } |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
226 | |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
227 | xattr->nattr = nattr; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
228 | |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
229 | unsigned char hash[DAV_SHA256_DIGEST_LENGTH]; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
230 | dav_hash_final(sha256, hash); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
231 | xattr->hash = util_hexstr(hash, DAV_SHA256_DIGEST_LENGTH); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
232 | |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
233 | free(attributes); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
234 | |
524
d53fd1006485
store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
522
diff
changeset
|
235 | if(nattr > 0) { |
d53fd1006485
store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
522
diff
changeset
|
236 | return xattr; |
d53fd1006485
store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
522
diff
changeset
|
237 | } else { |
d53fd1006485
store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
522
diff
changeset
|
238 | xattributes_free(xattr); |
d53fd1006485
store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
522
diff
changeset
|
239 | return NULL; |
d53fd1006485
store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
522
diff
changeset
|
240 | } |
520
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
241 | } |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
242 | |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
243 | int resource_set_xattr(DavResource *res, XAttributes *xattr) { |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
244 | if(!xattr || xattr->nattr == 0) { |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
245 | return 0; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
246 | } |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
247 | |
607
5dc7fe41e8f8
move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
539
diff
changeset
|
248 | DavXmlNode *content = dav_xml_createnode_with_text(DAV_PROPS_NS, "hash", xattr->hash); |
520
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
249 | DavXmlNode *last = content; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
250 | |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
251 | for(int i=0;i<xattr->nattr;i++) { |
607
5dc7fe41e8f8
move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
539
diff
changeset
|
252 | DavXmlNode *attr = dav_xml_createnode(DAV_PROPS_NS, "xattr"); |
520
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
253 | dav_xml_add_attr(attr, "name", xattr->names[i]); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
254 | last->next = attr; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
255 | last = attr; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
256 | |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
257 | sstr_t value = xattr->values[i]; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
258 | if(value.length > 0) { |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
259 | char *encval = util_base64encode(value.ptr, value.length); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
260 | attr->children = dav_xml_createtextnode(encval); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
261 | free(encval); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
262 | } |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
263 | } |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
264 | |
607
5dc7fe41e8f8
move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
539
diff
changeset
|
265 | dav_set_property_ns(res, DAV_PROPS_NS, "xattributes", content); |
520
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
266 | |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
267 | return 0; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
268 | } |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
269 | |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
270 | void xattributes_free(XAttributes *xattr) { |
524
d53fd1006485
store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
522
diff
changeset
|
271 | free(xattr->hash); |
d53fd1006485
store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
522
diff
changeset
|
272 | for(int i=0;i<xattr->nattr;i++) { |
d53fd1006485
store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
522
diff
changeset
|
273 | free(xattr->names[i]); |
d53fd1006485
store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
522
diff
changeset
|
274 | free(xattr->values[i].ptr); |
d53fd1006485
store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
522
diff
changeset
|
275 | } |
d53fd1006485
store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
522
diff
changeset
|
276 | free(xattr); |
520
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
519
diff
changeset
|
277 | } |
526
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
278 | |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
279 | char* get_xattr_hash(DavXmlNode *finfo) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
280 | DavXmlNode *node = finfo; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
281 | while(node) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
282 | if(node->type == DAV_XML_ELEMENT && !strcmp(node->name, "hash")) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
283 | return dav_xml_getstring(node->children); |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
284 | } |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
285 | node = node->next; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
286 | } |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
287 | return NULL; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
288 | } |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
289 | |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
290 | void finfo_get_values(DavXmlNode *xml, FileInfo *outval) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
291 | memset(outval, 0, sizeof(FileInfo)); |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
292 | DavXmlNode *node = xml; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
293 | while(node) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
294 | if(node->type == DAV_XML_ELEMENT) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
295 | if(!strcmp(node->name, "mtime")) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
296 | char *mtime = dav_xml_getstring(node->children); |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
297 | if(mtime) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
298 | outval->last_modified = util_parse_lastmodified(mtime); |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
299 | outval->date_set = TRUE; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
300 | } |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
301 | } else if(!strcmp(node->name, "mode")) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
302 | char *mode_str = dav_xml_getstring(node->children); |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
303 | if(mode_str) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
304 | char *end; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
305 | errno = 0; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
306 | long int mode = strtol(mode_str, &end, 8); |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
307 | if(errno == 0) { |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
308 | mode &= 07777; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
309 | outval->mode = mode; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
310 | outval->mode_set = TRUE; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
311 | } |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
312 | } |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
313 | } |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
314 | } |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
315 | node = node->next; |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
316 | } |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
317 | |
e3c0440bd599
adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
524
diff
changeset
|
318 | } |