merge/upstream-full #105

Manually merged
jabber.developer merged 407 commits from merge/upstream-full into master 2026-05-26 17:54:34 +00:00
395 changed files with 13745 additions and 36253 deletions
Showing only changes of commit a9ef000328 - Show all commits

View File

@@ -9209,18 +9209,30 @@ _prepare_filename(ProfWin* window, gchar* url, gchar* path)
break; break;
} }
// Ensure that the downloads directory exists for saving cleartexts. auto_gchar gchar* expanded_path = path ? get_expanded_path(path) : files_get_download_path(jid);
auto_gchar gchar* downloads_dir = path ? get_expanded_path(path) : files_get_download_path(jid);
if (g_mkdir_with_parents(downloads_dir, S_IRWXU) != 0) { // If path is provided and doesn't look like a directory, create its parent.
// Otherwise, create the directory itself.
if (path && !g_str_has_suffix(expanded_path, G_DIR_SEPARATOR_S) && !g_file_test(expanded_path, G_FILE_TEST_IS_DIR)) {
auto_gchar gchar* dirname = g_path_get_dirname(expanded_path);
if (g_mkdir_with_parents(dirname, S_IRWXU) != 0) {
cons_show_error("Failed to create download directory " cons_show_error("Failed to create download directory "
"at '%s' with error '%s'", "at '%s' with error '%s'",
downloads_dir, strerror(errno)); dirname, strerror(errno));
return NULL; return NULL;
} }
} else {
if (g_mkdir_with_parents(expanded_path, S_IRWXU) != 0) {
cons_show_error("Failed to create download directory "
"at '%s' with error '%s'",
expanded_path, strerror(errno));
return NULL;
}
}
// Generate an unique filename from the URL that should be stored in the // Generate an unique filename from the URL that should be stored in the
// downloads directory. // downloads directory.
return unique_filename_from_url(url, downloads_dir); return unique_filename_from_url(url, expanded_path);
} }
#ifdef HAVE_OMEMO #ifdef HAVE_OMEMO

View File

