/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: 2019-03-03 01:08:58 UTC
  • Revision ID: teddy@recompile.se-20190303010858-c2l0sr6ekvzo7rlb
mandos-ctl: Separate determining what to do and actually doing it

* mandos-ctl (defaultkeywords): Removed; value moved into
                                PrintTableCmd.
  (Command): New abstract base class for commands to be run.
  (PrintCmd, PropertyCmd): New abstract classes for commands.
  (ValueArgumentMixIn, MillisecondsValueArgumentMixIn): New mixins for
                                                        commands.
  (PrintTableCmd, DumpJSONCmd, IsEnabledCmd, RemoveCmd, ApproveCmd,
  DenyCmd, EnableCmd, DisableCmd, BumpTimeoutCmd, StartCheckerCmd,
  StopCheckerCmd, ApproveByDefaultCmd, DenyByDefaultCmd,
  SetCheckerCmd, SetTimeoutCmd, SetExtendedTimeoutCmd,
  SetApprovalDelayCmd, SetApprovalDurationCmd): New commands.
  (main): Don't look directly at options and do things; instead go
          through all options and add commands to a list, then run all
          commands on clients.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
         */
439
427
    if(prefix){
440
428
      fprintf(stderr, "%s ", prefix);
441
429
    }
442
 
    if(prompt != NULL){
443
 
      fprintf(stderr, "%s: ", prompt);
444
 
    } else {
 
430
    {
445
431
      const char *cryptsource = getenv("CRYPTTAB_SOURCE");
446
432
      const char *crypttarget = getenv("CRYPTTAB_NAME");
447
433
      /* Before cryptsetup 1.1.0~rc2 */
522
508
    }
523
509
    if(sret < 0){
524
510
      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);
 
511
      if(errno != EINTR and not feof(stdin)){
 
512
        error_plus(0, errno, "getline");
 
513
        switch(e){
 
514
        case EBADF:
 
515
          status = EX_UNAVAILABLE;
 
516
          break;
 
517
        case EIO:
 
518
        case EINVAL:
 
519
        default:
 
520
          status = EX_IOERR;
 
521
          break;
541
522
        }
 
523
        break;
542
524
      }
543
525
    }
544
526
    /* if(sret == 0), then the only sensible thing to do is to retry