src/message_api.c
author vb
Wed, 31 Dec 2014 00:19:21 +0100
changeset 43 816f4ccf84da
parent 42 d7263ab3b539
child 44 4013b57a6a69
permissions -rw-r--r--
message format
vb@37
     1
#include "message_api.h"
vb@37
     2
#include "keymanagement.h"
vb@37
     3
vb@37
     4
#include <libetpan/libetpan.h>
vb@37
     5
#include <assert.h>
vb@37
     6
#include <string.h>
vb@39
     7
#include <stdlib.h>
vb@39
     8
vb@39
     9
#define NOT_IMPLEMENTED assert(0);
vb@37
    10
vb@37
    11
PEP_STATUS encrypt_message(
vb@37
    12
        PEP_SESSION session,
vb@37
    13
        const message *src,
vb@37
    14
        stringlist_t * extra,
vb@38
    15
        message **dst,
vb@38
    16
        PEP_enc_format format
vb@37
    17
    )
vb@37
    18
{
vb@37
    19
    PEP_STATUS status = PEP_STATUS_OK;
vb@37
    20
vb@37
    21
    assert(session);
vb@37
    22
    assert(src);
vb@37
    23
    assert(dst);
vb@37
    24
    *dst = NULL;
vb@38
    25
    assert(format != PEP_enc_none);
vb@37
    26
vb@40
    27
    pEp_identity *from = identity_dup(src->from);
vb@40
    28
    if (from == NULL)
vb@40
    29
        return PEP_OUT_OF_MEMORY;
vb@40
    30
vb@40
    31
    identity_list *to = identity_list_dup(src->to);
vb@40
    32
    if (to == NULL) {
vb@40
    33
        free_identity(from);
vb@40
    34
        return PEP_OUT_OF_MEMORY;
vb@40
    35
    }
vb@40
    36
vb@40
    37
    message *msg = new_message(src->dir, from, to, NULL);
vb@37
    38
    if (msg == NULL)
vb@37
    39
        return PEP_OUT_OF_MEMORY;
vb@37
    40
vb@40
    41
    from->me = true;
vb@37
    42
vb@40
    43
    status = myself(session, from);
vb@37
    44
    if (status != PEP_STATUS_OK) {
vb@37
    45
        free_message(msg);
vb@37
    46
        return status;
vb@37
    47
    }
vb@37
    48
vb@40
    49
    stringlist_t * keys = new_stringlist(from->fpr);
vb@37
    50
    if (keys == NULL) {
vb@37
    51
        free_message(msg);
vb@37
    52
        return PEP_OUT_OF_MEMORY;
vb@37
    53
    }
vb@37
    54
vb@39
    55
    stringlist_t *_k = keys;
vb@39
    56
vb@39
    57
    if (extra) {
vb@39
    58
        _k = stringlist_append(_k, extra);
vb@39
    59
        if (_k == NULL) {
vb@39
    60
            free_stringlist(keys);
vb@37
    61
            free_message(msg);
vb@37
    62
            return PEP_OUT_OF_MEMORY;
vb@37
    63
        }
vb@37
    64
    }
vb@39
    65
vb@39
    66
    bool dest_keys_found = false;
vb@37
    67
    identity_list * _il;
vb@40
    68
    for (_il = to; _il && _il->ident; _il = _il->next) {
vb@39
    69
        PEP_STATUS _status = update_identity(session, _il->ident);
vb@39
    70
        if (_status != PEP_STATUS_OK) {
vb@37
    71
            free_message(msg);
vb@37
    72
            free_stringlist(keys);
vb@39
    73
            return _status;
vb@37
    74
        }
vb@37
    75
        if (_il->ident->fpr) {
vb@39
    76
            dest_keys_found = true;
vb@39
    77
            _k = stringlist_add(_k, _il->ident->fpr);
vb@39
    78
            if (_k == NULL) {
vb@37
    79
                free_message(msg);
vb@37
    80
                free_stringlist(keys);
vb@37
    81
                return PEP_OUT_OF_MEMORY;
vb@37
    82
            }
vb@37
    83
        }
vb@37
    84
        else
vb@37
    85
            status = PEP_KEY_NOT_FOUND;
vb@37
    86
    }
vb@37
    87
vb@39
    88
    if (dest_keys_found) {
vb@38
    89
        char *ptext;
vb@37
    90
        char *ctext = NULL;
vb@37
    91
        size_t csize = 0;
vb@37
    92
vb@38
    93
        switch (format) {
vb@38
    94
        case PEP_enc_MIME_multipart:
vb@39
    95
            NOT_IMPLEMENTED
vb@38
    96
            break;
vb@37
    97
vb@38
    98
        case PEP_enc_pieces:
vb@38
    99
            if (src->shortmsg && src->longmsg) {
vb@39
   100
                ptext = calloc(1, strlen(src->shortmsg) + strlen(src->longmsg)
vb@39
   101
                        + 12);
vb@38
   102
                if (ptext == NULL) {
vb@38
   103
                    free_message(msg);
vb@38
   104
                    free_stringlist(keys);
vb@38
   105
                    return PEP_OUT_OF_MEMORY;
vb@38
   106
                }
vb@38
   107
                strcpy(ptext, "subject: ");
vb@38
   108
                strcat(ptext, src->shortmsg);
vb@38
   109
                strcat(ptext, "\n\n");
vb@38
   110
                strcat(ptext, src->longmsg);
vb@39
   111
                status = encrypt_and_sign(session, keys, ptext, strlen(ptext),
vb@39
   112
                        &ctext, &csize);
vb@40
   113
                free(ptext);
vb@38
   114
                if (ctext) {
vb@40
   115
                    msg->longmsg = strdup(ctext);
vb@38
   116
                    msg->shortmsg = strdup("pEp");
vb@40
   117
                    if (!(msg->longmsg && msg->shortmsg)) {
vb@40
   118
                        free_message(msg);
vb@40
   119
                        return PEP_OUT_OF_MEMORY;
vb@40
   120
                    }
vb@38
   121
                }
vb@38
   122
                else {
vb@38
   123
                    free_message(msg);
vb@38
   124
                    msg = NULL;
vb@38
   125
                }
vb@38
   126
            }
vb@38
   127
            else if (src->shortmsg) {
vb@43
   128
                ptext = calloc(1, strlen(src->shortmsg) + 12);
vb@43
   129
                if (ptext == NULL) {
vb@43
   130
                    free_message(msg);
vb@43
   131
                    free_stringlist(keys);
vb@43
   132
                    return PEP_OUT_OF_MEMORY;
vb@43
   133
                }
vb@43
   134
                strcpy(ptext, "subject: ");
vb@43
   135
                strcat(ptext, src->shortmsg);
vb@43
   136
                strcat(ptext, "\n\n");
vb@39
   137
                status = encrypt_and_sign(session, keys, ptext, strlen(ptext),
vb@39
   138
                        &ctext, &csize);
vb@43
   139
                free(ptext);
vb@38
   140
                if (ctext) {
vb@40
   141
                    msg->longmsg = strdup(ctext);
vb@40
   142
                    msg->shortmsg = strdup("pEp");
vb@40
   143
                    if (!(msg->longmsg && msg->shortmsg)) {
vb@40
   144
                        free_message(msg);
vb@40
   145
                        return PEP_OUT_OF_MEMORY;
vb@40
   146
                    }
vb@38
   147
                }
vb@38
   148
                else {
vb@38
   149
                    free_message(msg);
vb@38
   150
                    msg = NULL;
vb@38
   151
                }
vb@38
   152
            }
vb@38
   153
            else if (src->longmsg) {
vb@38
   154
                ptext = src->longmsg;
vb@39
   155
                status = encrypt_and_sign(session, keys, ptext, strlen(ptext),
vb@39
   156
                        &ctext, &csize);
vb@38
   157
                if (ctext) {
vb@40
   158
                    msg->longmsg = strdup(ctext);
vb@38
   159
                    msg->shortmsg = strdup("pEp");
vb@40
   160
                    if (!(msg->longmsg && msg->shortmsg)) {
vb@40
   161
                        free_message(msg);
vb@40
   162
                        return PEP_OUT_OF_MEMORY;
vb@40
   163
                    }
vb@38
   164
                }
vb@38
   165
                else {
vb@38
   166
                    free_message(msg);
vb@38
   167
                    msg = NULL;
vb@38
   168
                }
vb@38
   169
            }
vb@38
   170
            if (msg && msg->longmsg_formatted) {
vb@38
   171
                ptext = src->longmsg_formatted;
vb@39
   172
                status = encrypt_and_sign(session, keys, ptext, strlen(ptext),
vb@39
   173
                        &ctext, &csize);
vb@38
   174
                if (ctext) {
vb@40
   175
                    msg->longmsg_formatted = strdup(ctext);
vb@40
   176
                    if (msg->longmsg_formatted == NULL) {
vb@40
   177
                        free_message(msg);
vb@40
   178
                        return PEP_OUT_OF_MEMORY;
vb@40
   179
                    }
vb@38
   180
                }
vb@38
   181
                else {
vb@38
   182
                    free_message(msg);
vb@38
   183
                    msg = NULL;
vb@38
   184
                }
vb@38
   185
            }
vb@38
   186
            if (msg) {
vb@42
   187
                if (src->attachments) {
vb@42
   188
                    bloblist_t *_s;
vb@42
   189
                    bloblist_t *_d = new_bloblist(NULL, 0, NULL, NULL);
vb@42
   190
                    if (_d == NULL) {
vb@42
   191
                        free_message(msg);
vb@42
   192
                        free_stringlist(keys);
vb@42
   193
                        return PEP_OUT_OF_MEMORY;
vb@42
   194
                    }
vb@42
   195
                    msg->attachments = _d;
vb@42
   196
                    for (_s = src->attachments; _s && _s->data; _s = _s->next) {
vb@42
   197
                        int psize = _s->size;
vb@42
   198
                        ptext = _s->data;
vb@42
   199
                        status = encrypt_and_sign(session, keys, ptext, psize,
vb@42
   200
                                &ctext, &csize);
vb@42
   201
                        if (ctext) {
vb@42
   202
                            char * _c = strdup(ctext);
vb@42
   203
                            if (_c == NULL) {
vb@42
   204
                                free_message(msg);
vb@42
   205
                                free_stringlist(keys);
vb@42
   206
                                return PEP_OUT_OF_MEMORY;
vb@42
   207
                            }
vb@42
   208
                            _d = bloblist_add(_d, _c, csize, _s->mime_type,
vb@42
   209
                                    _s->file_name);
vb@42
   210
                            if (_d == NULL) {
vb@42
   211
                                free_message(msg);
vb@42
   212
                                free_stringlist(keys);
vb@42
   213
                                return PEP_OUT_OF_MEMORY;
vb@42
   214
                            }
vb@42
   215
                        }
vb@42
   216
                        else {
vb@40
   217
                            free_message(msg);
vb@42
   218
                            msg = NULL;
vb@42
   219
                            break;
vb@40
   220
                        }
vb@38
   221
                    }
vb@38
   222
                }
vb@39
   223
                msg->enc_format = PEP_enc_pieces;
vb@38
   224
                *dst = msg;
vb@38
   225
            }
vb@38
   226
            break;
vb@38
   227
vb@38
   228
        default:
vb@38
   229
            assert(0);
vb@37
   230
        }
vb@37
   231
    }
vb@37
   232
    else
vb@37
   233
        free_message(msg);
vb@37
   234
vb@37
   235
    free_stringlist(keys);
vb@37
   236
    return status;
vb@37
   237
}
vb@37
   238
vb@37
   239
PEP_STATUS decrypt_message(
vb@37
   240
        PEP_SESSION session,
vb@37
   241
        const message *src,
vb@37
   242
        message **dst
vb@37
   243
    )
vb@37
   244
{
vb@37
   245
    PEP_STATUS status = PEP_STATUS_OK;
vb@37
   246
vb@39
   247
    NOT_IMPLEMENTED
vb@39
   248
vb@37
   249
    return status;
vb@37
   250
}
vb@37
   251