/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/passprompt.c

  • Committer: Teddy Hogeborn
  • Date: 2008-07-20 06:33:48 UTC
  • Revision ID: teddy@fukt.bsnet.se-20080720063348-jscgy5p0itrgvlo8
* mandos-clients.conf ([foo]): Uncommented.
  ([foo]/secret): New.
  ([foo]/secfile): Commented out.
  ([foo]/checker): Changed to "fping -q -- %%(fqdn)s".
  ([foo]/timeout): New.

* server.py: New modeline for Python and Emacs.  Set a logging format.
  (Client.__init__): Bug fix: Choose either the value from the options
                     object or pass the argument through string_to_delta
                     for both "timeout" and "interval".
  (Client.checker_callback): Bug fix: Do not log spurious "Checker for
                             <foo> failed" messages.
  (Client.start_checker): Moved "Starting checker" log message down to
                          just before actually starting the subprocess.
                          Do not redirect the subprocesses' stdout to a
                          pipe.
  (peer_certificate, fingerprint): Added docstrings.
  (entry_group_state_changed): Call "killme()" instead of
                               "main_loop.quit()".
  (daemon, killme): New functions.
  (exitstatus, main_loop_started): New global variables.
  (__main__): Removed the "--cert", "--key", "--ca", and "--crl"
              options.  Removed the sleep command from the default
              checker.  Add a console logger in debug mode.  Call
              "killme()" instead of "main_loop.quit()" when there are no
              more clients.  Call "daemon()" if not in debug mode.
              Register "cleanup()" to run at exit.  Ignore some
              signals.  Catch DBusException to detect another running
              server and exit cleanly.  Exit with "exitstatus".
  (cleanup): New function.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*  -*- coding: utf-8 -*- */
2
 
/*
3
 
 * Passprompt - Read a password from the terminal and print it
4
 
 *
5
 
 * Copyright © 2007-2008 Teddy Hogeborn and Björn Påhlsson.
6
 
 * 
7
 
 * This program is free software: you can redistribute it and/or
8
 
 * modify it under the terms of the GNU General Public License as
9
 
 * published by the Free Software Foundation, either version 3 of the
10
 
 * License, or (at your option) any later version.
11
 
 * 
12
 
 * This program is distributed in the hope that it will be useful, but
13
 
 * WITHOUT ANY WARRANTY; without even the implied warranty of
14
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 
 * General Public License for more details.
16
 
 * 
17
 
 * You should have received a copy of the GNU General Public License
18
 
 * along with this program.  If not, see
19
 
 * <http://www.gnu.org/licenses/>.
20
 
 * 
21
 
 * Contact the authors at <https://www.fukt.bsnet.se/~belorn/> and
22
 
 * <https://www.fukt.bsnet.se/~teddy/>.
23
 
 */
24
 
 
25
1
#define _GNU_SOURCE             /* getline() */
26
2
#define _FORTIFY_SOURCE 2
27
 
 
28
3
#include <termios.h>            /* struct termios, tcsetattr(),
29
4
                                   TCSAFLUSH, tcgetattr(), ECHO */
30
5
#include <unistd.h>             /* struct termios, tcsetattr(),
36
11
                                   SIGQUIT, SIGHUP, SIGTERM */
37
12
#include <stddef.h>             /* NULL, size_t */
38
13
#include <sys/types.h>          /* ssize_t */
39
 
#include <stdlib.h>             /* EXIT_SUCCESS, EXIT_FAILURE,
40
 
                                   getopt_long */
 
14
#include <stdlib.h>             /* EXIT_SUCCESS, EXIT_FAILURE */
41
15
#include <stdio.h>              /* fprintf(), stderr, getline(),
42
16
                                   stdin, feof(), perror(), fputc(),
43
 
                                   stdout, getopt_long */
 
17
                                   stdout */
44
18
#include <errno.h>              /* errno, EINVAL */
45
19
#include <iso646.h>             /* or, not */
46
20
#include <stdbool.h>            /* bool, false, true */
47
 
