/mandos/release

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/release
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1
/*  -*- coding: utf-8 -*- */
2
/*
237.2.24 by Teddy Hogeborn
* plugins.d/askpass-fifo.c: Fix name in header.
3
 * Mandos-client - get and decrypt data from a Mandos server
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
4
 *
5
 * This program is partly derived from an example program for an Avahi
6
 * service browser, downloaded from
7
 * <http://avahi.org/browser/examples/core-browse-services.c>.  This
8
 * includes the following functions: "resolve_callback",
9
 * "browse_callback", and parts of "main".
10
 * 
28 by Teddy Hogeborn
* server.conf: New file.
11
 * Everything else is
237.7.14 by Teddy Hogeborn
Update copyright year to "2011" wherever appropriate.
12
 * Copyright © 2008-2011 Teddy Hogeborn
13
 * Copyright © 2008-2011 Björn Påhlsson
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
14
 * 
15
 * This program is free software: you can redistribute it and/or
16
 * modify it under the terms of the GNU General Public License as
17
 * published by the Free Software Foundation, either version 3 of the
18
 * License, or (at your option) any later version.
19
 * 
20
 * This program is distributed in the hope that it will be useful, but
21
 * WITHOUT ANY WARRANTY; without even the implied warranty of
22
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23
 * General Public License for more details.
24
 * 
25
 * You should have received a copy of the GNU General Public License
26
 * along with this program.  If not, see
27
 * <http://www.gnu.org/licenses/>.
28
 * 
237.11.2 by Teddy Hogeborn
Change "fukt.bsnet.se" to "recompile.se" throughout.
29
 * Contact the authors at <mandos@recompile.se>.
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
30
 */
31
28 by Teddy Hogeborn
* server.conf: New file.
32
/* Needed by GPGME, specifically gpgme_data_seek() */
237.2.80 by Teddy Hogeborn
Use "getconf" to get correct LFS compile and link flags.
33
#ifndef _LARGEFILE_SOURCE
13 by Björn Påhlsson
Added following support:
34
#define _LARGEFILE_SOURCE
237.2.80 by Teddy Hogeborn
Use "getconf" to get correct LFS compile and link flags.
35
#endif
36
#ifndef _FILE_OFFSET_BITS
13 by Björn Påhlsson
Added following support:
37
#define _FILE_OFFSET_BITS 64
237.2.80 by Teddy Hogeborn
Use "getconf" to get correct LFS compile and link flags.
38
#endif
13 by Björn Påhlsson
Added following support:
39
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
40
#define _GNU_SOURCE		/* TEMP_FAILURE_RETRY(), asprintf() */
24.1.10 by Björn Påhlsson
merge commit
41
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
42
#include <stdio.h>		/* fprintf(), stderr, fwrite(),
237.2.74 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
43
				   stdout, ferror(), remove() */
24.1.26 by Björn Påhlsson
tally count of used symbols
44
#include <stdint.h> 		/* uint16_t, uint32_t */
45
#include <stddef.h>		/* NULL, size_t, ssize_t */
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
46
#include <stdlib.h> 		/* free(), EXIT_SUCCESS, srand(),
47
				   strtof(), abort() */
237.2.67 by Teddy Hogeborn
Four new interrelated features:
48
#include <stdbool.h>		/* bool, false, true */
24.1.29 by Björn Påhlsson
Added more header file comments
49
#include <string.h>		/* memset(), strcmp(), strlen(),
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
50
				   strerror(), asprintf(), strcpy() */
237.2.67 by Teddy Hogeborn
Four new interrelated features:
51
#include <sys/ioctl.h>		/* ioctl */
24.1.26 by Björn Påhlsson
tally count of used symbols
52
#include <sys/types.h>		/* socket(), inet_pton(), sockaddr,
24.1.29 by Björn Påhlsson
Added more header file comments
53
				   sockaddr_in6, PF_INET6,
237.2.67 by Teddy Hogeborn
Four new interrelated features:
54
				   SOCK_STREAM, uid_t, gid_t, open(),
55
				   opendir(), DIR */
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
56
#include <sys/stat.h>		/* open() */
24.1.26 by Björn Påhlsson
tally count of used symbols
57
#include <sys/socket.h>		/* socket(), struct sockaddr_in6,
237.2.67 by Teddy Hogeborn
Four new interrelated features:
58
				   inet_pton(), connect() */
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
59
#include <fcntl.h>		/* open() */
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
60
#include <dirent.h>		/* opendir(), struct dirent, readdir()
61
				 */
237.2.74 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
62
#include <inttypes.h>		/* PRIu16, PRIdMAX, intmax_t,
63
				   strtoimax() */
24.1.29 by Björn Påhlsson
Added more header file comments
64
#include <assert.h>		/* assert() */
237.7.33 by Teddy Hogeborn
Merge from Björn.
65
#include <errno.h>		/* perror(), errno,
66
				   program_invocation_short_name */
24.1.163 by Björn Påhlsson
mandos-client: Added never ending loop for --connect
67
#include <time.h>		/* nanosleep(), time(), sleep() */
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
68
#include <net/if.h>		/* ioctl, ifreq, SIOCGIFFLAGS, IFF_UP,
24.1.26 by Björn Påhlsson
tally count of used symbols
69
				   SIOCSIFFLAGS, if_indextoname(),
70
				   if_nametoindex(), IF_NAMESIZE */
237.2.67 by Teddy Hogeborn
Four new interrelated features:
71
#include <netinet/in.h>		/* IN6_IS_ADDR_LINKLOCAL,
72
				   INET_ADDRSTRLEN, INET6_ADDRSTRLEN
73
				*/
24.1.29 by Björn Påhlsson
Added more header file comments
74
#include <unistd.h>		/* close(), SEEK_SET, off_t, write(),
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
75
				   getuid(), getgid(), seteuid(),
237.2.137 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Try harder to raise signal on
76
				   setgid(), pause() */
237.7.32 by Teddy Hogeborn
* Makefile (plugins.d/mandos-client): Bug fix: Put $^ before all
77
#include <arpa/inet.h>		/* inet_pton(), htons, inet_ntop() */
237.2.67 by Teddy Hogeborn
Four new interrelated features:
78
#include <iso646.h>		/* not, or, and */
24.1.29 by Björn Påhlsson
Added more header file comments
79
#include <argp.h>		/* struct argp_option, error_t, struct
80
				   argp_state, struct argp,
81
				   argp_parse(), ARGP_KEY_ARG,
82
				   ARGP_KEY_END, ARGP_ERR_UNKNOWN */
237.2.70 by Teddy Hogeborn
Merge from Björn:
83
#include <signal.h>		/* sigemptyset(), sigaddset(),
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
84
				   sigaction(), SIGTERM, sig_atomic_t,
85
				   raise() */
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
86
#include <sysexits.h>		/* EX_OSERR, EX_USAGE, EX_UNAVAILABLE,
87
				   EX_NOHOST, EX_IOERR, EX_PROTOCOL */
237.2.70 by Teddy Hogeborn
Merge from Björn:
88
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
89
#ifdef __linux__
24.1.124 by Björn Påhlsson
Added lower kernel loglevel to reduce clutter on system console.
90
#include <sys/klog.h> 		/* klogctl() */
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
91
#endif	/* __linux__ */
24.1.26 by Björn Påhlsson
tally count of used symbols
92
93
/* Avahi */
24.1.29 by Björn Påhlsson
Added more header file comments
94
/* All Avahi types, constants and functions
95
 Avahi*, avahi_*,
96
 AVAHI_* */
97
#include <avahi-core/core.h>
24.1.26 by Björn Påhlsson
tally count of used symbols
98
#include <avahi-core/lookup.h>
24.1.29 by Björn Påhlsson
Added more header file comments
99
#include <avahi-core/log.h>
24.1.26 by Björn Påhlsson
tally count of used symbols
100
#include <avahi-common/simple-watch.h>
101
#include <avahi-common/malloc.h>
102
#include <avahi-common/error.h>
103
104
/* GnuTLS */
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
105
#include <gnutls/gnutls.h>	/* All GnuTLS types, constants and
106
				   functions:
24.1.29 by Björn Påhlsson
Added more header file comments
107
				   gnutls_*
24.1.26 by Björn Påhlsson
tally count of used symbols
108
				   init_gnutls_session(),
24.1.29 by Björn Påhlsson
Added more header file comments
109
				   GNUTLS_* */
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
110
#include <gnutls/openpgp.h>
111
			  /* gnutls_certificate_set_openpgp_key_file(),
24.1.29 by Björn Påhlsson
Added more header file comments
112
				   GNUTLS_OPENPGP_FMT_BASE64 */
24.1.26 by Björn Påhlsson
tally count of used symbols
113
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
114
/* GPGME */
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
115
#include <gpgme.h> 		/* All GPGME types, constants and
116
				   functions:
24.1.29 by Björn Påhlsson
Added more header file comments
117
				   gpgme_*
24.1.26 by Björn Påhlsson
tally count of used symbols
118
				   GPGME_PROTOCOL_OpenPGP,
24.1.29 by Björn Påhlsson
Added more header file comments
119
				   GPG_ERR_NO_* */
13 by Björn Påhlsson
Added following support:
120
121
#define BUFFER_SIZE 256
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
122
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
123
#define PATHDIR "/conf/conf.d/mandos"
124
#define SECKEY "seckey.txt"
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
125
#define PUBKEY "pubkey.txt"
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
126
15.1.2 by Björn Påhlsson
Added debug options from passprompt as --debug and --debug=passprompt
127
bool debug = false;
43 by Teddy Hogeborn
* plugins.d/mandosclient.c: Cosmetic changes.
128
static const char mandos_protocol_version[] = "1";
217 by Teddy Hogeborn
* .bzrignore: Added "man" directory (created by "make install-html").
129
const char *argp_program_version = "mandos-client " VERSION;
237.11.2 by Teddy Hogeborn
Change "fukt.bsnet.se" to "recompile.se" throughout.
130
const char *argp_program_bug_address = "<mandos@recompile.se>";
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
131
static const char sys_class_net[] = "/sys/class/net";
132
char *connect_to = NULL;
24.1.10 by Björn Påhlsson
merge commit
133
237.7.33 by Teddy Hogeborn
Merge from Björn.
134
/* Doubly linked list that need to be circularly linked when used */
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
135
typedef struct server{
136
  const char *ip;
137
  uint16_t port;
138
  AvahiIfIndex if_index;
139
  int af;
140
  struct timespec last_seen;
141
  struct server *next;
142
  struct server *prev;
143
} server;
144
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
145
/* Used for passing in values through the Avahi callback functions */
13 by Björn Påhlsson
Added following support:
146
typedef struct {
24.1.9 by Björn Påhlsson
not working midwork...
147
  AvahiSimplePoll *simple_poll;
148
  AvahiServer *server;
13 by Björn Påhlsson
Added following support:
149
  gnutls_certificate_credentials_t cred;
24.1.9 by Björn Påhlsson
not working midwork...
150
  unsigned int dh_bits;
24.1.13 by Björn Påhlsson
mandosclient
151
  gnutls_dh_params_t dh_params;
24.1.9 by Björn Påhlsson
not working midwork...
152
  const char *priority;
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
153
  gpgme_ctx_t ctx;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
154
  server *current_server;
24.1.9 by Björn Påhlsson
not working midwork...
155
} mandos_context;
13 by Björn Påhlsson
Added following support:
156
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
157
/* global context so signal handler can reach it*/
24.1.135 by Björn Påhlsson
Earlier signal handling
158
mandos_context mc = { .simple_poll = NULL, .server = NULL,
159
		      .dh_bits = 1024, .priority = "SECURE256"
237.7.33 by Teddy Hogeborn
Merge from Björn.
160
		      ":!CTYPE-X.509:+CTYPE-OPENPGP",
161
		      .current_server = NULL };
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
162
237.2.134 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Always fail and
163
sig_atomic_t quit_now = 0;
164
int signal_received = 0;
165
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
166
/* Function to use when printing errors */
167
void perror_plus(const char *print_text){
237.7.33 by Teddy Hogeborn
Merge from Björn.
168
  fprintf(stderr, "Mandos plugin %s: ",
169
	  program_invocation_short_name);
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
170
  perror(print_text);
171
}
172
43 by Teddy Hogeborn
* plugins.d/mandosclient.c: Cosmetic changes.
173
/*
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
174
 * Make additional room in "buffer" for at least BUFFER_SIZE more
175
 * bytes. "buffer_capacity" is how much is currently allocated,
176
 * "buffer_length" is how much is already used.
43 by Teddy Hogeborn
* plugins.d/mandosclient.c: Cosmetic changes.
177
 */
