/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(),
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
74
				   getuid(), getgid(), seteuid(),
24.1.29 by Björn Påhlsson
Added more header file comments
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){
13 by Björn Påhlsson
Added following support:
167
  gpgme_error_t rc;
168
  gpgme_engine_info_t engine_info;
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
169
  
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
170
  
171
  /*
237.2.51 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Use separate bool variable instead
172
   * 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.
173
   */
174
  bool import_key(const char *filename){
237.2.124 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gpgme): Move variable "ret" into the
175
    int ret;
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
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 */
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
477
  do {
478
    ret = gnutls_init(session, GNUTLS_SERVER);
479
  } while(ret == GNUTLS_E_INTERRUPTED or ret == GNUTLS_E_AGAIN);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
480
  if(ret != GNUTLS_E_SUCCESS){
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
481
    fprintf(stderr, "Error in GnuTLS session initialization: %s\n",
13 by Björn Påhlsson
Added following support:
482
	    safer_gnutls_strerror(ret));
483
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
484
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
485
  {
486
    const char *err;
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
487
    do {
488
      ret = gnutls_priority_set_direct(*session, mc.priority, &err);
489
    } while(ret == GNUTLS_E_INTERRUPTED or ret == GNUTLS_E_AGAIN);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
490
    if(ret != GNUTLS_E_SUCCESS){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
491
      fprintf(stderr, "Syntax error at: %s\n", err);
492
      fprintf(stderr, "GnuTLS error: %s\n",
493
	      safer_gnutls_strerror(ret));
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
494
      gnutls_deinit(*session);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
495
      return -1;
496
    }
13 by Björn Påhlsson
Added following support:
497
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
498
  
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
499
  do {
500
    ret = gnutls_credentials_set(*session, GNUTLS_CRD_CERTIFICATE,
501
				 mc.cred);
502
  } while(ret == GNUTLS_E_INTERRUPTED or ret == GNUTLS_E_AGAIN);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
503
  if(ret != GNUTLS_E_SUCCESS){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
504
    fprintf(stderr, "Error setting GnuTLS credentials: %s\n",
13 by Björn Påhlsson
Added following support:
505
	    safer_gnutls_strerror(ret));
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
506
    gnutls_deinit(*session);
13 by Björn Påhlsson
Added following support:
507
    return -1;
508
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
509
  
13 by Björn Påhlsson
Added following support:
510
  /* ignore client certificate if any. */
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
511
  gnutls_certificate_server_set_request(*session, GNUTLS_CERT_IGNORE);
13 by Björn Påhlsson
Added following support:
512
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
513
  gnutls_dh_set_prime_bits(*session, mc.dh_bits);
13 by Björn Påhlsson
Added following support:
514
  
515
  return 0;
516
}
517
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
518
/* Avahi log function callback */
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
519
static void empty_log(__attribute__((unused)) AvahiLogLevel level,
520
		      __attribute__((unused)) const char *txt){}
13 by Björn Påhlsson
Added following support:
521
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
522
sig_atomic_t quit_now = 0;
523
int signal_received = 0;
524
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
525
/* Called when a Mandos server is found */
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
526
static int start_mandos_communication(const char *ip, uint16_t port,
24.1.9 by Björn Påhlsson
not working midwork...
527
				      AvahiIfIndex if_index,
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
528
				      int af){
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
529
  int ret, tcp_sd = -1;
237.3.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
530
  ssize_t sret;
237.2.67 by Teddy Hogeborn
Four new interrelated features:
531
  union {
532
    struct sockaddr_in in;
533
    struct sockaddr_in6 in6;
534
  } to;
13 by Björn Påhlsson
Added following support:
535
  char *buffer = NULL;
536
  char *decrypted_buffer;
537
  size_t buffer_length = 0;
538
  size_t buffer_capacity = 0;
24.1.10 by Björn Påhlsson
merge commit
539
  size_t written;
13 by Björn Påhlsson
Added following support:
540
  int retval = 0;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
541
  gnutls_session_t session;
237.2.67 by Teddy Hogeborn
Four new interrelated features:
542
  int pf;			/* Protocol family */
543
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
544
  if(quit_now){
545
    return -1;
546
  }
547
  
237.2.67 by Teddy Hogeborn
Four new interrelated features:
548
  switch(af){
549
  case AF_INET6:
550
    pf = PF_INET6;
551
    break;
552
  case AF_INET:
553
    pf = PF_INET;
554
    break;
555
  default:
556
    fprintf(stderr, "Bad address family: %d\n", af);
557
    return -1;
558
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
559
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
560
  ret = init_gnutls_session(&session);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
561
  if(ret != 0){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
562
    return -1;
563
  }
564
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
565
  if(debug){
237.2.67 by Teddy Hogeborn
Four new interrelated features:
566
    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.
567
	    "\n", ip, port);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
568
  }
13 by Björn Påhlsson
Added following support:
569
  
237.2.67 by Teddy Hogeborn
Four new interrelated features:
570
  tcp_sd = socket(pf, SOCK_STREAM, 0);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
571
  if(tcp_sd < 0){
13 by Björn Påhlsson
Added following support:
572
    perror("socket");
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
573
    retval = -1;
574
    goto mandos_end;
575
  }
576
  
577
  if(quit_now){
578
    goto mandos_end;
13 by Björn Påhlsson
Added following support:
579
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
580
  
84 by Teddy Hogeborn
* Makefile (DOCBOOKTOMAN): Use the local manpages/docbook.xsl file, do
581
  memset(&to, 0, sizeof(to));
237.2.67 by Teddy Hogeborn
Four new interrelated features:
582
  if(af == AF_INET6){
237.2.88 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): "sin6_family"
583
    to.in6.sin6_family = (sa_family_t)af;
237.2.67 by Teddy Hogeborn
Four new interrelated features:
584
    ret = inet_pton(af, ip, &to.in6.sin6_addr);
585
  } else {			/* IPv4 */
586
    to.in.sin_family = (sa_family_t)af;
587
    ret = inet_pton(af, ip, &to.in.sin_addr);
588
  }
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
589
  if(ret < 0 ){
13 by Björn Påhlsson
Added following support:
590
    perror("inet_pton");
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
591
    retval = -1;
592
    goto mandos_end;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
593
  }
13 by Björn Påhlsson
Added following support:
594
  if(ret == 0){
595
    fprintf(stderr, "Bad address: %s\n", ip);
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
596
    retval = -1;
597
    goto mandos_end;
13 by Björn Påhlsson
Added following support:
598
  }
237.2.67 by Teddy Hogeborn
Four new interrelated features:
599
  if(af == AF_INET6){
600
    to.in6.sin6_port = htons(port); /* Spurious warnings from
601
				       -Wconversion and
602
				       -Wunreachable-code */
603
    
604
    if(IN6_IS_ADDR_LINKLOCAL /* Spurious warnings from */
605
       (&to.in6.sin6_addr)){ /* -Wstrict-aliasing=2 or lower and
606
			      -Wunreachable-code*/
607
      if(if_index == AVAHI_IF_UNSPEC){
608
	fprintf(stderr, "An IPv6 link-local address is incomplete"
609
		" without a network interface\n");
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
610
	retval = -1;
611
	goto mandos_end;
237.2.67 by Teddy Hogeborn
Four new interrelated features:
612
      }
613
      /* Set the network interface number as scope */
614
      to.in6.sin6_scope_id = (uint32_t)if_index;
615
    }
616
  } else {
617
    to.in.sin_port = htons(port); /* Spurious warnings from
237.2.30 by Teddy Hogeborn
* plugins.d/mandos-client.c: Only comment changes.
618
				     -Wconversion and
619
				     -Wunreachable-code */
237.2.67 by Teddy Hogeborn
Four new interrelated features:
620
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
621
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
622
  if(quit_now){
623
    goto mandos_end;
624
  }
625
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
626
  if(debug){
237.2.67 by Teddy Hogeborn
Four new interrelated features:
627
    if(af == AF_INET6 and if_index != AVAHI_IF_UNSPEC){
628
      char interface[IF_NAMESIZE];
629
      if(if_indextoname((unsigned int)if_index, interface) == NULL){
630
	perror("if_indextoname");
631
      } else {
632
	fprintf(stderr, "Connection to: %s%%%s, port %" PRIu16 "\n",
633
		ip, interface, port);
634
      }
635
    } else {
636
      fprintf(stderr, "Connection to: %s, port %" PRIu16 "\n", ip,
637
	      port);
638
    }
639
    char addrstr[(INET_ADDRSTRLEN > INET6_ADDRSTRLEN) ?
640
		 INET_ADDRSTRLEN : INET6_ADDRSTRLEN] = "";
641
    const char *pcret;
642
    if(af == AF_INET6){
643
      pcret = inet_ntop(af, &(to.in6.sin6_addr), addrstr,
644
			sizeof(addrstr));
645
    } else {
646
      pcret = inet_ntop(af, &(to.in.sin_addr), addrstr,
647
			sizeof(addrstr));
648
    }
649
    if(pcret == NULL){
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
650
      perror("inet_ntop");
651
    } else {
652
      if(strcmp(addrstr, ip) != 0){
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
653
	fprintf(stderr, "Canonical address form: %s\n", addrstr);
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
654
      }
655
    }
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
656
  }
13 by Björn Påhlsson
Added following support:
657
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
658
  if(quit_now){
659
    goto mandos_end;
660
  }
661
  
237.2.67 by Teddy Hogeborn
Four new interrelated features:
662
  if(af == AF_INET6){
663
    ret = connect(tcp_sd, &to.in6, sizeof(to));
664
  } else {
665
    ret = connect(tcp_sd, &to.in, sizeof(to)); /* IPv4 */
666
  }
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
667
  if(ret < 0){
13 by Björn Påhlsson
Added following support:
668
    perror("connect");
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
669
    retval = -1;
670
    goto mandos_end;
671
  }
672
  
673
  if(quit_now){
674
    goto mandos_end;
13 by Björn Påhlsson
Added following support:
675
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
676
  
24.1.12 by Björn Påhlsson
merge +
677
  const char *out = mandos_protocol_version;
24.1.10 by Björn Påhlsson
merge commit
678
  written = 0;
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
679
  while(true){
24.1.10 by Björn Påhlsson
merge commit
680
    size_t out_size = strlen(out);
237.3.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
681
    ret = (int)TEMP_FAILURE_RETRY(write(tcp_sd, out + written,
24.1.10 by Björn Påhlsson
merge commit
682
				   out_size - written));
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
683
    if(ret == -1){
24.1.10 by Björn Påhlsson
merge commit
684
      perror("write");
685
      retval = -1;
24.1.12 by Björn Påhlsson
merge +
686
      goto mandos_end;
24.1.10 by Björn Påhlsson
merge commit
687
    }
24.1.12 by Björn Påhlsson
merge +
688
    written += (size_t)ret;
24.1.10 by Björn Påhlsson
merge commit
689
    if(written < out_size){
690
      continue;
691
    } else {
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
692
      if(out == mandos_protocol_version){
24.1.10 by Björn Påhlsson
merge commit
693
	written = 0;
694
	out = "\r\n";
695
      } else {
696
	break;
697
      }
698
    }
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
699
  
700
    if(quit_now){
701
      goto mandos_end;
702
    }
24.1.10 by Björn Påhlsson
merge commit
703
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
704
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
705
  if(debug){
706
    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
707
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
708
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
709
  if(quit_now){
710
    goto mandos_end;
711
  }
712
  
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
713
  gnutls_transport_set_ptr(session, (gnutls_transport_ptr_t) tcp_sd);
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
714
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
715
  if(quit_now){
716
    goto mandos_end;
717
  }
718
  
237.2.126 by Teddy Hogeborn
* plugin-runner.c: Minor stylistic changes.
719
  do {
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
720
    ret = gnutls_handshake(session);
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
721
    if(quit_now){
722
      goto mandos_end;
723
    }
24.1.29 by Björn Påhlsson
Added more header file comments
724
  } while(ret == GNUTLS_E_AGAIN or ret == GNUTLS_E_INTERRUPTED);
13 by Björn Påhlsson
Added following support:
725
  
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
726
  if(ret != GNUTLS_E_SUCCESS){
25 by Teddy Hogeborn
* mandos-clients.conf ([DEFAULT]): New section.
727
    if(debug){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
728
      fprintf(stderr, "*** GnuTLS Handshake failed ***\n");
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
729
      gnutls_perror(ret);
25 by Teddy Hogeborn
* mandos-clients.conf ([DEFAULT]): New section.
730
    }
13 by Björn Påhlsson
Added following support:
731
    retval = -1;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
732
    goto mandos_end;
13 by Björn Påhlsson
Added following support:
733
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
734
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
735
  /* Read OpenPGP packet that contains the wanted password */
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
736
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
737
  if(debug){
237.2.67 by Teddy Hogeborn
Four new interrelated features:
738
    fprintf(stderr, "Retrieving OpenPGP encrypted password from %s\n",
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
739
	    ip);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
740
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
741
  
13 by Björn Påhlsson
Added following support:
742
  while(true){
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
743
    
744
    if(quit_now){
745
      goto mandos_end;
746
    }
747
    
24.1.132 by Björn Påhlsson
Fixed a bug in fallback handling
748
    buffer_capacity = incbuffer(&buffer, buffer_length,
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
749
				   buffer_capacity);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
750
    if(buffer_capacity == 0){
24.1.132 by Björn Påhlsson
Fixed a bug in fallback handling
751
      perror("incbuffer");
24.1.10 by Björn Påhlsson
merge commit
752
      retval = -1;
24.1.12 by Björn Påhlsson
merge +
753
      goto mandos_end;
13 by Björn Påhlsson
Added following support:
754
    }
755
    
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
756
    if(quit_now){
757
      goto mandos_end;
758
    }
759
    
237.3.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
760
    sret = gnutls_record_recv(session, buffer+buffer_length,
761
			      BUFFER_SIZE);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
762
    if(sret == 0){
13 by Björn Påhlsson
Added following support:
763
      break;
764
    }
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
765
    if(sret < 0){
237.3.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
766
      switch(sret){
13 by Björn Påhlsson
Added following support:
767
      case GNUTLS_E_INTERRUPTED:
768
      case GNUTLS_E_AGAIN:
769
	break;
770
      case GNUTLS_E_REHANDSHAKE:
237.2.126 by Teddy Hogeborn
* plugin-runner.c: Minor stylistic changes.
771
	do {
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
772
	  ret = gnutls_handshake(session);
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
773
	  
774
	  if(quit_now){
775
	    goto mandos_end;
776
	  }
24.1.29 by Björn Påhlsson
Added more header file comments
777
	} while(ret == GNUTLS_E_AGAIN or ret == GNUTLS_E_INTERRUPTED);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
778
	if(ret < 0){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
779
	  fprintf(stderr, "*** GnuTLS Re-handshake failed ***\n");
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
780
	  gnutls_perror(ret);
13 by Björn Påhlsson
Added following support:
781
	  retval = -1;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
782
	  goto mandos_end;
13 by Björn Påhlsson
Added following support:
783
	}
784
	break;
785
      default:
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
786
	fprintf(stderr, "Unknown error while reading data from"
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
787
		" encrypted session with Mandos server\n");
13 by Björn Påhlsson
Added following support:
788
	retval = -1;
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
789
	gnutls_bye(session, GNUTLS_SHUT_RDWR);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
790
	goto mandos_end;
13 by Björn Påhlsson
Added following support:
791
      }
792
    } else {
237.3.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
793
      buffer_length += (size_t) sret;
13 by Björn Påhlsson
Added following support:
794
    }
795
  }
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
796
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
797
  if(debug){
798
    fprintf(stderr, "Closing TLS session\n");
799
  }
800
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
801
  if(quit_now){
802
    goto mandos_end;
803
  }
804
  
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
805
  gnutls_bye(session, GNUTLS_SHUT_RDWR);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
806
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
807
  if(quit_now){
808
    goto mandos_end;
809
  }
810
  
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
811
  if(buffer_length > 0){
237.2.125 by Teddy Hogeborn
* plugin-runner.c (getplugin, add_environment, main): Handle EINTR
812
    ssize_t decrypted_buffer_size;
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
813
    decrypted_buffer_size = pgp_packet_decrypt(buffer,
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
814
					       buffer_length,
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
815
					       &decrypted_buffer);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
816
    if(decrypted_buffer_size >= 0){
237.2.124 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gpgme): Move variable "ret" into the
817
      
24.1.10 by Björn Påhlsson
merge commit
818
      written = 0;
28 by Teddy Hogeborn
* server.conf: New file.
819
      while(written < (size_t) decrypted_buffer_size){
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
820
	if(quit_now){
821
	  goto mandos_end;
822
	}
823
	
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
824
	ret = (int)fwrite(decrypted_buffer + written, 1,
825
			  (size_t)decrypted_buffer_size - written,
826
			  stdout);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
827
	if(ret == 0 and ferror(stdout)){
828
	  if(debug){
829
	    fprintf(stderr, "Error writing encrypted data: %s\n",
830
		    strerror(errno));
831
	  }
832
	  retval = -1;
833
	  break;
834
	}
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
835
	written += (size_t)ret;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
836
      }
13 by Björn Påhlsson
Added following support:
837
      free(decrypted_buffer);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
838
    } else {
839
      retval = -1;
13 by Björn Påhlsson
Added following support:
840
    }
24.1.63 by Björn Påhlsson
merge + fallback bugg
841
  } else {
842
    retval = -1;
13 by Björn Påhlsson
Added following support:
843
  }
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
844
  
845
  /* Shutdown procedure */
846
  
847
 mandos_end:
13 by Björn Påhlsson
Added following support:
848
  free(buffer);
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
849
  if(tcp_sd >= 0){
850
    ret = (int)TEMP_FAILURE_RETRY(close(tcp_sd));
851
  }
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
852
  if(ret == -1){
853
    perror("close");
854
  }
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
855
  gnutls_deinit(session);
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
856
  if(quit_now){
857
    retval = -1;
858
  }
13 by Björn Påhlsson
Added following support:
859
  return retval;
860
}
861
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
862
static void resolve_callback(AvahiSServiceResolver *r,
863
			     AvahiIfIndex interface,
237.2.67 by Teddy Hogeborn
Four new interrelated features:
864
			     AvahiProtocol proto,
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
865
			     AvahiResolverEvent event,
866
			     const char *name,
867
			     const char *type,
868
			     const char *domain,
869
			     const char *host_name,
870
			     const AvahiAddress *address,
871
			     uint16_t port,
872
			     AVAHI_GCC_UNUSED AvahiStringList *txt,
873
			     AVAHI_GCC_UNUSED AvahiLookupResultFlags
874
			     flags,
237.2.70 by Teddy Hogeborn
Merge from Björn:
875
			     AVAHI_GCC_UNUSED void* userdata){
84 by Teddy Hogeborn
* Makefile (DOCBOOKTOMAN): Use the local manpages/docbook.xsl file, do
876
  assert(r);
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
877
  
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
878
  /* Called whenever a service has been resolved successfully or
879
     timed out */
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
880
  
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
881
  if(quit_now){
882
    return;
883
  }
884
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
885
  switch(event){
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
886
  default:
887
  case AVAHI_RESOLVER_FAILURE:
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
888
    fprintf(stderr, "(Avahi Resolver) Failed to resolve service '%s'"
889
	    " 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
890
	    avahi_strerror(avahi_server_errno(mc.server)));
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
891
    break;
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
892
    
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
893
  case AVAHI_RESOLVER_FOUND:
894
    {
895
      char ip[AVAHI_ADDRESS_STR_MAX];
896
      avahi_address_snprint(ip, sizeof(ip), address);
897
      if(debug){
60 by Teddy Hogeborn
* mandos-client.c (main): Cast pid_t to unsigned int before printing.
898
	fprintf(stderr, "Mandos server \"%s\" found on %s (%s, %"
237.2.31 by Teddy Hogeborn
Fixes for sscanf usage:
899
		PRIdMAX ") on port %" PRIu16 "\n", name, host_name,
900
		ip, (intmax_t)interface, port);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
901
      }
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
902
      int ret = start_mandos_communication(ip, port, interface,
237.2.67 by Teddy Hogeborn
Four new interrelated features:
903
					   avahi_proto_to_af(proto));
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
904
      if(ret == 0){
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
905
	avahi_simple_poll_quit(mc.simple_poll);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
906
      }
13 by Björn Påhlsson
Added following support:
907
    }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
908
  }
909
  avahi_s_service_resolver_free(r);
13 by Björn Påhlsson
Added following support:
910
}
911
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
912
static void browse_callback(AvahiSServiceBrowser *b,
913
			    AvahiIfIndex interface,
914
			    AvahiProtocol protocol,
915
			    AvahiBrowserEvent event,
916
			    const char *name,
917
			    const char *type,
918
			    const char *domain,
919
			    AVAHI_GCC_UNUSED AvahiLookupResultFlags
920
			    flags,
237.2.70 by Teddy Hogeborn
Merge from Björn:
921
			    AVAHI_GCC_UNUSED void* userdata){
84 by Teddy Hogeborn
* Makefile (DOCBOOKTOMAN): Use the local manpages/docbook.xsl file, do
922
  assert(b);
24.1.9 by Björn Påhlsson
not working midwork...
923
  
924
  /* Called whenever a new services becomes available on the LAN or
925
     is removed from the LAN */
926
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
927
  if(quit_now){
928
    return;
929
  }
930
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
931
  switch(event){
24.1.9 by Björn Påhlsson
not working midwork...
932
  default:
933
  case AVAHI_BROWSER_FAILURE:
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
934
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
935
    fprintf(stderr, "(Avahi browser) %s\n",
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
936
	    avahi_strerror(avahi_server_errno(mc.server)));
937
    avahi_simple_poll_quit(mc.simple_poll);
24.1.9 by Björn Påhlsson
not working midwork...
938
    return;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
939
    
24.1.9 by Björn Påhlsson
not working midwork...
940
  case AVAHI_BROWSER_NEW:
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
941
    /* We ignore the returned Avahi resolver object. In the callback
942
       function we free it. If the Avahi server is terminated before
943
       the callback function is called the Avahi server will free the
944
       resolver for us. */
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
945
    
237.2.76 by Teddy Hogeborn
* plugins.d/mandos-client.c (browse_callback, main): Do not require
946
    if(avahi_s_service_resolver_new(mc.server, interface, protocol,
947
				    name, type, domain, protocol, 0,
948
				    resolve_callback, NULL) == NULL)
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
949
      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
950
	      name, avahi_strerror(avahi_server_errno(mc.server)));
24.1.9 by Björn Påhlsson
not working midwork...
951
    break;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
952
    
24.1.9 by Björn Påhlsson
not working midwork...
953
  case AVAHI_BROWSER_REMOVE:
954
    break;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
955
    
24.1.9 by Björn Påhlsson
not working midwork...
956
  case AVAHI_BROWSER_ALL_FOR_NOW:
957
  case AVAHI_BROWSER_CACHE_EXHAUSTED:
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
958
    if(debug){
959
      fprintf(stderr, "No Mandos server found, still searching...\n");
960
    }
24.1.9 by Björn Påhlsson
not working midwork...
961
    break;
962
  }
13 by Björn Påhlsson
Added following support:
963
}
964
24.1.135 by Björn Påhlsson
Earlier signal handling
965
/* stop main loop after sigterm has been called */
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
966
static void handle_sigterm(int sig){
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
967
  if(quit_now){
968
    return;
969
  }
970
  quit_now = 1;
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
971
  signal_received = sig;
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
972
  int old_errno = errno;
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
973
  if(mc.simple_poll != NULL){
974
    avahi_simple_poll_quit(mc.simple_poll);
975
  }
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
976
  errno = old_errno;
977
}
978
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
979
int main(int argc, char *argv[]){
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
980
  AvahiSServiceBrowser *sb = NULL;
981
  int error;
982
  int ret;
983
  intmax_t tmpmax;
237.2.74 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
984
  char *tmp;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
985
  int exitcode = EXIT_SUCCESS;
986
  const char *interface = "eth0";
987
  struct ifreq network;
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
988
  int sd = -1;
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
989
  bool take_down_interface = false;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
990
  uid_t uid;
991
  gid_t gid;
992
  char *connect_to = NULL;
993
  char tempdir[] = "/tmp/mandosXXXXXX";
994
  bool tempdir_created = false;
995
  AvahiIfIndex if_index = AVAHI_IF_UNSPEC;
996
  const char *seckey = PATHDIR "/" SECKEY;
997
  const char *pubkey = PATHDIR "/" PUBKEY;
998
  
999
  bool gnutls_initialized = false;
1000
  bool gpgme_initialized = false;
237.2.74 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
1001
  float delay = 2.5f;
1002
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1003
  struct sigaction old_sigterm_action;
1004
  struct sigaction sigterm_action = { .sa_handler = handle_sigterm };
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1005
  
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1006
  uid = getuid();
1007
  gid = getgid();
1008
  
1009
  /* Lower any group privileges we might have, just to be safe */
1010
  errno = 0;
1011
  ret = setgid(gid);
1012
  if(ret == -1){
1013
    perror("setgid");
1014
  }
1015
  
1016
  /* Lower user privileges (temporarily) */
1017
  errno = 0;
1018
  ret = seteuid(uid);
1019
  if(ret == -1){
1020
    perror("seteuid");
1021
  }
1022
  
1023
  if(quit_now){
1024
    goto end;
1025
  }
1026
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1027
  {
1028
    struct argp_option options[] = {
1029
      { .name = "debug", .key = 128,
1030
	.doc = "Debug mode", .group = 3 },
1031
      { .name = "connect", .key = 'c',
1032
	.arg = "ADDRESS:PORT",
1033
	.doc = "Connect directly to a specific Mandos server",
1034
	.group = 1 },
1035
      { .name = "interface", .key = 'i',
1036
	.arg = "NAME",
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1037
	.doc = "Network interface that will be used to search for"
1038
	" Mandos servers",
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1039
	.group = 1 },
1040
      { .name = "seckey", .key = 's',
1041
	.arg = "FILE",
1042
	.doc = "OpenPGP secret key file base name",
1043
	.group = 1 },
1044
      { .name = "pubkey", .key = 'p',
1045
	.arg = "FILE",
1046
	.doc = "OpenPGP public key file base name",
1047
	.group = 2 },
1048
      { .name = "dh-bits", .key = 129,
1049
	.arg = "BITS",
1050
	.doc = "Bit length of the prime number used in the"
1051
	" Diffie-Hellman key exchange",
1052
	.group = 2 },
1053
      { .name = "priority", .key = 130,
1054
	.arg = "STRING",
1055
	.doc = "GnuTLS priority string for the TLS handshake",
1056
	.group = 1 },
1057
      { .name = "delay", .key = 131,
1058
	.arg = "SECONDS",
1059
	.doc = "Maximum delay to wait for interface startup",
1060
	.group = 2 },
1061
      { .name = NULL }
1062
    };
1063
    
1064
    error_t parse_opt(int key, char *arg,
1065
		      struct argp_state *state){
1066
      switch(key){
1067
      case 128:			/* --debug */
1068
	debug = true;
1069
	break;
1070
      case 'c':			/* --connect */
1071
	connect_to = arg;
1072
	break;
1073
      case 'i':			/* --interface */
1074
	interface = arg;
1075
	break;
1076
      case 's':			/* --seckey */
1077
	seckey = arg;
1078
	break;
1079
      case 'p':			/* --pubkey */
1080
	pubkey = arg;
1081
	break;
1082
      case 129:			/* --dh-bits */
237.2.74 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
1083
	errno = 0;
1084
	tmpmax = strtoimax(arg, &tmp, 10);
1085
	if(errno != 0 or tmp == arg or *tmp != '\0'
1086
	   or tmpmax != (typeof(mc.dh_bits))tmpmax){
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1087
	  fprintf(stderr, "Bad number of DH bits\n");
1088
	  exit(EXIT_FAILURE);
1089
	}
1090
	mc.dh_bits = (typeof(mc.dh_bits))tmpmax;
1091
	break;
1092
      case 130:			/* --priority */
1093
	mc.priority = arg;
1094
	break;
1095
      case 131:			/* --delay */
237.2.74 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
1096
	errno = 0;
1097
	delay = strtof(arg, &tmp);
1098
	if(errno != 0 or tmp == arg or *tmp != '\0'){
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1099
	  fprintf(stderr, "Bad delay\n");
1100
	  exit(EXIT_FAILURE);
1101
	}
1102
	break;
1103
      case ARGP_KEY_ARG:
1104
	argp_usage(state);
1105
      case ARGP_KEY_END:
1106
	break;
1107
      default:
1108
	return ARGP_ERR_UNKNOWN;
1109
      }
1110
      return 0;
1111
    }
1112
    
1113
    struct argp argp = { .options = options, .parser = parse_opt,
1114
			 .args_doc = "",
1115
			 .doc = "Mandos client -- Get and decrypt"
1116
			 " passwords from a Mandos server" };
1117
    ret = argp_parse(&argp, argc, argv, 0, 0, NULL);
1118
    if(ret == ARGP_ERR_UNKNOWN){
1119
      fprintf(stderr, "Unknown error while parsing arguments\n");
1120
      exitcode = EXIT_FAILURE;
1121
      goto end;
1122
    }
1123
  }
1124
  
24.1.135 by Björn Påhlsson
Earlier signal handling
1125
  if(not debug){
1126
    avahi_set_log_function(empty_log);
1127
  }
237.2.72 by Teddy Hogeborn
Merge from Björn:
1128
  
24.1.135 by Björn Påhlsson
Earlier signal handling
1129
  /* Initialize Avahi early so avahi_simple_poll_quit() can be called
1130
     from the signal handler */
1131
  /* Initialize the pseudo-RNG for Avahi */
1132
  srand((unsigned int) time(NULL));
1133
  mc.simple_poll = avahi_simple_poll_new();
1134
  if(mc.simple_poll == NULL){
1135
    fprintf(stderr, "Avahi: Failed to create simple poll object.\n");
1136
    exitcode = EXIT_FAILURE;
1137
    goto end;
1138
  }
237.2.72 by Teddy Hogeborn
Merge from Björn:
1139
  
24.1.135 by Björn Påhlsson
Earlier signal handling
1140
  sigemptyset(&sigterm_action.sa_mask);
237.2.72 by Teddy Hogeborn
Merge from Björn:
1141
  ret = sigaddset(&sigterm_action.sa_mask, SIGINT);
1142
  if(ret == -1){
1143
    perror("sigaddset");
1144
    exitcode = EXIT_FAILURE;
1145
    goto end;
1146
  }
1147
  ret = sigaddset(&sigterm_action.sa_mask, SIGHUP);
1148
  if(ret == -1){
1149
    perror("sigaddset");
1150
    exitcode = EXIT_FAILURE;
1151
    goto end;
1152
  }
24.1.135 by Björn Påhlsson
Earlier signal handling
1153
  ret = sigaddset(&sigterm_action.sa_mask, SIGTERM);
1154
  if(ret == -1){
1155
    perror("sigaddset");
1156
    exitcode = EXIT_FAILURE;
1157
    goto end;
1158
  }
237.2.120 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1159
  /* Need to check if the handler is SIG_IGN before handling:
1160
     | [[info:libc:Initial Signal Actions]] |
1161
     | [[info:libc:Basic Signal Handling]]  |
1162
  */
1163
  ret = sigaction(SIGINT, NULL, &old_sigterm_action);
1164
  if(ret == -1){
1165
    perror("sigaction");
1166
    return EXIT_FAILURE;
1167
  }
1168
  if(old_sigterm_action.sa_handler != SIG_IGN){
1169
    ret = sigaction(SIGINT, &sigterm_action, NULL);
1170
    if(ret == -1){
1171
      perror("sigaction");
1172
      exitcode = EXIT_FAILURE;
1173
      goto end;
1174
    }
1175
  }
1176
  ret = sigaction(SIGHUP, NULL, &old_sigterm_action);
1177
  if(ret == -1){
1178
    perror("sigaction");
1179
    return EXIT_FAILURE;
1180
  }
1181
  if(old_sigterm_action.sa_handler != SIG_IGN){
1182
    ret = sigaction(SIGHUP, &sigterm_action, NULL);
1183
    if(ret == -1){
1184
      perror("sigaction");
1185
      exitcode = EXIT_FAILURE;
1186
      goto end;
1187
    }
1188
  }
1189
  ret = sigaction(SIGTERM, NULL, &old_sigterm_action);
1190
  if(ret == -1){
1191
    perror("sigaction");
1192
    return EXIT_FAILURE;
1193
  }
1194
  if(old_sigterm_action.sa_handler != SIG_IGN){
1195
    ret = sigaction(SIGTERM, &sigterm_action, NULL);
1196
    if(ret == -1){
1197
      perror("sigaction");
1198
      exitcode = EXIT_FAILURE;
1199
      goto end;
1200
    }
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
1201
  }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1202
  
1203
  /* If the interface is down, bring it up */
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1204
  if(interface[0] != '\0'){
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1205
    if_index = (AvahiIfIndex) if_nametoindex(interface);
1206
    if(if_index == 0){
1207
      fprintf(stderr, "No such interface: \"%s\"\n", interface);
1208
      exitcode = EXIT_FAILURE;
1209
      goto end;
1210
    }
1211
    
1212
    if(quit_now){
1213
      goto end;
1214
    }
1215
    
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1216
    /* Re-raise priviliges */
1217
    errno = 0;
1218
    ret = seteuid(0);
1219
    if(ret == -1){
1220
      perror("seteuid");
1221
    }
1222
    
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1223
#ifdef __linux__
1224
    /* Lower kernel loglevel to KERN_NOTICE to avoid KERN_INFO
1225
       messages to mess up the prompt */
1226
    ret = klogctl(8, NULL, 5);
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1227
    bool restore_loglevel = true;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1228
    if(ret == -1){
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1229
      restore_loglevel = false;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1230
      perror("klogctl");
1231
    }
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1232
#endif	/* __linux__ */
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1233
    
1234
    sd = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP);
1235
    if(sd < 0){
1236
      perror("socket");
1237
      exitcode = EXIT_FAILURE;
1238
#ifdef __linux__
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1239
      if(restore_loglevel){
1240
	ret = klogctl(7, NULL, 0);
1241
	if(ret == -1){
1242
	  perror("klogctl");
1243
	}
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1244
      }
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1245
#endif	/* __linux__ */
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1246
      /* Lower privileges */
1247
      errno = 0;
1248
      ret = seteuid(uid);
1249
      if(ret == -1){
1250
	perror("seteuid");
1251
      }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1252
      goto end;
1253
    }
1254
    strcpy(network.ifr_name, interface);
1255
    ret = ioctl(sd, SIOCGIFFLAGS, &network);
1256
    if(ret == -1){
1257
      perror("ioctl SIOCGIFFLAGS");
1258
#ifdef __linux__
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1259
      if(restore_loglevel){
1260
	ret = klogctl(7, NULL, 0);
1261
	if(ret == -1){
1262
	  perror("klogctl");
1263
	}
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1264
      }
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1265
#endif	/* __linux__ */
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1266
      exitcode = EXIT_FAILURE;
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1267
      /* Lower privileges */
1268
      errno = 0;
1269
      ret = seteuid(uid);
1270
      if(ret == -1){
1271
	perror("seteuid");
1272
      }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1273
      goto end;
1274
    }
1275
    if((network.ifr_flags & IFF_UP) == 0){
1276
      network.ifr_flags |= IFF_UP;
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1277
      take_down_interface = true;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1278
      ret = ioctl(sd, SIOCSIFFLAGS, &network);
1279
      if(ret == -1){
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1280
	take_down_interface = false;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1281
	perror("ioctl SIOCSIFFLAGS");
1282
	exitcode = EXIT_FAILURE;
1283
#ifdef __linux__
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1284
	if(restore_loglevel){
1285
	  ret = klogctl(7, NULL, 0);
1286
	  if(ret == -1){
1287
	    perror("klogctl");
1288
	  }
24.1.124 by Björn Påhlsson
Added lower kernel loglevel to reduce clutter on system console.
1289
	}
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1290
#endif	/* __linux__ */
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1291
	/* Lower privileges */
1292
	errno = 0;
1293
	ret = seteuid(uid);
1294
	if(ret == -1){
1295
	  perror("seteuid");
1296
	}
65 by Teddy Hogeborn
* plugins.d/password-request.c (main): Bug fix: Bring up network
1297
	goto end;
1298
      }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1299
    }
1300
    /* sleep checking until interface is running */
1301
    for(int i=0; i < delay * 4; i++){
65 by Teddy Hogeborn
* plugins.d/password-request.c (main): Bug fix: Bring up network
1302
      ret = ioctl(sd, SIOCGIFFLAGS, &network);
1303
      if(ret == -1){
1304
	perror("ioctl SIOCGIFFLAGS");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1305
      } else if(network.ifr_flags & IFF_RUNNING){
1306
	break;
1307
      }
1308
      struct timespec sleeptime = { .tv_nsec = 250000000 };
1309
      ret = nanosleep(&sleeptime, NULL);
1310
      if(ret == -1 and errno != EINTR){
1311
	perror("nanosleep");
1312
      }
1313
    }
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1314
    if(not take_down_interface){
1315
      /* We won't need the socket anymore */
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
1316
      ret = (int)TEMP_FAILURE_RETRY(close(sd));
1317
      if(ret == -1){
1318
	perror("close");
1319
      }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1320
    }
1321
#ifdef __linux__
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1322
    if(restore_loglevel){
1323
      /* Restores kernel loglevel to default */
1324
      ret = klogctl(7, NULL, 0);
1325
      if(ret == -1){
1326
	perror("klogctl");
1327
      }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1328
    }
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1329
#endif	/* __linux__ */
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1330
    /* Lower privileges */
1331
    errno = 0;
1332
    if(take_down_interface){
1333
      /* Lower privileges */
1334
      ret = seteuid(uid);
1335
      if(ret == -1){
1336
	perror("seteuid");
1337
      }
1338
    } else {
1339
      /* Lower privileges permanently */
1340
      ret = setuid(uid);
1341
      if(ret == -1){
1342
	perror("setuid");
1343
      }
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
1344
    }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1345
  }
1346
  
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1347
  if(quit_now){
1348
    goto end;
1349
  }
1350
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1351
  ret = init_gnutls_global(pubkey, seckey);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1352
  if(ret == -1){
1353
    fprintf(stderr, "init_gnutls_global failed\n");
1354
    exitcode = EXIT_FAILURE;
1355
    goto end;
1356
  } else {
1357
    gnutls_initialized = true;
1358
  }
1359
  
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1360
  if(quit_now){
1361
    goto end;
1362
  }
1363
  
1364
  tempdir_created = true;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1365
  if(mkdtemp(tempdir) == NULL){
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1366
    tempdir_created = false;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1367
    perror("mkdtemp");
1368
    goto end;
1369
  }
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1370
  
1371
  if(quit_now){
1372
    goto end;
1373
  }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1374
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1375
  if(not init_gpgme(pubkey, seckey, tempdir)){
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1376
    fprintf(stderr, "init_gpgme failed\n");
1377
    exitcode = EXIT_FAILURE;
1378
    goto end;
1379
  } else {
1380
    gpgme_initialized = true;
1381
  }
1382
  
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1383
  if(quit_now){
1384
    goto end;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1385
  }
1386
  
1387
  if(connect_to != NULL){
1388
    /* Connect directly, do not use Zeroconf */
1389
    /* (Mainly meant for debugging) */
1390
    char *address = strrchr(connect_to, ':');
1391
    if(address == NULL){
1392
      fprintf(stderr, "No colon in address\n");
1393
      exitcode = EXIT_FAILURE;
1394
      goto end;
1395
    }
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1396
    
1397
    if(quit_now){
1398
      goto end;
1399
    }
1400
    
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1401
    uint16_t port;
237.2.74 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
1402
    errno = 0;
1403
    tmpmax = strtoimax(address+1, &tmp, 10);
1404
    if(errno != 0 or tmp == address+1 or *tmp != '\0'
1405
       or tmpmax != (uint16_t)tmpmax){
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1406
      fprintf(stderr, "Bad port number\n");
1407
      exitcode = EXIT_FAILURE;
1408
      goto end;
1409
    }
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1410
  
1411
    if(quit_now){
1412
      goto end;
1413
    }
1414
    
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1415
    port = (uint16_t)tmpmax;
1416
    *address = '\0';
1417
    address = connect_to;
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1418
    /* Colon in address indicates IPv6 */
1419
    int af;
1420
    if(strchr(address, ':') != NULL){
1421
      af = AF_INET6;
1422
    } else {
1423
      af = AF_INET;
1424
    }
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1425
    
1426
    if(quit_now){
1427
      goto end;
1428
    }
1429
    
237.2.70 by Teddy Hogeborn
Merge from Björn:
1430
    ret = start_mandos_communication(address, port, if_index, af);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1431
    if(ret < 0){
1432
      exitcode = EXIT_FAILURE;
1433
    } else {
1434
      exitcode = EXIT_SUCCESS;
1435
    }
1436
    goto end;
1437
  }
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1438
  
1439
  if(quit_now){
1440
    goto end;
1441
  }
1442
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1443
  {
1444
    AvahiServerConfig config;
1445
    /* Do not publish any local Zeroconf records */
1446
    avahi_server_config_init(&config);
1447
    config.publish_hinfo = 0;
1448
    config.publish_addresses = 0;
1449
    config.publish_workstation = 0;
1450
    config.publish_domain = 0;
1451
    
1452
    /* Allocate a new server */
1453
    mc.server = avahi_server_new(avahi_simple_poll_get
1454
				 (mc.simple_poll), &config, NULL,
1455
				 NULL, &error);
1456
    
1457
    /* Free the Avahi configuration data */
1458
    avahi_server_config_free(&config);
1459
  }
1460
  
1461
  /* Check if creating the Avahi server object succeeded */
1462
  if(mc.server == NULL){
1463
    fprintf(stderr, "Failed to create Avahi server: %s\n",
1464
	    avahi_strerror(error));
1465
    exitcode = EXIT_FAILURE;
1466
    goto end;
1467
  }
1468
  
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1469
  if(quit_now){
1470
    goto end;
1471
  }
1472
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1473
  /* Create the Avahi service browser */
1474
  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
1475
				   AVAHI_PROTO_UNSPEC, "_mandos._tcp",
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1476
				   NULL, 0, browse_callback, NULL);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1477
  if(sb == NULL){
1478
    fprintf(stderr, "Failed to create service browser: %s\n",
1479
	    avahi_strerror(avahi_server_errno(mc.server)));
1480
    exitcode = EXIT_FAILURE;
1481
    goto end;
1482
  }
237.2.70 by Teddy Hogeborn
Merge from Björn:
1483
  
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1484
  if(quit_now){
1485
    goto end;
1486
  }
1487
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1488
  /* Run the main loop */
1489
  
1490
  if(debug){
1491
    fprintf(stderr, "Starting Avahi loop search\n");
1492
  }
1493
  
1494
  avahi_simple_poll_loop(mc.simple_poll);
1495
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1496
 end:
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1497
  
1498
  if(debug){
1499
    fprintf(stderr, "%s exiting\n", argv[0]);
1500
  }
1501
  
1502
  /* Cleanup things */
1503
  if(sb != NULL)
1504
    avahi_s_service_browser_free(sb);
1505
  
1506
  if(mc.server != NULL)
1507
    avahi_server_free(mc.server);
1508
  
1509
  if(mc.simple_poll != NULL)
1510
    avahi_simple_poll_free(mc.simple_poll);
1511
  
1512
  if(gnutls_initialized){
1513
    gnutls_certificate_free_credentials(mc.cred);
1514
    gnutls_global_deinit();
1515
    gnutls_dh_params_deinit(mc.dh_params);
1516
  }
1517
  
1518
  if(gpgme_initialized){
1519
    gpgme_release(mc.ctx);
1520
  }
1521
  
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
1522
  /* Take down the network interface */
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1523
  if(take_down_interface){
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
1524
    /* Re-raise priviliges */
1525
    errno = 0;
1526
    ret = seteuid(0);
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
1527
    if(ret == -1){
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
1528
      perror("seteuid");
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
1529
    }
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
1530
    if(geteuid() == 0){
1531
      ret = ioctl(sd, SIOCGIFFLAGS, &network);
1532
      if(ret == -1){
1533
	perror("ioctl SIOCGIFFLAGS");
1534
      } else if(network.ifr_flags & IFF_UP) {
1535
	network.ifr_flags &= ~IFF_UP; /* clear flag */
1536
	ret = ioctl(sd, SIOCSIFFLAGS, &network);
1537
	if(ret == -1){
1538
	  perror("ioctl SIOCSIFFLAGS");
1539
	}
1540
      }
1541
      ret = (int)TEMP_FAILURE_RETRY(close(sd));
1542
      if(ret == -1){
1543
	perror("close");
1544
      }
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1545
      /* Lower privileges permanently */
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
1546
      errno = 0;
1547
      ret = setuid(uid);
1548
      if(ret == -1){
1549
	perror("setuid");
1550
      }
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
1551
    }
1552
  }
1553
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1554
  /* Removes the temp directory used by GPGME */
1555
  if(tempdir_created){
1556
    DIR *d;
1557
    struct dirent *direntry;
1558
    d = opendir(tempdir);
1559
    if(d == NULL){
1560
      if(errno != ENOENT){
1561
	perror("opendir");
1562
      }
1563
    } else {
1564
      while(true){
1565
	direntry = readdir(d);
1566
	if(direntry == NULL){
1567
	  break;
1568
	}
1569
	/* Skip "." and ".." */
1570
	if(direntry->d_name[0] == '.'
1571
	   and (direntry->d_name[1] == '\0'
1572
		or (direntry->d_name[1] == '.'
1573
		    and direntry->d_name[2] == '\0'))){
1574
	  continue;
1575
	}
1576
	char *fullname = NULL;
1577
	ret = asprintf(&fullname, "%s/%s", tempdir,
1578
		       direntry->d_name);
1579
	if(ret < 0){
1580
	  perror("asprintf");
1581
	  continue;
1582
	}
1583
	ret = remove(fullname);
1584
	if(ret == -1){
1585
	  fprintf(stderr, "remove(\"%s\"): %s\n", fullname,
1586
		  strerror(errno));
1587
	}
1588
	free(fullname);
1589
      }
1590
      closedir(d);
1591
    }
1592
    ret = rmdir(tempdir);
1593
    if(ret == -1 and errno != ENOENT){
1594
      perror("rmdir");
1595
    }
1596
  }
1597
  
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
1598
  if(quit_now){
237.2.120 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1599
    sigemptyset(&old_sigterm_action.sa_mask);
1600
    old_sigterm_action.sa_handler = SIG_DFL;
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
1601
    ret = sigaction(signal_received, &old_sigterm_action, NULL);
1602
    if(ret == -1){
1603
      perror("sigaction");
1604
    }
1605
    raise(signal_received);
1606
  }
1607
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1608
  return exitcode;
13 by Björn Påhlsson
Added following support:
1609
}