#include <string.h>             /* strlen, rindex, strncmp, strcmp */
48
 
#include <getopt.h>             /* getopt_long */
49
21
 
50
22
volatile bool quit_now = false;
51
 
bool debug = false;
52
23
 
53
 
void termination_handler(__attribute__((unused))int signum){
 
24
void termination_handler(int signum){
54
25
  quit_now = true;
55
26
}
56
27
 
57
28
int main(int argc, char **argv){
58
 
  ssize_t ret;
 
29
  ssize_t ret = -1;
59
30
  size_t n;
60
31
  struct termios t_new, t_old;
61
32
  char *buffer = NULL;
62
 
  char *prefix = NULL;
63
33
  int status = EXIT_SUCCESS;
64
34
  struct sigaction old_action,
65
35
    new_action = { .sa_handler = termination_handler,
66
36
                   .sa_flags = 0 };
67
 
 
68
 
  while (true){
69
 
    static struct option long_options[] = {
70
 
      {"debug", no_argument, (int *)&debug, 1},
71
 
      {"prefix", required_argument, 0, 'p'},
72
 
      {0, 0, 0, 0} };
73
 
 
74
 
    int option_index = 0;
75
 
    ret = getopt_long (argc, argv, "p:", long_options, &option_index);
76
 
 
77
 
    if (ret == -1){
78
 
      break;
79
 
    }
80
 
      
81
 
    switch(ret){
82
 
    case 0:
83
 
      break;
84
 
    case 'p':
85
 
      prefix = optarg;
86
 
      break;
87
 
    default:
88
 
      fprintf(stderr, "bad arguments\n");
89
 
      exit(EXIT_FAILURE);
90
 
    }
91
 
  }
92
 
      
93
 
  if (debug){
94
 
    fprintf(stderr, "Starting %s\n", argv[0]);
95
 
  }
96
 
  if (debug){
97
 
    fprintf(stderr, "Storing current terminal attributes\n");
98
 
  }
99
37
  
100
38
  if (tcgetattr(STDIN_FILENO, &t_old) != 0){
101
39
    return EXIT_FAILURE;
118
56
  sigaction(SIGTERM, NULL, &old_action);
119
57
  if (old_action.sa_handler != SIG_IGN)
120
58
    sigaction(SIGTERM, &new_action, NULL);
121
 
 
122
 
  
123
 
  if (debug){
124
 
    fprintf(stderr, "Removing echo flag from terminal attributes\n");
125
 
  }
126
59
  
127
60
  t_new = t_old;
128
61
  t_new.c_lflag &= ~ECHO;
130
63
    perror("tcsetattr-echo");
131
64
    return EXIT_FAILURE;
132
65
  }
133
 
 
134
 
  if (debug){
135
 
    fprintf(stderr, "Waiting for input from stdin \n");
136
 
  }
 
66
  
137
67
  while(true){
138
68
    if (quit_now){
139
69
      status = EXIT_FAILURE;
140
70
      break;
141
71
    }
142
 
 
143
 
    if(prefix){
144
 
      fprintf(stderr, "%s Password: ", prefix);
145
 
    } else {
146
 
      fprintf(stderr, "Password: ");
147
 
    }      
 
72
    fprintf(stderr, "Password: ");
148
73
    ret = getline(&buffer, &n, stdin);
149
74
    if (ret > 0){
150
75
      fprintf(stdout, "%s", buffer);
162
87
    fputc('\n', stderr);
163
88
  }
164
89
 
165
 
  if (debug){
166
 
    fprintf(stderr, "Restoring terminal attributes\n");
167
 
  }
168
90
  if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &t_old) != 0){
169
91
    perror("tcsetattr+echo");
170
92
  }
171
 
 
172
 
  if (debug){
173
 
    fprintf(stderr, "%s is exiting\n", argv[0]);
174
 
  }
175
93
  
176
94
  return status;
177
95
}