/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: 2018-08-15 09:26:02 UTC
  • Revision ID: teddy@recompile.se-20180815092602-xoyb5s6gf8376i7u
mandos-client: Set system clock if necessary

* plugins.d/mandos-client.c (init_gpgme/import_key): If the system
  clock is not set, or set to january 1970, set the system clock to
  the more plausible value that is the mtime of the key file.  This is
  required by GnuPG to be able to import the keys.  (We can't pass the
  --ignore-time-conflict or the --ignore-valid-from options though
  GPGME.)

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
/*
3
3
 * Password-prompt - Read a password from the terminal and print it
4
4
 * 
5
 
 * Copyright © 2008-2019 Teddy Hogeborn
6
 
 * Copyright © 2008-2019 Björn Påhlsson
 
5
 * Copyright © 2008-2018 Teddy Hogeborn
 
6
 * Copyright © 2008-2018 Björn Påhlsson
7
7
 * 
8
8
 * This file is part of Mandos.
9
9
 * 
27
27
 
28
28
#include <termios.h>            /* struct termios, tcsetattr(),
29
29
                                   TCSAFLUSH, tcgetattr(), ECHO */
30
 
#include <unistd.h>             /* access(), struct termios,
31
 
                                   tcsetattr(), STDIN_FILENO,
32
 
                                   TCSAFLUSH, tcgetattr(), ECHO,
33
 
                                   readlink() */
 
30
#include <unistd.h>             /* struct termios, tcsetattr(),
 
31
                                   STDIN_FILENO, TCSAFLUSH,
 
32
                                   tcgetattr(), ECHO, readlink() */
34
33
#include <signal.h>             /* sig_atomic_t, raise(), struct
35
34
                                   sigaction, sigemptyset(),
36
35
                                   sigaction(), sigaddset(), SIGINT,
111
110
     from the terminal.  Password-prompt will exit if it detects
112
111
     plymouth since plymouth performs the same functionality.
113
112
   */
114
 
  if(access("/run/plymouth/pid", R_OK) == 0){
115
 
    return true;
116
 
  }
117
 
  
118
113
  __attribute__((nonnull))
119
114
  int is_plymouth(const struct dirent *proc_entry){
120
115
    int ret;
239
234
  struct termios t_new, t_old;
240
235
  char *buffer = NULL;
241
236
  char *prefix = NULL;
242
 
  char *prompt = NULL;
243
237
  int status = EXIT_SUCCESS;
244
238
  struct sigaction old_action,
245
239
    new_action = { .sa_handler = termination_handler,
249
243
      { .name = "prefix", .key = 'p',
250
244
        .arg = "PREFIX", .flags = 0,
251
245
        .doc = "Prefix shown before the prompt", .group = 2 },
252
 
      { .name = "prompt", .key = 129,
253
 
        .arg = "PROMPT", .flags = 0,
254
 
        .doc = "The prompt to show", .group = 2 },
255
246
      { .name = "debug", .key = 128,
256
247
        .doc = "Debug mode", .group = 3 },
257
248
      /*
270
261
    error_t parse_opt (int key, char *arg, struct argp_state *state){
271
262
      errno = 0;
272
263
      switch (key){
273
 
      case 'p':                 /* --prefix */
 
264
      case 'p':
274
265
        prefix = arg;
275
266
        break;
276
 
      case 128:                 /* --debug */
 
267
      case 128:
277
268
        debug = true;
278
269
        break;
279
 
      case 129:                 /* --prompt */
280
 
        prompt = arg;
281
 
        break;
282
270
        /*
283
271
         * These reproduce what we would get without ARGP_NO_HELP
284
272
         */
286
274
        argp_state_help(state, state->out_stream,
287
275
                        (ARGP_HELP_STD_HELP | ARGP_HELP_EXIT_ERR)
288
276
                        & ~(unsigned int)ARGP_HELP_EXIT_OK);
289
 
        __builtin_unreachable();
290
277
      case -3:                  /* --usage */
291
278
        argp_state_help(state, state->out_stream,
292
279
                        ARGP_HELP_USAGE | ARGP_HELP_EXIT_ERR);
293
 
        __builtin_unreachable();
294
280
      case 'V':                 /* --version */
295
281
        fprintf(state->out_stream, "%s\n", argp_program_version);
296
282
        exit(argp_err_exit_status);
439
425
    if(prefix){
440
426
      fprintf(stderr, "%s ", prefix);
441
427
    }
442
 
    if(prompt != NULL){
443
 
      fprintf(stderr, "%s: ", prompt);
444
 
    } else {
 
428
    {
445
429
      const char *cryptsource = getenv("CRYPTTAB_SOURCE");
446
430
      const char *crypttarget = getenv("CRYPTTAB_NAME");
447
431
      /* Before cryptsetup 1.1.0~rc2 */
522
506
    }
523
507
    if(sret < 0){
524
508
      int e = errno;
525
 
      if(errno != EINTR){
526
 
        if(not feof(stdin)){
527
 
          error_plus(0, errno, "getline");
528
 
          switch(e){
529
 
          case EBADF:
530
 
            status = EX_UNAVAILABLE;
531
 
            break;
532
 
          case EIO:
533
 
          case EINVAL:
534
 
          default:
535
 
            status = EX_IOERR;
536
 
            break;
537
 
          }
538
 
          break;
539
 
        } else {
540
 
          clearerr(stdin);
 
509
      if(errno != EINTR and not feof(stdin)){
 
510
        error_plus(0, errno, "getline");
 
511
        switch(e){
 
512
        case EBADF:
 
513
          status = EX_UNAVAILABLE;
 
514
          break;
 
515
        case EIO:
 
516
        case EINVAL:
 
517
        default:
 
518
          status = EX_IOERR;
 
519
          break;
541
520
        }
 
521
        break;
542
522
      }
543
523
    }
544
524
    /* if(sret == 0), then the only sensible thing to do is to retry