/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1
/*  -*- coding: utf-8 -*- */
2
/*
3
 * Mandos client - get and decrypt data from a Mandos server
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
12
 * Copyright © 2007-2008 Teddy Hogeborn & Björn Påhlsson
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
13
 * 
14
 * This program is free software: you can redistribute it and/or
15
 * modify it under the terms of the GNU General Public License as
16
 * published by the Free Software Foundation, either version 3 of the
17
 * License, or (at your option) any later version.
18
 * 
19
 * This program is distributed in the hope that it will be useful, but
20
 * WITHOUT ANY WARRANTY; without even the implied warranty of
21
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22
 * General Public License for more details.
23
 * 
24
 * You should have received a copy of the GNU General Public License
25
 * along with this program.  If not, see
26
 * <http://www.gnu.org/licenses/>.
27
 * 
31 by Teddy Hogeborn
* plugins.d/plugbasedclient.c: Update include file comments.
28
 * Contact the authors at <mandos@fukt.bsnet.se>.
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
29
 */
30
28 by Teddy Hogeborn
* server.conf: New file.
31
/* Needed by GPGME, specifically gpgme_data_seek() */
13 by Björn Påhlsson
Added following support:
32
#define _LARGEFILE_SOURCE
33
#define _FILE_OFFSET_BITS 64
34
24.1.10 by Björn Påhlsson
merge commit
35
#define _GNU_SOURCE		/* TEMP_FAILURE_RETRY() */
36
13 by Björn Påhlsson
Added following support:
37
#include <stdio.h>
38
#include <assert.h>
39
#include <stdlib.h>
40
#include <time.h>
41
#include <net/if.h>		/* if_nametoindex */
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
42
#include <sys/ioctl.h>          /* ioctl, ifreq, SIOCGIFFLAGS, IFF_UP,
43
				   SIOCSIFFLAGS */
44
#include <net/if.h>		/* ioctl, ifreq, SIOCGIFFLAGS, IFF_UP,
45
				   SIOCSIFFLAGS */
13 by Björn Påhlsson
Added following support:
46
47
#include <avahi-core/core.h>
48
#include <avahi-core/lookup.h>
49
#include <avahi-core/log.h>
50
#include <avahi-common/simple-watch.h>
51
#include <avahi-common/malloc.h>
52
#include <avahi-common/error.h>
53
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
54
/* Mandos client part */
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
55
#include <sys/types.h>		/* socket(), inet_pton() */
56
#include <sys/socket.h>		/* socket(), struct sockaddr_in6,
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
57
				   struct in6_addr, inet_pton() */
58
#include <gnutls/gnutls.h>	/* All GnuTLS stuff */
59
#include <gnutls/openpgp.h>	/* GnuTLS with openpgp stuff */
13 by Björn Påhlsson
Added following support:
60
61
#include <unistd.h>		/* close() */
62
#include <netinet/in.h>
63
#include <stdbool.h>		/* true */
64
#include <string.h>		/* memset */
65
#include <arpa/inet.h>		/* inet_pton() */
66
#include <iso646.h>		/* not */
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
67
#include <net/if.h>		/* IF_NAMESIZE */
24.1.14 by Björn Påhlsson
mandosclient
68
#include <argp.h>		/* struct argp_option,
69
				   struct argp_state, struct argp,
70
				   argp_parse() */
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
71
/* GPGME */
13 by Björn Påhlsson
Added following support:
72
#include <errno.h>		/* perror() */
73
#include <gpgme.h>
74
75
#define BUFFER_SIZE 256
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
76
15.1.2 by Björn Påhlsson
Added debug options from passprompt as --debug and --debug=passprompt
77
bool debug = false;
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
78
static const char *keydir = "/conf/conf.d/mandos";
43 by Teddy Hogeborn
* plugins.d/mandosclient.c: Cosmetic changes.
79
static const char mandos_protocol_version[] = "1";
24.1.14 by Björn Påhlsson
mandosclient
80
const char *argp_program_version = "mandosclient 0.9";
81
const char *argp_program_bug_address = "<mandos@fukt.bsnet.se>";
24.1.10 by Björn Påhlsson
merge commit
82
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
83
/* Used for passing in values through the Avahi callback functions */
13 by Björn Påhlsson
Added following support:
84
typedef struct {
24.1.9 by Björn Påhlsson
not working midwork...
85
  AvahiSimplePoll *simple_poll;
86
  AvahiServer *server;
13 by Björn Påhlsson
Added following support:
87
  gnutls_certificate_credentials_t cred;
24.1.9 by Björn Påhlsson
not working midwork...
88
  unsigned int dh_bits;
24.1.13 by Björn Påhlsson
mandosclient
89
  gnutls_dh_params_t dh_params;
24.1.9 by Björn Påhlsson
not working midwork...
90
  const char *priority;
91
} mandos_context;
13 by Björn Påhlsson
Added following support:
92
43 by Teddy Hogeborn
* plugins.d/mandosclient.c: Cosmetic changes.
93
/*
94
 * Make room in "buffer" for at least BUFFER_SIZE additional bytes.
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
95
 * "buffer_capacity" is how much is currently allocated,
43 by Teddy Hogeborn
* plugins.d/mandosclient.c: Cosmetic changes.
96
 * "buffer_length" is how much is already used.
97
 */
24.1.12 by Björn Påhlsson
merge +
98
size_t adjustbuffer(char **buffer, size_t buffer_length,
24.1.10 by Björn Påhlsson
merge commit
99
		  size_t buffer_capacity){
100
  if (buffer_length + BUFFER_SIZE > buffer_capacity){
24.1.12 by Björn Påhlsson
merge +
101
    *buffer = realloc(*buffer, buffer_capacity + BUFFER_SIZE);
24.1.10 by Björn Påhlsson
merge commit
102
    if (buffer == NULL){
103
      return 0;
104
    }
105
    buffer_capacity += BUFFER_SIZE;
106
  }
107
  return buffer_capacity;
108
}
109
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
110
/* 
111
 * Decrypt OpenPGP data using keyrings in HOMEDIR.
112
 * Returns -1 on error
113
 */
