about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorMichael Vetter <jubalh@iodoru.org>2020-12-10 19:49:00 +0100
committerGitHub <noreply@github.com>2020-12-10 19:49:00 +0100
commit560a15e2a90f5ab10859cf88fb619367e7fb9b26 (patch)
tree41c7e732d4730e5739340bb4304015a01ca95c07 /src
parent3b093553e13bce306a21af065ae5a66fe8359780 (diff)
parent42a0518ff4e3dae48ba988c00299d92e1e2903c0 (diff)
downloadprofani-tty-560a15e2a90f5ab10859cf88fb619367e7fb9b26.tar.gz
Merge pull request #1454 from wstrm/fix-missing-download-dir
Create download directory under XDG data path
Diffstat (limited to 'src')
-rw-r--r--src/command/cmd_funcs.c35
-rw-r--r--src/tools/http_download.c10
2 files changed, 32 insertions, 13 deletions
diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c
index 2397ccfc..74052c9e 100644
--- a/src/command/cmd_funcs.c
+++ b/src/command/cmd_funcs.c
@@ -9118,7 +9118,7 @@ gboolean
 cmd_url_open(ProfWin* window, const char* const command, gchar** args)
 {
     if (window->type != WIN_CHAT && window->type != WIN_MUC && window->type != WIN_PRIVATE) {
-        cons_show("url open not supported in this window");
+        cons_show_error("url open not supported in this window");
         return TRUE;
     }
 
@@ -9134,20 +9134,37 @@ cmd_url_open(ProfWin* window, const char* const command, gchar** args)
 
     scheme = g_uri_parse_scheme(url);
     if (scheme == NULL) {
-        cons_show("URL '%s' is not valid.", args[1]);
+        cons_show_error("URL '%s' is not valid.", args[1]);
         goto out;
     }
 
     cmd_template = prefs_get_string(PREF_URL_OPEN_CMD);
     if (cmd_template == NULL) {
-        cons_show("No default `url open` command found in executables preferences.");
+        cons_show_error("No default `url open` command found in executables preferences.");
         goto out;
     }
 
 #ifdef HAVE_OMEMO
     // OMEMO URLs (aesgcm://) must be saved and decrypted before being opened.
-    if (0 == g_strcmp0(scheme, "aesgcm")) {
-        filename = unique_filename_from_url(url, files_get_data_path(DIR_DOWNLOADS));
+    if (g_strcmp0(scheme, "aesgcm") == 0) {
+
+        // Ensure that the downloads directory exists for saving cleartexts.
+        gchar* downloads_dir = files_get_data_path(DIR_DOWNLOADS);
+        if (g_mkdir_with_parents(downloads_dir, S_IRWXU) != 0) {
+            cons_show_error("Failed to create download directory "
+                            "at '%s' with error '%s'",
+                            downloads_dir, strerror(errno));
+            g_free(downloads_dir);
+            goto out;
+        }
+
+        // Generate an unique filename from the URL that should be stored in the
+        // downloads directory.
+        filename = unique_filename_from_url(url, downloads_dir);
+        g_free(downloads_dir);
+
+        // Download, decrypt and open the cleartext version of the AESGCM
+        // encrypted file.
         _url_aesgcm_method(window, cmd_template, url, filename);
         goto out;
     }
@@ -9186,15 +9203,15 @@ cmd_url_save(ProfWin* window, const char* const command, gchar** args)
 
     scheme = g_uri_parse_scheme(url);
     if (scheme == NULL) {
-        cons_show("URL '%s' is not valid.", args[1]);
+        cons_show_error("URL '%s' is not valid.", args[1]);
         goto out;
     }
 
     filename = unique_filename_from_url(url, path);
     if (filename == NULL) {
-        cons_show("Failed to generate unique filename"
-                  "from URL '%s' for path '%s'",
-                  url, path);
+        cons_show_error("Failed to generate unique filename"
+                        "from URL '%s' for path '%s'",
+                        url, path);
         goto out;
     }
 
diff --git a/src/tools/http_download.c b/src/tools/http_download.c
index f97fd704..2ff49b61 100644
--- a/src/tools/http_download.c
+++ b/src/tools/http_download.c
@@ -123,7 +123,7 @@ http_file_get(void* userdata)
                                    "output file at '%s' for writing (%s).",
                                    download->url, download->filename,
                                    g_strerror(errno));
-        return NULL;
+        goto out;
     }
 
     char* cert_path = prefs_get_string(PREF_TLS_CERTPATH);
@@ -185,9 +185,6 @@ http_file_get(void* userdata)
         }
     }
 
-    download_processes = g_slist_remove(download_processes, download);
-    pthread_mutex_unlock(&lock);
-
     if (download->cmd_template != NULL) {
         gchar** argv = format_call_external_argv(download->cmd_template,
                                                  download->url,
@@ -208,6 +205,11 @@ http_file_get(void* userdata)
         free(download->cmd_template);
     }
 
+out:
+
+    download_processes = g_slist_remove(download_processes, download);
+    pthread_mutex_unlock(&lock);
+
     free(download->url);
     free(download->filename);
     free(download);