dav/main.c

changeset 354
067ea2315a8a
parent 353
e554f3d72d9e
child 355
5da2cf15eb44
--- a/dav/main.c	Tue Dec 12 23:58:54 2017 +0100
+++ b/dav/main.c	Mon Dec 18 11:56:11 2017 +0100
@@ -239,15 +239,9 @@
     fprintf(stderr, "\n");
 }
 
-int request_auth(Repository *repo, DavSession *sn, CmdArgs *a) {
-    if(cmd_getoption(a, "noinput")) {
-        return 0;
-    }
-    
-    static int login = 0;
-    if(login) {
-        return 0;
-    }
+
+int request_auth2(DavSession *sn, void *userdata) {
+    Repository *repo = userdata;
     
     char *user = NULL;
     char ubuf[256];
@@ -274,8 +268,8 @@
     
     dav_session_set_auth(sn, user, password);
     free(password);
-    login = 1;
-    return 1;
+    
+    return 0;
 }
 
 static Repository* url2repo(char *url, char **path) {
@@ -374,6 +368,9 @@
         curl_easy_setopt(sn->handle, CURLOPT_SSL_VERIFYPEER, 0);
         curl_easy_setopt(sn->handle, CURLOPT_SSL_VERIFYHOST, 0);
     }
+    if(!cmd_getoption(a, "noinput")) {
+        dav_session_set_authcallback(sn, request_auth2, repo);
+    }
     return sn;
 }
 
@@ -405,25 +402,13 @@
     
     int depth = cmd_getoption(a, "recursive") ? -1 : 1;
     int ret = -1;
