2 Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
3 Ben Kibbey <bjk@luxsci.net>
5 This file is part of pwmd.
7 Pwmd is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 2 of the License, or
10 (at your option) any later version.
12 Pwmd is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Pwmd. If not, see <http://www.gnu.org/licenses/>.
30 #include <sys/socket.h>
44 #include <netinet/in.h>
45 #include <arpa/inet.h>
48 #include <sys/resource.h>
62 #ifdef HAVE_GETOPT_LONG
67 #include "getopt_long.h"
70 #ifdef HAVE_PR_SET_NAME
71 #include <sys/prctl.h>
74 #include "pwmd-error.h"
77 #include "util-misc.h"
83 #include "util-string.h"
90 /* In tenths of a second. */
93 /* For (tcp_)accept_thread (usec). */
94 #define ACCEPT_TIMEOUT 30000
101 static pthread_cond_t quit_cond
;
102 static pthread_mutex_t quit_mutex
;
103 static int no_passphrase_file
= 0;
104 static pthread_t keepalive_tid
;
106 #ifndef HAVE_PTHREAD_CANCEL
107 static pthread_key_t signal_thread_key
;
113 static pthread_t tls_tid
;
114 static pthread_t tls6_tid
;
115 static int spawned_tls
;
116 static int spawned_tls6
;
118 static int start_stop_tls (int term
);
121 static int do_cache_push (const char *filename
, struct crypto_s
*crypto
);
122 static int signal_loop (sigset_t sigset
);
124 GCRY_THREAD_OPTION_PTHREAD_IMPL
;
126 #ifndef HAVE_PTHREAD_CANCEL
127 #define INIT_THREAD_SIGNAL do { \
128 struct sigaction act; \
130 sigemptyset (&sigset); \
131 sigaddset (&sigset, SIGUSR2); \
132 pthread_sigmask (SIG_UNBLOCK, &sigset, NULL); \
133 memset (&act, 0, sizeof(act)); \
134 act.sa_flags = SA_SIGINFO; \
135 act.sa_mask = sigset; \
136 act.sa_sigaction = catch_thread_signal; \
137 sigaction (SIGUSR2, &act, NULL); \
141 catch_thread_signal (int sig
, siginfo_t
*info
, void *ctx
)
143 int *n
= (int *) pthread_getspecific (signal_thread_key
);
146 pthread_setspecific (signal_thread_key
, n
);
151 cache_push_from_rcfile ()
153 struct crypto_s
*crypto
= NULL
;
155 gpg_error_t rc
= init_client_crypto (&crypto
);
159 log_write ("%s: %s", __FUNCTION__
, pwmd_strerror (rc
));
166 rc
= set_agent_option (crypto
->agent
, "pinentry-mode", "error");
169 log_write ("%s: %s", __FUNCTION__
, pwmd_strerror (rc
));
175 cache_push
= config_get_list ("global", "cache_push");
180 for (p
= cache_push
; *p
; p
++)
182 (void) do_cache_push (*p
, crypto
);
183 cleanup_crypto_stage1 (crypto
);
186 strv_free (cache_push
);
190 (void) kill_scd (crypto
->agent
);
192 cleanup_crypto (&crypto
);
198 int n
= config_get_boolean ("global", "enable_logging");
202 char *p
= config_get_string ("global", "log_path");
205 logfile
= expand_homedir (p
);
214 log_syslog
= config_get_boolean ("global", "syslog");
216 openlog ("pwmd", LOG_NDELAY
| LOG_PID
, LOG_DAEMON
);
220 reload_rcfile_thread (void *arg
)
222 #ifndef HAVE_PTHREAD_CANCEL
223 int *n
= xmalloc (sizeof (int));
226 pthread_setspecific (signal_thread_key
, n
);
230 #ifdef HAVE_PR_SET_NAME
231 prctl (PR_SET_NAME
, "reload rcfile");
233 pthread_setspecific (thread_name_key
, str_dup (__FUNCTION__
));
234 MUTEX_LOCK (&rcfile_mutex
);
235 pthread_cleanup_push (cleanup_mutex_cb
, &rcfile_mutex
);
239 struct allowed_users_s
244 struct slist_s
*allowed_users
= NULL
;
245 struct slist_s
*config
;
246 int b
= disable_list_and_dump
;
248 int require_save_key
= config_get_bool_param (global_config
, "global",
252 int tcp_require_key
= config_get_bool_param (global_config
, "global",
257 pthread_cond_wait (&rcfile_cond
, &rcfile_mutex
);
258 #ifndef HAVE_PTHREAD_CANCEL
259 int *cancel
= (int *) pthread_getspecific (signal_thread_key
);
264 /* Keep the "allowed" parameter across rcfile reloads to prevent
266 int n
, t
= slist_length (global_config
);
267 for (n
= 0; n
< t
; n
++)
269 struct allowed_users_s
*allowed
;
270 struct config_section_s
*section
;
273 section
= slist_nth_data (global_config
, n
);
274 users
= config_get_list_param (global_config
, section
->name
,
278 allowed
= xmalloc (sizeof(struct allowed_users_s
));
279 allowed
->section
= str_dup (section
->name
);
280 allowed
->users
= users
;
281 allowed_users
= slist_append (allowed_users
, allowed
);
285 log_write (_("reloading configuration file '%s'"), rcfile
);
286 config
= config_parse (rcfile
);
289 config_free (global_config
);
290 global_config
= config
;
292 cache_push_from_rcfile ();
293 config_clear_keys ();
296 disable_list_and_dump
= !disable_list_and_dump
? b
: 1;
297 config_set_bool_param (&global_config
, "global", "require_save_key",
298 require_save_key
? "true" : "false");
300 if (config_get_bool_param (global_config
, "global", "tcp_require_key",
304 config_set_bool_param (&global_config
, "global", "tcp_require_key",
305 tcp_require_key
? "true" : "false");
310 int n
, t
= slist_length (allowed_users
);
312 for (n
= 0; n
< t
; n
++)
314 struct allowed_users_s
*allowed
;
317 allowed
= slist_nth_data (allowed_users
, n
);
318 tmp
= strv_join (",", allowed
->users
);
319 config_set_list_param (&global_config
, allowed
->section
,
322 xfree (allowed
->section
);
323 strv_free (allowed
->users
);
327 slist_free (allowed_users
);
331 /* Kill existing listening threads since the configured listening
332 * protocols may have changed. */
338 pthread_cleanup_pop (1);
343 send_error (assuan_context_t ctx
, gpg_error_t e
)
345 struct client_s
*client
= assuan_get_pointer (ctx
);
347 if (gpg_err_source (e
) == GPG_ERR_SOURCE_UNKNOWN
)
354 return assuan_process_done (ctx
, 0);
358 log_write ("ERR %i: %s", e
, pwmd_strerror (e
));
362 if (client
&& gpg_err_code (e
) == GPG_ERR_BAD_DATA
)
364 xmlErrorPtr xe
= client
->xml_error
;
367 xe
= xmlGetLastError ();
370 log_write ("%s", xe
->message
);
371 if (client
->last_error
)
372 xfree (client
->last_error
);
374 client
->last_error
= str_dup (xe
->message
);
377 e
= assuan_process_done (ctx
, assuan_set_error (ctx
, e
,
381 if (xe
== client
->xml_error
)
384 xmlResetLastError ();
386 client
->xml_error
= NULL
;
390 return assuan_process_done (ctx
,
391 assuan_set_error (ctx
, e
, pwmd_strerror (e
)));
395 assuan_log_cb (assuan_context_t ctx
, void *data
, unsigned cat
,
398 static pthread_mutex_t m
= PTHREAD_MUTEX_INITIALIZER
;
402 pthread_mutex_lock (&m
);
403 pthread_cleanup_push ((void (*)(void *)) pthread_mutex_unlock
, &m
);
404 t
= strv_length (debug_level
);
406 for (i
= 0; i
< t
; i
++)
408 if (!strcasecmp (debug_level
[i
], (char *) "init")
409 && cat
== ASSUAN_LOG_INIT
)
415 if (!strcasecmp (debug_level
[i
], (char *) "ctx")
416 && cat
== ASSUAN_LOG_CTX
)
422 if (!strcasecmp (debug_level
[i
], (char *) "engine")
423 && cat
== ASSUAN_LOG_ENGINE
)
429 if (!strcasecmp (debug_level
[i
], (char *) "data")
430 && cat
== ASSUAN_LOG_DATA
)
436 if (!strcasecmp (debug_level
[i
], (char *) "sysio")
437 && cat
== ASSUAN_LOG_SYSIO
)
443 if (!strcasecmp (debug_level
[i
], (char *) "control")
444 && cat
== ASSUAN_LOG_CONTROL
)
458 open (logfile
, O_WRONLY
| O_CREAT
| O_APPEND
, 0600)) == -1)
459 warn ("%s", logfile
);
462 pthread_cleanup_push (cleanup_fd_cb
, &fd
);
463 write (fd
, msg
, strlen (msg
));
464 pthread_cleanup_pop (1);
470 fprintf (stderr
, "%s%s", data
? (char *) data
: "", msg
);
475 pthread_cleanup_pop (1);
480 log_write (const char *fmt
, ...)
490 pthread_t tid
= pthread_self ();
491 static pthread_mutex_t m
= PTHREAD_MUTEX_INITIALIZER
;
493 if ((!logfile
&& !isatty (STDERR_FILENO
) && !log_syslog
) || !fmt
)
496 pthread_mutex_lock (&m
);
497 pthread_cleanup_push ((void (*)(void *)) pthread_mutex_unlock
, &m
);
498 pthread_cleanup_push (cleanup_fd_cb
, &fd
);
500 if (!cmdline
&& logfile
)
502 if ((fd
= open (logfile
, O_WRONLY
| O_CREAT
| O_APPEND
, 0600)) == -1)
503 warn ("%s", logfile
);
508 if (str_vasprintf (&args
, fmt
, ap
) != -1)
512 pthread_cleanup_push (xfree
, args
);
513 fprintf (stderr
, "%s\n", args
);
515 pthread_cleanup_pop (1);
519 pthread_cleanup_push (xfree
, args
);
520 name
= pthread_getspecific (thread_name_key
);
521 snprintf (buf
, sizeof (buf
), "%s(%p): ", name
? name
: _("unknown"),
525 if (!cmdline
&& log_syslog
&& !nofork
)
526 syslog (LOG_INFO
, "%s%s", name
, args
);
529 tm
= localtime (&now
);
530 strftime (tbuf
, sizeof (tbuf
), "%b %d %Y %H:%M:%S ", tm
);
531 tbuf
[sizeof (tbuf
) - 1] = 0;
533 if (args
[strlen (args
) - 1] == '\n')
534 args
[strlen (args
) - 1] = 0;
536 line
= str_asprintf ("%s %i %s%s\n", tbuf
, getpid (), name
, args
);
537 pthread_cleanup_pop (1);
540 pthread_cleanup_push (xfree
, line
);
541 if (logfile
&& fd
!= -1)
543 write (fd
, line
, strlen (line
));
549 fprintf (stdout
, "%s", line
);
553 pthread_cleanup_pop (1);
559 pthread_cleanup_pop (1);
560 pthread_cleanup_pop (0);
561 pthread_mutex_unlock (&m
);
566 secure_mem_check (const void *arg
)
575 gcry_control (GCRYCTL_SET_THREAD_CBS
, &gcry_threads_pthread
);
577 if (!gcry_check_version (GCRYPT_VERSION
))
579 fprintf (stderr
, _("gcry_check_version(): Incompatible libgcrypt. "
580 "Wanted %s, got %s.\n"), GCRYPT_VERSION
,
581 gcry_check_version (NULL
));
582 return GPG_ERR_UNKNOWN_VERSION
;
585 gcry_set_allocation_handler (xmalloc
, xmalloc
, NULL
, xrealloc
, xfree
);
589 #ifdef HAVE_GETGRNAM_R
591 do_validate_peer (assuan_context_t ctx
, const char *section
,
592 assuan_peercred_t
* peer
)
598 rc
= assuan_get_peercred (ctx
, peer
);
602 users
= config_get_list (section
, "allowed");
605 for (char **p
= users
; *p
; p
++)
607 struct passwd pw
, *result
;
608 struct group gr
, *gresult
;
611 int deny
= (*user
== '-') ? 1 : 0;
616 if (*user
== '@') // all users in group
618 size_t len
= sysconf (_SC_GETGR_R_SIZE_MAX
);
627 return GPG_ERR_ENOMEM
;
631 if (!getgrnam_r (user
, &gr
, buf
, len
, &gresult
) && gresult
)
633 if (gresult
->gr_gid
== (*peer
)->gid
)
640 len
= sysconf (_SC_GETPW_R_SIZE_MAX
);
644 char *tbuf
= xmalloc (len
);
645 for (char **t
= gresult
->gr_mem
; *t
; t
++)
647 if (!getpwnam_r (*t
, &pw
, tbuf
, len
, &result
) && result
)
649 if (result
->pw_uid
== (*peer
)->uid
)
660 size_t len
= sysconf (_SC_GETPW_R_SIZE_MAX
);
670 return GPG_ERR_ENOMEM
;
673 if (!getpwnam_r (user
, &pw
, buf
, len
, &result
) && result
)
675 if (result
->pw_uid
== (*peer
)->uid
)
686 return allowed
? 0 : GPG_ERR_INV_USER_ID
;
690 do_validate_peer (assuan_context_t ctx
, const char *section
,
691 assuan_peercred_t
* peer
)
697 rc
= assuan_get_peercred (ctx
, peer
);
701 users
= config_get_list (section
, "allowed");
704 for (char **p
= users
; *p
; p
++)
706 struct passwd
*result
;
707 struct group
*gresult
;
709 int deny
= (*user
== '-') ? 1 : 0;
714 if (*user
== '@') // all users in group
717 gresult
= getgrnam (user
);
718 if (gresult
&& gresult
->gr_gid
== (*peer
)->gid
)
724 for (char **t
= gresult
->gr_mem
; *t
; t
++)
726 result
= getpwnam (*t
);
727 if (result
&& result
->pw_uid
== (*peer
)->uid
)
736 result
= getpwnam (user
);
737 if (result
&& result
->pw_uid
== (*peer
)->uid
)
745 return allowed
? 0 : GPG_ERR_INV_USER_ID
;
750 validate_peer (struct client_s
*cl
)
753 assuan_peercred_t peer
;
757 return tls_validate_access (cl
, NULL
);
760 rc
= do_validate_peer (cl
->ctx
, "global", &peer
);
761 if (!rc
|| gpg_err_code (rc
) == GPG_ERR_INV_USER_ID
)
762 log_write ("peer %s: uid=%i, gid=%i, pid=%i",
763 !rc
? _("accepted") : _("rejected"), peer
->uid
, peer
->gid
,
766 log_write ("%s: %s", __FUNCTION__
, pwmd_strerror (rc
));
772 xml_error_cb (void *data
, xmlErrorPtr e
)
774 struct client_s
*client
= data
;
777 * Keep the first reported error as the one to show in the error
778 * description. Reset in send_error().
780 if (client
->xml_error
)
783 xmlCopyError (e
, client
->xml_error
);
787 hook_waitpid (assuan_context_t ctx
, pid_t pid
, int action
,
788 int *status
, int options
)
790 return waitpid (pid
, status
, options
);
794 hook_read (assuan_context_t ctx
, assuan_fd_t fd
, void *data
, size_t len
)
797 struct client_s
*client
= assuan_get_pointer (ctx
);
799 if (client
->thd
->remote
)
800 return tls_read_hook (ctx
, (int) fd
, data
, len
);
803 return read ((int) fd
, data
, len
);
807 hook_write (assuan_context_t ctx
, assuan_fd_t fd
,
808 const void *data
, size_t len
)
811 struct client_s
*client
= assuan_get_pointer (ctx
);
813 if (client
->thd
->remote
)
814 return tls_write_hook (ctx
, (int) fd
, data
, len
);
817 return write ((int) fd
, data
, len
);
821 new_connection (struct client_s
*cl
)
824 static struct assuan_malloc_hooks mhooks
= { xmalloc
, xrealloc
, xfree
};
825 static struct assuan_system_hooks shooks
= {
826 ASSUAN_SYSTEM_HOOKS_VERSION
,
834 NULL
, //sendmsg both are used for FD passing
845 char *prio
= config_get_string ("global", "tls_cipher_suite");
847 cl
->thd
->tls
= tls_init (cl
->thd
->fd
, cl
->thd
->timeout
, prio
);
854 rc
= assuan_new_ext (&cl
->ctx
, GPG_ERR_SOURCE_DEFAULT
, &mhooks
,
855 debug_level
? assuan_log_cb
: NULL
, NULL
);
859 assuan_ctx_set_system_hooks (cl
->ctx
, &shooks
);
860 rc
= assuan_init_socket_server (cl
->ctx
, cl
->thd
->fd
, 2);
864 assuan_set_pointer (cl
->ctx
, cl
);
865 assuan_set_hello_line (cl
->ctx
, PACKAGE_STRING
);
866 rc
= register_commands (cl
->ctx
);
873 cl
->thd
->timeout
= config_get_integer ("global", "tls_timeout");
874 fcntl (cl
->thd
->fd
, F_SETFL
, O_NONBLOCK
);
878 rc
= assuan_accept (cl
->ctx
);
882 rc
= validate_peer (cl
);
883 /* May not be implemented on all platforms. */
884 if (rc
&& gpg_err_code (rc
) != GPG_ERR_ASS_GENERAL
)
887 rc
= init_client_crypto (&cl
->crypto
);
893 cl
->crypto
->agent
->client_ctx
= cl
->ctx
;
896 cl
->crypto
->client_ctx
= cl
->ctx
;
897 xmlSetStructuredErrorFunc (cl
, xml_error_cb
);
901 log_write ("%s", pwmd_strerror (rc
));
906 * This is called after a client_thread() terminates. Set with
907 * pthread_cleanup_push().
910 cleanup_cb (void *arg
)
912 struct client_thread_s
*cn
= arg
;
913 struct client_s
*cl
= cn
->cl
;
915 MUTEX_LOCK (&cn_mutex
);
916 cn_thread_list
= slist_remove (cn_thread_list
, cn
);
917 MUTEX_UNLOCK (&cn_mutex
);
926 gnutls_deinit (cn
->tls
->ses
);
932 if (!cn
->atfork
&& cl
->ctx
)
933 assuan_release (cl
->ctx
);
934 else if (!cn
->atfork
&& cl
->thd
&& cl
->thd
->fd
!= -1)
938 cleanup_crypto (&cl
->crypto
);
940 pinentry_free_opts (&cl
->pinentry_opts
);
949 while (cn
->msg_queue
)
951 struct status_msg_s
*msg
= cn
->msg_queue
;
953 cn
->msg_queue
= msg
->next
;
958 if (!cn
->atfork
&& cn
->status_msg_pipe
[0] != -1)
959 close (cn
->status_msg_pipe
[0]);
961 if (!cn
->atfork
&& cn
->status_msg_pipe
[1] != -1)
962 close (cn
->status_msg_pipe
[1]);
964 pthread_mutex_destroy (&cn
->status_mutex
);
968 log_write (_("exiting, fd=%i"), cn
->fd
);
969 send_status_all (STATUS_CLIENTS
, NULL
);
973 pthread_cond_signal (&quit_cond
);
977 cleanup_all_clients (int atfork
)
979 /* This function may be called from pthread_atfork() which requires
983 pthread_mutexattr_t attr
;
985 pthread_mutexattr_init (&attr
);
986 pthread_mutexattr_settype (&attr
, PTHREAD_MUTEX_RECURSIVE
);
987 pthread_mutex_init (&cn_mutex
, &attr
);
988 pthread_mutexattr_destroy (&attr
);
992 MUTEX_LOCK (&cn_mutex
);
994 while (slist_length (cn_thread_list
))
996 struct client_thread_s
*thd
= slist_nth_data (cn_thread_list
, 0);
998 thd
->atfork
= atfork
;
1003 MUTEX_UNLOCK (&cn_mutex
);
1004 cache_deinit (atfork
);
1008 send_msg_queue (struct client_thread_s
*thd
)
1010 MUTEX_LOCK (&thd
->status_mutex
);
1014 read (thd
->status_msg_pipe
[0], &c
, 1);
1016 while (thd
->msg_queue
)
1018 struct status_msg_s
*msg
= thd
->msg_queue
;
1020 thd
->msg_queue
= thd
->msg_queue
->next
;
1021 MUTEX_UNLOCK (&thd
->status_mutex
);
1022 rc
= send_status (thd
->cl
->ctx
, msg
->s
, msg
->line
);
1023 MUTEX_LOCK (&thd
->status_mutex
);
1031 MUTEX_UNLOCK (&thd
->status_mutex
);
1032 if (rc
&& gpg_err_code (rc
) != GPG_ERR_EPIPE
)
1033 log_write ("%s: %s", __FUNCTION__
, pwmd_strerror (rc
));
1039 client_thread (void *data
)
1041 struct client_thread_s
*thd
= data
;
1042 struct client_s
*cl
= xcalloc (1, sizeof (struct client_s
));
1044 #ifdef HAVE_PR_SET_NAME
1045 prctl (PR_SET_NAME
, "client");
1047 pthread_setspecific (thread_name_key
, str_dup (__FUNCTION__
));
1051 log_write ("%s(%i): %s", __FILE__
, __LINE__
,
1052 pwmd_strerror (GPG_ERR_ENOMEM
));
1056 MUTEX_LOCK (&cn_mutex
);
1057 pthread_cleanup_push (cleanup_cb
, thd
);
1060 MUTEX_UNLOCK (&cn_mutex
);
1062 if (new_connection (cl
))
1067 send_status_all (STATUS_CLIENTS
, NULL
);
1068 rc
= send_status (cl
->ctx
, STATUS_CACHE
, NULL
);
1071 log_write ("%s(%i): %s", __FILE__
, __LINE__
, pwmd_strerror (rc
));
1082 FD_SET (thd
->fd
, &rfds
);
1083 FD_SET (thd
->status_msg_pipe
[0], &rfds
);
1084 n
= thd
->fd
> thd
->status_msg_pipe
[0]
1085 ? thd
->fd
: thd
->status_msg_pipe
[0];
1087 n
= select (n
+ 1, &rfds
, NULL
, NULL
, NULL
);
1090 log_write ("%s", strerror (errno
));
1094 if (FD_ISSET (thd
->status_msg_pipe
[0], &rfds
))
1096 rc
= send_msg_queue (thd
);
1097 if (rc
&& gpg_err_code (rc
) != GPG_ERR_EPIPE
)
1101 if (!FD_ISSET (thd
->fd
, &rfds
))
1104 rc
= assuan_process_next (cl
->ctx
, &eof
);
1107 if (gpg_err_code (rc
) == GPG_ERR_EOF
|| eof
)
1110 log_write ("assuan_process_next(): rc=%i %s", rc
,
1111 pwmd_strerror (rc
));
1112 if (rc
== gpg_error (GPG_ERR_ETIMEDOUT
))
1115 rc
= send_error (cl
->ctx
, rc
);
1118 log_write ("assuan_process_done(): rc=%i %s", rc
,
1119 pwmd_strerror (rc
));
1124 /* Since the msg queue pipe fd's are non-blocking, check for
1125 * pending status msgs here. GPG_ERR_EPIPE can be seen when the
1126 * client has already disconnected and will be converted to
1127 * GPG_ERR_EOF during assuan_process_next().
1129 rc
= send_msg_queue (thd
);
1130 if (rc
&& gpg_err_code (rc
) != GPG_ERR_EPIPE
)
1135 pthread_cleanup_pop (1);
1140 xml_import (const char *filename
, const char *outfile
,
1141 const char *keygrip
, const char *sign_keygrip
,
1142 const char *keyfile
, int no_passphrase
, const char *cipher
,
1143 const char *params
, unsigned long s2k_count
, uint64_t iterations
)
1152 struct crypto_s
*crypto
= NULL
;
1155 int algo
= cipher
? cipher_string_to_gcrypt ((char *) cipher
) :
1160 log_write ("ERR %i: %s", gpg_error (GPG_ERR_CIPHER_ALGO
),
1161 pwmd_strerror (GPG_ERR_CIPHER_ALGO
));
1165 if (stat (filename
, &st
) == -1)
1167 log_write ("%s: %s", filename
,
1168 pwmd_strerror (gpg_error_from_errno (errno
)));
1172 rc
= init_client_crypto (&crypto
);
1176 memcpy (&crypto
->save
.hdr
, &crypto
->hdr
, sizeof (file_header_t
));
1177 crypto
->save
.hdr
.flags
= set_cipher_flag (crypto
->save
.hdr
.flags
, algo
);
1178 log_write (_("Importing XML from '%s'. Output will be written to '%s' ..."),
1181 if ((fd
= open (filename
, O_RDONLY
)) == -1)
1183 log_write ("%s: %s", filename
,
1184 pwmd_strerror (gpg_error_from_errno (errno
)));
1188 if ((xmlbuf
= xmalloc (st
.st_size
+ 1)) == NULL
)
1191 log_write ("%s(%i): %s", __FILE__
, __LINE__
,
1192 pwmd_strerror (GPG_ERR_ENOMEM
));
1196 if (read (fd
, xmlbuf
, st
.st_size
) == -1)
1198 rc
= gpg_error_from_errno (errno
);
1200 log_write ("%s: %s", filename
, pwmd_strerror (rc
));
1205 xmlbuf
[st
.st_size
] = 0;
1207 * Make sure the document validates.
1209 if ((doc
= xmlReadDoc (xmlbuf
, NULL
, "UTF-8", XML_PARSE_NOBLANKS
)) == NULL
)
1211 log_write ("xmlReadDoc() failed");
1217 xmlNodePtr n
= xmlDocGetRootElement (doc
);
1218 if (n
&& !xmlStrEqual (n
->name
, (xmlChar
*) "pwmd"))
1220 log_write (_("Could not find root \"pwmd\" element."));
1221 rc
= GPG_ERR_BAD_DATA
;
1225 rc
= validate_import (n
? n
->children
: n
);
1229 log_write ("ERR %i: %s", rc
, pwmd_strerror (rc
));
1234 xmlDocDumpMemory (doc
, &xml
, &len
);
1236 crypto
->save
.s2k_count
= s2k_count
;
1237 crypto
->save
.hdr
.iterations
= iterations
;
1240 rc
= export_common (NULL
, 0, crypto
, xml
, len
, outfile
, keyfile
, &key
,
1241 &keylen
, 0, 0, no_passphrase
);
1243 log_write (_("Success!"));
1248 rc
= agent_set_pinentry_options (crypto
->agent
);
1250 rc
= agent_export_common (crypto
, keygrip
, sign_keygrip
, no_passphrase
,
1251 xml
, len
, outfile
, params
, keyfile
);
1259 send_error (NULL
, rc
);
1263 cleanup_crypto (&crypto
);
1267 cleanup_crypto (&crypto
);
1272 do_cache_push (const char *filename
, struct crypto_s
*crypto
)
1274 unsigned char md5file
[16];
1279 struct cache_data_s
*cdata
;
1283 log_write (_("Trying to add datafile '%s' to the file cache ..."),
1286 if (valid_filename (filename
) == 0)
1288 log_write (_("%s: Invalid characters in filename"), filename
);
1292 rc
= decrypt_common (NULL
, 0, crypto
, filename
, &key
, &keylen
);
1296 doc
= parse_doc ((char *) crypto
->plaintext
, crypto
->plaintext_len
);
1299 log_write ("%s", pwmd_strerror (GPG_ERR_ENOMEM
));
1304 gcry_md_hash_buffer (GCRY_MD_MD5
, md5file
, filename
, strlen (filename
));
1305 cdata
= xcalloc (1, sizeof (struct cache_data_s
));
1309 log_write ("%s", pwmd_strerror (GPG_ERR_ENOMEM
));
1314 rc
= get_checksum (filename
, &crc
, &len
);
1317 log_write ("ERR %i: %s", rc
, pwmd_strerror (rc
));
1319 free_cache_data_once (cdata
);
1325 rc
= encrypt_xml (NULL
, cache_key
, cache_keysize
, GCRY_CIPHER_AES
,
1326 crypto
->plaintext
, crypto
->plaintext_len
, &cdata
->doc
,
1327 &cdata
->doclen
, &cache_iv
, &cache_blocksize
, 0);
1328 if (!rc
&& !IS_PKI (crypto
))
1331 cdata
->keylen
= keylen
;
1338 log_write ("ERR %i: %s", rc
, pwmd_strerror (rc
));
1340 free_cache_data_once (cdata
);
1345 if (use_agent
&& IS_PKI (crypto
))
1347 gcry_sexp_build ((gcry_sexp_t
*) & cdata
->pubkey
, NULL
, "%S",
1349 gcry_sexp_build ((gcry_sexp_t
*) & cdata
->sigkey
, NULL
, "%S",
1350 crypto
->sigpkey_sexp
);
1354 int timeout
= config_get_integer (filename
, "cache_timeout");
1355 cache_add_file (md5file
, crypto
->grip
, cdata
, timeout
);
1356 log_write (_("Successfully added '%s' to the cache."), filename
);
1361 init_client (int fd
, const char *addr
)
1364 struct client_thread_s
*new = xcalloc (1, sizeof (struct client_thread_s
));
1369 return GPG_ERR_ENOMEM
;
1372 MUTEX_LOCK (&cn_mutex
);
1373 pthread_cleanup_push (cleanup_mutex_cb
, &cn_mutex
);
1375 if (pipe (new->status_msg_pipe
) == -1)
1376 rc
= gpg_error_from_errno (errno
);
1380 fcntl (new->status_msg_pipe
[0], F_SETFL
, O_NONBLOCK
);
1381 fcntl (new->status_msg_pipe
[1], F_SETFL
, O_NONBLOCK
);
1382 pthread_mutex_init (&new->status_mutex
, NULL
);
1388 new->remote
= addr
? 1 : 0;
1391 rc
= create_thread (client_thread
, new, &new->tid
, 1);
1394 close (new->status_msg_pipe
[0]);
1395 close (new->status_msg_pipe
[1]);
1396 pthread_mutex_destroy (&new->status_mutex
);
1402 struct slist_s
*list
= slist_append (cn_thread_list
, new);
1406 cn_thread_list
= list
;
1408 log_write (_("new connection: tid=%p, fd=%i, addr=%s"),
1409 (pthread_t
*) new->tid
, fd
, addr
);
1411 log_write (_("new connection: tid=%p, fd=%i"),
1412 (pthread_t
*) new->tid
, fd
);
1415 rc
= GPG_ERR_ENOMEM
;
1418 pthread_cleanup_pop (1);
1424 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
1425 pwmd_strerror (rc
));
1431 keepalive_thread (void *arg
)
1433 #ifndef HAVE_PTHREAD_CANCEL
1434 int *n
= xmalloc (sizeof (int));
1437 pthread_setspecific (signal_thread_key
, n
);
1441 #ifdef HAVE_PR_SET_NAME
1442 prctl (PR_SET_NAME
, "keepalive");
1444 pthread_setspecific (thread_name_key
, str_dup (__FUNCTION__
));
1448 int n
= config_get_integer ("global", "keepalive_interval");
1449 struct timeval tv
= { n
, 0 };
1450 #ifndef HAVE_PTHREAD_CANCEL
1453 sigusr2
= (int *) pthread_getspecific (signal_thread_key
);
1458 send_status_all (STATUS_KEEPALIVE
, NULL
);
1459 select (0, NULL
, NULL
, NULL
, &tv
);
1466 /* From Beej's Guide to Network Programming. It's a good tutorial. */
1468 get_in_addr (struct sockaddr
*sa
)
1470 if (sa
->sa_family
== AF_INET
)
1471 return &(((struct sockaddr_in
*) sa
)->sin_addr
);
1473 return &(((struct sockaddr_in6
*) sa
)->sin6_addr
);
1477 tcp_accept_thread (void *arg
)
1479 int sockfd
= *(int *) arg
;
1480 #ifndef HAVE_PTHREAD_CANCEL
1481 int *n
= xmalloc (sizeof (int));
1484 pthread_setspecific (signal_thread_key
, n
);
1486 fcntl (sockfd
, F_SETFL
, O_NONBLOCK
);
1489 #ifdef HAVE_PR_SET_NAME
1490 prctl (PR_SET_NAME
, "tcp_accept");
1492 pthread_setspecific (thread_name_key
, str_dup (__FUNCTION__
));
1496 struct sockaddr_storage raddr
;
1497 socklen_t slen
= sizeof (raddr
);
1500 char s
[INET6_ADDRSTRLEN
];
1501 struct timeval tv
= { 0, ACCEPT_TIMEOUT
};
1502 #ifndef HAVE_PTHREAD_CANCEL
1505 sigusr2
= (int *) pthread_getspecific (signal_thread_key
);
1510 fd
= accept (sockfd
, (struct sockaddr
*) &raddr
, &slen
);
1513 if (errno
== EMFILE
|| errno
== ENFILE
)
1514 log_write ("accept(): %s",
1515 pwmd_strerror (gpg_error_from_errno (errno
)));
1516 else if (errno
!= EAGAIN
)
1518 if (!quit
) // probably EBADF
1519 log_write ("accept(): %s", strerror (errno
));
1524 #ifndef HAVE_PTHREAD_CANCEL
1525 select (0, NULL
, NULL
, NULL
, &tv
);
1533 inet_ntop (raddr
.ss_family
, get_in_addr ((struct sockaddr
*) &raddr
),
1535 (void) init_client (fd
, s
);
1536 n
= config_get_integer ("global", "tcp_wait");
1539 tv
.tv_sec
= (n
* 100000) / 100000;
1540 tv
.tv_usec
= (n
* 100000) % 100000;
1541 select (0, NULL
, NULL
, NULL
, &tv
);
1549 start_stop_tls_with_protocol (int ipv6
, int term
)
1551 struct addrinfo hints
, *servinfo
, *p
;
1552 int port
= config_get_integer ("global", "tcp_port");
1556 int *fd
= ipv6
? &tls6_fd
: &tls_fd
;
1558 if (term
|| config_get_boolean ("global", "enable_tcp") == 0)
1564 #ifdef HAVE_PTHREAD_CANCEL
1565 pthread_cancel (tls6_tid
);
1567 pthread_kill (tls6_tid
, SIGUSR2
);
1569 pthread_join (tls6_tid
, NULL
);
1572 shutdown (tls6_fd
, SHUT_RDWR
);
1582 #ifdef HAVE_PTHREAD_CANCEL
1583 pthread_cancel (tls_tid
);
1585 pthread_kill (tls_tid
, SIGUSR2
);
1587 pthread_join (tls_tid
, NULL
);
1590 shutdown (tls_fd
, SHUT_RDWR
);
1596 /* A client may still be connected. */
1597 if (!quit
&& x509_cred
!= NULL
)
1598 tls_deinit_params ();
1603 if ((ipv6
&& tls6_fd
!= -1) || (!ipv6
&& tls_fd
!= -1))
1606 memset (&hints
, 0, sizeof (hints
));
1607 hints
.ai_family
= ipv6
? AF_INET6
: AF_INET
;
1608 hints
.ai_socktype
= SOCK_STREAM
;
1609 hints
.ai_flags
= AI_PASSIVE
;
1610 snprintf (buf
, sizeof (buf
), "%i", port
);
1612 if ((n
= getaddrinfo (NULL
, buf
, &hints
, &servinfo
)) == -1)
1614 log_write ("getaddrinfo(): %s", gai_strerror (n
));
1618 for (n
= 0, p
= servinfo
; p
!= NULL
; p
= p
->ai_next
)
1622 if ((ipv6
&& p
->ai_family
!= AF_INET6
)
1623 || (!ipv6
&& p
->ai_family
!= AF_INET
))
1626 if ((*fd
= socket (p
->ai_family
, p
->ai_socktype
, p
->ai_protocol
)) == -1)
1628 log_write ("socket(): %s", strerror (errno
));
1632 if (setsockopt (*fd
, SOL_SOCKET
, SO_REUSEADDR
, &r
, sizeof (int)) == -1)
1634 log_write ("setsockopt(): %s",
1635 pwmd_strerror (gpg_error_from_errno (errno
)));
1636 freeaddrinfo (servinfo
);
1640 if (bind (*fd
, p
->ai_addr
, p
->ai_addrlen
) == -1)
1643 log_write ("bind(): %s",
1644 pwmd_strerror (gpg_error_from_errno (errno
)));
1652 freeaddrinfo (servinfo
);
1657 #if HAVE_DECL_SO_BINDTODEVICE != 0
1658 char *tmp
= config_get_string ("global", "tcp_interface");
1659 if (tmp
&& setsockopt (*fd
, SOL_SOCKET
, SO_BINDTODEVICE
, tmp
,
1660 strlen (tmp
)) == -1)
1662 log_write ("setsockopt(): %s",
1663 pwmd_strerror (gpg_error_from_errno (errno
)));
1671 if (x509_cred
== NULL
)
1673 rc
= tls_init_params ();
1678 if (listen (*fd
, 0) == -1)
1680 log_write ("listen(): %s", strerror (errno
));
1685 rc
= create_thread (tcp_accept_thread
, fd
, &tls6_tid
, 0);
1687 rc
= create_thread (tcp_accept_thread
, fd
, &tls_tid
, 0);
1691 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
1692 pwmd_strerror (rc
));
1704 start_stop_tls_with_protocol (0, 1);
1717 start_stop_tls (int term
)
1719 char *s
= config_get_string ("global", "tcp_bind");
1725 if (!strcmp (s
, "any"))
1727 b
= start_stop_tls_with_protocol (0, term
);
1729 b
= start_stop_tls_with_protocol (1, term
);
1731 else if (!strcmp (s
, "ipv4"))
1732 b
= start_stop_tls_with_protocol (0, term
);
1733 else if (!strcmp (s
, "ipv6"))
1734 b
= start_stop_tls_with_protocol (1, term
);
1744 accept_thread (void *arg
)
1746 int sockfd
= *(int *) arg
;
1747 #ifndef HAVE_PTHREAD_CANCEL
1748 int *n
= xmalloc (sizeof (int));
1751 pthread_setspecific (signal_thread_key
, n
);
1753 fcntl (sockfd
, F_SETFL
, O_NONBLOCK
);
1756 #ifdef HAVE_PR_SET_NAME
1757 prctl (PR_SET_NAME
, "accept");
1759 pthread_setspecific (thread_name_key
, str_dup (__FUNCTION__
));
1763 socklen_t slen
= sizeof (struct sockaddr_un
);
1764 struct sockaddr_un raddr
;
1766 #ifndef HAVE_PTHREAD_CANCEL
1767 struct timeval tv
= { 0, ACCEPT_TIMEOUT
};
1768 int *sigusr2
= (int *) pthread_getspecific (signal_thread_key
);
1774 fd
= accept (sockfd
, (struct sockaddr
*) &raddr
, &slen
);
1777 if (errno
== EMFILE
|| errno
== ENFILE
)
1778 log_write ("accept(): %s",
1779 pwmd_strerror (gpg_error_from_errno (errno
)));
1780 else if (errno
!= EAGAIN
)
1782 if (!quit
) // probably EBADF
1783 log_write ("accept(): %s",
1784 pwmd_strerror (gpg_error_from_errno (errno
)));
1789 #ifndef HAVE_PTHREAD_CANCEL
1790 select (0, NULL
, NULL
, NULL
, &tv
);
1795 (void) init_client (fd
, NULL
);
1798 /* Just in case accept() failed for some reason other than EBADF */
1804 cache_timer_thread (void *arg
)
1806 #ifndef HAVE_PTHREAD_CANCEL
1807 int *n
= xmalloc (sizeof (int));
1810 pthread_setspecific (signal_thread_key
, n
);
1814 #ifdef HAVE_PR_SET_NAME
1815 prctl (PR_SET_NAME
, "cache timer");
1817 pthread_setspecific (thread_name_key
, str_dup (__FUNCTION__
));
1821 struct timeval tv
= { 1, 0 };
1822 #ifndef HAVE_PTHREAD_CANCEL
1825 n
= (int *) pthread_getspecific (signal_thread_key
);
1830 select (0, NULL
, NULL
, NULL
, &tv
);
1831 cache_adjust_timeout ();
1838 signal_loop (sigset_t sigset
)
1847 sigwait (&sigset
, &sig
);
1850 log_write (_("caught signal %i (%s)"), sig
, strsignal (sig
));
1855 pthread_cond_signal (&rcfile_cond
);
1858 log_write (_("clearing file cache"));
1860 send_status_all (STATUS_CACHE
, NULL
);
1879 log_write (_ ("Caught signal %i (%s). Exiting."), sig
, strsignal (sig
));
1880 #ifdef HAVE_BACKTRACE
1881 BACKTRACE (__FUNCTION__
);
1887 waiting_for_exit (void *arg
)
1890 #ifndef HAVE_PTHREAD_CANCEL
1891 int *n
= xmalloc (sizeof (int));
1894 pthread_setspecific (signal_thread_key
, n
);
1898 #ifdef HAVE_PR_SET_NAME
1899 prctl (PR_SET_NAME
, "exiting");
1901 pthread_setspecific (thread_name_key
, str_dup (__FUNCTION__
));
1902 log_write (_("waiting for all clients to disconnect"));
1903 MUTEX_LOCK (&quit_mutex
);
1904 pthread_cleanup_push (cleanup_mutex_cb
, &quit_mutex
);
1911 MUTEX_LOCK (&cn_mutex
);
1912 n
= slist_length (cn_thread_list
);
1913 MUTEX_UNLOCK (&cn_mutex
);
1917 #ifndef HAVE_PTHREAD_CANCEL
1918 int *s
= (int *) pthread_getspecific (signal_thread_key
);
1925 log_write (_("%i clients remain"), n
);
1929 INIT_TIMESPEC (SIG_TIMEOUT
, ts
);
1930 pthread_cond_timedwait (&quit_cond
, &quit_mutex
, &ts
);
1933 kill (getpid (), SIGQUIT
);
1934 pthread_cleanup_pop (1);
1939 server_loop (int sockfd
, char **socketpath
)
1941 pthread_t accept_tid
;
1942 pthread_t cache_timeout_tid
;
1943 int cancel_timeout_thread
= 0, cancel_accept_thread
= 0;
1944 int cancel_keepalive_thread
= 0;
1951 sigemptyset (&sigset
);
1954 sigaddset (&sigset
, SIGTERM
);
1955 sigaddset (&sigset
, SIGINT
);
1957 /* Clears the file cache. */
1958 sigaddset (&sigset
, SIGUSR1
);
1960 /* Configuration file reloading. */
1961 sigaddset (&sigset
, SIGHUP
);
1963 /* For exiting cleanly. */
1964 sigaddset (&sigset
, SIGQUIT
);
1966 #ifndef HAVE_PTHREAD_CANCEL
1968 The socket, cache and rcfile threads use this signal when
1969 pthread_cancel() is unavailable. Prevent the main thread from
1970 catching this signal from another process.
1972 sigaddset (&sigset
, SIGUSR2
);
1975 /* When mem.c cannot find a pointer in the list (double free). */
1976 signal (SIGABRT
, catchsig
);
1977 sigaddset (&sigset
, SIGABRT
);
1978 sigprocmask (SIG_BLOCK
, &sigset
, NULL
);
1980 #ifndef HAVE_PTHREAD_CANCEL
1981 /* Remove this signal from the watched signals in signal_loop(). */
1982 sigdelset (&sigset
, SIGUSR2
);
1985 /* Ignored everywhere. When a client disconnects abnormally this signal
1986 * gets raised. It isn't needed though because client_thread() will check
1987 * for rcs even after the client disconnects. */
1988 signal (SIGPIPE
, SIG_IGN
);
1990 /* Can show a backtrace of the stack in the log. */
1991 signal (SIGSEGV
, catchsig
);
1994 /* Needs to be done after the fork(). */
1995 if (!start_stop_tls (0))
2002 pthread_mutex_init (&quit_mutex
, NULL
);
2003 pthread_cond_init (&quit_cond
, NULL
);
2004 log_write (_("%s started for user %s"), PACKAGE_STRING
, get_username ());
2007 if (config_get_boolean ("global", "enable_tcp"))
2008 log_write (_("Listening on %s and TCP port %i"), *socketpath
,
2009 config_get_integer ("global", "tcp_port"));
2011 log_write (_("Listening on %s"), *socketpath
);
2013 log_write (_("Listening on %s"), *socketpath
);
2016 rc
= create_thread (keepalive_thread
, NULL
, &keepalive_tid
, 0);
2019 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
2020 pwmd_strerror (rc
));
2024 cancel_keepalive_thread
= 1;
2025 rc
= create_thread (reload_rcfile_thread
, NULL
, &rcfile_tid
, 0);
2028 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
2029 pwmd_strerror (rc
));
2033 rc
= create_thread (cache_timer_thread
, NULL
, &cache_timeout_tid
, 0);
2036 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
2037 pwmd_strerror (rc
));
2041 cancel_timeout_thread
= 1;
2042 rc
= create_thread (accept_thread
, &sockfd
, &accept_tid
, 0);
2045 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
2046 pwmd_strerror (rc
));
2050 cancel_accept_thread
= 1;
2052 signal_loop (sigset
);
2058 * We're out of the main server loop. This happens when a signal was sent
2059 * to terminate the daemon. We'll wait for all clients to disconnect
2060 * before exiting but exit immediately if another termination signal is
2063 if (cancel_accept_thread
)
2065 #ifdef HAVE_PTHREAD_CANCEL
2066 int n
= pthread_cancel (accept_tid
);
2068 int n
= pthread_kill (accept_tid
, SIGUSR2
);
2071 pthread_join (accept_tid
, NULL
);
2077 shutdown (sockfd
, SHUT_RDWR
);
2079 unlink (*socketpath
);
2080 xfree (*socketpath
);
2082 MUTEX_LOCK (&cn_mutex
);
2083 n
= slist_length (cn_thread_list
);
2084 MUTEX_UNLOCK (&cn_mutex
);
2090 rc
= create_thread (waiting_for_exit
, NULL
, &tid
, 0);
2093 if (signal_loop (sigset
))
2095 log_write (_("Received second termination request. Exiting."));
2096 #ifdef HAVE_PTHREAD_CANCEL
2097 pthread_cancel (tid
);
2099 pthread_kill (tid
, SIGUSR2
);
2101 pthread_join (tid
, NULL
);
2105 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
2106 pwmd_strerror (rc
));
2109 if (cancel_timeout_thread
)
2111 #ifdef HAVE_PTHREAD_CANCEL
2112 pthread_cancel (cache_timeout_tid
);
2114 pthread_kill (cache_timeout_tid
, SIGUSR2
);
2116 pthread_join (cache_timeout_tid
, NULL
);
2119 if (cancel_keepalive_thread
)
2121 #ifdef HAVE_PTHREAD_CANCEL
2122 pthread_cancel (keepalive_tid
);
2124 pthread_kill (keepalive_tid
, SIGUSR2
);
2126 pthread_join (keepalive_tid
, NULL
);
2129 cleanup_all_clients (0);
2134 pthread_cond_destroy (&quit_cond
);
2135 pthread_mutex_destroy (&quit_mutex
);
2136 return segv
? EXIT_FAILURE
: EXIT_SUCCESS
;;
2143 ("Failed to add a file to the cache. Use --ignore to force startup. Exiting."));
2147 /* This is called from cache.c:clear_once(). See
2148 * command.c:clearcache_command() for details about lock checking.
2151 free_cache_data (file_cache_t
* cache
)
2153 gpg_error_t rc
= GPG_ERR_NO_DATA
;
2155 struct client_thread_s
*found
= NULL
;
2162 MUTEX_LOCK (&cn_mutex
);
2163 pthread_cleanup_push (cleanup_mutex_cb
, &cn_mutex
);
2164 t
= slist_length (cn_thread_list
);
2166 for (i
= 0; i
< t
; i
++)
2168 struct client_thread_s
*thd
= slist_nth_data (cn_thread_list
, i
);
2173 if (!memcmp (thd
->cl
->md5file
, cache
->filename
,
2174 sizeof (cache
->filename
)))
2176 if (pthread_equal (pthread_self (), thd
->tid
))
2183 /* Continue trying to find a client who has the same file open and
2184 * also has a lock. */
2185 rc
= cache_lock_mutex (thd
->cl
->ctx
, thd
->cl
->md5file
, -1, 0, -1);
2195 if (self
&& (!rc
|| rc
== GPG_ERR_NO_DATA
))
2196 rc
= cache_lock_mutex (found
->cl
->ctx
, found
->cl
->md5file
, -1, 0, -1);
2198 if (exiting
|| !rc
|| rc
== GPG_ERR_NO_DATA
)
2200 free_cache_data_once (cache
->data
);
2202 cache
->defer_clear
= 0;
2203 cache
->timeout
= -1;
2206 cache_unlock_mutex (found
->cl
->md5file
, 0);
2212 cache
->defer_clear
= 1;
2214 pthread_cleanup_pop (1);
2220 convert_v2_datafile (const char *filename
, const char *cipher
,
2221 const char *keyfile
, const char *keygrip
,
2222 const char *sign_keygrip
, int nopass
,
2223 const char *outfile
, const char *keyparam
,
2224 unsigned long s2k_count
, uint64_t iterations
)
2229 struct crypto_s
*crypto
= NULL
;
2235 if (outfile
[0] == '-' && outfile
[1] == 0)
2238 log_write (_("Converting version 2 data file \"%s\" ..."), filename
);
2239 if (access (filename
, R_OK
) == -1)
2241 log_write ("%s: %s", filename
,
2242 pwmd_strerror (gpg_error_from_errno (errno
)));
2248 log_write (_("Using passphrase file \"%s\" for decryption ..."),
2250 if (access (keyfile
, R_OK
) == -1)
2252 log_write ("%s: %s", keyfile
,
2253 pwmd_strerror (gpg_error_from_errno (errno
)));
2258 rc
= read_v2_datafile (filename
, keyfile
, &data
, &datalen
, &ver
, &algo
);
2261 log_write ("ERR %i: %s", rc
, pwmd_strerror (rc
));
2267 algo
= cipher_string_to_gcrypt (cipher
);
2270 rc
= GPG_ERR_CIPHER_ALGO
;
2277 xmlDocPtr doc
= parse_doc (data
, datalen
);
2281 rc
= GPG_ERR_BAD_DATA
;
2285 rc
= convert_pre_212_elements (doc
);
2290 xmlDocDumpFormatMemory (doc
, (xmlChar
**) & data
, (int *) &datalen
,
2293 rc
= GPG_ERR_ENOMEM
;
2301 rc
= init_client_crypto (&crypto
);
2304 memcpy (&crypto
->save
.hdr
, &crypto
->hdr
, sizeof (file_header_t
));
2305 crypto
->save
.hdr
.flags
= set_cipher_flag (crypto
->save
.hdr
.flags
, algo
);
2306 crypto
->save
.s2k_count
= s2k_count
;
2307 crypto
->save
.hdr
.iterations
= iterations
;
2311 rc
= export_common (NULL
, 0, crypto
, data
, datalen
, outfile
, keyfile
,
2312 &key
, &keylen
, 0, 0, nopass
);
2317 rc
= agent_set_pinentry_options (crypto
->agent
);
2319 rc
= agent_export_common (crypto
, keygrip
, sign_keygrip
, nopass
,
2320 data
, datalen
, outfile
, keyparam
,
2321 no_passphrase_file
? NULL
: keyfile
);
2325 log_write (_("Output written to \"%s\"."), outfile
);
2335 cleanup_crypto (&crypto
);
2338 log_write ("ERR %i: %s", rc
, pwmd_strerror (rc
));
2343 usage (const char *pn
, int status
)
2345 FILE *fp
= status
== EXIT_FAILURE
? stderr
: stdout
;
2347 fprintf (fp
, _("Usage: %s [OPTIONS] [file1] [...]\n"
2348 " -f, --rcfile=filename load the specfied configuration file\n"
2349 " (~/.pwmd/config)\n"
2350 " --homedir alternate pwmd home directory (~/.pwmd)\n"
2352 " --use-agent enable use of gpg-agent\n"
2354 " -n, --no-fork run as a foreground process\n"
2355 " -D, --disable-dump disable the LIST, XPATH and DUMP commands\n"
2356 " --ignore ignore file errors during startup\n"
2357 " --debug-level=keywords log protocol output (see manual for details)\n"
2358 " -o, --outfile=filename output file when importing or converting\n"
2359 " -C, --convert=filename convert a version 2 data file to version 3\n"
2360 " -I, --import=filename import a pwmd DTD formatted XML file)\n"
2361 " -k, --passphrase-file=file for use when importing or converting\n"
2362 " --no-passphrase-file prompt instead of using --passphrase-file when\n"
2364 " --no-passphrase when importing or converting\n"
2365 " --keygrip=hex public key to use when encrypting\n"
2366 " --sign-keygrip=hex private key to use when signing\n"
2367 " --keyparam=s-exp custom key parameters to use (RSA-2048)\n"
2368 " --cipher=string encryption cipher (aes256)\n"
2369 " --iterations=N cipher iteration count (N+1)\n"
2370 " --s2k-count=N hash iteration count (>65536, calibrated)\n"
2371 " --help this help text\n"
2372 " --version show version and compile time features\n"),
2378 main (int argc
, char *argv
[])
2381 struct sockaddr_un addr
;
2383 char *socketpath
= NULL
, *socketdir
, *socketname
= NULL
;
2384 char *socketarg
= NULL
;
2385 char *datadir
= NULL
;
2388 char **cache_push
= NULL
;
2389 char *import
= NULL
, *keygrip
= NULL
, *sign_keygrip
= NULL
;
2390 char *keyparam
= NULL
;
2391 int estatus
= EXIT_FAILURE
;
2393 char *outfile
= NULL
;
2396 int show_version
= 0;
2398 int no_passphrase
= 0;
2400 char *convertfile
= NULL
;
2401 char *cipher
= NULL
;
2402 char *keyfile
= NULL
;
2403 unsigned long s2k_count
= 0;
2404 uint64_t iterations
= 0;
2406 char *debug_level_opt
= NULL
;
2408 /* Must maintain the same order as longopts[] */
2411 OPT_VERSION
, OPT_HELP
,
2415 OPT_DEBUG_LEVEL
, OPT_HOMEDIR
, OPT_NO_FORK
, OPT_DISABLE_DUMP
, OPT_IGNORE
,
2416 OPT_RCFILE
, OPT_CONVERT
, OPT_PASSPHRASE_FILE
, OPT_IMPORT
, OPT_OUTFILE
,
2417 OPT_NO_PASSPHRASE_FILE
, OPT_KEYGRIP
, OPT_SIGN_KEYGRIP
, OPT_KEYPARAM
,
2418 OPT_CIPHER
, OPT_ITERATIONS
, OPT_S2K_COUNT
, OPT_NO_PASSPHRASE
2420 const char *optstring
= "nf:C:k:I:o:";
2421 const struct option longopts
[] = {
2422 {"version", no_argument
, 0, 0},
2423 {"help", no_argument
, 0, 0},
2425 {"use-agent", no_argument
, 0, 0},
2427 {"debug-level", required_argument
, 0, 0},
2428 {"homedir", required_argument
, 0, 0},
2429 {"no-fork", no_argument
, 0, 'n'},
2430 {"disable_dump", no_argument
, 0, 0},
2431 {"ignore", no_argument
, 0, 0},
2432 {"rcfile", required_argument
, 0, 'f'},
2433 {"convert", required_argument
, 0, 'C'},
2434 {"passphrase-file", required_argument
, 0, 'k'},
2435 {"import", required_argument
, 0, 'I'},
2436 {"outfile", required_argument
, 0, 'o'},
2437 {"no-passphrase-file", no_argument
, 0, 0},
2438 {"keygrip", required_argument
, 0, 0},
2439 {"sign-keygrip", required_argument
, 0, 0},
2440 {"keyparam", required_argument
, 0, 0},
2441 {"cipher", required_argument
, 0, 0},
2442 {"cipher-iterations", required_argument
, 0, 0},
2443 {"s2k-count", required_argument
, 0, 0},
2444 {"no-passphrase", no_argument
, 0, 0},
2449 #ifdef HAVE_SETRLIMIT
2452 rl
.rlim_cur
= rl
.rlim_max
= 0;
2454 if (setrlimit (RLIMIT_CORE
, &rl
) != 0)
2455 err (EXIT_FAILURE
, "setrlimit()");
2460 setlocale (LC_ALL
, "");
2461 bindtextdomain ("pwmd", LOCALEDIR
);
2462 textdomain ("pwmd");
2470 if (setup_crypto ())
2471 exit (EXIT_FAILURE
);
2474 gnutls_global_set_mem_functions (xmalloc
, xmalloc
, secure_mem_check
,
2476 gnutls_global_init ();
2477 gnutls_global_set_log_function (tls_log
);
2478 gnutls_global_set_log_level (1);
2482 xmlMemSetup (xfree
, xmalloc
, xrealloc
, str_dup
);
2490 while ((opt
= getopt_long (argc
, argv
, optstring
, longopts
, &optindex
))
2499 convertfile
= optarg
;
2514 rcfile
= str_dup (optarg
);
2517 usage (argv
[0], EXIT_FAILURE
);
2533 case OPT_DEBUG_LEVEL
:
2534 debug_level_opt
= optarg
;
2537 homedir
= str_dup (optarg
);
2542 case OPT_DISABLE_DUMP
:
2549 rcfile
= str_dup (optarg
);
2552 convertfile
= optarg
;
2554 case OPT_PASSPHRASE_FILE
:
2563 case OPT_NO_PASSPHRASE_FILE
:
2564 no_passphrase_file
= 1;
2569 case OPT_SIGN_KEYGRIP
:
2570 sign_keygrip
= optarg
;
2578 case OPT_ITERATIONS
:
2579 iterations
= strtoull (optarg
, NULL
, 10);
2582 s2k_count
= strtoul (optarg
, NULL
, 10);
2584 case OPT_NO_PASSPHRASE
:
2596 "Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013\n"
2598 "Released under the terms of the GPL v2. Use at your own risk.\n\n"
2599 "Compile time features:\n%s"), PACKAGE_STRING
,
2602 "+PWMD_HOMEDIR=" PWMD_HOMEDIR
"\n"
2640 exit (EXIT_SUCCESS
);
2645 homedir
= str_dup(PWMD_HOMEDIR
);
2647 homedir
= str_asprintf ("%s/.pwmd", get_home_dir ());
2650 if (mkdir (homedir
, 0700) == -1 && errno
!= EEXIST
)
2651 err (EXIT_FAILURE
, "%s", homedir
);
2653 snprintf (buf
, sizeof (buf
), "%s/data", homedir
);
2654 if (mkdir (buf
, 0700) == -1 && errno
!= EEXIST
)
2655 err (EXIT_FAILURE
, "%s", buf
);
2657 datadir
= str_dup (buf
);
2658 pthread_mutexattr_t attr
;
2659 pthread_mutexattr_init (&attr
);
2660 pthread_mutexattr_settype (&attr
, PTHREAD_MUTEX_RECURSIVE
);
2661 pthread_mutex_init (&rcfile_mutex
, &attr
);
2662 pthread_cond_init (&rcfile_cond
, NULL
);
2663 pthread_mutex_init (&cn_mutex
, &attr
);
2664 pthread_mutexattr_destroy (&attr
);
2665 pthread_key_create (&last_error_key
, free_key
);
2666 #ifndef HAVE_PTHREAD_CANCEL
2667 pthread_key_create (&signal_thread_key
, free_key
);
2671 rcfile
= str_asprintf ("%s/config", homedir
);
2673 global_config
= config_parse (rcfile
);
2675 exit (EXIT_FAILURE
);
2679 use_agent
= config_get_boolean ("global", "use_agent");
2684 if (debug_level_opt
)
2685 debug_level
= str_split (debug_level_opt
, ",", 0);
2687 x
= config_get_int_param (global_config
, "global", "priority", &exists
);
2688 if (exists
&& x
!= atoi(INVALID_PRIORITY
))
2691 if (setpriority (PRIO_PROCESS
, 0, x
) == -1)
2693 log_write ("setpriority(): %s",
2694 pwmd_strerror (gpg_error_from_errno (errno
)));
2698 #ifdef HAVE_MLOCKALL
2699 if (disable_mlock
== 0 && mlockall (MCL_CURRENT
| MCL_FUTURE
) == -1)
2701 log_write ("mlockall(): %s",
2702 pwmd_strerror (gpg_error_from_errno (errno
)));
2707 rc
= cache_init (free_cache_data
);
2710 log_write ("pwmd: ERR %i: %s", rc
,
2711 gpg_err_code (rc
) == GPG_ERR_UNKNOWN_VERSION
2712 ? _("incompatible gpg-agent version: 2.1.0 or later required")
2713 : pwmd_strerror (rc
));
2718 s2k_count
= config_get_ulong (NULL
, "s2k_count");
2723 usage (argv
[0], EXIT_FAILURE
);
2725 estatus
= convert_v2_datafile (convertfile
, cipher
, keyfile
, keygrip
,
2726 sign_keygrip
, no_passphrase
, outfile
,
2727 keyparam
, s2k_count
, iterations
);
2728 config_free (global_config
);
2735 if (!outfile
|| !*outfile
)
2736 usage (argv
[0], EXIT_FAILURE
);
2738 if (outfile
&& outfile
[0] == '-' && outfile
[1] == 0)
2741 estatus
= xml_import (import
, outfile
, keygrip
, sign_keygrip
, keyfile
,
2742 no_passphrase
, cipher
, keyparam
, s2k_count
,
2744 config_free (global_config
);
2749 p
= config_get_string ("global", "socket_path");
2751 p
= str_asprintf ("%s/socket", homedir
);
2753 socketarg
= expand_homedir (p
);
2757 disable_list_and_dump
= config_get_boolean ("global",
2758 "disable_list_and_dump");
2760 disable_list_and_dump
= secure
;
2762 cache_push
= config_get_list ("global", "cache_push");
2764 while (optind
< argc
)
2766 if (strv_printf (&cache_push
, "%s", argv
[optind
++]) == 0)
2767 errx (EXIT_FAILURE
, "%s", pwmd_strerror (GPG_ERR_ENOMEM
));
2770 if (strchr (socketarg
, '/') == NULL
)
2772 socketdir
= getcwd (buf
, sizeof (buf
));
2773 socketname
= str_dup (socketarg
);
2774 socketpath
= str_asprintf ("%s/%s", socketdir
, socketname
);
2778 socketname
= str_dup (strrchr (socketarg
, '/'));
2780 socketarg
[strlen (socketarg
) - strlen (socketname
) - 1] = 0;
2781 socketdir
= str_dup (socketarg
);
2782 socketpath
= str_asprintf ("%s/%s", socketdir
, socketname
);
2785 if (chdir (datadir
))
2787 log_write ("%s: %s", datadir
,
2788 pwmd_strerror (gpg_error_from_errno (errno
)));
2789 unlink (socketpath
);
2794 * Set the cache entry for a file. Prompts for the password.
2798 struct crypto_s
*crypto
= NULL
;
2799 gpg_error_t rc
= init_client_crypto (&crypto
);
2803 estatus
= EXIT_FAILURE
;
2810 rc
= agent_set_pinentry_options (crypto
->agent
);
2813 estatus
= EXIT_FAILURE
;
2819 for (opt
= 0; cache_push
[opt
]; opt
++)
2821 if (!do_cache_push (cache_push
[opt
], crypto
) && !force
)
2823 strv_free (cache_push
);
2825 estatus
= EXIT_FAILURE
;
2826 cleanup_crypto (&crypto
);
2830 cleanup_crypto_stage1 (crypto
);
2835 (void) kill_scd (crypto
->agent
);
2838 cleanup_crypto (&crypto
);
2839 strv_free (cache_push
);
2840 log_write (!nofork
? _("Done. Daemonizing...") :
2841 _("Done. Waiting for connections..."));
2844 config_clear_keys ();
2847 * bind() doesn't like the full pathname of the socket or any non alphanum
2848 * characters so change to the directory where the socket is wanted then
2849 * create it then change to datadir.
2851 if (chdir (socketdir
))
2853 log_write ("%s: %s", socketdir
,
2854 pwmd_strerror (gpg_error_from_errno (errno
)));
2860 if ((sockfd
= socket (PF_UNIX
, SOCK_STREAM
, 0)) == -1)
2862 log_write ("socket(): %s", pwmd_strerror (gpg_error_from_errno (errno
)));
2866 addr
.sun_family
= AF_UNIX
;
2867 snprintf (addr
.sun_path
, sizeof (addr
.sun_path
), "%s", socketname
);
2869 if (bind (sockfd
, (struct sockaddr
*) &addr
, sizeof (struct sockaddr
)) ==
2872 log_write ("bind(): %s", pwmd_strerror (gpg_error_from_errno (errno
)));
2874 if (errno
== EADDRINUSE
)
2877 log_write (_("Either there is another pwmd running or '%s' is a \n"
2878 "stale socket. Please remove it manually."), socketpath
);
2885 char *t
= config_get_string ("global", "socket_perms");
2891 mode
= strtol (t
, NULL
, 8);
2895 if (chmod (socketname
, mode
) == -1)
2897 log_write ("%s: %s", socketname
,
2898 pwmd_strerror (gpg_error_from_errno (errno
)));
2908 xfree (--socketname
);
2910 if (chdir (datadir
))
2912 log_write ("%s: %s", datadir
,
2913 pwmd_strerror (gpg_error_from_errno (errno
)));
2920 if (listen (sockfd
, 0) == -1)
2922 log_write ("listen(): %s", pwmd_strerror (gpg_error_from_errno (errno
)));
2933 log_write ("fork(): %s",
2934 pwmd_strerror (gpg_error_from_errno (errno
)));
2943 _exit (EXIT_SUCCESS
);
2947 pthread_key_create (&thread_name_key
, free_key
);
2948 pthread_setspecific (thread_name_key
, str_dup ("main"));
2949 estatus
= server_loop (sockfd
, &socketpath
);
2952 if (socketpath
&& do_unlink
)
2954 unlink (socketpath
);
2960 gnutls_global_deinit ();
2964 #ifdef HAVE_PTHREAD_CANCEL
2965 pthread_cancel (rcfile_tid
);
2967 pthread_kill (rcfile_tid
, SIGUSR2
);
2968 pthread_cond_signal (&rcfile_cond
);
2970 pthread_join (rcfile_tid
, NULL
);
2973 pthread_cond_destroy (&rcfile_cond
);
2974 pthread_mutex_destroy (&rcfile_mutex
);
2975 pthread_key_delete (last_error_key
);
2976 #ifndef HAVE_PTHREAD_CANCEL
2977 pthread_key_delete (signal_thread_key
);
2981 config_free (global_config
);
2984 xfree (home_directory
);
2986 xmlCleanupParser ();
2987 xmlCleanupGlobals ();
2989 if (estatus
== EXIT_SUCCESS
)
2990 log_write (_("pwmd exiting normally"));
2992 pthread_key_delete (thread_name_key
);
2994 #if defined(DEBUG) && !defined(MEM_DEBUG)