/mandos/trunk

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