From 9baa857a68ff9b3e9eaf77bbb7e5b08738de5eb6 Mon Sep 17 00:00:00 2001 From: Marc Schink Date: Wed, 30 Aug 2017 02:07:35 +0200 Subject: [PATCH 1/2] [httpupload] Use 'max-file-size' value for error message If a file is too large, use the 'max-file-size' value to generate an error message rather than using the error message provided by the XMPP server. This enables easy i18n of the error message and a human-readable file size. --- httpupload/httpupload.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/httpupload/httpupload.py b/httpupload/httpupload.py index b212030..e0c4980 100644 --- a/httpupload/httpupload.py +++ b/httpupload/httpupload.py @@ -248,12 +248,24 @@ class Base(object): IQ_CALLBACK[id_] = lambda stanza: self.received_slot(stanza, file) app.connections[self.account].connection.send(iq) + @staticmethod + def get_slot_error_message(stanza): + tmp = stanza.getTag('error').getTag('file-too-large') + + if tmp is not None: + max_file_size = int(tmp.getTag('max-file-size').getData()) + return _('File is too large, maximum allowed file size is: %s') % \ + GLib.format_size_full(max_file_size, + GLib.FormatSizeFlags.IEC_UNITS) + + return stanza.getErrorMsg() + def received_slot(self, stanza, file): log.info("Received slot") if stanza.getType() == 'error': file.progress.close_dialog() ErrorDialog(_('Could not request upload slot'), - stanza.getErrorMsg(), + self.get_slot_error_message(stanza), transient_for=file.control.parent_win.window) log.error(stanza) return From 21f941266f9836a8e2e655a89e52cf1988d3fb1f Mon Sep 17 00:00:00 2001 From: Marc Schink Date: Wed, 30 Aug 2017 16:19:57 +0200 Subject: [PATCH 2/2] [httpupload] Do not request upload slots for too large files --- httpupload/httpupload.py | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/httpupload/httpupload.py b/httpupload/httpupload.py index e0c4980..a802d50 100644 --- a/httpupload/httpupload.py +++ b/httpupload/httpupload.py @@ -72,13 +72,23 @@ class HTTPUploadPlugin(GajimPlugin): del IQ_CALLBACK[id_] def handle_agent_info_received(self, event): - if (NS_HTTPUPLOAD in event.features and + if (NS_HTTPUPLOAD not in event.features or not app.jid_is_transport(event.jid)): - account = event.conn.name - interface = self.get_interface(account) - interface.enabled = True - interface.component = event.jid - interface.update_button_states(True) + return + + account = event.conn.name + interface = self.get_interface(account) + interface.enabled = True + interface.component = event.jid + interface.update_button_states(True) + + try: + for form in event.data: + tmp = form.getField("max-file-size").getValue() + interface.max_file_size = int(tmp) + except AttributeError: + interface.max_file_size = None + log.warning("%s does not provide maximum file size" % account) def handle_outgoing_stanza(self, event): message = event.msg_iq.getTagData('body') @@ -183,14 +193,23 @@ class Base(object): return invalid_file = False + stat = os.stat(path) + if os.path.isfile(path): - stat = os.stat(path) if stat[6] == 0: invalid_file = True msg = _('File is empty') else: invalid_file = True msg = _('File does not exist') + + if self.max_file_size is not None and \ + stat.st_size > self.max_file_size: + invalid_file = True + msg = _('File is too large, maximum allowed file size is: %s') % \ + GLib.format_size_full(self.max_file_size, + GLib.FormatSizeFlags.IEC_UNITS) + if invalid_file: ErrorDialog(_('Could not open file'), msg, transient_for=chat_control.parent_win.window)