/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: Björn Påhlsson
  • Date: 2008-07-20 02:52:20 UTC
  • Revision ID: belorn@braxen-20080720025220-r5u0388uy9iu23h6
Added following support:
Pluginbased client handler
rewritten Mandos client
       Avahi instead of udp server discovery
       openpgp encrypted key support
Passprompt stand alone application for direct console input
Added logging for Mandos server

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
}