Use unique id as action name instead of jid

A jid can contain characters that are not allowed in an action name.
This creates a unique UUID4 for each MessageControl and uses it as
action name instead.

We can reuse the UUID for other actions that belong to the
MessageControl

Fixes #8636
This commit is contained in:
Philipp Hörist 2017-08-18 18:52:04 +02:00
parent d20f2201f2
commit 10f8fe2bb5
5 changed files with 11 additions and 9 deletions

View File

@ -288,7 +288,7 @@ class ChatControl(ChatControlBase):
self.encryption_menu = self.xml.get_object('encryption_menu') self.encryption_menu = self.xml.get_object('encryption_menu')
self.encryption_menu.set_menu_model( self.encryption_menu.set_menu_model(
gui_menu_builder.get_encryption_menu(self.contact, self.type_id)) gui_menu_builder.get_encryption_menu(self.control_id, self.type_id))
self.set_encryption_menu_icon() self.set_encryption_menu_icon()
# restore previous conversation # restore previous conversation
self.restore_conversation() self.restore_conversation()

View File

@ -416,7 +416,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools):
def add_window_actions(self): def add_window_actions(self):
action = Gio.SimpleAction.new_stateful( action = Gio.SimpleAction.new_stateful(
"%s-encryptiongroup" % self.contact.jid, "set-encryption-%s" % self.control_id,
GLib.VariantType.new("s"), GLib.VariantType.new("s"),
GLib.Variant("s", self.encryption or 'disabled')) GLib.Variant("s", self.encryption or 'disabled'))
action.connect("change-state", self.change_encryption) action.connect("change-state", self.change_encryption)

View File

@ -495,7 +495,7 @@ class GroupchatControl(ChatControlBase):
self.encryption_menu = self.xml.get_object('encryption_menu') self.encryption_menu = self.xml.get_object('encryption_menu')
self.encryption_menu.set_menu_model( self.encryption_menu.set_menu_model(
gui_menu_builder.get_encryption_menu(self.contact, self.type_id)) gui_menu_builder.get_encryption_menu(self.control_id, self.type_id))
self.set_encryption_menu_icon() self.set_encryption_menu_icon()
gajim.ged.register_event_handler('gc-presence-received', ged.GUI1, gajim.ged.register_event_handler('gc-presence-received', ged.GUI1,

View File

@ -752,11 +752,10 @@ def build_bookmark_menu(account):
menu.insert_submenu(1, label, bookmark_menu) menu.insert_submenu(1, label, bookmark_menu)
def get_encryption_menu(contact, type_id): def get_encryption_menu(control_id, type_id):
menu = Gio.Menu() menu = Gio.Menu()
menu.append( menu.append(
'Disabled', 'win.{}-encryptiongroup::{}'.format(contact.jid, 'Disabled', 'win.set-encryption-{}::{}'.format(control_id, 'disabled'))
'disabled'))
for name, plugin in gajim.plugin_manager.encryption_plugins.items(): for name, plugin in gajim.plugin_manager.encryption_plugins.items():
if type_id == 'gc': if type_id == 'gc':
if not hasattr(plugin, 'allow_groupchat'): if not hasattr(plugin, 'allow_groupchat'):
@ -764,8 +763,8 @@ def get_encryption_menu(contact, type_id):
if type_id == 'pm': if type_id == 'pm':
if not hasattr(plugin, 'allow_privatchat'): if not hasattr(plugin, 'allow_privatchat'):
continue continue
menu_action = 'win.{}-encryptiongroup::{}'.format( menu_action = 'win.set-encryption-{}::{}'.format(
contact.jid, name) control_id, name)
menu.append(name, menu_action) menu.append(name, menu_action)
if menu.get_n_items() == 1: if menu.get_n_items() == 1:
return None return None

View File

@ -27,6 +27,7 @@
## ##
import gtkgui_helpers import gtkgui_helpers
import uuid
from common import gajim from common import gajim
from common import helpers from common import helpers
@ -58,7 +59,9 @@ class MessageControl(object):
self.account = account self.account = account
self.hide_chat_buttons = False self.hide_chat_buttons = False
self.resource = resource self.resource = resource
# control_id is a unique id for the control,
# its used as action name for actions that belong to a control
self.control_id = str(uuid.uuid4())
self.session = None self.session = None
gajim.last_message_time[self.account][self.get_full_jid()] = 0 gajim.last_message_time[self.account][self.get_full_jid()] = 0