/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
1
/*  -*- coding: utf-8 -*- */
2
2
/*
3
3
 * Passprompt - Read a password from the terminal and print it
4
 
 *
5
 
 * Copyright © 2007-2008 Teddy Hogeborn & Björn Påhlsson
 
4
 * 
 
5
 * Copyright © 2008 Teddy Hogeborn
 
6
 * Copyright © 2008 Björn Påhlsson
6
7
 * 
7
8
 * This program is free software: you can redistribute it and/or
8
9
 * modify it under the terms of the GNU General Public License as
52
53
 
53
54
volatile bool quit_now = false;
54
55
bool debug = false;
55
 
const char *argp_program_version = "password-prompt 1.0";
 
56
const char *argp_program_version = "password-prompt " VERSION;
56
57
const char *argp_program_bug_address = "<mandos@fukt.bsnet.se>";
57
58
 
58
59
static void termination_handler(__attribute__((unused))int signum){
73
74
    struct argp_option options[] = {
74
75
      { .name = "prefix", .key = 'p',
75
76
        .arg = "PREFIX", .flags = 0,
76
 
        .doc = "Prefix used before the passprompt", .group = 2 },
 
77
        .doc = "Prefix shown before the prompt", .group = 2 },
77
78
      { .name = "debug", .key = 128,
78
79
        .doc = "Debug mode", .group = 3 },
79
80
      { .name = NULL }
102
103
  
103
104
    struct argp argp = { .options = options, .parser = parse_opt,
104
105
                         .args_doc = "",
105
 
                         .doc = "Mandos Passprompt -- Provides a passprompt" };
 
106
                         .doc = "Mandos password-prompt -- Read and"
 
107
                         " output a password" };
106
108
    ret = argp_parse (&argp, argc, argv, 0, 0, NULL);
107
109
    if (ret == ARGP_ERR_UNKNOWN){
108
110
      fprintf(stderr, "Unknown error while parsing arguments\n");
118
120
  }
119
121
  
120
122
  if (tcgetattr(STDIN_FILENO, &t_old) != 0){
 
123
    perror("tcgetattr");
121
124
    return EXIT_FAILURE;
122
125
  }
123
126
  
179
182
  }
180
183
  while(true){
181
184
    if (quit_now){
 
185
      if(debug){
 
186
        fprintf(stderr, "Interrupted by signal, exiting.\n");
 
187
      }
182
188
      status = EXIT_FAILURE;
183
189
      break;
184
190
    }
208
214
    }
209
215
    ret = getline(&buffer, &n, stdin);
210
216
    if (ret > 0){
211
 
      fprintf(stdout, "%s", buffer);
212
217
      status = EXIT_SUCCESS;
 
218
      /* Make n = data size instead of allocated buffer size */
 
219
      n = (size_t)ret;
 
220
      /* Strip final newline */
 
221
      if(n>0 and buffer[n-1] == '\n'){
 
222
        buffer[n-1] = '\0';     /* not strictly necessary */
 
223
        n--;
 
224
      }
 
225
      size_t written = 0;
 
226
      while(written < n){
 
227
        ret = write(STDOUT_FILENO, buffer + written, n - written);
 
228
        if(ret < 0){
 
229
          perror("write");
 
230
          status = EXIT_FAILURE;
 
231
          break;
 
232
        }
 
233
        written += (size_t)ret;
 
234
      }
213
235
      break;
214
236
    }
215
237
    if (ret < 0){
222
244
    /* if(ret == 0), then the only sensible thing to do is to retry to
223
245
       read from stdin */
224
246
    fputc('\n', stderr);
 
247
    if(debug and not quit_now){
 
248
      /* If quit_now is true, we were interrupted by a signal, and
 
249
         will print that later, so no need to show this too. */
 
250
      fprintf(stderr, "getline() returned 0, retrying.\n");
 
251
    }
225
252
  }
 
253
 
 
254
  free(buffer);
226
255
  
227
256
  if (debug){
228
257
    fprintf(stderr, "Restoring terminal attributes\n");
232
261
  }
233
262
  
234
263
  if (debug){
235
 
    fprintf(stderr, "%s is exiting\n", argv[0]);
 
264
    fprintf(stderr, "%s is exiting with status %d\n", argv[0],
 
265
            status);
 
266
  }
 
267
  if(status == EXIT_SUCCESS){
 
268
    fputc('\n', stderr);
236
269
  }
237
270
  
238
271
  return status;