/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1
/*  -*- coding: utf-8 -*- */
2
/*
261 by Teddy Hogeborn
* plugins.d/askpass-fifo.c: Fix name in header.
3
 * Mandos-client - get and decrypt data from a Mandos server
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
4
 *
5
 * This program is partly derived from an example program for an Avahi
6
 * service browser, downloaded from
7
 * <http://avahi.org/browser/examples/core-browse-services.c>.  This
8
 * includes the following functions: "resolve_callback",
9
 * "browse_callback", and parts of "main".
10
 * 
28 by Teddy Hogeborn
* server.conf: New file.
11
 * Everything else is
246 by Teddy Hogeborn
* README: Update copyright year; add "2009".
12
 * Copyright © 2008,2009 Teddy Hogeborn
13
 * Copyright © 2008,2009 Björn Påhlsson
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
14
 * 
15
 * This program is free software: you can redistribute it and/or
16
 * modify it under the terms of the GNU General Public License as
17
 * published by the Free Software Foundation, either version 3 of the
18
 * License, or (at your option) any later version.
19
 * 
20
 * This program is distributed in the hope that it will be useful, but
21
 * WITHOUT ANY WARRANTY; without even the implied warranty of
22
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23
 * General Public License for more details.
24
 * 
25
 * You should have received a copy of the GNU General Public License
26
 * along with this program.  If not, see
27
 * <http://www.gnu.org/licenses/>.
28
 * 
31 by Teddy Hogeborn
* plugins.d/plugbasedclient.c: Update include file comments.
29
 * Contact the authors at <mandos@fukt.bsnet.se>.
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
30
 */
31
28 by Teddy Hogeborn
* server.conf: New file.
32
/* Needed by GPGME, specifically gpgme_data_seek() */
13 by Björn Påhlsson
Added following support:
33
#define _LARGEFILE_SOURCE
34
#define _FILE_OFFSET_BITS 64
35
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
36
#define _GNU_SOURCE		/* TEMP_FAILURE_RETRY(), asprintf() */
24.1.10 by Björn Påhlsson
merge commit
37
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
38
#include <stdio.h>		/* fprintf(), stderr, fwrite(),
263 by Teddy Hogeborn
* README (The Plugin System): Removed redundant text about options and
39
				   stdout, ferror(), sscanf */
24.1.26 by Björn Påhlsson
tally count of used symbols
40
#include <stdint.h> 		/* uint16_t, uint32_t */
41
#include <stddef.h>		/* NULL, size_t, ssize_t */
24.1.29 by Björn Påhlsson
Added more header file comments
42
#include <stdlib.h> 		/* free(), EXIT_SUCCESS, EXIT_FAILURE,
43
				   srand() */
24.1.26 by Björn Påhlsson
tally count of used symbols
44
#include <stdbool.h>		/* bool, true */
24.1.29 by Björn Påhlsson
Added more header file comments
45
#include <string.h>		/* memset(), strcmp(), strlen(),
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
46
				   strerror(), asprintf(), strcpy() */
24.1.29 by Björn Påhlsson
Added more header file comments
47
#include <sys/ioctl.h>          /* ioctl */
24.1.26 by Björn Påhlsson
tally count of used symbols
48
#include <sys/types.h>		/* socket(), inet_pton(), sockaddr,
24.1.29 by Björn Påhlsson
Added more header file comments
49
				   sockaddr_in6, PF_INET6,
50
				   SOCK_STREAM, INET6_ADDRSTRLEN,
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
51
				   uid_t, gid_t, open(), opendir(),
52
				   DIR */
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
53
#include <sys/stat.h>		/* open() */
24.1.26 by Björn Påhlsson
tally count of used symbols
54
#include <sys/socket.h>		/* socket(), struct sockaddr_in6,
55
				   struct in6_addr, inet_pton(),
56
				   connect() */
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
57
#include <fcntl.h>		/* open() */
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
58
#include <dirent.h>		/* opendir(), struct dirent, readdir()
59
				 */
263 by Teddy Hogeborn
* README (The Plugin System): Removed redundant text about options and
60
#include <inttypes.h>		/* PRIu16, SCNu16 */
24.1.29 by Björn Påhlsson
Added more header file comments
61
#include <assert.h>		/* assert() */
62
#include <errno.h>		/* perror(), errno */
63
#include <time.h>		/* time() */
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
64
#include <net/if.h>		/* ioctl, ifreq, SIOCGIFFLAGS, IFF_UP,
24.1.26 by Björn Påhlsson
tally count of used symbols
65
				   SIOCSIFFLAGS, if_indextoname(),
66
				   if_nametoindex(), IF_NAMESIZE */
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
67
#include <netinet/in.h>
24.1.29 by Björn Påhlsson
Added more header file comments
68
#include <unistd.h>		/* close(), SEEK_SET, off_t, write(),
69
				   getuid(), getgid(), setuid(),
70
				   setgid() */
24.1.26 by Björn Påhlsson
tally count of used symbols
71
#include <arpa/inet.h>		/* inet_pton(), htons */
263 by Teddy Hogeborn
* README (The Plugin System): Removed redundant text about options and
72
#include <iso646.h>		/* not, and, or */
24.1.29 by Björn Påhlsson
Added more header file comments
73
#include <argp.h>		/* struct argp_option, error_t, struct
74
				   argp_state, struct argp,
75
				   argp_parse(), ARGP_KEY_ARG,
76
				   ARGP_KEY_END, ARGP_ERR_UNKNOWN */
