/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: 2022-04-25 18:46:48 UTC
  • mto: This revision was merged to the branch mainline in revision 1261.
  • Revision ID: teddy@recompile.se-20220425184648-w9nas5qn94qcllum
Tags: version-1.8.15-1
Version 1.8.15-1

* Makefile (version): Change to "1.8.15".
* NEWS (Version 1.8.15): Add new entry.
* debian/changelog (1.8.15-1): - '' -

Show diffs side-by-side

added added

removed removed

Lines of Context:
110
110
except AttributeError:
111
111
    shlex.quote = re.escape
112
112
 
113
 
# Add os.set_inheritable if it does not exist
114
 
try:
115
 
    os.set_inheritable
116
 
except AttributeError:
117
 
    def set_inheritable(fd, inheritable):
118
 
        flags = fcntl.fcntl(fd, fcntl.F_GETFD)
119
 
        if inheritable and ((flags & fcntl.FD_CLOEXEC) != 0):
120
 
            fcntl.fcntl(fd, fcntl.F_SETFL, flags & ~fcntl.FD_CLOEXEC)
121
 
        elif (not inheritable) and ((flags & fcntl.FD_CLOEXEC) == 0):
122
 
            fcntl.fcntl(fd, fcntl.F_SETFL, flags | fcntl.FD_CLOEXEC)
123
 
    os.set_inheritable = set_inheritable
124
 
    del set_inheritable
125
 
 
126
113
# Show warnings by default
127
114
if not sys.warnoptions:
128
115
    import warnings
156
143
if sys.version_info < (3, 2):
157
144
    configparser.Configparser = configparser.SafeConfigParser
158
145
 
159
 
version = "1.8.17"
 
146
version = "1.8.15"
160
147
stored_state_file = "clients.pickle"
161
148
 
162
149
log = logging.getLogger(os.path.basename(sys.argv[0]))
974
961
            # key_id() and fingerprint() functions
975
962
            client["key_id"] = (section.get("key_id", "").upper()
976
963
                                .replace(" ", ""))
977
 
            client["fingerprint"] = (section.get("fingerprint",
978
 
                                                 "").upper()
 
964
            client["fingerprint"] = (section["fingerprint"].upper()
979
965
                                     .replace(" ", ""))
980
 
            if not (client["key_id"] or client["fingerprint"]):
981
 
                log.error("Skipping client %s without key_id or"
982
 
                          " fingerprint", client_name)
983
 
                del settings[client_name]
984
 
                continue
985
966
            if "secret" in section:
986
967
                client["secret"] = codecs.decode(section["secret"]
987
968
                                                 .encode("utf-8"),
1064
1045
        if getattr(self, "enabled", False):
1065
1046
            # Already enabled
1066
1047
            return
 
1048
        self.expires = datetime.datetime.utcnow() + self.timeout
1067
1049
        self.enabled = True
1068
1050
        self.last_enabled = datetime.datetime.utcnow()
1069
1051
        self.init_checker()
1092
1074
    def __del__(self):
1093
1075
        self.disable()
1094
1076
 
1095
 
    def init_checker(self, randomize_start=False):
1096
 
        # Schedule a new checker to be started a randomly selected
1097
 
        # time (a fraction of 'interval') from now.  This spreads out
1098
 
        # the startup of checkers over time when the server is
1099
 
        # started.
 
1077
    def init_checker(self):
 
1078
        # Schedule a new checker to be started an 'interval' from now,
 
1079
        # and every interval from then on.
1100
1080
        if self.checker_initiator_tag is not None:
1101
1081
            GLib.source_remove(self.checker_initiator_tag)
1102
 
        interval_milliseconds = int(self.interval.total_seconds()
1103
 
                                    * 1000)
1104
 
        if randomize_start:
1105
 
            delay_milliseconds = random.randrange(
1106
 
                interval_milliseconds + 1)
1107
 
        else:
1108
 
            delay_milliseconds = interval_milliseconds
1109
1082
        self.checker_initiator_tag = GLib.timeout_add(
1110
 
            delay_milliseconds, self.start_checker, randomize_start)
1111
 
        delay = datetime.timedelta(0, 0, 0, delay_milliseconds)
1112
 
        # A checker might take up to an 'interval' of time, so we can
1113
 
        # expire at the soonest one interval after a checker was
1114
 
        # started.  Since the initial checker is delayed, the expire
1115
 
        # time might have to be extended.
1116
 
        now = datetime.datetime.utcnow()
1117
 
        self.expires = now + delay + self.interval
1118
 
        # Schedule a disable() at expire time
 
1083
            random.randrange(int(self.interval.total_seconds() * 1000
 
1084
                                 + 1)),
 
1085
            self.start_checker)
 
1086
        # Schedule a disable() when 'timeout' has passed
1119
1087
        if self.disable_initiator_tag is not None:
1120
1088
            GLib.source_remove(self.disable_initiator_tag)
1121
1089
        self.disable_initiator_tag = GLib.timeout_add(
1122
 
            int((self.expires - now).total_seconds() * 1000),
1123
 
            self.disable)
 
1090
            int(self.timeout.total_seconds() * 1000), self.disable)
 
