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