/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
/*
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
12
 * Copyright © 2007-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){
318
    perror("pgpme_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.20 by Björn Påhlsson
mandosclient
454
  return -1;
24.1.13 by Björn Påhlsson
mandosclient
455
}
456
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
457
static int init_gnutls_session(mandos_context *mc,
458
			       gnutls_session_t *session){
24.1.13 by Björn Påhlsson
mandosclient
459
  int ret;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
460
  /* GnuTLS session creation */
461
  ret = gnutls_init(session, GNUTLS_SERVER);
462
  if (ret != GNUTLS_E_SUCCESS){
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
463
    fprintf(stderr, "Error in GnuTLS session initialization: %s\n",
13 by Björn Påhlsson
Added following support:
464
	    safer_gnutls_strerror(ret));
465
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
466
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
467
  {
468
    const char *err;
469
    ret = gnutls_priority_set_direct(*session, mc->priority, &err);
470
    if (ret != GNUTLS_E_SUCCESS) {
471
      fprintf(stderr, "Syntax error at: %s\n", err);
472
      fprintf(stderr, "GnuTLS error: %s\n",
473
	      safer_gnutls_strerror(ret));
24.1.20 by Björn Påhlsson
mandosclient
474
      gnutls_deinit (*session);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
475
      return -1;
476
    }
13 by Björn Påhlsson
Added following support:
477
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
478
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
479
  ret = gnutls_credentials_set(*session, GNUTLS_CRD_CERTIFICATE,
480
			       mc->cred);
481
  if (ret != GNUTLS_E_SUCCESS) {
482
    fprintf(stderr, "Error setting GnuTLS credentials: %s\n",
13 by Björn Påhlsson
Added following support:
483
	    safer_gnutls_strerror(ret));
24.1.20 by Björn Påhlsson
mandosclient
484
    gnutls_deinit (*session);
13 by Björn Påhlsson
Added following support:
485
    return -1;
486
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
487
  
13 by Björn Påhlsson
Added following support:
488
  /* ignore client certificate if any. */
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
489
  gnutls_certificate_server_set_request (*session,
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
490
					 GNUTLS_CERT_IGNORE);
13 by Björn Påhlsson
Added following support:
491
  
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
492
  gnutls_dh_set_prime_bits (*session, mc->dh_bits);
13 by Björn Påhlsson
Added following support:
493
  
494
  return 0;
495
}
496
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
497
/* Avahi log function callback */
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
498
static void empty_log(__attribute__((unused)) AvahiLogLevel level,
499
		      __attribute__((unused)) const char *txt){}
13 by Björn Påhlsson
Added following support:
500
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
501
/* Called when a Mandos server is found */
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
502
static int start_mandos_communication(const char *ip, uint16_t port,
24.1.9 by Björn Påhlsson
not working midwork...
503
				      AvahiIfIndex if_index,
504
				      mandos_context *mc){
13 by Björn Påhlsson
Added following support:
505
  int ret, tcp_sd;
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
506
  union { struct sockaddr in; struct sockaddr_in6 in6; } to;
13 by Björn Påhlsson
Added following support:
507
  char *buffer = NULL;
508
  char *decrypted_buffer;
509
  size_t buffer_length = 0;
510
  size_t buffer_capacity = 0;
511
  ssize_t decrypted_buffer_size;
24.1.10 by Björn Påhlsson
merge commit
512
  size_t written;
13 by Björn Påhlsson
Added following support:
513
  int retval = 0;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
514
  char interface[IF_NAMESIZE];
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
515
  gnutls_session_t session;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
516
  
24.1.13 by Björn Påhlsson
mandosclient
517
  ret = init_gnutls_session (mc, &session);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
518
  if (ret != 0){
519
    return -1;
520
  }
521
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
522
  if(debug){
60 by Teddy Hogeborn
* mandos-client.c (main): Cast pid_t to unsigned int before printing.
523
    fprintf(stderr, "Setting up a tcp connection to %s, port %" PRIu16
524
	    "\n", ip, port);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
525
  }
13 by Björn Påhlsson
Added following support:
526
  
527
  tcp_sd = socket(PF_INET6, SOCK_STREAM, 0);
528
  if(tcp_sd < 0) {
529
    perror("socket");
530
    return -1;
531
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
532
  
24.1.6 by Björn Påhlsson
plugbasedclient
533
  if(debug){
24.1.7 by Björn Påhlsson
merge
534
    if(if_indextoname((unsigned int)if_index, interface) == NULL){
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
535
      perror("if_indextoname");
24.1.6 by Björn Påhlsson
plugbasedclient
536
      return -1;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
537
    }
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
538
    fprintf(stderr, "Binding to interface %s\n", interface);
539
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
540
  
84 by Teddy Hogeborn
* Makefile (DOCBOOKTOMAN): Use the local manpages/docbook.xsl file, do
541
  memset(&to, 0, sizeof(to));
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
542
  to.in6.sin6_family = AF_INET6;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
543
  /* It would be nice to have a way to detect if we were passed an
544
     IPv4 address here.   Now we assume an IPv6 address. */
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
545
  ret = inet_pton(AF_INET6, ip, &to.in6.sin6_addr);
13 by Björn Påhlsson
Added following support:
546
  if (ret < 0 ){
547
    perror("inet_pton");
548
    return -1;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
549
  }
13 by Björn Påhlsson
Added following support:
550
  if(ret == 0){
551
    fprintf(stderr, "Bad address: %s\n", ip);
552
    return -1;
553
  }
65 by Teddy Hogeborn
* plugins.d/password-request.c (main): Bug fix: Bring up network
554
  to.in6.sin6_port = htons(port); /* Spurious warning */
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
555
  
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
556
  to.in6.sin6_scope_id = (uint32_t)if_index;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
557
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
558
  if(debug){
60 by Teddy Hogeborn
* mandos-client.c (main): Cast pid_t to unsigned int before printing.
559
    fprintf(stderr, "Connection to: %s, port %" PRIu16 "\n", ip,
560
	    port);
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
561
    char addrstr[INET6_ADDRSTRLEN] = "";
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
562
    if(inet_ntop(to.in6.sin6_family, &(to.in6.sin6_addr), addrstr,
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
563
		 sizeof(addrstr)) == NULL){
564
      perror("inet_ntop");
565
    } else {
566
      if(strcmp(addrstr, ip) != 0){
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
567
	fprintf(stderr, "Canonical address form: %s\n", addrstr);
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
568
      }
569
    }
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
570
  }
13 by Björn Påhlsson
Added following support:
571
  
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
572
  ret = connect(tcp_sd, &to.in, sizeof(to));
13 by Björn Påhlsson
Added following support:
573
  if (ret < 0){
574
    perror("connect");
575
    return -1;
576
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
577
  
24.1.12 by Björn Påhlsson
merge +
578
  const char *out = mandos_protocol_version;
24.1.10 by Björn Påhlsson
merge commit
579
  written = 0;
580
  while (true){
581
    size_t out_size = strlen(out);
582
    ret = TEMP_FAILURE_RETRY(write(tcp_sd, out + written,
583
				   out_size - written));
584
    if (ret == -1){
585
      perror("write");
586
      retval = -1;
24.1.12 by Björn Påhlsson
merge +
587
      goto mandos_end;
24.1.10 by Björn Påhlsson
merge commit
588
    }
24.1.12 by Björn Påhlsson
merge +
589
    written += (size_t)ret;
24.1.10 by Björn Påhlsson
merge commit
590
    if(written < out_size){
591
      continue;
592
    } else {
593
      if (out == mandos_protocol_version){
594
	written = 0;
595
	out = "\r\n";
596
      } else {
597
	break;
598
      }
599
    }
600
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
601
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
602
  if(debug){
603
    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
604
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
605
  
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
606
  gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) tcp_sd);
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
607
  
24.1.29 by Björn Påhlsson
Added more header file comments
608
  do{
609
    ret = gnutls_handshake (session);
610
  } while(ret == GNUTLS_E_AGAIN or ret == GNUTLS_E_INTERRUPTED);
13 by Björn Påhlsson
Added following support:
611
  
612
  if (ret != GNUTLS_E_SUCCESS){
25 by Teddy Hogeborn
* mandos-clients.conf ([DEFAULT]): New section.
613
    if(debug){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
614
      fprintf(stderr, "*** GnuTLS Handshake failed ***\n");
25 by Teddy Hogeborn
* mandos-clients.conf ([DEFAULT]): New section.
615
      gnutls_perror (ret);
616
    }
13 by Björn Påhlsson
Added following support:
617
    retval = -1;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
618
    goto mandos_end;
13 by Björn Påhlsson
Added following support:
619
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
620
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
621
  /* Read OpenPGP packet that contains the wanted password */
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
622
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
623
  if(debug){
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
624
    fprintf(stderr, "Retrieving pgp encrypted password from %s\n",
625
	    ip);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
626
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
627
  
13 by Björn Påhlsson
Added following support:
628
  while(true){
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
629
    buffer_capacity = adjustbuffer(&buffer, buffer_length,
630
				   buffer_capacity);
24.1.10 by Björn Påhlsson
merge commit
631
    if (buffer_capacity == 0){
632
      perror("adjustbuffer");
633
      retval = -1;
24.1.12 by Björn Påhlsson
merge +
634
      goto mandos_end;
13 by Björn Påhlsson
Added following support:
635
    }
636
    
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
637
    ret = gnutls_record_recv(session, buffer+buffer_length,
638
			     BUFFER_SIZE);
13 by Björn Påhlsson
Added following support:
639
    if (ret == 0){
640
      break;
641
    }
642
    if (ret < 0){
643
      switch(ret){
644
      case GNUTLS_E_INTERRUPTED:
645
      case GNUTLS_E_AGAIN:
646
	break;
647
      case GNUTLS_E_REHANDSHAKE:
24.1.29 by Björn Påhlsson
Added more header file comments
648
	do{
649
	  ret = gnutls_handshake (session);
650
	} while(ret == GNUTLS_E_AGAIN or ret == GNUTLS_E_INTERRUPTED);
13 by Björn Påhlsson
Added following support:
651
	if (ret < 0){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
652
	  fprintf(stderr, "*** GnuTLS Re-handshake failed ***\n");
13 by Björn Påhlsson
Added following support:
653
	  gnutls_perror (ret);
654
	  retval = -1;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
655
	  goto mandos_end;
13 by Björn Påhlsson
Added following support:
656
	}
657
	break;
658
      default:
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
659
	fprintf(stderr, "Unknown error while reading data from"
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
660
		" encrypted session with Mandos server\n");
13 by Björn Påhlsson
Added following support:
661
	retval = -1;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
662
	gnutls_bye (session, GNUTLS_SHUT_RDWR);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
663
	goto mandos_end;
13 by Björn Påhlsson
Added following support:
664
      }
665
    } else {
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
666
      buffer_length += (size_t) ret;
13 by Björn Påhlsson
Added following support:
667
    }
668
  }
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
669
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
670
  if(debug){
671
    fprintf(stderr, "Closing TLS session\n");
672
  }
673
  
674
  gnutls_bye (session, GNUTLS_SHUT_RDWR);
675
  
13 by Björn Påhlsson
Added following support:
676
  if (buffer_length > 0){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
677
    decrypted_buffer_size = pgp_packet_decrypt(mc, buffer,
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
678
					       buffer_length,
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
679
					       &decrypted_buffer);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
680
    if (decrypted_buffer_size >= 0){
24.1.10 by Björn Påhlsson
merge commit
681
      written = 0;
28 by Teddy Hogeborn
* server.conf: New file.
682
      while(written < (size_t) decrypted_buffer_size){
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
683
	ret = (int)fwrite (decrypted_buffer + written, 1,
684
			   (size_t)decrypted_buffer_size - written,
685
			   stdout);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
686
	if(ret == 0 and ferror(stdout)){
687
	  if(debug){
688
	    fprintf(stderr, "Error writing encrypted data: %s\n",
689
		    strerror(errno));
690
	  }
691
	  retval = -1;
692
	  break;
693
	}
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
694
	written += (size_t)ret;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
695
      }
13 by Björn Påhlsson
Added following support:
696
      free(decrypted_buffer);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
697
    } else {
698
      retval = -1;
13 by Björn Påhlsson
Added following support:
699
    }
24.1.63 by Björn Påhlsson
merge + fallback bugg
700
  } else {
701
    retval = -1;
13 by Björn Påhlsson
Added following support:
702
  }
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
703
  
704
  /* Shutdown procedure */
705
  
706
 mandos_end:
13 by Björn Påhlsson
Added following support:
707
  free(buffer);
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
708
  ret = TEMP_FAILURE_RETRY(close(tcp_sd));
709
  if(ret == -1){
710
    perror("close");
711
  }
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
712
  gnutls_deinit (session);
13 by Björn Påhlsson
Added following support:
713
  return retval;
714
}
715
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
716
static void resolve_callback(AvahiSServiceResolver *r,
717
			     AvahiIfIndex interface,
718
			     AVAHI_GCC_UNUSED AvahiProtocol protocol,
719
			     AvahiResolverEvent event,
720
			     const char *name,
721
			     const char *type,
722
			     const char *domain,
723
			     const char *host_name,
724
			     const AvahiAddress *address,
725
			     uint16_t port,
726
			     AVAHI_GCC_UNUSED AvahiStringList *txt,
727
			     AVAHI_GCC_UNUSED AvahiLookupResultFlags
728
			     flags,
729
			     void* userdata) {
24.1.9 by Björn Påhlsson
not working midwork...
730
  mandos_context *mc = userdata;
84 by Teddy Hogeborn
* Makefile (DOCBOOKTOMAN): Use the local manpages/docbook.xsl file, do
731
  assert(r);
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
732
  
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
733
  /* Called whenever a service has been resolved successfully or
734
     timed out */
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
735
  
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
736
  switch (event) {
737
  default:
738
  case AVAHI_RESOLVER_FAILURE:
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
739
    fprintf(stderr, "(Avahi Resolver) Failed to resolve service '%s'"
740
	    " of type '%s' in domain '%s': %s\n", name, type, domain,
24.1.9 by Björn Påhlsson
not working midwork...
741
	    avahi_strerror(avahi_server_errno(mc->server)));
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
742
    break;
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
743
    
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
744
  case AVAHI_RESOLVER_FOUND:
745
    {
746
      char ip[AVAHI_ADDRESS_STR_MAX];
747
      avahi_address_snprint(ip, sizeof(ip), address);
748
      if(debug){
60 by Teddy Hogeborn
* mandos-client.c (main): Cast pid_t to unsigned int before printing.
749
	fprintf(stderr, "Mandos server \"%s\" found on %s (%s, %"
750
		PRIu16 ") on port %d\n", name, host_name, ip,
751
		interface, port);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
752
      }
24.1.9 by Björn Påhlsson
not working midwork...
753
      int ret = start_mandos_communication(ip, port, interface, mc);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
754
      if (ret == 0){
24.1.46 by Björn Påhlsson
mandos-client
755
	avahi_simple_poll_quit(mc->simple_poll);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
756
      }
13 by Björn Påhlsson
Added following support:
757
    }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
758
  }
759
  avahi_s_service_resolver_free(r);
13 by Björn Påhlsson
Added following support:
760
}
761
24.1.9 by Björn Påhlsson
not working midwork...
762
static void browse_callback( AvahiSServiceBrowser *b,
763
			     AvahiIfIndex interface,
764
			     AvahiProtocol protocol,
765
			     AvahiBrowserEvent event,
766
			     const char *name,
767
			     const char *type,
768
			     const char *domain,
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
769
			     AVAHI_GCC_UNUSED AvahiLookupResultFlags
770
			     flags,
24.1.9 by Björn Påhlsson
not working midwork...
771
			     void* userdata) {
772
  mandos_context *mc = userdata;
84 by Teddy Hogeborn
* Makefile (DOCBOOKTOMAN): Use the local manpages/docbook.xsl file, do
773
  assert(b);
24.1.9 by Björn Påhlsson
not working midwork...
774
  
775
  /* Called whenever a new services becomes available on the LAN or
776
     is removed from the LAN */
777
  
778
  switch (event) {
779
  default:
780
  case AVAHI_BROWSER_FAILURE:
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
781
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
782
    fprintf(stderr, "(Avahi browser) %s\n",
24.1.9 by Björn Påhlsson
not working midwork...
783
	    avahi_strerror(avahi_server_errno(mc->server)));
784
    avahi_simple_poll_quit(mc->simple_poll);
785
    return;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
786
    
24.1.9 by Björn Påhlsson
not working midwork...
787
  case AVAHI_BROWSER_NEW:
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
788
    /* We ignore the returned Avahi resolver object. In the callback
789
       function we free it. If the Avahi server is terminated before
790
       the callback function is called the Avahi server will free the
791
       resolver for us. */
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
792
    
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
793
    if (!(avahi_s_service_resolver_new(mc->server, interface,
794
				       protocol, name, type, domain,
24.1.9 by Björn Påhlsson
not working midwork...
795
				       AVAHI_PROTO_INET6, 0,
796
				       resolve_callback, mc)))
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
797
      fprintf(stderr, "Avahi: Failed to resolve service '%s': %s\n",
798
	      name, avahi_strerror(avahi_server_errno(mc->server)));
24.1.9 by Björn Påhlsson
not working midwork...
799
    break;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
800
    
24.1.9 by Björn Påhlsson
not working midwork...
801
  case AVAHI_BROWSER_REMOVE:
802
    break;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
803
    
24.1.9 by Björn Påhlsson
not working midwork...
804
  case AVAHI_BROWSER_ALL_FOR_NOW:
805
  case AVAHI_BROWSER_CACHE_EXHAUSTED:
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
806
    if(debug){
807
      fprintf(stderr, "No Mandos server found, still searching...\n");
808
    }
24.1.9 by Björn Påhlsson
not working midwork...
809
    break;
810
  }
13 by Björn Påhlsson
Added following support:
811
}
812
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
813
int main(int argc, char *argv[]){
13 by Björn Påhlsson
Added following support:
814
    AvahiSServiceBrowser *sb = NULL;
815
    int error;
15.1.3 by Björn Påhlsson
Added getopt_long support for mandosclient and passprompt
816
    int ret;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
817
    int exitcode = EXIT_SUCCESS;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
818
    const char *interface = "eth0";
24.1.6 by Björn Påhlsson
plugbasedclient
819
    struct ifreq network;
820
    int sd;
24.1.13 by Björn Påhlsson
mandosclient
821
    uid_t uid;
822
    gid_t gid;
24.1.7 by Björn Påhlsson
merge
823
    char *connect_to = NULL;
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
824
    char tempdir[] = "/tmp/mandosXXXXXX";
29 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Changed
825
    AvahiIfIndex if_index = AVAHI_IF_UNSPEC;
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
826
    const char *seckey = PATHDIR "/" SECKEY;
827
    const char *pubkey = PATHDIR "/" PUBKEY;
828
    
24.1.9 by Björn Påhlsson
not working midwork...
829
    mandos_context mc = { .simple_poll = NULL, .server = NULL,
142 by Teddy Hogeborn
* plugins.d/password-request.c (main): Change default GnuTLS priority
830
			  .dh_bits = 1024, .priority = "SECURE256"
831
			  ":!CTYPE-X.509:+CTYPE-OPENPGP" };
24.1.20 by Björn Påhlsson
mandosclient
832
    bool gnutls_initalized = false;
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
833
    bool pgpme_initalized = false;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
834
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
835
    {
24.1.14 by Björn Påhlsson
mandosclient
836
      struct argp_option options[] = {
837
	{ .name = "debug", .key = 128,
838
	  .doc = "Debug mode", .group = 3 },
839
	{ .name = "connect", .key = 'c',
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
840
	  .arg = "ADDRESS:PORT",
841
	  .doc = "Connect directly to a specific Mandos server",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
842
	  .group = 1 },
24.1.14 by Björn Påhlsson
mandosclient
843
	{ .name = "interface", .key = 'i',
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
844
	  .arg = "NAME",
845
	  .doc = "Interface that will be used to search for Mandos"
846
	  " servers",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
847
	  .group = 1 },
24.1.14 by Björn Påhlsson
mandosclient
848
	{ .name = "seckey", .key = 's',
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
849
	  .arg = "FILE",
850
	  .doc = "OpenPGP secret key file base name",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
851
	  .group = 1 },
24.1.14 by Björn Påhlsson
mandosclient
852
	{ .name = "pubkey", .key = 'p',
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
853
	  .arg = "FILE",
854
	  .doc = "OpenPGP public key file base name",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
855
	  .group = 2 },
24.1.14 by Björn Påhlsson
mandosclient
856
	{ .name = "dh-bits", .key = 129,
857
	  .arg = "BITS",
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
858
	  .doc = "Bit length of the prime number used in the"
859
	  " Diffie-Hellman key exchange",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
860
	  .group = 2 },
24.1.14 by Björn Påhlsson
mandosclient
861
	{ .name = "priority", .key = 130,
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
862
	  .arg = "STRING",
863
	  .doc = "GnuTLS priority string for the TLS handshake",
864
	  .group = 1 },
24.1.14 by Björn Påhlsson
mandosclient
865
	{ .name = NULL }
866
      };
867
      
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
868
      error_t parse_opt (int key, char *arg,
869
			 struct argp_state *state) {
870
	/* Get the INPUT argument from `argp_parse', which we know is
871
	   a pointer to our plugin list pointer. */
24.1.14 by Björn Påhlsson
mandosclient
872
	switch (key) {
142 by Teddy Hogeborn
* plugins.d/password-request.c (main): Change default GnuTLS priority
873
	case 128:		/* --debug */
24.1.14 by Björn Påhlsson
mandosclient
874
	  debug = true;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
875
	  break;
142 by Teddy Hogeborn
* plugins.d/password-request.c (main): Change default GnuTLS priority
876
	case 'c':		/* --connect */
24.1.14 by Björn Påhlsson
mandosclient
877
	  connect_to = arg;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
878
	  break;
142 by Teddy Hogeborn
* plugins.d/password-request.c (main): Change default GnuTLS priority
879
	case 'i':		/* --interface */
24.1.14 by Björn Påhlsson
mandosclient
880
	  interface = arg;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
881
	  break;
142 by Teddy Hogeborn
* plugins.d/password-request.c (main): Change default GnuTLS priority
882
	case 's':		/* --seckey */
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
883
	  seckey = arg;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
884
	  break;
142 by Teddy Hogeborn
* plugins.d/password-request.c (main): Change default GnuTLS priority
885
	case 'p':		/* --pubkey */
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
886
	  pubkey = arg;
24.1.14 by Björn Påhlsson
mandosclient
887
	  break;
142 by Teddy Hogeborn
* plugins.d/password-request.c (main): Change default GnuTLS priority
888
	case 129:		/* --dh-bits */
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
889
	  errno = 0;
24.1.14 by Björn Påhlsson
mandosclient
890
	  mc.dh_bits = (unsigned int) strtol(arg, NULL, 10);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
891
	  if (errno){
892
	    perror("strtol");
893
	    exit(EXIT_FAILURE);
894
	  }
895
	  break;
142 by Teddy Hogeborn
* plugins.d/password-request.c (main): Change default GnuTLS priority
896
	case 130:		/* --priority */
24.1.14 by Björn Påhlsson
mandosclient
897
	  mc.priority = arg;
898
	  break;
899
	case ARGP_KEY_ARG:
900
	  argp_usage (state);
24.1.46 by Björn Påhlsson
mandos-client
901
	case ARGP_KEY_END:
24.1.14 by Björn Påhlsson
mandosclient
902
	  break;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
903
	default:
24.1.14 by Björn Påhlsson
mandosclient
904
	  return ARGP_ERR_UNKNOWN;
24.1.9 by Björn Påhlsson
not working midwork...
905
	}
24.1.14 by Björn Påhlsson
mandosclient
906
	return 0;
15.1.3 by Björn Påhlsson
Added getopt_long support for mandosclient and passprompt
907
      }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
908
      
24.1.14 by Björn Påhlsson
mandosclient
909
      struct argp argp = { .options = options, .parser = parse_opt,
910
			   .args_doc = "",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
911
			   .doc = "Mandos client -- Get and decrypt"
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
912
			   " passwords from a Mandos server" };
24.1.29 by Björn Påhlsson
Added more header file comments
913
      ret = argp_parse (&argp, argc, argv, 0, 0, NULL);
914
      if (ret == ARGP_ERR_UNKNOWN){
24.1.43 by Björn Påhlsson
merge
915
	fprintf(stderr, "Unknown error while parsing arguments\n");
24.1.29 by Björn Påhlsson
Added more header file comments
916
	exitcode = EXIT_FAILURE;
917
	goto end;
918
      }
15.1.3 by Björn Påhlsson
Added getopt_long support for mandosclient and passprompt
919
    }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
920
    
65 by Teddy Hogeborn
* plugins.d/password-request.c (main): Bug fix: Bring up network
921
    /* If the interface is down, bring it up */
922
    {
923
      sd = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP);
924
      if(sd < 0) {
925
	perror("socket");
926
	exitcode = EXIT_FAILURE;
927
	goto end;
928
      }
84 by Teddy Hogeborn
* Makefile (DOCBOOKTOMAN): Use the local manpages/docbook.xsl file, do
929
      strcpy(network.ifr_name, interface);
65 by Teddy Hogeborn
* plugins.d/password-request.c (main): Bug fix: Bring up network
930
      ret = ioctl(sd, SIOCGIFFLAGS, &network);
931
      if(ret == -1){
932
	perror("ioctl SIOCGIFFLAGS");
933
	exitcode = EXIT_FAILURE;
934
	goto end;
935
      }
936
      if((network.ifr_flags & IFF_UP) == 0){
937
	network.ifr_flags |= IFF_UP;
938
	ret = ioctl(sd, SIOCSIFFLAGS, &network);
939
	if(ret == -1){
940
	  perror("ioctl SIOCSIFFLAGS");
941
	  exitcode = EXIT_FAILURE;
942
	  goto end;
943
	}
944
      }
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
945
      ret = TEMP_FAILURE_RETRY(close(sd));
946
      if(ret == -1){
947
	perror("close");
948
      }
65 by Teddy Hogeborn
* plugins.d/password-request.c (main): Bug fix: Bring up network
949
    }
950
    
24.1.13 by Björn Påhlsson
mandosclient
951
    uid = getuid();
952
    gid = getgid();
65 by Teddy Hogeborn
* plugins.d/password-request.c (main): Bug fix: Bring up network
953
    
24.1.13 by Björn Påhlsson
mandosclient
954
    ret = setuid(uid);
955
    if (ret == -1){
956
      perror("setuid");
957
    }
958
    
959
    setgid(gid);
960
    if (ret == -1){
961
      perror("setgid");
962
    }
15.1.3 by Björn Påhlsson
Added getopt_long support for mandosclient and passprompt
963
    
167 by Teddy Hogeborn
* plugins.d/password-prompt.c (main): If successful, output an extra
964
    ret = init_gnutls_global(&mc, pubkey, seckey);
965
    if (ret == -1){
966
      fprintf(stderr, "init_gnutls_global failed\n");
967
      exitcode = EXIT_FAILURE;
968
      goto end;
969
    } else {
970
      gnutls_initalized = true;
971
    }
972
    
973
    if(mkdtemp(tempdir) == NULL){
974
      perror("mkdtemp");
975
      tempdir[0] = '\0';
976
      goto end;
977
    }
978
    
979
    if(not init_gpgme(&mc, pubkey, seckey, tempdir)){
980
      fprintf(stderr, "pgpme_initalized failed\n");
981
      exitcode = EXIT_FAILURE;
982
      goto end;
983
    } else {
984
      pgpme_initalized = true;
985
    }
986
    
24.1.7 by Björn Påhlsson
merge
987
    if_index = (AvahiIfIndex) if_nametoindex(interface);
988
    if(if_index == 0){
989
      fprintf(stderr, "No such interface: \"%s\"\n", interface);
990
      exit(EXIT_FAILURE);
28 by Teddy Hogeborn
* server.conf: New file.
991
    }
992
    
993
    if(connect_to != NULL){
994
      /* Connect directly, do not use Zeroconf */
995
      /* (Mainly meant for debugging) */
996
      char *address = strrchr(connect_to, ':');
997
      if(address == NULL){
998
        fprintf(stderr, "No colon in address\n");
24.1.13 by Björn Påhlsson
mandosclient
999
	exitcode = EXIT_FAILURE;
1000
	goto end;
28 by Teddy Hogeborn
* server.conf: New file.
1001
      }
1002
      errno = 0;
1003
      uint16_t port = (uint16_t) strtol(address+1, NULL, 10);
1004
      if(errno){
1005
	perror("Bad port number");
24.1.13 by Björn Påhlsson
mandosclient
1006
	exitcode = EXIT_FAILURE;
1007
	goto end;
28 by Teddy Hogeborn
* server.conf: New file.
1008
      }
1009
      *address = '\0';
1010
      address = connect_to;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
1011
      ret = start_mandos_communication(address, port, if_index, &mc);
28 by Teddy Hogeborn
* server.conf: New file.
1012
      if(ret < 0){
24.1.13 by Björn Påhlsson
mandosclient
1013
	exitcode = EXIT_FAILURE;
28 by Teddy Hogeborn
* server.conf: New file.
1014
      } else {
24.1.13 by Björn Påhlsson
mandosclient
1015
	exitcode = EXIT_SUCCESS;
28 by Teddy Hogeborn
* server.conf: New file.
1016
      }
24.1.13 by Björn Påhlsson
mandosclient
1017
      goto end;
28 by Teddy Hogeborn
* server.conf: New file.
1018
    }
1019
    
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
1020
    if (not debug){
1021
      avahi_set_log_function(empty_log);
1022
    }
13 by Björn Påhlsson
Added following support:
1023
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1024
    /* Initialize the pseudo-RNG for Avahi */
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1025
    srand((unsigned int) time(NULL));
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1026
    
1027
    /* Allocate main Avahi loop object */
1028
    mc.simple_poll = avahi_simple_poll_new();
1029
    if (mc.simple_poll == NULL) {
1030
        fprintf(stderr, "Avahi: Failed to create simple poll"
1031
		" object.\n");
1032
	exitcode = EXIT_FAILURE;
1033
        goto end;
1034
    }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
1035
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1036
    {
1037
      AvahiServerConfig config;
1038
      /* Do not publish any local Zeroconf records */
1039
      avahi_server_config_init(&config);
1040
      config.publish_hinfo = 0;
1041
      config.publish_addresses = 0;
1042
      config.publish_workstation = 0;
1043
      config.publish_domain = 0;
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
1044
      
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1045
      /* Allocate a new server */
1046
      mc.server = avahi_server_new(avahi_simple_poll_get
1047
				   (mc.simple_poll), &config, NULL,
1048
				   NULL, &error);
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
1049
      
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1050
      /* Free the Avahi configuration data */
1051
      avahi_server_config_free(&config);
1052
    }
1053
    
1054
    /* Check if creating the Avahi server object succeeded */
1055
    if (mc.server == NULL) {
1056
        fprintf(stderr, "Failed to create Avahi server: %s\n",
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1057
		avahi_strerror(error));
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1058
	exitcode = EXIT_FAILURE;
1059
        goto end;
13 by Björn Påhlsson
Added following support:
1060
    }
1061
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1062
    /* Create the Avahi service browser */
24.1.9 by Björn Påhlsson
not working midwork...
1063
    sb = avahi_s_service_browser_new(mc.server, if_index,
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1064
				     AVAHI_PROTO_INET6,
1065
				     "_mandos._tcp", NULL, 0,
24.1.9 by Björn Påhlsson
not working midwork...
1066
				     browse_callback, &mc);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1067
    if (sb == NULL) {
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1068
        fprintf(stderr, "Failed to create service browser: %s\n",
24.1.9 by Björn Påhlsson
not working midwork...
1069
		avahi_strerror(avahi_server_errno(mc.server)));
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1070
	exitcode = EXIT_FAILURE;
1071
        goto end;
13 by Björn Påhlsson
Added following support:
1072
    }
1073
    
1074
    /* Run the main loop */
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
1075
    
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
1076
    if (debug){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1077
      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
1078
    }
1079
    
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
1080
    avahi_simple_poll_loop(mc.simple_poll);
13 by Björn Påhlsson
Added following support:
1081
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1082
 end:
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
1083
    
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
1084
    if (debug){
1085
      fprintf(stderr, "%s exiting\n", argv[0]);
1086
    }
13 by Björn Påhlsson
Added following support:
1087
    
1088
    /* Cleanup things */
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1089
    if (sb != NULL)
13 by Björn Påhlsson
Added following support:
1090
        avahi_s_service_browser_free(sb);
1091
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1092
    if (mc.server != NULL)
24.1.9 by Björn Påhlsson
not working midwork...
1093
        avahi_server_free(mc.server);
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
1094
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1095
    if (mc.simple_poll != NULL)
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
1096
        avahi_simple_poll_free(mc.simple_poll);
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
1097
    
24.1.20 by Björn Påhlsson
mandosclient
1098
    if (gnutls_initalized){
24.1.29 by Björn Påhlsson
Added more header file comments
1099
      gnutls_certificate_free_credentials(mc.cred);
24.1.20 by Björn Påhlsson
mandosclient
1100
      gnutls_global_deinit ();
1101
    }
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
1102
    
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
1103
    if(pgpme_initalized){
1104
      gpgme_release(mc.ctx);
1105
    }
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
1106
    
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
1107
    /* Removes the temp directory used by GPGME */
1108
    if(tempdir[0] != '\0'){
1109
      DIR *d;
1110
      struct dirent *direntry;
1111
      d = opendir(tempdir);
1112
      if(d == NULL){
1113
	perror("opendir");
1114
      } else {
1115
	while(true){
1116
	  direntry = readdir(d);
1117
	  if(direntry == NULL){
1118
	    break;
1119
	  }
1120
	  if (direntry->d_type == DT_REG){
1121
	    char *fullname = NULL;
1122
	    ret = asprintf(&fullname, "%s/%s", tempdir,
1123
			   direntry->d_name);
1124
	    if(ret < 0){
1125
	      perror("asprintf");
1126
	      continue;
1127
	    }
1128
	    ret = unlink(fullname);
1129
	    if(ret == -1){
1130
	      fprintf(stderr, "unlink(\"%s\"): %s",
1131
		      fullname, strerror(errno));
1132
	    }
1133
	    free(fullname);
1134
	  }
1135
	}
1136
      }
1137
      ret = rmdir(tempdir);
1138
      if(ret == -1){
1139
	perror("rmdir");
1140
      }
1141
    }
1142
	  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1143
    return exitcode;
13 by Björn Påhlsson
Added following support:
1144
}