1091
        # Also start a new checker *right now*.
 
1092
        self.start_checker()
1124
1093
 
1125
1094
    def checker_callback(self, source, condition, connection,
1126
1095
                         command):
1169
1138
    def need_approval(self):
1170
1139
        self.last_approval_request = datetime.datetime.utcnow()
1171
1140
 
1172
 
    def start_checker(self, start_was_randomized=False):
 
1141
    def start_checker(self):
1173
1142
        """Start a new checker subprocess if one is not running.
1174
1143
 
1175
1144
        If a checker already exists, leave it running and do
1225
1194
                GLib.IOChannel.unix_new(pipe[0].fileno()),
1226
1195
                GLib.PRIORITY_DEFAULT, GLib.IO_IN,
1227
1196
                self.checker_callback, pipe[0], command)
1228
 
        if start_was_randomized:
1229
 
            # We were started after a random delay; Schedule a new
1230
 
            # checker to be started an 'interval' from now, and every
1231
 
            # interval from then on.
1232
 
            now = datetime.datetime.utcnow()
1233
 
            self.checker_initiator_tag = GLib.timeout_add(
1234
 
                int(self.interval.total_seconds() * 1000),
1235
 
                self.start_checker)
1236
 
            self.expires = max(self.expires, now + self.interval)
1237
 
            # Don't start a new checker again after same random delay
1238
 
            return False
1239
1197
        # Re-run this periodically if run by GLib.timeout_add
1240
1198
        return True
1241
1199
 
3109
3067
        # Later, stdin will, and stdout and stderr might, be dup'ed
3110
3068
        # over with an opened os.devnull.  But we don't want this to
3111
3069
        # happen with a supplied network socket.
3112
 
        while 0 <= server_settings["socket"] <= 2:
 
3070
        if 0 <= server_settings["socket"] <= 2:
3113
3071
            server_settings["socket"] = os.dup(server_settings
3114
3072
                                               ["socket"])
3115
 
        os.set_inheritable(server_settings["socket"], False)
3116
3073
    del server_config
3117
3074
 
3118
3075
    # Override the settings from the config file with command line
3257
3214
    # From the Avahi example code
3258
3215
    DBusGMainLoop(set_as_default=True)
3259
3216
    main_loop = GLib.MainLoop()
3260
 
    if use_dbus or zeroconf:
3261
 
        bus = dbus.SystemBus()
 
3217
    bus = dbus.SystemBus()
3262
3218
    # End of Avahi example code
3263
3219
    if use_dbus:
3264
3220
        try:
3653
3609
            mandos_dbus_service.client_added_signal(client)
3654
3610
        # Need to initiate checking of clients
3655
3611
        if client.enabled:
3656
 
            client.init_checker(randomize_start=True)
 
3612
            client.init_checker()
3657
3613
 
3658
3614
    tcp_server.enable()
3659
3615
    tcp_server.server_activate()