@@ -80,9 +80,11 @@ aesgcm_file_get(void* userdata)
http_dl->worker = aesgcm_dl->worker; http_dl->worker = aesgcm_dl->worker;
http_dl->id = strdup(aesgcm_dl->id); http_dl->id = strdup(aesgcm_dl->id);
http_dl->url = strdup(https_url); http_dl->url = strdup(https_url);
http_dl->display_url = strdup(aesgcm_dl->url);
http_dl->filename = strdup(tmpname); http_dl->filename = strdup(tmpname);
http_dl->cmd_template = NULL; http_dl->cmd_template = NULL;
http_dl->silent = FALSE; http_dl->silent = FALSE;
http_dl->silent_done = TRUE;
http_dl->return_bytes_received = TRUE; http_dl->return_bytes_received = TRUE;
aesgcm_dl->http_dl = http_dl; aesgcm_dl->http_dl = http_dl;
@@ -113,10 +115,12 @@ aesgcm_file_get(void* userdata)
http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->id, http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->id,
"Downloading '%s' failed: Failed to decrypt " "Downloading '%s' failed: Failed to decrypt "
"file (%s).", "file (%s).",
https_url, gcry_strerror(crypt_res)); aesgcm_dl->url, gcry_strerror(crypt_res));
} else { } else {
http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->id, http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->id,
"Decrypted file saved to '%s'", aesgcm_dl->filename); "Downloading '%s': done\nSaved to '%s'",
aesgcm_dl->url, aesgcm_dl->filename);
win_mark_received(aesgcm_dl->window, aesgcm_dl->id);
} }
if (aesgcm_dl->cmd_template != NULL) { if (aesgcm_dl->cmd_template != NULL) {

View File

@@ -32,7 +32,6 @@
#include "common.h" #include "common.h"
GSList* download_processes = NULL; GSList* download_processes = NULL;
gboolean silent = FALSE;
static int static int
_xferinfo(void* userdata, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) _xferinfo(void* userdata, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow)
@@ -58,9 +57,16 @@ _xferinfo(void* userdata, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultot
dlperc = (100 * dlnow) / dltotal; dlperc = (100 * dlnow) / dltotal;
} }
if (!silent) if (!download->silent) {
http_print_transfer_update(download->window, download->url, const char* url = download->display_url ? download->display_url : download->url;
"Downloading '%s': %d%%", download->url, dlperc); if (dlnow == dltotal && dltotal > 0) {
http_print_transfer_update(download->window, download->id,
"Downloading '%s': done", url);
} else {
http_print_transfer_update(download->window, download->id,
"Downloading '%s': %d%%", url, dlperc);
}
}
pthread_mutex_unlock(&lock); pthread_mutex_unlock(&lock);
@@ -85,15 +91,15 @@ http_file_get(void* userdata)
CURL* curl; CURL* curl;
CURLcode res; CURLcode res;
silent = download->silent;
download->cancel = 0; download->cancel = 0;
download->bytes_received = 0; download->bytes_received = 0;
pthread_mutex_lock(&lock); pthread_mutex_lock(&lock);
if (!silent) { const char* display_url = download->display_url ? download->display_url : download->url;
if (!download->silent) {
http_print_transfer(download->window, download->id, http_print_transfer(download->window, download->id,
"Downloading '%s': 0%%", download->url); "Downloading '%s': 0%%", display_url);
} }
FILE* outfh = fopen(download->filename, "wb"); FILE* outfh = fopen(download->filename, "wb");
@@ -172,18 +178,18 @@ http_file_get(void* userdata)
http_print_transfer_update(download->window, download->id, http_print_transfer_update(download->window, download->id,
"Downloading '%s' failed: " "Downloading '%s' failed: "
"Download was canceled", "Download was canceled",
download->url); display_url);
} else { } else {
http_print_transfer_update(download->window, download->id, http_print_transfer_update(download->window, download->id,
"Downloading '%s' failed: %s", "Downloading '%s' failed: %s",
download->url, err); display_url, err);
} }
free(err); free(err);
} else { } else {
if (!download->cancel && !silent) { if (!download->cancel && !download->silent && !download->silent_done) {
http_print_transfer_update(download->window, download->id, http_print_transfer_update(download->window, download->id,
"Downloading '%s': done\nSaved to '%s'", "Downloading '%s': done\nSaved to '%s'",
download->url, download->filename); display_url, download->filename);
win_mark_received(download->window, download->id); win_mark_received(download->window, download->id);
if (download->return_bytes_received) { if (download->return_bytes_received) {
ret = malloc(sizeof(*ret)); ret = malloc(sizeof(*ret));
@@ -204,7 +210,7 @@ http_file_get(void* userdata)
http_print_transfer_update(download->window, download->id, http_print_transfer_update(download->window, download->id,
"Downloading '%s' failed: Unable to call " "Downloading '%s' failed: Unable to call "
"command '%s' with file at '%s' (%s).", "command '%s' with file at '%s' (%s).",
download->url, display_url,
download->cmd_template, download->cmd_template,
download->filename, download->filename,
"TODO: Log the error"); "TODO: Log the error");
@@ -221,6 +227,7 @@ out:
free(download->filename); free(download->filename);
free(download->url); free(download->url);
free(download->display_url);
free(download->id); free(download->id);
free(download); free(download);

View File

@@ -25,6 +25,7 @@ typedef struct http_download_t
{ {
char* id; char* id;
char* url; char* url;
char* display_url;
char* filename; char* filename;
char* cmd_template; char* cmd_template;
curl_off_t bytes_received; curl_off_t bytes_received;
@@ -32,6 +33,7 @@ typedef struct http_download_t
pthread_t worker; pthread_t worker;
int cancel; int cancel;
gboolean silent; gboolean silent;
gboolean silent_done;
gboolean return_bytes_received; gboolean return_bytes_received;
} HTTPDownload; } HTTPDownload;

View File

@@ -65,7 +65,13 @@ _xferinfo(void* userdata, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultot
ulperc = (100 * ulnow) / ultotal; ulperc = (100 * ulnow) / ultotal;
} }
gchar* msg = g_strdup_printf("Uploading '%s': %d%%", upload->filename, ulperc); gchar* msg = NULL;
if (ulnow == ultotal && ultotal > 0) {
msg = g_strdup_printf("Uploading '%s': done", upload->filename);
} else {
msg = g_strdup_printf("Uploading '%s': %d%%", upload->filename, ulperc);
}
if (!msg) { if (!msg) {
msg = g_strdup(FALLBACK_MSG); msg = g_strdup(FALLBACK_MSG);
} }
@@ -288,7 +294,7 @@ http_file_put(void* userdata)
cons_show_error(err_msg); cons_show_error(err_msg);
} else { } else {
if (!upload->cancel) { if (!upload->cancel) {
auto_gchar gchar* status_msg = g_strdup_printf("Uploading '%s': 100%%", upload->filename); auto_gchar gchar* status_msg = g_strdup_printf("Uploading '%s': done", upload->filename);
if (!status_msg) { if (!status_msg) {
status_msg = g_strdup(FALLBACK_MSG); status_msg = g_strdup(FALLBACK_MSG);
} }