~martijnbraam/keyring

c4706fff5ccc72cd9e524b8cf51fd048f67ee415 — Martijn Braam 1 year, 3 months ago 3b4dc87 0.1.0
Handle himitsud not being available
3 files changed, 252 insertions(+), 217 deletions(-)

M himitsu_gtk/himitsu.py
M himitsu_gtk/ui/main.glade
M himitsu_gtk/window.py
M himitsu_gtk/himitsu.py => himitsu_gtk/himitsu.py +1 -1
@@ 11,7 11,7 @@ class Himitsu:
            self.path = os.path.join(os.getenv('XDG_RUNTIME_DIR'), 'himitsu')

        if not os.path.exists(self.path):
            raise RuntimeError(f"Himitsu socket not found: {self.path}")
            raise ConnectionError(f"Himitsu socket not found: {self.path}")

    def _readline(self, s):
        buffer = b''

M himitsu_gtk/ui/main.glade => himitsu_gtk/ui/main.glade +239 -212
@@ 31,132 31,164 @@
    <property name="default-height">600</property>
    <signal name="destroy" handler="on_main_window_destroy" swapped="no"/>
    <child>
      <object class="GtkBox">
      <object class="GtkStack" id="statusstack">
        <property name="visible">True</property>
        <property name="can-focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="HdyLeaflet" id="leaflet">
          <object class="GtkBox">
            <property name="visible">True</property>
            <property name="can-focus">False</property>
            <signal name="notify::folded" handler="on_leaflet_change" swapped="no"/>
            <signal name="notify::visible-child" handler="on_leaflet_change" swapped="no"/>
            <property name="orientation">vertical</property>
            <child>
              <object class="GtkBox" id="keys">
              <object class="HdyLeaflet" id="leaflet">
                <property name="visible">True</property>
                <property name="can-focus">False</property>
                <property name="hexpand">True</property>
                <property name="orientation">vertical</property>
                <signal name="notify::folded" handler="on_leaflet_change" swapped="no"/>
                <signal name="notify::visible-child" handler="on_leaflet_change" swapped="no"/>
                <child>
                  <object class="GtkSearchEntry" id="search">
                  <object class="GtkBox" id="keys">
                    <property name="visible">True</property>
                    <property name="can-focus">True</property>
                    <property name="margin-start">8</property>
                    <property name="margin-end">8</property>
                    <property name="margin-top">8</property>
                    <property name="margin-bottom">8</property>
                    <property name="primary-icon-name">edit-find-symbolic</property>
                    <property name="primary-icon-activatable">False</property>
                    <property name="primary-icon-sensitive">False</property>
                    <signal name="search-changed" handler="on_search_changed" swapped="no"/>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="fill">True</property>
                    <property name="position">0</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkScrolledWindow">
                    <property name="visible">True</property>
                    <property name="can-focus">True</property>
                    <property name="can-focus">False</property>
                    <property name="hexpand">True</property>
                    <property name="orientation">vertical</property>
                    <child>
                      <object class="GtkViewport">
                      <object class="GtkSearchEntry" id="search">
                        <property name="visible">True</property>
                        <property name="can-focus">False</property>
                        <property name="shadow-type">none</property>
                        <property name="can-focus">True</property>
                        <property name="margin-start">8</property>
                        <property name="margin-end">8</property>
                        <property name="margin-top">8</property>
                        <property name="margin-bottom">8</property>
                        <property name="primary-icon-name">edit-find-symbolic</property>
                        <property name="primary-icon-activatable">False</property>
                        <property name="primary-icon-sensitive">False</property>
                        <signal name="search-changed" handler="on_search_changed" swapped="no"/>
                      </object>
                      <packing>
                        <property name="expand">False</property>
                        <property name="fill">True</property>
                        <property name="position">0</property>
                      </packing>
                    </child>
                    <child>
                      <object class="GtkScrolledWindow">
                        <property name="visible">True</property>
                        <property name="can-focus">True</property>
                        <child>
                          <object class="GtkListBox" id="keylist">
                          <object class="GtkViewport">
                            <property name="visible">True</property>
                            <property name="can-focus">False</property>
                            <signal name="row-activated" handler="on_keyrow_activated" swapped="no"/>
                            <property name="shadow-type">none</property>
                            <child>
                              <object class="GtkListBox" id="keylist">
                                <property name="visible">True</property>
                                <property name="can-focus">False</property>
                                <signal name="row-activated" handler="on_keyrow_activated" swapped="no"/>
                              </object>
                            </child>
                          </object>
                        </child>
                      </object>
                      <packing>
                        <property name="expand">True</property>
                        <property name="fill">True</property>
                        <property name="position">1</property>
                      </packing>
                    </child>
                  </object>
                  <packing>
                    <property name="expand">True</property>
                    <property name="fill">True</property>
                    <property name="position">1</property>
                    <property name="name">sidebar</property>
                  </packing>
                </child>
              </object>
              <packing>
                <property name="name">sidebar</property>
              </packing>
            </child>
            <child>
              <object class="GtkSeparator">
                <property name="visible">True</property>
                <property name="can-focus">False</property>
                <property name="orientation">vertical</property>
                <style>
                  <class name="sidebar"/>
                </style>
              </object>
            </child>
            <child>
              <object class="GtkStack" id="mainstack">
                <property name="visible">True</property>
                <property name="can-focus">False</property>
                <property name="hexpand">True</property>
                <child>
                  <object class="HdyStatusPage">
                  <object class="GtkSeparator">
                    <property name="visible">True</property>
                    <property name="can-focus">False</property>
                    <property name="icon-name">nl.brixit.Keyring</property>
                    <property name="title" translatable="yes">Keyring</property>
                    <property name="description" translatable="yes">Select a key on the left for key information</property>
                    <child>
                      <placeholder/>
                    </child>
                    <property name="orientation">vertical</property>
                    <style>
                      <class name="sidebar"/>
                    </style>
                  </object>
                  <packing>
                    <property name="name">nokey</property>
                    <property name="title" translatable="yes">No key</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkScrolledWindow">
                  <object class="GtkStack" id="mainstack">
                    <property name="visible">True</property>
                    <property name="can-focus">True</property>
                    <property name="can-focus">False</property>
                    <property name="hexpand">True</property>
                    <child>
                      <object class="GtkViewport">
                      <object class="HdyStatusPage">
                        <property name="visible">True</property>
                        <property name="can-focus">False</property>
                        <property name="shadow-type">none</property>
                        <property name="icon-name">nl.brixit.Keyring</property>
                        <property name="title" translatable="yes">Keyring</property>
                        <property name="description" translatable="yes">Select a key on the left for key information</property>
                        <child>
                          <placeholder/>
                        </child>
                      </object>
                      <packing>
                        <property name="name">nokey</property>
                        <property name="title" translatable="yes">No key</property>
                      </packing>
                    </child>
                    <child>
                      <object class="GtkScrolledWindow">
                        <property name="visible">True</property>
                        <property name="can-focus">True</property>
                        <child>
                          <object class="GtkBox">
                          <object class="GtkViewport">
                            <property name="visible">True</property>
                            <property name="can-focus">False</property>
                            <property name="orientation">vertical</property>
                            <property name="shadow-type">none</property>
                            <child>
                              <object class="GtkBox">
                                <property name="visible">True</property>
                                <property name="can-focus">False</property>
                                <property name="margin-start">12</property>
                                <property name="margin-end">12</property>
                                <property name="margin-top">12</property>
                                <property name="margin-bottom">12</property>
                                <property name="hexpand">True</property>
                                <property name="orientation">vertical</property>
                                <child>
                                  <object class="GtkButton" id="decrypt">
                                    <property name="label" translatable="yes">Decrypt</property>
                                  <object class="GtkBox">
                                    <property name="visible">True</property>
                                    <property name="can-focus">True</property>
                                    <property name="receives-default">True</property>
                                    <signal name="clicked" handler="on_decrypt_clicked" swapped="no"/>
                                    <property name="can-focus">False</property>
                                    <property name="margin-start">12</property>
                                    <property name="margin-end">12</property>
                                    <property name="margin-top">12</property>
                                    <property name="margin-bottom">12</property>
                                    <property name="hexpand">True</property>
                                    <child>
                                      <object class="GtkButton" id="decrypt">
                                        <property name="label" translatable="yes">Decrypt</property>
                                        <property name="visible">True</property>
                                        <property name="can-focus">True</property>
                                        <property name="receives-default">True</property>
                                        <signal name="clicked" handler="on_decrypt_clicked" swapped="no"/>
                                      </object>
                                      <packing>
                                        <property name="expand">False</property>
                                        <property name="fill">True</property>
                                        <property name="position">0</property>
                                      </packing>
                                    </child>
                                    <child>
                                      <placeholder/>
                                    </child>
                                    <child>
                                      <object class="GtkButton" id="delete">
                                        <property name="label" translatable="yes">Delete</property>
                                        <property name="visible">True</property>
                                        <property name="can-focus">True</property>
                                        <property name="receives-default">True</property>
                                        <signal name="clicked" handler="on_delete_clicked" swapped="no"/>
                                        <style>
                                          <class name="destructive-action"/>
                                        </style>
                                      </object>
                                      <packing>
                                        <property name="expand">False</property>
                                        <property name="fill">True</property>
                                        <property name="pack-type">end</property>
                                        <property name="position">2</property>
                                      </packing>
                                    </child>
                                  </object>
                                  <packing>
                                    <property name="expand">False</property>


