dav/main.c

changeset 43
03076907b58a
parent 40
a95ee94b9204
child 45
e3839719b079
--- a/dav/main.c	Tue Mar 18 13:59:02 2014 +0100
+++ b/dav/main.c	Thu Jun 05 15:11:29 2014 +0200
@@ -49,6 +49,11 @@
     // nothing
 }
 
+#include <libidav/session.h>
+void test() {
+    
+}
+
 int main(int argc, char **argv) {
     xmlGenericErrorFunc fnc = xmlerrorfnc;
     initGenericErrorDefaultFunc(&fnc);
@@ -56,6 +61,8 @@
     load_config(ctx);
     dav_add_namespace(ctx, "U", "http://www.uap-core.de/");
     
+    //test();
+    
     memcpy(ctx->http_proxy, get_http_proxy(), sizeof(Proxy));
     memcpy(ctx->https_proxy, get_https_proxy(), sizeof(Proxy));
     
@@ -103,9 +110,9 @@
     fprintf(stderr, "        list [-altR] [-u <date>] <url>\n");
     fprintf(
             stderr,
-            "        get [-pR] [-k <key>] [-o <file>] [-u <date>] <url>\n");
+            "        get [-pR] [-o <file>] [-u <date>] <url>\n");
     fprintf(stderr, "        put [-pR] [-k <key>] <url> <file>\n");
-    fprintf(stderr, "        mkdir <url>\n");
+    fprintf(stderr, "        mkdir [-p] [-k <key>] <url>\n");
     fprintf(stderr, "        remove <url>\n");
     fprintf(stderr, "        date [url]\n");
     fprintf(stderr, "\n");
@@ -202,8 +209,7 @@
         repo = calloc(1, sizeof(Repository));
         repo->name = "";
         repo->url = strdup(url);
-        repo->store_key_property = true;
-        repo->decrypt = true;
+        repo->decrypt_content = true;
         *path = strdup("/");
     }
     
@@ -252,10 +258,11 @@
     char *url = a->argv[0];
     char *path = NULL;
     //char *base = NULL;
-    DavSession *sn = NULL;
     Repository *repo = url2repo(url, &path);
     //base = util_concat_path(repo->url, path);
-    sn = dav_session_new_auth(ctx, repo->url, repo->user, repo->password);
+    DavSession *sn = dav_session_new_auth(ctx, repo->url, repo->user, repo->password);
+    dav_session_set_flags(sn, get_repository_flags(repo));
+    sn->key = dav_context_get_key(ctx, repo->default_key);
     
     char *update = cmd_getoption(a, "update");
     time_t t = 0;
@@ -263,31 +270,16 @@
         t = util_parse_lastmodified(update);
     }
     