24.1.132 by Björn Påhlsson
Fixed a bug in fallback handling
178
size_t incbuffer(char **buffer, size_t buffer_length,
24.1.10 by Björn Påhlsson
merge commit
179
		  size_t buffer_capacity){
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
180
  if(buffer_length + BUFFER_SIZE > buffer_capacity){
24.1.12 by Björn Påhlsson
merge +
181
    *buffer = realloc(*buffer, buffer_capacity + BUFFER_SIZE);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
182
    if(buffer == NULL){
24.1.10 by Björn Påhlsson
merge commit
183
      return 0;
184
    }
185
    buffer_capacity += BUFFER_SIZE;
186
  }
187
  return buffer_capacity;
188
}
189
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
190
/* Add server to set of servers to retry periodically */
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
191
int add_server(const char *ip, uint16_t port,
192
		 AvahiIfIndex if_index,
193
		 int af){
194
  int ret;
195
  server *new_server = malloc(sizeof(server));
196
  if(new_server == NULL){
197
    perror_plus("malloc");
198
    return -1;
199
  }
200
  *new_server = (server){ .ip = strdup(ip),
201
			 .port = port,
202
			 .if_index = if_index,
203
			 .af = af };
204
  if(new_server->ip == NULL){
205
    perror_plus("strdup");
237.7.33 by Teddy Hogeborn
Merge from Björn.
206
    return -1;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
207
  }
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
208
  /* Special case of first server */
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
209
  if (mc.current_server == NULL){
210
    new_server->next = new_server;
211
    new_server->prev = new_server;
212
    mc.current_server = new_server;
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
213
  /* Place the new server last in the list */
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
214
  } else {
215
    new_server->next = mc.current_server;
216
    new_server->prev = mc.current_server->prev;
217
    new_server->prev->next = new_server;
218
    mc.current_server->prev = new_server;
219
  }
220
  ret = clock_gettime(CLOCK_MONOTONIC, &mc.current_server->last_seen);
221
  if(ret == -1){
222
    perror_plus("clock_gettime");
223
    return -1;
224
  }
225
  return 0;
226
}
227
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
228
/* 
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
229
 * Initialize GPGME.
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
230
 */
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
231
static bool init_gpgme(const char *seckey,
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
232
		       const char *pubkey, const char *tempdir){
13 by Björn Påhlsson
Added following support:
233
  gpgme_error_t rc;
234
  gpgme_engine_info_t engine_info;
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
235
  
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
236
  
237
  /*
237.2.51 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Use separate bool variable instead
238
   * Helper function to insert pub and seckey to the engine keyring.
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
239
   */
240
  bool import_key(const char *filename){
237.2.124 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gpgme): Move variable "ret" into the
241
    int ret;
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
242
    int fd;
243
    gpgme_data_t pgp_data;
244
    
237.3.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
245
    fd = (int)TEMP_FAILURE_RETRY(open(filename, O_RDONLY));
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
246
    if(fd == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
247
      perror_plus("open");
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
248
      return false;
249
    }
250
    
251
    rc = gpgme_data_new_from_fd(&pgp_data, fd);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
252
    if(rc != GPG_ERR_NO_ERROR){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
253
      fprintf(stderr, "bad gpgme_data_new_from_fd: %s: %s\n",
254
	      gpgme_strsource(rc), gpgme_strerror(rc));
255
      return false;
256
    }
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
257
    
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
258
    rc = gpgme_op_import(mc.ctx, pgp_data);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
259
    if(rc != GPG_ERR_NO_ERROR){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
260
      fprintf(stderr, "bad gpgme_op_import: %s: %s\n",
261
	      gpgme_strsource(rc), gpgme_strerror(rc));
262
      return false;
263
    }
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
264
    
237.3.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
265
    ret = (int)TEMP_FAILURE_RETRY(close(fd));
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
266
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
267
      perror_plus("close");
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
268
    }
269
    gpgme_data_release(pgp_data);
270
    return true;
271
  }
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
272
  
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
273
  if(debug){
237.2.70 by Teddy Hogeborn
Merge from Björn:
274
    fprintf(stderr, "Initializing GPGME\n");
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
275
  }
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
276
  
13 by Björn Påhlsson
Added following support:
277
  /* Init GPGME */
278
  gpgme_check_version(NULL);
24.1.4 by Björn Påhlsson
Added optional parameters certdir, certkey and certfile that can be iven at start in the command line.
279
  rc = gpgme_engine_check_version(GPGME_PROTOCOL_OpenPGP);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
280
  if(rc != GPG_ERR_NO_ERROR){
24.1.4 by Björn Påhlsson
Added optional parameters certdir, certkey and certfile that can be iven at start in the command line.
281
    fprintf(stderr, "bad gpgme_engine_check_version: %s: %s\n",
282
	    gpgme_strsource(rc), gpgme_strerror(rc));
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
283
    return false;
24.1.4 by Björn Påhlsson
Added optional parameters certdir, certkey and certfile that can be iven at start in the command line.
284
  }
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
285
  
237.7.40 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
286
  /* Set GPGME home directory for the OpenPGP engine only */
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
287
  rc = gpgme_get_engine_info(&engine_info);
288
  if(rc != GPG_ERR_NO_ERROR){
13 by Björn Påhlsson
Added following support:
289
    fprintf(stderr, "bad gpgme_get_engine_info: %s: %s\n",
290
	    gpgme_strsource(rc), gpgme_strerror(rc));
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
291
    return false;
13 by Björn Påhlsson
Added following support:
292
  }
293
  while(engine_info != NULL){
294
    if(engine_info->protocol == GPGME_PROTOCOL_OpenPGP){
295
      gpgme_set_engine_info(GPGME_PROTOCOL_OpenPGP,
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
296
			    engine_info->file_name, tempdir);
13 by Björn Påhlsson
Added following support:
297
      break;
298
    }
299
    engine_info = engine_info->next;
300
  }
301
  if(engine_info == NULL){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
302
    fprintf(stderr, "Could not set GPGME home dir to %s\n", tempdir);
303
    return false;
304
  }
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
305
  
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
306
  /* Create new GPGME "context" */
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
307
  rc = gpgme_new(&(mc.ctx));
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
308
  if(rc != GPG_ERR_NO_ERROR){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
309
    fprintf(stderr, "bad gpgme_new: %s: %s\n",
310
	    gpgme_strsource(rc), gpgme_strerror(rc));
311
    return false;
312
  }
313
  
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
314
  if(not import_key(pubkey) or not import_key(seckey)){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
315
    return false;
316
  }
317
  
