/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk

« back to all changes in this revision

Viewing changes to mandos

  • Committer: Teddy Hogeborn
  • Date: 2012-05-05 09:33:27 UTC
  • Revision ID: teddy@recompile.se-20120505093327-kzn0kkia6rhpciwd
* mandos-ctl: Break long lines.
* mandos-monitor: - '' -

Show diffs side-by-side

added added

removed removed

Lines of Context:
209
209
        return decrypted_plaintext
210
210
 
211
211
 
 
212
 
212
213
class AvahiError(Exception):
213
214
    def __init__(self, value, *args, **kwargs):
214
215
        self.value = value
243
244
    server: D-Bus Server
244
245
    bus: dbus.SystemBus()
245
246
    """
246
 
    
247
247
    def __init__(self, interface = avahi.IF_UNSPEC, name = None,
248
248
                 servicetype = None, port = None, TXT = None,
249
249
                 domain = "", host = "", max_renames = 32768,
262
262
        self.server = None
263
263
        self.bus = bus
264
264
        self.entry_group_state_changed_match = None
265
 
    
266
265
    def rename(self):
267
266
        """Derived from the Avahi example code"""
268
267
        if self.rename_count >= self.max_renames:
282
281
            self.cleanup()
283
282
            os._exit(1)
284
283
        self.rename_count += 1
285
 
    
286
284
    def remove(self):
287
285
        """Derived from the Avahi example code"""
288
286
        if self.entry_group_state_changed_match is not None:
290
288
            self.entry_group_state_changed_match = None
291
289
        if self.group is not None:
292
290
            self.group.Reset()
293
 
    
294
291
    def add(self):
295
292
        """Derived from the Avahi example code"""
296
293
        self.remove()
313
310
            dbus.UInt16(self.port),
314
311
            avahi.string_array_to_txt_array(self.TXT))
315
312
        self.group.Commit()
316
 
    
317
313
    def entry_group_state_changed(self, state, error):
318
314
        """Derived from the Avahi example code"""
319
315
        logger.debug("Avahi entry group state change: %i", state)
328
324
                            unicode(error))
329
325
            raise AvahiGroupError("State changed: {0!s}"
330
326
                                  .format(error))
331
 
    
332
327
    def cleanup(self):
333
328
        """Derived from the Avahi example code"""
334
329
        if self.group is not None:
339
334
                pass
340
335
            self.group = None
341
336
        self.remove()
342
 
    
343
337
    def server_state_changed(self, state, error=None):
344
338
        """Derived from the Avahi example code"""
345
339
        logger.debug("Avahi server state change: %i", state)
364
358
                logger.debug("Unknown state: %r", state)
365
359
            else:
366
360
                logger.debug("Unknown state: %r: %r", state, error)
367
 
    
368
361
    def activate(self):
369
362
        """Derived from the Avahi example code"""
370
363
        if self.server is None:
392
385
    return ((td.days * 24 * 60 * 60 * 1000)
393
386
            + (td.seconds * 1000)
394
387
            + (td.microseconds // 1000))
395
 
 
 
388
        
396
389
class Client(object):
397
390
    """A representation of a client host served by this server.
398
391
    
465
458
    
466
459
    def approval_delay_milliseconds(self):
467
460
        return timedelta_to_milliseconds(self.approval_delay)
468
 
    
 
461
 
469
462
    @staticmethod
470
463
    def config_parser(config):
471
464
        """Construct a new dict of client settings of this form:
512
505
            client["last_checker_status"] = -2
513
506
        
514
507
        return settings
515
 
    
 
508
        
 
509
        
516
510
    def __init__(self, settings, name = None):
 
511
        """Note: the 'checker' key in 'config' sets the
 
512
        'checker_command' attribute and *not* the 'checker'
 
513
        attribute."""
517
514
        self.name = name
518
515
        # adding all client settings
519
516
        for setting, value in settings.iteritems():
528
525
        else:
529
526
            self.last_enabled = None
530
527
            self.expires = None
531
 
        
 
528
       
532
529
        logger.debug("Creating client %r", self.name)
533
530
        # Uppercase and remove spaces from fingerprint for later
534
531
        # comparison purposes with return value from the fingerprint()
536
533
        logger.debug("  Fingerprint: %s", self.fingerprint)
537
534
        self.created = settings.get("created",
538
535
                                    datetime.datetime.utcnow())
539
 
        
 
536
 
540
537
        # attributes specific for this server instance
541
538
        self.checker = None
542
539
        self.checker_initiator_tag = None
776
773
 
777
774
 
778
775
def dbus_interface_annotations(dbus_interface):
779
 
    """Decorator for marking functions returning interface annotations
 
776
    """Decorator for marking functions returning interface annotations.
780
777
    
781
778
    Usage:
782
779
    
1152
1149
                                        attribute.func_defaults,
1153
1150
                                        attribute.func_closure)))
1154
1151
        # Deprecate all old interfaces
1155
 
        iname="_AlternateDBusNamesMetaclass_interface_annotation{0}"
 
1152
        basename="_AlternateDBusNamesMetaclass_interface_annotation{0}"
1156
1153
        for old_interface_name in old_interface_names:
1157
1154
            @dbus_interface_annotations(old_interface_name)
1158
1155
            def func(self):
1159
1156
                return { "org.freedesktop.DBus.Deprecated": "true" }
1160
1157
            # Find an unused name
1161
 
            for aname in (iname.format(i) for i in itertools.count()):
 
1158
            for aname in (basename.format(i) for i in
 
1159
                          itertools.count()):
1162
1160
                if aname not in attr:
1163
1161
                    attr[aname] = func
1164
1162
                    break
1190
1188
                                 ("/clients/" + client_object_name))
1191
1189
        DBusObjectWithProperties.__init__(self, self.bus,
1192
1190
                                          self.dbus_object_path)
1193
 
    
 
1191
        
1194
1192
    def notifychangeproperty(transform_func,
1195
1193
                             dbus_name, type_func=lambda x: x,
1196
1194
                             variant_level=1):
1219
1217
        
1220
1218
        return property(lambda self: getattr(self, attrname), setter)
1221
1219
    
 
1220
    
1222
1221
    expires = notifychangeproperty(datetime_to_dbus, "Expires")
1223
1222
    approvals_pending = notifychangeproperty(dbus.Boolean,
1224
1223
                                             "ApprovalPending",
1312
1311
                            (self.approval_duration),
1313
1312
                            self._reset_approved)
1314
1313
    
 
1314
    
1315
1315
    ## D-Bus methods, signals & properties
1316
1316
    _interface = "se.recompile.Mandos.Client"
1317
1317
    
2414
2414
                             .format(client_name))
2415
2415
                client["secret"] = (
2416
2416
                    client_settings[client_name]["secret"])
 
2417
 
2417
2418
    
2418
2419
    # Add/remove clients based on new changes made to config
2419
2420
    for client_name in (set(old_client_settings)
2422
2423
    for client_name in (set(client_settings)
2423
2424
                        - set(old_client_settings)):
2424
2425
        clients_data[client_name] = client_settings[client_name]
2425
 
    
 
2426
 
2426
2427
    # Create all client objects
2427
2428
    for client_name, client in clients_data.iteritems():
2428
2429
        tcp_server.clients[client_name] = client_class(
2430
2431
    
2431
2432
    if not tcp_server.clients:
2432
2433
        logger.warning("No clients defined")
2433
 
    
 
2434
        
2434
2435
    if not debug:
2435
2436
        try:
2436
2437
            with pidfile: