diff --git a/httpupload/httpupload.py b/httpupload/httpupload.py index 76a19e76673493a7ecfa8b2a627c86f18c7a4fcc..f4ae65e99ae0699432fd8b87a16afa9b85607644 100644 --- a/httpupload/httpupload.py +++ b/httpupload/httpupload.py @@ -222,50 +222,6 @@ class Base(object): self.request_slot(file) def upload_file(stanza): - slot = stanza.getTag("slot") - if not slot: - log.error("got unexpected stanza: "+str(stanza)) - progress_window.close_dialog() - error = stanza.getTag("error") - if error and error.getTag("text"): - ErrorDialog(_('Could not request upload slot'), - _('Got unexpected response from server: %s') % str(error.getTagData("text")), - transient_for=self.chat_control.parent_win.window) - else: - ErrorDialog(_('Could not request upload slot'), - _('Got unexpected response from server (protocol mismatch??)'), - transient_for=self.chat_control.parent_win.window) - return - - try: - if self.encrypted_upload: - key = os.urandom(32) - iv = os.urandom(16) - data = StreamFileWithProgress(path_to_file, - "rb", - progress_window.update_progress, - self.encrypted_upload, key, iv) - else: - data = StreamFileWithProgress(path_to_file, - "rb", - progress_window.update_progress) - except: - log.error("Could not open file") - progress_window.close_dialog() - ErrorDialog(_('Could not open file'), - _('Exception raised while opening file (see error log for more information)'), - transient_for=self.chat_control.parent_win.window) - raise # fill error log with useful information - - put = slot.getTag("put") - get = slot.getTag("get") - if not put or not get: - log.error("got unexpected stanza: " + str(stanza)) - progress_window.close_dialog() - ErrorDialog(_('Could not request upload slot'), - _('Got unexpected response from server (protocol mismatch??)'), - transient_for=self.chat_control.parent_win.window) - return def upload_complete(response_code): if response_code == 0: @@ -322,19 +278,6 @@ class Base(object): gajim.thread_interface(uploader, [], upload_complete) - is_supported = gajim.get_jid_from_account(self.chat_control.account) in jid_to_servers and \ - gajim.connections[self.chat_control.account].connection != None - log.info("jid_to_servers of %s: %s ; connection: %s", - gajim.get_jid_from_account(self.chat_control.account), - str(jid_to_servers[gajim.get_jid_from_account(self.chat_control.account)]), - str(gajim.connections[self.chat_control.account].connection)) - if not is_supported: - progress_window.close_dialog() - log.error("upload component vanished, account got disconnected??") - ErrorDialog(_('Your server does not support http uploads or you just got disconnected.\nPlease try to reconnect or reopen the chat window to fix this.'), - transient_for=self.chat_control.parent_win.window) - return - self.chat_control.msg_textview.grab_focus() def on_file_button_clicked(self, widget, jid, chat_control): @@ -361,6 +304,37 @@ class Base(object): IQ_CALLBACK[id_] = lambda stanza: self.received_slot(stanza, file) self.conn.send(iq) + def received_slot(self, stanza, file): + if stanza.getType() == 'error': + file.progress.close_dialog() + ErrorDialog(_('Could not request upload slot'), + stanza.getErrorMsg(), + transient_for=file.control.parent_win.window) + log.error(stanza) + return + + try: + file.put = stanza.getTag("slot").getTag("put") + file.get = stanza.getTag("slot").getTag("get") + except Exception as exc: + file.progress.close_dialog() + log.error("Got unexpected stanza: ", stanza) + log.exception('Error') + ErrorDialog(_('Could not request upload slot'), + _('Got unexpected response from server (see log)'), + transient_for=file.control.parent_win.window) + return + + try: + file.stream = StreamFileWithProgress(file, "rb") + except Exception as exc: + file.progress.close_dialog() + log.exception("Could not open file") + ErrorDialog(_('Could not open file'), + _('Exception raised while opening file (see log)'), + transient_for=file.control.parent_win.window) + return + class File: def __init__(self, **kwargs): @@ -372,10 +346,9 @@ class File: class StreamFileWithProgress: - def __init__(self, path, mode, callback=None, - encrypted_upload=False, key=None, iv=None, *args): - self.backing = open(path, mode) - self.encrypted_upload = encrypted_upload + def __init__(self, file, mode, *args): + self.backing = open(file.path, mode) + self.encrypted_upload = file.encrypted self.backing.seek(0, os.SEEK_END) if self.encrypted_upload: if os.name == 'nt': @@ -383,14 +356,14 @@ class StreamFileWithProgress: else: self.backend = default_backend() self.encryptor = Cipher( - algorithms.AES(key), - GCM(iv), + algorithms.AES(file.key), + GCM(file.iv), backend=self.backend).encryptor() self._total = self.backing.tell() + TAGSIZE else: self._total = self.backing.tell() self.backing.seek(0) - self._callback = callback + self._callback = file.progress.update_progress self._args = args self._seen = 0