test/ctestfile.c

Mon, 13 Nov 2017 13:52:00 +0100

author
Mike Becker <universe@uap-core.de>
date
Mon, 13 Nov 2017 13:52:00 +0100
changeset 61
47a5fc33590a
parent 33
d7b475e4363c
child 66
1b12cf799fee
permissions
-rw-r--r--

ucx is now used as external library

     1 /*
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * Copyright 2015 Olaf Wintermann. All rights reserved.
     5  *
     6  * Redistribution and use in source and binary forms, with or without
     7  * modification, are permitted provided that the following conditions are met:
     8  *
     9  *   1. Redistributions of source code must retain the above copyright
    10  *      notice, this list of conditions and the following disclaimer.
    11  *
    12  *   2. Redistributions in binary form must reproduce the above copyright
    13  *      notice, this list of conditions and the following disclaimer in the
    14  *      documentation and/or other materials provided with the distribution.
    15  *
    16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    19  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
    20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    26  * POSSIBILITY OF SUCH DAMAGE.
    27  */
    29 #include <time.h>
    30 #include <stdio.h>
    31 #include <stdlib.h>
    32 #include <string.h>
    33 #include <ucx/string.h>
    34 #include <ucx/buffer.h>
    35 #include <ucx/utils.h>
    36 #include <libxml/tree.h>
    37 #include <curl/curl.h>
    39 #include <openssl/sha.h>
    40 #include <openssl/hmac.h>
    41 #include <openssl/evp.h>
    42 #include <openssl/bio.h>
    43 #include <openssl/buffer.h>
    44 #include <openssl/rand.h>
    46 #include "utils.h"
    47 #include "crypto.h"
    48 #include "webdav.h"
    50 #define MACRO1337 1337L
    52 /* -------------------- This is a testing file. -------------------------- */
    53 /*
    54 time_t util_parse_creationdate(char *str) {
    55     // example: 2012-11-29T21:35:35Z
    56     if(!str) {
    57         return 0;
    58     }
    59     // TODO
    60     return 0;
    61 }
    62 */
    63 time_t util_parse_lastmodified(char *str) {
    64     // example: Thu, 29 Nov 2012 21:35:35 GMT
    65     if(!str) {
    66         return 0;
    67     } else {
    68         return curl_getdate(str, NULL);
    69     }
    70 }
    72 int util_getboolean(char *v) {
    73     if(v[0] == 'T' || v[0] == 't') {
    74         return 1;
    75     }
    76     return 0;
    77 }
    79 int util_strtoint(char *str, int64_t *value) {
    80     char *end;
    81     int64_t val = strtoll(str, &end, 0);
    82     if(strlen(end) == 0) {
    83         *value = val;
    84         return 1;
    85     } else {
    86         return 0;
    87     }
    88 }
    90 char* util_url_path(char *url) { 
    91     char *path = NULL;
    92     size_t len = strlen(url);
    93     int slashcount = 0;
    94     int slmax;
    95     if(len > 7 && !strncasecmp(url, "http://", 7)) {
    96         slmax = 3;
    97     } else if(len > 8 && !strncasecmp(url, "https://", 8)) {
    98         slmax = 3;
    99     } else {
   100         slmax = 1;
   101     }
   102     char c;
   103     for(int i=0;i<len;i++) {
   104         c = url[i];
   105         if(c == '/') {
   106             slashcount++;
   107             if(slashcount == slmax) {
   108                 path = url + i;
   109                 break;
   110             }
   111         }
   112     } 
   113     return path;
   114 }
   116 char* util_url_decode(DavSession *sn, char *url) {
   117     char *unesc = curl_easy_unescape(sn->handle, url, strlen(url), NULL);
   118     char *ret = strdup(unesc);
   119     curl_free(unesc);
   120     return ret;
   121 }
   123 char* util_resource_name(char *url) {
   124     int si = 0;
   125     int osi = 0;
   126     int i = 0;
   127     int p = 0;
   128     char c;
   129     while((c = url[i]) != 0) {
   130         if(c == '/') {
   131             osi = si;
   132             si = i;
   133             p = 1;
   134         }
   135         i++;
   136     }
   138     char *name = url + si + p;
   139     if(name[0] == 0) {
   140         name = url + osi + p;
   141         if(name[0] == 0) {
   142             return url;
   143         }
   144     }
   146     return name;
   147 }
   149 int util_mkdir(char *path, mode_t mode) {
   150 #ifdef _WIN32
   151     return mkdir(path);
   152 #else
   153     return mkdir(path, mode);
   154 #endif
   155 }
   157 char* util_concat_path(char *url_base, char *p) {
   158     sstr_t base = sstr(url_base);
   159     sstr_t path;
   160     if(p) {
   161         path = sstr(p);
   162     } else {
   163         path = sstrn("", 0);
   164     }
   166     int add_separator = 0;
   167     if(base.ptr[base.length-1] == '/') {
   168         if(path.ptr[0] == '/') {
   169             base.length--;
   170         }
   171     } else {
   172         if(path.length == 0 || path.ptr[0] != '/') {
   173             add_separator = 1;
   174         }
   175     }
   177     sstr_t url;
   178     if(add_separator) {
   179         url = sstrcat(3, base, sstr("/"), path);
   180     } else {
   181         url = sstrcat(2, base, path);
   182     }
   184     return url.ptr;
   185 }
   187 void util_set_url(DavSession *sn, char *href) {
   188     sstr_t base = sstr(sn->base_url);
   189     sstr_t href_str = sstr(href);
   191     char *base_path = util_url_path(sn->base_url);
   192     base.length -= strlen(base_path);
   194     sstr_t url = sstrcat(2, base, href_str);
   196     curl_easy_setopt(sn->handle, CURLOPT_URL, url.ptr);
   197     free(url.ptr);
   198 }
   200 char* util_path_to_url(DavSession *sn, char *path) {
   201     char *space = malloc(256);
   202     UcxBuffer *url = ucx_buffer_new(space, 256, UCX_BUFFER_AUTOEXTEND);
   204     // add base url
   205     ucx_buffer_write(sn->base_url, 1, strlen(sn->base_url), url);
   206     // remove trailing slash
   207     ucx_buffer_seek(url, -1, SEEK_CUR);
   209     sstr_t p = sstr(path);
   210     ssize_t ntk = 0;
   211     sstr_t *tks = sstrsplit(p, S("/"), &ntk);
   213     for(int i=0;i<ntk;i++) {
   214         sstr_t node = tks[i];
   215         if(node.length > 0) {
   216             char *esc = curl_easy_escape(sn->handle, node.ptr, node.length);
   217             ucx_buffer_putc(url, '/');
   218             ucx_buffer_write(esc, 1, strlen(esc), url);
   219             curl_free(esc);
   220         }
   221         free(node.ptr);
   222     }
   223     free(tks);
   224     if(path[p.length-1] == '/') {
   225         ucx_buffer_putc(url, '/');
   226     }
   227     ucx_buffer_putc(url, 0);
   229     space = url->space;
   230     ucx_buffer_free(url);
   232     return space;
   233 }
   235 char* util_parent_path(char *path) {
   236     char *name = util_resource_name(path);
   237     size_t namelen = strlen(name);
   238     size_t pathlen = strlen(path);
   239     size_t parentlen = pathlen - namelen;
   240     char *parent = malloc(parentlen + 1);
   241     memcpy(parent, path, parentlen);
   242     parent[parentlen] = '\0';
   243     return parent;
   244 }
   247 char* util_xml_get_text(xmlNode *elm) {
   248     xmlNode *node = elm->children;
   249     while(node) {
   250         if(node->type == XML_TEXT_NODE) {
   251             return (char*)node->content;
   252         }
   253         node = node->next;
   254     }
   255     return NULL;
   256 }
   259 char* util_base64decode(char *in) {
   260     int len = 0;
   261     return util_base64decode_len(in, &len);
   262 }
   264 char* util_base64decode_len(char* in, int *outlen) {
   265     size_t len = strlen(in);
   266     char *out = calloc(1, len);
   268     BIO* b = BIO_new_mem_buf(in, len);
   269     BIO *d = BIO_new(BIO_f_base64());
   270     BIO_set_flags(d, BIO_FLAGS_BASE64_NO_NL);
   271     b = BIO_push(d, b);
   273     *outlen = BIO_read(b, out, len);
   274     BIO_free_all(b);
   276     return out;
   277 }
   279 char* util_base64encode(char *in, size_t len) { 
   280     BIO *b;
   281     BIO *e;
   282     BUF_MEM *mem;
   284     e = BIO_new(BIO_f_base64());
   285     b = BIO_new(BIO_s_mem());
   287     e = BIO_push(e, b);
   288     BIO_write(e, in, len);
   289     BIO_flush(e);
   291     BIO_get_mem_ptr(e, &mem);
   292     char *out = malloc(mem->length);
   293     memcpy(out, mem->data, mem->length -1);
   294     out[mem->length - 1] = '\0';
   296     BIO_free_all(e);
   298     return out;
   299 }
   301 char* util_encrypt_str(DavSession *sn, char *str, char *key) {
   302     DavKey *k = dav_context_get_key(sn->context, key);
   303     if(!k) {
   304         // TODO: session error
   305         return NULL;
   306     }
   308     char *enc_str = aes_encrypt(str, k);
   309     char *ret_str = dav_session_strdup(sn, enc_str);
   310     free(enc_str);
   311     return ret_str;
   312 }
   314 /* commented out for testing reasons */
   315 /*
   316 char* util_decrypt_str(DavSession *sn, char *str, char *key) {
   317     DavKey *k = dav_context_get_key(sn->context, key);
   318     if(!k) {
   319         // TODO: session error
   320         return NULL;
   321     }
   323     char *dec_str = aes_decrypt(str, k);
   324     char *ret_str = dav_session_strdup(sn, dec_str);
   325     free(dec_str);
   326     return ret_str;
   327 }
   328 */
   329 char* util_random_str() {
   330     unsigned char *str = malloc(25);
   331     str[24] = '\0';
   333     sstr_t t = S(
   334             "01234567890"
   335             "abcdefghijklmnopqrstuvwxyz"
   336             "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
   337     const unsigned char *table = (const unsigned char*)t.ptr;
   339     RAND_pseudo_bytes(str, 24);
   340     for(int i=0;i<24;i++) {
   341         int c = str[i] % t.length;
   342         str[i] = table[c];
   343     }
   345     return (char*)str;
   346 }
   348 /*
   349  * gets a substring from 0 to the appearance of the token
   350  * tokens are separated by space
   351  * sets sub to the substring and returns the remaining string
   352  */
   353 sstr_t util_getsubstr_until_token(sstr_t str, sstr_t token, sstr_t *sub) {  
   354     int i;
   355     int token_start = -1;
   356     int token_end = -1;
   357     for(i=0;i<=str.length;i++) {
   358         int c;
   359         if(i == str.length) {
   360             c = ' ';
   361         } else {
   362             c = str.ptr[i];
   363         }
   364         if(c < 33) {
   365             if(token_start != -1) {
   366                 token_end = i;
   367                 size_t len = token_end - token_start;
   368                 sstr_t tk = sstrsubsl(str, token_start, len);
   369                 //printf("token: {%.*s}\n", token.length, token.ptr);
   370                 if(!sstrcmp(tk, token)) {
   371                     *sub = sstrtrim(sstrsubsl(str, 0, token_start));
   372                     break;
   373                 }
   374                 token_start = -1;
   375                 token_end = -1;
   376             }
   377         } else {
   378             if(token_start == -1) {
   379                 token_start = i;
   380             }
   381         }
   382     }
   384     if(i < str.length) {
   385         return sstrtrim(sstrsubs(str, i));
   386     } else {
   387         str.ptr = NULL;
   388         str.length = 0;
   389         return str;
   390     }
   391 }

mercurial