/mandos/release

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