237.2.118 by Teddy Hogeborn
* mandos: White-space fixes only.
318
  return true;
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
319
}
320
321
/* 
322
 * Decrypt OpenPGP data.
323
 * Returns -1 on error
324
 */
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
325
static ssize_t pgp_packet_decrypt(const char *cryptotext,
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
326
				  size_t crypto_size,
327
				  char **plaintext){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
328
  gpgme_data_t dh_crypto, dh_plain;
329
  gpgme_error_t rc;
330
  ssize_t ret;
331
  size_t plaintext_capacity = 0;
332
  ssize_t plaintext_length = 0;
333
  
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
334
  if(debug){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
335
    fprintf(stderr, "Trying to decrypt OpenPGP data\n");
13 by Björn Påhlsson
Added following support:
336
  }
337
  
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
338
  /* Create new GPGME data buffer from memory cryptotext */
339
  rc = gpgme_data_new_from_mem(&dh_crypto, cryptotext, crypto_size,
340
			       0);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
341
  if(rc != GPG_ERR_NO_ERROR){
13 by Björn Påhlsson
Added following support:
342
    fprintf(stderr, "bad gpgme_data_new_from_mem: %s: %s\n",
343
	    gpgme_strsource(rc), gpgme_strerror(rc));
344
    return -1;
345
  }
346
  
347
  /* Create new empty GPGME data buffer for the plaintext */
348
  rc = gpgme_data_new(&dh_plain);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
349
  if(rc != GPG_ERR_NO_ERROR){
13 by Björn Påhlsson
Added following support:
350
    fprintf(stderr, "bad gpgme_data_new: %s: %s\n",
351
	    gpgme_strsource(rc), gpgme_strerror(rc));
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
352
    gpgme_data_release(dh_crypto);
13 by Björn Påhlsson
Added following support:
353
    return -1;
354
  }
355
  
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
356
  /* Decrypt data from the cryptotext data buffer to the plaintext
357
     data buffer */
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
358
  rc = gpgme_op_decrypt(mc.ctx, dh_crypto, dh_plain);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
359
  if(rc != GPG_ERR_NO_ERROR){
13 by Björn Påhlsson
Added following support:
360
    fprintf(stderr, "bad gpgme_op_decrypt: %s: %s\n",
361
	    gpgme_strsource(rc), gpgme_strerror(rc));
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
362
    plaintext_length = -1;
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
363
    if(debug){
99 by Teddy Hogeborn
* mandos (fingerprint): Bug fix: Check crtverify.value, not crtverify.
364
      gpgme_decrypt_result_t result;
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
365
      result = gpgme_op_decrypt_result(mc.ctx);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
366
      if(result == NULL){
99 by Teddy Hogeborn
* mandos (fingerprint): Bug fix: Check crtverify.value, not crtverify.
367
	fprintf(stderr, "gpgme_op_decrypt_result failed\n");
368
      } else {
369
	fprintf(stderr, "Unsupported algorithm: %s\n",
370
		result->unsupported_algorithm);
371
	fprintf(stderr, "Wrong key usage: %u\n",
372
		result->wrong_key_usage);
373
	if(result->file_name != NULL){
374
	  fprintf(stderr, "File name: %s\n", result->file_name);
375
	}
376
	gpgme_recipient_t recipient;
377
	recipient = result->recipients;
237.2.112 by Teddy Hogeborn
* plugins.d/mandos-client.c (pgp_packet_decrypt): Remove redundant
378
	while(recipient != NULL){
379
	  fprintf(stderr, "Public key algorithm: %s\n",
380
		  gpgme_pubkey_algo_name(recipient->pubkey_algo));
381
	  fprintf(stderr, "Key ID: %s\n", recipient->keyid);
382
	  fprintf(stderr, "Secret key available: %s\n",
383
		  recipient->status == GPG_ERR_NO_SECKEY
384
		  ? "No" : "Yes");
385
	  recipient = recipient->next;
99 by Teddy Hogeborn
* mandos (fingerprint): Bug fix: Check crtverify.value, not crtverify.
386
	}
387
      }
388
    }
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
389
    goto decrypt_end;
13 by Björn Påhlsson
Added following support:
390
  }
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
391
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
392
  if(debug){
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
393
    fprintf(stderr, "Decryption of OpenPGP data succeeded\n");
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
394
  }
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
395
  
13 by Björn Påhlsson
Added following support:
396
  /* Seek back to the beginning of the GPGME plaintext data buffer */
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
397
  if(gpgme_data_seek(dh_plain, (off_t)0, SEEK_SET) == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
398
    perror_plus("gpgme_data_seek");
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
399
    plaintext_length = -1;
400
    goto decrypt_end;
24.1.5 by Björn Påhlsson
plugbasedclient:
401
  }
402
  
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
403
  *plaintext = NULL;
13 by Björn Påhlsson
Added following support:
404
  while(true){
24.1.132 by Björn Påhlsson
Fixed a bug in fallback handling
405
    plaintext_capacity = incbuffer(plaintext,
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
406
				      (size_t)plaintext_length,
24.1.12 by Björn Påhlsson
merge +
407
				      plaintext_capacity);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
408
    if(plaintext_capacity == 0){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
409
	perror_plus("incbuffer");
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
410
	plaintext_length = -1;
411
	goto decrypt_end;
13 by Björn Påhlsson
Added following support:
412
    }
413
    
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
414
    ret = gpgme_data_read(dh_plain, *plaintext + plaintext_length,
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
415
			  BUFFER_SIZE);
13 by Björn Påhlsson
Added following support:
416
    /* Print the data, if any */
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
417
    if(ret == 0){
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
418
      /* EOF */
13 by Björn Påhlsson
Added following support:
419
      break;
420
    }
421
    if(ret < 0){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
422
      perror_plus("gpgme_data_read");
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
423
      plaintext_length = -1;
424
      goto decrypt_end;
13 by Björn Påhlsson
Added following support:
425
    }
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
426
    plaintext_length += ret;
13 by Björn Påhlsson
Added following support:
427
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
428
  
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
429
  if(debug){
430
    fprintf(stderr, "Decrypted password is: ");
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
431
    for(ssize_t i = 0; i < plaintext_length; i++){
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
432
      fprintf(stderr, "%02hhX ", (*plaintext)[i]);
433
    }
434
    fprintf(stderr, "\n");
435
  }
436
  
437
 decrypt_end:
438
  
439
  /* Delete the GPGME cryptotext data buffer */
440
  gpgme_data_release(dh_crypto);
15.1.3 by Björn Påhlsson
Added getopt_long support for mandosclient and passprompt
441
  
442
  /* Delete the GPGME plaintext data buffer */
13 by Björn Påhlsson
Added following support:
443
  gpgme_data_release(dh_plain);
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
444
  return plaintext_length;
13 by Björn Påhlsson
Added following support:
445
}
446
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
447
static const char * safer_gnutls_strerror(int value){
237.2.30 by Teddy Hogeborn
* plugins.d/mandos-client.c: Only comment changes.
448
  const char *ret = gnutls_strerror(value); /* Spurious warning from
449
					       -Wunreachable-code */
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
450
  if(ret == NULL)
13 by Björn Påhlsson
Added following support:
451
    ret = "(unknown)";
452
  return ret;
453
}
454
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
455
/* GnuTLS log function callback */
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
456
static void debuggnutls(__attribute__((unused)) int level,
457
			const char* string){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
458
  fprintf(stderr, "GnuTLS: %s", string);
13 by Björn Påhlsson
Added following support:
459
}
460
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
461
static int init_gnutls_global(const char *pubkeyfilename,
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
462
			      const char *seckeyfilename){
13 by Björn Påhlsson
Added following support:
463
  int ret;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
464
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
465
  if(debug){
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
466
    fprintf(stderr, "Initializing GnuTLS\n");
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
467
  }
24.1.29 by Björn Påhlsson
Added more header file comments
468
  
469
  ret = gnutls_global_init();
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
470
  if(ret != GNUTLS_E_SUCCESS){
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
471
    fprintf(stderr, "GnuTLS global_init: %s\n",
472
	    safer_gnutls_strerror(ret));
13 by Björn Påhlsson
Added following support:
473
    return -1;
474
  }
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
475
  
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
476
  if(debug){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
477
    /* "Use a log level over 10 to enable all debugging options."
478
     * - GnuTLS manual
479
     */
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
480
    gnutls_global_set_log_level(11);
481
    gnutls_global_set_log_function(debuggnutls);
482
  }
483
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
484
  /* OpenPGP credentials */
237.7.32 by Teddy Hogeborn
* Makefile (plugins.d/mandos-client): Bug fix: Put $^ before all
485
  ret = gnutls_certificate_allocate_credentials(&mc.cred);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
486
  if(ret != GNUTLS_E_SUCCESS){
237.7.32 by Teddy Hogeborn
* Makefile (plugins.d/mandos-client): Bug fix: Put $^ before all
487
    fprintf(stderr, "GnuTLS memory error: %s\n",
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
488
	    safer_gnutls_strerror(ret));
489
    gnutls_global_deinit();
13 by Björn Påhlsson
Added following support:
490
    return -1;
491
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
492
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
493
  if(debug){
147 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Improved wording
494
    fprintf(stderr, "Attempting to use OpenPGP public key %s and"
495
	    " secret key %s as GnuTLS credentials\n", pubkeyfilename,
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
496
	    seckeyfilename);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
497
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
498
  
13 by Björn Påhlsson
Added following support:
499
  ret = gnutls_certificate_set_openpgp_key_file
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
500
    (mc.cred, pubkeyfilename, seckeyfilename,
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
501
     GNUTLS_OPENPGP_FMT_BASE64);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
502
  if(ret != GNUTLS_E_SUCCESS){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
503
    fprintf(stderr,
504
	    "Error[%d] while reading the OpenPGP key pair ('%s',"
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
505
	    " '%s')\n", ret, pubkeyfilename, seckeyfilename);
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
506
    fprintf(stderr, "The GnuTLS error is: %s\n",
13 by Björn Påhlsson
Added following support:
507
	    safer_gnutls_strerror(ret));
24.1.20 by Björn Påhlsson
mandosclient
508
    goto globalfail;
13 by Björn Påhlsson
Added following support:
509
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
510
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
511
  /* GnuTLS server initialization */
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
512
  ret = gnutls_dh_params_init(&mc.dh_params);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
513
  if(ret != GNUTLS_E_SUCCESS){
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
514
    fprintf(stderr, "Error in GnuTLS DH parameter initialization:"
515
	    " %s\n", safer_gnutls_strerror(ret));
24.1.20 by Björn Påhlsson
mandosclient
516
    goto globalfail;
13 by Björn Påhlsson
Added following support:
517
  }
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
518
  ret = gnutls_dh_params_generate2(mc.dh_params, mc.dh_bits);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
519
  if(ret != GNUTLS_E_SUCCESS){
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
520
    fprintf(stderr, "Error in GnuTLS prime generation: %s\n",
521
	    safer_gnutls_strerror(ret));
24.1.20 by Björn Påhlsson
mandosclient
522
    goto globalfail;
13 by Björn Påhlsson
Added following support:
523
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
524
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
525
  gnutls_certificate_set_dh_params(mc.cred, mc.dh_params);
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
526
  
24.1.13 by Björn Påhlsson
mandosclient
527
  return 0;
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
528
  
24.1.20 by Björn Påhlsson
mandosclient
529
 globalfail:
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
530
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
531
  gnutls_certificate_free_credentials(mc.cred);
24.1.26 by Björn Påhlsson
tally count of used symbols
532
  gnutls_global_deinit();
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
533
  gnutls_dh_params_deinit(mc.dh_params);
24.1.20 by Björn Påhlsson
mandosclient
534
  return -1;
24.1.13 by Björn Påhlsson
mandosclient
535
}
536
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
537
static int init_gnutls_session(gnutls_session_t *session){
24.1.13 by Björn Påhlsson
mandosclient
538
  int ret;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
539
  /* GnuTLS session creation */
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
540
  do {
541
    ret = gnutls_init(session, GNUTLS_SERVER);
237.2.134 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Always fail and
542
    if(quit_now){
543
      return -1;
544
    }
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
545
  } while(ret == GNUTLS_E_INTERRUPTED or ret == GNUTLS_E_AGAIN);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
546
  if(ret != GNUTLS_E_SUCCESS){
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
547
    fprintf(stderr, "Error in GnuTLS session initialization: %s\n",
13 by Björn Påhlsson
Added following support:
548
	    safer_gnutls_strerror(ret));
549
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
550
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
551
  {
552
    const char *err;
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
553
    do {
554
      ret = gnutls_priority_set_direct(*session, mc.priority, &err);
237.2.134 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Always fail and
555
      if(quit_now){
556
	gnutls_deinit(*session);
557
	return -1;
558
      }
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
559
    } while(ret == GNUTLS_E_INTERRUPTED or ret == GNUTLS_E_AGAIN);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
560
    if(ret != GNUTLS_E_SUCCESS){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
561
      fprintf(stderr, "Syntax error at: %s\n", err);
562
      fprintf(stderr, "GnuTLS error: %s\n",
563
	      safer_gnutls_strerror(ret));
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
564
      gnutls_deinit(*session);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
565
      return -1;
566
    }
13 by Björn Påhlsson
Added following support:
567
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
568
  
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
569
  do {
570
    ret = gnutls_credentials_set(*session, GNUTLS_CRD_CERTIFICATE,
571
				 mc.cred);
237.2.134 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Always fail and
572
    if(quit_now){
573
      gnutls_deinit(*session);
574
      return -1;
575
    }
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
576
  } while(ret == GNUTLS_E_INTERRUPTED or ret == GNUTLS_E_AGAIN);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
577
  if(ret != GNUTLS_E_SUCCESS){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
578
    fprintf(stderr, "Error setting GnuTLS credentials: %s\n",
13 by Björn Påhlsson
Added following support:
579
	    safer_gnutls_strerror(ret));
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
580
    gnutls_deinit(*session);
13 by Björn Påhlsson
Added following support:
581
    return -1;
582
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
583
  
13 by Björn Påhlsson
Added following support:
584
  /* ignore client certificate if any. */
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
585
  gnutls_certificate_server_set_request(*session, GNUTLS_CERT_IGNORE);
13 by Björn Påhlsson
Added following support:
586
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
587
  gnutls_dh_set_prime_bits(*session, mc.dh_bits);
13 by Björn Påhlsson
Added following support:
588
  
589
  return 0;
590
}
591
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
592
/* Avahi log function callback */
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
593
static void empty_log(__attribute__((unused)) AvahiLogLevel level,
594
		      __attribute__((unused)) const char *txt){}
13 by Björn Påhlsson
Added following support:
595
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
596
/* Called when a Mandos server is found */
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
597
static int start_mandos_communication(const char *ip, uint16_t port,
24.1.9 by Björn Påhlsson
not working midwork...
598
				      AvahiIfIndex if_index,
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
599
				      int af){
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
600
  int ret, tcp_sd = -1;
237.3.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
601
  ssize_t sret;
237.2.67 by Teddy Hogeborn
Four new interrelated features:
602
  union {
603
    struct sockaddr_in in;
604
    struct sockaddr_in6 in6;
605
  } to;
13 by Björn Påhlsson
Added following support:
606
  char *buffer = NULL;
237.2.135 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Bug fix:
607
  char *decrypted_buffer = NULL;
13 by Björn Påhlsson
Added following support:
608
  size_t buffer_length = 0;
609
  size_t buffer_capacity = 0;
24.1.10 by Björn Påhlsson
merge commit
610
  size_t written;
237.2.135 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Bug fix:
611
  int retval = -1;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
612
  gnutls_session_t session;
237.2.67 by Teddy Hogeborn
Four new interrelated features:
613
  int pf;			/* Protocol family */
614
  
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
615
  errno = 0;
616
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
617
  if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
618
    errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
619
    return -1;
620
  }
621
  
237.2.67 by Teddy Hogeborn
Four new interrelated features:
622
  switch(af){
623
  case AF_INET6:
624
    pf = PF_INET6;
625
    break;
626
  case AF_INET:
627
    pf = PF_INET;
628
    break;
629
  default:
630
    fprintf(stderr, "Bad address family: %d\n", af);
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
631
    errno = EINVAL;
237.2.67 by Teddy Hogeborn
Four new interrelated features:
632
    return -1;
633
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
634
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
635
  ret = init_gnutls_session(&session);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
636
  if(ret != 0){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
637
    return -1;
638
  }
639
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
640
  if(debug){
237.2.67 by Teddy Hogeborn
Four new interrelated features:
641
    fprintf(stderr, "Setting up a TCP connection to %s, port %" PRIu16
60 by Teddy Hogeborn
* mandos-client.c (main): Cast pid_t to unsigned int before printing.
642
	    "\n", ip, port);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
643
  }
13 by Björn Påhlsson
Added following support:
644
  
237.2.67 by Teddy Hogeborn
Four new interrelated features:
645
  tcp_sd = socket(pf, SOCK_STREAM, 0);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
646
  if(tcp_sd < 0){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
647
    int e = errno;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
648
    perror_plus("socket");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
649
    errno = e;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
650
    goto mandos_end;
651
  }
652
  
653
  if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
654
    errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
655
    goto mandos_end;
13 by Björn Påhlsson
Added following support:
656
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
657
  
84 by Teddy Hogeborn
* Makefile (DOCBOOKTOMAN): Use the local manpages/docbook.xsl file, do
658
  memset(&to, 0, sizeof(to));
237.2.67 by Teddy Hogeborn
Four new interrelated features:
659
  if(af == AF_INET6){
237.2.88 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): "sin6_family"
660
    to.in6.sin6_family = (sa_family_t)af;
237.2.67 by Teddy Hogeborn
Four new interrelated features:
661
    ret = inet_pton(af, ip, &to.in6.sin6_addr);
662
  } else {			/* IPv4 */
663
    to.in.sin_family = (sa_family_t)af;
664
    ret = inet_pton(af, ip, &to.in.sin_addr);
665
  }
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
666
  if(ret < 0 ){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
667
    int e = errno;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
668
    perror_plus("inet_pton");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
669
    errno = e;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
670
    goto mandos_end;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
671
  }
13 by Björn Påhlsson
Added following support:
672
  if(ret == 0){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
673
    int e = errno;
13 by Björn Påhlsson
Added following support:
674
    fprintf(stderr, "Bad address: %s\n", ip);
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
675
    errno = e;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
676
    goto mandos_end;
13 by Björn Påhlsson
Added following support:
677
  }
237.2.67 by Teddy Hogeborn
Four new interrelated features:
678
  if(af == AF_INET6){
679
    to.in6.sin6_port = htons(port); /* Spurious warnings from
680
				       -Wconversion and
681
				       -Wunreachable-code */
682
    
683
    if(IN6_IS_ADDR_LINKLOCAL /* Spurious warnings from */
684
       (&to.in6.sin6_addr)){ /* -Wstrict-aliasing=2 or lower and
685
			      -Wunreachable-code*/
686
      if(if_index == AVAHI_IF_UNSPEC){
687
	fprintf(stderr, "An IPv6 link-local address is incomplete"
688
		" without a network interface\n");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
689
	errno = EINVAL;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
690
	goto mandos_end;
237.2.67 by Teddy Hogeborn
Four new interrelated features:
691
      }
692
      /* Set the network interface number as scope */
693
      to.in6.sin6_scope_id = (uint32_t)if_index;
694
    }
695
  } else {
696
    to.in.sin_port = htons(port); /* Spurious warnings from
237.2.30 by Teddy Hogeborn
* plugins.d/mandos-client.c: Only comment changes.
697
				     -Wconversion and
698
				     -Wunreachable-code */
237.2.67 by Teddy Hogeborn
Four new interrelated features:
699
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
700
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
701
  if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
702
    errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
703
    goto mandos_end;
704
  }
705
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
706
  if(debug){
237.2.67 by Teddy Hogeborn
Four new interrelated features:
707
    if(af == AF_INET6 and if_index != AVAHI_IF_UNSPEC){
708
      char interface[IF_NAMESIZE];
709
      if(if_indextoname((unsigned int)if_index, interface) == NULL){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
710
	perror_plus("if_indextoname");
237.2.67 by Teddy Hogeborn
Four new interrelated features:
711
      } else {
712
	fprintf(stderr, "Connection to: %s%%%s, port %" PRIu16 "\n",
713
		ip, interface, port);
714
      }
715
    } else {
716
      fprintf(stderr, "Connection to: %s, port %" PRIu16 "\n", ip,
717
	      port);
718
    }
719
    char addrstr[(INET_ADDRSTRLEN > INET6_ADDRSTRLEN) ?
720
		 INET_ADDRSTRLEN : INET6_ADDRSTRLEN] = "";
721
    const char *pcret;
722
    if(af == AF_INET6){
723
      pcret = inet_ntop(af, &(to.in6.sin6_addr), addrstr,
724
			sizeof(addrstr));
725
    } else {
726
      pcret = inet_ntop(af, &(to.in.sin_addr), addrstr,
727
			sizeof(addrstr));
728
    }
729
    if(pcret == NULL){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
730
      perror_plus("inet_ntop");
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
731
    } else {
732
      if(strcmp(addrstr, ip) != 0){
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
733
	fprintf(stderr, "Canonical address form: %s\n", addrstr);
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
734
      }
735
    }
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
736
  }
13 by Björn Påhlsson
Added following support:
737
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
738
  if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
739
    errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
740
    goto mandos_end;
741
  }
742
  
237.2.67 by Teddy Hogeborn
Four new interrelated features:
743
  if(af == AF_INET6){
744
    ret = connect(tcp_sd, &to.in6, sizeof(to));
745
  } else {
746
    ret = connect(tcp_sd, &to.in, sizeof(to)); /* IPv4 */
747
  }
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
748
  if(ret < 0){
24.1.163 by Björn Påhlsson
mandos-client: Added never ending loop for --connect
749
    if ((errno != ECONNREFUSED and errno != ENETUNREACH) or debug){
750
      int e = errno;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
751
      perror_plus("connect");
24.1.163 by Björn Påhlsson
mandos-client: Added never ending loop for --connect
752
      errno = e;
753
    }
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
754
    goto mandos_end;
755
  }
756
  
757
  if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
758
    errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
759
    goto mandos_end;
13 by Björn Påhlsson
Added following support:
760
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
761
  
24.1.12 by Björn Påhlsson
merge +
762
  const char *out = mandos_protocol_version;
24.1.10 by Björn Påhlsson
merge commit
763
  written = 0;
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
764
  while(true){
24.1.10 by Björn Påhlsson
merge commit
765
    size_t out_size = strlen(out);
237.3.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
766
    ret = (int)TEMP_FAILURE_RETRY(write(tcp_sd, out + written,
24.1.10 by Björn Påhlsson
merge commit
767
				   out_size - written));
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
768
    if(ret == -1){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
769
      int e = errno;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
770
      perror_plus("write");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
771
      errno = e;
24.1.12 by Björn Påhlsson
merge +
772
      goto mandos_end;
24.1.10 by Björn Påhlsson
merge commit
773
    }
24.1.12 by Björn Påhlsson
merge +
774
    written += (size_t)ret;
24.1.10 by Björn Påhlsson
merge commit
775
    if(written < out_size){
776
      continue;
777
    } else {
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
778
      if(out == mandos_protocol_version){
24.1.10 by Björn Påhlsson
merge commit
779
	written = 0;
780
	out = "\r\n";
781
      } else {
782
	break;
783
      }
784
    }
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
785
  
786
    if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
787
      errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
788
      goto mandos_end;
789
    }
24.1.10 by Björn Påhlsson
merge commit
790
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
791
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
792
  if(debug){
793
    fprintf(stderr, "Establishing TLS session with %s\n", ip);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
794
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
795
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
796
  if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
797
    errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
798
    goto mandos_end;
799
  }
800
  
237.7.33 by Teddy Hogeborn
Merge from Björn.
801
  /* Spurious warning from -Wint-to-pointer-cast */
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
802
  gnutls_transport_set_ptr(session, (gnutls_transport_ptr_t) tcp_sd);
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
803
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
804
  if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
805
    errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
806
    goto mandos_end;
807
  }
808
  
237.2.126 by Teddy Hogeborn
* plugin-runner.c: Minor stylistic changes.
809
  do {
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
810
    ret = gnutls_handshake(session);
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
811
    if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
812
      errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
813
      goto mandos_end;
814
    }
24.1.29 by Björn Påhlsson
Added more header file comments
815
  } while(ret == GNUTLS_E_AGAIN or ret == GNUTLS_E_INTERRUPTED);
13 by Björn Påhlsson
Added following support:
816
  
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
817
  if(ret != GNUTLS_E_SUCCESS){
25 by Teddy Hogeborn
* mandos-clients.conf ([DEFAULT]): New section.
818
    if(debug){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
819
      fprintf(stderr, "*** GnuTLS Handshake failed ***\n");
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
820
      gnutls_perror(ret);
25 by Teddy Hogeborn
* mandos-clients.conf ([DEFAULT]): New section.
821
    }
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
822
    errno = EPROTO;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
823
    goto mandos_end;
13 by Björn Påhlsson
Added following support:
824
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
825
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
826
  /* Read OpenPGP packet that contains the wanted password */
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
827
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
828
  if(debug){
237.2.67 by Teddy Hogeborn
Four new interrelated features:
829
    fprintf(stderr, "Retrieving OpenPGP encrypted password from %s\n",
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
830
	    ip);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
831
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
832
  
13 by Björn Påhlsson
Added following support:
833
  while(true){
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
834
    
835
    if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
836
      errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
837
      goto mandos_end;
838
    }
839
    
24.1.132 by Björn Påhlsson
Fixed a bug in fallback handling
840
    buffer_capacity = incbuffer(&buffer, buffer_length,
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
841
				   buffer_capacity);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
842
    if(buffer_capacity == 0){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
843
      int e = errno;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
844
      perror_plus("incbuffer");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
845
      errno = e;
24.1.12 by Björn Påhlsson
merge +
846
      goto mandos_end;
13 by Björn Påhlsson
Added following support:
847
    }
848
    
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
849
    if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
850
      errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
851
      goto mandos_end;
852
    }
853
    
237.3.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
854
    sret = gnutls_record_recv(session, buffer+buffer_length,
855
			      BUFFER_SIZE);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
856
    if(sret == 0){
13 by Björn Påhlsson
Added following support:
857
      break;
858
    }
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
859
    if(sret < 0){
237.3.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
860
      switch(sret){
13 by Björn Påhlsson
Added following support:
861
      case GNUTLS_E_INTERRUPTED:
862
      case GNUTLS_E_AGAIN:
863
	break;
864
      case GNUTLS_E_REHANDSHAKE:
237.2.126 by Teddy Hogeborn
* plugin-runner.c: Minor stylistic changes.
865
	do {
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
866
	  ret = gnutls_handshake(session);
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
867
	  
868
	  if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
869
	    errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
870
	    goto mandos_end;
871
	  }
24.1.29 by Björn Påhlsson
Added more header file comments
872
	} while(ret == GNUTLS_E_AGAIN or ret == GNUTLS_E_INTERRUPTED);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
873
	if(ret < 0){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
874
	  fprintf(stderr, "*** GnuTLS Re-handshake failed ***\n");
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
875
	  gnutls_perror(ret);
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
876
	  errno = EPROTO;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
877
	  goto mandos_end;
13 by Björn Påhlsson
Added following support:
878
	}
879
	break;
880
      default:
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
881
	fprintf(stderr, "Unknown error while reading data from"
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
882
		" encrypted session with Mandos server\n");
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
883
	gnutls_bye(session, GNUTLS_SHUT_RDWR);
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
884
	errno = EIO;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
885
	goto mandos_end;
13 by Björn Påhlsson
Added following support:
886
      }
887
    } else {
237.3.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
888
      buffer_length += (size_t) sret;
13 by Björn Påhlsson
Added following support:
889
    }
890
  }
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
891
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
892
  if(debug){
893
    fprintf(stderr, "Closing TLS session\n");
894
  }
895
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
896
  if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
897
    errno = EINTR;
237.2.134 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Always fail and
898
    goto mandos_end;
899
  }
900
  
901
  do {
902
    ret = gnutls_bye(session, GNUTLS_SHUT_RDWR);
903
    if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
904
      errno = EINTR;
237.2.134 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Always fail and
905
      goto mandos_end;
906
    }
907
  } while(ret == GNUTLS_E_AGAIN or ret == GNUTLS_E_INTERRUPTED);
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
908
  
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
909
  if(buffer_length > 0){
237.2.125 by Teddy Hogeborn
* plugin-runner.c (getplugin, add_environment, main): Handle EINTR
910
    ssize_t decrypted_buffer_size;
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
911
    decrypted_buffer_size = pgp_packet_decrypt(buffer,
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
912
					       buffer_length,
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
913
					       &decrypted_buffer);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
914
    if(decrypted_buffer_size >= 0){
237.2.124 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gpgme): Move variable "ret" into the
915
      
24.1.10 by Björn Påhlsson
merge commit
916
      written = 0;
28 by Teddy Hogeborn
* server.conf: New file.
917
      while(written < (size_t) decrypted_buffer_size){
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
918
	if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
919
	  errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
920
	  goto mandos_end;
921
	}
922
	
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
923
	ret = (int)fwrite(decrypted_buffer + written, 1,
924
			  (size_t)decrypted_buffer_size - written,
925
			  stdout);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
926
	if(ret == 0 and ferror(stdout)){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
927
	  int e = errno;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
928
	  if(debug){
929
	    fprintf(stderr, "Error writing encrypted data: %s\n",
930
		    strerror(errno));
931
	  }
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
932
	  errno = e;
237.2.135 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Bug fix:
933
	  goto mandos_end;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
934
	}
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
935
	written += (size_t)ret;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
936
      }
237.2.135 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Bug fix:
937
      retval = 0;
13 by Björn Påhlsson
Added following support:
938
    }
939
  }
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
940
  