@@ 165,192 197,187 @@
                                  </packing>
                                </child>
                                <child>
                                  <placeholder/>
                                  <object class="GtkListBox" id="keyinfo">
                                    <property name="visible">True</property>
                                    <property name="can-focus">False</property>
                                    <property name="margin-start">12</property>
                                    <property name="margin-end">12</property>
                                    <property name="margin-top">12</property>
                                    <property name="margin-bottom">12</property>
                                    <property name="selection-mode">none</property>
                                    <property name="activate-on-single-click">False</property>
                                    <signal name="row-activated" handler="on_key_row_activate" swapped="no"/>
                                    <style>
                                      <class name="content"/>
                                    </style>
                                  </object>
                                  <packing>
                                    <property name="expand">False</property>
                                    <property name="fill">True</property>
                                    <property name="position">1</property>
                                  </packing>
                                </child>
                                <child>
                                  <object class="GtkButton" id="delete">
                                    <property name="label" translatable="yes">Delete</property>
                                  <object class="GtkLabel">
                                    <property name="visible">True</property>
                                    <property name="can-focus">True</property>
                                    <property name="receives-default">True</property>
                                    <signal name="clicked" handler="on_delete_clicked" swapped="no"/>
                                    <property name="can-focus">False</property>
                                    <property name="halign">start</property>
                                    <property name="margin-start">12</property>
                                    <property name="margin-end">12</property>
                                    <property name="margin-top">12</property>
                                    <property name="margin-bottom">12</property>
                                    <property name="label" translatable="yes">Double click on a row to copy the value to the clipboard</property>
                                    <property name="wrap">True</property>
                                    <style>
                                      <class name="destructive-action"/>
                                      <class name="dim-label"/>
                                    </style>
                                  </object>
                                  <packing>
                                    <property name="expand">False</property>
                                    <property name="fill">True</property>
                                    <property name="pack-type">end</property>
                                    <property name="position">2</property>
                                  </packing>
                                </child>
                              </object>
                              <packing>
                                <property name="expand">False</property>
                                <property name="fill">True</property>
                                <property name="position">0</property>
                              </packing>
                            </child>
                            <child>
                              <object class="GtkListBox" id="keyinfo">
                                <property name="visible">True</property>
                                <property name="can-focus">False</property>
                                <property name="margin-start">12</property>
                                <property name="margin-end">12</property>
                                <property name="margin-top">12</property>
                                <property name="margin-bottom">12</property>
                                <property name="selection-mode">none</property>
                                <property name="activate-on-single-click">False</property>
                                <signal name="row-activated" handler="on_key_row_activate" swapped="no"/>
                                <style>
                                  <class name="content"/>
                                </style>
                              </object>
                              <packing>
                                <property name="expand">False</property>
                                <property name="fill">True</property>
                                <property name="position">1</property>
                              </packing>
                            </child>
                            <child>
                              <object class="GtkLabel">
                                <property name="visible">True</property>
                                <property name="can-focus">False</property>
                                <property name="halign">start</property>
                                <property name="margin-start">12</property>
                                <property name="margin-end">12</property>
                                <property name="margin-top">12</property>
                                <property name="margin-bottom">12</property>
                                <property name="label" translatable="yes">Double click on a row to copy the value to the clipboard</property>
                                <property name="wrap">True</property>
                                <style>
                                  <class name="dim-label"/>
                                </style>
                              </object>
                              <packing>
                                <property name="expand">False</property>
                                <property name="fill">True</property>
                                <property name="position">2</property>
                              </packing>
                            </child>
                          </object>
                        </child>
                      </object>
                      <packing>
                        <property name="name">keyinfo</property>
                        <property name="title" translatable="yes">page0</property>
                        <property name="position">1</property>
                      </packing>
                    </child>
                  </object>
                  <packing>
                    <property name="name">keyinfo</property>
                    <property name="title" translatable="yes">page0</property>
                    <property name="position">1</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkScrolledWindow">
                    <property name="visible">True</property>
                    <property name="can-focus">True</property>
                    <child>
                      <object class="GtkViewport">
                      <object class="GtkScrolledWindow">
                        <property name="visible">True</property>
                        <property name="can-focus">False</property>
                        <property name="shadow-type">none</property>
                        <property name="can-focus">True</property>
                        <child>
                          <object class="GtkBox">
                          <object class="GtkViewport">
                            <property name="visible">True</property>
                            <property name="can-focus">False</property>
                            <property name="margin-start">12</property>
                            <property name="margin-end">12</property>
                            <property name="margin-top">12</property>
                            <property name="margin-bottom">12</property>
                            <property name="orientation">vertical</property>
                            <property name="spacing">12</property>
                            <child>
                              <object class="GtkLabel">
                                <property name="visible">True</property>
                                <property name="can-focus">False</property>
                                <property name="label" translatable="yes">Add new key</property>
                                <style>
                                  <class name="heading"/>
                                </style>
                              </object>
                              <packing>
                                <property name="expand">False</property>
                                <property name="fill">True</property>
                                <property name="position">0</property>
                              </packing>
                            </child>
                            <child>
                              <object class="GtkListBox" id="addkey">
                                <property name="visible">True</property>
                                <property name="can-focus">False</property>
                                <property name="selection-mode">none</property>
                                <property name="activate-on-single-click">False</property>
                                <style>
                                  <class name="content"/>
                                </style>
                              </object>
                              <packing>
                                <property name="expand">False</property>
                                <property name="fill">True</property>
                                <property name="position">1</property>
                              </packing>
                            </child>
                            <property name="shadow-type">none</property>
                            <child>
                              <object class="GtkBox">
                                <property name="visible">True</property>
                                <property name="can-focus">False</property>
                                <property name="spacing">8</property>
                                <property name="margin-start">12</property>
                                <property name="margin-end">12</property>
                                <property name="margin-top">12</property>
                                <property name="margin-bottom">12</property>
                                <property name="orientation">vertical</property>
                                <property name="spacing">12</property>
                                <child>
                                  <object class="GtkButton" id="add_key_save">
                                    <property name="label" translatable="yes">Save</property>
                                  <object class="GtkLabel">
                                    <property name="visible">True</property>
                                    <property name="can-focus">True</property>
                                    <property name="receives-default">True</property>
                                    <signal name="clicked" handler="on_save_clicked" swapped="no"/>
                                    <property name="can-focus">False</property>
                                    <property name="label" translatable="yes">Add new key</property>
                                    <style>
                                      <class name="suggested-action"/>
                                      <class name="heading"/>
                                    </style>
                                  </object>
                                  <packing>
                                    <property name="expand">False</property>
                                    <property name="fill">True</property>
                                    <property name="pack-type">end</property>
                                    <property name="position">0</property>
                                  </packing>
                                </child>
                                <child>
                                  <placeholder/>
                                  <object class="GtkListBox" id="addkey">
                                    <property name="visible">True</property>
                                    <property name="can-focus">False</property>
                                    <property name="selection-mode">none</property>
                                    <property name="activate-on-single-click">False</property>
                                    <style>
                                      <class name="content"/>
                                    </style>
                                  </object>
                                  <packing>
                                    <property name="expand">False</property>
                                    <property name="fill">True</property>
                                    <property name="position">1</property>
                                  </packing>
                                </child>
                                <child>
                                  <placeholder/>
                                  <object class="GtkBox">
                                    <property name="visible">True</property>
                                    <property name="can-focus">False</property>
                                    <property name="spacing">8</property>
                                    <child>
                                      <object class="GtkButton" id="add_key_save">
                                        <property name="label" translatable="yes">Save</property>
                                        <property name="visible">True</property>
                                        <property name="can-focus">True</property>
                                        <property name="receives-default">True</property>
                                        <signal name="clicked" handler="on_save_clicked" swapped="no"/>
                                        <style>
                                          <class name="suggested-action"/>
                                        </style>
                                      </object>
                                      <packing>
                                        <property name="expand">False</property>
                                        <property name="fill">True</property>
                                        <property name="pack-type">end</property>
                                        <property name="position">0</property>
                                      </packing>
                                    </child>
                                    <child>
                                      <placeholder/>
                                    </child>
                                    <child>
                                      <placeholder/>
                                    </child>
                                  </object>
                                  <packing>
                                    <property name="expand">False</property>
                                    <property name="fill">True</property>
                                    <property name="position">2</property>
                                  </packing>
                                </child>
                              </object>
                              <packing>
                                <property name="expand">False</property>
                                <property name="fill">True</property>
                                <property name="position">2</property>
                              </packing>
                            </child>
                          </object>
                        </child>
                      </object>
                      <packing>
                        <property name="name">add</property>
                        <property name="title" translatable="yes">Add key</property>
                        <property name="position">2</property>
                      </packing>
                    </child>
                  </object>
                  <packing>
                    <property name="name">add</property>
                    <property name="title" translatable="yes">Add key</property>
                    <property name="position">2</property>
                    <property name="name">main</property>
                  </packing>
                </child>
              </object>
              <packing>
                <property name="name">main</property>
                <property name="expand">True</property>
                <property name="fill">True</property>
                <property name="position">1</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="name">connected</property>
            <property name="title" translatable="yes">page0</property>
          </packing>
        </child>
        <child>
          <object class="HdyStatusPage">
            <property name="visible">True</property>
            <property name="can-focus">False</property>
            <property name="icon-name">nl.brixit.Keyring</property>
            <property name="title" translatable="yes">Cannot connect</property>
            <property name="description" translatable="yes">The Himitsu keyring daemon is not available</property>
            <child>
              <placeholder/>
            </child>
          </object>
          <packing>
            <property name="name">error</property>
            <property name="title" translatable="yes">page1</property>
            <property name="position">1</property>
          </packing>
        </child>

