/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 & 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
3
#include <termios.h>            /* struct termios, tcsetattr(),
28
4
                                   TCSAFLUSH, tcgetattr(), ECHO */
29
5
#include <unistd.h>             /* struct termios, tcsetattr(),
35
11
                                   SIGQUIT, SIGHUP, SIGTERM */
36
12
#include <stddef.h>             /* NULL, size_t */
37
13
#include <sys/types.h>          /* ssize_t */
38
 
#include <stdlib.h>             /* EXIT_SUCCESS, EXIT_FAILURE,
39
 
                                   getopt_long */
 
14
#include <stdlib.h>             /* EXIT_SUCCESS, EXIT_FAILURE */
40
15
#include <stdio.h>              /* fprintf(), stderr, getline(),
41
16
                                   stdin, feof(), perror(), fputc(),
42
 
                                   stdout, getopt_long */
 
17
                                   stdout */
43
18
#include <errno.h>              /* errno, EINVAL */
44
19
#include <iso646.h>             /* or, not */
45
20
#include <stdbool.h>            /* bool, false, true */
46
 
#include <string.h>             /* strlen, rindex, strncmp, strcmp */
47
 
#include <getopt.h>             /* getopt_long */
48
21
 
49
22
volatile bool quit_now = false;
50
 
bool debug = false;
51
23
 
52
 
void termination_handler(__attribute__((unused))int signum){
 
24
void termination_handler(int signum){
53
25
  quit_now = true;
54
26
}
55
27
 
56
28
int main(int argc, char **argv){
57
 
  ssize_t ret;
 
29
  ssize_t ret = -1;
58
30
  size_t n;
59
31
  struct termios t_new, t_old;
60
32
  char *buffer = NULL;
61
 
  char *prefix = NULL;
62
33
  int status = EXIT_SUCCESS;
63
34
  struct sigaction old_action,
64
35
    new_action = { .sa_handler = termination_handler,
65
36
                   .sa_flags = 0 };
66
 
 
67
 
  while (true){
68
 
    static struct option long_options[] = {
69
 
      {"debug", no_argument, (int *)&debug, 1},
70
 
      {"prefix", required_argument, 0, 'p'},
71
 
      {0, 0, 0, 0} };
72
 
 
73
 
    int option_index = 0;
74
 
    ret = getopt_long (argc, argv, "p:", long_options, &option_index);
75
 
 
76
 
    if (ret == -1){
77
 
      break;
78
 
    }
79
 
      
80
 
    switch(ret){
81
 
    case 0:
82
 
      break;
83
 
    case 'p':
84
 
      prefix = optarg;
85
 
      break;
86
 
    default:
87
 
      fprintf(stderr, "bad arguments\n");
88
 
      exit(EXIT_FAILURE);
89
 
    }
90
 
  }
91
 
      
92
 
  if (debug){
93
 
    fprintf(stderr, "Starting %s\n", argv[0]);
94
 
  }
95
 
  if (debug){
96
 
    fprintf(stderr, "Storing current terminal attributes\n");
97
 
  }
98
37
  
99
38
  if (tcgetattr(STDIN_FILENO, &t_old) != 0){
100
39
    return EXIT_FAILURE;
117
56
  sigaction(SIGTERM, NULL, &old_action);
118
57
  if (old_action.sa_handler != SIG_IGN)
119
58
    sigaction(SIGTERM, &new_action, NULL);
120
 
 
121
 
  
122
 
  if (debug){
123
 
    fprintf(stderr, "Removing echo flag from terminal attributes\n");
124
 
  }
125
59
  
126
60
  t_new = t_old;
127
61
  t_new.c_lflag &= ~ECHO;
129
63
    perror("tcsetattr-echo");
130
64
    return EXIT_FAILURE;
131
65
  }
132
 
 
133
 
  if (debug){
134
 
    fprintf(stderr, "Waiting for input from stdin \n");
135
 
  }
 
66
  
136
67
  while(true){
137
68
    if (quit_now){
138
69
      status = EXIT_FAILURE;
139
70
      break;
140
71
    }
141
 
 
142
 
    if(prefix){
143
 
      fprintf(stderr, "%s Password: ", prefix);
144
 
    } else {
145
 
      fprintf(stderr, "Password: ");
146
 
    }      
 
72
    fprintf(stderr, "Password: ");
147
73
    ret = getline(&buffer, &n, stdin);
148
74
    if (ret > 0){
149
75
      fprintf(stdout, "%s", buffer);
161
87
    fputc('\n', stderr);
162
88
  }
163
89
 
164
 
  if (debug){
165
 
    fprintf(stderr, "Restoring terminal attributes\n");
166
 
  }
167
90
  if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &t_old) != 0){
168
91
    perror("tcsetattr+echo");
169
92
  }
170
 
 
171
 
  if (debug){
172
 
    fprintf(stderr, "%s is exiting\n", argv[0]);
173
 
  }
174
93
  
175
94
  return status;
176
95
}