24.1.26 by Björn Påhlsson
tally count of used symbols
77
78
/* Avahi */
24.1.29 by Björn Påhlsson
Added more header file comments
79
/* All Avahi types, constants and functions
80
 Avahi*, avahi_*,
81
 AVAHI_* */
82
#include <avahi-core/core.h>
24.1.26 by Björn Påhlsson
tally count of used symbols
83
#include <avahi-core/lookup.h>
24.1.29 by Björn Påhlsson
Added more header file comments
84
#include <avahi-core/log.h>
24.1.26 by Björn Påhlsson
tally count of used symbols
85
#include <avahi-common/simple-watch.h>
86
#include <avahi-common/malloc.h>
87
#include <avahi-common/error.h>
88
89
/* GnuTLS */
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
90
#include <gnutls/gnutls.h>	/* All GnuTLS types, constants and
91
				   functions:
24.1.29 by Björn Påhlsson
Added more header file comments
92
				   gnutls_*
24.1.26 by Björn Påhlsson
tally count of used symbols
93
				   init_gnutls_session(),
24.1.29 by Björn Påhlsson
Added more header file comments
94
				   GNUTLS_* */
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
95
#include <gnutls/openpgp.h>
96
			  /* gnutls_certificate_set_openpgp_key_file(),
24.1.29 by Björn Påhlsson
Added more header file comments
97
				   GNUTLS_OPENPGP_FMT_BASE64 */
24.1.26 by Björn Påhlsson
tally count of used symbols
98
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
99
/* GPGME */
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
100
#include <gpgme.h> 		/* All GPGME types, constants and
101
				   functions:
24.1.29 by Björn Påhlsson
Added more header file comments
102
				   gpgme_*
24.1.26 by Björn Påhlsson
tally count of used symbols
103
				   GPGME_PROTOCOL_OpenPGP,
24.1.29 by Björn Påhlsson
Added more header file comments
104
				   GPG_ERR_NO_* */
