/mandos/trunk

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