22
22
# Contact the authors at <mandos@fukt.bsnet.se>.
25
from __future__ import (division, absolute_import, print_function,
25
from __future__ import division, absolute_import, print_function, unicode_literals
49
48
logging.getLogger('dbus.proxies').setLevel(logging.CRITICAL)
51
50
# Some useful constants
52
domain = 'se.recompile'
51
domain = 'se.bsnet.fukt'
53
52
server_interface = domain + '.Mandos'
54
53
client_interface = domain + '.Mandos.Client'
57
56
# Always run in monochrome mode
58
57
urwid.curses_display.curses.has_colors = lambda : False
87
86
self.proxy = proxy_object # Mandos Client proxy object
89
88
self.properties = dict()
90
self.property_changed_match = (
91
self.proxy.connect_to_signal("PropertyChanged",
92
self.property_changed,
89
self.proxy.connect_to_signal("PropertyChanged",
90
self.property_changed,
96
94
self.properties.update(
97
95
self.proxy.GetAll(client_interface,
98
96
dbus_interface = dbus.PROPERTIES_IFACE))
100
#XXX This breaks good super behaviour
98
#XXX This break good super behaviour!
101
99
# super(MandosClientPropertyCache, self).__init__(
102
100
# *args, **kwargs)
108
106
# Update properties dict with new value
109
107
self.properties[property] = value
111
def delete(self, *args, **kwargs):
112
self.property_changed_match.remove()
113
super(MandosClientPropertyCache, self).__init__(
117
110
class MandosClientWidget(urwid.FlowWidget, MandosClientPropertyCache):
161
154
if self.need_approval:
162
155
self.using_timer(True)
164
self.match_objects = (
165
self.proxy.connect_to_signal("CheckerCompleted",
166
self.checker_completed,
169
self.proxy.connect_to_signal("CheckerStarted",
170
self.checker_started,
173
self.proxy.connect_to_signal("GotSecret",
177
self.proxy.connect_to_signal("NeedApproval",
181
self.proxy.connect_to_signal("Rejected",
185
#self.logger('Created client %s' % (self.properties["Name"]))
157
self.proxy.connect_to_signal("CheckerCompleted",
158
self.checker_completed,
161
self.proxy.connect_to_signal("CheckerStarted",
162
self.checker_started,
165
self.proxy.connect_to_signal("GotSecret",
169
self.proxy.connect_to_signal("NeedApproval",
173
self.proxy.connect_to_signal("Rejected",
187
178
def property_changed(self, property=None, value=None):
188
179
super(self, MandosClientWidget).property_changed(property,
315
305
message = "Denial in %s. (a)pprove?"
316
306
message = message % unicode(timer).rsplit(".", 1)[0]
317
307
elif self.last_checker_failed:
318
# When checker has failed, print a timer until client expires
319
expires = self.properties["Expires"]
321
timer = datetime.timedelta(0)
323
expires = datetime.datetime.strptime(expires,
324
'%Y-%m-%dT%H:%M:%S.%f')
325
timer = expires - datetime.datetime.utcnow()
308
timeout = datetime.timedelta(milliseconds
311
last_ok = isoformat_to_datetime(
312
max((self.properties["LastCheckedOK"]
313
or self.properties["Created"]),
314
self.properties["LastEnabled"]))
315
timer = timeout - (datetime.datetime.utcnow() - last_ok)
326
316
message = ('A checker has failed! Time until client'
327
317
' gets disabled: %s'
328
318
% unicode(timer).rsplit(".", 1)[0])
347
337
self.update_hook()
349
339
def update_timer(self):
350
"""called by gobject. Will indefinitely loop until
351
gobject.source_remove() on tag is called"""
353
342
return True # Keep calling this
355
def delete(self, *args, **kwargs):
356
345
if self._update_timer_callback_tag is not None:
357
346
gobject.source_remove(self._update_timer_callback_tag)
358
347
self._update_timer_callback_tag = None
359
for match in self.match_objects:
361
self.match_objects = ()
362
348
if self.delete_hook is not None:
363
349
self.delete_hook(self)
364
return super(MandosClientWidget, self).delete(*args, **kwargs)
366
351
def render(self, maxcolrow, focus=False):
367
352
"""Render differently if we have focus.
374
359
This overrides the method from urwid.FlowWidget"""
376
self.proxy.Enable(dbus_interface = client_interface,
361
self.proxy.Enable(dbus_interface = client_interface)
379
self.proxy.Disable(dbus_interface = client_interface,
363
self.proxy.Disable(dbus_interface = client_interface)
382
365
self.proxy.Approve(dbus.Boolean(True, variant_level=1),
383
dbus_interface = client_interface,
366
dbus_interface = client_interface)
386
368
self.proxy.Approve(dbus.Boolean(False, variant_level=1),
387
dbus_interface = client_interface,
369
dbus_interface = client_interface)
389
370
elif key == "R" or key == "_" or key == "ctrl k":
390
371
self.server_proxy_object.RemoveClient(self.proxy
394
self.proxy.StartChecker(dbus_interface = client_interface,
374
self.proxy.StartChecker(dbus_interface = client_interface)
397
self.proxy.StopChecker(dbus_interface = client_interface,
376
self.proxy.StopChecker(dbus_interface = client_interface)
400
self.proxy.CheckedOK(dbus_interface = client_interface,
378
self.proxy.CheckedOK(dbus_interface = client_interface)
403
380
# elif key == "p" or key == "=":
404
381
# self.proxy.pause()
595
572
#self.log_message("Wrap mode: " + self.log_wrap)
597
574
def find_and_remove_client(self, path, name):
598
"""Find a client by its object path and remove it.
575
"""Find an client from its object path and remove it.
600
577
This is connected to the ClientRemoved signal from the
601
578
Mandos server object."""
603
580
client = self.clients_dict[path]
606
self.log_message("Unknown client %r (%r) removed", name,
584
self.remove_client(client, path)
611
586
def add_new_client(self, path):
612
587
client_proxy_object = self.bus.get_object(self.busname, path)