/mandos/release

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