Merge branch 'invite' into 'master'
Fix mediated groupchat invites Closes #8603 and #8468 See merge request !92
This commit is contained in:
commit
9be4bb3ad8
|
@ -1210,14 +1210,6 @@ class ConnectionHandlersBase:
|
||||||
self.dispatch_error_message(obj.stanza, obj.msgtxt,
|
self.dispatch_error_message(obj.stanza, obj.msgtxt,
|
||||||
obj.session, obj.fjid, obj.timestamp)
|
obj.session, obj.fjid, obj.timestamp)
|
||||||
return True
|
return True
|
||||||
elif obj.invite_tag is not None:
|
|
||||||
gajim.nec.push_incoming_event(GcInvitationReceivedEvent(None,
|
|
||||||
conn=self, msg_obj=obj))
|
|
||||||
return True
|
|
||||||
elif obj.decline_tag is not None:
|
|
||||||
gajim.nec.push_incoming_event(GcDeclineReceivedEvent(None,
|
|
||||||
conn=self, msg_obj=obj))
|
|
||||||
return True
|
|
||||||
elif obj.mtype == 'groupchat':
|
elif obj.mtype == 'groupchat':
|
||||||
gajim.nec.push_incoming_event(GcMessageReceivedEvent(None,
|
gajim.nec.push_incoming_event(GcMessageReceivedEvent(None,
|
||||||
conn=self, msg_obj=obj))
|
conn=self, msg_obj=obj))
|
||||||
|
|
|
@ -1115,7 +1115,7 @@ class MessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
||||||
|
|
||||||
def init(self):
|
def init(self):
|
||||||
self.additional_data = {}
|
self.additional_data = {}
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.conn = self.base_event.conn
|
self.conn = self.base_event.conn
|
||||||
self.stanza = self.base_event.stanza
|
self.stanza = self.base_event.stanza
|
||||||
|
@ -1197,24 +1197,32 @@ class MessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
||||||
return
|
return
|
||||||
|
|
||||||
self.enc_tag = self.stanza.getTag('x', namespace=nbxmpp.NS_ENCRYPTED)
|
self.enc_tag = self.stanza.getTag('x', namespace=nbxmpp.NS_ENCRYPTED)
|
||||||
|
|
||||||
self.invite_tag = None
|
|
||||||
self.decline_tag = None
|
|
||||||
if not self.enc_tag:
|
if not self.enc_tag:
|
||||||
# Direct invitation?
|
|
||||||
self.invite_tag = self.stanza.getTag('x',
|
|
||||||
namespace=nbxmpp.NS_CONFERENCE)
|
|
||||||
# Mediated invitation?
|
# Mediated invitation?
|
||||||
if not self.invite_tag:
|
muc_user = self.stanza.getTag('x', namespace=nbxmpp.NS_MUC_USER)
|
||||||
self.invite_tag = self.stanza.getTag('x',
|
if muc_user:
|
||||||
namespace=nbxmpp.NS_MUC_USER)
|
if muc_user.getTag('decline'):
|
||||||
if self.invite_tag and not self.invite_tag.getTag('invite'):
|
gajim.nec.push_incoming_event(
|
||||||
self.invite_tag = None
|
GcDeclineReceivedEvent(
|
||||||
|
None, conn=self.conn,
|
||||||
self.decline_tag = self.stanza.getTag('x',
|
room_jid=self.fjid, stanza=muc_user))
|
||||||
namespace=nbxmpp.NS_MUC_USER)
|
return
|
||||||
if self.decline_tag and not self.decline_tag.getTag('decline'):
|
if muc_user.getTag('invite'):
|
||||||
self.decline_tag = None
|
gajim.nec.push_incoming_event(
|
||||||
|
GcInvitationReceivedEvent(
|
||||||
|
None, conn=self.conn, jid_from=self.fjid,
|
||||||
|
mediated=True, stanza=muc_user))
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
# Direct invitation?
|
||||||
|
direct = self.stanza.getTag(
|
||||||
|
'x', namespace=nbxmpp.NS_CONFERENCE)
|
||||||
|
if direct:
|
||||||
|
gajim.nec.push_incoming_event(
|
||||||
|
GcInvitationReceivedEvent(
|
||||||
|
None, conn=self.conn, jid_from=self.fjid,
|
||||||
|
mediated=False, stanza=direct))
|
||||||
|
return
|
||||||
|
|
||||||
self.thread_id = self.stanza.getThread()
|
self.thread_id = self.stanza.getThread()
|
||||||
self.mtype = self.stanza.getType()
|
self.mtype = self.stanza.getType()
|
||||||
|
@ -1329,46 +1337,42 @@ class GcInvitationReceivedEvent(nec.NetworkIncomingEvent):
|
||||||
base_network_events = []
|
base_network_events = []
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
invite_tag = self.msg_obj.invite_tag
|
account = self.conn.name
|
||||||
if invite_tag.getNamespace() == nbxmpp.NS_CONFERENCE:
|
if not self.mediated:
|
||||||
# direct invitation
|
# direct invitation
|
||||||
try:
|
try:
|
||||||
self.room_jid = helpers.parse_jid(invite_tag.getAttr('jid'))
|
self.room_jid = helpers.parse_jid(self.stanza.getAttr('jid'))
|
||||||
except helpers.InvalidFormat:
|
except helpers.InvalidFormat:
|
||||||
log.warning('Invalid JID: %s, ignoring it', invite_tag.getAttr(
|
log.warning('Invalid JID: %s, ignoring it',
|
||||||
'jid'))
|
self.stanza.getAttr('jid'))
|
||||||
return
|
return
|
||||||
self.jid_from = self.msg_obj.fjid
|
self.reason = self.stanza.getAttr('reason')
|
||||||
self.reason = invite_tag.getAttr('reason')
|
self.password = self.stanza.getAttr('password')
|
||||||
self.password = invite_tag.getAttr('password')
|
|
||||||
self.is_continued = False
|
self.is_continued = False
|
||||||
if invite_tag.getAttr('continue') == 'true':
|
self.is_continued = self.stanza.getAttr('continue') == 'true'
|
||||||
self.is_continued = True
|
|
||||||
else:
|
else:
|
||||||
self.room_jid = self.msg_obj.fjid
|
self.invite = self.stanza.getTag('invite')
|
||||||
item = self.msg_obj.invite_tag.getTag('invite')
|
self.room_jid = self.jid_from
|
||||||
try:
|
try:
|
||||||
self.jid_from = helpers.parse_jid(item.getAttr('from'))
|
self.jid_from = helpers.parse_jid(self.invite.getAttr('from'))
|
||||||
except helpers.InvalidFormat:
|
except helpers.InvalidFormat:
|
||||||
log.warning('Invalid JID: %s, ignoring it' % item.getAttr(
|
log.warning('Invalid JID: %s, ignoring it',
|
||||||
'from'))
|
self.invite.getAttr('from'))
|
||||||
return
|
return
|
||||||
|
|
||||||
self.reason = item.getTagData('reason')
|
self.reason = self.invite.getTagData('reason')
|
||||||
self.password = invite_tag.getTagData('password')
|
self.password = self.stanza.getTagData('password')
|
||||||
|
self.is_continued = self.stanza.getTag('continue') is not None
|
||||||
|
|
||||||
self.is_continued = False
|
if self.room_jid in gajim.gc_connected[account] and \
|
||||||
if item.getTag('continue'):
|
gajim.gc_connected[account][self.room_jid]:
|
||||||
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
|
# We are already in groupchat. Ignore invitation
|
||||||
return
|
return
|
||||||
jid = gajim.get_jid_without_resource(self.jid_from)
|
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(
|
ignore = gajim.config.get_per(
|
||||||
self.conn.name, jid):
|
'accounts', account, 'ignore_unknown_contacts')
|
||||||
|
if ignore and not gajim.contacts.get_contacts(account, jid):
|
||||||
return
|
return
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
@ -1378,20 +1382,20 @@ class GcDeclineReceivedEvent(nec.NetworkIncomingEvent):
|
||||||
base_network_events = []
|
base_network_events = []
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.room_jid = self.msg_obj.fjid
|
account = self.conn.name
|
||||||
|
decline = self.stanza.getTag('decline')
|
||||||
item = self.msg_obj.decline_tag.getTag('decline')
|
|
||||||
try:
|
try:
|
||||||
self.jid_from = helpers.parse_jid(item.getAttr('from'))
|
self.jid_from = helpers.parse_jid(decline.getAttr('from'))
|
||||||
except helpers.InvalidFormat:
|
except helpers.InvalidFormat:
|
||||||
log.warning('Invalid JID: %s, ignoring it' % item.getAttr('from'))
|
log.warning('Invalid JID: %s, ignoring it',
|
||||||
|
decline.getAttr('from'))
|
||||||
return
|
return
|
||||||
jid = gajim.get_jid_without_resource(self.jid_from)
|
jid = gajim.get_jid_without_resource(self.jid_from)
|
||||||
if gajim.config.get_per('accounts', self.conn.name,
|
ignore = gajim.config.get_per(
|
||||||
'ignore_unknown_contacts') and not gajim.contacts.get_contacts(
|
'accounts', account, 'ignore_unknown_contacts')
|
||||||
self.conn.name, jid):
|
if ignore and not gajim.contacts.get_contacts(account, jid):
|
||||||
return
|
return
|
||||||
self.reason = item.getTagData('reason')
|
self.reason = decline.getTagData('reason')
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@ -1408,8 +1412,6 @@ class DecryptedMessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
||||||
self.fjid = self.msg_obj.fjid
|
self.fjid = self.msg_obj.fjid
|
||||||
self.resource = self.msg_obj.resource
|
self.resource = self.msg_obj.resource
|
||||||
self.mtype = self.msg_obj.mtype
|
self.mtype = self.msg_obj.mtype
|
||||||
self.invite_tag = self.msg_obj.invite_tag
|
|
||||||
self.decline_tag = self.msg_obj.decline_tag
|
|
||||||
self.thread_id = self.msg_obj.thread_id
|
self.thread_id = self.msg_obj.thread_id
|
||||||
self.msgtxt = self.msg_obj.msgtxt
|
self.msgtxt = self.msg_obj.msgtxt
|
||||||
self.gc_control = self.msg_obj.gc_control
|
self.gc_control = self.msg_obj.gc_control
|
||||||
|
|
|
@ -1680,16 +1680,11 @@ class Interface:
|
||||||
gajim.events.add_event(account, jid, event)
|
gajim.events.add_event(account, jid, event)
|
||||||
|
|
||||||
self.roster.show_title()
|
self.roster.show_title()
|
||||||
if no_queue: # We didn't have a queue: we change icons
|
if no_queue: # We didn't have a queue: we change icons
|
||||||
if not gajim.contacts.get_contact_with_highest_priority(account,
|
if gajim.contacts.get_contact_with_highest_priority(account, jid):
|
||||||
jid):
|
|
||||||
if event.type_ == 'gc-invitation':
|
|
||||||
self.roster.add_groupchat(jid, account, status='offline')
|
|
||||||
else:
|
|
||||||
# add contact to roster ("Not In The Roster") if he is not
|
|
||||||
self.roster.add_to_not_in_the_roster(account, jid)
|
|
||||||
else:
|
|
||||||
self.roster.draw_contact(jid, account)
|
self.roster.draw_contact(jid, account)
|
||||||
|
else:
|
||||||
|
self.roster.add_to_not_in_the_roster(account, jid)
|
||||||
|
|
||||||
# Select the big brother contact in roster, it's visible because it has
|
# Select the big brother contact in roster, it's visible because it has
|
||||||
# events.
|
# events.
|
||||||
|
|
Loading…
Reference in New Issue