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