83
86
properties and calls a hook function when any of them are
86
def __init__(self, proxy_object=None, *args, **kwargs):
89
def __init__(self, proxy_object=None, properties=None, **kwargs):
87
90
self.proxy = proxy_object # Mandos Client proxy object
89
self.properties = dict()
91
self.properties = dict() if properties is None else properties
90
92
self.property_changed_match = (
91
93
self.proxy.connect_to_signal("PropertyChanged",
92
self.property_changed,
94
self._property_changed,
96
self.properties.update(
97
self.proxy.GetAll(client_interface,
98
dbus_interface = dbus.PROPERTIES_IFACE))
100
#XXX This breaks good super behaviour
101
# super(MandosClientPropertyCache, self).__init__(
98
if properties is None:
99
self.properties.update(
100
self.proxy.GetAll(client_interface,
102
= dbus.PROPERTIES_IFACE))
104
super(MandosClientPropertyCache, self).__init__(**kwargs)
106
def _property_changed(self, property, value):
107
"""Helper which takes positional arguments"""
108
return self.property_changed(property=property, value=value)
104
110
def property_changed(self, property=None, value=None):
105
111
"""This is called whenever we get a PropertyChanged signal
181
184
using_timer(bool(value))
182
185
if property == "LastCheckerStatus":
183
186
using_timer(value != 0)
184
#self.logger('Checker for client %s (command "%s")'
186
# % (self.properties["Name"], command))
187
#self.logger('Checker for client {0} (command "{1}") was '
188
# ' successful'.format(self.properties["Name"],
188
191
def using_timer(self, flag):
189
192
"""Call this method with True or False when timer should be
211
214
if os.WIFEXITED(condition):
212
self.logger('Checker for client %s (command "%s")'
213
' failed with exit code %s'
214
% (self.properties["Name"], command,
215
os.WEXITSTATUS(condition)))
215
self.logger('Checker for client {0} (command "{1}")'
216
' failed with exit code {2}'
217
.format(self.properties["Name"], command,
218
os.WEXITSTATUS(condition)))
216
219
elif os.WIFSIGNALED(condition):
217
self.logger('Checker for client %s (command "%s")'
218
' was killed by signal %s'
219
% (self.properties["Name"], command,
220
os.WTERMSIG(condition)))
220
self.logger('Checker for client {0} (command "{1}") was'
221
' killed by signal {2}'
222
.format(self.properties["Name"], command,
223
os.WTERMSIG(condition)))
221
224
elif os.WCOREDUMP(condition):
222
self.logger('Checker for client %s (command "%s")'
225
self.logger('Checker for client {0} (command "{1}")'
224
% (self.properties["Name"], command))
227
.format(self.properties["Name"], command))
226
self.logger('Checker for client %s completed'
229
self.logger('Checker for client {0} completed'
231
.format(self.properties["Name"]))
230
234
def checker_started(self, command):
231
235
"""Server signals that a checker started. This could be useful
232
236
to log in the future. """
233
#self.logger('Client %s started checker "%s"'
234
# % (self.properties["Name"], unicode(command)))
237
#self.logger('Client {0} started checker "{1}"'
238
# .format(self.properties["Name"],
237
242
def got_secret(self):
238
self.logger('Client %s received its secret'
239
% self.properties["Name"])
243
self.logger('Client {0} received its secret'
244
.format(self.properties["Name"]))
241
246
def need_approval(self, timeout, default):
243
message = 'Client %s needs approval within %s seconds'
248
message = 'Client {0} needs approval within {1} seconds'
245
message = 'Client %s will get its secret in %s seconds'
247
% (self.properties["Name"], timeout/1000))
250
message = 'Client {0} will get its secret in {1} seconds'
251
self.logger(message.format(self.properties["Name"],
248
253
self.using_timer(True)
250
255
def rejected(self, reason):
251
self.logger('Client %s was rejected; reason: %s'
252
% (self.properties["Name"], reason))
256
self.logger('Client {0} was rejected; reason: {1}'
257
.format(self.properties["Name"], reason))
254
259
def selectable(self):
255
260
"""Make this a "selectable" widget.
298
302
timer = datetime.timedelta()
299
303
if self.properties["ApprovedByDefault"]:
300
message = "Approval in %s. (d)eny?"
304
message = "Approval in {0}. (d)eny?"
302
message = "Denial in %s. (a)pprove?"
303
message = message % unicode(timer).rsplit(".", 1)[0]
306
message = "Denial in {0}. (a)pprove?"
307
message = message.format(unicode(timer).rsplit(".", 1)[0])
304
308
elif self.properties["LastCheckerStatus"] != 0:
305
# When checker has failed, print a timer until client expires
309
# When checker has failed, show timer until client expires
306
310
expires = self.properties["Expires"]
307
311
if expires == "":
308
312
timer = datetime.timedelta(0)
310
expires = datetime.datetime.strptime(expires,
311
'%Y-%m-%dT%H:%M:%S.%f')
314
expires = (datetime.datetime.strptime
315
(expires, '%Y-%m-%dT%H:%M:%S.%f'))
312
316
timer = expires - datetime.datetime.utcnow()
313
317
message = ('A checker has failed! Time until client'
315
% unicode(timer).rsplit(".", 1)[0])
318
' gets disabled: {0}'
319
.format(unicode(timer).rsplit(".", 1)[0]))
317
321
message = "enabled"
318
self._text = "%s%s" % (base, message)
322
self._text = "{0}{1}".format(base, message)
320
324
if not urwid.supports_unicode():
321
325
self._text = self._text.encode("ascii", "replace")
399
def property_changed(self, property=None, value=None,
403
def property_changed(self, property=None, **kwargs):
401
404
"""Call self.update() if old value is not new value.
402
405
This overrides the method from MandosClientPropertyCache"""
403
406
property_name = unicode(property)
404
407
old_value = self.properties.get(property_name)
405
408
super(MandosClientWidget, self).property_changed(
406
property=property, value=value, *args, **kwargs)
409
property=property, **kwargs)
407
410
if self.properties.get(property_name) != old_value:
413
416
"down" key presses, thus not allowing any containing widgets to
414
417
use them as an excuse to shift focus away from this widget.
416
def keypress(self, maxcolrow, key):
417
ret = super(ConstrainedListBox, self).keypress(maxcolrow, key)
419
def keypress(self, *args, **kwargs):
420
ret = super(ConstrainedListBox, self).keypress(*args, **kwargs)
418
421
if ret in ("up", "down"):
486
489
self.main_loop = gobject.MainLoop()
488
491
def client_not_found(self, fingerprint, address):
489
self.log_message(("Client with address %s and fingerprint %s"
490
" could not be found" % (address,
492
self.log_message("Client with address {0} and fingerprint"
493
" {1} could not be found"
494
.format(address, fingerprint))
493
496
def rebuild(self):
494
497
"""This rebuilds the User Interface.