/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 plugins.d/password-prompt.c

  • Committer: Teddy Hogeborn
  • Date: 2008-12-10 01:26:02 UTC
  • mfrom: (237.1.2 mandos)
  • Revision ID: teddy@fukt.bsnet.se-20081210012602-vhz3h75xkj24t340
First version of a somewhat complete D-Bus server interface.  Also
change user/group name to "_mandos".

* debian/mandos.postinst: Rename old "mandos" user and group to
                          "_mandos"; create "_mandos" user and group
                          if none exist.
* debian/mandos-client.postinst: - '' -

* initramfs-tools-hook: Try "_mandos" before "mandos" as user and
                        group name.

* mandos (_datetime_to_dbus_struct): New; was previously local.
  (Client.started): Renamed to "last_started".  All users changed.
  (Client.started): New; boolean.
  (Client.dbus_object_path): New.
  (Client.check_command): Renamed to "checker_command".  All users
                          changed.
  (Client.__init__): Set and use "self.dbus_object_path".  Set
                     "self.started".
  (Client.start): Update "self.started".  Emit "self.PropertyChanged"
                  signals for both "started" and "last_started".
  (Client.stop): Update "self.started".  Emit "self.PropertyChanged"
                 signal for "started".
  (Client.checker_callback): Take additional "command" argument.  All
                             callers changed. Emit
                             "self.PropertyChanged" signal.
  (Client.bump_timeout): Emit "self.PropertyChanged" signal for
                         "last_checked_ok".
  (Client.start_checker): Emit "self.PropertyChanged" signal for
                          "checker_running".
  (Client.stop_checker): Emit "self.PropertyChanged" signal for
                         "checker_running".
  (Client.still_valid): Bug fix: use "getattr(self, started, False)"
                        instead of "self.started" in case this client
                        object is so new that the "started" attribute
                        has not been created yet.
  (Client.IntervalChanged, Client.CheckerIsRunning, Client.GetChecker,
  Client.GetCreated, Client.GetFingerprint, Client.GetHost,
  Client.GetInterval, Client.GetName, Client.GetStarted,
  Client.GetTimeout, Client.StateChanged, Client.TimeoutChanged):
  Removed; all callers changed.
  (Client.CheckerCompleted): Add "condition" and "command" arguments.
                             All callers changed.
  (Client.GetAllProperties, Client.PropertyChanged): New.
  (Client.StillValid): Renamed to "IsStillValid".
  (Client.StartChecker): Changed to its own function to avoid the
                         return value from "Client.start_checker()".
  (Client.Stop): Changed to its own function to avoid the return value
                 from "Client.stop()".
  (main): Try "_mandos" before "mandos" as user and group name.
          Removed inner function "remove_from_clients".  New inner
          class "MandosServer".

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*  -*- coding: utf-8; mode: c; mode: orgtbl -*- */
 
1
/*  -*- coding: utf-8 -*- */
2
2
/*
3
 
 * Password-prompt - Read a password from the terminal and print it
 
3
 * Passprompt - Read a password from the terminal and print it
4
4
 * 
5
 
 * Copyright © 2008,2009 Teddy Hogeborn
6
 
 * Copyright © 2008,2009 Björn Påhlsson
 
5
 * Copyright © 2008 Teddy Hogeborn
 
6
 * Copyright © 2008 Björn Påhlsson
7
7
 * 
8
8
 * This program is free software: you can redistribute it and/or
9
9
 * modify it under the terms of the GNU General Public License as
33
33
#include <signal.h>             /* sig_atomic_t, raise(), struct
34
34
                                   sigaction, sigemptyset(),
35
35
                                   sigaction(), sigaddset(), SIGINT,
36
 
                                   SIGQUIT, SIGHUP, SIGTERM,
37
 
                                   raise() */
 
36
                                   SIGQUIT, SIGHUP, SIGTERM */
38
37
#include <stddef.h>             /* NULL, size_t, ssize_t */
39
38
#include <sys/types.h>          /* ssize_t */
40
39
#include <stdlib.h>             /* EXIT_SUCCESS, EXIT_FAILURE,
52
51
                                   ARGP_KEY_ARG, ARGP_KEY_END,
53
52
                                   ARGP_ERR_UNKNOWN */