941
  /* Shutdown procedure */
942
  
943
 mandos_end:
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
944
  {
945
    int e = errno;
946
    free(decrypted_buffer);
947
    free(buffer);
948
    if(tcp_sd >= 0){
949
      ret = (int)TEMP_FAILURE_RETRY(close(tcp_sd));
950
    }
951
    if(ret == -1){
952
      if(e == 0){
953
	e = errno;
954
      }
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
955
      perror_plus("close");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
956
    }
957
    gnutls_deinit(session);
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
958
    errno = e;
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
959
    if(quit_now){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
960
      errno = EINTR;
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
961
      retval = -1;
962
    }
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
963
  }
13 by Björn Påhlsson
Added following support:
964
  return retval;
965
}
966
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
967
static void resolve_callback(AvahiSServiceResolver *r,
968
			     AvahiIfIndex interface,
237.2.67 by Teddy Hogeborn
Four new interrelated features:
969
			     AvahiProtocol proto,
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
970
			     AvahiResolverEvent event,
971
			     const char *name,
972
			     const char *type,
973
			     const char *domain,
974
			     const char *host_name,
975
			     const AvahiAddress *address,
976
			     uint16_t port,
977
			     AVAHI_GCC_UNUSED AvahiStringList *txt,
978
			     AVAHI_GCC_UNUSED AvahiLookupResultFlags
979
			     flags,
237.2.70 by Teddy Hogeborn
Merge from Björn:
980
			     AVAHI_GCC_UNUSED void* userdata){
84 by Teddy Hogeborn
* Makefile (DOCBOOKTOMAN): Use the local manpages/docbook.xsl file, do
981
  assert(r);
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
982
  
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
983
  /* Called whenever a service has been resolved successfully or
984
     timed out */
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
985
  
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
986
  if(quit_now){
987
    return;
988
  }
989
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
990
  switch(event){
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
991
  default:
992
  case AVAHI_RESOLVER_FAILURE:
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
993
    fprintf(stderr, "(Avahi Resolver) Failed to resolve service '%s'"
994
	    " of type '%s' in domain '%s': %s\n", name, type, domain,
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
995
	    avahi_strerror(avahi_server_errno(mc.server)));
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
996
    break;
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
997
    
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
998
  case AVAHI_RESOLVER_FOUND:
999
    {
1000
      char ip[AVAHI_ADDRESS_STR_MAX];
1001
      avahi_address_snprint(ip, sizeof(ip), address);
1002
      if(debug){
60 by Teddy Hogeborn
* mandos-client.c (main): Cast pid_t to unsigned int before printing.
1003
	fprintf(stderr, "Mandos server \"%s\" found on %s (%s, %"
237.2.31 by Teddy Hogeborn
Fixes for sscanf usage:
1004
		PRIdMAX ") on port %" PRIu16 "\n", name, host_name,
1005
		ip, (intmax_t)interface, port);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1006
      }
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1007
      int ret = start_mandos_communication(ip, port, interface,
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1008
					   avahi_proto_to_af(proto));
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
1009
      if(ret == 0){
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1010
	avahi_simple_poll_quit(mc.simple_poll);
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1011
      } else {
1012
	ret = add_server(ip, port, interface,
1013
			 avahi_proto_to_af(proto));
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1014
      }
13 by Björn Påhlsson
Added following support:
1015
    }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1016
  }
1017
  avahi_s_service_resolver_free(r);
13 by Björn Påhlsson
Added following support:
1018
}
1019
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1020
static void browse_callback(AvahiSServiceBrowser *b,
1021
			    AvahiIfIndex interface,
1022
			    AvahiProtocol protocol,
1023
			    AvahiBrowserEvent event,
1024
			    const char *name,
1025
			    const char *type,
1026
			    const char *domain,
1027
			    AVAHI_GCC_UNUSED AvahiLookupResultFlags
1028
			    flags,
237.2.70 by Teddy Hogeborn
Merge from Björn:
1029
			    AVAHI_GCC_UNUSED void* userdata){
84 by Teddy Hogeborn
* Makefile (DOCBOOKTOMAN): Use the local manpages/docbook.xsl file, do
1030
  assert(b);
24.1.9 by Björn Påhlsson
not working midwork...
1031
  
1032
  /* Called whenever a new services becomes available on the LAN or
1033
     is removed from the LAN */
1034
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
1035
  if(quit_now){
1036
    return;
1037
  }
1038
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1039
  switch(event){
24.1.9 by Björn Påhlsson
not working midwork...
1040
  default:
1041
  case AVAHI_BROWSER_FAILURE:
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
1042
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1043
    fprintf(stderr, "(Avahi browser) %s\n",
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1044
	    avahi_strerror(avahi_server_errno(mc.server)));
1045
    avahi_simple_poll_quit(mc.simple_poll);
24.1.9 by Björn Påhlsson
not working midwork...
1046
    return;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
1047
    
24.1.9 by Björn Påhlsson
not working midwork...
1048
  case AVAHI_BROWSER_NEW:
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1049
    /* We ignore the returned Avahi resolver object. In the callback
1050
       function we free it. If the Avahi server is terminated before
1051
       the callback function is called the Avahi server will free the
1052
       resolver for us. */
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
1053
    
237.2.76 by Teddy Hogeborn
* plugins.d/mandos-client.c (browse_callback, main): Do not require
1054
    if(avahi_s_service_resolver_new(mc.server, interface, protocol,
1055
				    name, type, domain, protocol, 0,
1056
				    resolve_callback, NULL) == NULL)
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1057
      fprintf(stderr, "Avahi: Failed to resolve service '%s': %s\n",
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1058
	      name, avahi_strerror(avahi_server_errno(mc.server)));
24.1.9 by Björn Påhlsson
not working midwork...
1059
    break;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
1060
    
24.1.9 by Björn Påhlsson
not working midwork...
1061
  case AVAHI_BROWSER_REMOVE:
1062
    break;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
1063
    
24.1.9 by Björn Påhlsson
not working midwork...
1064
  case AVAHI_BROWSER_ALL_FOR_NOW:
1065
  case AVAHI_BROWSER_CACHE_EXHAUSTED:
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1066
    if(debug){
1067
      fprintf(stderr, "No Mandos server found, still searching...\n");
1068
    }
24.1.9 by Björn Påhlsson
not working midwork...
1069
    break;
1070
  }
13 by Björn Påhlsson
Added following support:
1071
}
1072
237.7.33 by Teddy Hogeborn
Merge from Björn.
1073
/* Signal handler that stops main loop after SIGTERM */
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
1074
static void handle_sigterm(int sig){
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1075
  if(quit_now){
1076
    return;
1077
  }
1078
  quit_now = 1;
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
1079
  signal_received = sig;
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1080
  int old_errno = errno;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1081
  /* set main loop to exit */
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1082
  if(mc.simple_poll != NULL){
1083
    avahi_simple_poll_quit(mc.simple_poll);
1084
  }
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1085
  errno = old_errno;
1086
}
1087
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1088
bool get_flags(const char *ifname, struct ifreq *ifr){
237.15.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1089
  int ret;
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1090
  
237.15.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1091
  int s = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP);
