# HG changeset patch # User Olaf Wintermann # Date 1432885690 -7200 # Node ID 451607eeff05a72c2fe940c44eb1bd7fa9a09308 # Parent 1e2b1005004c837571ec0521eee787e7ff02529b added initial code for config commands diff -r 1e2b1005004c -r 451607eeff05 dav/config.c --- a/dav/config.c Thu May 28 14:34:46 2015 +0200 +++ b/dav/config.c Fri May 29 09:48:10 2015 +0200 @@ -136,82 +136,30 @@ ucx_map_free(keys); } -void load_repository(xmlNode *reponode) { - xmlNode *node = reponode->children; +Repository* repository_new() { Repository *repo = calloc(1, sizeof(Repository)); repo->encrypt_name = false; repo->encrypt_content = false; repo->decrypt_name = false; repo->decrypt_content = true; repo->ssl_version = CURL_SSLVERSION_DEFAULT; + return repo; +} + +void load_repository(xmlNode *reponode) { + xmlNode *node = reponode->children; + Repository *repo = repository_new(); while(node) { if(node->type == XML_ELEMENT_NODE) { + char *name = (char*)node->name; char *value = util_xml_get_text(node); - if(!value) { - // next - } else if(xstreq(node->name, "name")) { - repo->name = strdup(value); - } else if(xstreq(node->name, "url")) { - repo->url = strdup(value); - } else if(xstreq(node->name, "user")) { - repo->user = strdup(value); - } else if(xstreq(node->name, "password")) { - repo->password = util_base64decode(value); - } else if(xstreq(node->name, "default-key")) { - repo->default_key = strdup(value); - } else if(xstreq(node->name, "full-encryption")) { - if(util_getboolean(value)) { - repo->encrypt_name = true; - repo->encrypt_content = true; - repo->decrypt_name = true; - repo->decrypt_content = true; - } - } else if(xstreq(node->name, "content-encryption")) { - if(util_getboolean(value)) { - repo->encrypt_content = true; - repo->decrypt_content = true; - } else { - repo->encrypt_content = false; + if(value) { + if(repo_add_config(repo, name, value)) { + fprintf( + stderr, + "Unkown repository config element: %s\n", + name); } - } else if(xstreq(node->name, "decrypt-content")) { - repo->decrypt_content = util_getboolean(value); - } else if(xstreq(node->name, "decrypt-name")) { - repo->decrypt_name = util_getboolean(value); - } else if(xstreq(node->name, "ssl-version")) { - if(xstrEQ(value, "TLSv1")) { - repo->ssl_version = CURL_SSLVERSION_TLSv1; - } else if(xstrEQ(value, "SSLv2")) { - repo->ssl_version = CURL_SSLVERSION_SSLv2; - } else if(xstrEQ(value, "SSLv3")) { - repo->ssl_version = CURL_SSLVERSION_SSLv3; - } -#if LIBCURL_VERSION_MAJOR >= 7 -#if LIBCURL_VERSION_MINOR >= 34 - else if(xstrEQ(value, "TLSv1.0")) { - repo->ssl_version = CURL_SSLVERSION_TLSv1_0; - } else if(xstrEQ(value, "TLSv1.1")) { - repo->ssl_version = CURL_SSLVERSION_TLSv1_1; - } else if(xstrEQ(value, "TLSv1.2")) { - repo->ssl_version = CURL_SSLVERSION_TLSv1_2; - } -#endif -#endif - else { - fprintf(stderr, "Unknown ssl version: %s\n", value); - } - } else if(xstreq(node->name, "encrypt") || xstreq(node->name, "store-key-property") || xstreq(node->name, "decrypt")) { - fprintf(stderr, "Error: config.xml contains deprecated elements\n"); - fprintf(stderr, "The elements , and are removed\n"); - fprintf(stderr, "Use the following: \n\n"); - fprintf(stderr, "true\n"); - fprintf(stderr, "enables file content encryption and decryption\n\n"); - fprintf(stderr, "true\n"); - fprintf(stderr, "enables content and file name encryption/decryption\n\n"); - fprintf(stderr, "$BOOL\n"); - fprintf(stderr, "only enables/disables content decryption\n\n"); - fprintf(stderr, "$BOOL\n"); - fprintf(stderr, "only enables/disables name decryption\n\n"); - exit(-1); } } node = node->next; @@ -236,6 +184,63 @@ ucx_map_cstr_put(repos, repo->name, repo); } +int repo_add_config(Repository *repo, char *key, char *value) { + if(xstreq(key, "name")) { + repo->name = strdup(value); + } else if(xstreq(key, "url")) { + repo->url = strdup(value); + } else if(xstreq(key, "user")) { + repo->user = strdup(value); + } else if(xstreq(key, "password")) { + repo->password = util_base64decode(value); + } else if(xstreq(key, "default-key")) { + repo->default_key = strdup(value); + } else if(xstreq(key, "full-encryption")) { + if(util_getboolean(value)) { + repo->encrypt_name = true; + repo->encrypt_content = true; + repo->decrypt_name = true; + repo->decrypt_content = true; + } + } else if(xstreq(key, "content-encryption")) { + if(util_getboolean(value)) { + repo->encrypt_content = true; + repo->decrypt_content = true; + } else { + repo->encrypt_content = false; + } + } else if(xstreq(key, "decrypt-content")) { + repo->decrypt_content = util_getboolean(value); + } else if(xstreq(key, "decrypt-name")) { + repo->decrypt_name = util_getboolean(value); + } else if(xstreq(key, "ssl-version")) { + if(xstrEQ(value, "TLSv1")) { + repo->ssl_version = CURL_SSLVERSION_TLSv1; + } else if(xstrEQ(value, "SSLv2")) { + repo->ssl_version = CURL_SSLVERSION_SSLv2; + } else if(xstrEQ(value, "SSLv3")) { + repo->ssl_version = CURL_SSLVERSION_SSLv3; + } +#if LIBCURL_VERSION_MAJOR >= 7 +#if LIBCURL_VERSION_MINOR >= 34 + else if(xstrEQ(value, "TLSv1.0")) { + repo->ssl_version = CURL_SSLVERSION_TLSv1_0; + } else if(xstrEQ(value, "TLSv1.1")) { + repo->ssl_version = CURL_SSLVERSION_TLSv1_1; + } else if(xstrEQ(value, "TLSv1.2")) { + repo->ssl_version = CURL_SSLVERSION_TLSv1_2; + } +#endif +#endif + else { + fprintf(stderr, "Unknown ssl version: %s\n", value); + } + } else { + return -1; + } + return 0; +} + void load_proxy(xmlNode *proxynode, int type) { Proxy *proxy; const char *stype; @@ -393,3 +398,4 @@ Proxy* get_https_proxy() { return https_proxy; } + diff -r 1e2b1005004c -r 451607eeff05 dav/config.h --- a/dav/config.h Thu May 28 14:34:46 2015 +0200 +++ b/dav/config.h Fri May 29 09:48:10 2015 +0200 @@ -79,7 +79,10 @@ void load_proxy(xmlNode *proxynode, int type); sstr_t load_key_file(char *filename); +Repository* repository_new(); + Repository* get_repository(sstr_t name); +int repo_add_config(Repository *repo, char *key, char *value); int get_repository_flags(Repository *repo); DavSession *repository_session(Repository *repo); Key* get_key(char *name); diff -r 1e2b1005004c -r 451607eeff05 dav/main.c --- a/dav/main.c Thu May 28 14:34:46 2015 +0200 +++ b/dav/main.c Fri May 29 09:48:10 2015 +0200 @@ -109,6 +109,8 @@ ret = cmd_get_property(args); } else if(!strcasecmp(cmd, "info")) { ret = cmd_info(args); + } else if(!strcasecmp(cmd, "add-repository")) { + ret = cmd_add_repository(args); } else { print_usage(argv[0]); } @@ -1118,3 +1120,120 @@ } } +/* ---------- config commands ---------- */ + +static int getkeyvalue(char *arg, char **key, char **value) { + // splits a key=value arg + + *key = NULL; + *value = NULL; + if(!arg && !key && !value) { + return -1; + } + + int haskey = 0; + size_t len = strlen(arg); + + if(len < 3) { + return -1; + } + + int i; + for(i=0;ioptions, "interactive", NOARG); + break; + } } } } else if(option) { diff -r 1e2b1005004c -r 451607eeff05 libidav/utils.c --- a/libidav/utils.c Thu May 28 14:34:46 2015 +0200 +++ b/libidav/utils.c Fri May 29 09:48:10 2015 +0200 @@ -384,3 +384,16 @@ return str; } } + +sstr_t util_readline(FILE *stream) { + UcxBuffer *buf = ucx_buffer_new(NULL, 128, UCX_BUFFER_AUTOEXTEND); + + int c; + while((c = fgetc(stream)) != '\n') { + ucx_buffer_putc(buf, c); + } + + sstr_t str = sstrdup(sstrtrim(sstrn(buf->space, buf->size))); + ucx_buffer_free(buf); + return str; +} diff -r 1e2b1005004c -r 451607eeff05 libidav/utils.h --- a/libidav/utils.h Thu May 28 14:34:46 2015 +0200 +++ b/libidav/utils.h Fri May 29 09:48:10 2015 +0200 @@ -83,6 +83,8 @@ sstr_t util_getsubstr_until_token(sstr_t str, sstr_t token, sstr_t *sub); +sstr_t util_readline(FILE *stream); + #ifdef __cplusplus } #endif