diff -r 6518b035a9df -r 03076907b58a dav/main.c --- 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 +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 ] \n"); fprintf( stderr, - " get [-pR] [-k ] [-o ] [-u ] \n"); + " get [-pR] [-o ] [-u ] \n"); fprintf(stderr, " put [-pR] [-k ] \n"); - fprintf(stderr, " mkdir \n"); + fprintf(stderr, " mkdir [-p] [-k ] \n"); fprintf(stderr, " remove \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) {