1092
  if(s < 0){
1093
    perror_plus("socket");
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1094
    return false;
237.15.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1095
  }
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1096
  strcpy(ifr->ifr_name, ifname);
1097
  ret = ioctl(s, SIOCGIFFLAGS, ifr);
237.15.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1098
  if(ret == -1){
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1099
    if(debug){
237.15.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1100
      perror_plus("ioctl SIOCGIFFLAGS");
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1101
    }
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1102
    return false;
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1103
  }
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1104
  return true;
1105
}
1106
1107
bool good_flags(const char *ifname, const struct ifreq *ifr){
1108
  
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1109
  /* Reject the loopback device */
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1110
  if(ifr->ifr_flags & IFF_LOOPBACK){
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1111
    if(debug){
1112
      fprintf(stderr, "Rejecting loopback interface \"%s\"\n",
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1113
	      ifname);
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1114
    }
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1115
    return false;
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1116
  }
1117
  /* Accept point-to-point devices only if connect_to is specified */
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1118
  if(connect_to != NULL and (ifr->ifr_flags & IFF_POINTOPOINT)){
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1119
    if(debug){
1120
      fprintf(stderr, "Accepting point-to-point interface \"%s\"\n",
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1121
	      ifname);
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1122
    }
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1123
    return true;
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1124
  }
1125
  /* Otherwise, reject non-broadcast-capable devices */
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1126
  if(not (ifr->ifr_flags & IFF_BROADCAST)){
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1127
    if(debug){
1128
      fprintf(stderr, "Rejecting non-broadcast interface \"%s\"\n",
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1129
	      ifname);
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1130
    }
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1131
    return false;
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1132
  }
237.7.29 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Reject non-ARP
1133
  /* Reject non-ARP interfaces (including dummy interfaces) */
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1134
  if(ifr->ifr_flags & IFF_NOARP){
237.7.29 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Reject non-ARP
1135
    if(debug){
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1136
      fprintf(stderr, "Rejecting non-ARP interface \"%s\"\n", ifname);
237.7.29 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Reject non-ARP
1137
    }
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1138
    return false;
237.7.29 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Reject non-ARP
1139
  }
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1140
  
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1141
  /* Accept this device */
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1142
  if(debug){
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1143
    fprintf(stderr, "Interface \"%s\" is good\n", ifname);
1144
  }
1145
  return true;
1146
}
1147
1148
/* 
1149
 * This function determines if a directory entry in /sys/class/net
1150
 * corresponds to an acceptable network device.
1151
 * (This function is passed to scandir(3) as a filter function.)
1152
 */
