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