/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-12 15:45:57 UTC
  • Revision ID: teddy@recompile.se-20120512154557-r1yzcb8su8byp4us
* mandos (Client.enable, Client.disable, ClientDBus.approve): Call
                    self.send_changedstate() after change, not before.
  (Client.disable): Bug fix: Handle disable_initiator_tag and
                    checker_initiator_tag of 0.
  (Client.init_checker): Bug fix: Remove old checker_initiator_tag and
                         disable_initiator_tag, if any.
  (Client.bump_timeout): Bug fix: Remove old disable_initiator_tag, if
                         any.
  (ClientDBus.Timeout_dbus_property): Bug fix: Use self.expires.
  (ClientHandler.handle): Bug fix: timedelta_to_milliseconds is a
                          global function, not a class method.
* mandos-monitor (MandosClientWidget._update_timer_callback_lock):
  Removed.  All users changed.
  (MandosClientWidget.last_checked_ok): Removed (unused).
  (MandosClientWidget.__init__): Don't call self.using_timer().
  (MandosClientWidget.property_changed): Removed unused version.
  (MandosClientWidget.using_timer): Stop using the counter
                                    self._update_timer_callback_lock;
                                    be strictly boolean.
  (MandosClientWidget.need_approval): Don't call self.using_timer().
  (MandosClientWidget.update): Call self.using_timer() throughout.
                               Bug fix: Never show negative timers.

Show diffs side-by-side

added added

removed removed

Lines of Context:
572
572
        if getattr(self, "enabled", False):
573
573
            # Already enabled
574
574
            return
575
 
        self.send_changedstate()
576
575
        self.expires = datetime.datetime.utcnow() + self.timeout
577
576
        self.enabled = True
578
577
        self.last_enabled = datetime.datetime.utcnow()
579
578
        self.init_checker()
 
579
        self.send_changedstate()
580
580
    
581
581
    def disable(self, quiet=True):
582
582
        """Disable this client."""
583
583
        if not getattr(self, "enabled", False):
584
584
            return False
585
585
        if not quiet:
586
 
            self.send_changedstate()
587
 
        if not quiet:
588
586
            logger.info("Disabling client %s", self.name)
589
 
        if getattr(self, "disable_initiator_tag", False):
 
587
        if getattr(self, "disable_initiator_tag", None) is not None:
590
588
            gobject.source_remove(self.disable_initiator_tag)
591
589
            self.disable_initiator_tag = None
592
590
        self.expires = None
593
 
        if getattr(self, "checker_initiator_tag", False):
 
591
        if getattr(self, "checker_initiator_tag", None) is not None:
594
592
            gobject.source_remove(self.checker_initiator_tag)
595
593
            self.checker_initiator_tag = None
596
594
        self.stop_checker()
597
595
        self.enabled = False
 
596
        if not quiet:
 
597
            self.send_changedstate()
598
598
        # Do not run this again if called by a gobject.timeout_add
599
599
        return False
600
600
    
604
604
    def init_checker(self):
605
605
        # Schedule a new checker to be started an 'interval' from now,
606
606
        # and every interval from then on.
 
607
        if self.checker_initiator_tag is not None:
 
608
            gobject.source_remove(self.checker_initiator_tag)
607
609
        self.checker_initiator_tag = (gobject.timeout_add
608
610
                                      (self.interval_milliseconds(),
609
611
                                       self.start_checker))
610
612
        # Schedule a disable() when 'timeout' has passed
 
613
        if self.disable_initiator_tag is not None:
 
614
            gobject.source_remove(self.disable_initiator_tag)
611
615
        self.disable_initiator_tag = (gobject.timeout_add
612
616
                                   (self.timeout_milliseconds(),
613
617
                                    self.disable))
644
648
            timeout = self.timeout
645
649
        if self.disable_initiator_tag is not None:
646
650
            gobject.source_remove(self.disable_initiator_tag)
 
651
            self.disable_initiator_tag = None
647
652
        if getattr(self, "enabled", False):
648
653
            self.disable_initiator_tag = (gobject.timeout_add
649
654
                                          (timedelta_to_milliseconds
1335
1340
        return False
1336
1341
    
1337
1342
    def approve(self, value=True):
1338
 
        self.send_changedstate()
1339
1343
        self.approved = value
1340
1344
        gobject.timeout_add(timedelta_to_milliseconds
1341
1345
                            (self.approval_duration),
1342
1346
                            self._reset_approved)
 
1347
        self.send_changedstate()
1343
1348
    
1344
1349
    ## D-Bus methods, signals & properties
1345
1350
    _interface = "se.recompile.Mandos.Client"
1529
1534
    def Timeout_dbus_property(self, value=None):
1530
1535
        if value is None:       # get
1531
1536
            return dbus.UInt64(self.timeout_milliseconds())
 
1537
        old_timeout = self.timeout
1532
1538
        self.timeout = datetime.timedelta(0, 0, 0, value)
1533
 
        # Reschedule timeout
 
1539
        # Reschedule disabling
1534
1540
        if self.enabled:
1535
1541
            now = datetime.datetime.utcnow()
1536
 
            time_to_die = timedelta_to_milliseconds(
1537
 
                (self.last_checked_ok + self.timeout) - now)
1538
 
            if time_to_die <= 0:
 
1542
            self.expires += self.timeout - old_timeout
 
1543
            if self.expires <= now:
1539
1544
                # The timeout has passed
1540
1545
                self.disable()
1541
1546
            else:
1542
 
                self.expires = (now +
1543
 
                                datetime.timedelta(milliseconds =
1544
 
                                                   time_to_die))
1545
1547
                if (getattr(self, "disable_initiator_tag", None)
1546
1548
                    is None):
1547
1549
                    return
1548
1550
                gobject.source_remove(self.disable_initiator_tag)
1549
 
                self.disable_initiator_tag = (gobject.timeout_add
1550
 
                                              (time_to_die,
1551
 
                                               self.disable))
 
1551
                self.disable_initiator_tag = (
 
1552
                    gobject.timeout_add(
 
1553
                        timedelta_to_milliseconds(self.expires - now),
 
1554
                        self.disable))
1552
1555
    
1553
1556
    # ExtendedTimeout - property
1554
1557
    @dbus_service_property(_interface, signature="t",
1742
1745
                    #wait until timeout or approved
1743
1746
                    time = datetime.datetime.now()
1744
1747
                    client.changedstate.acquire()
1745
 
                    (client.changedstate.wait
1746
 
                     (float(client.timedelta_to_milliseconds(delay)
1747
 
                            / 1000)))
 
1748
                    client.changedstate.wait(
 
1749
                        float(timedelta_to_milliseconds(delay)
 
1750
                              / 1000))
1748
1751
                    client.changedstate.release()
1749
1752
                    time2 = datetime.datetime.now()
1750
1753
                    if (time2 - time) >= delay: