chiark / gitweb /
Upgrade licence to GPLv3+.
[tripe] / mon / tripemon.in
index b7c50243309fd33b26ebca9afa876fbd89b4a5ef..a0c0f5e4fa1252fd15e580d1880cc93ef5ab3634 100644 (file)
 ###
 ### This file is part of Trivial IP Encryption (TrIPE).
 ###
-### TrIPE is free software; you can redistribute it and/or modify
-### it under the terms of the GNU General Public License as published by
-### the Free Software Foundation; either version 2 of the License, or
-### (at your option) any later version.
+### TrIPE is free software: you can redistribute it and/or modify it under
+### the terms of the GNU General Public License as published by the Free
+### Software Foundation; either version 3 of the License, or (at your
+### option) any later version.
 ###
-### TrIPE is distributed in the hope that it will be useful,
-### but WITHOUT ANY WARRANTY; without even the implied warranty of
-### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-### GNU General Public License for more details.
+### TrIPE is distributed in the hope that it will be useful, but WITHOUT
+### ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+### FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+### for more details.
 ###
 ### You should have received a copy of the GNU General Public License
-### along with TrIPE; if not, write to the Free Software Foundation,
-### Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+### along with TrIPE.  If not, see <https://www.gnu.org/licenses/>.
 
 ###--------------------------------------------------------------------------
 ### Dependencies.
@@ -48,6 +47,7 @@ try:
   import gobject as GO
   import gtk.gdk as GDK
   GL = GO
+  GDK.KEY_Escape = G.keysyms.Escape
   def raise_window(w): w.window.raise_()
   combo_box_text = G.combo_box_new_text
   def set_entry_bg(e, c): e.modify_base(G.STATE_NORMAL, c)
@@ -311,6 +311,7 @@ class Peer (MonitorObject):
     """Initialize the object with the given name."""
     MonitorObject.__init__(me, name)
     me.pinghook = HookList()
+    me.__dict__.update(conn.algs(name))
     me.update()
 
   def update(me, hunoz = None):
@@ -556,6 +557,17 @@ class MyWindow (MyWindowMixin):
     G.Window.__init__(me, kind)
     me.mywininit()
 
+class TrivialWindowMixin (MyWindowMixin):
+  """A simple window which you can close with Escape."""
+  def mywininit(me):
+    super(TrivialWindowMixin, me).mywininit()
+    me.connect('key-press-event', me._keypress)
+  def _keypress(me, _, ev):
+    if ev.keyval == GDK.KEY_Escape: me.destroy()
+
+class TrivialWindow (MyWindow, TrivialWindowMixin):
+  pass
+
 class MyDialog (G.Dialog, MyWindowMixin, HookClient):
   """A dialogue box with a closehook and sensible button binding."""
 
@@ -778,21 +790,21 @@ def numericvalidate(min = None, max = None):
 ###--------------------------------------------------------------------------
 ### Various minor dialog boxen.
 
