gajim.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2026
October
September
August
July
June
May
April
March
February
January
2025
December
November
October
September
August
July
June
May
April
March
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
List overview
Download
Commits
December 2013
----- 2026 -----
October 2026
September 2026
August 2026
July 2026
June 2026
May 2026
April 2026
March 2026
February 2026
January 2026
----- 2025 -----
December 2025
November 2025
October 2025
September 2025
August 2025
July 2025
June 2025
May 2025
April 2025
March 2025
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
commits@gajim.org
2 participants
151 discussions
Start a n
N
ew thread
gajim: cipher specification cleanup
by Gajim
30 Dec '13
30 Dec '13
changeset fddb13e77a07 in /home/hg/repos/gajim author: Fedor Brunner fedor.brunner(a)azet.sk branches: gtk3
details:http://hg.gajim.org/gajim?cmd=changeset;node=fddb13e77a07
description: cipher specification cleanup
https://trac.gajim.org/ticket/7599
diffstat: src/common/config.py | 2 +- src/common/jingle_xtls.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diffs (24 lines): diff -r 9610e0253908 -r fddb13e77a07 src/common/config.py --- a/src/common/config.py Mon Dec 23 21:39:23 2013 +0100 +++ b/src/common/config.py Mon Dec 23 23:26:54 2013 +0100 @@ -349,7 +349,7 @@ 'enable_esessions': [opt_bool, True, _('Enable ESessions encryption for this account.')], 'autonegotiate_esessions': [opt_bool, True, _('Should Gajim automatically start an encrypted session when possible?')], 'connection_types': [ opt_str, 'tls ssl plain', _('Ordered list (space separated) of connection type to try. Can contain tls, ssl or plain')], - 'cipher_list': [ opt_str, 'HIGH:!aNULL:!eNULL:RC4-SHA', '' ], + 'cipher_list': [ opt_str, 'HIGH:!aNULL:RC4-SHA', '' ], 'action_when_plaintext_connection': [ opt_str, 'warn', _('Show a warning dialog before sending password on an plaintext connection. Can be \'warn\', \'connect\', \'disconnect\'') ], 'warn_when_insecure_ssl_connection': [ opt_bool, True, _('Show a warning dialog before using standard SSL library.') ], 'warn_when_insecure_password': [ opt_bool, True, _('Show a warning dialog before sending PLAIN password over a plain connection.') ], diff -r 9610e0253908 -r fddb13e77a07 src/common/jingle_xtls.py --- a/src/common/jingle_xtls.py Mon Dec 23 21:39:23 2013 +0100 +++ b/src/common/jingle_xtls.py Mon Dec 23 23:26:54 2013 +0100 @@ -101,7 +101,7 @@ ctx = SSL.Context(SSL.SSLv23_METHOD) flags = (SSL.OP_NO_SSLv2 | SSL.OP_NO_SSLv3 | SSL.OP_SINGLE_DH_USE) ctx.set_options(flags) - ctx.set_cipher_list('HIGH:!aNULL:!eNULL') + ctx.set_cipher_list('HIGH:!aNULL:!3DES') if fingerprint == 'server': # for testing purposes only ctx.set_verify(SSL.VERIFY_NONE|SSL.VERIFY_FAIL_IF_NO_PEER_CERT,
1
0
0
0
gajim: fix the "do not ask me again" behaviour with untrusted GP...
by Gajim
30 Dec '13
30 Dec '13
changeset d1bda839faaa in /home/hg/repos/gajim author: Yann Leboulanger <asterix(a)lagaule.org> branches: gtk3
details:http://hg.gajim.org/gajim?cmd=changeset;node=d1bda839faaa
description: fix the "do not ask me again" behaviour with untrusted GPG key warning. Fixes #7584 diffstat: src/common/connection.py | 2 +- src/common/gpg.py | 10 ++++++++-- src/gui_interface.py | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diffs (52 lines): diff -r 7e5ceacb07ee -r d1bda839faaa src/common/connection.py --- a/src/common/connection.py Sat Nov 30 15:25:21 2013 +0100 +++ b/src/common/connection.py Sun Dec 01 10:06:38 2013 +0100 @@ -326,7 +326,7 @@ form_node, user_nick, keyID, attention, correction_msg, callback) gajim.nec.push_incoming_event(GPGTrustKeyEvent(None, - conn=self, callback=_on_always_trust)) + conn=self, keyID=keyID, callback=_on_always_trust)) else: self._message_encrypted_cb(output, type_, msg, msgtxt, original_message, fjid, resource, jid, xhtml, diff -r 7e5ceacb07ee -r d1bda839faaa src/common/gpg.py --- a/src/common/gpg.py Sat Nov 30 15:25:21 2013 +0100 +++ b/src/common/gpg.py Sun Dec 01 10:06:38 2013 +0100 @@ -34,7 +34,7 @@ self.decode_errors = 'replace' self.passphrase = None self.use_agent = use_agent - self.always_trust = False + self.always_trust = [] # list of keyID to always trust def _setup_my_options(self): self.options.armor = 1 @@ -47,8 +47,14 @@ self.options.extra_args.append('--use-agent') def encrypt(self, str_, recipients, always_trust=False): + trust = always_trust + if not trust: + trust = True + for key in recipients: + if key not in self.always_trust: + trust = False result = super(GnuPG, self).encrypt(str_, recipients, - always_trust=always_trust, passphrase=self.passphrase) + always_trust=trust, passphrase=self.passphrase) if result.status == 'invalid recipient': return '', 'NOT_TRUSTED' diff -r 7e5ceacb07ee -r d1bda839faaa src/gui_interface.py --- a/src/gui_interface.py Sat Nov 30 15:25:21 2013 +0100 +++ b/src/gui_interface.py Sun Dec 01 10:06:38 2013 +0100 @@ -695,7 +695,7 @@ #('GPG_ALWAYS_TRUST', account, callback) def on_yes(checked): if checked: - obj.conn.gpg.always_trust = True + obj.conn.gpg.always_trust.append(obj.keyID) obj.callback(True) def on_no():
1
0
0
0
gajim: show bookmarked rooms in invite to menu when possible. Fi...
by Gajim
30 Dec '13
30 Dec '13
changeset 885614323c03 in /home/hg/repos/gajim author: Yann Leboulanger <asterix(a)lagaule.org> branches: gtk3
details:http://hg.gajim.org/gajim?cmd=changeset;node=885614323c03
description: show bookmarked rooms in invite to menu when possible. Fixes #4455 diffstat: src/groupchat_control.py | 9 +++++- src/gui_menu_builder.py | 59 +++++++++++++++++++++++++++++++++++++++++++---- src/roster_window.py | 23 +++++++++++++---- 3 files changed, 77 insertions(+), 14 deletions(-) diffs (199 lines): diff -r d1bda839faaa -r 885614323c03 src/groupchat_control.py --- a/src/groupchat_control.py Sun Dec 01 10:06:38 2013 +0100 +++ b/src/groupchat_control.py Mon Dec 02 12:17:32 2013 +0100 @@ -44,6 +44,7 @@ import vcard import cell_renderer_image import dataforms_widget +import nbxmpp from common import gajim from common import helpers @@ -2509,9 +2510,13 @@ muc_icon = gtkgui_helpers.load_icon('muc_active') if muc_icon: item.set_image(muc_icon) - if c.jid and c.name != self.nick: + if jid and c.name != self.nick: + bookmarked = False + contact = gajim.contacts.get_contact(self.account, jid, c.resource) + if contact and contact.supports(nbxmpp.NS_CONFERENCE): + bookmarked=True gui_menu_builder.build_invite_submenu(item, ((c, self.account),), - ignore_rooms=[self.room_jid]) + ignore_rooms=[self.room_jid], show_bookmarked=bookmarked) else: item.set_sensitive(False) diff -r d1bda839faaa -r 885614323c03 src/gui_menu_builder.py --- a/src/gui_menu_builder.py Sun Dec 01 10:06:38 2013 +0100 +++ b/src/gui_menu_builder.py Mon Dec 02 12:17:32 2013 +0100 @@ -26,7 +26,7 @@ from common import gajim from common import helpers from nbxmpp.protocol import NS_COMMANDS, NS_FILE, NS_MUC, NS_ESESSION -from nbxmpp.protocol import NS_JINGLE_FILE_TRANSFER +from nbxmpp.protocol import NS_JINGLE_FILE_TRANSFER, NS_CONFERENCE def build_resources_submenu(contacts, account, action, room_jid=None, room_account=None, cap=None): @@ -63,7 +63,8 @@ return sub_menu -def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[]): +def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[], +show_bookmarked=False): """ list_ in a list of (contact, account) """ @@ -151,7 +152,9 @@ item = Gtk.SeparatorMenuItem.new() # separator invite_to_submenu.append(item) for (room_jid, account) in rooms: - menuitem = Gtk.MenuItem(room_jid.split('@')[0]) + menuitem = Gtk.ImageMenuItem(room_jid.split('@')[0]) + muc_active_icon = gtkgui_helpers.load_icon('muc_active') + menuitem.set_image(muc_active_icon) if len(contact_list) > 1: # several resources menuitem.set_submenu(build_resources_submenu( contact_list, account, roster.on_invite_to_room, room_jid, @@ -163,9 +166,45 @@ else: resource = None menuitem.connect('activate', roster.on_invite_to_room, list_, - room_jid, account, resource) + room_jid, account, resource) invite_to_submenu.append(menuitem) + if not show_bookmarked: + return + rooms2 = [] # a list of (room_jid, account) tuple + r_jids = [] # list of room jids + for account in connected_accounts: + for room in gajim.connections[account].bookmarks: + r_jid = room['jid'] + if r_jid in r_jids: + continue + if r_jid not in gajim.gc_connected[account] or not \ + gajim.gc_connected[account][r_jid]: + rooms2.append((r_jid, account)) + r_jids.append(r_jid) + + if not rooms2: + return + item = Gtk.SeparatorMenuItem.new() # separator + invite_to_submenu.append(item) + for (room_jid, account) in rooms2: + menuitem = Gtk.ImageMenuItem(room_jid.split('@')[0]) + muc_inactive_icon = gtkgui_helpers.load_icon('muc_inactive') + menuitem.set_image(muc_inactive_icon) + if len(contact_list) > 1: # several resources + menuitem.set_submenu(build_resources_submenu( + contact_list, account, roster.on_invite_to_room, room_jid, + account)) + else: + # use resource if it's self contact + if contact.jid == gajim.get_jid_from_account(account): + resource = contact.resource + else: + resource = None + menuitem.connect('activate', roster.on_invite_to_room, list_, + room_jid, account, resource) + invite_to_submenu.append(menuitem) + def get_contact_menu(contact, account, use_multiple_contacts=True, show_start_chat=True, show_encryption=False, show_buttonbar_items=True, control=None, gc_contact=None, is_anonymous=True): @@ -403,9 +442,16 @@ # it's a pm and we don't know real JID invite_menuitem.set_sensitive(False) else: - build_invite_submenu(invite_menuitem, [(gc_contact, account)]) + bookmarked = False + c_ = gajim.contacts.get_contact(account, gc_contact.jid, + gc_contact.resource) + if c_ and c_.supports(nbxmpp.NS_CONFERENCE): + bookmarked=True + build_invite_submenu(invite_menuitem, [(gc_contact, account)], + show_bookmarked=bookmarked) else: - build_invite_submenu(invite_menuitem, [(contact, account)]) + build_invite_submenu(invite_menuitem, [(contact, account)], + show_bookmarked=contact.supports(NS_CONFERENCE)) if gajim.account_is_disconnected(account): invite_menuitem.set_sensitive(False) @@ -655,3 +701,4 @@ menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() return menu + diff -r d1bda839faaa -r 885614323c03 src/roster_window.py --- a/src/roster_window.py Sun Dec 01 10:06:38 2013 +0100 +++ b/src/roster_window.py Mon Dec 02 12:17:32 2013 +0100 @@ -73,7 +73,7 @@ if dbus_support.supported: import dbus -from nbxmpp.protocol import NS_FILE, NS_ROSTERX +from nbxmpp.protocol import NS_FILE, NS_ROSTERX, NS_CONFERENCE from common.pep import MOODS, ACTIVITIES #(icon, name, type, jid, account, editable, second pixbuf) @@ -5740,9 +5740,10 @@ group = model[titer][C_JID] account = model[titer][C_ACCOUNT] - list_ = [] # list of (jid, account) tuples - list_online = [] # list of (jid, account) tuples - + list_ = [] # list of (contact, account) tuples + list_online = [] # list of (contact, account) tuples + + show_bookmarked = True group = model[titer][C_JID] for jid in gajim.contacts.get_jid_list(account): contact = gajim.contacts.get_contact_with_highest_priority(account, @@ -5750,6 +5751,9 @@ if group in contact.get_shown_groups(): if contact.show not in ('offline', 'error'): list_online.append((contact, account)) + # Check that all contacts support direct NUC invite + if not contact.supports(NS_CONFERENCE): + show_bookmarked = False list_.append((contact, account)) menu = Gtk.Menu() @@ -5797,7 +5801,7 @@ invite_menuitem.set_image(muc_icon) gui_menu_builder.build_invite_submenu(invite_menuitem, - list_online) + list_online, show_bookmarked=show_bookmarked) menu.append(invite_menuitem) # Send Custom Status @@ -5947,6 +5951,12 @@ account = None break account = current_account + show_bookmarked = True + for (contact, current_account) in list_: + # Check that all contacts support direct NUC invite + if not contact.supports(NS_CONFERENCE): + show_bookmarked = False + break if account is not None: send_group_message_item = Gtk.ImageMenuItem.new_with_mnemonic( _('Send Group M_essage')) @@ -5962,7 +5972,8 @@ if muc_icon: invite_item.set_image(muc_icon) - gui_menu_builder.build_invite_submenu(invite_item, list_) + gui_menu_builder.build_invite_submenu(invite_item, list_, + show_bookmarked=show_bookmarked) menu.append(invite_item) item = Gtk.SeparatorMenuItem.new() # separator
1
0
0
0
gajim: both sender and receiver request remote SSL certificate, ...
by Gajim
30 Dec '13
30 Dec '13
changeset b49c3dc49fed in /home/hg/repos/gajim author: Yann Leboulanger <asterix(a)lagaule.org> branches: gtk3
details:http://hg.gajim.org/gajim?cmd=changeset;node=b49c3dc49fed
description: both sender and receiver request remote SSL certificate, but only if it's a new one. Correctly verify remote SSL certificate. diffstat: src/common/connection_handlers_events.py | 7 ++- src/common/jingle_content.py | 21 ++++++-- src/common/jingle_ft.py | 37 ++++++++++++---- src/common/jingle_transport.py | 3 +- src/common/jingle_xtls.py | 70 +++++++++++++++++++++---------- src/common/protocol/bytestream.py | 16 +++++-- src/common/socks5.py | 42 ++++++++++++++----- src/gui_interface.py | 3 + 8 files changed, 141 insertions(+), 58 deletions(-) diffs (truncated from 489 to 300 lines): diff -r 885614323c03 -r b49c3dc49fed src/common/connection_handlers_events.py --- a/src/common/connection_handlers_events.py Mon Dec 02 12:17:32 2013 +0100 +++ b/src/common/connection_handlers_events.py Wed Dec 04 18:43:28 2013 +0100 @@ -2053,8 +2053,11 @@ self.fjid = self.conn._ft_get_from(self.stanza) self.jid = gajim.get_jid_without_resource(self.fjid) if self.jingle_content: - self.FT_content.use_security = bool(self.jingle_content.getTag( - 'security')) + secu = self.jingle_content.getTag('security') + self.FT_content.use_security = bool(secu) + fingerprint = secu.getTag('fingerprint') + if fingerprint: + self.FT_content.x509_fingerprint = fingerprint.getData() if not self.FT_content.transport: self.FT_content.transport = JingleTransportSocks5() self.FT_content.transport.set_our_jid( diff -r 885614323c03 -r b49c3dc49fed src/common/jingle_content.py --- a/src/common/jingle_content.py Mon Dec 02 12:17:32 2013 +0100 +++ b/src/common/jingle_content.py Wed Dec 04 18:43:28 2013 +0100 @@ -17,9 +17,12 @@ Handles Jingle contents (XEP 0166) """ +import os from common import gajim import nbxmpp from common.jingle_transport import JingleTransportIBB +from jingle_xtls import SELF_SIGNED_CERTIFICATE +from jingle_xtls import load_cert_file contents = {} @@ -213,12 +216,18 @@ if self.use_security: security = nbxmpp.simplexml.Node( tag=nbxmpp.NS_JINGLE_XTLS + ' security') - # TODO: add fingerprint element - for m in ('x509', ): # supported authentication methods - method = nbxmpp.simplexml.Node(tag='method') - method.setAttr('name', m) - security.addChild(node=method) - content.addChild(node=security) + certpath = os.path.join(gajim.MY_CERT_DIR, SELF_SIGNED_CERTIFICATE)\ + + '.cert' + cert = load_cert_file(certpath) + if cert: + digest_algo = cert.get_signature_algorithm().split('With')[0] + security.addChild('fingerprint').addData(cert.digest( + digest_algo)) + for m in ('x509', ): # supported authentication methods + method = nbxmpp.simplexml.Node(tag='method') + method.setAttr('name', m) + security.addChild(node=method) + content.addChild(node=security) content.addChild(node=description_node) def destroy(self): diff -r 885614323c03 -r b49c3dc49fed src/common/jingle_ft.py --- a/src/common/jingle_ft.py Mon Dec 02 12:17:32 2013 +0100 +++ b/src/common/jingle_ft.py Wed Dec 04 18:43:28 2013 +0100 @@ -22,6 +22,7 @@ import hashlib from common import gajim import nbxmpp +import jingle_xtls from common.jingle_content import contents, JingleContent from common.jingle_transport import * from common import helpers @@ -68,6 +69,7 @@ self.callbacks['transport-info'] += [self.__on_transport_info] self.callbacks['iq-result'] += [self.__on_iq_result] self.use_security = use_security + self.x509_fingerprint = None self.file_props = file_props self.weinitiate = self.session.weinitiate self.werequest = self.session.werequest @@ -165,17 +167,37 @@ h.addHash(hash_, self.file_props.algo) return h + def on_cert_received(self): + self.session.approve_session() + self.session.approve_content('file', name=self.name) + def __on_session_accept(self, stanza, content, error, action): log.info("__on_session_accept") con = self.session.connection + # We ack the session accept + response = stanza.buildReply('result') + response.delChild(response.getQuery()) + con.connection.send(response) security = content.getTag('security') if not security: # responder can not verify our fingerprint self.use_security = False + else: + fingerprint = security.getTag('fingerprint') + if fingerprint: + fingerprint = fingerprint.getData() + self.x509_fingerprint = fingerprint + if not jingle_xtls.check_cert(gajim.get_jid_without_resource( + self.session.responder), fingerprint): + id_ = jingle_xtls.send_cert_request(con, + self.session.responder) + jingle_xtls.key_exchange_pend(id_, + self.continue_session_accept, [stanza]) + raise nbxmpp.NodeProcessed + self.continue_session_accept(stanza) + + def continue_session_accept(self, stanza): + con = self.session.connection if self.state == STATE_TRANSPORT_REPLACE: - # We ack the session accept - response = stanza.buildReply('result') - response.delChild(response.getQuery()) - con.connection.send(response) # If we are requesting we don't have the file if self.session.werequest: raise nbxmpp.NodeProcessed @@ -186,16 +208,13 @@ # Calculate file hash in a new thread # if we haven't sent the hash already. if self.file_props.hash_ is None and self.file_props.algo and \ - not self.werequest: + not self.werequest: self.hashThread = threading.Thread(target=self.__send_hash) self.hashThread.start() for host in self.file_props.streamhosts: host['initiator'] = self.session.initiator host['target'] = self.session.responder host['sid'] = self.file_props.sid - response = stanza.buildReply('result') - response.delChild(response.getQuery()) - con.connection.send(response) fingerprint = None if self.use_security: fingerprint = 'client' @@ -204,7 +223,7 @@ self.file_props.sid, self.on_connect, self._on_connect_error, fingerprint=fingerprint, receiving=False) - return + raise nbxmpp.NodeProcessed self.__state_changed(STATE_TRANSFERING) raise nbxmpp.NodeProcessed diff -r 885614323c03 -r b49c3dc49fed src/common/jingle_transport.py --- a/src/common/jingle_transport.py Mon Dec 02 12:17:32 2013 +0100 +++ b/src/common/jingle_transport.py Wed Dec 04 18:43:28 2013 +0100 @@ -156,7 +156,8 @@ candidates.append(cand) # we need this when we construct file_props on session-initiation - self.remote_candidates = candidates + if candidates: + self.remote_candidates = candidates return candidates diff -r 885614323c03 -r b49c3dc49fed src/common/jingle_xtls.py --- a/src/common/jingle_xtls.py Mon Dec 02 12:17:32 2013 +0100 +++ b/src/common/jingle_xtls.py Wed Dec 04 18:43:28 2013 +0100 @@ -25,15 +25,17 @@ PYOPENSSL_PRESENT = False -pending_contents = {} # key-exchange id -> session, accept that session once key-exchange completes +# key-exchange id -> [callback, args], accept that session once key-exchange completes +pending_contents = {} -def key_exchange_pend(id_, content): - pending_contents[id_] = content +def key_exchange_pend(id_, cb, args): + # args is a list + pending_contents[id_] = [cb, args] def approve_pending_content(id_): - content = pending_contents[id_] - content.session.approve_session() - content.session.approve_content('file', name=content.name) + cb = pending_contents[id_][0] + args = pending_contents[id_][1] + cb(*args) try: import OpenSSL.SSL @@ -56,18 +58,18 @@ log.info("certificate: %s" % certificate) return return_code -def load_cert_file(cert_path, cert_store): +def load_cert_file(cert_path, cert_store=None): """ This is almost identical to the one in nbxmpp.tls_nb """ if not os.path.isfile(cert_path): - return + return None try: f = open(cert_path) except IOError as e: log.warning('Unable to open certificate file %s: %s' % (cert_path, str(e))) - return + return None lines = f.readlines() i = 0 begin = -1 @@ -79,7 +81,9 @@ try: x509cert = OpenSSL.crypto.load_certificate( OpenSSL.crypto.FILETYPE_PEM, cert) - cert_store.add_cert(x509cert) + if cert_store: + cert_store.add_cert(x509cert) + return x509cert except OpenSSL.crypto.Error as exception_obj: log.warning('Unable to load a certificate from file %s: %s' %\ (cert_path, exception_obj.args[0][0][2])) @@ -90,7 +94,7 @@ i += 1 f.close() -def get_context(fingerprint, verify_cb=None): +def get_context(fingerprint, verify_cb=None, remote_jid=None): """ constructs and returns the context objects """ @@ -130,22 +134,28 @@ % (default_dh_params_name, err)) raise - store = ctx.get_cert_store() - for f in os.listdir(os.path.expanduser(gajim.MY_PEER_CERTS_PATH)): - load_cert_file(os.path.join(os.path.expanduser( - gajim.MY_PEER_CERTS_PATH), f), store) - log.debug('certificate file ' + f + ' loaded fingerprint ' + \ - fingerprint) + if remote_jid: + store = ctx.get_cert_store() + path = os.path.join(os.path.expanduser(gajim.MY_PEER_CERTS_PATH), + remote_jid) + '.cert' + if os.path.exists(path): + load_cert_file(path, cert_store=store) + log.debug('certificate file ' + path + ' loaded fingerprint ' + \ + fingerprint) return ctx -def send_cert(con, jid_from, sid): - certpath = os.path.join(gajim.MY_CERT_DIR, SELF_SIGNED_CERTIFICATE) + \ - '.cert' +def read_cert(certpath): certificate = '' with open(certpath, 'r') as certfile: for line in certfile.readlines(): if not line.startswith('-'): certificate += line + return certificate + +def send_cert(con, jid_from, sid): + certpath = os.path.join(gajim.MY_CERT_DIR, SELF_SIGNED_CERTIFICATE) + \ + '.cert' + certificate = read_cert(certpath) iq = nbxmpp.Iq('result', to=jid_from); iq.setAttr('id', sid) @@ -175,9 +185,21 @@ f.write('-----BEGIN CERTIFICATE-----\n') f.write(cert) f.write('-----END CERTIFICATE-----\n') + f.close() approve_pending_content(id_) +def check_cert(jid, fingerprint): + certpath = os.path.join(os.path.expanduser(gajim.MY_PEER_CERTS_PATH), jid) + certpath += '.cert' + if os.path.exists(certpath): + cert = load_cert_file(certpath) + if cert: + digest_algo = cert.get_signature_algorithm().split('With')[0] + if cert.digest(digest_algo) == fingerprint: + return True + return False + def send_cert_request(con, to_jid): iq = nbxmpp.Iq('get', to=to_jid) id_ = con.connection.getAnID() @@ -201,12 +223,12 @@ pkey.generate_key(type, bits) return pkey -def createCertRequest(pkey, digest="sha1", **name): +def createCertRequest(pkey, digest="sha256", **name): """ Create a certificate request. Arguments: pkey - The key to associate with the request - digest - Digestion method to use for signing, default is sha1 + digest - Digestion method to use for signing, default is sha256
1
0
0
0
gajim: Fix crash when try configure plugin second time. See http...
by Gajim
30 Dec '13
30 Dec '13
changeset 01cdde1c784a in /home/hg/repos/gajim author: Denis Fomin <fominde(a)gmail.com> branches: gtk3
details:http://hg.gajim.org/gajim?cmd=changeset;node=01cdde1c784a
description: Fix crash when try configure plugin second time. See
https://trac-plugins.gajim.org/ticket/86
diffstat: src/plugins/gui.py | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diffs (22 lines): diff -r b49c3dc49fed -r 01cdde1c784a src/plugins/gui.py --- a/src/plugins/gui.py Wed Dec 04 18:43:28 2013 +0100 +++ b/src/plugins/gui.py Fri Dec 06 12:25:34 2013 +0400 @@ -326,6 +326,10 @@ self.init() + def on_close_dialog(self, widget, data): + self.hide() + return True + def on_close_button_clicked(self, widget): self.hide() @@ -334,6 +338,7 @@ self.set_transient_for(parent) self.on_run() self.show_all() + self.connect('delete-event', self.on_close_dialog) result = super(GajimPluginConfigDialog, self) return result
1
0
0
0
gajim: update die to nbxmpp update
by Gajim
30 Dec '13
30 Dec '13
changeset 5586a665ebcf in /home/hg/repos/gajim author: Yann Leboulanger <asterix(a)lagaule.org> branches: gtk3
details:http://hg.gajim.org/gajim?cmd=changeset;node=5586a665ebcf
description: update die to nbxmpp update diffstat: src/common/connection.py | 66 ++++++++++++++++--------------- src/common/connection_handlers_events.py | 15 +++--- src/common/gajim.py | 11 +++++ 3 files changed, 52 insertions(+), 40 deletions(-) diffs (146 lines): diff -r 01cdde1c784a -r 5586a665ebcf src/common/connection.py --- a/src/common/connection.py Fri Dec 06 12:25:34 2013 +0400 +++ b/src/common/connection.py Fri Dec 06 21:20:22 2013 +0100 @@ -61,6 +61,9 @@ from common import check_X509 from common.connection_handlers import * +if gajim.HAVE_PYOPENSSL: + import OpenSSL.crypto + from nbxmpp import Smacks from string import Template import logging @@ -1382,49 +1385,48 @@ try: errnum = con.Connection.ssl_errnum except AttributeError: - errnum = [] # we don't have an errnum - for i, er in enumerate(errnum): - if er > 0 and str(er) not in gajim.config.get_per('accounts', - self.name, 'ignore_ssl_errors').split(): - text = _('The authenticity of the %s certificate could be ' - 'invalid.') % hostname - if er in ssl_error: - text += _('\nSSL Error: <b>%s</b>') % ssl_error[er] - else: - text += _('\nUnknown SSL error: %d') % er - gajim.nec.push_incoming_event(SSLErrorEvent(None, conn=self, - error_text=text, error_num=er, - cert=con.Connection.ssl_cert_pem[i], - fingerprint=con.Connection.ssl_fingerprint_sha1[i], - certificate=con.Connection.ssl_certificate[i])) - return True - if len(con.Connection.ssl_fingerprint_sha1): + errnum = 0 + cert = con.Connection.ssl_certificate + if errnum > 0 and str(errnum) not in gajim.config.get_per('accounts', + self.name, 'ignore_ssl_errors').split(): + text = _('The authenticity of the %s certificate could be invalid' + ) % hostname + if errnum in ssl_error: + text += _('\nSSL Error: <b>%s</b>') % ssl_error[errnum] + else: + text += _('\nUnknown SSL error: %d') % errnum + fingerprint = cert.digest('sha1') + pem = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, + cert) + gajim.nec.push_incoming_event(SSLErrorEvent(None, conn=self, + error_text=text, error_num=errnum, cert=pem, + fingerprint=fingerprint, certificate=cert)) + return True + if cert: + fingerprint = cert.digest('sha1') saved_fingerprint = gajim.config.get_per('accounts', self.name, 'ssl_fingerprint_sha1') if saved_fingerprint: # Check sha1 fingerprint - if con.Connection.ssl_fingerprint_sha1[-1] != saved_fingerprint: + if fingerprint != saved_fingerprint: gajim.nec.push_incoming_event(FingerprintErrorEvent(None, - conn=self, - certificate=con.Connection.ssl_certificate[-1], - new_fingerprint=con.Connection.ssl_fingerprint_sha1[ - -1])) + conn=self, certificate=cert, + new_fingerprint=fingerprint)) return True else: gajim.config.set_per('accounts', self.name, - 'ssl_fingerprint_sha1', - con.Connection.ssl_fingerprint_sha1[-1]) - if not check_X509.check_certificate(con.Connection.ssl_certificate[ - -1], hostname) and '100' not in gajim.config.get_per('accounts', - self.name, 'ignore_ssl_errors').split(): + 'ssl_fingerprint_sha1', fingerprint) + if not check_X509.check_certificate(cert, hostname) and \ + '100' not in gajim.config.get_per('accounts', self.name, + 'ignore_ssl_errors').split(): + pem = OpenSSL.crypto.dump_certificate( + OpenSSL.crypto.FILETYPE_PEM, cert) txt = _('The authenticity of the %s certificate could be ' - 'invalid.\nThe certificate does not cover this domain.') % \ + 'invalid.\nThe certificate does not cover this domain.') %\ hostname gajim.nec.push_incoming_event(SSLErrorEvent(None, conn=self, - error_text=txt, error_num=100, - cert=con.Connection.ssl_cert_pem[-1], - fingerprint=con.Connection.ssl_fingerprint_sha1[-1], - certificate=con.Connection.ssl_certificate[-1])) + error_text=txt, error_num=100, cert=pem, + fingerprint=fingerprint, certificate=cert)) return True self._register_handlers(con, con_type) diff -r 01cdde1c784a -r 5586a665ebcf src/common/connection_handlers_events.py --- a/src/common/connection_handlers_events.py Fri Dec 06 12:25:34 2013 +0400 +++ b/src/common/connection_handlers_events.py Fri Dec 06 21:20:22 2013 +0100 @@ -1625,20 +1625,19 @@ try: self.errnum = self.conn.connection.Connection.ssl_errnum except AttributeError: - self.errnum = [] # we don't have an errnum + self.errnum = 0 # we don't have an errnum self.ssl_msg = '' - for er in self.errnum: - if er > 0: - from common.connection import ssl_error - self.ssl_msg = ssl_error.get(er, _('Unknown SSL error: %d') % \ - er) + if self.errnum > 0: + from common.connection import ssl_error + self.ssl_msg = ssl_error.get(er, _('Unknown SSL error: %d') % \ + self.errnum) self.ssl_cert = '' if len(self.conn.connection.Connection.ssl_cert_pem): self.ssl_cert = self.conn.connection.Connection.ssl_cert_pem self.ssl_fingerprint = '' - if len(self.conn.connection.Connection.ssl_fingerprint_sha1): + if self.conn.connection.Connection.ssl_certificate: self.ssl_fingerprint = \ - self.conn.connection.Connection.ssl_fingerprint_sha1 + self.conn.connection.Connection.ssl_certificate.digest('sha1') return True class NewAccountNotConnectedEvent(nec.NetworkIncomingEvent): diff -r 01cdde1c784a -r 5586a665ebcf src/common/gajim.py --- a/src/common/gajim.py Fri Dec 06 12:25:34 2013 +0400 +++ b/src/common/gajim.py Fri Dec 06 21:20:22 2013 +0100 @@ -171,6 +171,17 @@ if subprocess.call(gpg_cmd, shell=True): HAVE_GPG = False +HAVE_PYOPENSSL = True +try: + import OpenSSL.SSL + import OpenSSL.crypto + ver = OpenSSL.__version__ + ver_l = [int(i) for i in ver.split('.')] + if ver_l < [0, 12]: + raise ImportError +except Exception: + HAVE_PYOPENSSL = False + HAVE_FARSTREAM = True try: raise ImportError
1
0
0
0
gajim: add missing signal. Fixes #7586
by Gajim
30 Dec '13
30 Dec '13
changeset 463446445789 in /home/hg/repos/gajim author: Yann Leboulanger <asterix(a)lagaule.org> branches: gtk3
details:http://hg.gajim.org/gajim?cmd=changeset;node=463446445789
description: add missing signal. Fixes #7586 diffstat: data/gui/accounts_window.ui | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diffs (11 lines): diff -r 5586a665ebcf -r 463446445789 data/gui/accounts_window.ui --- a/data/gui/accounts_window.ui Fri Dec 06 21:20:22 2013 +0100 +++ b/data/gui/accounts_window.ui Sat Dec 14 09:57:50 2013 +0100 @@ -432,6 +432,7 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="invisible_char">●</property> + <signal name="focus_out_event" handler="on_cert_entry1_focus_out_event"/> </object> <packing> <property name="position">1</property>
1
0
0
0
gajim: support direct invitation (XEP-0249). Fixes #7581
by Gajim
30 Dec '13
30 Dec '13
changeset 207a253a058f in /home/hg/repos/gajim author: Yann Leboulanger <asterix(a)lagaule.org> branches: gtk3
details:http://hg.gajim.org/gajim?cmd=changeset;node=207a253a058f
description: support direct invitation (XEP-0249). Fixes #7581 diffstat: src/common/connection.py | 17 +++++++- src/common/connection_handlers_events.py | 57 +++++++++++++++++++++++-------- src/common/contacts.py | 1 + src/common/gajim.py | 2 +- src/roster_window.py | 2 +- 5 files changed, 59 insertions(+), 20 deletions(-) diffs (158 lines): diff -r 4c59a680b4c5 -r 207a253a058f src/common/connection.py --- a/src/common/connection.py Wed Nov 27 18:20:49 2013 +0100 +++ b/src/common/connection.py Thu Nov 28 21:24:17 2013 +0100 @@ -1383,8 +1383,7 @@ errnum = con.Connection.ssl_errnum except AttributeError: errnum = [] # we don't have an errnum - i = 0 - for er in errnum: + for i, er in enumerate(errnum): if er > 0 and str(er) not in gajim.config.get_per('accounts', self.name, 'ignore_ssl_errors').split(): text = _('The authenticity of the %s certificate could be ' @@ -1399,7 +1398,6 @@ fingerprint=con.Connection.ssl_fingerprint_sha1[i], certificate=con.Connection.ssl_certificate[i])) return True - i += 1 if len(con.Connection.ssl_fingerprint_sha1): saved_fingerprint = gajim.config.get_per('accounts', self.name, 'ssl_fingerprint_sha1') @@ -2846,6 +2844,19 @@ """ Send invitation """ + contact = gajim.contacts.get_contact_from_full_jid(self.name, to) + if contact and contact.supports(nbxmpp.NS_CONFERENCE): + # send direct invite + message=nbxmpp.Message(to=to) + attrs = {'jid': room} + if reason: + attrs['reason'] = reason + if continue_tag: + attrs['continue'] = 'true' + c = message.addChild(name='x', attrs=attrs, + namespace=nbxmpp.NS_CONFERENCE) + self.connection.send(message) + return message=nbxmpp.Message(to=room) c = message.addChild(name='x', namespace=nbxmpp.NS_MUC_USER) c = c.addChild(name='invite', attrs={'to': to}) diff -r 4c59a680b4c5 -r 207a253a058f src/common/connection_handlers_events.py --- a/src/common/connection_handlers_events.py Wed Nov 27 18:20:49 2013 +0100 +++ b/src/common/connection_handlers_events.py Thu Nov 28 21:24:17 2013 +0100 @@ -1077,10 +1077,15 @@ self.invite_tag = None self.decline_tag = None if not self.enc_tag: + # Direct invitation? self.invite_tag = self.stanza.getTag('x', - namespace=nbxmpp.NS_MUC_USER) - if self.invite_tag and not self.invite_tag.getTag('invite'): - self.invite_tag = None + namespace=nbxmpp.NS_CONFERENCE) + # Mediated invitation? + if not self.invite_tag: + self.invite_tag = self.stanza.getTag('x', + namespace=nbxmpp.NS_MUC_USER) + if self.invite_tag and not self.invite_tag.getTag('invite'): + self.invite_tag = None self.decline_tag = self.stanza.getTag('x', namespace=nbxmpp.NS_MUC_USER) @@ -1193,25 +1198,47 @@ base_network_events = [] def generate(self): - self.room_jid = self.msg_obj.fjid + invite_tag = self.msg_obj.invite_tag + if invite_tag.getNamespace() == nbxmpp.NS_CONFERENCE: + # direct invitation + try: + self.room_jid = helpers.parse_jid(invite_tag.getAttr('jid')) + except helpers.InvalidFormat: + log.warn('Invalid JID: %s, ignoring it' % invite_tag.getAttr( + 'jid')) + return + self.jid_from = self.msg_obj.fjid + self.reason = invite_tag.getAttr('reason') + self.password = invite_tag.getAttr('password') + self.is_continued = False + if invite_tag.getAttr('continue') == 'true': + self.is_continued = True + else + self.room_jid = self.msg_obj.fjid + item = self.msg_obj.invite_tag.getTag('invite') + try: + self.jid_from = helpers.parse_jid(item.getAttr('from')) + except helpers.InvalidFormat: + log.warning('Invalid JID: %s, ignoring it' % item.getAttr( + 'from')) + return - item = self.msg_obj.invite_tag.getTag('invite') - try: - self.jid_from = helpers.parse_jid(item.getAttr('from')) - except helpers.InvalidFormat: - log.warning('Invalid JID: %s, ignoring it' % item.getAttr('from')) + self.reason = item.getTagData('reason') + self.password = invite_tag.getTagData('password') + + self.is_continued = False + if item.getTag('continue'): + self.is_continued = True + + if self.room_jid in gajim.gc_connected[self.conn.name] and \ + gajim.gc_connected[self.conn.name][self.room_jid]: + # We are already in groupchat. Ignore invitation return jid = gajim.get_jid_without_resource(self.jid_from) if gajim.config.get_per('accounts', self.conn.name, 'ignore_unknown_contacts') and not gajim.contacts.get_contacts( self.conn.name, jid): return - self.reason = item.getTagData('reason') - self.password = self.msg_obj.invite_tag.getTagData('password') - - self.is_continued = False - if item.getTag('continue'): - self.is_continued = True return True diff -r 4c59a680b4c5 -r 207a253a058f src/common/contacts.py --- a/src/common/contacts.py Wed Nov 27 18:20:49 2013 +0100 +++ b/src/common/contacts.py Thu Nov 28 21:24:17 2013 +0100 @@ -488,6 +488,7 @@ for c in self._contacts[jid]: if c.resource == resource: return c + return self._contacts[jid][0] def iter_contacts(self): for jid in list(self._contacts.keys()): diff -r 4c59a680b4c5 -r 207a253a058f src/common/gajim.py --- a/src/common/gajim.py Wed Nov 27 18:20:49 2013 +0100 +++ b/src/common/gajim.py Thu Nov 28 21:24:17 2013 +0100 @@ -212,7 +212,7 @@ nbxmpp.NS_SSN, nbxmpp.NS_MOOD, nbxmpp.NS_ACTIVITY, nbxmpp.NS_NICK, nbxmpp.NS_ROSTERX, nbxmpp.NS_SECLABEL, nbxmpp.NS_HASHES, nbxmpp.NS_HASHES_MD5, nbxmpp.NS_HASHES_SHA1, nbxmpp.NS_HASHES_SHA256, - nbxmpp.NS_HASHES_SHA512, nbxmpp.NS_CORRECT] + nbxmpp.NS_HASHES_SHA512, nbxmpp.NS_CORRECT, nbxmpp.NS_CONFERENCE] # Optional features gajim supports per account gajim_optional_features = {} diff -r 4c59a680b4c5 -r 207a253a058f src/roster_window.py --- a/src/roster_window.py Wed Nov 27 18:20:49 2013 +0100 +++ b/src/roster_window.py Thu Nov 28 21:24:17 2013 +0100 @@ -3335,7 +3335,7 @@ break def on_invite_to_room(self, widget, list_, room_jid, room_account, - resource=None): + resource=None): """ Resource parameter MUST NOT be used if more than one contact in list """
1
0
0
0
gajim: prevent traceback. Fixes #7572
by Gajim
30 Dec '13
30 Dec '13
changeset 87d6efc7a38a in /home/hg/repos/gajim author: Yann Leboulanger <asterix(a)lagaule.org> branches: gtk3
details:http://hg.gajim.org/gajim?cmd=changeset;node=87d6efc7a38a
description: prevent traceback. Fixes #7572 diffstat: src/gui_interface.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diffs (12 lines): diff -r 207a253a058f -r 87d6efc7a38a src/gui_interface.py --- a/src/gui_interface.py Thu Nov 28 21:24:17 2013 +0100 +++ b/src/gui_interface.py Sat Nov 30 09:48:18 2013 +0100 @@ -1688,6 +1688,8 @@ event = gajim.events.get_first_event(account, fjid, type_) if not event: event = gajim.events.get_first_event(account, jid, type_) + if not event: + return if type_ == 'printed_pm': ctrl = event.parameters[2]
1
0
0
0
gajim: Make threads usable under windows so GPG works correctly....
by Gajim
30 Dec '13
30 Dec '13
changeset 64a1590d8962 in /home/hg/repos/gajim author: Yann Leboulanger <asterix(a)lagaule.org> branches: gtk3
details:http://hg.gajim.org/gajim?cmd=changeset;node=64a1590d8962
description: Make threads usable under windows so GPG works correctly. Fixes #7565 diffstat: src/gajim.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diffs (19 lines): diff -r 87d6efc7a38a -r 64a1590d8962 src/gajim.py --- a/src/gajim.py Sat Nov 30 09:48:18 2013 +0100 +++ b/src/gajim.py Sat Nov 30 10:00:10 2013 +0100 @@ -209,6 +209,7 @@ GObject.set_prgname('gajim') from gi.repository import Gtk from gi.repository import Gdk + from gi.repository import GLib except Warning as msg2: if str(msg2) == 'could not open display': print(_('Gajim needs X server to run. Quiting...'), file=sys.stderr) @@ -492,6 +493,7 @@ interface.run() try: + GLib.threads_init() Gtk.main() except KeyboardInterrupt: print('KeyboardInterrupt', file=sys.stderr)
1
0
0
0
← Newer
1
2
3
4
5
...
16
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Results per page:
10
25
50
100
200