1153
int good_interface(const struct dirent *if_entry){
1154
  int ret;
1155
  if(if_entry->d_name[0] == '.'){
1156
    return 0;
1157
  }
1158
  struct ifreq ifr;
1159
1160
  if(not get_flags(if_entry->d_name, &ifr)){
1161
    return 0;
1162
  }
1163
  
1164
  if(not good_flags(if_entry->d_name, &ifr)){
1165
    return 0;
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1166
  }
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1167
  return 1;
1168
}
1169
24.1.172 by Björn Påhlsson
using scandir instead of readdir
1170
int notdotentries(const struct dirent *direntry){
1171
  /* Skip "." and ".." */
1172
  if(direntry->d_name[0] == '.'
1173
     and (direntry->d_name[1] == '\0'
1174
	  or (direntry->d_name[1] == '.'
1175
	      and direntry->d_name[2] == '\0'))){
1176
    return 0;
1177
  }
1178
  return 1;
1179
}
1180
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1181
int avahi_loop_with_timeout(AvahiSimplePoll *s, int retry_interval){
1182
  int ret;
1183
  struct timespec now;
1184
  struct timespec waited_time;
1185
  intmax_t block_time;
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
1186
  
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1187
  while(true){
1188
    if(mc.current_server == NULL){
1189
      if (debug){
237.7.33 by Teddy Hogeborn
Merge from Björn.
1190
	fprintf(stderr,
1191
		"Wait until first server is found. No timeout!\n");
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1192
      }
1193
      ret = avahi_simple_poll_iterate(s, -1);
1194
    } else {
1195
      if (debug){
237.7.33 by Teddy Hogeborn
Merge from Björn.
1196
	fprintf(stderr, "Check current_server if we should run it,"
1197
		" or wait\n");
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1198
      }
1199
      /* the current time */
1200
      ret = clock_gettime(CLOCK_MONOTONIC, &now);
1201
      if(ret == -1){
1202
	perror_plus("clock_gettime");
1203
	return -1;
1204
      }
1205
      /* Calculating in ms how long time between now and server
1206
	 who we visted longest time ago. Now - last seen.  */
237.7.33 by Teddy Hogeborn
Merge from Björn.
1207
      waited_time.tv_sec = (now.tv_sec
1208
			    - mc.current_server->last_seen.tv_sec);
1209
      waited_time.tv_nsec = (now.tv_nsec
1210
			     - mc.current_server->last_seen.tv_nsec);
1211
      /* total time is 10s/10,000ms.
1212
	 Converting to s from ms by dividing by 1,000,
1213
	 and ns to ms by dividing by 1,000,000. */
1214
      block_time = ((retry_interval
1215
		     - ((intmax_t)waited_time.tv_sec * 1000))
1216
		    - ((intmax_t)waited_time.tv_nsec / 1000000));
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
1217
      
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1218
      if (debug){
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
1219
	fprintf(stderr, "Blocking for %" PRIdMAX " ms\n", block_time);
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1220
      }
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
1221
      
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1222
      if(block_time <= 0){
1223
	ret = start_mandos_communication(mc.current_server->ip,
237.7.33 by Teddy Hogeborn
Merge from Björn.
1224
					 mc.current_server->port,
1225
					 mc.current_server->if_index,
1226
					 mc.current_server->af);
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1227
	if(ret == 0){
1228
	  avahi_simple_poll_quit(mc.simple_poll);
1229
	  return 0;
1230
	}
237.7.33 by Teddy Hogeborn
Merge from Björn.
1231
	ret = clock_gettime(CLOCK_MONOTONIC,
1232
			    &mc.current_server->last_seen);
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1233
	if(ret == -1){
1234
	  perror_plus("clock_gettime");
1235
	  return -1;
1236
	}
1237
	mc.current_server = mc.current_server->next;
237.7.33 by Teddy Hogeborn
Merge from Björn.
1238
	block_time = 0; 	/* Call avahi to find new Mandos
1239
				   servers, but don't block */
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1240
      }
1241
      
1242
      ret = avahi_simple_poll_iterate(s, (int)block_time);
1243
    }
1244
    if(ret != 0){
1245
      if (ret > 0 or errno != EINTR) {
1246
	return (ret != 1) ? ret : 0;
1247
      }
1248
    }
1249
  }
1250
}
1251
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1252
int main(int argc, char *argv[]){
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1253
  AvahiSServiceBrowser *sb = NULL;
1254
  int error;
1255
  int ret;
1256
  intmax_t tmpmax;
237.2.74 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
1257
  char *tmp;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1258
  int exitcode = EXIT_SUCCESS;
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1259
  const char *interface = "";
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1260
  struct ifreq network;
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
1261
  int sd = -1;
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1262
  bool take_down_interface = false;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1263
  uid_t uid;
1264
  gid_t gid;
1265
  char tempdir[] = "/tmp/mandosXXXXXX";
1266
  bool tempdir_created = false;
1267
  AvahiIfIndex if_index = AVAHI_IF_UNSPEC;
1268
  const char *seckey = PATHDIR "/" SECKEY;
1269
  const char *pubkey = PATHDIR "/" PUBKEY;
1270
  
1271
  bool gnutls_initialized = false;
1272
  bool gpgme_initialized = false;
237.2.74 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
1273
  float delay = 2.5f;
237.7.33 by Teddy Hogeborn
Merge from Björn.
1274
  double retry_interval = 10; /* 10s between trying a server and
1275
				 retrying the same server again */
237.2.74 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
1276
  
237.2.132 by Teddy Hogeborn
* init.d-mandos (Required-Start, Required-Stop): Bug fix: Added
1277
  struct sigaction old_sigterm_action = { .sa_handler = SIG_DFL };
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1278
  struct sigaction sigterm_action = { .sa_handler = handle_sigterm };
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1279
  
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1280
  uid = getuid();
1281
  gid = getgid();
1282
  
1283
  /* Lower any group privileges we might have, just to be safe */
1284
  errno = 0;
1285
  ret = setgid(gid);
1286
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1287
    perror_plus("setgid");
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1288
  }
1289
  
1290
  /* Lower user privileges (temporarily) */
1291
  errno = 0;
1292
  ret = seteuid(uid);
1293
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1294
    perror_plus("seteuid");
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1295
  }
1296
  
1297
  if(quit_now){
1298
    goto end;
1299
  }
1300
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1301
  {
1302
    struct argp_option options[] = {
1303
      { .name = "debug", .key = 128,
1304
	.doc = "Debug mode", .group = 3 },
1305
      { .name = "connect", .key = 'c',
1306
	.arg = "ADDRESS:PORT",
1307
	.doc = "Connect directly to a specific Mandos server",
1308
	.group = 1 },
1309
      { .name = "interface", .key = 'i',
1310
	.arg = "NAME",
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1311
	.doc = "Network interface that will be used to search for"
1312
	" Mandos servers",
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1313
	.group = 1 },
1314
      { .name = "seckey", .key = 's',
1315
	.arg = "FILE",
1316
	.doc = "OpenPGP secret key file base name",
1317
	.group = 1 },
1318
      { .name = "pubkey", .key = 'p',
1319
	.arg = "FILE",
1320
	.doc = "OpenPGP public key file base name",
1321
	.group = 2 },
1322
      { .name = "dh-bits", .key = 129,
1323
	.arg = "BITS",
1324
	.doc = "Bit length of the prime number used in the"
1325
	" Diffie-Hellman key exchange",
1326
	.group = 2 },
1327
      { .name = "priority", .key = 130,
1328
	.arg = "STRING",
1329
	.doc = "GnuTLS priority string for the TLS handshake",
1330
	.group = 1 },
1331
      { .name = "delay", .key = 131,
1332
	.arg = "SECONDS",
1333
	.doc = "Maximum delay to wait for interface startup",
1334
	.group = 2 },
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1335
      { .name = "retry", .key = 132,
1336
	.arg = "SECONDS",
1337
	.doc = "Retry interval used when denied by the mandos server",
1338
	.group = 2 },
237.2.157 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1339
      /*
1340
       * These reproduce what we would get without ARGP_NO_HELP
1341
       */
1342
      { .name = "help", .key = '?',
1343
	.doc = "Give this help list", .group = -1 },
1344
      { .name = "usage", .key = -3,
1345
	.doc = "Give a short usage message", .group = -1 },
1346
      { .name = "version", .key = 'V',
1347
	.doc = "Print program version", .group = -1 },
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1348
      { .name = NULL }
1349
    };
1350
    
1351
    error_t parse_opt(int key, char *arg,
1352
		      struct argp_state *state){
237.2.157 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1353
      errno = 0;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1354
      switch(key){
1355
      case 128:			/* --debug */
1356
	debug = true;
1357
	break;
1358
      case 'c':			/* --connect */
1359
	connect_to = arg;
1360
	break;
1361
      case 'i':			/* --interface */
1362
	interface = arg;
1363
	break;
1364
      case 's':			/* --seckey */
1365
	seckey = arg;
1366
	break;
1367
      case 'p':			/* --pubkey */
1368
	pubkey = arg;
1369
	break;
1370
      case 129:			/* --dh-bits */
237.2.74 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
1371
	errno = 0;
1372
	tmpmax = strtoimax(arg, &tmp, 10);
1373
	if(errno != 0 or tmp == arg or *tmp != '\0'
1374
	   or tmpmax != (typeof(mc.dh_bits))tmpmax){
237.2.157 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1375
	  argp_error(state, "Bad number of DH bits");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1376
	}
1377
	mc.dh_bits = (typeof(mc.dh_bits))tmpmax;
1378
	break;
1379
      case 130:			/* --priority */
1380
	mc.priority = arg;
1381
	break;
1382
      case 131:			/* --delay */
237.2.74 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
1383
	errno = 0;
1384
	delay = strtof(arg, &tmp);
1385
	if(errno != 0 or tmp == arg or *tmp != '\0'){
237.2.157 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1386
	  argp_error(state, "Bad delay");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1387
	}
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1388
      case 132:			/* --retry */
1389
	errno = 0;
1390
	retry_interval = strtod(arg, &tmp);
1391
	if(errno != 0 or tmp == arg or *tmp != '\0'
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
1392
	   or (retry_interval * 1000) > INT_MAX
1393
	   or retry_interval < 0){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1394
	  argp_error(state, "Bad retry interval");
1395
	}
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1396
	break;
237.2.157 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1397
	/*
1398
	 * These reproduce what we would get without ARGP_NO_HELP
1399
	 */
1400
      case '?':			/* --help */
1401
	argp_state_help(state, state->out_stream,
1402
			(ARGP_HELP_STD_HELP | ARGP_HELP_EXIT_ERR)
1403
			& ~(unsigned int)ARGP_HELP_EXIT_OK);
1404
      case -3:			/* --usage */
1405
	argp_state_help(state, state->out_stream,
1406
			ARGP_HELP_USAGE | ARGP_HELP_EXIT_ERR);
1407
      case 'V':			/* --version */
1408
	fprintf(state->out_stream, "%s\n", argp_program_version);
1409
	exit(argp_err_exit_status);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1410
	break;
1411
      default:
1412
	return ARGP_ERR_UNKNOWN;
1413
      }
237.2.157 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1414
      return errno;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1415
    }
1416
    
1417
    struct argp argp = { .options = options, .parser = parse_opt,
1418
			 .args_doc = "",
1419
			 .doc = "Mandos client -- Get and decrypt"
1420
			 " passwords from a Mandos server" };
237.2.157 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1421
    ret = argp_parse(&argp, argc, argv,
1422
		     ARGP_IN_ORDER | ARGP_NO_HELP, 0, NULL);
1423
    switch(ret){
1424
    case 0:
1425
      break;
1426
    case ENOMEM:
1427
    default:
1428
      errno = ret;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1429
      perror_plus("argp_parse");
237.2.157 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1430
      exitcode = EX_OSERR;
1431
      goto end;
1432
    case EINVAL:
1433
      exitcode = EX_USAGE;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1434
      goto end;
1435
    }
1436
  }
237.7.35 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1437
    