54
53
 
55
 
volatile sig_atomic_t quit_now = 0;
56
 
int signal_received;
 
54
volatile bool quit_now = false;
57
55
bool debug = false;
58
56
const char *argp_program_version = "password-prompt " VERSION;
59
57
const char *argp_program_bug_address = "<mandos@fukt.bsnet.se>";
60
58
 
61
 
static void termination_handler(int signum){
62
 
  if(quit_now){
63
 
    return;
64
 
  }
65
 
  quit_now = 1;
66
 
  signal_received = signum;
 
59
static void termination_handler(__attribute__((unused))int signum){
 
60
  quit_now = true;
67
61
}
68
62
 
69
63
int main(int argc, char **argv){
85
79
        .doc = "Debug mode", .group = 3 },
86
80
      { .name = NULL }
87
81
    };
88
 
    
89
 
    error_t parse_opt (int key, char *arg, struct argp_state *state){
90
 
      switch (key){
 
82
  
 
83
    error_t parse_opt (int key, char *arg, struct argp_state *state) {
 
84
      /* Get the INPUT argument from `argp_parse', which we know is a
 
85
         pointer to our plugin list pointer. */
 
86
      switch (key) {
91
87
      case 'p':
92
88
        prefix = arg;
93
89
        break;
95
91
        debug = true;
96
92
        break;
97
93
      case ARGP_KEY_ARG:
98
 
        argp_usage(state);
 
94
        argp_usage (state);
99
95
        break;
100
96
      case ARGP_KEY_END:
101
97
        break;
104
100
      }
105
101
      return 0;
106
102
    }
107
 
    
 
103
  
108
104
    struct argp argp = { .options = options, .parser = parse_opt,
109
105
                         .args_doc = "",
110
106
                         .doc = "Mandos password-prompt -- Read and"
111
107
                         " output a password" };
112
 
    ret = argp_parse(&argp, argc, argv, 0, 0, NULL);
113
 
    if(ret == ARGP_ERR_UNKNOWN){
 
108
    ret = argp_parse (&argp, argc, argv, 0, 0, NULL);
 
109
    if (ret == ARGP_ERR_UNKNOWN){
114
110
      fprintf(stderr, "Unknown error while parsing arguments\n");
115
111
      return EXIT_FAILURE;
116
112
    }
117
113
  }
118
 
  
119
 
  if(debug){
 
114
    
 
115
  if (debug){
120
116
    fprintf(stderr, "Starting %s\n", argv[0]);
121
117
  }
122
 
  if(debug){
 
118
  if (debug){
123
119
    fprintf(stderr, "Storing current terminal attributes\n");
124
120
  }
125
121
  
126
 
  if(tcgetattr(STDIN_FILENO, &t_old) != 0){
 
122
  if (tcgetattr(STDIN_FILENO, &t_old) != 0){
127
123
    perror("tcgetattr");
128
124
    return EXIT_FAILURE;
129
125
  }
130
126
  
131
127
  sigemptyset(&new_action.sa_mask);
132
 
  ret = sigaddset(&new_action.sa_mask, SIGINT);
133
 
  if(ret == -1){
134
 
    perror("sigaddset");
135
 
    return EXIT_FAILURE;
136
 
  }
137
 
  ret = sigaddset(&new_action.sa_mask, SIGHUP);
138
 
  if(ret == -1){
139
 
    perror("sigaddset");
140
 
    return EXIT_FAILURE;
141
 
  }
142
 
  ret = sigaddset(&new_action.sa_mask, SIGTERM);
143
 
  if(ret == -1){
144
 
    perror("sigaddset");
145
 
    return EXIT_FAILURE;
146
 
  }
147
 
  /* Need to check if the handler is SIG_IGN before handling:
148
 
     | [[info:libc:Initial Signal Actions]] |
149
 
     | [[info:libc:Basic Signal Handling]]  |
150
 
  */
 
128
  sigaddset(&new_action.sa_mask, SIGINT);
 
129
  sigaddset(&new_action.sa_mask, SIGHUP);
 
130
  sigaddset(&new_action.sa_mask, SIGTERM);
151
131
  ret = sigaction(SIGINT, NULL, &old_action);
152
132
  if(ret == -1){
153
133
    perror("sigaction");
154
134
    return EXIT_FAILURE;
155
135
  }
156
 
  if(old_action.sa_handler != SIG_IGN){
 
136
  if (old_action.sa_handler != SIG_IGN){
157
137
    ret = sigaction(SIGINT, &new_action, NULL);
158
138
    if(ret == -1){
159
139
      perror("sigaction");
165
145
    perror("sigaction");
166
146
    return EXIT_FAILURE;
167
147
  }
168
 
  if(old_action.sa_handler != SIG_IGN){
 
148
  if (old_action.sa_handler != SIG_IGN){
169
149
    ret = sigaction(SIGHUP, &new_action, NULL);
170
150
    if(ret == -1){
171
151
      perror("sigaction");
177
157
    perror("sigaction");
178
158
    return EXIT_FAILURE;
179
159
  }
180
 
  if(old_action.sa_handler != SIG_IGN){
 
160
  if (old_action.sa_handler != SIG_IGN){
181
161
    ret = sigaction(SIGTERM, &new_action, NULL);
182
162
    if(ret == -1){
183
163
      perror("sigaction");
186
166
  }
187
167
  
188
168
  
189
 
  if(debug){
 
169
  if (debug){
190
170
    fprintf(stderr, "Removing echo flag from terminal attributes\n");
191
171
  }
192
172
  
193
173
  t_new = t_old;
194
174
  t_new.c_lflag &= ~ECHO;
195
 
  if(tcsetattr(STDIN_FILENO, TCSAFLUSH, &t_new) != 0){
 
175
  if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &t_new) != 0){
196
176
    perror("tcsetattr-echo");
197
177
    return EXIT_FAILURE;
198
178
  }
199
179
 
200
 
  if(debug){
 
180
  if (debug){
201
181
    fprintf(stderr, "Waiting for input from stdin \n");
202
182
  }
203
183
  while(true){
204
 
    if(quit_now){
 
184
    if (quit_now){
205
185
      if(debug){
206
186
        fprintf(stderr, "Interrupted by signal, exiting.\n");
207
187
      }
233
213
      }
234
214
    }
235
215
    ret = getline(&buffer, &n, stdin);
236
 
    if(ret > 0){
 
216
    if (ret > 0){
237
217
      status = EXIT_SUCCESS;
238
218
      /* Make n = data size instead of allocated buffer size */
239
219
      n = (size_t)ret;
254
234
      }
255
235
      break;
256
236
    }
257
 
    if(ret < 0){
258
 
      if(errno != EINTR and not feof(stdin)){
 
237
    if (ret < 0){
 
238
      if (errno != EINTR and not feof(stdin)){
259
239
        perror("getline");
260
240
        status = EXIT_FAILURE;
261
241
        break;
265
245
       read from stdin */
266
246
    fputc('\n', stderr);
267
247
    if(debug and not quit_now){
268
 
      /* If quit_now is nonzero, we were interrupted by a signal, and
 
248
      /* If quit_now is true, we were interrupted by a signal, and
269
249
         will print that later, so no need to show this too. */
270
250
      fprintf(stderr, "getline() returned 0, retrying.\n");
271
251
    }
272
252
  }
273
 
  
 
253
 
274
254
  free(buffer);
275
255
  
276
 
  if(debug){
 
256
  if (debug){
277
257
    fprintf(stderr, "Restoring terminal attributes\n");
278
258
  }
279
 
  if(tcsetattr(STDIN_FILENO, TCSAFLUSH, &t_old) != 0){
 
259
  if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &t_old) != 0){
280
260
    perror("tcsetattr+echo");
281
261
  }
282
262
  
283
 
  if(quit_now){
284
 
    sigemptyset(&old_action.sa_mask);
285
 
    old_action.sa_handler = SIG_DFL;
286
 
    ret = sigaction(signal_received, &old_action, NULL);
287
 
    if(ret == -1){
288
 
      perror("sigaction");
289
 
    }
290
 
    raise(signal_received);
291
 
  }
292
 
  
293
 
  if(debug){
 
263
  if (debug){
294
264
    fprintf(stderr, "%s is exiting with status %d\n", argv[0],
295
265
            status);
296
266
  }