/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-05 21:39:15 UTC
  • Revision ID: teddy@recompile.se-20190305213915-xm1vw00jyy3a5tfn
mandos-ctl: Add more tests, including tests for all commands

* mandos-ctl (Test_string_to_delta.test_handles_basic_rfc3339): Add a
                                                  few more test cases.
  (TestCmd.setUp.MockClient.Set, TestCmd.setUp.MockClient.Get): Don't
  append to self.calls, since nobody should use it to check for Set()
  or Get() calls; instead, the return value of Get() should be
  inspected, and the MockClient.attributes dict should be inspected
  after (implicitly) calling Set().
  (Unique): New; stand-in for unittest.mock.sentinel.
  (TestPropertyCmd): New; abstract class testing PropertyCmd classes.
  (TestBumpTimeoutCmd, TestStartCheckerCmd, TestStopCheckerCmd,
  TestApproveByDefaultCmd, TestDenyByDefaultCmd): New.
  (TestValueArgumentPropertyCmd): New; abstract class for testing
                                  those PropertyCmd classes which also
                                  inherit from ValueArgumentMixIn.
  (TestSetCheckerCmd, TestSetHostCmd, TestSetSecretCmd,
  TestSetTimeoutCmd, TestSetExtendedTimeoutCmd, TestSetIntervalCmd,
  TestSetApprovalDelayCmd, TestSetApprovalDurationCmd): New.

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