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