+    int depth = cmd_getoption(a, "recursive") ? -1 : 1;
     int ret = -1;
     DavResource *ls;
     while(ret != 0) {
-        if(cmd_getoption(a, "recursive")) {
-            //printf("base: %s\n", base);
-            if(update) {
-                ls = dav_query(
-                        sn,
-                        "get U:crypto-key from %s* where lastmodified > %t",
-                        path,
-                        t);
-            } else {
-                ls = dav_query(sn, "get U:crypto-key from %s*", path);
-            }
-        } else {
-            if(update) {
-                ls = dav_query(
-                        sn,
-                        "get U:crypto-key from %s where lastmodified > %t",
-                        path,
-                        t);
-            } else {
-                ls = dav_query(sn, "get U:crypto-key from %s", path);
-            }
-        }
+        ls = dav_query(
+                sn,
+                "get - from %s where lastmodified > %t with depth %d",
+                path,
+                t,
+                depth);
         
         if(!ls) {
             if(sn->error == DAV_UNAUTHORIZED) {
@@ -429,7 +421,7 @@
     }
     char *keyprop = dav_get_property_ns(
             res,
-            "http://www.uap-core.de/",
+            DAV_NS,
             "crypto-key");
     if(keyprop) {
         flags[1] = 'c';
@@ -486,9 +478,10 @@
     
     char *url = a->argv[0];
     char *path = NULL;
-    DavSession *sn = NULL;
     Repository *repo = url2repo(url, &path);
-    sn = dav_session_new_auth(ctx, repo->url, repo->user, repo->password);
+    DavSession *sn = dav_session_new_auth(ctx, repo->url, repo->user, repo->password);
+    dav_session_set_flags(sn, get_repository_flags(repo));
+    sn->key = dav_context_get_key(ctx, repo->default_key);
     
     char *update = cmd_getoption(a, "update");
     time_t t = 0;
@@ -499,27 +492,14 @@
     int recursive = cmd_getoption(a, "recursive") ? 1 : 0;
     DavResource *res;
     
-    if(recursive) {
-        if(update) {
-            res = dav_query(
-                    sn,
-                    "get U:crypto-key from %s* where lastmodified > %t",
-                    path,
-                    t);
-        } else {
-            res = dav_query(sn, "get U:crypto-key from %s*", path);
-        }
-    } else {
-        if(update) {
-            res = dav_query(
-                    sn,
-                    "get U:crypto-key from %s where lastmodified > %t",
-                    path,
-                    t);
-        } else {
-            res = dav_query(sn, "get U:crypto-key from %s", path);
-        }
-    }
+    int depth = recursive ? -1 : 1;
+    res = dav_query(
+            sn,
+            "get - from %s where lastmodified > %t with depth %d",
+            path,
+            t,
+            depth);
+    
     if(!res) {
         print_resource_error(sn, path);
         return -1;
@@ -532,6 +512,13 @@
         return -1;
     }
     
+    // disable file decryption, if the -p option is specified
+    char *plain = cmd_getoption(a, "plain");
+    if(plain) {
+        int flags = sn->flags;
+        dav_session_set_flags(sn, flags ^ DAV_SESSION_DECRYPT_CONTENT);
+    }
+    
     /*
      * determine the output file
      * use stdout if the output file is -
@@ -598,62 +585,7 @@
         return -1;
     }
     
-    /*
-     * if the -p (plain) option is specified we don't decrypt files
-     * use a key specified with the -k (key) option, a key from the
-     * key property or the repository default key
-     */
-    void *out_stream = fout;
-    dav_write_func write_func = (dav_write_func)fwrite;
-    AESDecrypter *dec = NULL;
-    char *plain = cmd_getoption(a, "plain");
-    char *keyname = cmd_getoption(a, "key");
-    if(!plain) {
-        char *keyprop = dav_get_property_ns(
-                res,
-                "http://www.uap-core.de/",
-                "crypto-key");
-        Key *key = NULL;
-        char *kn = NULL;
-        if(keyname) {
-            kn = keyname;
-        } else if(keyprop) {
-            kn = keyprop;
-        } else if(repo && repo->decrypt) {
-            kn = repo->default_key;
-        }
-        if(kn) {
-            key = get_key(kn);
-            if(!key) {
-                fprintf(stderr, "Key %s not found!\n", kn);
-                // TODO: free
-                if(cmd_getoption(a, "recursive")) {
-                    // skip the file in recursive mode
-                    char *res_url = util_concat_path(
-                            res->session->base_url,
-                            res->path);
-                    printf("Skipping resource: %s\n", res_url);
-                    free(res_url);
-                    return 0;
-                } else {
-                    printf("Abort.\n");
-                    // abort
-                    return 1;
-                }
-            }
-        }
-        
-        if(key) {
-            dec = aes_decrypter_new(key, fout, (dav_write_func)fwrite);
-            out_stream = dec;
-            write_func = (dav_write_func)aes_write;
-        }
-    }
-    
-    int ret = dav_get_content(res, out_stream, write_func);
-    if(dec) {
-        aes_decrypter_close(dec);
-    }
+    int ret = dav_get_content(res, fout, (dav_write_func)fwrite);
     fclose(fout);
     if(ret && strcmp(out, "-")) {
         unlink(out);
@@ -672,9 +604,31 @@
     char *url = a->argv[0];
     char *file = a->argv[1];
     char *path = NULL;
-    DavSession *sn = NULL;
     Repository *repo = url2repo(url, &path);
-    sn = dav_session_new_auth(ctx, repo->url, repo->user, repo->password);
+    DavSession *sn = dav_session_new_auth(ctx, repo->url, repo->user, repo->password);
+    dav_session_set_flags(sn, get_repository_flags(repo));
+    sn->key = dav_context_get_key(ctx, repo->default_key);
+    
+    // disable file encryption if the -p option is specified
+    char *plain = cmd_getoption(a, "plain");
+    if(plain) {
+        int flags = sn->flags;
+        dav_session_set_flags(sn, flags ^ DAV_SESSION_ENCRYPT_CONTENT);
+        dav_session_set_flags(sn, flags ^ DAV_SESSION_ENCRYPT_NAME);
+    }
+    
+    // override the session key if the -k option is specified
+    char *keyname = cmd_getoption(a, "key");
+    if(keyname) {
+        DavKey *key = dav_context_get_key(ctx, keyname);
+        if(key) {
+            sn->key = key;
+        } else {
+            fprintf(stderr, "Key %s not found!\nAbort.\n", keyname);
+            // TODO: free
+            return -1;
+        }
+    }
     
     int ret;
     if(!strcmp(file, "-")) {
@@ -766,32 +720,12 @@
         free(path);
         path = newpath;
         res = dav_resource_new(sn, path);
+        int ret = put_file(repo, a, sn, res->path, NULL, in);
+        // TODO: free res
+        return ret;
     }
     
-    AESEncrypter *enc = NULL;
-    char *keyname = cmd_getoption(a, "key");
-    char *kn = NULL;
-    char *plain = cmd_getoption(a, "plain");
-    if(!plain && (keyname || repo)) {
-        kn = keyname ? keyname : repo->default_key;
-        if(kn) {
-            Key *key = get_key(kn);
-            if(!key) {
-                fprintf(stderr, "Key %s not found!\nAbort.\n", kn);
-                // TODO: free
-                return -1;
-            }
-            if(keyname || repo->encrypt) {
-                enc = aes_encrypter_new(key, in, (dav_read_func)fread);
-            }
-        }
-    }
-    if(enc) {
-        dav_set_content(res, enc, (dav_read_func)aes_read);
-        dav_set_property_ns(res, "http://www.uap-core.de/", "crypto-key", kn);
-    } else {
-        dav_set_content(res, in, (dav_read_func)fread);
-    }
+    dav_set_content(res, in, (dav_read_func)fread);
     
     if(dav_store(res)) {
         print_resource_error(sn, res->path);
@@ -802,9 +736,6 @@
         fclose(in);
         return -1;
     }
-    if(enc) {
-        aes_encrypter_close(enc);
-    }
     return 0;
 }
 
@@ -818,9 +749,10 @@
     
     char *url = a->argv[0];
     char *path = NULL;
-    DavSession *sn = NULL;
     Repository *repo = url2repo(url, &path);
-    sn = dav_session_new_auth(ctx, repo->url, repo->user, repo->password);
+    DavSession *sn = dav_session_new_auth(ctx, repo->url, repo->user, repo->password);
+    dav_session_set_flags(sn, get_repository_flags(repo));
+    sn->key = dav_context_get_key(ctx, repo->default_key);
     
     DavResource *res = dav_resource_new(sn, path);
     if(!res) {
@@ -846,9 +778,31 @@
     
     char *url = a->argv[0];
     char *path = NULL;
-    DavSession *sn = NULL;
     Repository *repo = url2repo(url, &path);
-    sn = dav_session_new_auth(ctx, repo->url, repo->user, repo->password);
+    DavSession *sn = dav_session_new_auth(ctx, repo->url, repo->user, repo->password);
+    dav_session_set_flags(sn, get_repository_flags(repo));
+    sn->key = dav_context_get_key(ctx, repo->default_key);
+    
+    // disable file encryption if the -p option is specified
+    char *plain = cmd_getoption(a, "plain");
+    if(plain) {
+        int flags = sn->flags;
+        dav_session_set_flags(sn, flags ^ DAV_SESSION_ENCRYPT_CONTENT);
+        dav_session_set_flags(sn, flags ^ DAV_SESSION_ENCRYPT_NAME);
+    }
+    
+    // override the session key if the -k option is specified
+    char *keyname = cmd_getoption(a, "key");
+    if(keyname) {
+        DavKey *key = dav_context_get_key(ctx, keyname);
+        if(key) {
+            sn->key = key;
+        } else {
+            fprintf(stderr, "Key %s not found!\nAbort.\n", keyname);
+            // TODO: free
+            return -1;
+        }
+    }
     
     DavResource *res = dav_resource_new(sn, path);
     if(!res) {
@@ -891,9 +845,10 @@
     } else if (a->argc == 1) {
         char *url = a->argv[0];
         char *path = NULL;
-        DavSession *sn = NULL;
         Repository *repo = url2repo(url, &path);
-        sn = dav_session_new_auth(ctx, repo->url, repo->user, repo->password);
+        DavSession *sn = dav_session_new_auth(ctx, repo->url, repo->user, repo->password);
+        dav_session_set_flags(sn, get_repository_flags(repo));
+        sn->key = dav_context_get_key(ctx, repo->default_key);
 
         DavResource *res = dav_resource_new(sn, path);
         char *date = NULL;
@@ -909,6 +864,7 @@
         fprintf(stderr, "Too many arguments\n");
         return -1;
     }
+    return 0;
 }
 
 int cmd_sync(CmdArgs *a) {

mercurial