test/ctestfile.c

Wed, 10 Feb 2016 12:34:31 +0100

author
universe
date
Wed, 10 Feb 2016 12:34:31 +0100
changeset 31
50ae611a785c
parent 25
f82aa7afe872
child 33
d7b475e4363c
permissions
-rw-r--r--

fixed corrupted multi line comments, when a blank line (containing only white spaces) is present in the comment

     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"
    51 /* -------------------- This is a testing file. -------------------------- */
    52 /*
    53 time_t util_parse_creationdate(char *str) {
    54     // example: 2012-11-29T21:35:35Z
    55     if(!str) {
    56         return 0;
    57     }
    58     // TODO
    59     return 0;
    60 }
    61 */
    62 time_t util_parse_lastmodified(char *str) {
    63     // example: Thu, 29 Nov 2012 21:35:35 GMT
    64     if(!str) {
    65         return 0;
    66     } else {
    67         return curl_getdate(str, NULL);
    68     }
    69 }
    71 int util_getboolean(char *v) {
    72     if(v[0] == 'T' || v[0] == 't') {
    73         return 1;
    74     }
    75     return 0;
    76 }
    78 int util_strtoint(char *str, int64_t *value) {
    79     char *end;
    80     int64_t val = strtoll(str, &end, 0);
    81     if(strlen(end) == 0) {
    82         *value = val;
    83         return 1;
    84     } else {
    85         return 0;
    86     }
    87 }
    89 char* util_url_path(char *url) { 
    90     char *path = NULL;
    91     size_t len = strlen(url);
    92     int slashcount = 0;
    93     int slmax;
    94     if(len > 7 && !strncasecmp(url, "http://", 7)) {
    95         slmax = 3;
    96     } else if(len > 8 && !strncasecmp(url, "https://", 8)) {
    97         slmax = 3;
    98     } else {
    99         slmax = 1;
   100     }
   101     char c;
   102     for(int i=0;i<len;i++) {
   103         c = url[i];
   104         if(c == '/') {
   105             slashcount++;
   106             if(slashcount == slmax) {
   107                 path = url + i;
   108                 break;
   109             }
   110         }
   111     } 
   112     return path;
   113 }
   115 char* util_url_decode(DavSession *sn, char *url) {
   116     char *unesc = curl_easy_unescape(sn->handle, url, strlen(url), NULL);
   117     char *ret = strdup(unesc);
   118     curl_free(unesc);
   119     return ret;
   120 }
   122 char* util_resource_name(char *url) {
   123     int si = 0;
   124     int osi = 0;
   125     int i = 0;
   126     int p = 0;
   127     char c;
   128     while((c = url[i]) != 0) {
   129         if(c == '/') {
   130             osi = si;
   131             si = i;
   132             p = 1;
   133         }
   134         i++;
   135     }
   137     char *name = url + si + p;
   138     if(name[0] == 0) {
   139         name = url + osi + p;
   140         if(name[0] == 0) {
   141             return url;
   142         }
   143     }
   145     return name;
   146 }
   148 int util_mkdir(char *path, mode_t mode) {
   149 #ifdef _WIN32
   150     return mkdir(path);
   151 #else
   152     return mkdir(path, mode);
   153 #endif
   154 }
   156 char* util_concat_path(char *url_base, char *p) {
   157     sstr_t base = sstr(url_base);
   158     sstr_t path;
   159     if(p) {
   160         path = sstr(p);
   161     } else {
   162         path = sstrn("", 0);
   163     }
   165     int add_separator = 0;
   166     if(base.ptr[base.length-1] == '/') {
   167         if(path.ptr[0] == '/') {
   168             base.length--;
   169         }
   170     } else {
   171         if(path.length == 0 || path.ptr[0] != '/') {
   172             add_separator = 1;
   173         }
   174     }
   176     sstr_t url;
   177     if(add_separator) {
   178         url = sstrcat(3, base, sstr("/"), path);
   179     } else {
   180         url = sstrcat(2, base, path);
   181     }
   183     return url.ptr;
   184 }
   186 void util_set_url(DavSession *sn, char *href) {
   187     sstr_t base = sstr(sn->base_url);
   188     sstr_t href_str = sstr(href);
   190     char *base_path = util_url_path(sn->base_url);
   191     base.length -= strlen(base_path);
   193     sstr_t url = sstrcat(2, base, href_str);
   195     curl_easy_setopt(sn->handle, CURLOPT_URL, url.ptr);
   196     free(url.ptr);
   197 }
   199 char* util_path_to_url(DavSession *sn, char *path) {
   200     char *space = malloc(256);
   201     UcxBuffer *url = ucx_buffer_new(space, 256, UCX_BUFFER_AUTOEXTEND);
   203     // add base url
   204     ucx_buffer_write(sn->base_url, 1, strlen(sn->base_url), url);
   205     // remove trailing slash
   206     ucx_buffer_seek(url, -1, SEEK_CUR);
   208     sstr_t p = sstr(path);
   209     ssize_t ntk = 0;
   210     sstr_t *tks = sstrsplit(p, S("/"), &ntk);
   212     for(int i=0;i<ntk;i++) {
   213         sstr_t node = tks[i];
   214         if(node.length > 0) {
   215             char *esc = curl_easy_escape(sn->handle, node.ptr, node.length);
   216             ucx_buffer_putc(url, '/');
   217             ucx_buffer_write(esc, 1, strlen(esc), url);
   218             curl_free(esc);
   219         }
   220         free(node.ptr);
   221     }
   222     free(tks);
   223     if(path[p.length-1] == '/') {
   224         ucx_buffer_putc(url, '/');
   225     }
   226     ucx_buffer_putc(url, 0);
   228     space = url->space;
   229     ucx_buffer_free(url);
   231     return space;
   232 }
   234 char* util_parent_path(char *path) {
   235     char *name = util_resource_name(path);
   236     size_t namelen = strlen(name);
   237     size_t pathlen = strlen(path);
   238     size_t parentlen = pathlen - namelen;
   239     char *parent = malloc(parentlen + 1);
   240     memcpy(parent, path, parentlen);
   241     parent[parentlen] = '\0';
   242     return parent;
   243 }
   246 char* util_xml_get_text(xmlNode *elm) {
   247     xmlNode *node = elm->children;
   248     while(node) {
   249         if(node->type == XML_TEXT_NODE) {
   250             return (char*)node->content;
   251         }
   252         node = node->next;
   253     }
   254     return NULL;
   255 }
   258 char* util_base64decode(char *in) {
   259     int len = 0;
   260     return util_base64decode_len(in, &len);
   261 }
   263 char* util_base64decode_len(char* in, int *outlen) {
   264     size_t len = strlen(in);
   265     char *out = calloc(1, len);
   267     BIO* b = BIO_new_mem_buf(in, len);
   268     BIO *d = BIO_new(BIO_f_base64());
   269     BIO_set_flags(d, BIO_FLAGS_BASE64_NO_NL);
   270     b = BIO_push(d, b);
   272     *outlen = BIO_read(b, out, len);
   273     BIO_free_all(b);
   275     return out;
   276 }
   278 char* util_base64encode(char *in, size_t len) { 
   279     BIO *b;
   280     BIO *e;
   281     BUF_MEM *mem;
   283     e = BIO_new(BIO_f_base64());
   284     b = BIO_new(BIO_s_mem());
   286     e = BIO_push(e, b);
   287     BIO_write(e, in, len);
   288     BIO_flush(e);
   290     BIO_get_mem_ptr(e, &mem);
   291     char *out = malloc(mem->length);
   292     memcpy(out, mem->data, mem->length -1);
   293     out[mem->length - 1] = '\0';
   295     BIO_free_all(e);
   297     return out;
   298 }
   300 char* util_encrypt_str(DavSession *sn, char *str, char *key) {
   301     DavKey *k = dav_context_get_key(sn->context, key);
   302     if(!k) {
   303         // TODO: session error
   304         return NULL;
   305     }
   307     char *enc_str = aes_encrypt(str, k);
   308     char *ret_str = dav_session_strdup(sn, enc_str);
   309     free(enc_str);
   310     return ret_str;
   311 }
   313 /* commented out for testing reasons */
   314 /*
   315 char* util_decrypt_str(DavSession *sn, char *str, char *key) {
   316     DavKey *k = dav_context_get_key(sn->context, key);
   317     if(!k) {
   318         // TODO: session error
   319         return NULL;
   320     }
   322     char *dec_str = aes_decrypt(str, k);
   323     char *ret_str = dav_session_strdup(sn, dec_str);
   324     free(dec_str);
   325     return ret_str;
   326 }
   327 */
   328 char* util_random_str() {
   329     unsigned char *str = malloc(25);
   330     str[24] = '\0';
   332     sstr_t t = S(
   333             "01234567890"
   334             "abcdefghijklmnopqrstuvwxyz"
   335             "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
   336     const unsigned char *table = (const unsigned char*)t.ptr;
   338     RAND_pseudo_bytes(str, 24);
   339     for(int i=0;i<24;i++) {
   340         int c = str[i] % t.length;
   341         str[i] = table[c];
   342     }
   344     return (char*)str;
   345 }
   347 /*
   348  * gets a substring from 0 to the appearance of the token
   349  * tokens are separated by space
   350  * sets sub to the substring and returns the remaining string
   351  */
   352 sstr_t util_getsubstr_until_token(sstr_t str, sstr_t token, sstr_t *sub) {  
   353     int i;
   354     int token_start = -1;
   355     int token_end = -1;
   356     for(i=0;i<=str.length;i++) {
   357         int c;
   358         if(i == str.length) {
   359             c = ' ';
   360         } else {
   361             c = str.ptr[i];
   362         }
   363         if(c < 33) {
   364             if(token_start != -1) {
   365                 token_end = i;
   366                 size_t len = token_end - token_start;
   367                 sstr_t tk = sstrsubsl(str, token_start, len);
   368                 //printf("token: {%.*s}\n", token.length, token.ptr);
   369                 if(!sstrcmp(tk, token)) {
   370                     *sub = sstrtrim(sstrsubsl(str, 0, token_start));
   371                     break;
   372                 }
   373                 token_start = -1;
   374                 token_end = -1;
   375             }
   376         } else {
   377             if(token_start == -1) {
   378                 token_start = i;
   379             }
   380         }
   381     }
   383     if(i < str.length) {
   384         return sstrtrim(sstrsubs(str, i));
   385     } else {
   386         str.ptr = NULL;
   387         str.length = 0;
   388         return str;
   389     }
   390 }

mercurial