Add encryption API to groupchat_control

This commit is contained in:
Philipp Hörist 2017-05-07 14:02:11 +02:00
parent ce7923e164
commit 2e148a6133
7 changed files with 157 additions and 20 deletions

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 --> <!-- Generated with glade 3.20.0 -->
<interface> <interface>
<requires lib="gtk+" version="3.12"/> <requires lib="gtk+" version="3.12"/>
<object class="GtkImage" id="image1"> <object class="GtkImage" id="image1">
@ -126,6 +126,36 @@
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkBox" id="hbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="spacing">3</property>
<child>
<object class="GtkButton" id="authentication_button">
<property name="name">ChatControl-AuthenticationButton</property>
<property name="can_focus">True</property>
<property name="focus_on_click">False</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="no_show_all">True</property>
<property name="relief">none</property>
<child>
<object class="GtkImage" id="lock_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-dialog-authentication</property>
<property name="icon_size">1</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child> <child>
<object class="GtkScrolledWindow" id="message_scrolledwindow"> <object class="GtkScrolledWindow" id="message_scrolledwindow">
<property name="visible">True</property> <property name="visible">True</property>
@ -138,12 +168,19 @@
</child> </child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">True</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
</object> </object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing> <packing>
<property name="resize">False</property> <property name="resize">False</property>
<property name="shrink">False</property> <property name="shrink">False</property>
@ -214,12 +251,12 @@
<object class="GtkButton" id="formattings_button"> <object class="GtkButton" id="formattings_button">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="focus_on_click">False</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="has_tooltip">True</property> <property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">Show a list of formattings</property> <property name="tooltip_text" translatable="yes">Show a list of formattings</property>
<property name="relief">none</property> <property name="relief">none</property>
<property name="focus_on_click">False</property>
<child> <child>
<object class="GtkImage" id="image11"> <object class="GtkImage" id="image11">
<property name="visible">True</property> <property name="visible">True</property>
@ -364,12 +401,12 @@
<object class="GtkButton" id="muc_window_actions_button"> <object class="GtkButton" id="muc_window_actions_button">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="focus_on_click">False</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="has_tooltip">True</property> <property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">Show advanced functions (Alt+D)</property> <property name="tooltip_text" translatable="yes">Show advanced functions (Alt+D)</property>
<property name="relief">none</property> <property name="relief">none</property>
<property name="focus_on_click">False</property>
<child> <child>
<object class="GtkImage" id="image1344"> <object class="GtkImage" id="image1344">
<property name="visible">True</property> <property name="visible">True</property>
@ -397,7 +434,24 @@
</packing> </packing>
</child> </child>
<child> <child>
<placeholder/> <object class="GtkMenuButton" id="encryption_menu">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="relief">none</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">channel-secure-symbolic.symbolic</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">10</property>
</packing>
</child> </child>
<child> <child>
<object class="GtkButton" id="send_button"> <object class="GtkButton" id="send_button">
@ -418,6 +472,9 @@
<property name="position">11</property> <property name="position">11</property>
</packing> </packing>
</child> </child>
<child>
<placeholder/>
</child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>

View File

@ -286,7 +286,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)) gui_menu_builder.get_encryption_menu(self.contact, self.type_id))
# restore previous conversation # restore previous conversation
self.restore_conversation() self.restore_conversation()
self.msg_textview.grab_focus() self.msg_textview.grab_focus()

View File

