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