diff --git a/plugins/dbus_plugin/plugin.py b/plugins/dbus_plugin/plugin.py index 8bf8d55a3..b8de568e9 100644 --- a/plugins/dbus_plugin/plugin.py +++ b/plugins/dbus_plugin/plugin.py @@ -428,7 +428,7 @@ if dbus_support.supported: def account_info(self, account): '''show info on account: resource, jid, nick, prio, message''' result = DBUS_DICT_SS() - if gajim.connections.has_key(account): + if account in gajim.connections: # account is valid con = gajim.connections[account] index = con.connected diff --git a/src/common/caps_cache.py b/src/common/caps_cache.py index bbf25c477..6bf9b62ed 100644 --- a/src/common/caps_cache.py +++ b/src/common/caps_cache.py @@ -163,7 +163,7 @@ def compute_caps_hash(identities, features, dataforms=[], hash_method='sha-1'): hash_ = hashlib.md5(S.encode('utf-8')) else: return '' - return base64.b64encode(hash_.digest()) + return base64.b64encode(hash_.digest()).decode('utf-8') ################################################################################ diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 11bc078fe..df4710caf 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -431,7 +431,8 @@ class ConnectionVcard: if 'PHOTO' in vcard and isinstance(vcard['PHOTO'], dict) and \ 'BINVAL' in vcard['PHOTO']: photo = vcard['PHOTO']['BINVAL'] - photo_decoded = base64.decodestring(photo) + photo_decoded = base64.b64decode(photo.encode('utf-8')).decode( + 'utf-8') gajim.interface.save_avatar_files(our_jid, photo_decoded) avatar_sha = hashlib.sha1(photo_decoded).hexdigest() iq2.getTag('PHOTO').setTagData('SHA', avatar_sha) @@ -684,7 +685,7 @@ class ConnectionVcard: 'BINVAL' in vcard['PHOTO']: photo = vcard['PHOTO']['BINVAL'] try: - photo_decoded = base64.decodestring(photo) + photo_decoded = base64.b64decode(photo.encode('utf-8')).decode('utf-8') avatar_sha = hashlib.sha1(photo_decoded).hexdigest() except Exception: avatar_sha = '' @@ -970,7 +971,7 @@ class ConnectionHandlersBase: decmsg = self.gpg.decrypt(encmsg, keyID) decmsg = self.connection.Dispatcher.replace_non_character(decmsg) # \x00 chars are not allowed in C (so in GTK) - obj.msgtxt = helpers.decode_string(decmsg.replace('\x00', '')) + obj.msgtxt = decmsg.replace('\x00', '') obj.encrypted = 'xep27' self.gpg_messages_to_decrypt.remove([encmsg, keyID, obj]) @@ -1095,7 +1096,7 @@ class ConnectionHandlersBase: jid = gajim.get_jid_without_resource(jid) try: - return self.sessions[jid].values() + return list(self.sessions[jid].values()) except KeyError: return [] @@ -1157,7 +1158,7 @@ class ConnectionHandlersBase: received a thread_id yet and returns the session that we last sent a message to """ - sessions = self.sessions[jid].values() + sessions = list(self.sessions[jid].values()) # sessions that we haven't received a thread ID in idless = [s for s in sessions if not s.received_thread_id] @@ -1178,7 +1179,7 @@ class ConnectionHandlersBase: Find an active session that doesn't have a control attached """ try: - sessions = self.sessions[jid].values() + sessions = list(self.sessions[jid].values()) # filter out everything except the default session type chat_sessions = [s for s in sessions if isinstance(s, @@ -1549,9 +1550,8 @@ ConnectionJingle, ConnectionIBBytestream): iq_obj = obj.stanza.buildReply('result') qp = iq_obj.setQuery() qp.setTagData('utc', strftime('%Y%m%dT%H:%M:%S', gmtime())) - qp.setTagData('tz', helpers.decode_string(tzname[daylight])) - qp.setTagData('display', helpers.decode_string(strftime('%c', - localtime()))) + qp.setTagData('tz', tzname[daylight]) + qp.setTagData('display', strftime('%c', localtime())) else: iq_obj = obj.stanza.buildReply('error') err = nbxmpp.ErrorNode(name=nbxmpp.NS_STANZAS + \ diff --git a/src/common/file_props.py b/src/common/file_props.py index 808db80fd..1d9684dcb 100644 --- a/src/common/file_props.py +++ b/src/common/file_props.py @@ -64,7 +64,7 @@ class FilesProp: @classmethod def getAllFileProp(cls): - return cls._files_props.values() + return list(cls._files_props.values()) @classmethod def setFileProp(cls, fp, account, sid): diff --git a/src/common/helpers.py b/src/common/helpers.py index 32c922400..59ffe634b 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -633,8 +633,6 @@ def datetime_tuple(timestamp): from time import strptime return strptime(timestamp, '%Y%m%dT%H:%M:%S') -# import gajim only when needed (after decode_string is defined) see #4764 - from common import gajim if gajim.HAVE_PYCURL: import pycurl @@ -904,7 +902,7 @@ def get_full_jid_from_iq(iq_obj): """ Return the full jid (with resource) from an iq """ - return parse_jid(iq_obj.getFrom()) + return parse_jid(str(iq_obj.getFrom())) def get_jid_from_iq(iq_obj): """ diff --git a/src/common/protocol/bytestream.py b/src/common/protocol/bytestream.py index f46fb4342..4077dbe18 100644 --- a/src/common/protocol/bytestream.py +++ b/src/common/protocol/bytestream.py @@ -852,7 +852,8 @@ class ConnectionIBBytestream(ConnectionBytestream): chunk = file_props.fp.read(file_props.block_size) if chunk: datanode = nbxmpp.Node(nbxmpp.NS_IBB + ' data', {'sid': sid, - 'seq': file_props.seq}, base64.encodestring(chunk)) + 'seq': file_props.seq}, base64.b64encode(chunk.encode( + 'utf-8')).decode('utf-8')) file_props.seq += 1 file_props.started = True if file_props.seq == 65536: @@ -887,7 +888,7 @@ class ConnectionIBBytestream(ConnectionBytestream): log.debug('ReceiveHandler called sid->%s seq->%s' % (sid, seq)) try: seq = int(seq) - data = base64.decodestring(data) + data = base64.b64decode(data.encode('utf-8')).decode('utf-8') except Exception: seq = '' data = '' diff --git a/src/common/resolver.py b/src/common/resolver.py index 8d52cba51..6f1200d54 100644 --- a/src/common/resolver.py +++ b/src/common/resolver.py @@ -70,33 +70,33 @@ class CommonResolver(): # empty host, return empty list of srv records on_ready([]) return - if self.resolved_hosts.has_key(host+type): + if host + type in self.resolved_hosts: # host is already resolved, return cached values log.debug('%s already resolved: %s' % (host, - self.resolved_hosts[host+type])) - on_ready(host, self.resolved_hosts[host+type]) + self.resolved_hosts[host + type])) + on_ready(host, self.resolved_hosts[host + type]) return - if self.handlers.has_key(host+type): + if host + type in self.handlers: # host is about to be resolved by another connection, # attach our callback log.debug('already resolving %s' % host) - self.handlers[host+type].append(on_ready) + self.handlers[host + type].append(on_ready) else: # host has never been resolved, start now log.debug('Starting to resolve %s using %s' % (host, self)) - self.handlers[host+type] = [on_ready] + self.handlers[host + type] = [on_ready] self.start_resolve(host, type) def _on_ready(self, host, type, result_list): # practically it is impossible to be the opposite, but who knows :) host = host.lower() log.debug('Resolving result for %s: %s' % (host, result_list)) - if not self.resolved_hosts.has_key(host+type): - self.resolved_hosts[host+type] = result_list - if self.handlers.has_key(host+type): - for callback in self.handlers[host+type]: + if host + type not in self.resolved_hosts: + self.resolved_hosts[host + type] = result_list + if host + type in self.handlers: + for callback in self.handlers[host + type]: callback(host, result_list) - del(self.handlers[host+type]) + del(self.handlers[host + type]) def start_resolve(self, host, type): pass @@ -251,8 +251,7 @@ class NSLookupResolver(CommonResolver): domain = None if line.startswith(fqdn): domain = fqdn # For nslookup 9.5 - elif helpers.decode_string(line).startswith(ufqdn): - line = helpers.decode_string(line) + elif line.startswith(ufqdn): domain = ufqdn # For nslookup 9.6 if domain: rest = line[len(domain):].split('=') diff --git a/src/common/zeroconf/client_zeroconf.py b/src/common/zeroconf/client_zeroconf.py index 69f1a4e6f..3d5b43f43 100644 --- a/src/common/zeroconf/client_zeroconf.py +++ b/src/common/zeroconf/client_zeroconf.py @@ -173,7 +173,7 @@ class P2PClient(IdleObject): id_ = stanza.getID() if not id_: id_ = self.Dispatcher.getAnID() - if self.conn_holder.ids_of_awaiting_messages.has_key(self.fd): + if self.fd in self.conn_holder.ids_of_awaiting_messages: self.conn_holder.ids_of_awaiting_messages[self.fd].append(( id_, thread_id)) else: @@ -195,7 +195,7 @@ class P2PClient(IdleObject): id_ = stanza.getID() if not id_: id_ = self.Dispatcher.getAnID() - if self.conn_holder.ids_of_awaiting_messages.has_key(self.fd): + if self.fd in self.conn_holder.ids_of_awaiting_messages: self.conn_holder.ids_of_awaiting_messages[self.fd].append((id_, thread_id)) else: @@ -253,10 +253,10 @@ class P2PClient(IdleObject): 'Incorrect answer from server.') return if self.sock_type == TYPE_SERVER: - if attrs.has_key('from'): + if 'from' in attrs: self.to = attrs['from'] self.send_stream_header() - if attrs.has_key('version') and attrs['version'] == '1.0': + if 'version' in attrs and attrs['version'] == '1.0': # other part supports stream features features = Node('stream:features') self.Dispatcher.send(features) @@ -270,12 +270,12 @@ class P2PClient(IdleObject): def on_disconnect(self): if self.conn_holder: - if self.conn_holder.ids_of_awaiting_messages.has_key(self.fd): + if self.fd in self.conn_holder.ids_of_awaiting_messages: del self.conn_holder.ids_of_awaiting_messages[self.fd] self.conn_holder.remove_connection(self.sock_hash) - if self.__dict__.has_key('Dispatcher'): + if 'Dispatcher' in self.__dict__: self.Dispatcher.PlugOut() - if self.__dict__.has_key('P2PConnection'): + if 'P2PConnection' in self.__dict__: self.P2PConnection.PlugOut() self.Connection = None self._caller = None @@ -294,7 +294,7 @@ class P2PClient(IdleObject): self.Dispatcher.Stream._document_attrs is None: return self.onreceive(None) - if self.Dispatcher.Stream._document_attrs.has_key('version') and \ + if 'version' in self.Dispatcher.Stream._document_attrs and \ self.Dispatcher.Stream._document_attrs['version'] == '1.0': #~ self.onreceive(self._on_receive_stream_features) #XXX continue with TLS @@ -710,7 +710,7 @@ class ClientZeroconf: if self.ip_to_hash[i] == sock_hash: del self.ip_to_hash[i] break - if self.hash_to_port.has_key(sock_hash): + if sock_hash in self.hash_to_port: del self.hash_to_port[sock_hash] def start_listener(self, port): diff --git a/src/dataforms_widget.py b/src/dataforms_widget.py index 766e51477..7e2b8198b 100644 --- a/src/dataforms_widget.py +++ b/src/dataforms_widget.py @@ -566,7 +566,8 @@ class SingleForm(Gtk.Table, object): for uri in field.media.uris: if uri.type_.startswith('image/'): try: - img_data = base64.decodestring(uri.uri_data) + img_data = base64.b64decode(uri.uri_data.encode( + 'utf-8')).decode('utf-8') pixbuf_l = GdkPixbuf.PixbufLoader() pixbuf_l.write(img_data) pixbuf_l.close() diff --git a/src/disco.py b/src/disco.py index 12be18b34..9eb75e616 100644 --- a/src/disco.py +++ b/src/disco.py @@ -193,7 +193,6 @@ class CacheDictionary: def __contains__(self, key): return key in self.cache - has_key = __contains__ _icon_cache = CacheDictionary(15) diff --git a/src/gajim-remote.py b/src/gajim-remote.py index 1df48a5ea..c01ac6f10 100644 --- a/src/gajim-remote.py +++ b/src/gajim-remote.py @@ -42,7 +42,7 @@ except Exception: def send_error(error_message): '''Writes error message to stderr and exits''' - print(error_message.encode(PREFERRED_ENCODING), file=sys.stderr) + print(error_message, file=sys.stderr) sys.exit(1) try: diff --git a/src/gui_menu_builder.py b/src/gui_menu_builder.py index 17364b08f..fabef8dc8 100644 --- a/src/gui_menu_builder.py +++ b/src/gui_menu_builder.py @@ -122,7 +122,7 @@ def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[]): minimized_controls = [] for account in connected_accounts: minimized_controls += \ - gajim.interface.minimized_controls[account].values() + list(gajim.interface.minimized_controls[account].values()) for gc_control in gajim.interface.msg_win_mgr.get_controls( message_control.TYPE_GC) + minimized_controls: acct = gc_control.account diff --git a/src/profile_window.py b/src/profile_window.py index 614af3add..696c66beb 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -171,7 +171,8 @@ class ProfileWindow: button.show() text_button = self.xml.get_object('NOPHOTO_button') text_button.hide() - self.avatar_encoded = base64.encodestring(data) + self.avatar_encoded = base64.b64encode(data.encode('utf-8')).decode( + 'utf-8') # returns None if unknown type self.avatar_mime_type = mimetypes.guess_type(path_to_file)[0] if must_delete: diff --git a/src/remote_control.py b/src/remote_control.py index 60f22b7b1..26b8d7020 100644 --- a/src/remote_control.py +++ b/src/remote_control.py @@ -907,7 +907,7 @@ class SignalObject(dbus.service.Object): if not invalid_file and filesize < 16384: fd = open(picture, 'rb') data = fd.read() - avatar = base64.encodestring(data) + avatar = base64.b64encode(data.encode('utf-8')).decode('utf-8') avatar_mime_type = mimetypes.guess_type(picture)[0] vcard={} vcard['PHOTO'] = {'BINVAL': avatar} diff --git a/src/roster_window.py b/src/roster_window.py index 990df3cf5..fd6c6f462 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -2186,7 +2186,7 @@ class RosterWindow: gajim.interface.status_sent_to_groups[account] = {} for gc_control in gajim.interface.msg_win_mgr.get_controls( message_control.TYPE_GC) + \ - gajim.interface.minimized_controls[account].values(): + list(gajim.interface.minimized_controls[account].values()): if gc_control.account == account: if gajim.gc_connected[account][gc_control.room_jid]: gajim.connections[account].send_gc_status( @@ -3923,7 +3923,7 @@ class RosterWindow: ) def on_plugins_menuitem_activate(self, widget): - if gajim.interface.instances.has_key('plugins'): + if 'plugins' in gajim.interface.instances: gajim.interface.instances['plugins'].window.present() else: gajim.interface.instances['plugins'] = plugins.gui.PluginsWindow() diff --git a/src/vcard.py b/src/vcard.py index 35c194f30..8fa203c10 100644 --- a/src/vcard.py +++ b/src/vcard.py @@ -61,7 +61,7 @@ def get_avatar_pixbuf_encoded_mime(photo): img_encoded = photo['BINVAL'] avatar_encoded = img_encoded try: - img_decoded = base64.decodestring(img_encoded) + img_decoded = base64.b64decode(img_encoded.encode('utf-8')).decode('utf-8') except Exception: pass if img_decoded: