libidav/resource.c

changeset 208
1fb26aca5093
parent 207
de23f8881e9f
child 222
7b73058d782e
equal deleted inserted replaced
207:de23f8881e9f 208:1fb26aca5093
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) {
573 enc = aes_encrypter_new( 576 enc = aes_encrypter_new(
574 sn->key, 577 sn->key,
575 buf, 578 buf,
576 (dav_read_func)ucx_buffer_read); 579 (dav_read_func)ucx_buffer_read);
577 } 580 }
578 581
579 // put resource 582 // put resource
580 ret = do_put_request( 583 ret = do_put_request(
581 sn->handle, 584 sn->handle,
585 locktoken,
582 enc, 586 enc,
583 (dav_read_func)aes_read, 587 (dav_read_func)aes_read,
584 0); 588 0);
585 589
586 // get sha256 hash 590 // get sha256 hash
602 resource_add_property(res, DAV_NS, "crypto-hash", enc_hash); 606 resource_add_property(res, DAV_NS, "crypto-hash", enc_hash);
603 free(enc_hash); 607 free(enc_hash);
604 } else { 608 } else {
605 ret = do_put_request( 609 ret = do_put_request(
606 sn->handle, 610 sn->handle,
611 locktoken,
607 data->content, 612 data->content,
608 data->read, 613 data->read,
609 data->length); 614 data->length);
610 } 615 }
611 616
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
763 } 771 }
764 772
765 static int create_ancestors(DavSession *sn, char *href, char *path) { 773 static int create_ancestors(DavSession *sn, char *href, char *path) {
766 CURL *handle = sn->handle; 774 CURL *handle = sn->handle;
767 CURLcode code; 775 CURLcode code;
776
777 DavLock *lock = dav_get_lock(sn, path);
778 char *locktoken = lock ? lock->token : NULL;
779
768 long status = 0; 780 long status = 0;
769 int ret = 0; 781 int ret = 0;
770 782
771 if(strlen(path) <= 1) { 783 if(strlen(path) <= 1) {
772 return 0; 784 return 0;
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

mercurial