1438
  {
1439
    /* Work around Debian bug #633582:
1440
       <http://bugs.debian.org/633582> */
1441
    struct stat st;
1442
    
1443
    /* Re-raise priviliges */
1444
    errno = 0;
1445
    ret = seteuid(0);
1446
    if(ret == -1){
1447
      perror_plus("seteuid");
1448
    }
1449
    
237.7.40 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
1450
    if(strcmp(seckey, PATHDIR "/" SECKEY) == 0){
1451
      int seckey_fd = open(seckey, O_RDONLY);
1452
      if(seckey_fd == -1){
1453
	perror_plus("open");
237.7.35 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1454
      } else {
237.7.40 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
1455
	ret = (int)TEMP_FAILURE_RETRY(fstat(seckey_fd, &st));
1456
	if(ret == -1){
1457
	  perror_plus("fstat");
1458
	} else {
1459
	  if(S_ISREG(st.st_mode) and st.st_uid == 0 and st.st_gid == 0){
1460
	    ret = fchown(seckey_fd, uid, gid);
1461
	    if(ret == -1){
1462
	      perror_plus("fchown");
1463
	    }
237.7.35 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1464
	  }
1465
	}
237.7.40 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
1466
	TEMP_FAILURE_RETRY(close(seckey_fd));
237.7.35 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1467
      }
1468
    }
1469
    
237.7.40 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
1470
    if(strcmp(pubkey, PATHDIR "/" PUBKEY) == 0){
1471
      int pubkey_fd = open(pubkey, O_RDONLY);
1472
      if(pubkey_fd == -1){
1473
	perror_plus("open");
237.7.35 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1474
      } else {
237.7.40 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
1475
	ret = (int)TEMP_FAILURE_RETRY(fstat(pubkey_fd, &st));
1476
	if(ret == -1){
1477
	  perror_plus("fstat");
1478
	} else {
1479
	  if(S_ISREG(st.st_mode) and st.st_uid == 0 and st.st_gid == 0){
1480
	    ret = fchown(pubkey_fd, uid, gid);
1481
	    if(ret == -1){
1482
	      perror_plus("fchown");
1483
	    }
237.7.35 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1484
	  }
1485
	}
237.7.40 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
1486
	TEMP_FAILURE_RETRY(close(pubkey_fd));
237.7.35 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1487
      }
1488
    }
1489
    
1490
    /* Lower privileges */
1491
    errno = 0;
1492
    ret = seteuid(uid);
1493
    if(ret == -1){
1494
      perror_plus("seteuid");
1495
    }
1496
  }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1497
  
24.1.135 by Björn Påhlsson
Earlier signal handling
1498
  if(not debug){
1499
    avahi_set_log_function(empty_log);
1500
  }
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1501
1502
  if(interface[0] == '\0'){
1503
    struct dirent **direntries;
1504
    ret = scandir(sys_class_net, &direntries, good_interface,
1505
		  alphasort);
1506
    if(ret >= 1){
1507
      /* Pick the first good interface */
1508
      interface = strdup(direntries[0]->d_name);
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1509
      if(debug){
1510
	fprintf(stderr, "Using interface \"%s\"\n", interface);
1511
      }
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1512
      if(interface == NULL){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1513
	perror_plus("malloc");
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1514
	free(direntries);
1515
	exitcode = EXIT_FAILURE;
1516
	goto end;
1517
      }
1518
      free(direntries);
1519
    } else {
1520
      free(direntries);
1521
      fprintf(stderr, "Could not find a network interface\n");
1522
      exitcode = EXIT_FAILURE;
1523
      goto end;
1524
    }
1525
  }
237.2.72 by Teddy Hogeborn
Merge from Björn:
1526
  
24.1.135 by Björn Påhlsson
Earlier signal handling
1527
  /* Initialize Avahi early so avahi_simple_poll_quit() can be called
1528
     from the signal handler */
1529
  /* Initialize the pseudo-RNG for Avahi */
1530
  srand((unsigned int) time(NULL));
1531
  mc.simple_poll = avahi_simple_poll_new();
1532
  if(mc.simple_poll == NULL){
1533
    fprintf(stderr, "Avahi: Failed to create simple poll object.\n");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1534
    exitcode = EX_UNAVAILABLE;
24.1.135 by Björn Påhlsson
Earlier signal handling
1535
    goto end;
1536
  }
237.2.72 by Teddy Hogeborn
Merge from Björn:
1537
  
24.1.135 by Björn Påhlsson
Earlier signal handling
1538
  sigemptyset(&sigterm_action.sa_mask);
237.2.72 by Teddy Hogeborn
Merge from Björn:
1539
  ret = sigaddset(&sigterm_action.sa_mask, SIGINT);
1540
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1541
    perror_plus("sigaddset");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1542
    exitcode = EX_OSERR;
237.2.72 by Teddy Hogeborn
Merge from Björn:
1543
    goto end;
1544
  }
1545
  ret = sigaddset(&sigterm_action.sa_mask, SIGHUP);
1546
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1547
    perror_plus("sigaddset");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1548
    exitcode = EX_OSERR;
237.2.72 by Teddy Hogeborn
Merge from Björn:
1549
    goto end;
1550
  }
24.1.135 by Björn Påhlsson
Earlier signal handling
1551
  ret = sigaddset(&sigterm_action.sa_mask, SIGTERM);
1552
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1553
    perror_plus("sigaddset");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1554
    exitcode = EX_OSERR;
24.1.135 by Björn Påhlsson
Earlier signal handling
1555
    goto end;
1556
  }
237.2.120 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1557
  /* Need to check if the handler is SIG_IGN before handling:
1558
     | [[info:libc:Initial Signal Actions]] |
1559
     | [[info:libc:Basic Signal Handling]]  |
1560
  */
1561
  ret = sigaction(SIGINT, NULL, &old_sigterm_action);
1562
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1563
    perror_plus("sigaction");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1564
    return EX_OSERR;
237.2.120 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1565
  }
1566
  if(old_sigterm_action.sa_handler != SIG_IGN){
1567
    ret = sigaction(SIGINT, &sigterm_action, NULL);
1568
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1569
      perror_plus("sigaction");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1570
      exitcode = EX_OSERR;
237.2.120 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1571
      goto end;
1572
    }
1573
  }
1574
  ret = sigaction(SIGHUP, NULL, &old_sigterm_action);
1575
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1576
    perror_plus("sigaction");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1577
    return EX_OSERR;
237.2.120 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1578
  }
1579
  if(old_sigterm_action.sa_handler != SIG_IGN){
1580
    ret = sigaction(SIGHUP, &sigterm_action, NULL);
1581
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1582
      perror_plus("sigaction");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1583
      exitcode = EX_OSERR;
237.2.120 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1584
      goto end;
1585
    }
1586
  }
1587
  ret = sigaction(SIGTERM, NULL, &old_sigterm_action);
1588
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1589
    perror_plus("sigaction");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1590
    return EX_OSERR;
237.2.120 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1591
  }
1592
  if(old_sigterm_action.sa_handler != SIG_IGN){
1593
    ret = sigaction(SIGTERM, &sigterm_action, NULL);
1594
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1595
      perror_plus("sigaction");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1596
      exitcode = EX_OSERR;
237.2.120 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1597
      goto end;
1598
    }
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
1599
  }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1600
  
1601
  /* If the interface is down, bring it up */
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1602
  if(strcmp(interface, "none") != 0){
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1603
    if_index = (AvahiIfIndex) if_nametoindex(interface);
1604
    if(if_index == 0){
1605
      fprintf(stderr, "No such interface: \"%s\"\n", interface);
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1606
      exitcode = EX_UNAVAILABLE;
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1607
      goto end;
1608
    }
1609
    
1610
    if(quit_now){
1611
      goto end;
1612
    }
1613
    
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1614
    /* Re-raise priviliges */
1615
    errno = 0;
1616
    ret = seteuid(0);
1617
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1618
      perror_plus("seteuid");
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1619
    }
1620
    
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1621
#ifdef __linux__
1622
    /* Lower kernel loglevel to KERN_NOTICE to avoid KERN_INFO
237.2.157 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1623
       messages about the network interface to mess up the prompt */
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1624
    ret = klogctl(8, NULL, 5);
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1625
    bool restore_loglevel = true;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1626
    if(ret == -1){
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1627
      restore_loglevel = false;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1628
      perror_plus("klogctl");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1629
    }
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1630
#endif	/* __linux__ */
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1631
    
1632
    sd = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP);
1633
    if(sd < 0){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1634
      perror_plus("socket");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1635
      exitcode = EX_OSERR;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1636
#ifdef __linux__
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1637
      if(restore_loglevel){
1638
	ret = klogctl(7, NULL, 0);
1639
	if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1640
	  perror_plus("klogctl");
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1641
	}
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1642
      }
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1643
#endif	/* __linux__ */
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1644
      /* Lower privileges */
1645
      errno = 0;
1646
      ret = seteuid(uid);
1647
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1648
	perror_plus("seteuid");
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1649
      }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1650
      goto end;
1651
    }
1652
    strcpy(network.ifr_name, interface);
1653
    ret = ioctl(sd, SIOCGIFFLAGS, &network);
1654
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1655
      perror_plus("ioctl SIOCGIFFLAGS");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1656
#ifdef __linux__
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1657
      if(restore_loglevel){
1658
	ret = klogctl(7, NULL, 0);
1659
	if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1660
	  perror_plus("klogctl");
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1661
	}
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1662
      }
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1663
#endif	/* __linux__ */
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1664
      exitcode = EX_OSERR;
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1665
      /* Lower privileges */
1666
      errno = 0;
1667
      ret = seteuid(uid);
1668
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1669
	perror_plus("seteuid");
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1670
      }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1671
      goto end;
1672
    }
1673
    if((network.ifr_flags & IFF_UP) == 0){
1674
      network.ifr_flags |= IFF_UP;
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1675
      take_down_interface = true;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1676
      ret = ioctl(sd, SIOCSIFFLAGS, &network);
1677
      if(ret == -1){
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1678
	take_down_interface = false;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1679
	perror_plus("ioctl SIOCSIFFLAGS +IFF_UP");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1680
	exitcode = EX_OSERR;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1681
#ifdef __linux__
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1682
	if(restore_loglevel){
1683
	  ret = klogctl(7, NULL, 0);
1684
	  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1685
	    perror_plus("klogctl");
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1686
	  }
24.1.124 by Björn Påhlsson
Added lower kernel loglevel to reduce clutter on system console.
1687
	}
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1688
#endif	/* __linux__ */
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1689
	/* Lower privileges */
1690
	errno = 0;
1691
	ret = seteuid(uid);
1692
	if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1693
	  perror_plus("seteuid");
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1694
	}
65 by Teddy Hogeborn
* plugins.d/password-request.c (main): Bug fix: Bring up network
1695
	goto end;
1696
      }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1697
    }
237.7.33 by Teddy Hogeborn
Merge from Björn.
1698
    /* Sleep checking until interface is running.
1699
       Check every 0.25s, up to total time of delay */
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1700
    for(int i=0; i < delay * 4; i++){
65 by Teddy Hogeborn
* plugins.d/password-request.c (main): Bug fix: Bring up network
1701
      ret = ioctl(sd, SIOCGIFFLAGS, &network);
1702
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1703
	perror_plus("ioctl SIOCGIFFLAGS");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1704
      } else if(network.ifr_flags & IFF_RUNNING){
1705
	break;
1706
      }
1707
      struct timespec sleeptime = { .tv_nsec = 250000000 };
1708
      ret = nanosleep(&sleeptime, NULL);
1709
      if(ret == -1 and errno != EINTR){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1710
	perror_plus("nanosleep");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1711
      }
1712
    }
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1713
    if(not take_down_interface){
1714
      /* We won't need the socket anymore */
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
1715
      ret = (int)TEMP_FAILURE_RETRY(close(sd));
1716
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1717
	perror_plus("close");
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
1718
      }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1719
    }
1720
#ifdef __linux__
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1721
    if(restore_loglevel){
1722
      /* Restores kernel loglevel to default */
1723
      ret = klogctl(7, NULL, 0);
1724
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1725
	perror_plus("klogctl");
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1726
      }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1727
    }
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1728
#endif	/* __linux__ */
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1729
    /* Lower privileges */
