555 int dav_store(DavResource *res) { |
555 int dav_store(DavResource *res) { |
556 DavSession *sn = res->session; |
556 DavSession *sn = res->session; |
557 DavResourceData *data = res->data; |
557 DavResourceData *data = res->data; |
558 |
558 |
559 util_set_url(sn, dav_resource_get_href(res)); |
559 util_set_url(sn, dav_resource_get_href(res)); |
560 |
560 |
|
561 DavLock *lock = dav_get_lock(sn, res->path); |
|
562 char *locktoken = lock ? lock->token : NULL; |
|
563 |
561 // store content |
564 // store content |
562 if(data->content) { |
565 if(data->content) { |
563 int encryption = DAV_ENCRYPT_CONTENT(sn) && sn->key; |
566 int encryption = DAV_ENCRYPT_CONTENT(sn) && sn->key; |
564 CURLcode ret; |
567 CURLcode ret; |
565 if(encryption) { |
568 if(encryption) { |
630 if(data->set || data->remove) { |
635 if(data->set || data->remove) { |
631 UcxBuffer *request = create_proppatch_request(data); |
636 UcxBuffer *request = create_proppatch_request(data); |
632 UcxBuffer *response = ucx_buffer_new(NULL, 1024, UCX_BUFFER_AUTOEXTEND); |
637 UcxBuffer *response = ucx_buffer_new(NULL, 1024, UCX_BUFFER_AUTOEXTEND); |
633 //printf("request:\n%.*s\n\n", request->pos, request->space); |
638 //printf("request:\n%.*s\n\n", request->pos, request->space); |
634 |
639 |
635 CURLcode ret = do_proppatch_request(sn->handle, request, response); |
640 CURLcode ret = do_proppatch_request(sn->handle, locktoken, request, response); |
636 long status = 0; |
641 long status = 0; |
637 curl_easy_getinfo (sn->handle, CURLINFO_RESPONSE_CODE, &status); |
642 curl_easy_getinfo (sn->handle, CURLINFO_RESPONSE_CODE, &status); |
638 if(ret == CURLE_OK && status == 207) { |
643 if(ret == CURLE_OK && status == 207) { |
639 //printf("%s\n", response->space); |
644 //printf("%s\n", response->space); |
640 // TODO: parse response |
645 // TODO: parse response |
743 |
748 |
744 int dav_delete(DavResource *res) { |
749 int dav_delete(DavResource *res) { |
745 CURL *handle = res->session->handle; |
750 CURL *handle = res->session->handle; |
746 util_set_url(res->session, dav_resource_get_href(res)); |
751 util_set_url(res->session, dav_resource_get_href(res)); |
747 |
752 |
|
753 DavLock *lock = dav_get_lock(res->session, res->path); |
|
754 char *locktoken = lock ? lock->token : NULL; |
|
755 |
748 UcxBuffer *response = ucx_buffer_new(NULL, 4096, UCX_BUFFER_AUTOEXTEND); |
756 UcxBuffer *response = ucx_buffer_new(NULL, 4096, UCX_BUFFER_AUTOEXTEND); |
749 CURLcode ret = do_delete_request(handle, response); |
757 CURLcode ret = do_delete_request(handle, locktoken, response); |
750 long status = 0; |
758 long status = 0; |
751 curl_easy_getinfo (handle, CURLINFO_RESPONSE_CODE, &status); |
759 curl_easy_getinfo (handle, CURLINFO_RESPONSE_CODE, &status); |
752 if(ret == CURLE_OK && (status >= 200 && status < 300)) { |
760 if(ret == CURLE_OK && (status >= 200 && status < 300)) { |
753 res->session->error = DAV_OK; |
761 res->session->error = DAV_OK; |
754 |
762 |
775 char *p = util_parent_path(path); |
787 char *p = util_parent_path(path); |
776 char *h = util_parent_path(href); |
788 char *h = util_parent_path(href); |
777 |
789 |
778 for(int i=0;i<2;i++) { |
790 for(int i=0;i<2;i++) { |
779 util_set_url(sn, h); |
791 util_set_url(sn, h); |
780 code = do_mkcol_request(handle); |
792 code = do_mkcol_request(handle, locktoken); |
781 curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &status); |
793 curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &status); |
782 if(status == 201) { |
794 if(status == 201) { |
783 // resource successfully created |
795 // resource successfully created |
784 char *name = util_resource_name(p); |
796 char *name = util_resource_name(p); |
785 int len = strlen(name); |
797 int len = strlen(name); |
814 static int create_resource(DavResource *res, int *status) { |
826 static int create_resource(DavResource *res, int *status) { |
815 DavSession *sn = res->session; |
827 DavSession *sn = res->session; |
816 CURL *handle = sn->handle; |
828 CURL *handle = sn->handle; |
817 util_set_url(sn, dav_resource_get_href(res)); |
829 util_set_url(sn, dav_resource_get_href(res)); |
818 |
830 |
|
831 DavLock *lock = dav_get_lock(res->session, res->path); |
|
832 char *locktoken = lock ? lock->token : NULL; |
|
833 |
819 CURLcode code; |
834 CURLcode code; |
820 if(res->iscollection) { |
835 if(res->iscollection) { |
821 code = do_mkcol_request(handle); |
836 code = do_mkcol_request(handle, locktoken); |
822 } else { |
837 } else { |
823 code = do_put_request(handle, "", NULL, 0); |
838 code = do_put_request(handle, locktoken, "", NULL, 0); |
824 } |
839 } |
825 long s = 0; |
840 long s = 0; |
826 curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &s); |
841 curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &s); |
827 *status = s; |
842 *status = s; |
828 if(code == CURLE_OK && (s >= 200 && s < 300)) { |
843 if(code == CURLE_OK && (s >= 200 && s < 300)) { |
923 |
938 |
924 int dav_moveto(DavResource *res, char *url, DavBool override) { |
939 int dav_moveto(DavResource *res, char *url, DavBool override) { |
925 return dav_cp_mv_url(res, url, false, override); |
940 return dav_cp_mv_url(res, url, false, override); |
926 } |
941 } |
927 |
942 |
928 char* dav_lock(DavResource *res) { |
943 int dav_lock(DavResource *res) { |
929 DavSession *sn = res->session; |
944 DavSession *sn = res->session; |
930 CURL *handle = sn->handle; |
945 CURL *handle = sn->handle; |
931 util_set_url(sn, dav_resource_get_href(res)); |
946 util_set_url(sn, dav_resource_get_href(res)); |
932 |
947 |
933 UcxBuffer *request = create_lock_request(); |
948 UcxBuffer *request = create_lock_request(); |
942 curl_easy_getinfo (handle, CURLINFO_RESPONSE_CODE, &status); |
957 curl_easy_getinfo (handle, CURLINFO_RESPONSE_CODE, &status); |
943 if(ret == CURLE_OK && (status >= 200 && status < 300)) { |
958 if(ret == CURLE_OK && (status >= 200 && status < 300)) { |
944 LockDiscovery lock; |
959 LockDiscovery lock; |
945 if(parse_lock_response(sn, response, &lock)) { |
960 if(parse_lock_response(sn, response, &lock)) { |
946 sn->error = DAV_ERROR; |
961 sn->error = DAV_ERROR; |
947 return NULL; |
962 return -1; |
948 } |
963 } |
949 |
964 |
|
965 DavLock *l = dav_create_lock(sn, lock.locktoken, lock.timeout); |
|
966 free(lock.locktoken); |
950 free(lock.timeout); |
967 free(lock.timeout); |
951 return lock.locktoken; |
968 |
|
969 int r = 0; |
|
970 if(res->iscollection) { |
|
971 r = dav_add_collection_lock(sn, res->path, l); |
|
972 } else { |
|
973 r = dav_add_resource_lock(sn, res->path, l); |
|
974 } |
|
975 |
|
976 if(r == 0) { |
|
977 return 0; |
|
978 } else { |
|
979 (void)dav_unlock(res); |
|
980 sn->error = DAV_ERROR; |
|
981 dav_destroy_lock(sn, l); |
|
982 return -1; |
|
983 } |
952 } else { |
984 } else { |
953 dav_session_set_error(sn, ret, status); |
985 dav_session_set_error(sn, ret, status); |
954 return NULL; |
986 return -1; |
955 } |
987 } |
956 } |
988 } |
957 |
989 |
958 int dav_unlock(DavResource *res, char *locktoken) { |
990 int dav_unlock(DavResource *res) { |
959 DavSession *sn = res->session; |
991 DavSession *sn = res->session; |
960 CURL *handle = sn->handle; |
992 CURL *handle = sn->handle; |
961 util_set_url(sn, dav_resource_get_href(res)); |
993 util_set_url(sn, dav_resource_get_href(res)); |
962 |
994 |
963 CURLcode ret = do_unlock_request(handle, locktoken); |
995 DavLock *lock = dav_get_lock(res->session, res->path); |
|
996 if(!lock) { |
|
997 sn->error = DAV_ERROR; |
|
998 return -1; |
|
999 } |
|
1000 |
|
1001 CURLcode ret = do_unlock_request(handle, lock->token); |
964 long status = 0; |
1002 long status = 0; |
965 curl_easy_getinfo (handle, CURLINFO_RESPONSE_CODE, &status); |
1003 curl_easy_getinfo (handle, CURLINFO_RESPONSE_CODE, &status); |
966 if(ret == CURLE_OK && (status >= 200 && status < 300)) { |
1004 if(ret == CURLE_OK && (status >= 200 && status < 300)) { |
|
1005 dav_remove_lock(sn, res->path, lock); |
967 return 0; |
1006 return 0; |
968 } else { |
1007 } else { |
969 dav_session_set_error(sn, ret, status); |
1008 dav_session_set_error(sn, ret, status); |
970 return 1; |
1009 return 1; |
971 } |
1010 } |
981 |
1020 |
982 UcxBuffer *request = create_crypto_proppatch_request(sn, sn->key, name, hash); |
1021 UcxBuffer *request = create_crypto_proppatch_request(sn, sn->key, name, hash); |
983 UcxBuffer *response = ucx_buffer_new(NULL, 1024, UCX_BUFFER_AUTOEXTEND); |
1022 UcxBuffer *response = ucx_buffer_new(NULL, 1024, UCX_BUFFER_AUTOEXTEND); |
984 |
1023 |
985 util_set_url(sn, href); |
1024 util_set_url(sn, href); |
986 CURLcode ret = do_proppatch_request(sn->handle, request, response); |
1025 // TODO: lock |
|
1026 CURLcode ret = do_proppatch_request(sn->handle, NULL, request, response); |
987 ucx_buffer_free(request); |
1027 ucx_buffer_free(request); |
988 long status = 0; |
1028 long status = 0; |
989 curl_easy_getinfo (sn->handle, CURLINFO_RESPONSE_CODE, &status); |
1029 curl_easy_getinfo (sn->handle, CURLINFO_RESPONSE_CODE, &status); |
990 if(ret == CURLE_OK && status == 207) { |
1030 if(ret == CURLE_OK && status == 207) { |
991 // TODO: parse response |
1031 // TODO: parse response |