diff options
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/aesgcm_download.c | 134 | ||||
-rw-r--r-- | src/tools/aesgcm_download.h | 66 | ||||
-rw-r--r-- | src/tools/aesgcm_upload.c | 0 | ||||
-rw-r--r-- | src/tools/aesgcm_upload.h | 0 | ||||
-rw-r--r-- | src/tools/http_download.c | 20 | ||||
-rw-r--r-- | src/tools/http_download.h | 3 |
6 files changed, 221 insertions, 2 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); +} diff --git a/src/tools/aesgcm_download.h b/src/tools/aesgcm_download.h new file mode 100644 index 00000000..fc29a99e --- /dev/null +++ b/src/tools/aesgcm_download.h @@ -0,0 +1,66 @@ +/* + * aesgcm_download.h + * 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. + * + */ + +#ifndef TOOLS_AESGCM_DOWNLOAD_H +#define TOOLS_AESGCM_DOWNLOAD_H + +#ifdef PLATFORM_CYGWIN +#define SOCKET int +#endif + +#include <sys/select.h> +#include <curl/curl.h> +#include "tools/http_download.h" + +#include "ui/win_types.h" + +typedef struct aesgcm_download_t +{ + char* url; + FILE* filehandle; + ProfWin* window; + pthread_t worker; + HTTPDownload* http_dl; +} AESGCMDownload; + +void* aesgcm_file_get(void* userdata); + +void aesgcm_download_cancel_processes(ProfWin* window); +void aesgcm_download_add_download(AESGCMDownload* download); + +char* http_basename_from_url(const char* url); + +#endif diff --git a/src/tools/aesgcm_upload.c b/src/tools/aesgcm_upload.c new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/src/tools/aesgcm_upload.c diff --git a/src/tools/aesgcm_upload.h b/src/tools/aesgcm_upload.h new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/src/tools/aesgcm_upload.h diff --git a/src/tools/http_download.c b/src/tools/http_download.c index 09e6bb6e..a86af172 100644 --- a/src/tools/http_download.c +++ b/src/tools/http_download.c @@ -157,13 +157,12 @@ http_file_get(void* userdata) curl_easy_cleanup(curl); curl_global_cleanup(); - if (download->filehandle) { + if (download->filehandle && download->close) { fclose(download->filehandle); } pthread_mutex_lock(&lock); g_free(cert_path); - if (err) { char* msg; if (download->cancel) { @@ -237,3 +236,20 @@ http_basename_from_url(const char* url) return filename; } + +void +http_print_transfer_update(ProfWin* window, char* url, + const char* fmt, ...) +{ + va_list args; + + va_start(args, fmt); + char* msg; + if (vasprintf(&msg, fmt, args) == -1) { + msg = strdup(FALLBACK_MSG); + } + va_end(args); + + win_print_http_transfer(window, msg, url); + free(msg); +} diff --git a/src/tools/http_download.h b/src/tools/http_download.h index ba8b5023..797e1603 100644 --- a/src/tools/http_download.h +++ b/src/tools/http_download.h @@ -54,6 +54,7 @@ typedef struct http_download_t ProfWin* window; pthread_t worker; int cancel; + int close; } HTTPDownload; void* http_file_get(void* userdata); @@ -62,5 +63,7 @@ void http_download_cancel_processes(ProfWin* window); void http_download_add_download(HTTPDownload* download); char* http_basename_from_url(const char* url); +void http_print_transfer_update(ProfWin* window, char* url, + const char* fmt, ...); #endif |