-GPL = """This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+GPL = """\
+TrIPE is free software: you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3 of the License, or (at your
+option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+TrIPE is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
 
 You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software Foundation,
-Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA."""
+along with TrIPE.  If not, see <https://www.gnu.org/licenses/>."""
 
-class AboutBox (G.AboutDialog, MyWindowMixin):
+class AboutBox (G.AboutDialog, TrivialWindowMixin):
   """The program `About' box."""
   def __init__(me):
     G.AboutDialog.__init__(me)
@@ -873,7 +885,7 @@ class WarningLogModel (LogModel):
     """Call with a new warning message."""
     me.add(tag, ' '.join([T.quotify(w) for w in rest]))
 
-class LogViewer (MyWindow):
+class LogViewer (TrivialWindow):
   """
   A log viewer window.
 
@@ -889,7 +901,7 @@ class LogViewer (MyWindow):
     """
     Create a log viewer showing the LogModel MODEL.
     """
-    MyWindow.__init__(me)
+    TrivialWindow.__init__(me)
     me.model = model
     scr = MyScrolledWindow()
     me.list = MyTreeView(me.model)
@@ -1052,53 +1064,71 @@ class AddPeerDialog (MyDialog):
                                ValidatingEntry(numericvalidate(0, 65535),
                                                '4070',
                                                5))
-    me.c_keepalive = G.CheckButton('Keepalives')
     me.l_tunnel = table.labelled('Tunnel', combo_box_text(),
                                  newlinep = True, width = 3)
     me.tuns = conn.tunnels()
     for t in me.tuns:
       me.l_tunnel.append_text(t)
     me.l_tunnel.set_active(0)
+
+    def tickybox_sensitivity(tickybox, target):
+      tickybox.connect('toggled',
+                       lambda t: target.set_sensitive (t.get_active()))
+
+    me.c_keepalive = G.CheckButton('Keepalives')
     table.pack(me.c_keepalive, newlinep = True, xopt = G.FILL)
-    me.c_keepalive.connect('toggled',
-                           lambda t: me.e_keepalive.set_sensitive\
-                                      (t.get_active()))
     me.e_keepalive = ValidatingEntry(r'^\d+[hms]?$', '', 5)
     me.e_keepalive.set_sensitive(False)
+    tickybox_sensitivity(me.c_keepalive, me.e_keepalive)
     table.pack(me.e_keepalive, width = 3)
+
+    me.c_mobile = G.CheckButton('Mobile')
+    table.pack(me.c_mobile, newlinep = True, width = 4, xopt = G.FILL)
+
+    me.c_peerkey = G.CheckButton('Peer key tag')
+    table.pack(me.c_peerkey, newlinep = True, xopt = G.FILL)
+    me.e_peerkey = ValidatingEntry(r'^[^.:\s]+$', '', 16)
+    me.e_peerkey.set_sensitive(False)
+    tickybox_sensitivity(me.c_peerkey, me.e_peerkey)
+    table.pack(me.e_peerkey, width = 3)
+
+    me.c_privkey = G.CheckButton('Private key tag')
+    table.pack(me.c_privkey, newlinep = True, xopt = G.FILL)
+    me.e_privkey = ValidatingEntry(r'^[^.:\s]+$', '', 16)
+    me.e_privkey.set_sensitive(False)
+    tickybox_sensitivity(me.c_privkey, me.e_privkey)
+    table.pack(me.e_privkey, width = 3)
+
     me.show_all()
 
   def ok(me):
     """Handle an OK press: create the peer."""
     try:
-      if me.c_keepalive.get_active():
-        ka = me.e_keepalive.get_text()
-      else:
-        ka = None
       t = me.l_tunnel.get_active()
-      if t == 0:
-        tun = None
-      else:
-        tun = me.tuns[t]
-        me._addpeer(me.e_name.get_text(),
-                    me.e_addr.get_text(),
-                    me.e_port.get_text(),
-                    ka,
-                    tun)
+      me._addpeer(me.e_name.get_text(),
+                  me.e_addr.get_text(),
+                  me.e_port.get_text(),
+                  keepalive = (me.c_keepalive.get_active() and
+                               me.e_keepalive.get_text() or None),
+                  tunnel = t and me.tuns[t] or None,
+                  key = (me.c_peerkey.get_active() and
+                         me.e_peerkey.get_text() or None),
+                  priv = (me.c_privkey.get_active() and
+                          me.e_privkey.get_text() or None))
     except ValidationError:
       GDK.beep()
       return
 
   @incr
-  def _addpeer(me, name, addr, port, keepalive, tunnel):
+  def _addpeer(me, *args, **kw):
     """Coroutine function: actually do the ADD command."""
     try:
-      conn.add(name, addr, port, keepalive = keepalive, tunnel = tunnel)
+      conn.add(*args, **kw)
       me.destroy()
     except T.TripeError, exc:
       T.defer(moanbox, ' '.join(exc))
 
-class ServInfo (MyWindow):
+class ServInfo (TrivialWindow):
   """
   Show information about the server and available services.
 
@@ -1109,7 +1139,7 @@ class ServInfo (MyWindow):
   """
 
   def __init__(me):
-    MyWindow.__init__(me)
+    TrivialWindow.__init__(me)
     me.set_title('TrIPE server info')
     table = GridPacker()
     me.add(table)
@@ -1226,6 +1256,15 @@ statsxlate = \
 ## the entry.
 statslayout = \
   [('Start time', '%(start-time)s'),
+   ('Private key', '%(current-key)s'),
+   ('Diffie-Hellman group',
+    '%(kx-group)s '
+    '(%(kx-group-order-bits)s-bit order, '
+    '%(kx-group-elt-bits)s-bit elements)'),
+   ('Cipher',
+    '%(cipher)s (%(cipher-keysz)s-bit key, %(cipher-blksz)s-bit block)'),
+   ('Mac', '%(mac)s (%(mac-keysz)s-bit key, %(mac-tagsz)s-bit tag)'),
+   ('Hash', '%(hash)s (%(hash-sz)s-bit output)'),
    ('Last key-exchange', '%(last-keyexch-time)s'),
    ('Last packet', '%(last-packet-time)s'),
    ('Packets in/out',
@@ -1236,7 +1275,7 @@ statslayout = \
     '%(ip-packets-in)s (%(ip-bytes-in)s) / %(ip-packets-out)s (%(ip-bytes-out)s)'),
    ('Rejected packets', '%(rejected-packets)s')]
 
-class PeerWindow (MyWindow):
+class PeerWindow (TrivialWindow):
   """
   Show information about a peer.
 
@@ -1254,7 +1293,7 @@ class PeerWindow (MyWindow):
   def __init__(me, peer):
     """Construct a PeerWindow, showing information about PEER."""
 
-    MyWindow.__init__(me)
+    TrivialWindow.__init__(me)
     me.set_title('TrIPE statistics: %s' % peer.name)
     me.peer = peer
 
@@ -1313,6 +1352,7 @@ class PeerWindow (MyWindow):
       stat = conn.stats(me.peer.name)
       for s, trans in statsxlate:
         stat[s] = trans(stat[s])
+      stat.update(me.peer.__dict__)
       for label, format in statslayout:
         me.e[label].set_text(format % stat)
       GL.timeout_add(1000, lambda: me.cr.switch() and False)
@@ -1348,10 +1388,10 @@ class PeerWindow (MyWindow):
 ###--------------------------------------------------------------------------
 ### Cryptographic status.
 
-class CryptoInfo (MyWindow):
+class CryptoInfo (TrivialWindow):
   """Simple display of cryptographic algorithms in use."""
   def __init__(me):
-    MyWindow.__init__(me)
+    TrivialWindow.__init__(me)
     me.set_title('Cryptographic algorithms')
     T.aside(me.populate)
   def populate(me):