-    DavResource *ls;
-    while(ret != 0) {
-        ls = dav_query(
-                sn,
-                date ? LIST_QUERY_ORDER_BY_DATE : LIST_QUERY_ORDER_BY_NAME,
-                path,
-                depth,
-                t);
-        
-        if(!ls) {
-            if(sn->error == DAV_UNAUTHORIZED) {
-                if(request_auth(repo, sn, a)) {
-                    continue;
-                }
-            }
-            print_resource_error(sn, path);
-            break;
-        }
-        
+    DavResource *ls = dav_query(
+            sn,
+            date ? LIST_QUERY_ORDER_BY_DATE : LIST_QUERY_ORDER_BY_NAME,
+            path,
+            depth,
+            t);
+    if(ls) {
         // parameters
         void (*print_func)(DavResource*, char *, CmdArgs *);
         if(cmd_getoption(a, "list") || cmd_getoption(a, "extended")) {
@@ -437,9 +422,8 @@
             print_func(child, path, a);
             child = child->next;
         }
-        
-        // leave loop
-        ret = 0;
+    } else {
+        print_resource_error(sn, path);
     }
     
     free(path);
@@ -689,21 +673,12 @@
     DavResource *res;
     
     int depth = recursive ? -1 : 1;
-    for(int i=0;i<2;i++) {
-        res = dav_query(
-                sn,
-                "select - from %s with depth = %d where iscollection or lastmodified > %t",
-                path,
-                depth,
-                t);
-        if(!res && sn->error == DAV_UNAUTHORIZED) {
-            if(request_auth(repo, sn, a)) {
-                continue;
-            }
-        }
-        break;
-    }
-    
+    res = dav_query(
+            sn,
+            "select - from %s with depth = %d where iscollection or lastmodified > %t",
+            path,
+            depth,
+            t);
     if(!res) {
         print_resource_error(sn, path);
         return -1;
@@ -1059,16 +1034,7 @@
         return -1;
     }
     
-    DavResource *col = NULL;
-    for(int i=0;i<2;i++) {
-        col = dav_query(sn, "select - from %s", path);
-        if(!col && sn->error == DAV_UNAUTHORIZED) {
-            if(request_auth(repo, sn, a)) {
-                continue;
-            }
-        }
-        break;
-    }
+    DavResource *col = dav_query(sn, "select - from %s", path);
     if(!col) {
         if(sn->error == DAV_NOT_FOUND) {
             col = dav_resource_new(sn, path);
@@ -1137,16 +1103,7 @@
 }
 
 int put_file(Repository *repo, CmdArgs *a, DavSession *sn, char *path, char *name, FILE *in, off_t len) {
-    DavResource *res = NULL;
-    for(int i=0;i<2;i++) {
-        res = dav_query(sn, "select - from %s", path);
-        if(!res && sn->error == DAV_UNAUTHORIZED) {
-            if(request_auth(repo, sn, a)) {
-                continue;
-            }
-        }
-        break;
-    }
+    DavResource *res = dav_query(sn, "select - from %s", path);
     
     if(!res) {
         if(sn->error == DAV_NOT_FOUND) {
@@ -1220,17 +1177,7 @@
         return -1;
     }
     
-    int err = 0;
-    for(int i=0;i<2;i++) {
-        err = dav_delete(res);
-        if(err && sn->error == DAV_UNAUTHORIZED && request_auth(repo, sn, a)) {
-            continue;
-        } else {
-            break;
-        }
-    }
-    
-    if(err) {
+    if(dav_delete(res)) {
         print_resource_error(sn, res->path);
         fprintf(stderr, "Cannot delete resource.\n");
         return -1;
@@ -1278,17 +1225,7 @@
     }
     res->iscollection = 1;
     
-    int err = 0;
-    for(int i=0;i<2;i++) {
-        err = dav_create(res);
-        if(err && sn->error == DAV_UNAUTHORIZED && request_auth(repo, sn, a)) {
-            continue;
-        } else {
-            break;
-        }
-    }
-    
-    if(err) {
+    if(dav_create(res)) {
         print_resource_error(sn, res->path);
         fprintf(stderr, "Cannot create collection.\n");
         return -1;
@@ -1444,15 +1381,9 @@
     }
     
     DavResource *res = dav_resource_new(sn, path);
-    for(int i=0;i<2;i++) {     
-        if(dav_load_prop(res, &propname, 1)) {
-            if(i == 0 && sn->error == DAV_UNAUTHORIZED && request_auth(repo, sn, a)) {
-                continue;
-            }
-            print_resource_error(sn, res->path);
-            return -1;
-        }
-        break;
+    if(dav_load_prop(res, &propname, 1)) {
+        print_resource_error(sn, res->path);
+        return -1;
     }
     free(path);
     
@@ -1498,14 +1429,9 @@
     set_session_lock(sn, a);
     
     DavResource *res = dav_resource_new(sn, path);
-    for(int i=0;i<2;i++) {
-        if(!dav_exists(res)) {
-            if(i == 0 && sn->error == DAV_UNAUTHORIZED && request_auth(repo, sn, a)) {
-                continue;
-            }
-            print_resource_error(sn, res->path);
-            return -1;
-        }
+    if(!dav_exists(res)) {
+        print_resource_error(sn, res->path);
+        return -1;
     }
     
     char *namespace = cmd_getoption(a, "namespace");
@@ -1519,16 +1445,10 @@
     }
     
     int ret = 0;
-    for(int i=0;i<2;i++) {
-        if(dav_store(res)) {
-            if(i == 0 && sn->error == DAV_UNAUTHORIZED && request_auth(repo, sn, a)) {
-                continue;
-            }
-            print_resource_error(sn, res->path);
-            fprintf(stderr, "Cannot set property.\n");
-            ret = -1;
-        }
-        break;
+    if(dav_store(res)) {
+        print_resource_error(sn, res->path);
+        fprintf(stderr, "Cannot set property.\n");
+        ret = -1;
     }
     
     free(path);
@@ -1565,16 +1485,11 @@
     int ret = 0;
     DavResource *res = dav_resource_new(sn, path);
     dav_remove_property_ns(res, propname.ns, propname.name);
-    for(int i=0;i<2;i++) {     
-        if(dav_store(res)) {
-            if(i == 0 && sn->error == DAV_UNAUTHORIZED && request_auth(repo, sn, a)) {
-                continue;
-            }
-            print_resource_error(sn, res->path);
-            fprintf(stderr, "Cannot set property.\n");
-            ret = -1;
-        }
-        break;
+    
+    if(dav_store(res)) {
+        print_resource_error(sn, res->path);
+        fprintf(stderr, "Cannot set property.\n");
+        ret = -1;
     }
     
     free(path);
@@ -1609,13 +1524,7 @@
     }
     
     DavResource *res = dav_resource_new(sn, path);
-    for(int i=0;i<2;i++) {
-        if(!dav_lock_t(res, timeout)) {
-            break;
-        }
-        if(i == 0 && sn->error == DAV_UNAUTHORIZED && request_auth(repo, sn, a)) {
-            continue;
-        }
+    if(dav_lock_t(res, timeout)) {
         print_resource_error(sn, res->path);
         return -1;
     }
@@ -1686,16 +1595,9 @@
     
     int ret = 0;
     DavResource *res = dav_resource_new(sn, path);
-    for(int i=0;i<2;i++) {
-        if(!dav_unlock(res)) {
-            break;
-        }
-        if(i == 0 && sn->error == DAV_UNAUTHORIZED && request_auth(repo, sn, a)) {
-            continue;
-        }
+    if(dav_unlock(res)) {
         print_resource_error(sn, res->path);
         ret = -1;
-        break;
     }
     
     dav_session_destroy(sn);
@@ -1729,57 +1631,52 @@
     }
     
     DavResource *res = dav_resource_new(sn, path);
-    for(int i=0;i<2;i++) {
-        if(!dav_load(res)) {
-            printf("name: %s\n", res->name);
-            printf("path: %s\n", res->path);
+    if(!dav_load(res)) {
+        printf("name: %s\n", res->name);
+        printf("path: %s\n", res->path);
+
+        char *server = util_url_base(sn->base_url);
+        char *url = util_concat_path(server, res->href);
+        printf("url:  %s\n", url);
+        free(url);
+        free(server);
 
-            char *server = util_url_base(sn->base_url);
-            char *url = util_concat_path(server, res->href);
-            printf("url:  %s\n", url);
-            free(url);
-            free(server);
+        if(res->iscollection) {
+            printf("type: collection\n");
+            printf("size: %d\n", count_children(res));
+        } else {
+            printf("type: resource\n");
+            char *len = ls_size_str(res);
+            printf("size: %s\n", len);
+            free(len);
+        }
 
-            if(res->iscollection) {
-                printf("type: collection\n");
-                printf("size: %d\n", count_children(res));
-            } else {
-                printf("type: resource\n");
-                char *len = ls_size_str(res);
-                printf("size: %s\n", len);
-                free(len);
+        size_t count = 0;
+        DavPropName *properties = dav_get_property_names(res, &count);
+
+        char *last_ns = NULL;
+        for(int i=0;i<count;i++) {
+            DavPropName p = properties[i];
+            if(!last_ns || strcmp(last_ns, p.ns)) {
+                printf("\nnamespace: %s\n", p.ns);
+                last_ns = p.ns;
             }
 
-            size_t count = 0;
-            DavPropName *properties = dav_get_property_names(res, &count);
+            DavXmlNode *xval = dav_get_property_ns(res, p.ns, p.name);
+            if(dav_xml_isstring(xval)) {
+                sstr_t value = sstr(dav_xml_getstring(xval));
+                printf("  %s: %.*s\n", p.name, (int)value.length, value.ptr);
+            } else {
+                printf("  %s: $xml\n", p.name);
+            }
+        }
 
-            char *last_ns = NULL;
-            for(int i=0;i<count;i++) {
-                DavPropName p = properties[i];
-                if(!last_ns || strcmp(last_ns, p.ns)) {
-                    printf("\nnamespace: %s\n", p.ns);
-                    last_ns = p.ns;
-                }
-                
-                DavXmlNode *xval = dav_get_property_ns(res, p.ns, p.name);
-                if(dav_xml_isstring(xval)) {
-                    sstr_t value = sstr(dav_xml_getstring(xval));
-                    printf("  %s: %.*s\n", p.name, (int)value.length, value.ptr);
-                } else {
-                    printf("  %s: $xml\n", p.name);
-                }
-            }
-
-            dav_session_free(sn, properties);
-            return 0;
-        } else {
-            if(i == 0 && sn->error == DAV_UNAUTHORIZED && request_auth(repo, sn, a)) {
-                continue;
-            }
-            print_resource_error(sn, res->path);
-            break;
-        }
+        dav_session_free(sn, properties);
+        return 0;
+    } else {
+        print_resource_error(sn, res->path);
     }
+        
     return -1;
 }
 

mercurial