114
static ssize_t pgp_packet_decrypt (const char *cryptotext,
115
				   size_t crypto_size,
116
				   char **plaintext,
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
117
				   const char *homedir){
13 by Björn Påhlsson
Added following support:
118
  gpgme_data_t dh_crypto, dh_plain;
119
  gpgme_ctx_t ctx;
120
  gpgme_error_t rc;
121
  ssize_t ret;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
122
  size_t plaintext_capacity = 0;
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
123
  ssize_t plaintext_length = 0;
13 by Björn Påhlsson
Added following support:
124
  gpgme_engine_info_t engine_info;
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
125
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
126
  if (debug){
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
127
    fprintf(stderr, "Trying to decrypt OpenPGP data\n");
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
128
  }
129
  
13 by Björn Påhlsson
Added following support:
130
  /* Init GPGME */
131
  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.
132
  rc = gpgme_engine_check_version(GPGME_PROTOCOL_OpenPGP);
133
  if (rc != GPG_ERR_NO_ERROR){
134
    fprintf(stderr, "bad gpgme_engine_check_version: %s: %s\n",
135
	    gpgme_strsource(rc), gpgme_strerror(rc));
136
    return -1;
137
  }
13 by Björn Påhlsson
Added following support:
138
  
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
139
  /* Set GPGME home directory for the OpenPGP engine only */
13 by Björn Påhlsson
Added following support:
140
  rc = gpgme_get_engine_info (&engine_info);
141
  if (rc != GPG_ERR_NO_ERROR){
142
    fprintf(stderr, "bad gpgme_get_engine_info: %s: %s\n",
143
	    gpgme_strsource(rc), gpgme_strerror(rc));
144
    return -1;
145
  }
146
  while(engine_info != NULL){
147
    if(engine_info->protocol == GPGME_PROTOCOL_OpenPGP){
148
      gpgme_set_engine_info(GPGME_PROTOCOL_OpenPGP,
149
			    engine_info->file_name, homedir);
150
      break;
151
    }
152
    engine_info = engine_info->next;
153
  }
154
  if(engine_info == NULL){
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
155
    fprintf(stderr, "Could not set GPGME home dir to %s\n", homedir);
13 by Björn Påhlsson
Added following support:
156
    return -1;
157
  }
158
  
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
159
  /* Create new GPGME data buffer from memory cryptotext */
160
  rc = gpgme_data_new_from_mem(&dh_crypto, cryptotext, crypto_size,
161
			       0);
13 by Björn Påhlsson
Added following support:
162
  if (rc != GPG_ERR_NO_ERROR){
163
    fprintf(stderr, "bad gpgme_data_new_from_mem: %s: %s\n",
164
	    gpgme_strsource(rc), gpgme_strerror(rc));
165
    return -1;
166
  }
167
  
168
  /* Create new empty GPGME data buffer for the plaintext */
169
  rc = gpgme_data_new(&dh_plain);
170
  if (rc != GPG_ERR_NO_ERROR){
171
    fprintf(stderr, "bad gpgme_data_new: %s: %s\n",
172
	    gpgme_strsource(rc), gpgme_strerror(rc));
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
173
    gpgme_data_release(dh_crypto);
13 by Björn Påhlsson
Added following support:
174
    return -1;
175
  }
176
  
177
  /* Create new GPGME "context" */
178
  rc = gpgme_new(&ctx);
179
  if (rc != GPG_ERR_NO_ERROR){
180
    fprintf(stderr, "bad gpgme_new: %s: %s\n",
181
	    gpgme_strsource(rc), gpgme_strerror(rc));
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
182
    plaintext_length = -1;
183
    goto decrypt_end;
13 by Björn Påhlsson
Added following support:
184
  }
185
  
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
186
  /* Decrypt data from the cryptotext data buffer to the plaintext
187
     data buffer */
13 by Björn Påhlsson
Added following support:
188
  rc = gpgme_op_decrypt(ctx, dh_crypto, dh_plain);
189
  if (rc != GPG_ERR_NO_ERROR){
190
    fprintf(stderr, "bad gpgme_op_decrypt: %s: %s\n",
191
	    gpgme_strsource(rc), gpgme_strerror(rc));
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
192
    plaintext_length = -1;
193
    goto decrypt_end;
13 by Björn Påhlsson
Added following support:
194
  }
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
195
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
196
  if(debug){
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
197
    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
198
  }
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
199
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
200
  if (debug){
201
    gpgme_decrypt_result_t result;
202
    result = gpgme_op_decrypt_result(ctx);
203
    if (result == NULL){
204
      fprintf(stderr, "gpgme_op_decrypt_result failed\n");
205
    } else {
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
206
      fprintf(stderr, "Unsupported algorithm: %s\n",
207
	      result->unsupported_algorithm);
208
      fprintf(stderr, "Wrong key usage: %d\n",
209
	      result->wrong_key_usage);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
210
      if(result->file_name != NULL){
211
	fprintf(stderr, "File name: %s\n", result->file_name);
212
      }
213
      gpgme_recipient_t recipient;
214
      recipient = result->recipients;
215
      if(recipient){
216
	while(recipient != NULL){
217
	  fprintf(stderr, "Public key algorithm: %s\n",
218
		  gpgme_pubkey_algo_name(recipient->pubkey_algo));
219
	  fprintf(stderr, "Key ID: %s\n", recipient->keyid);
220
	  fprintf(stderr, "Secret key available: %s\n",
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
221
		  recipient->status == GPG_ERR_NO_SECKEY
222
		  ? "No" : "Yes");
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
223
	  recipient = recipient->next;
224
	}
225
      }
226
    }
227
  }
13 by Björn Påhlsson
Added following support:
228
  
229
  /* Seek back to the beginning of the GPGME plaintext data buffer */
24.1.5 by Björn Påhlsson
plugbasedclient:
230
  if (gpgme_data_seek(dh_plain, (off_t) 0, SEEK_SET) == -1){
231
    perror("pgpme_data_seek");
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
232
    plaintext_length = -1;
233
    goto decrypt_end;
24.1.5 by Björn Påhlsson
plugbasedclient:
234
  }
235
  
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
236
  *plaintext = NULL;
13 by Björn Påhlsson
Added following support:
237
  while(true){
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
238
    plaintext_capacity = adjustbuffer(plaintext,
239
				      (size_t)plaintext_length,
24.1.12 by Björn Påhlsson
merge +
240
				      plaintext_capacity);
241
    if (plaintext_capacity == 0){
24.1.10 by Björn Påhlsson
merge commit
242
	perror("adjustbuffer");
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
243
	plaintext_length = -1;
244
	goto decrypt_end;
13 by Björn Påhlsson
Added following support:
245
    }
246
    
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
247
    ret = gpgme_data_read(dh_plain, *plaintext + plaintext_length,
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
248
			  BUFFER_SIZE);
13 by Björn Påhlsson
Added following support:
249
    /* Print the data, if any */
250
    if (ret == 0){
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
251
      /* EOF */
13 by Björn Påhlsson
Added following support:
252
      break;
253
    }
254
    if(ret < 0){
255
      perror("gpgme_data_read");
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
256
      plaintext_length = -1;
257
      goto decrypt_end;
13 by Björn Påhlsson
Added following support:
258
    }
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
259
    plaintext_length += ret;
13 by Björn Påhlsson
Added following support:
260
  }
261
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
262
  if(debug){
263
    fprintf(stderr, "Decrypted password is: ");
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
264
    for(ssize_t i = 0; i < plaintext_length; i++){
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
265
      fprintf(stderr, "%02hhX ", (*plaintext)[i]);
266
    }
267
    fprintf(stderr, "\n");
268
  }
269
  
270
 decrypt_end:
271
  
272
  /* Delete the GPGME cryptotext data buffer */
273
  gpgme_data_release(dh_crypto);
15.1.3 by Björn Påhlsson
Added getopt_long support for mandosclient and passprompt
274
  
275
  /* Delete the GPGME plaintext data buffer */
13 by Björn Påhlsson
Added following support:
276
  gpgme_data_release(dh_plain);
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
277
  return plaintext_length;
13 by Björn Påhlsson
Added following support:
278
}
279
280
static const char * safer_gnutls_strerror (int value) {
281
  const char *ret = gnutls_strerror (value);
282
  if (ret == NULL)
283
    ret = "(unknown)";
284
  return ret;
285
}
286
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
287
/* GnuTLS log function callback */
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
288
static void debuggnutls(__attribute__((unused)) int level,
289
			const char* string){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
290
  fprintf(stderr, "GnuTLS: %s", string);
13 by Björn Påhlsson
Added following support:
291
}
292
24.1.14 by Björn Påhlsson
mandosclient
293
static int init_gnutls_global(mandos_context *mc,
294
			      const char *pubkeyfile,
295
			      const char *seckeyfile){
13 by Björn Påhlsson
Added following support:
296
  int ret;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
297
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
298
  if(debug){
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
299
    fprintf(stderr, "Initializing GnuTLS\n");
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
300
  }
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.
301
13 by Björn Påhlsson
Added following support:
302
  if ((ret = gnutls_global_init ())
303
      != GNUTLS_E_SUCCESS) {
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
304
    fprintf (stderr, "GnuTLS global_init: %s\n",
305
	     safer_gnutls_strerror(ret));
13 by Björn Påhlsson
Added following support:
306
    return -1;
307
  }
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
308
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
309
  if (debug){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
310
    /* "Use a log level over 10 to enable all debugging options."
311
     * - GnuTLS manual
312
     */
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
313
    gnutls_global_set_log_level(11);
314
    gnutls_global_set_log_function(debuggnutls);
315
  }
316
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
317
  /* OpenPGP credentials */
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
318
  if ((ret = gnutls_certificate_allocate_credentials (&mc->cred))
13 by Björn Påhlsson
Added following support:
319
      != GNUTLS_E_SUCCESS) {
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
320
    fprintf (stderr, "GnuTLS memory error: %s\n",
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
321
	     safer_gnutls_strerror(ret));
24.1.20 by Björn Påhlsson
mandosclient
322
    gnutls_global_deinit ();
13 by Björn Påhlsson
Added following support:
323
    return -1;
324
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
325
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
326
  if(debug){
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
327
    fprintf(stderr, "Attempting to use OpenPGP certificate %s"
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
328
	    " and keyfile %s as GnuTLS credentials\n", pubkeyfile,
329
	    seckeyfile);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
330
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
331
  
13 by Björn Påhlsson
Added following support:
332
  ret = gnutls_certificate_set_openpgp_key_file
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
333
    (mc->cred, pubkeyfile, seckeyfile, GNUTLS_OPENPGP_FMT_BASE64);
13 by Björn Påhlsson
Added following support:
334
  if (ret != GNUTLS_E_SUCCESS) {
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
335
    fprintf(stderr,
336
	    "Error[%d] while reading the OpenPGP key pair ('%s',"
337
	    " '%s')\n", ret, pubkeyfile, seckeyfile);
338
    fprintf(stdout, "The GnuTLS error is: %s\n",
13 by Björn Påhlsson
Added following support:
339
	    safer_gnutls_strerror(ret));
24.1.20 by Björn Påhlsson
mandosclient
340
    goto globalfail;
13 by Björn Påhlsson
Added following support:
341
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
342
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
343
  /* GnuTLS server initialization */
24.1.13 by Björn Påhlsson
mandosclient
344
  ret = gnutls_dh_params_init(&mc->dh_params);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
345
  if (ret != GNUTLS_E_SUCCESS) {
346
    fprintf (stderr, "Error in GnuTLS DH parameter initialization:"
347
	     " %s\n", safer_gnutls_strerror(ret));
24.1.20 by Björn Påhlsson
mandosclient
348
    goto globalfail;
13 by Björn Påhlsson
Added following support:
349
  }
24.1.13 by Björn Påhlsson
mandosclient
350
  ret = gnutls_dh_params_generate2(mc->dh_params, mc->dh_bits);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
351
  if (ret != GNUTLS_E_SUCCESS) {
352
    fprintf (stderr, "Error in GnuTLS prime generation: %s\n",
13 by Björn Påhlsson
Added following support:
353
	     safer_gnutls_strerror(ret));
24.1.20 by Björn Påhlsson
mandosclient
354
    goto globalfail;
13 by Björn Påhlsson
Added following support:
355
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
356
  
24.1.13 by Björn Påhlsson
mandosclient
357
  gnutls_certificate_set_dh_params(mc->cred, mc->dh_params);
358
359
  return 0;
24.1.20 by Björn Påhlsson
mandosclient
360
361
 globalfail:
362
363
  gnutls_certificate_free_credentials (mc->cred);
364
  gnutls_global_deinit ();
365
  return -1;
366
24.1.13 by Björn Påhlsson
mandosclient
367
}
368
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
369
static int init_gnutls_session(mandos_context *mc,
370
			       gnutls_session_t *session){
24.1.13 by Björn Påhlsson
mandosclient
371
  int ret;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
372
  /* GnuTLS session creation */
373
  ret = gnutls_init(session, GNUTLS_SERVER);
374
  if (ret != GNUTLS_E_SUCCESS){
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
375
    fprintf(stderr, "Error in GnuTLS session initialization: %s\n",
13 by Björn Påhlsson
Added following support:
376
	    safer_gnutls_strerror(ret));
377
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
378
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
379
  {
380
    const char *err;
381
    ret = gnutls_priority_set_direct(*session, mc->priority, &err);
382
    if (ret != GNUTLS_E_SUCCESS) {
383
      fprintf(stderr, "Syntax error at: %s\n", err);
384
      fprintf(stderr, "GnuTLS error: %s\n",
385
	      safer_gnutls_strerror(ret));
24.1.20 by Björn Påhlsson
mandosclient
386
      gnutls_deinit (*session);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
387
      return -1;
388
    }
13 by Björn Påhlsson
Added following support:
389
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
390
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
391
  ret = gnutls_credentials_set(*session, GNUTLS_CRD_CERTIFICATE,
392
			       mc->cred);
393
  if (ret != GNUTLS_E_SUCCESS) {
394
    fprintf(stderr, "Error setting GnuTLS credentials: %s\n",
13 by Björn Påhlsson
Added following support:
395
	    safer_gnutls_strerror(ret));
24.1.20 by Björn Påhlsson
mandosclient
396
    gnutls_deinit (*session);
13 by Björn Påhlsson
Added following support:
397
    return -1;
398
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
399
  
13 by Björn Påhlsson
Added following support:
400
  /* ignore client certificate if any. */
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
401
  gnutls_certificate_server_set_request (*session,
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
402
					 GNUTLS_CERT_IGNORE);
13 by Björn Påhlsson
Added following support:
403
  
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
404
  gnutls_dh_set_prime_bits (*session, mc->dh_bits);
13 by Björn Påhlsson
Added following support:
405
  
406
  return 0;
407
}
408
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
409
/* Avahi log function callback */
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
410
static void empty_log(__attribute__((unused)) AvahiLogLevel level,
411
		      __attribute__((unused)) const char *txt){}
13 by Björn Påhlsson
Added following support:
412
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
413
/* Called when a Mandos server is found */
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
414
static int start_mandos_communication(const char *ip, uint16_t port,
24.1.9 by Björn Påhlsson
not working midwork...
415
				      AvahiIfIndex if_index,
416
				      mandos_context *mc){
13 by Björn Påhlsson
Added following support:
417
  int ret, tcp_sd;
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
418
  union { struct sockaddr in; struct sockaddr_in6 in6; } to;
13 by Björn Påhlsson
Added following support:
419
  char *buffer = NULL;
420
  char *decrypted_buffer;
421
  size_t buffer_length = 0;
422
  size_t buffer_capacity = 0;
423
  ssize_t decrypted_buffer_size;
24.1.10 by Björn Påhlsson
merge commit
424
  size_t written;
13 by Björn Påhlsson
Added following support:
425
  int retval = 0;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
426
  char interface[IF_NAMESIZE];
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
427
  gnutls_session_t session;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
428
  
24.1.13 by Björn Påhlsson
mandosclient
429
  ret = init_gnutls_session (mc, &session);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
430
  if (ret != 0){
431
    return -1;
432
  }
433
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
434
  if(debug){
28 by Teddy Hogeborn
* server.conf: New file.
435
    fprintf(stderr, "Setting up a tcp connection to %s, port %d\n",
436
	    ip, port);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
437
  }
13 by Björn Påhlsson
Added following support:
438
  
439
  tcp_sd = socket(PF_INET6, SOCK_STREAM, 0);
440
  if(tcp_sd < 0) {
441
    perror("socket");
442
    return -1;
443
  }
24.1.6 by Björn Påhlsson
plugbasedclient
444
445
  if(debug){
24.1.7 by Björn Påhlsson
merge
446
    if(if_indextoname((unsigned int)if_index, interface) == NULL){
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
447
      perror("if_indextoname");
24.1.6 by Björn Påhlsson
plugbasedclient
448
      return -1;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
449
    }
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
450
    fprintf(stderr, "Binding to interface %s\n", interface);
451
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
452
  
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
453
  memset(&to,0,sizeof(to));	/* Spurious warning */
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
454
  to.in6.sin6_family = AF_INET6;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
455
  /* It would be nice to have a way to detect if we were passed an
456
     IPv4 address here.   Now we assume an IPv6 address. */
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
457
  ret = inet_pton(AF_INET6, ip, &to.in6.sin6_addr);
13 by Björn Påhlsson
Added following support:
458
  if (ret < 0 ){
459
    perror("inet_pton");
460
    return -1;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
461
  }
13 by Björn Påhlsson
Added following support:
462
  if(ret == 0){
463
    fprintf(stderr, "Bad address: %s\n", ip);
464
    return -1;
465
  }
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
466
  to.in6.sin6_port = htons(port);	/* Spurious warning */
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
467
  
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
468
  to.in6.sin6_scope_id = (uint32_t)if_index;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
469
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
470
  if(debug){
28 by Teddy Hogeborn
* server.conf: New file.
471
    fprintf(stderr, "Connection to: %s, port %d\n", ip, port);
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
472
    char addrstr[INET6_ADDRSTRLEN] = "";
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
473
    if(inet_ntop(to.in6.sin6_family, &(to.in6.sin6_addr), addrstr,
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
474
		 sizeof(addrstr)) == NULL){
475
      perror("inet_ntop");
476
    } else {
477
      if(strcmp(addrstr, ip) != 0){
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
478
	fprintf(stderr, "Canonical address form: %s\n", addrstr);
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
479
      }
480
    }
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
481
  }
13 by Björn Påhlsson
Added following support:
482
  
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
483
  ret = connect(tcp_sd, &to.in, sizeof(to));
13 by Björn Påhlsson
Added following support:
484
  if (ret < 0){
485
    perror("connect");
486
    return -1;
487
  }
24.1.10 by Björn Påhlsson
merge commit
488
24.1.12 by Björn Påhlsson
merge +
489
  const char *out = mandos_protocol_version;
24.1.10 by Björn Påhlsson
merge commit
490
  written = 0;
491
  while (true){
492
    size_t out_size = strlen(out);
493
    ret = TEMP_FAILURE_RETRY(write(tcp_sd, out + written,
494
				   out_size - written));
495
    if (ret == -1){
496
      perror("write");
497
      retval = -1;
24.1.12 by Björn Påhlsson
merge +
498
      goto mandos_end;
24.1.10 by Björn Påhlsson
merge commit
499
    }
24.1.12 by Björn Påhlsson
merge +
500
    written += (size_t)ret;
24.1.10 by Björn Påhlsson
merge commit
501
    if(written < out_size){
502
      continue;
503
    } else {
504
      if (out == mandos_protocol_version){
505
	written = 0;
506
	out = "\r\n";
507
      } else {
508
	break;
509
      }
510
    }
511
  }
512
 
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
513
  if(debug){
514
    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
515
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
516
  
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
517
  gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) tcp_sd);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
518
  
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
519
  ret = gnutls_handshake (session);
13 by Björn Påhlsson
Added following support:
520
  
521
  if (ret != GNUTLS_E_SUCCESS){
25 by Teddy Hogeborn
* mandos-clients.conf ([DEFAULT]): New section.
522
    if(debug){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
523
      fprintf(stderr, "*** GnuTLS Handshake failed ***\n");
25 by Teddy Hogeborn
* mandos-clients.conf ([DEFAULT]): New section.
524
      gnutls_perror (ret);
525
    }
13 by Björn Påhlsson
Added following support:
526
    retval = -1;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
527
    goto mandos_end;
13 by Björn Påhlsson
Added following support:
528
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
529
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
530
  /* Read OpenPGP packet that contains the wanted password */
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
531
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
532
  if(debug){
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
533
    fprintf(stderr, "Retrieving pgp encrypted password from %s\n",
534
	    ip);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
535
  }
536
13 by Björn Påhlsson
Added following support:
537
  while(true){
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
538
    buffer_capacity = adjustbuffer(&buffer, buffer_length,
539
				   buffer_capacity);
24.1.10 by Björn Påhlsson
merge commit
540
    if (buffer_capacity == 0){
541
      perror("adjustbuffer");
542
      retval = -1;
24.1.12 by Björn Påhlsson
merge +
543
      goto mandos_end;
13 by Björn Påhlsson
Added following support:
544
    }
545
    
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
546
    ret = gnutls_record_recv(session, buffer+buffer_length,
547
			     BUFFER_SIZE);
13 by Björn Påhlsson
Added following support:
548
    if (ret == 0){
549
      break;
550
    }
551
    if (ret < 0){
552
      switch(ret){
553
      case GNUTLS_E_INTERRUPTED:
554
      case GNUTLS_E_AGAIN:
555
	break;
556
      case GNUTLS_E_REHANDSHAKE:
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
557
	ret = gnutls_handshake (session);
13 by Björn Påhlsson
Added following support:
558
	if (ret < 0){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
559
	  fprintf(stderr, "*** GnuTLS Re-handshake failed ***\n");
13 by Björn Påhlsson
Added following support:
560
	  gnutls_perror (ret);
561
	  retval = -1;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
562
	  goto mandos_end;
13 by Björn Påhlsson
Added following support:
563
	}
564
	break;
565
      default:
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
566
	fprintf(stderr, "Unknown error while reading data from"
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
567
		" encrypted session with Mandos server\n");
13 by Björn Påhlsson
Added following support:
568
	retval = -1;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
569
	gnutls_bye (session, GNUTLS_SHUT_RDWR);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
570
	goto mandos_end;
13 by Björn Påhlsson
Added following support:
571
      }
572
    } else {
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
573
      buffer_length += (size_t) ret;
13 by Björn Påhlsson
Added following support:
574
    }
575
  }
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
576
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
577
  if(debug){
578
    fprintf(stderr, "Closing TLS session\n");
579
  }
580
  
581
  gnutls_bye (session, GNUTLS_SHUT_RDWR);
582
  
13 by Björn Påhlsson
Added following support:
583
  if (buffer_length > 0){
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
584
    decrypted_buffer_size = pgp_packet_decrypt(buffer,
585
					       buffer_length,
586
					       &decrypted_buffer,
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
587
					       keydir);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
588
    if (decrypted_buffer_size >= 0){
24.1.10 by Björn Påhlsson
merge commit
589
      written = 0;
28 by Teddy Hogeborn
* server.conf: New file.
590
      while(written < (size_t) decrypted_buffer_size){
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
591
	ret = (int)fwrite (decrypted_buffer + written, 1,
592
			   (size_t)decrypted_buffer_size - written,
593
			   stdout);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
594
	if(ret == 0 and ferror(stdout)){
595
	  if(debug){
596
	    fprintf(stderr, "Error writing encrypted data: %s\n",
597
		    strerror(errno));
598
	  }
599
	  retval = -1;
600
	  break;
601
	}
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
602
	written += (size_t)ret;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
603
      }
13 by Björn Påhlsson
Added following support:
604
      free(decrypted_buffer);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
605
    } else {
606
      retval = -1;
13 by Björn Påhlsson
Added following support:
607
    }
608
  }
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
609
  
610
  /* Shutdown procedure */
611
  
612
 mandos_end:
13 by Björn Påhlsson
Added following support:
613
  free(buffer);
614
  close(tcp_sd);
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
615
  gnutls_deinit (session);
13 by Björn Påhlsson
Added following support:
616
  return retval;
617
}
618
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
619
static void resolve_callback(AvahiSServiceResolver *r,
620
			     AvahiIfIndex interface,
621
			     AVAHI_GCC_UNUSED AvahiProtocol protocol,
622
			     AvahiResolverEvent event,
623
			     const char *name,
624
			     const char *type,
625
			     const char *domain,
626
			     const char *host_name,
627
			     const AvahiAddress *address,
628
			     uint16_t port,
629
			     AVAHI_GCC_UNUSED AvahiStringList *txt,
630
			     AVAHI_GCC_UNUSED AvahiLookupResultFlags
631
			     flags,
632
			     void* userdata) {
24.1.9 by Björn Påhlsson
not working midwork...
633
  mandos_context *mc = userdata;
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
634
  assert(r);			/* Spurious warning */
635
  
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
636
  /* Called whenever a service has been resolved successfully or
637
     timed out */
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
638
  
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
639
  switch (event) {
640
  default:
641
  case AVAHI_RESOLVER_FAILURE:
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
642
    fprintf(stderr, "(Avahi Resolver) Failed to resolve service '%s'"
643
	    " of type '%s' in domain '%s': %s\n", name, type, domain,
24.1.9 by Björn Påhlsson
not working midwork...
644
	    avahi_strerror(avahi_server_errno(mc->server)));
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
645
    break;
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
646
    
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
647
  case AVAHI_RESOLVER_FOUND:
648
    {
649
      char ip[AVAHI_ADDRESS_STR_MAX];
650
      avahi_address_snprint(ip, sizeof(ip), address);
651
      if(debug){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
652
	fprintf(stderr, "Mandos server \"%s\" found on %s (%s, %d) on"
653
		" port %d\n", name, host_name, ip, interface, port);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
654
      }
24.1.9 by Björn Påhlsson
not working midwork...
655
      int ret = start_mandos_communication(ip, port, interface, mc);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
656
      if (ret == 0){
657
	exit(EXIT_SUCCESS);
658
      }
13 by Björn Påhlsson
Added following support:
659
    }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
660
  }
661
  avahi_s_service_resolver_free(r);
13 by Björn Påhlsson
Added following support:
662
}
663
24.1.9 by Björn Påhlsson
not working midwork...
664
static void browse_callback( AvahiSServiceBrowser *b,
665
			     AvahiIfIndex interface,
666
			     AvahiProtocol protocol,
667
			     AvahiBrowserEvent event,
668
			     const char *name,
669
			     const char *type,
670
			     const char *domain,
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
671
			     AVAHI_GCC_UNUSED AvahiLookupResultFlags
672
			     flags,
24.1.9 by Björn Påhlsson
not working midwork...
673
			     void* userdata) {
674
  mandos_context *mc = userdata;
675
  assert(b);			/* Spurious warning */
676
  
677
  /* Called whenever a new services becomes available on the LAN or
678
     is removed from the LAN */
679
  
680
  switch (event) {
681
  default:
682
  case AVAHI_BROWSER_FAILURE:
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
683
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
684
    fprintf(stderr, "(Avahi browser) %s\n",
24.1.9 by Björn Påhlsson
not working midwork...
685
	    avahi_strerror(avahi_server_errno(mc->server)));
686
    avahi_simple_poll_quit(mc->simple_poll);
687
    return;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
688
    
24.1.9 by Björn Påhlsson
not working midwork...
689
  case AVAHI_BROWSER_NEW:
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
690
    /* We ignore the returned Avahi resolver object. In the callback
691
       function we free it. If the Avahi server is terminated before
692
       the callback function is called the Avahi server will free the
693
       resolver for us. */
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
694
    
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
695
    if (!(avahi_s_service_resolver_new(mc->server, interface,
696
				       protocol, name, type, domain,
24.1.9 by Björn Påhlsson
not working midwork...
697
				       AVAHI_PROTO_INET6, 0,
698
				       resolve_callback, mc)))
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
699
      fprintf(stderr, "Avahi: Failed to resolve service '%s': %s\n",
700
	      name, avahi_strerror(avahi_server_errno(mc->server)));
24.1.9 by Björn Påhlsson
not working midwork...
701
    break;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
702
    
24.1.9 by Björn Påhlsson
not working midwork...
703
  case AVAHI_BROWSER_REMOVE:
704
    break;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
705
    
24.1.9 by Björn Påhlsson
not working midwork...
706
  case AVAHI_BROWSER_ALL_FOR_NOW:
707
  case AVAHI_BROWSER_CACHE_EXHAUSTED:
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
708
    if(debug){
709
      fprintf(stderr, "No Mandos server found, still searching...\n");
710
    }
24.1.9 by Björn Påhlsson
not working midwork...
711
    break;
712
  }
13 by Björn Påhlsson
Added following support:
713
}
714
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
715
/* Combines file name and path and returns the malloced new
716
   string. some sane checks could/should be added */
717
static const char *combinepath(const char *first, const char *second){
718
  size_t f_len = strlen(first);
719
  size_t s_len = strlen(second);
720
  char *tmp = malloc(f_len + s_len + 2);
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.
721
  if (tmp == NULL){
722
    return NULL;
723
  }
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
724
  if(f_len > 0){
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
725
    memcpy(tmp, first, f_len);	/* Spurious warning */
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
726
  }
727
  tmp[f_len] = '/';
728
  if(s_len > 0){
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
729
    memcpy(tmp + f_len + 1, second, s_len); /* Spurious warning */
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
730
  }
731
  tmp[f_len + 1 + s_len] = '\0';
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.
732
  return tmp;
733
}
734
735
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
736
int main(int argc, char *argv[]){
13 by Björn Påhlsson
Added following support:
737
    AvahiSServiceBrowser *sb = NULL;
738
    int error;
15.1.3 by Björn Påhlsson
Added getopt_long support for mandosclient and passprompt
739
    int ret;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
740
    int exitcode = EXIT_SUCCESS;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
741
    const char *interface = "eth0";
24.1.6 by Björn Påhlsson
plugbasedclient
742
    struct ifreq network;
743
    int sd;
24.1.13 by Björn Påhlsson
mandosclient
744
    uid_t uid;
745
    gid_t gid;
24.1.7 by Björn Påhlsson
merge
746
    char *connect_to = NULL;
29 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Changed
747
    AvahiIfIndex if_index = AVAHI_IF_UNSPEC;
24.1.14 by Björn Påhlsson
mandosclient
748
    const char *pubkeyfile = "pubkey.txt";
749
    const char *seckeyfile = "seckey.txt";
24.1.9 by Björn Påhlsson
not working midwork...
750
    mandos_context mc = { .simple_poll = NULL, .server = NULL,
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
751
			  .dh_bits = 1024, .priority = "SECURE256"};
24.1.20 by Björn Påhlsson
mandosclient
752
    bool gnutls_initalized = false;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
753
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
754
    {
24.1.14 by Björn Påhlsson
mandosclient
755
      struct argp_option options[] = {
756
	{ .name = "debug", .key = 128,
757
	  .doc = "Debug mode", .group = 3 },
758
	{ .name = "connect", .key = 'c',
759
	  .arg = "IP",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
760
	  .doc = "Connect directly to a sepcified mandos server",
761
	  .group = 1 },
24.1.14 by Björn Påhlsson
mandosclient
762
	{ .name = "interface", .key = 'i',
763
	  .arg = "INTERFACE",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
764
	  .doc = "Interface that Avahi will conntect through",
765
	  .group = 1 },
24.1.14 by Björn Påhlsson
mandosclient
766
	{ .name = "keydir", .key = 'd',
767
	  .arg = "KEYDIR",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
768
	  .doc = "Directory where the openpgp keyring is",
769
	  .group = 1 },
24.1.14 by Björn Påhlsson
mandosclient
770
	{ .name = "seckey", .key = 's',
771
	  .arg = "SECKEY",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
772
	  .doc = "Secret openpgp key for gnutls authentication",
773
	  .group = 1 },
24.1.14 by Björn Påhlsson
mandosclient
774
	{ .name = "pubkey", .key = 'p',
775
	  .arg = "PUBKEY",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
776
	  .doc = "Public openpgp key for gnutls authentication",
777
	  .group = 2 },
24.1.14 by Björn Påhlsson
mandosclient
778
	{ .name = "dh-bits", .key = 129,
779
	  .arg = "BITS",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
780
	  .doc = "dh-bits to use in gnutls communication",
781
	  .group = 2 },
24.1.14 by Björn Påhlsson
mandosclient
782
	{ .name = "priority", .key = 130,
783
	  .arg = "PRIORITY",
784
	  .doc = "GNUTLS priority", .group = 1 },
785
	{ .name = NULL }
786
      };
787
788
      
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
789
      error_t parse_opt (int key, char *arg,
790
			 struct argp_state *state) {
791
	/* Get the INPUT argument from `argp_parse', which we know is
792
	   a pointer to our plugin list pointer. */
24.1.14 by Björn Påhlsson
mandosclient
793
	switch (key) {
794
	case 128:
795
	  debug = true;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
796
	  break;
24.1.14 by Björn Påhlsson
mandosclient
797
	case 'c':
798
	  connect_to = arg;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
799
	  break;
800
	case 'i':
24.1.14 by Björn Påhlsson
mandosclient
801
	  interface = arg;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
802
	  break;
803
	case 'd':
24.1.14 by Björn Påhlsson
mandosclient
804
	  keydir = arg;
805
	  break;
806
	case 's':
807
	  seckeyfile = arg;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
808
	  break;
809
	case 'p':
24.1.14 by Björn Påhlsson
mandosclient
810
	  pubkeyfile = arg;
811
	  break;
812
	case 129:
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
813
	  errno = 0;
24.1.14 by Björn Påhlsson
mandosclient
814
	  mc.dh_bits = (unsigned int) strtol(arg, NULL, 10);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
815
	  if (errno){
816
	    perror("strtol");
817
	    exit(EXIT_FAILURE);
818
	  }
819
	  break;
24.1.14 by Björn Påhlsson
mandosclient
820
	case 130:
821
	  mc.priority = arg;
822
	  break;
823
	case ARGP_KEY_ARG:
824
	  argp_usage (state);
825
	  break;
826
	  case ARGP_KEY_END:
827
	    break;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
828
	default:
24.1.14 by Björn Påhlsson
mandosclient
829
	  return ARGP_ERR_UNKNOWN;
24.1.9 by Björn Påhlsson
not working midwork...
830
	}
24.1.14 by Björn Påhlsson
mandosclient
831
	return 0;
15.1.3 by Björn Påhlsson
Added getopt_long support for mandosclient and passprompt
832
      }
24.1.14 by Björn Påhlsson
mandosclient
833
834
      struct argp argp = { .options = options, .parser = parse_opt,
835
			   .args_doc = "",
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
836
			   .doc = "Mandos client -- Get and decrypt"
837
			   " passwords from mandos server" };
24.1.14 by Björn Påhlsson
mandosclient
838
      argp_parse (&argp, argc, argv, 0, 0, NULL);
15.1.3 by Björn Påhlsson
Added getopt_long support for mandosclient and passprompt
839
    }
24.1.14 by Björn Påhlsson
mandosclient
840
      
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
841
    pubkeyfile = combinepath(keydir, pubkeyfile);
842
    if (pubkeyfile == NULL){
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
843
      perror("combinepath");
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
844
      exitcode = EXIT_FAILURE;
845
      goto end;
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.
846
    }
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
847
    
848
    seckeyfile = combinepath(keydir, seckeyfile);
849
    if (seckeyfile == NULL){
24.1.7 by Björn Påhlsson
merge
850
      perror("combinepath");
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
851
      goto end;
24.1.6 by Björn Påhlsson
plugbasedclient
852
    }
24.1.13 by Björn Påhlsson
mandosclient
853
24.1.14 by Björn Påhlsson
mandosclient
854
    ret = init_gnutls_global(&mc, pubkeyfile, seckeyfile);
24.1.13 by Björn Påhlsson
mandosclient
855
    if (ret == -1){
856
      fprintf(stderr, "init_gnutls_global\n");
857
      goto end;
24.1.20 by Björn Påhlsson
mandosclient
858
    } else {
859
      gnutls_initalized = true;
24.1.13 by Björn Påhlsson
mandosclient
860
    }
861
862
    uid = getuid();
863
    gid = getgid();
864
865
    ret = setuid(uid);
866
    if (ret == -1){
867
      perror("setuid");
868
    }
869
    
870
    setgid(gid);
871
    if (ret == -1){
872
      perror("setgid");
873
    }
15.1.3 by Björn Påhlsson
Added getopt_long support for mandosclient and passprompt
874
    
24.1.7 by Björn Påhlsson
merge
875
    if_index = (AvahiIfIndex) if_nametoindex(interface);
876
    if(if_index == 0){
877
      fprintf(stderr, "No such interface: \"%s\"\n", interface);
878
      exit(EXIT_FAILURE);
28 by Teddy Hogeborn
* server.conf: New file.
879
    }
880
    
881
    if(connect_to != NULL){
882
      /* Connect directly, do not use Zeroconf */
883
      /* (Mainly meant for debugging) */
884
      char *address = strrchr(connect_to, ':');
885
      if(address == NULL){
886
        fprintf(stderr, "No colon in address\n");
24.1.13 by Björn Påhlsson
mandosclient
887
	exitcode = EXIT_FAILURE;
888
	goto end;
28 by Teddy Hogeborn
* server.conf: New file.
889
      }
890
      errno = 0;
891
      uint16_t port = (uint16_t) strtol(address+1, NULL, 10);
892
      if(errno){
893
	perror("Bad port number");
24.1.13 by Björn Påhlsson
mandosclient
894
	exitcode = EXIT_FAILURE;
895
	goto end;
28 by Teddy Hogeborn
* server.conf: New file.
896
      }
897
      *address = '\0';
898
      address = connect_to;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
899
      ret = start_mandos_communication(address, port, if_index, &mc);
28 by Teddy Hogeborn
* server.conf: New file.
900
      if(ret < 0){
24.1.13 by Björn Påhlsson
mandosclient
901
	exitcode = EXIT_FAILURE;
28 by Teddy Hogeborn
* server.conf: New file.
902
      } else {
24.1.13 by Björn Påhlsson
mandosclient
903
	exitcode = EXIT_SUCCESS;
28 by Teddy Hogeborn
* server.conf: New file.
904
      }
24.1.13 by Björn Påhlsson
mandosclient
905
      goto end;
28 by Teddy Hogeborn
* server.conf: New file.
906
    }
907
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
908
    /* If the interface is down, bring it up */
909
    {
910
      sd = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP);
911
      if(sd < 0) {
912
	perror("socket");
913
	exitcode = EXIT_FAILURE;
914
	goto end;
915
      }
916
      strcpy(network.ifr_name, interface); /* Spurious warning */
917
      ret = ioctl(sd, SIOCGIFFLAGS, &network);
24.1.6 by Björn Påhlsson
plugbasedclient
918
      if(ret == -1){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
919
	perror("ioctl SIOCGIFFLAGS");
920
	exitcode = EXIT_FAILURE;
921
	goto end;
922
      }
923
      if((network.ifr_flags & IFF_UP) == 0){
924
	network.ifr_flags |= IFF_UP;
925
	ret = ioctl(sd, SIOCSIFFLAGS, &network);
926
	if(ret == -1){
927
	  perror("ioctl SIOCSIFFLAGS");
928
	  exitcode = EXIT_FAILURE;
929
	  goto end;
930
	}
931
      }
932
      close(sd);
24.1.6 by Björn Påhlsson
plugbasedclient
933
    }
934
    
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
935
    if (not debug){
936
      avahi_set_log_function(empty_log);
937
    }
13 by Björn Påhlsson
Added following support:
938
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
939
    /* Initialize the pseudo-RNG for Avahi */
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
940
    srand((unsigned int) time(NULL));
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
941
    
942
    /* Allocate main Avahi loop object */
943
    mc.simple_poll = avahi_simple_poll_new();
944
    if (mc.simple_poll == NULL) {
945
        fprintf(stderr, "Avahi: Failed to create simple poll"
946
		" object.\n");
947
	exitcode = EXIT_FAILURE;
948
        goto end;
949
    }
950
951
    {
952
      AvahiServerConfig config;
953
      /* Do not publish any local Zeroconf records */
954
      avahi_server_config_init(&config);
955
      config.publish_hinfo = 0;
956
      config.publish_addresses = 0;
957
      config.publish_workstation = 0;
958
      config.publish_domain = 0;
959
960
      /* Allocate a new server */
961
      mc.server = avahi_server_new(avahi_simple_poll_get
962
				   (mc.simple_poll), &config, NULL,
963
				   NULL, &error);
964
    
965
      /* Free the Avahi configuration data */
966
      avahi_server_config_free(&config);
967
    }
968
    
969
    /* Check if creating the Avahi server object succeeded */
970
    if (mc.server == NULL) {
971
        fprintf(stderr, "Failed to create Avahi server: %s\n",
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
972
		avahi_strerror(error));
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
973
	exitcode = EXIT_FAILURE;
974
        goto end;
13 by Björn Påhlsson
Added following support:
975
    }
976
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
977
    /* Create the Avahi service browser */
24.1.9 by Björn Påhlsson
not working midwork...
978
    sb = avahi_s_service_browser_new(mc.server, if_index,
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
979
				     AVAHI_PROTO_INET6,
980
				     "_mandos._tcp", NULL, 0,
24.1.9 by Björn Påhlsson
not working midwork...
981
				     browse_callback, &mc);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
982
    if (sb == NULL) {
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
983
        fprintf(stderr, "Failed to create service browser: %s\n",
24.1.9 by Björn Påhlsson
not working midwork...
984
		avahi_strerror(avahi_server_errno(mc.server)));
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
985
	exitcode = EXIT_FAILURE;
986
        goto end;
13 by Björn Påhlsson
Added following support:
987
    }
988
    
989
    /* Run the main loop */
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
990
991
    if (debug){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
992
      fprintf(stderr, "Starting Avahi loop search\n");
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
993
    }
994
    
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
995
    avahi_simple_poll_loop(mc.simple_poll);
13 by Björn Påhlsson
Added following support:
996
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
997
 end:
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
998
999
    if (debug){
1000
      fprintf(stderr, "%s exiting\n", argv[0]);
1001
    }
13 by Björn Påhlsson
Added following support:
1002
    
1003
    /* Cleanup things */
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1004
    if (sb != NULL)
13 by Björn Påhlsson
Added following support:
1005
        avahi_s_service_browser_free(sb);
1006
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1007
    if (mc.server != NULL)
24.1.9 by Björn Påhlsson
not working midwork...
1008
        avahi_server_free(mc.server);
13 by Björn Påhlsson
Added following support:
1009
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1010
    if (mc.simple_poll != NULL)
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
1011
        avahi_simple_poll_free(mc.simple_poll);
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
1012
    free(pubkeyfile);
1013
    free(seckeyfile);
24.1.20 by Björn Påhlsson
mandosclient
1014
1015
    if (gnutls_initalized){
1016
      gnutls_certificate_free_credentials (mc.cred);
1017
      gnutls_global_deinit ();
1018
    }
24.1.5 by Björn Påhlsson
plugbasedclient:
1019
    
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1020
    return exitcode;
13 by Björn Påhlsson
Added following support:
1021
}