diff options
author | William Wennerström <william@wstrm.dev> | 2020-07-20 22:49:50 +0200 |
---|---|---|
committer | William Wennerström <william@wstrm.dev> | 2020-11-16 21:58:09 +0100 |
commit | 73f313b9212d652fecb13bcb82a0f162abb897a0 (patch) | |
tree | 79556fb956301732e66c58196e4b685e87718792 /src/tools/aesgcm_download.c | |
parent | fb002a59b6dd0e2656987e9bdb72f6d3478d4e97 (diff) | |
download | profani-tty-73f313b9212d652fecb13bcb82a0f162abb897a0.tar.gz |
Refactor OMEMO download into AESGCMDownload tool
Diffstat (limited to 'src/tools/aesgcm_download.c')
-rw-r--r-- | src/tools/aesgcm_download.c | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/src/tools/aesgcm_download.c b/src/tools/aesgcm_download.c new file mode 100644 index 00000000..693eabe7 --- /dev/null +++ b/src/tools/aesgcm_download.c @@ -0,0 +1,134 @@ +/* + * aesgcm_download.c + * vim: expandtab:ts=4:sts=4:sw=4 + * + * Copyright (C) 2012 - 2019 James Booth <boothj5@gmail.com> + * Copyright (C) 2020 William Wennerström <william@wstrm.dev> + * + * This file is part of Profanity. + * + * Profanity is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Profanity is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Profanity. If not, see <https://www.gnu.org/licenses/>. + * + * In addition, as a special exception, the copyright holders give permission to + * link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. + * + * You must obey the GNU General Public License in all respects for all of the + * code used other than OpenSSL. If you modify file(s) with this exception, you + * may extend this exception to your version of the file(s), but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. If you delete this exception statement from all + * source files in the program, then also delete it here. + * + */ + +#define _GNU_SOURCE 1 + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <curl/curl.h> +#include <gio/gio.h> +#include <pthread.h> +#include <assert.h> + +#include "profanity.h" +#include "event/client_events.h" +#include "tools/aesgcm_download.h" +#include "omemo/omemo.h" +#include "config/preferences.h" +#include "ui/ui.h" +#include "ui/window.h" +#include "common.h" + +#define FALLBACK_MSG "" + +void* +aesgcm_file_get(void* userdata) +{ + AESGCMDownload* aesgcm_dl = (AESGCMDownload*)userdata; + + char* https_url = NULL; + char* fragment = NULL; + + if (omemo_parse_aesgcm_url(aesgcm_dl->url, &https_url, &fragment) != 0) { + http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->url, + "Download failed: Cannot parse URL."); + return NULL; + } + + int tmpfd; + char* tmpname = NULL; + if ((tmpfd = g_file_open_tmp("profanity.XXXXXX", &tmpname, NULL)) == -1) { + http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->url, + "Downloading '%s' failed: Unable to create " + "temporary ciphertext file for writing.", + https_url); + return NULL; + } + FILE* tmpfh = fdopen(tmpfd, "wb"); + + // Remove the file once it is closed. + remove(tmpname); + free(tmpname); + + HTTPDownload* http_dl = malloc(sizeof(HTTPDownload)); + http_dl->window = aesgcm_dl->window; + http_dl->worker = aesgcm_dl->worker; + http_dl->url = https_url; + http_dl->filehandle = tmpfh; + http_dl->close = 0; + + aesgcm_dl->http_dl = http_dl; + + // TODO: Verify result. + http_file_get(http_dl); + + // Force flush as the decrypt function will read from the same stream. + fflush(tmpfh); + rewind(tmpfh); + + int crypt_res = omemo_decrypt_file(tmpfh, aesgcm_dl->filehandle, + http_dl->bytes_received, fragment); + + fclose(tmpfh); + + if (crypt_res != 0) { + http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->url, + "Downloading '%s' failed: Failed to decrypt" + "file.", + https_url); + } + + fclose(aesgcm_dl->filehandle); + + return NULL; +} + +void +aesgcm_download_cancel_processes(ProfWin* window) +{ + http_download_cancel_processes(window); +} + +void +aesgcm_download_add_download(AESGCMDownload* aesgcm_dl) +{ + http_download_add_download(aesgcm_dl->http_dl); +} |