mirror of
https://github.com/profanity-im/profanity.git
synced 2025-01-03 14:57:42 -05:00
Merge pull request #1795 from IsaacM88/master
Fix duplicate download IDs when using "/url save"
This commit is contained in:
commit
96c1c44a9d
@ -9399,12 +9399,13 @@ cmd_slashguard(ProfWin* window, const char* const command, gchar** args)
|
|||||||
|
|
||||||
#ifdef HAVE_OMEMO
|
#ifdef HAVE_OMEMO
|
||||||
void
|
void
|
||||||
_url_aesgcm_method(ProfWin* window, const char* cmd_template, const char* url, const char* filename)
|
_url_aesgcm_method(ProfWin* window, const char* cmd_template, const char* url, const char* filename, const char* id)
|
||||||
{
|
{
|
||||||
AESGCMDownload* download = malloc(sizeof(AESGCMDownload));
|
AESGCMDownload* download = malloc(sizeof(AESGCMDownload));
|
||||||
download->window = window;
|
download->window = window;
|
||||||
download->url = strdup(url);
|
download->url = strdup(url);
|
||||||
download->filename = strdup(filename);
|
download->filename = strdup(filename);
|
||||||
|
download->id = strdup(id);
|
||||||
if (cmd_template != NULL) {
|
if (cmd_template != NULL) {
|
||||||
download->cmd_template = strdup(cmd_template);
|
download->cmd_template = strdup(cmd_template);
|
||||||
} else {
|
} else {
|
||||||
@ -9417,13 +9418,14 @@ _url_aesgcm_method(ProfWin* window, const char* cmd_template, const char* url, c
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
_url_http_method(ProfWin* window, const char* cmd_template, const char* url, const char* filename)
|
_url_http_method(ProfWin* window, const char* cmd_template, const char* url, const char* filename, const char* id)
|
||||||
{
|
{
|
||||||
|
|
||||||
HTTPDownload* download = malloc(sizeof(HTTPDownload));
|
HTTPDownload* download = malloc(sizeof(HTTPDownload));
|
||||||
download->window = window;
|
download->window = window;
|
||||||
download->url = strdup(url);
|
download->url = strdup(url);
|
||||||
download->filename = strdup(filename);
|
download->filename = strdup(filename);
|
||||||
|
download->id = strdup(id);
|
||||||
if (cmd_template != NULL) {
|
if (cmd_template != NULL) {
|
||||||
download->cmd_template = strdup(cmd_template);
|
download->cmd_template = strdup(cmd_template);
|
||||||
} else {
|
} else {
|
||||||
@ -9499,7 +9501,9 @@ cmd_url_open(ProfWin* window, const char* const command, gchar** args)
|
|||||||
|
|
||||||
// Download, decrypt and open the cleartext version of the AESGCM
|
// Download, decrypt and open the cleartext version of the AESGCM
|
||||||
// encrypted file.
|
// encrypted file.
|
||||||
_url_aesgcm_method(window, cmd_template, url, filename);
|
gchar* id = get_random_string(4);
|
||||||
|
_url_aesgcm_method(window, cmd_template, url, filename, id);
|
||||||
|
g_free(id);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -9553,10 +9557,14 @@ cmd_url_save(ProfWin* window, const char* const command, gchar** args)
|
|||||||
|
|
||||||
cmd_template = prefs_get_string(PREF_URL_SAVE_CMD);
|
cmd_template = prefs_get_string(PREF_URL_SAVE_CMD);
|
||||||
if (cmd_template == NULL && (g_strcmp0(scheme, "http") == 0 || g_strcmp0(scheme, "https") == 0)) {
|
if (cmd_template == NULL && (g_strcmp0(scheme, "http") == 0 || g_strcmp0(scheme, "https") == 0)) {
|
||||||
_url_http_method(window, cmd_template, url, filename);
|
gchar* id = get_random_string(4);
|
||||||
|
_url_http_method(window, cmd_template, url, filename, id);
|
||||||
|
g_free(id);
|
||||||
#ifdef HAVE_OMEMO
|
#ifdef HAVE_OMEMO
|
||||||
} else if (g_strcmp0(scheme, "aesgcm") == 0) {
|
} else if (g_strcmp0(scheme, "aesgcm") == 0) {
|
||||||
_url_aesgcm_method(window, cmd_template, url, filename);
|
gchar* id = get_random_string(4);
|
||||||
|
_url_aesgcm_method(window, cmd_template, url, filename, id);
|
||||||
|
g_free(id);
|
||||||
#endif
|
#endif
|
||||||
} else if (cmd_template != NULL) {
|
} else if (cmd_template != NULL) {
|
||||||
_url_external_method(cmd_template, url, filename);
|
_url_external_method(cmd_template, url, filename);
|
||||||
|
@ -71,7 +71,7 @@ aesgcm_file_get(void* userdata)
|
|||||||
// and tag stored in the URL fragment.
|
// and tag stored in the URL fragment.
|
||||||
if (omemo_parse_aesgcm_url(aesgcm_dl->url, &https_url, &fragment) != 0) {
|
if (omemo_parse_aesgcm_url(aesgcm_dl->url, &https_url, &fragment) != 0) {
|
||||||
cons_show_error("Download failed: Cannot parse URL '%s'.", aesgcm_dl->url);
|
cons_show_error("Download failed: Cannot parse URL '%s'.", aesgcm_dl->url);
|
||||||
http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->url,
|
http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->id,
|
||||||
"Download failed: Cannot parse URL '%s'.",
|
"Download failed: Cannot parse URL '%s'.",
|
||||||
aesgcm_dl->url);
|
aesgcm_dl->url);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -82,7 +82,7 @@ aesgcm_file_get(void* userdata)
|
|||||||
gchar* tmpname = NULL;
|
gchar* tmpname = NULL;
|
||||||
gint tmpfd;
|
gint tmpfd;
|
||||||
if ((tmpfd = g_file_open_tmp("profanity.XXXXXX", &tmpname, NULL)) == -1) {
|
if ((tmpfd = g_file_open_tmp("profanity.XXXXXX", &tmpname, NULL)) == -1) {
|
||||||
http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->url,
|
http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->id,
|
||||||
"Downloading '%s' failed: Unable to create "
|
"Downloading '%s' failed: Unable to create "
|
||||||
"temporary ciphertext file for writing "
|
"temporary ciphertext file for writing "
|
||||||
"(%s).",
|
"(%s).",
|
||||||
@ -93,7 +93,7 @@ aesgcm_file_get(void* userdata)
|
|||||||
// Open the target file for storing the cleartext.
|
// Open the target file for storing the cleartext.
|
||||||
FILE* outfh = fopen(aesgcm_dl->filename, "wb");
|
FILE* outfh = fopen(aesgcm_dl->filename, "wb");
|
||||||
if (outfh == NULL) {
|
if (outfh == NULL) {
|
||||||
http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->url,
|
http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->id,
|
||||||
"Downloading '%s' failed: Unable to open "
|
"Downloading '%s' failed: Unable to open "
|
||||||
"output file at '%s' for writing (%s).",
|
"output file at '%s' for writing (%s).",
|
||||||
https_url, aesgcm_dl->filename,
|
https_url, aesgcm_dl->filename,
|
||||||
@ -106,6 +106,7 @@ aesgcm_file_get(void* userdata)
|
|||||||
HTTPDownload* http_dl = malloc(sizeof(HTTPDownload));
|
HTTPDownload* http_dl = malloc(sizeof(HTTPDownload));
|
||||||
http_dl->window = aesgcm_dl->window;
|
http_dl->window = aesgcm_dl->window;
|
||||||
http_dl->worker = aesgcm_dl->worker;
|
http_dl->worker = aesgcm_dl->worker;
|
||||||
|
http_dl->id = strdup(aesgcm_dl->id);
|
||||||
http_dl->url = strdup(https_url);
|
http_dl->url = strdup(https_url);
|
||||||
http_dl->filename = strdup(tmpname);
|
http_dl->filename = strdup(tmpname);
|
||||||
http_dl->cmd_template = NULL;
|
http_dl->cmd_template = NULL;
|
||||||
@ -115,7 +116,7 @@ aesgcm_file_get(void* userdata)
|
|||||||
|
|
||||||
FILE* tmpfh = fopen(tmpname, "rb");
|
FILE* tmpfh = fopen(tmpname, "rb");
|
||||||
if (tmpfh == NULL) {
|
if (tmpfh == NULL) {
|
||||||
http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->url,
|
http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->id,
|
||||||
"Downloading '%s' failed: Unable to open "
|
"Downloading '%s' failed: Unable to open "
|
||||||
"temporary file at '%s' for reading (%s).",
|
"temporary file at '%s' for reading (%s).",
|
||||||
aesgcm_dl->url, tmpname,
|
aesgcm_dl->url, tmpname,
|
||||||
@ -136,7 +137,7 @@ aesgcm_file_get(void* userdata)
|
|||||||
g_free(tmpname);
|
g_free(tmpname);
|
||||||
|
|
||||||
if (crypt_res != GPG_ERR_NO_ERROR) {
|
if (crypt_res != GPG_ERR_NO_ERROR) {
|
||||||
http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->url,
|
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));
|
https_url, gcry_strerror(crypt_res));
|
||||||
@ -156,7 +157,7 @@ aesgcm_file_get(void* userdata)
|
|||||||
|
|
||||||
// TODO: Log the error.
|
// TODO: Log the error.
|
||||||
if (!call_external(argv)) {
|
if (!call_external(argv)) {
|
||||||
http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->url,
|
http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->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).",
|
||||||
aesgcm_dl->url,
|
aesgcm_dl->url,
|
||||||
@ -169,6 +170,7 @@ aesgcm_file_get(void* userdata)
|
|||||||
free(aesgcm_dl->cmd_template);
|
free(aesgcm_dl->cmd_template);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(aesgcm_dl->id);
|
||||||
free(aesgcm_dl->filename);
|
free(aesgcm_dl->filename);
|
||||||
free(aesgcm_dl->url);
|
free(aesgcm_dl->url);
|
||||||
free(aesgcm_dl);
|
free(aesgcm_dl);
|
||||||
|
@ -50,6 +50,7 @@
|
|||||||
|
|
||||||
typedef struct aesgcm_download_t
|
typedef struct aesgcm_download_t
|
||||||
{
|
{
|
||||||
|
char* id;
|
||||||
char* url;
|
char* url;
|
||||||
char* filename;
|
char* filename;
|
||||||
char* cmd_template;
|
char* cmd_template;
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
#define FALLBACK_MSG ""
|
#define FALLBACK_MSG ""
|
||||||
|
|
||||||
void
|
void
|
||||||
http_print_transfer_update(ProfWin* window, char* url, const char* fmt, ...)
|
http_print_transfer_update(ProfWin* window, char* id, const char* fmt, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
|
|
||||||
@ -54,13 +54,13 @@ http_print_transfer_update(ProfWin* window, char* url, const char* fmt, ...)
|
|||||||
g_string_vprintf(msg, fmt, args);
|
g_string_vprintf(msg, fmt, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
win_update_entry_message(window, url, msg->str);
|
win_update_entry_message(window, id, msg->str);
|
||||||
|
|
||||||
g_string_free(msg, TRUE);
|
g_string_free(msg, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
http_print_transfer(ProfWin* window, char* url, const char* fmt, ...)
|
http_print_transfer(ProfWin* window, char* id, const char* fmt, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
|
|
||||||
@ -69,7 +69,7 @@ http_print_transfer(ProfWin* window, char* url, const char* fmt, ...)
|
|||||||
g_string_vprintf(msg, fmt, args);
|
g_string_vprintf(msg, fmt, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
win_print_http_transfer(window, msg->str, url);
|
win_print_http_transfer(window, msg->str, id);
|
||||||
|
|
||||||
g_string_free(msg, TRUE);
|
g_string_free(msg, TRUE);
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
#include "ui/window.h"
|
#include "ui/window.h"
|
||||||
|
|
||||||
void http_print_transfer(ProfWin* window, char* url, const char* fmt, ...);
|
void http_print_transfer(ProfWin* window, char* id, const char* fmt, ...);
|
||||||
void http_print_transfer_update(ProfWin* window, char* url, const char* fmt, ...);
|
void http_print_transfer_update(ProfWin* window, char* id, const char* fmt, ...);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -112,12 +112,12 @@ http_file_get(void* userdata)
|
|||||||
download->bytes_received = 0;
|
download->bytes_received = 0;
|
||||||
|
|
||||||
pthread_mutex_lock(&lock);
|
pthread_mutex_lock(&lock);
|
||||||
http_print_transfer(download->window, download->url,
|
http_print_transfer(download->window, download->id,
|
||||||
"Downloading '%s': 0%%", download->url);
|
"Downloading '%s': 0%%", download->url);
|
||||||
|
|
||||||
FILE* outfh = fopen(download->filename, "wb");
|
FILE* outfh = fopen(download->filename, "wb");
|
||||||
if (outfh == NULL) {
|
if (outfh == NULL) {
|
||||||
http_print_transfer_update(download->window, download->url,
|
http_print_transfer_update(download->window, download->id,
|
||||||
"Downloading '%s' failed: Unable to open "
|
"Downloading '%s' failed: Unable to open "
|
||||||
"output file at '%s' for writing (%s).",
|
"output file at '%s' for writing (%s).",
|
||||||
download->url, download->filename,
|
download->url, download->filename,
|
||||||
@ -177,22 +177,22 @@ http_file_get(void* userdata)
|
|||||||
g_free(cert_path);
|
g_free(cert_path);
|
||||||
if (err) {
|
if (err) {
|
||||||
if (download->cancel) {
|
if (download->cancel) {
|
||||||
http_print_transfer_update(download->window, download->url,
|
http_print_transfer_update(download->window, download->id,
|
||||||
"Downloading '%s' failed: "
|
"Downloading '%s' failed: "
|
||||||
"Download was canceled",
|
"Download was canceled",
|
||||||
download->url);
|
download->url);
|
||||||
} else {
|
} else {
|
||||||
http_print_transfer_update(download->window, download->url,
|
http_print_transfer_update(download->window, download->id,
|
||||||
"Downloading '%s' failed: %s",
|
"Downloading '%s' failed: %s",
|
||||||
download->url, err);
|
download->url, err);
|
||||||
}
|
}
|
||||||
free(err);
|
free(err);
|
||||||
} else {
|
} else {
|
||||||
if (!download->cancel) {
|
if (!download->cancel) {
|
||||||
http_print_transfer_update(download->window, download->url,
|
http_print_transfer_update(download->window, download->id,
|
||||||
"Downloading '%s': done\nSaved to '%s'",
|
"Downloading '%s': done\nSaved to '%s'",
|
||||||
download->url, download->filename);
|
download->url, download->filename);
|
||||||
win_mark_received(download->window, download->url);
|
win_mark_received(download->window, download->id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -203,7 +203,7 @@ http_file_get(void* userdata)
|
|||||||
|
|
||||||
// TODO: Log the error.
|
// TODO: Log the error.
|
||||||
if (!call_external(argv)) {
|
if (!call_external(argv)) {
|
||||||
http_print_transfer_update(download->window, download->url,
|
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,
|
download->url,
|
||||||
@ -221,6 +221,7 @@ out:
|
|||||||
download_processes = g_slist_remove(download_processes, download);
|
download_processes = g_slist_remove(download_processes, download);
|
||||||
pthread_mutex_unlock(&lock);
|
pthread_mutex_unlock(&lock);
|
||||||
|
|
||||||
|
free(download->id);
|
||||||
free(download->url);
|
free(download->url);
|
||||||
free(download->filename);
|
free(download->filename);
|
||||||
free(download);
|
free(download);
|
||||||
|
@ -49,6 +49,7 @@
|
|||||||
|
|
||||||
typedef struct http_download_t
|
typedef struct http_download_t
|
||||||
{
|
{
|
||||||
|
char* id;
|
||||||
char* url;
|
char* url;
|
||||||
char* filename;
|
char* filename;
|
||||||
char* cmd_template;
|
char* cmd_template;
|
||||||
|
@ -1680,9 +1680,9 @@ win_appendln_highlight(ProfWin* window, theme_item_t theme_item, const char* con
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
win_print_http_transfer(ProfWin* window, const char* const message, char* url)
|
win_print_http_transfer(ProfWin* window, const char* const message, char* id)
|
||||||
{
|
{
|
||||||
win_print_outgoing_with_receipt(window, "!", NULL, message, url, NULL);
|
win_print_outgoing_with_receipt(window, "!", NULL, message, id, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -74,7 +74,7 @@ void win_print_outgoing_muc_msg(ProfWin* window, char* show_char, const char* co
|
|||||||
void win_print_history(ProfWin* window, const ProfMessage* const message);
|
void win_print_history(ProfWin* window, const ProfMessage* const message);
|
||||||
void win_print_old_history(ProfWin* window, const ProfMessage* const message);
|
void win_print_old_history(ProfWin* window, const ProfMessage* const message);
|
||||||
|
|
||||||
void win_print_http_transfer(ProfWin* window, const char* const message, char* url);
|
void win_print_http_transfer(ProfWin* window, const char* const message, char* id);
|
||||||
|
|
||||||
void win_newline(ProfWin* window);
|
void win_newline(ProfWin* window);
|
||||||
void win_redraw(ProfWin* window);
|
void win_redraw(ProfWin* window);
|
||||||
|
@ -8,6 +8,7 @@ typedef struct http_download_t HTTPDownload;
|
|||||||
|
|
||||||
typedef struct aesgcm_download_t
|
typedef struct aesgcm_download_t
|
||||||
{
|
{
|
||||||
|
char* id;
|
||||||
char* url;
|
char* url;
|
||||||
char* filename;
|
char* filename;
|
||||||
ProfWin* window;
|
ProfWin* window;
|
||||||
|
@ -8,6 +8,7 @@ typedef struct prof_win_t ProfWin;
|
|||||||
|
|
||||||
typedef struct http_download_t
|
typedef struct http_download_t
|
||||||
{
|
{
|
||||||
|
char* id;
|
||||||
char* url;
|
char* url;
|
||||||
char* filename;
|
char* filename;
|
||||||
char* directory;
|
char* directory;
|
||||||
|
@ -490,7 +490,7 @@ mucwin_unset_message_char(ProfMucWin* mucwin)
|
|||||||
|
|
||||||
void win_update_entry_message(ProfWin* window, const char* const id, const char* const message){};
|
void win_update_entry_message(ProfWin* window, const char* const id, const char* const message){};
|
||||||
void win_mark_received(ProfWin* window, const char* const id){};
|
void win_mark_received(ProfWin* window, const char* const id){};
|
||||||
void win_print_http_transfer(ProfWin* window, const char* const message, char* url){};
|
void win_print_http_transfer(ProfWin* window, const char* const message, char* id){};
|
||||||
void win_print_loading_history(ProfWin* window){};
|
void win_print_loading_history(ProfWin* window){};
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user