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