@ -398,6 +398,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools):
self.encryption = 'disabled' self.encryption = 'disabled'
self.set_encryption_state() self.set_encryption_state()
if self.parent_win:
self.add_window_actions() self.add_window_actions()
# PluginSystem: adding GUI extension point for ChatControlBase # PluginSystem: adding GUI extension point for ChatControlBase
@ -435,6 +436,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools):
if not plugin.activate_encryption(self): if not plugin.activate_encryption(self):
return return
else: else:
if not self.widget_name == 'groupchat_control':
self.terminate_esessions() self.terminate_esessions()
action.set_state(param) action.set_state(param)
gajim.config.set_per( gajim.config.set_per(

View File

@ -2672,6 +2672,14 @@ class Connection(CommonConnection, ConnectionHandlers):
def _nec_gc_stanza_message_outgoing(self, obj): def _nec_gc_stanza_message_outgoing(self, obj):
if obj.conn.name != self.name: if obj.conn.name != self.name:
return return
encryption = gajim.config.get_per('contacts', obj.jid, 'encryption')
if encryption != 'disabled':
gajim.plugin_manager.gui_extension_point(
'gc_encrypt' + encryption, self, obj, self.send_gc_message)
else:
self.send_gc_message(obj)
def send_gc_message(self, obj):
if obj.correction_msg: if obj.correction_msg:
obj.msg_id = self.connection.send(obj.correction_msg) obj.msg_id = self.connection.send(obj.correction_msg)
else: else:

View File

@ -481,6 +481,19 @@ class GroupchatControl(ChatControlBase):
self.form_widget = None self.form_widget = None
# Encryption
self.lock_image = self.xml.get_object('lock_image')
self.authentication_button = self.xml.get_object(
'authentication_button')
id_ = self.authentication_button.connect('clicked',
self._on_authentication_button_clicked)
self.handlers[id_] = self.authentication_button
self.set_lock_image()
self.encryption_menu = self.xml.get_object('encryption_menu')
self.encryption_menu.set_menu_model(
gui_menu_builder.get_encryption_menu(self.contact, self.type_id))
gajim.ged.register_event_handler('gc-presence-received', ged.GUI1, gajim.ged.register_event_handler('gc-presence-received', ged.GUI1,
self._nec_gc_presence_received) self._nec_gc_presence_received)
gajim.ged.register_event_handler('gc-message-received', ged.GUI1, gajim.ged.register_event_handler('gc-message-received', ged.GUI1,
@ -508,6 +521,11 @@ class GroupchatControl(ChatControlBase):
# instance object # instance object
gajim.plugin_manager.gui_extension_point('groupchat_control', self) gajim.plugin_manager.gui_extension_point('groupchat_control', self)
def on_groupchat_maximize(self):
self.set_tooltip()
self.add_window_actions()
self.set_lock_image()
def set_tooltip(self): def set_tooltip(self):
widget = self.xml.get_object('list_treeview') widget = self.xml.get_object('list_treeview')
if widget.get_tooltip_window(): if widget.get_tooltip_window():
@ -751,6 +769,42 @@ class GroupchatControl(ChatControlBase):
for nick in gajim.contacts.get_nick_list(self.account, self.room_jid): for nick in gajim.contacts.get_nick_list(self.account, self.room_jid):
self.draw_contact(nick) self.draw_contact(nick)
def set_lock_image(self):
visible = self.encryption != 'disabled'
encryption_state = {'visible': visible,
'enc_type': self.encryption,
'authenticated': False}
gajim.plugin_manager.gui_extension_point(
'encryption_state' + self.encryption, self, encryption_state)
self._show_lock_image(**encryption_state)
def _show_lock_image(self, visible, enc_type='',
authenticated=False):
"""
Set lock icon visibility and create tooltip
"""
if authenticated:
authenticated_string = _('and authenticated')
img_path = gtkgui_helpers.get_icon_path('security-high')
else:
authenticated_string = _('and NOT authenticated')
img_path = gtkgui_helpers.get_icon_path('security-low')
self.lock_image.set_from_file(img_path)
tooltip = _('%(type)s encryption is active %(authenticated)s.') % {
'type': enc_type, 'authenticated': authenticated_string}
self.authentication_button.set_tooltip_text(tooltip)
self.widget_set_visible(self.authentication_button, not visible)
self.lock_image.set_sensitive(visible)
def _on_authentication_button_clicked(self, widget):
gajim.plugin_manager.gui_extension_point(
'encryption_dialog' + self.encryption, self)
def _change_style(self, model, path, iter_, option): def _change_style(self, model, path, iter_, option):
model[iter_][Column.NICK] = model[iter_][Column.NICK] model[iter_][Column.NICK] = model[iter_][Column.NICK]
@ -1966,6 +2020,13 @@ class GroupchatControl(ChatControlBase):
if not message: if not message:
return return
if self.encryption:
self.sendmessage = True
gajim.plugin_manager.gui_extension_point(
'send_message' + self.encryption, self)
if not self.sendmessage:
return
if process_commands and self.process_as_command(message): if process_commands and self.process_as_command(message):
return return

View File

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

View File

@ -3220,7 +3220,7 @@ class RosterWindow:
ctrl._on_window_motion_notify) ctrl._on_window_motion_notify)
ctrl.handlers[id_] = mw.window ctrl.handlers[id_] = mw.window
ctrl.parent_win = mw ctrl.parent_win = mw
ctrl.set_tooltip() ctrl.on_groupchat_maximize()
mw.new_tab(ctrl) mw.new_tab(ctrl)
mw.set_active_tab(ctrl) mw.set_active_tab(ctrl)
mw.window.get_window().focus(Gtk.get_current_event_time()) mw.window.get_window().focus(Gtk.get_current_event_time())