13 by Björn Påhlsson
Added following support:
105
106
#define BUFFER_SIZE 256
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
107
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
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";
217 by Teddy Hogeborn
* .bzrignore: Added "man" directory (created by "make install-html").
114
const char *argp_program_version = "mandos-client " VERSION;
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){
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
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);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
137
    if(buffer == NULL){
24.1.10 by Björn Påhlsson
merge commit
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
    
257.1.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
162
    fd = (int)TEMP_FAILURE_RETRY(open(filename, O_RDONLY));
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
163
    if(fd == -1){
164
      perror("open");
165
      return false;
166
    }
167
    
168
    rc = gpgme_data_new_from_fd(&pgp_data, fd);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
169
    if(rc != GPG_ERR_NO_ERROR){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
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);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
176
    if(rc != GPG_ERR_NO_ERROR){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
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
    
257.1.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
182
    ret = (int)TEMP_FAILURE_RETRY(close(fd));
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
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
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
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);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
197
  if(rc != GPG_ERR_NO_ERROR){
24.1.4 by Björn Påhlsson
Added optional parameters certdir, certkey and certfile that can be iven at start in the command line.
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 */
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
204
  rc = gpgme_get_engine_info(&engine_info);
205
  if(rc != GPG_ERR_NO_ERROR){
13 by Björn Påhlsson
Added following support:
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));
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
225
  if(rc != GPG_ERR_NO_ERROR){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
226
    fprintf(stderr, "bad gpgme_new: %s: %s\n",
227
	    gpgme_strsource(rc), gpgme_strerror(rc));
228
    return false;
229
  }
230
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
231
  if(not import_key(pubkey) or not import_key(seckey)){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
232
    return false;
233
  }
234
  
235
  return true; 
236
}
237
238
/* 
239
 * Decrypt OpenPGP data.
240
 * Returns -1 on error
241
 */
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
242
static ssize_t pgp_packet_decrypt(const mandos_context *mc,
243
				  const char *cryptotext,
244
				  size_t crypto_size,
245
				  char **plaintext){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
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
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
252
  if(debug){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
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);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
259
  if(rc != GPG_ERR_NO_ERROR){
13 by Björn Påhlsson
Added following support:
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);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
267
  if(rc != GPG_ERR_NO_ERROR){
13 by Björn Påhlsson
Added following support:
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);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
277
  if(rc != GPG_ERR_NO_ERROR){
13 by Björn Påhlsson
Added following support:
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;
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
281
    if(debug){
99 by Teddy Hogeborn
* mandos (fingerprint): Bug fix: Check crtverify.value, not crtverify.
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);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
284
      if(result == NULL){
99 by Teddy Hogeborn
* mandos (fingerprint): Bug fix: Check crtverify.value, not crtverify.
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 */
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
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);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
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 */
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
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
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
367
static const char * safer_gnutls_strerror(int value) {
368
  const char *ret = gnutls_strerror(value); /* Spurious warning */
369
  if(ret == NULL)
13 by Björn Påhlsson
Added following support:
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();
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
390
  if(ret != GNUTLS_E_SUCCESS) {
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
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
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);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
406
  if(ret != GNUTLS_E_SUCCESS){
407
    fprintf(stderr, "GnuTLS memory error: %s\n", /* Spurious
408
						    warning */
409
	    safer_gnutls_strerror(ret));
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);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
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);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
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);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
440
  if(ret != GNUTLS_E_SUCCESS) {
441
    fprintf(stderr, "Error in GnuTLS prime generation: %s\n",
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);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
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);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
471
    if(ret != GNUTLS_E_SUCCESS) {
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
472
      fprintf(stderr, "Syntax error at: %s\n", err);
473
      fprintf(stderr, "GnuTLS error: %s\n",
474
	      safer_gnutls_strerror(ret));
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
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);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
482
  if(ret != GNUTLS_E_SUCCESS) {
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
483
    fprintf(stderr, "Error setting GnuTLS credentials: %s\n",
13 by Björn Påhlsson
Added following support:
484
	    safer_gnutls_strerror(ret));
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
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. */
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
490
  gnutls_certificate_server_set_request(*session,
491
					GNUTLS_CERT_IGNORE);
13 by Björn Påhlsson
Added following support:
492
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
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;
257.1.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
507
  ssize_t sret;
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
508
  union { struct sockaddr in; struct sockaddr_in6 in6; } to;
13 by Björn Påhlsson
Added following support:
509
  char *buffer = NULL;
510
  char *decrypted_buffer;
511
  size_t buffer_length = 0;
512
  size_t buffer_capacity = 0;
513
  ssize_t decrypted_buffer_size;
24.1.10 by Björn Påhlsson
merge commit
514
  size_t written;
13 by Björn Påhlsson
Added following support:
515
  int retval = 0;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
516
  char interface[IF_NAMESIZE];
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
517
  gnutls_session_t session;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
518
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
519
  ret = init_gnutls_session(mc, &session);
520
  if(ret != 0){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
521
    return -1;
522
  }
523
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
524
  if(debug){
60 by Teddy Hogeborn
* mandos-client.c (main): Cast pid_t to unsigned int before printing.
525
    fprintf(stderr, "Setting up a tcp connection to %s, port %" PRIu16
526
	    "\n", ip, port);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
527
  }
13 by Björn Påhlsson
Added following support:
528
  
529
  tcp_sd = socket(PF_INET6, SOCK_STREAM, 0);
530
  if(tcp_sd < 0) {
531
    perror("socket");
532
    return -1;
533
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
534
  
24.1.6 by Björn Påhlsson
plugbasedclient
535
  if(debug){
24.1.7 by Björn Påhlsson
merge
536
    if(if_indextoname((unsigned int)if_index, interface) == NULL){
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
537
      perror("if_indextoname");
24.1.6 by Björn Påhlsson
plugbasedclient
538
      return -1;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
539
    }
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
540
    fprintf(stderr, "Binding to interface %s\n", interface);
541
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
542
  
84 by Teddy Hogeborn
* Makefile (DOCBOOKTOMAN): Use the local manpages/docbook.xsl file, do
543
  memset(&to, 0, sizeof(to));
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
544
  to.in6.sin6_family = AF_INET6;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
545
  /* It would be nice to have a way to detect if we were passed an
546
     IPv4 address here.   Now we assume an IPv6 address. */
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
547
  ret = inet_pton(AF_INET6, ip, &to.in6.sin6_addr);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
548
  if(ret < 0 ){
13 by Björn Påhlsson
Added following support:
549
    perror("inet_pton");
550
    return -1;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
551
  }
13 by Björn Påhlsson
Added following support:
552
  if(ret == 0){
553
    fprintf(stderr, "Bad address: %s\n", ip);
554
    return -1;
555
  }
65 by Teddy Hogeborn
* plugins.d/password-request.c (main): Bug fix: Bring up network
556
  to.in6.sin6_port = htons(port); /* Spurious warning */
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
557
  
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
558
  to.in6.sin6_scope_id = (uint32_t)if_index;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
559
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
560
  if(debug){
60 by Teddy Hogeborn
* mandos-client.c (main): Cast pid_t to unsigned int before printing.
561
    fprintf(stderr, "Connection to: %s, port %" PRIu16 "\n", ip,
562
	    port);
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
563
    char addrstr[INET6_ADDRSTRLEN] = "";
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
564
    if(inet_ntop(to.in6.sin6_family, &(to.in6.sin6_addr), addrstr,
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
565
		 sizeof(addrstr)) == NULL){
566
      perror("inet_ntop");
567
    } else {
568
      if(strcmp(addrstr, ip) != 0){
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
569
	fprintf(stderr, "Canonical address form: %s\n", addrstr);
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
570
      }
571
    }
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
572
  }
13 by Björn Påhlsson
Added following support:
573
  
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
574
  ret = connect(tcp_sd, &to.in, sizeof(to));
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
575
  if(ret < 0){
13 by Björn Påhlsson
Added following support:
576
    perror("connect");
577
    return -1;
578
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
579
  
24.1.12 by Björn Påhlsson
merge +
580
  const char *out = mandos_protocol_version;
24.1.10 by Björn Påhlsson
merge commit
581
  written = 0;
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
582
  while(true){
24.1.10 by Björn Påhlsson
merge commit
583
    size_t out_size = strlen(out);
257.1.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
584
    ret = (int)TEMP_FAILURE_RETRY(write(tcp_sd, out + written,
24.1.10 by Björn Påhlsson
merge commit
585
				   out_size - written));
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
586
    if(ret == -1){
24.1.10 by Björn Påhlsson
merge commit
587
      perror("write");
588
      retval = -1;
24.1.12 by Björn Påhlsson
merge +
589
      goto mandos_end;
24.1.10 by Björn Påhlsson
merge commit
590
    }
24.1.12 by Björn Påhlsson
merge +
591
    written += (size_t)ret;
24.1.10 by Björn Påhlsson
merge commit
592
    if(written < out_size){
593
      continue;
594
    } else {
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
595
      if(out == mandos_protocol_version){
24.1.10 by Björn Påhlsson
merge commit
596
	written = 0;
597
	out = "\r\n";
598
      } else {
599
	break;
600
      }
601
    }
602
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
603
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
604
  if(debug){
605
    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
606
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
607
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
608
  gnutls_transport_set_ptr(session, (gnutls_transport_ptr_t) tcp_sd);
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
609
  
24.1.29 by Björn Påhlsson
Added more header file comments
610
  do{
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
611
    ret = gnutls_handshake(session);
24.1.29 by Björn Påhlsson
Added more header file comments
612
  } while(ret == GNUTLS_E_AGAIN or ret == GNUTLS_E_INTERRUPTED);
13 by Björn Påhlsson
Added following support:
613
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
614
  if(ret != GNUTLS_E_SUCCESS){
25 by Teddy Hogeborn
* mandos-clients.conf ([DEFAULT]): New section.
615
    if(debug){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
616
      fprintf(stderr, "*** GnuTLS Handshake failed ***\n");
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
617
      gnutls_perror(ret);
25 by Teddy Hogeborn
* mandos-clients.conf ([DEFAULT]): New section.
618
    }
13 by Björn Påhlsson
Added following support:
619
    retval = -1;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
620
    goto mandos_end;
13 by Björn Påhlsson
Added following support:
621
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
622
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
623
  /* Read OpenPGP packet that contains the wanted password */
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
624
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
625
  if(debug){
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
626
    fprintf(stderr, "Retrieving pgp encrypted password from %s\n",
627
	    ip);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
628
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
629
  
13 by Björn Påhlsson
Added following support:
630
  while(true){
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
631
    buffer_capacity = adjustbuffer(&buffer, buffer_length,
632
				   buffer_capacity);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
633
    if(buffer_capacity == 0){
24.1.10 by Björn Påhlsson
merge commit
634
      perror("adjustbuffer");
635
      retval = -1;
24.1.12 by Björn Påhlsson
merge +
636
      goto mandos_end;
13 by Björn Påhlsson
Added following support:
637
    }
638
    
257.1.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
639
    sret = gnutls_record_recv(session, buffer+buffer_length,
640
			      BUFFER_SIZE);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
641
    if(sret == 0){
13 by Björn Påhlsson
Added following support:
642
      break;
643
    }
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
644
    if(sret < 0){
257.1.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
645
      switch(sret){
13 by Björn Påhlsson
Added following support:
646
      case GNUTLS_E_INTERRUPTED:
647
      case GNUTLS_E_AGAIN:
648
	break;
649
      case GNUTLS_E_REHANDSHAKE:
24.1.29 by Björn Påhlsson
Added more header file comments
650
	do{
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
651
	  ret = gnutls_handshake(session);
24.1.29 by Björn Påhlsson
Added more header file comments
652
	} while(ret == GNUTLS_E_AGAIN or ret == GNUTLS_E_INTERRUPTED);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
653
	if(ret < 0){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
654
	  fprintf(stderr, "*** GnuTLS Re-handshake failed ***\n");
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
655
	  gnutls_perror(ret);
13 by Björn Påhlsson
Added following support:
656
	  retval = -1;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
657
	  goto mandos_end;
13 by Björn Påhlsson
Added following support:
658
	}
659
	break;
660
      default:
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
661
	fprintf(stderr, "Unknown error while reading data from"
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
662
		" encrypted session with Mandos server\n");
13 by Björn Påhlsson
Added following support:
663
	retval = -1;
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
664
	gnutls_bye(session, GNUTLS_SHUT_RDWR);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
665
	goto mandos_end;
13 by Björn Påhlsson
Added following support:
666
      }
667
    } else {
257.1.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
668
      buffer_length += (size_t) sret;
13 by Björn Påhlsson
Added following support:
669
    }
670
  }
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
671
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
672
  if(debug){
673
    fprintf(stderr, "Closing TLS session\n");
674
  }
675
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
676
  gnutls_bye(session, GNUTLS_SHUT_RDWR);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
677
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
678
  if(buffer_length > 0){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
679
    decrypted_buffer_size = pgp_packet_decrypt(mc, buffer,
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
680
					       buffer_length,
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
681
					       &decrypted_buffer);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
682
    if(decrypted_buffer_size >= 0){
24.1.10 by Björn Påhlsson
merge commit
683
      written = 0;
28 by Teddy Hogeborn
* server.conf: New file.
684
      while(written < (size_t) decrypted_buffer_size){
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
685
	ret = (int)fwrite(decrypted_buffer + written, 1,
686
			  (size_t)decrypted_buffer_size - written,
687
			  stdout);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
688
	if(ret == 0 and ferror(stdout)){
689
	  if(debug){
690
	    fprintf(stderr, "Error writing encrypted data: %s\n",
691
		    strerror(errno));
692
	  }
693
	  retval = -1;
694
	  break;
695
	}
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
696
	written += (size_t)ret;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
697
      }
13 by Björn Påhlsson
Added following support:
698
      free(decrypted_buffer);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
699
    } else {
700
      retval = -1;
13 by Björn Påhlsson
Added following support:
701
    }
24.1.63 by Björn Påhlsson
merge + fallback bugg
702
  } else {
703
    retval = -1;
13 by Björn Påhlsson
Added following support:
704
  }
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
705
  
706
  /* Shutdown procedure */
707
  
708
 mandos_end:
13 by Björn Påhlsson
Added following support:
709
  free(buffer);
257.1.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
710
  ret = (int)TEMP_FAILURE_RETRY(close(tcp_sd));
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
711
  if(ret == -1){
712
    perror("close");
713
  }
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
714
  gnutls_deinit(session);
13 by Björn Påhlsson
Added following support:
715
  return retval;
716
}
717
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
718
static void resolve_callback(AvahiSServiceResolver *r,
719
			     AvahiIfIndex interface,
720
			     AVAHI_GCC_UNUSED AvahiProtocol protocol,
721
			     AvahiResolverEvent event,
722
			     const char *name,
723
			     const char *type,
724
			     const char *domain,
725
			     const char *host_name,
726
			     const AvahiAddress *address,
727
			     uint16_t port,
728
			     AVAHI_GCC_UNUSED AvahiStringList *txt,
729
			     AVAHI_GCC_UNUSED AvahiLookupResultFlags
730
			     flags,
731
			     void* userdata) {
24.1.9 by Björn Påhlsson
not working midwork...
732
  mandos_context *mc = userdata;
84 by Teddy Hogeborn
* Makefile (DOCBOOKTOMAN): Use the local manpages/docbook.xsl file, do
733
  assert(r);
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
734
  
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
735
  /* Called whenever a service has been resolved successfully or
736
     timed out */
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
737
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
738
  switch(event) {
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
739
  default:
740
  case AVAHI_RESOLVER_FAILURE:
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
741
    fprintf(stderr, "(Avahi Resolver) Failed to resolve service '%s'"
742
	    " of type '%s' in domain '%s': %s\n", name, type, domain,
24.1.9 by Björn Påhlsson
not working midwork...
743
	    avahi_strerror(avahi_server_errno(mc->server)));
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
744
    break;
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
745
    
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
746
  case AVAHI_RESOLVER_FOUND:
747
    {
748
      char ip[AVAHI_ADDRESS_STR_MAX];
749
      avahi_address_snprint(ip, sizeof(ip), address);
750
      if(debug){
60 by Teddy Hogeborn
* mandos-client.c (main): Cast pid_t to unsigned int before printing.
751
	fprintf(stderr, "Mandos server \"%s\" found on %s (%s, %"
752
		PRIu16 ") on port %d\n", name, host_name, ip,
753
		interface, port);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
754
      }
24.1.9 by Björn Påhlsson
not working midwork...
755
      int ret = start_mandos_communication(ip, port, interface, mc);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
756
      if(ret == 0){
24.1.46 by Björn Påhlsson
mandos-client
757
	avahi_simple_poll_quit(mc->simple_poll);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
758
      }
13 by Björn Påhlsson
Added following support:
759
    }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
760
  }
761
  avahi_s_service_resolver_free(r);
13 by Björn Påhlsson
Added following support:
762
}
763
24.1.9 by Björn Påhlsson
not working midwork...
764
static void browse_callback( AvahiSServiceBrowser *b,
765
			     AvahiIfIndex interface,
766
			     AvahiProtocol protocol,
767
			     AvahiBrowserEvent event,
768
			     const char *name,
769
			     const char *type,
770
			     const char *domain,
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
771
			     AVAHI_GCC_UNUSED AvahiLookupResultFlags
772
			     flags,
24.1.9 by Björn Påhlsson
not working midwork...
773
			     void* userdata) {
774
  mandos_context *mc = userdata;
84 by Teddy Hogeborn
* Makefile (DOCBOOKTOMAN): Use the local manpages/docbook.xsl file, do
775
  assert(b);
24.1.9 by Björn Påhlsson
not working midwork...
776
  
777
  /* Called whenever a new services becomes available on the LAN or
778
     is removed from the LAN */
779
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
780
  switch(event) {
24.1.9 by Björn Påhlsson
not working midwork...
781
  default:
782
  case AVAHI_BROWSER_FAILURE:
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
783
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
784
    fprintf(stderr, "(Avahi browser) %s\n",
24.1.9 by Björn Påhlsson
not working midwork...
785
	    avahi_strerror(avahi_server_errno(mc->server)));
786
    avahi_simple_poll_quit(mc->simple_poll);
787
    return;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
788
    
24.1.9 by Björn Påhlsson
not working midwork...
789
  case AVAHI_BROWSER_NEW:
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
790
    /* We ignore the returned Avahi resolver object. In the callback
791
       function we free it. If the Avahi server is terminated before
792
       the callback function is called the Avahi server will free the
793
       resolver for us. */
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
794
    
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
795
    if(!(avahi_s_service_resolver_new(mc->server, interface,
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
796
				       protocol, name, type, domain,
24.1.9 by Björn Påhlsson
not working midwork...
797
				       AVAHI_PROTO_INET6, 0,
798
				       resolve_callback, mc)))
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
799
      fprintf(stderr, "Avahi: Failed to resolve service '%s': %s\n",
800
	      name, avahi_strerror(avahi_server_errno(mc->server)));
24.1.9 by Björn Påhlsson
not working midwork...
801
    break;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
802
    
24.1.9 by Björn Påhlsson
not working midwork...
803
  case AVAHI_BROWSER_REMOVE:
804
    break;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
805
    
24.1.9 by Björn Påhlsson
not working midwork...
806
  case AVAHI_BROWSER_ALL_FOR_NOW:
807
  case AVAHI_BROWSER_CACHE_EXHAUSTED:
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
808
    if(debug){
809
      fprintf(stderr, "No Mandos server found, still searching...\n");
810
    }
24.1.9 by Björn Påhlsson
not working midwork...
811
    break;
812
  }
13 by Björn Påhlsson
Added following support:
813
}
814
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
815
int main(int argc, char *argv[]){
13 by Björn Påhlsson
Added following support:
816
    AvahiSServiceBrowser *sb = NULL;
817
    int error;
15.1.3 by Björn Påhlsson
Added getopt_long support for mandosclient and passprompt
818
    int ret;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
819
    int exitcode = EXIT_SUCCESS;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
820
    const char *interface = "eth0";
24.1.6 by Björn Påhlsson
plugbasedclient
821
    struct ifreq network;
822
    int sd;
24.1.13 by Björn Påhlsson
mandosclient
823
    uid_t uid;
824
    gid_t gid;
24.1.7 by Björn Påhlsson
merge
825
    char *connect_to = NULL;
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
826
    char tempdir[] = "/tmp/mandosXXXXXX";
29 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Changed
827
    AvahiIfIndex if_index = AVAHI_IF_UNSPEC;
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
828
    const char *seckey = PATHDIR "/" SECKEY;
829
    const char *pubkey = PATHDIR "/" PUBKEY;
830
    
24.1.9 by Björn Påhlsson
not working midwork...
831
    mandos_context mc = { .simple_poll = NULL, .server = NULL,
142 by Teddy Hogeborn
* plugins.d/password-request.c (main): Change default GnuTLS priority
832
			  .dh_bits = 1024, .priority = "SECURE256"
833
			  ":!CTYPE-X.509:+CTYPE-OPENPGP" };
24.1.20 by Björn Påhlsson
mandosclient
834
    bool gnutls_initalized = false;
24.1.92 by Björn Påhlsson
Several memory leaks detected by valgrind fixed
835
    bool gpgme_initalized = false;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
836
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
837
    {
24.1.14 by Björn Påhlsson
mandosclient
838
      struct argp_option options[] = {
839
	{ .name = "debug", .key = 128,
840
	  .doc = "Debug mode", .group = 3 },
841
	{ .name = "connect", .key = 'c',
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
842
	  .arg = "ADDRESS:PORT",
843
	  .doc = "Connect directly to a specific Mandos server",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
844
	  .group = 1 },
24.1.14 by Björn Påhlsson
mandosclient
845
	{ .name = "interface", .key = 'i',
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
846
	  .arg = "NAME",
847
	  .doc = "Interface that will be used to search for Mandos"
848
	  " servers",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
849
	  .group = 1 },
24.1.14 by Björn Påhlsson
mandosclient
850
	{ .name = "seckey", .key = 's',
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
851
	  .arg = "FILE",
852
	  .doc = "OpenPGP secret key file base name",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
853
	  .group = 1 },
24.1.14 by Björn Påhlsson
mandosclient
854
	{ .name = "pubkey", .key = 'p',
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
855
	  .arg = "FILE",
856
	  .doc = "OpenPGP public key file base name",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
857
	  .group = 2 },
24.1.14 by Björn Påhlsson
mandosclient
858
	{ .name = "dh-bits", .key = 129,
859
	  .arg = "BITS",
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
860
	  .doc = "Bit length of the prime number used in the"
861
	  " Diffie-Hellman key exchange",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
862
	  .group = 2 },
24.1.14 by Björn Påhlsson
mandosclient
863
	{ .name = "priority", .key = 130,
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
864
	  .arg = "STRING",
865
	  .doc = "GnuTLS priority string for the TLS handshake",
866
	  .group = 1 },
24.1.14 by Björn Påhlsson
mandosclient
867
	{ .name = NULL }
868
      };
869
      
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
870
      error_t parse_opt(int key, char *arg,
871
			struct argp_state *state) {
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 */
263 by Teddy Hogeborn
* README (The Plugin System): Removed redundant text about options and
889
	  ret = sscanf(arg, "%u", &mc.dh_bits);
264 by Teddy Hogeborn
* plugin-runner.c (main): Use "sscanf" instead of "strtol"; using the
890
	  if(ret != 1){
263 by Teddy Hogeborn
* README (The Plugin System): Removed redundant text about options and
891
	    fprintf(stderr, "Bad number of DH bits\n");
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
892
	    exit(EXIT_FAILURE);
893
	  }
894
	  break;
142 by Teddy Hogeborn
* plugins.d/password-request.c (main): Change default GnuTLS priority
895
	case 130:		/* --priority */
24.1.14 by Björn Påhlsson
mandosclient
896
	  mc.priority = arg;
897
	  break;
898
	case ARGP_KEY_ARG:
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
899
	  argp_usage(state);
24.1.46 by Björn Påhlsson
mandos-client
900
	case ARGP_KEY_END:
24.1.14 by Björn Påhlsson
mandosclient
901
	  break;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
902
	default:
24.1.14 by Björn Påhlsson
mandosclient
903
	  return ARGP_ERR_UNKNOWN;
24.1.9 by Björn Påhlsson
not working midwork...
904
	}
24.1.14 by Björn Påhlsson
mandosclient
905
	return 0;
15.1.3 by Björn Påhlsson
Added getopt_long support for mandosclient and passprompt
906
      }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
907
      
24.1.14 by Björn Påhlsson
mandosclient
908
      struct argp argp = { .options = options, .parser = parse_opt,
909
			   .args_doc = "",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
910
			   .doc = "Mandos client -- Get and decrypt"
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
911
			   " passwords from a Mandos server" };
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
912
      ret = argp_parse(&argp, argc, argv, 0, 0, NULL);
913
      if(ret == ARGP_ERR_UNKNOWN){
24.1.43 by Björn Påhlsson
merge
914
	fprintf(stderr, "Unknown error while parsing arguments\n");
24.1.29 by Björn Påhlsson
Added more header file comments
915
	exitcode = EXIT_FAILURE;
916
	goto end;
917
      }
15.1.3 by Björn Påhlsson
Added getopt_long support for mandosclient and passprompt
918
    }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
919
    
65 by Teddy Hogeborn
* plugins.d/password-request.c (main): Bug fix: Bring up network
920
    /* If the interface is down, bring it up */
921
    {
922
      sd = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP);
923
      if(sd < 0) {
924
	perror("socket");
925
	exitcode = EXIT_FAILURE;
926
	goto end;
927
      }
84 by Teddy Hogeborn
* Makefile (DOCBOOKTOMAN): Use the local manpages/docbook.xsl file, do
928
      strcpy(network.ifr_name, interface);
65 by Teddy Hogeborn
* plugins.d/password-request.c (main): Bug fix: Bring up network
929
      ret = ioctl(sd, SIOCGIFFLAGS, &network);
930
      if(ret == -1){
931
	perror("ioctl SIOCGIFFLAGS");
932
	exitcode = EXIT_FAILURE;
933
	goto end;
934
      }
935
      if((network.ifr_flags & IFF_UP) == 0){
936
	network.ifr_flags |= IFF_UP;
937
	ret = ioctl(sd, SIOCSIFFLAGS, &network);
938
	if(ret == -1){
939
	  perror("ioctl SIOCSIFFLAGS");
940
	  exitcode = EXIT_FAILURE;
941
	  goto end;
942
	}
943
      }
257.1.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
944
      ret = (int)TEMP_FAILURE_RETRY(close(sd));
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
945
      if(ret == -1){
946
	perror("close");
947
      }
65 by Teddy Hogeborn
* plugins.d/password-request.c (main): Bug fix: Bring up network
948
    }
949
    
24.1.13 by Björn Påhlsson
mandosclient
950
    uid = getuid();
951
    gid = getgid();
65 by Teddy Hogeborn
* plugins.d/password-request.c (main): Bug fix: Bring up network
952
    
24.1.13 by Björn Påhlsson
mandosclient
953
    ret = setuid(uid);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
954
    if(ret == -1){
24.1.13 by Björn Påhlsson
mandosclient
955
      perror("setuid");
956
    }
957
    
958
    setgid(gid);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
959
    if(ret == -1){
24.1.13 by Björn Påhlsson
mandosclient
960
      perror("setgid");
961
    }
15.1.3 by Björn Påhlsson
Added getopt_long support for mandosclient and passprompt
962
    
167 by Teddy Hogeborn
* plugins.d/password-prompt.c (main): If successful, output an extra
963
    ret = init_gnutls_global(&mc, pubkey, seckey);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
964
    if(ret == -1){
167 by Teddy Hogeborn
* plugins.d/password-prompt.c (main): If successful, output an extra
965
      fprintf(stderr, "init_gnutls_global failed\n");
966
      exitcode = EXIT_FAILURE;
967
      goto end;
968
    } else {
969
      gnutls_initalized = true;
970
    }
971
    
972
    if(mkdtemp(tempdir) == NULL){
973
      perror("mkdtemp");
974
      tempdir[0] = '\0';
975
      goto end;
976
    }
977
    
978
    if(not init_gpgme(&mc, pubkey, seckey, tempdir)){
176 by Teddy Hogeborn
Merge & resolve.
979
      fprintf(stderr, "gpgme_initalized failed\n");
167 by Teddy Hogeborn
* plugins.d/password-prompt.c (main): If successful, output an extra
980
      exitcode = EXIT_FAILURE;
981
      goto end;
982
    } else {
176 by Teddy Hogeborn
Merge & resolve.
983
      gpgme_initalized = true;
167 by Teddy Hogeborn
* plugins.d/password-prompt.c (main): If successful, output an extra
984
    }
985
    
24.1.7 by Björn Påhlsson
merge
986
    if_index = (AvahiIfIndex) if_nametoindex(interface);
987
    if(if_index == 0){
988
      fprintf(stderr, "No such interface: \"%s\"\n", interface);
989
      exit(EXIT_FAILURE);
28 by Teddy Hogeborn
* server.conf: New file.
990
    }
991
    
992
    if(connect_to != NULL){
993
      /* Connect directly, do not use Zeroconf */
994
      /* (Mainly meant for debugging) */
995
      char *address = strrchr(connect_to, ':');
996
      if(address == NULL){
997
        fprintf(stderr, "No colon in address\n");
24.1.13 by Björn Påhlsson
mandosclient
998
	exitcode = EXIT_FAILURE;
999
	goto end;
28 by Teddy Hogeborn
* server.conf: New file.
1000
      }
263 by Teddy Hogeborn
* README (The Plugin System): Removed redundant text about options and
1001
      uint16_t port;
1002
      ret = sscanf(address+1, "%" SCNu16, &port);
264 by Teddy Hogeborn
* plugin-runner.c (main): Use "sscanf" instead of "strtol"; using the
1003
      if(ret != 1){
263 by Teddy Hogeborn
* README (The Plugin System): Removed redundant text about options and
1004
	fprintf(stderr, "Bad port number\n");
24.1.13 by Björn Påhlsson
mandosclient
1005
	exitcode = EXIT_FAILURE;
1006
	goto end;
28 by Teddy Hogeborn
* server.conf: New file.
1007
      }
1008
      *address = '\0';
1009
      address = connect_to;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
1010
      ret = start_mandos_communication(address, port, if_index, &mc);
28 by Teddy Hogeborn
* server.conf: New file.
1011
      if(ret < 0){
24.1.13 by Björn Påhlsson
mandosclient
1012
	exitcode = EXIT_FAILURE;
28 by Teddy Hogeborn
* server.conf: New file.
1013
      } else {
24.1.13 by Björn Påhlsson
mandosclient
1014
	exitcode = EXIT_SUCCESS;
28 by Teddy Hogeborn
* server.conf: New file.
1015
      }
24.1.13 by Björn Påhlsson
mandosclient
1016
      goto end;
28 by Teddy Hogeborn
* server.conf: New file.
1017
    }
1018
    
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
1019
    if(not debug){
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
1020
      avahi_set_log_function(empty_log);
1021
    }
13 by Björn Påhlsson
Added following support:
1022
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1023
    /* Initialize the pseudo-RNG for Avahi */
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1024
    srand((unsigned int) time(NULL));
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1025
    
1026
    /* Allocate main Avahi loop object */
1027
    mc.simple_poll = avahi_simple_poll_new();
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
1028
    if(mc.simple_poll == NULL) {
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1029
        fprintf(stderr, "Avahi: Failed to create simple poll"
1030
		" object.\n");
1031
	exitcode = EXIT_FAILURE;
1032
        goto end;
1033
    }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
1034
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1035
    {
1036
      AvahiServerConfig config;
1037
      /* Do not publish any local Zeroconf records */
1038
      avahi_server_config_init(&config);
1039
      config.publish_hinfo = 0;
1040
      config.publish_addresses = 0;
1041
      config.publish_workstation = 0;
1042
      config.publish_domain = 0;
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
1043
      
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1044
      /* Allocate a new server */
1045
      mc.server = avahi_server_new(avahi_simple_poll_get
1046
				   (mc.simple_poll), &config, NULL,
1047
				   NULL, &error);
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
1048
      
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1049
      /* Free the Avahi configuration data */
1050
      avahi_server_config_free(&config);
1051
    }
1052
    
1053
    /* Check if creating the Avahi server object succeeded */
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
1054
    if(mc.server == NULL) {
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1055
        fprintf(stderr, "Failed to create Avahi server: %s\n",
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1056
		avahi_strerror(error));
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1057
	exitcode = EXIT_FAILURE;
1058
        goto end;
13 by Björn Påhlsson
Added following support:
1059
    }
1060
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1061
    /* Create the Avahi service browser */
24.1.9 by Björn Påhlsson
not working midwork...
1062
    sb = avahi_s_service_browser_new(mc.server, if_index,
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1063
				     AVAHI_PROTO_INET6,
1064
				     "_mandos._tcp", NULL, 0,
24.1.9 by Björn Påhlsson
not working midwork...
1065
				     browse_callback, &mc);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
1066
    if(sb == NULL) {
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1067
        fprintf(stderr, "Failed to create service browser: %s\n",
24.1.9 by Björn Påhlsson
not working midwork...
1068
		avahi_strerror(avahi_server_errno(mc.server)));
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1069
	exitcode = EXIT_FAILURE;
1070
        goto end;
13 by Björn Påhlsson
Added following support:
1071
    }
1072
    
1073
    /* Run the main loop */
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
1074
    
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
1075
    if(debug){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1076
      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
1077
    }
1078
    
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
1079
    avahi_simple_poll_loop(mc.simple_poll);
13 by Björn Påhlsson
Added following support:
1080
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1081
 end:
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
1082
    
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
1083
    if(debug){
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
1084
      fprintf(stderr, "%s exiting\n", argv[0]);
1085
    }
13 by Björn Påhlsson
Added following support:
1086
    
1087
    /* Cleanup things */
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
1088
    if(sb != NULL)
13 by Björn Påhlsson
Added following support:
1089
        avahi_s_service_browser_free(sb);
1090
    
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
1091
    if(mc.server != NULL)
24.1.9 by Björn Påhlsson
not working midwork...
1092
        avahi_server_free(mc.server);
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
1093
    
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
1094
    if(mc.simple_poll != NULL)
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
1095
        avahi_simple_poll_free(mc.simple_poll);
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
1096
    
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
1097
    if(gnutls_initalized){
24.1.29 by Björn Påhlsson
Added more header file comments
1098
      gnutls_certificate_free_credentials(mc.cred);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
1099
      gnutls_global_deinit();
24.1.92 by Björn Påhlsson
Several memory leaks detected by valgrind fixed
1100
      gnutls_dh_params_deinit(mc.dh_params);
24.1.20 by Björn Påhlsson
mandosclient
1101
    }
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
1102
    
24.1.92 by Björn Påhlsson
Several memory leaks detected by valgrind fixed
1103
    if(gpgme_initalized){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
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){
263 by Teddy Hogeborn
* README (The Plugin System): Removed redundant text about options and
1113
	if(errno != ENOENT){
1114
	  perror("opendir");
1115
	}
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
1116
      } else {
1117
	while(true){
1118
	  direntry = readdir(d);
1119
	  if(direntry == NULL){
1120
	    break;
1121
	  }
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
1122
	  if(direntry->d_type == DT_REG){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
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);
263 by Teddy Hogeborn
* README (The Plugin System): Removed redundant text about options and
1141
      if(ret == -1 and errno != ENOENT){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
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
}