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