1730
    errno = 0;
1731
    if(take_down_interface){
1732
      /* Lower privileges */
1733
      ret = seteuid(uid);
1734
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1735
	perror_plus("seteuid");
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1736
      }
1737
    } else {
1738
      /* Lower privileges permanently */
1739
      ret = setuid(uid);
1740
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1741
	perror_plus("setuid");
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1742
      }
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
1743
    }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1744
  }
1745
  
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1746
  if(quit_now){
1747
    goto end;
1748
  }
1749
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1750
  ret = init_gnutls_global(pubkey, seckey);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1751
  if(ret == -1){
1752
    fprintf(stderr, "init_gnutls_global failed\n");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1753
    exitcode = EX_UNAVAILABLE;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1754
    goto end;
1755
  } else {
1756
    gnutls_initialized = true;
1757
  }
1758
  
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1759
  if(quit_now){
1760
    goto end;
1761
  }
1762
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1763
  if(mkdtemp(tempdir) == NULL){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1764
    perror_plus("mkdtemp");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1765
    goto end;
1766
  }
24.1.172 by Björn Påhlsson
using scandir instead of readdir
1767
  tempdir_created = true;
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1768
  
1769
  if(quit_now){
1770
    goto end;
1771
  }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1772
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1773
  if(not init_gpgme(pubkey, seckey, tempdir)){
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1774
    fprintf(stderr, "init_gpgme failed\n");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1775
    exitcode = EX_UNAVAILABLE;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1776
    goto end;
1777
  } else {
1778
    gpgme_initialized = true;
1779
  }
1780
  
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1781
  if(quit_now){
1782
    goto end;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1783
  }
1784
  
1785
  if(connect_to != NULL){
1786
    /* Connect directly, do not use Zeroconf */
1787
    /* (Mainly meant for debugging) */
1788
    char *address = strrchr(connect_to, ':');
1789
    if(address == NULL){
1790
      fprintf(stderr, "No colon in address\n");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1791
      exitcode = EX_USAGE;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1792
      goto end;
1793
    }
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1794
    
1795
    if(quit_now){
1796
      goto end;
1797
    }
1798
    
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1799
    uint16_t port;
237.2.74 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
1800
    errno = 0;
1801
    tmpmax = strtoimax(address+1, &tmp, 10);
1802
    if(errno != 0 or tmp == address+1 or *tmp != '\0'
1803
       or tmpmax != (uint16_t)tmpmax){
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1804
      fprintf(stderr, "Bad port number\n");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1805
      exitcode = EX_USAGE;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1806
      goto end;
1807
    }
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1808
  
1809
    if(quit_now){
1810
      goto end;
1811
    }
1812
    
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1813
    port = (uint16_t)tmpmax;
1814
    *address = '\0';
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1815
    /* Colon in address indicates IPv6 */
1816
    int af;
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
1817
    if(strchr(connect_to, ':') != NULL){
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1818
      af = AF_INET6;
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
1819
      /* Accept [] around IPv6 address - see RFC 5952 */
1820
      if(connect_to[0] == '[' and address[-1] == ']')
1821
	{
1822
	  connect_to++;
1823
	  address[-1] = '\0';
1824
	}
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1825
    } else {
1826
      af = AF_INET;
1827
    }
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
1828
    address = connect_to;
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1829
    
1830
    if(quit_now){
1831
      goto end;
1832
    }
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
1833
    
24.1.163 by Björn Påhlsson
mandos-client: Added never ending loop for --connect
1834
    while(not quit_now){
1835
      ret = start_mandos_communication(address, port, if_index, af);
1836
      if(quit_now or ret == 0){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1837
	break;
1838
      }
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
1839
      if(debug){
1840
	fprintf(stderr, "Retrying in %d seconds\n",
1841
		(int)retry_interval);
1842
      }
1843
      sleep((int)retry_interval);
237.7.40 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
1844
    }
1845
    
24.1.163 by Björn Påhlsson
mandos-client: Added never ending loop for --connect
1846
    if (not quit_now){
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1847
      exitcode = EXIT_SUCCESS;
1848
    }
24.1.163 by Björn Påhlsson
mandos-client: Added never ending loop for --connect
1849
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1850
    goto end;
1851
  }
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1852
  
1853
  if(quit_now){
1854
    goto end;
1855
  }
1856
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1857
  {
1858
    AvahiServerConfig config;
1859
    /* Do not publish any local Zeroconf records */
1860
    avahi_server_config_init(&config);
1861
    config.publish_hinfo = 0;
1862
    config.publish_addresses = 0;
1863
    config.publish_workstation = 0;
1864
    config.publish_domain = 0;
1865
    
1866
    /* Allocate a new server */
1867
    mc.server = avahi_server_new(avahi_simple_poll_get
1868
				 (mc.simple_poll), &config, NULL,
1869
				 NULL, &error);
1870
    
1871
    /* Free the Avahi configuration data */
1872
    avahi_server_config_free(&config);
1873
  }
1874
  
1875
  /* Check if creating the Avahi server object succeeded */
1876
  if(mc.server == NULL){
1877
    fprintf(stderr, "Failed to create Avahi server: %s\n",
1878
	    avahi_strerror(error));
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1879
    exitcode = EX_UNAVAILABLE;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1880
    goto end;
1881
  }
1882
  
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1883
  if(quit_now){
1884
    goto end;
1885
  }
1886
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1887
  /* Create the Avahi service browser */
1888
  sb = avahi_s_service_browser_new(mc.server, if_index,
237.2.76 by Teddy Hogeborn
* plugins.d/mandos-client.c (browse_callback, main): Do not require
1889
				   AVAHI_PROTO_UNSPEC, "_mandos._tcp",
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1890
				   NULL, 0, browse_callback, NULL);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1891
  if(sb == NULL){
1892
    fprintf(stderr, "Failed to create service browser: %s\n",
1893
	    avahi_strerror(avahi_server_errno(mc.server)));
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1894
    exitcode = EX_UNAVAILABLE;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1895
    goto end;
1896
  }
237.2.70 by Teddy Hogeborn
Merge from Björn:
1897
  
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1898
  if(quit_now){
1899
    goto end;
1900
  }
1901
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1902
  /* Run the main loop */
1903
  
1904
  if(debug){
1905
    fprintf(stderr, "Starting Avahi loop search\n");
1906
  }
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1907
237.7.33 by Teddy Hogeborn
Merge from Björn.
1908
  ret = avahi_loop_with_timeout(mc.simple_poll,
1909
				(int)(retry_interval * 1000));
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1910
  if(debug){
1911
    fprintf(stderr, "avahi_loop_with_timeout exited %s\n",
1912
	    (ret == 0) ? "successfully" : "with error");
1913
  }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1914
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1915
 end:
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1916
  
1917
  if(debug){
1918
    fprintf(stderr, "%s exiting\n", argv[0]);
1919
  }
1920
  
1921
  /* Cleanup things */
1922
  if(sb != NULL)
1923
    avahi_s_service_browser_free(sb);
1924
  
1925
  if(mc.server != NULL)
1926
    avahi_server_free(mc.server);
1927
  
1928
  if(mc.simple_poll != NULL)
1929
    avahi_simple_poll_free(mc.simple_poll);
1930
  
1931
  if(gnutls_initialized){
1932
    gnutls_certificate_free_credentials(mc.cred);
1933
    gnutls_global_deinit();
1934
    gnutls_dh_params_deinit(mc.dh_params);
1935
  }
1936
  
1937
  if(gpgme_initialized){
1938
    gpgme_release(mc.ctx);
1939
  }
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1940
237.7.33 by Teddy Hogeborn
Merge from Björn.
1941
  /* Cleans up the circular linked list of Mandos servers the client
1942
     has seen */
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1943
  if(mc.current_server != NULL){
1944
    mc.current_server->prev->next = NULL;
1945
    while(mc.current_server != NULL){
1946
      server *next = mc.current_server->next;
1947
      free(mc.current_server);
1948
      mc.current_server = next;
1949
    }
1950
  }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1951
  
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
1952
  /* Take down the network interface */
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1953
  if(take_down_interface){
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
1954
    /* Re-raise priviliges */
1955
    errno = 0;
1956
    ret = seteuid(0);
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
1957
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1958
      perror_plus("seteuid");
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
1959
    }
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
1960
    if(geteuid() == 0){
1961
      ret = ioctl(sd, SIOCGIFFLAGS, &network);
1962
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1963
	perror_plus("ioctl SIOCGIFFLAGS");
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
1964
      } else if(network.ifr_flags & IFF_UP) {
237.2.157 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1965
	network.ifr_flags &= ~(short)IFF_UP; /* clear flag */
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
1966
	ret = ioctl(sd, SIOCSIFFLAGS, &network);
1967
	if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1968
	  perror_plus("ioctl SIOCSIFFLAGS -IFF_UP");
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
1969
	}
1970
      }
1971
      ret = (int)TEMP_FAILURE_RETRY(close(sd));
1972
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1973
	perror_plus("close");
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
1974
      }
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1975
      /* Lower privileges permanently */
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
1976
      errno = 0;
1977
      ret = setuid(uid);
1978
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1979
	perror_plus("setuid");
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
1980
      }
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
1981
    }
1982
  }
1983
  
24.1.172 by Björn Påhlsson
using scandir instead of readdir
1984
  /* Removes the GPGME temp directory and all files inside */
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1985
  if(tempdir_created){
24.1.172 by Björn Påhlsson
using scandir instead of readdir
1986
    struct dirent **direntries = NULL;
1987
    struct dirent *direntry = NULL;
237.7.40 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
1988
    int numentries = scandir(tempdir, &direntries, notdotentries,
1989
			     alphasort);
1990
    if (numentries > 0){
1991
      for(int i = 0; i < numentries; i++){
24.1.172 by Björn Påhlsson
using scandir instead of readdir
1992
	direntry = direntries[i];
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1993
	char *fullname = NULL;
1994
	ret = asprintf(&fullname, "%s/%s", tempdir,
1995
		       direntry->d_name);
1996
	if(ret < 0){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1997
	  perror_plus("asprintf");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1998
	  continue;
1999
	}
2000
	ret = remove(fullname);
2001
	if(ret == -1){
2002
	  fprintf(stderr, "remove(\"%s\"): %s\n", fullname,
2003
		  strerror(errno));
2004
	}
2005
	free(fullname);
2006
      }
24.1.172 by Björn Påhlsson
using scandir instead of readdir
2007
    }
2008
237.7.40 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
2009
    /* need to clean even if 0 because man page doesn't specify */
24.1.172 by Björn Påhlsson
using scandir instead of readdir
2010
    free(direntries);
237.7.40 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
2011
    if (numentries == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2012
      perror_plus("scandir");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2013
    }
2014
    ret = rmdir(tempdir);
2015
    if(ret == -1 and errno != ENOENT){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2016
      perror_plus("rmdir");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2017
    }
2018
  }
2019
  
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
2020
  if(quit_now){
237.2.120 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
2021
    sigemptyset(&old_sigterm_action.sa_mask);
2022
    old_sigterm_action.sa_handler = SIG_DFL;
237.2.137 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Try harder to raise signal on
2023
    ret = (int)TEMP_FAILURE_RETRY(sigaction(signal_received,
2024
					    &old_sigterm_action,
2025
					    NULL));
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
2026
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2027
      perror_plus("sigaction");
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
2028
    }
237.2.137 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Try harder to raise signal on
2029
    do {
2030
      ret = raise(signal_received);
2031
    } while(ret != 0 and errno == EINTR);
2032
    if(ret != 0){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2033
      perror_plus("raise");
237.2.137 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Try harder to raise signal on
2034
      abort();
2035
    }
2036
    TEMP_FAILURE_RETRY(pause());
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
2037
  }
2038
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2039
  return exitcode;
13 by Björn Påhlsson
Added following support:
2040
}