33 |
33 |
34 #include "utils.h" |
34 #include "utils.h" |
35 #include "webdav.h" |
35 #include "webdav.h" |
36 #include "methods.h" |
36 #include "methods.h" |
37 #include "ucx/buffer.h" |
37 #include "ucx/buffer.h" |
|
38 #include "ucx/utils.h" |
38 |
39 |
39 #define xstreq(a,b) xmlStrEqual(BAD_CAST a, BAD_CAST b) |
40 #define xstreq(a,b) xmlStrEqual(BAD_CAST a, BAD_CAST b) |
40 |
41 |
41 DavContext* dav_context_new() { |
42 DavContext* dav_context_new() { |
42 DavContext *context = malloc(sizeof(DavContext)); |
43 DavContext *context = malloc(sizeof(DavContext)); |
64 } |
65 } |
65 |
66 |
66 return context; |
67 return context; |
67 } |
68 } |
68 |
69 |
|
70 void dav_context_destroy(DavContext *ctx) { |
|
71 // destroy all sessions assoziated with this context |
|
72 UCX_FOREACH(elm, ctx->sessions) { |
|
73 dav_session_destroy(elm->data); |
|
74 } |
|
75 |
|
76 UcxMapIterator i = ucx_map_iterator(ctx->namespaces); |
|
77 UcxKey k; |
|
78 DavNamespace *ns; |
|
79 UCX_MAP_FOREACH(k, ns, i) { |
|
80 free(ns->prefix); |
|
81 free(ns->name); |
|
82 free(ns); |
|
83 } |
|
84 ucx_map_free(ctx->namespaces); |
|
85 free(ctx); |
|
86 } |
|
87 |
69 int dav_add_namespace(DavContext *context, char *prefix, char *name) { |
88 int dav_add_namespace(DavContext *context, char *prefix, char *name) { |
70 DavNamespace *namespace = malloc(sizeof(DavNamespace)); |
89 DavNamespace *namespace = malloc(sizeof(DavNamespace)); |
71 if(!namespace) { |
90 if(!namespace) { |
72 return 1; |
91 return 1; |
73 } |
92 } |
106 sn->handle = curl_easy_init(); |
125 sn->handle = curl_easy_init(); |
107 curl_easy_setopt(sn->handle, CURLOPT_URL, base_url); |
126 curl_easy_setopt(sn->handle, CURLOPT_URL, base_url); |
108 |
127 |
109 sn->mp = ucx_mempool_new(1024); |
128 sn->mp = ucx_mempool_new(1024); |
110 sn->allocator = ucx_mempool_allocator(sn->mp); |
129 sn->allocator = ucx_mempool_allocator(sn->mp); |
|
130 |
|
131 context->sessions = ucx_list_append(context->sessions, sn); |
111 |
132 |
112 return sn; |
133 return sn; |
113 } |
134 } |
114 |
135 |
115 DavSession* dav_session_new_auth(DavContext *context, char *base_url, char *user, char *password) { |
136 DavSession* dav_session_new_auth(DavContext *context, char *base_url, char *user, char *password) { |
138 switch(status) { |
159 switch(status) { |
139 default: sn->error = DAV_ERROR; break; |
160 default: sn->error = DAV_ERROR; break; |
140 case 401: sn->error = DAV_UNAUTHORIZED; break; |
161 case 401: sn->error = DAV_UNAUTHORIZED; break; |
141 case 403: sn->error = DAV_FORBIDDEN; break; |
162 case 403: sn->error = DAV_FORBIDDEN; break; |
142 case 404: sn->error = DAV_NOT_FOUND; break; |
163 case 404: sn->error = DAV_NOT_FOUND; break; |
|
164 case 405: sn->error = DAV_METHOD_NOT_ALLOWED; break; |
|
165 case 409: sn->error = DAV_CONFLICT; break; |
143 } |
166 } |
144 } else { |
167 } else { |
145 sn->error = DAV_ERROR; |
168 sn->error = DAV_ERROR; |
146 } |
169 } |
|
170 } |
|
171 |
|
172 void dav_session_destroy(DavSession *sn) { |
|
173 // remove session from context |
|
174 UcxList *sessions = sn->context->sessions; |
|
175 ssize_t i = ucx_list_find(sessions, sn, ucx_ptrcmp, NULL); |
|
176 if(i > 0) { |
|
177 UcxList *elm = ucx_list_get(sessions, i); |
|
178 if(elm) { |
|
179 sn->context->sessions = ucx_list_remove(sessions, elm); |
|
180 } |
|
181 } |
|
182 |
|
183 ucx_mempool_destroy(sn->mp); |
|
184 curl_easy_cleanup(sn->handle); |
|
185 free(sn->base_url); |
|
186 free(sn); |
147 } |
187 } |
148 |
188 |
149 DavResource* dav_get(DavSession *sn, char *path, char *properties) { |
189 DavResource* dav_get(DavSession *sn, char *path, char *properties) { |
150 char *url = util_concat_path(sn->base_url, path); |
190 char *url = util_concat_path(sn->base_url, path); |
151 |
191 |
512 } else { |
552 } else { |
513 session_set_error(res->session, ret, status); |
553 session_set_error(res->session, ret, status); |
514 return 1; |
554 return 1; |
515 } |
555 } |
516 } |
556 } |
|
557 |
|
558 int dav_create(DavResource *res) { |
|
559 char *url = util_concat_path(res->session->base_url, res->path); |
|
560 char *parent = util_parent_path(res->path); |
|
561 |
|
562 DavSession *sn = res->session; |
|
563 DavResource *parent_res = dav_get(sn, parent, NULL); |
|
564 if(!parent_res && sn->error == DAV_NOT_FOUND) { |
|
565 parent_res = dav_resource_new(sn, parent); |
|
566 parent_res->iscollection = 1; |
|
567 int r = dav_create(parent_res); |
|
568 if(r) { |
|
569 free(parent); |
|
570 return r; |
|
571 } |
|
572 } else if(parent_res && !res->iscollection) { |
|
573 sn->error = DAV_FORBIDDEN; |
|
574 return 1; |
|
575 } else if(sn->error != DAV_OK) { |
|
576 return 1; |
|
577 } |
|
578 |
|
579 CURL *handle = res->session->handle; |
|
580 curl_easy_setopt(handle, CURLOPT_URL, url); |
|
581 free(url); |
|
582 free(parent); |
|
583 |
|
584 // TODO: check iscollection and create empty resource or collection |
|
585 |
|
586 CURLcode ret = do_mkcol_request(handle); |
|
587 int status = 0; |
|
588 curl_easy_getinfo (handle, CURLINFO_RESPONSE_CODE, &status); |
|
589 if(ret == CURLE_OK && (status >= 200 && status < 300)) { |
|
590 res->session->error = DAV_OK; |
|
591 return 0; |
|
592 } else { |
|
593 session_set_error(res->session, ret, status); |
|
594 return 1; |
|
595 } |
|
596 } |