M himitsu_gtk/window.py => himitsu_gtk/window.py +12 -4
@@ 35,6 35,7 @@ class KeyringWindow:
        self.window = builder.get_object("window")
        self.window.set_application(self.application)
        self.mainstack = builder.get_object("mainstack")
        self.statusstack = builder.get_object("statusstack")
        self.headerstack = builder.get_object("headerstack")
        self.leaflet = builder.get_object("leaflet")
        self.keylist = builder.get_object("keylist")


@@ 49,8 50,11 @@ class KeyringWindow:
        self.window.show()
        self.key = None

        self.himitsu = Himitsu()
        self.load_keys()
        try:
            self.himitsu = Himitsu()
            self.load_keys()
        except ConnectionError:
            self.statusstack.set_visible_child_name('error')
        self.add_entry_key = []
        self.add_entry_val = []
        self.search = []


@@ 80,10 84,13 @@ class KeyringWindow:
            'xmpp': 'XMPP',
            'irc': 'IRC',
        }
        try:
            keys = self.himitsu.query()
        except ConnectionError:
            self.statusstack.set_visible_child_name('error')
            return

        keys = self.himitsu.query()
        self.empty(self.keylist)

        grouped = {}
        for key in keys:
            proto = key['proto']


@@ 104,6 111,7 @@ class KeyringWindow:
        if None in grouped:
            self._make_group("Unsorted", grouped[None])

        self.statusstack.set_visible_child_name('connected')
        self.keylist.show_all()

    def _make_group(self, name, keys):