2 Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014
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
;
107 #ifndef HAVE_PTHREAD_CANCEL
108 static pthread_key_t signal_thread_key
;
114 static pthread_t tls_tid
;
115 static pthread_t tls6_tid
;
116 static int spawned_tls
;
117 static int spawned_tls6
;
119 static int start_stop_tls (int term
);
122 static int do_cache_push (const char *filename
, struct crypto_s
*crypto
);
123 static int signal_loop (sigset_t sigset
);
125 GCRY_THREAD_OPTION_PTHREAD_IMPL
;
127 #ifndef HAVE_PTHREAD_CANCEL
128 #define INIT_THREAD_SIGNAL do { \
129 struct sigaction act; \
131 sigemptyset (&sigset); \
132 sigaddset (&sigset, SIGUSR2); \
133 pthread_sigmask (SIG_UNBLOCK, &sigset, NULL); \
134 memset (&act, 0, sizeof(act)); \
135 act.sa_flags = SA_SIGINFO; \
136 act.sa_mask = sigset; \
137 act.sa_sigaction = catch_thread_signal; \
138 sigaction (SIGUSR2, &act, NULL); \
142 catch_thread_signal (int sig
, siginfo_t
*info
, void *ctx
)
144 int *n
= (int *) pthread_getspecific (signal_thread_key
);
147 pthread_setspecific (signal_thread_key
, n
);
152 cache_push_from_rcfile ()
154 struct crypto_s
*crypto
= NULL
;
156 gpg_error_t rc
= init_client_crypto (&crypto
);
160 log_write ("%s: %s", __FUNCTION__
, pwmd_strerror (rc
));
167 rc
= set_agent_option (crypto
->agent
, "pinentry-mode", "error");
170 log_write ("%s: %s", __FUNCTION__
, pwmd_strerror (rc
));
176 cache_push
= config_get_list ("global", "cache_push");
181 for (p
= cache_push
; *p
; p
++)
183 (void) do_cache_push (*p
, crypto
);
184 cleanup_crypto_stage1 (crypto
);
187 strv_free (cache_push
);
191 (void) kill_scd (crypto
->agent
);
193 cleanup_crypto (&crypto
);
199 int n
= config_get_boolean ("global", "enable_logging");
203 char *p
= config_get_string ("global", "log_path");
205 if (!p
|| (logfile
&& p
&& log_fd
!= -1 && strcmp(p
, logfile
)))
214 logfile
= expand_homedir (p
);
227 log_syslog
= config_get_boolean ("global", "syslog");
229 openlog ("pwmd", LOG_NDELAY
| LOG_PID
, LOG_DAEMON
);
233 reload_rcfile_thread (void *arg
)
235 #ifndef HAVE_PTHREAD_CANCEL
236 int *n
= xmalloc (sizeof (int));
239 pthread_setspecific (signal_thread_key
, n
);
243 #ifdef HAVE_PR_SET_NAME
244 prctl (PR_SET_NAME
, "reload rcfile");
246 pthread_setspecific (thread_name_key
, str_dup (__FUNCTION__
));
247 MUTEX_LOCK (&rcfile_mutex
);
248 pthread_cleanup_push (cleanup_mutex_cb
, &rcfile_mutex
);
252 struct allowed_users_s
257 struct slist_s
*allowed_users
= NULL
;
258 struct slist_s
*config
;
259 int b
= disable_list_and_dump
;
260 uid_t invoking_uid_orig
= invoking_uid
;
261 gid_t invoking_gid_orig
= invoking_gid
;
262 char *invoking_tls_orig
;
264 int require_save_key
= config_get_bool_param (global_config
, "global",
268 int tcp_require_key
= config_get_bool_param (global_config
, "global",
273 pthread_cond_wait (&rcfile_cond
, &rcfile_mutex
);
274 #ifndef HAVE_PTHREAD_CANCEL
275 int *cancel
= (int *) pthread_getspecific (signal_thread_key
);
280 /* Keep the "allowed" parameter across rcfile reloads to prevent
282 int n
, t
= slist_length (global_config
);
283 for (n
= 0; n
< t
; n
++)
285 struct config_section_s
*section
;
288 section
= slist_nth_data (global_config
, n
);
289 users
= config_get_list_param (global_config
, section
->name
,
293 struct allowed_users_s
*allowed
;
295 allowed
= xmalloc (sizeof(struct allowed_users_s
));
296 allowed
->section
= str_dup (section
->name
);
297 allowed
->users
= users
;
298 allowed_users
= slist_append (allowed_users
, allowed
);
302 invoking_tls_orig
= invoking_tls
? str_dup (invoking_tls
) : NULL
;
303 xfree (invoking_tls
);
305 log_write (_("reloading configuration file '%s'"), rcfile
);
307 config
= config_parse (rcfile
);
310 config_free (global_config
);
311 global_config
= config
;
313 cache_push_from_rcfile ();
314 config_clear_keys ();
317 xfree (invoking_tls
);
318 invoking_tls
= invoking_tls_orig
;
319 invoking_uid
= invoking_uid_orig
;
320 invoking_gid
= invoking_gid_orig
;
321 disable_list_and_dump
= !disable_list_and_dump
? b
: 1;
322 config_set_bool_param (&global_config
, "global", "require_save_key",
323 require_save_key
? "true" : "false");
325 if (config_get_bool_param (global_config
, "global", "tcp_require_key",
329 config_set_bool_param (&global_config
, "global", "tcp_require_key",
330 tcp_require_key
? "true" : "false");
335 int n
, t
= slist_length (allowed_users
);
337 for (n
= 0; n
< t
; n
++)
339 struct allowed_users_s
*allowed
;
342 allowed
= slist_nth_data (allowed_users
, n
);
343 tmp
= strv_join (",", allowed
->users
);
344 config_set_list_param (&global_config
, allowed
->section
,
347 xfree (allowed
->section
);
348 strv_free (allowed
->users
);
352 slist_free (allowed_users
);
356 /* Kill existing listening threads since the configured listening
357 * protocols may have changed. */
363 pthread_cleanup_pop (1);
368 send_error (assuan_context_t ctx
, gpg_error_t e
)
370 struct client_s
*client
= assuan_get_pointer (ctx
);
372 if (gpg_err_source (e
) == GPG_ERR_SOURCE_UNKNOWN
)
379 return assuan_process_done (ctx
, 0);
383 log_write ("ERR %i: %s", e
, pwmd_strerror (e
));
387 if (client
&& client
->xml_error
)
389 log_write ("%s", client
->xml_error
->message
);
390 xfree (client
->last_error
);
391 client
->last_error
= NULL
;
392 if (client
->xml_error
->message
)
393 client
->last_error
= str_dup (client
->xml_error
->message
);
395 e
= assuan_process_done (ctx
,
396 assuan_set_error (ctx
, e
,
397 client
->xml_error
->message
? client
->xml_error
->message
: NULL
));
398 xmlResetLastError ();
399 xmlResetError (client
->xml_error
);
400 xfree (client
->xml_error
);
401 client
->xml_error
= NULL
;
405 return assuan_process_done (ctx
,
406 assuan_set_error (ctx
, e
, pwmd_strerror (e
)));
410 assuan_log_cb (assuan_context_t ctx
, void *data
, unsigned cat
,
413 static pthread_mutex_t m
= PTHREAD_MUTEX_INITIALIZER
;
417 pthread_mutex_lock (&m
);
418 pthread_cleanup_push ((void (*)(void *)) pthread_mutex_unlock
, &m
);
419 t
= strv_length (debug_level
);
421 for (i
= 0; i
< t
; i
++)
423 if (!strcasecmp (debug_level
[i
], (char *) "init")
424 && cat
== ASSUAN_LOG_INIT
)
430 if (!strcasecmp (debug_level
[i
], (char *) "ctx")
431 && cat
== ASSUAN_LOG_CTX
)
437 if (!strcasecmp (debug_level
[i
], (char *) "engine")
438 && cat
== ASSUAN_LOG_ENGINE
)
444 if (!strcasecmp (debug_level
[i
], (char *) "data")
445 && cat
== ASSUAN_LOG_DATA
)
451 if (!strcasecmp (debug_level
[i
], (char *) "sysio")
452 && cat
== ASSUAN_LOG_SYSIO
)
458 if (!strcasecmp (debug_level
[i
], (char *) "control")
459 && cat
== ASSUAN_LOG_CONTROL
)
473 open (logfile
, O_WRONLY
| O_CREAT
| O_APPEND
, 0600)) == -1)
474 warn ("%s", logfile
);
477 pthread_cleanup_push (cleanup_fd_cb
, &fd
);
478 write (fd
, msg
, strlen (msg
));
479 pthread_cleanup_pop (1);
485 fprintf (stderr
, "%s%s", data
? (char *) data
: "", msg
);
490 pthread_cleanup_pop (1);
495 log_write (const char *fmt
, ...)
501 pthread_t tid
= pthread_self ();
502 static pthread_mutex_t m
= PTHREAD_MUTEX_INITIALIZER
;
504 if ((!logfile
&& !isatty (STDERR_FILENO
) && !log_syslog
) || !fmt
)
507 pthread_mutex_lock (&m
);
508 pthread_cleanup_push ((void (*)(void *)) pthread_mutex_unlock
, &m
);
510 if (!cmdline
&& logfile
&& log_fd
== -1)
512 log_fd
= open (logfile
, O_WRONLY
| O_CREAT
| O_APPEND
, 0600);
514 warn ("%s", logfile
);
519 if (str_vasprintf (&args
, fmt
, ap
) != -1)
523 pthread_cleanup_push (xfree
, args
);
524 fprintf (stderr
, "pwmd: %s\n", args
);
526 pthread_cleanup_pop (1);
530 char *name
= pthread_getspecific (thread_name_key
);
533 pthread_cleanup_push (xfree
, args
);
534 snprintf (buf
, sizeof (buf
), "%s(%p): ", name
? name
: _("unknown"),
538 if (!cmdline
&& log_syslog
&& !nofork
)
539 syslog (LOG_INFO
, "%s%s", name
, args
);
542 struct tm
*tm
= localtime (&now
);
544 strftime (tbuf
, sizeof (tbuf
), "%b %d %Y %H:%M:%S ", tm
);
545 tbuf
[sizeof (tbuf
) - 1] = 0;
547 if (args
[strlen (args
) - 1] == '\n')
548 args
[strlen (args
) - 1] = 0;
550 line
= str_asprintf ("%s %i %s%s\n", tbuf
, getpid (), name
,
552 pthread_cleanup_pop (1);
555 pthread_cleanup_push (xfree
, line
);
556 if (logfile
&& log_fd
!= -1)
558 write (log_fd
, line
, strlen (line
));
564 fprintf (stdout
, "%s", line
);
568 pthread_cleanup_pop (1);
574 pthread_cleanup_pop (0);
576 if (log_fd
!= -1 && config_get_boolean (NULL
, "log_keepopen") <= 0)
582 pthread_mutex_unlock (&m
);
587 secure_mem_check (const void *arg
)
596 gcry_control (GCRYCTL_SET_THREAD_CBS
, &gcry_threads_pthread
);
598 if (!gcry_check_version (GCRYPT_VERSION
))
600 fprintf (stderr
, _("gcry_check_version(): Incompatible libgcrypt. "
601 "Wanted %s, got %s.\n"), GCRYPT_VERSION
,
602 gcry_check_version (NULL
));
603 return GPG_ERR_UNKNOWN_VERSION
;
606 gcry_set_allocation_handler (xmalloc
, xmalloc
, NULL
, xrealloc
, xfree
);
611 do_validate_peer (assuan_context_t ctx
, const char *section
,
612 assuan_peercred_t
* peer
)
617 struct client_s
*client
= assuan_get_pointer (ctx
);
620 if (client
&& client
->thd
->remote
)
621 return tls_validate_access (client
, section
);
624 rc
= assuan_get_peercred (ctx
, peer
);
628 users
= config_get_list (section
, "allowed");
631 for (char **p
= users
; *p
; p
++)
633 rc
= acl_check_common(client
, *p
, (*peer
)->uid
, (*peer
)->gid
,
640 return allowed
? 0 : rc
? rc
: GPG_ERR_EACCES
;
644 peer_is_invoker(struct client_s
*client
)
647 if (client
->thd
->remote
)
649 char *p
= invoking_tls
;
651 if (!p
|| !*p
|| *p
++ != '#')
652 return GPG_ERR_EACCES
;
654 if (!strcmp(client
->thd
->tls
->fp
, p
))
657 return GPG_ERR_EACCES
;
661 if (client
->thd
->peer
->uid
== invoking_uid
)
664 return GPG_ERR_EACCES
;
667 #ifdef HAVE_GETGRNAM_R
669 acl_check_common (struct client_s
*client
, const char *user
, uid_t uid
,
670 gid_t gid
, int *allowed
)
672 struct passwd pw
, *result
;
681 if (*user
== '-' || *user
== '!')
684 if (*user
== '+') // not implemented yet
687 if (*user
== '#') // TLS fingerprint hash
690 if (not || rw
|| tls
)
696 if (client
->thd
->remote
)
698 if (!strcasecmp (client
->thd
->tls
->fp
, user
))
708 else if (client
->thd
->remote
) // Remote client with no TLS in the ACL
712 if (*user
== '@') // all users in group
714 struct group gr
, *gresult
;
715 size_t len
= sysconf (_SC_GETGR_R_SIZE_MAX
);
722 return GPG_ERR_ENOMEM
;
725 if (!getgrnam_r (user
, &gr
, buf
, len
, &gresult
) && gresult
)
727 if (gresult
->gr_gid
== gid
)
734 len
= sysconf (_SC_GETPW_R_SIZE_MAX
);
738 char *tbuf
= xmalloc (len
);
739 for (char **t
= gresult
->gr_mem
; *t
; t
++)
741 if (!getpwnam_r (*t
, &pw
, tbuf
, len
, &result
) && result
)
743 if (result
->pw_uid
== uid
)
756 size_t len
= sysconf (_SC_GETPW_R_SIZE_MAX
);
763 return GPG_ERR_ENOMEM
;
765 if (!getpwnam_r (user
, &pw
, buf
, len
, &result
) && result
)
767 if (result
->pw_uid
== uid
)
778 acl_check_common (struct client_s
*client
, const char *user
, uid_t uid
,
779 gid_t gid
, int *allowed
)
781 struct passwd
*result
;
789 if (*user
== '-' || *user
== '!')
792 if (*user
== '+') // not implemented yet
795 if (*user
== '#') // TLS fingerprint hash
798 if (not || rw
|| tls
)
804 if (client
->thd
->remote
)
806 if (!strcasecmp (client
->thd
->tls
->fp
, user
))
816 if (*user
== '@') // all users in group
818 struct group
*gresult
;
821 gresult
= getgrnam (user
);
822 if (gresult
&& gresult
->gr_gid
== gid
)
828 for (char **t
= gresult
->gr_mem
; *t
; t
++)
830 result
= getpwnam (*t
);
831 if (result
&& result
->pw_uid
== uid
)
842 result
= getpwnam (user
);
843 if (result
&& result
->pw_uid
== uid
)
852 validate_peer (struct client_s
*cl
)
858 return tls_validate_access (cl
, NULL
);
861 rc
= do_validate_peer (cl
->ctx
, "global", &cl
->thd
->peer
);
862 if (!rc
|| gpg_err_code (rc
) == GPG_ERR_EACCES
)
863 log_write ("peer %s: uid=%i, gid=%i, pid=%i",
864 !rc
? _("accepted") : _("rejected"), cl
->thd
->peer
->uid
,
865 cl
->thd
->peer
->gid
, cl
->thd
->peer
->pid
);
867 log_write ("%s: %s", __FUNCTION__
, pwmd_strerror (rc
));
873 xml_error_cb (void *data
, xmlErrorPtr e
)
875 struct client_s
*client
= data
;
878 * Keep the first reported error as the one to show in the error
879 * description. Reset in send_error().
881 if (client
->xml_error
)
884 client
->xml_error
= xcalloc (1, sizeof(xmlError
));
885 xmlCopyError (e
, client
->xml_error
);
889 hook_waitpid (assuan_context_t ctx
, pid_t pid
, int action
,
890 int *status
, int options
)
892 return waitpid (pid
, status
, options
);
896 hook_read (assuan_context_t ctx
, assuan_fd_t fd
, void *data
, size_t len
)
899 struct client_s
*client
= assuan_get_pointer (ctx
);
901 if (client
->thd
->remote
)
902 return tls_read_hook (ctx
, (int) fd
, data
, len
);
905 return read ((int) fd
, data
, len
);
909 hook_write (assuan_context_t ctx
, assuan_fd_t fd
,
910 const void *data
, size_t len
)
913 struct client_s
*client
= assuan_get_pointer (ctx
);
915 if (client
->thd
->remote
)
916 return tls_write_hook (ctx
, (int) fd
, data
, len
);
919 return write ((int) fd
, data
, len
);
923 new_connection (struct client_s
*cl
)
926 static struct assuan_malloc_hooks mhooks
= { xmalloc
, xrealloc
, xfree
};
927 static struct assuan_system_hooks shooks
= {
928 ASSUAN_SYSTEM_HOOKS_VERSION
,
936 NULL
, //sendmsg both are used for FD passing
947 char *prio
= config_get_string ("global", "tls_cipher_suite");
949 cl
->thd
->tls
= tls_init (cl
->thd
->fd
, cl
->thd
->timeout
, prio
);
956 rc
= assuan_new_ext (&cl
->ctx
, GPG_ERR_SOURCE_DEFAULT
, &mhooks
,
957 debug_level
? assuan_log_cb
: NULL
, NULL
);
961 assuan_ctx_set_system_hooks (cl
->ctx
, &shooks
);
962 rc
= assuan_init_socket_server (cl
->ctx
, cl
->thd
->fd
, 2);
966 assuan_set_pointer (cl
->ctx
, cl
);
967 assuan_set_hello_line (cl
->ctx
, PACKAGE_STRING
);
968 rc
= register_commands (cl
->ctx
);
975 cl
->thd
->timeout
= config_get_integer ("global", "tls_timeout");
976 fcntl (cl
->thd
->fd
, F_SETFL
, O_NONBLOCK
);
980 rc
= assuan_accept (cl
->ctx
);
984 rc
= validate_peer (cl
);
985 /* May not be implemented on all platforms. */
986 if (rc
&& gpg_err_code (rc
) != GPG_ERR_ASS_GENERAL
)
989 rc
= init_client_crypto (&cl
->crypto
);
995 cl
->crypto
->agent
->client_ctx
= cl
->ctx
;
998 cl
->crypto
->client_ctx
= cl
->ctx
;
999 xmlSetStructuredErrorFunc (cl
, xml_error_cb
);
1003 log_write ("%s", pwmd_strerror (rc
));
1008 * This is called after a client_thread() terminates. Set with
1009 * pthread_cleanup_push().
1012 cleanup_cb (void *arg
)
1014 struct client_thread_s
*cn
= arg
;
1015 struct client_s
*cl
= cn
->cl
;
1017 MUTEX_LOCK (&cn_mutex
);
1018 cn_thread_list
= slist_remove (cn_thread_list
, cn
);
1019 MUTEX_UNLOCK (&cn_mutex
);
1023 cleanup_client (cl
);
1025 xmlResetError (cl
->xml_error
);
1027 xfree (cl
->xml_error
);
1032 gnutls_deinit (cn
->tls
->ses
);
1033 xfree (cn
->tls
->fp
);
1038 if (!cn
->atfork
&& cl
->ctx
)
1039 assuan_release (cl
->ctx
);
1040 else if (!cn
->atfork
&& cl
->thd
&& cl
->thd
->fd
!= -1)
1041 close (cl
->thd
->fd
);
1044 cleanup_crypto (&cl
->crypto
);
1046 pinentry_free_opts (&cl
->pinentry_opts
);
1055 while (cn
->msg_queue
)
1057 struct status_msg_s
*msg
= cn
->msg_queue
;
1059 cn
->msg_queue
= msg
->next
;
1064 if (!cn
->atfork
&& cn
->status_msg_pipe
[0] != -1)
1065 close (cn
->status_msg_pipe
[0]);
1067 if (!cn
->atfork
&& cn
->status_msg_pipe
[1] != -1)
1068 close (cn
->status_msg_pipe
[1]);
1070 pthread_mutex_destroy (&cn
->status_mutex
);
1074 log_write (_("exiting, fd=%i"), cn
->fd
);
1075 send_status_all (STATUS_CLIENTS
, NULL
);
1079 pthread_cond_signal (&quit_cond
);
1083 cleanup_all_clients (int atfork
)
1085 /* This function may be called from pthread_atfork() which requires
1086 reinitialization. */
1089 pthread_mutexattr_t attr
;
1091 pthread_mutexattr_init (&attr
);
1092 pthread_mutexattr_settype (&attr
, PTHREAD_MUTEX_RECURSIVE
);
1093 pthread_mutex_init (&cn_mutex
, &attr
);
1094 pthread_mutexattr_destroy (&attr
);
1095 cache_mutex_init ();
1098 MUTEX_LOCK (&cn_mutex
);
1100 while (slist_length (cn_thread_list
))
1102 struct client_thread_s
*thd
= slist_nth_data (cn_thread_list
, 0);
1104 thd
->atfork
= atfork
;
1109 MUTEX_UNLOCK (&cn_mutex
);
1110 cache_deinit (atfork
);
1114 send_msg_queue (struct client_thread_s
*thd
)
1116 MUTEX_LOCK (&thd
->status_mutex
);
1120 read (thd
->status_msg_pipe
[0], &c
, 1);
1122 while (thd
->msg_queue
)
1124 struct status_msg_s
*msg
= thd
->msg_queue
;
1126 thd
->msg_queue
= thd
->msg_queue
->next
;
1127 MUTEX_UNLOCK (&thd
->status_mutex
);
1128 rc
= send_status (thd
->cl
->ctx
, msg
->s
, msg
->line
);
1129 MUTEX_LOCK (&thd
->status_mutex
);
1137 MUTEX_UNLOCK (&thd
->status_mutex
);
1138 if (rc
&& gpg_err_code (rc
) != GPG_ERR_EPIPE
)
1139 log_write ("%s: %s", __FUNCTION__
, pwmd_strerror (rc
));
1145 client_thread (void *data
)
1147 struct client_thread_s
*thd
= data
;
1148 struct client_s
*cl
= xcalloc (1, sizeof (struct client_s
));
1150 #ifdef HAVE_PR_SET_NAME
1151 prctl (PR_SET_NAME
, "client");
1153 pthread_setspecific (thread_name_key
, str_dup (__FUNCTION__
));
1157 log_write ("%s(%i): %s", __FILE__
, __LINE__
,
1158 pwmd_strerror (GPG_ERR_ENOMEM
));
1162 MUTEX_LOCK (&cn_mutex
);
1163 pthread_cleanup_push (cleanup_cb
, thd
);
1166 MUTEX_UNLOCK (&cn_mutex
);
1168 if (new_connection (cl
))
1173 send_status_all (STATUS_CLIENTS
, NULL
);
1174 rc
= send_status (cl
->ctx
, STATUS_CACHE
, NULL
);
1177 log_write ("%s(%i): %s", __FILE__
, __LINE__
, pwmd_strerror (rc
));
1188 FD_SET (thd
->fd
, &rfds
);
1189 FD_SET (thd
->status_msg_pipe
[0], &rfds
);
1190 n
= thd
->fd
> thd
->status_msg_pipe
[0]
1191 ? thd
->fd
: thd
->status_msg_pipe
[0];
1193 n
= select (n
+ 1, &rfds
, NULL
, NULL
, NULL
);
1196 log_write ("%s", strerror (errno
));
1200 if (FD_ISSET (thd
->status_msg_pipe
[0], &rfds
))
1202 rc
= send_msg_queue (thd
);
1203 if (rc
&& gpg_err_code (rc
) != GPG_ERR_EPIPE
)
1207 if (!FD_ISSET (thd
->fd
, &rfds
))
1210 rc
= assuan_process_next (cl
->ctx
, &eof
);
1213 if (gpg_err_code (rc
) == GPG_ERR_EOF
|| eof
)
1216 log_write ("assuan_process_next(): rc=%i %s", rc
,
1217 pwmd_strerror (rc
));
1218 if (rc
== gpg_error (GPG_ERR_ETIMEDOUT
))
1221 rc
= send_error (cl
->ctx
, rc
);
1224 log_write ("assuan_process_done(): rc=%i %s", rc
,
1225 pwmd_strerror (rc
));
1230 /* Since the msg queue pipe fd's are non-blocking, check for
1231 * pending status msgs here. GPG_ERR_EPIPE can be seen when the
1232 * client has already disconnected and will be converted to
1233 * GPG_ERR_EOF during assuan_process_next().
1235 rc
= send_msg_queue (thd
);
1236 if (rc
&& gpg_err_code (rc
) != GPG_ERR_EPIPE
)
1241 pthread_cleanup_pop (1);
1246 xml_import (const char *filename
, const char *outfile
,
1247 const char *keygrip
, const char *sign_keygrip
,
1248 const char *keyfile
, int no_passphrase
, const char *cipher
,
1249 const char *params
, unsigned long s2k_count
, uint64_t iterations
)
1258 struct crypto_s
*crypto
= NULL
;
1261 int algo
= cipher
? cipher_string_to_gcrypt ((char *) cipher
) :
1266 log_write ("ERR %i: %s", gpg_error (GPG_ERR_CIPHER_ALGO
),
1267 pwmd_strerror (GPG_ERR_CIPHER_ALGO
));
1271 if (stat (filename
, &st
) == -1)
1273 log_write ("%s: %s", filename
,
1274 pwmd_strerror (gpg_error_from_errno (errno
)));
1278 rc
= init_client_crypto (&crypto
);
1282 memcpy (&crypto
->save
.hdr
, &crypto
->hdr
, sizeof (file_header_t
));
1283 crypto
->save
.hdr
.flags
= set_cipher_flag (crypto
->save
.hdr
.flags
, algo
);
1284 log_write (_("Importing XML from '%s'. Output will be written to '%s' ..."),
1287 if ((fd
= open (filename
, O_RDONLY
)) == -1)
1289 log_write ("%s: %s", filename
,
1290 pwmd_strerror (gpg_error_from_errno (errno
)));
1294 if ((xmlbuf
= xmalloc (st
.st_size
+ 1)) == NULL
)
1297 log_write ("%s(%i): %s", __FILE__
, __LINE__
,
1298 pwmd_strerror (GPG_ERR_ENOMEM
));
1302 if (read (fd
, xmlbuf
, st
.st_size
) == -1)
1304 rc
= gpg_error_from_errno (errno
);
1306 log_write ("%s: %s", filename
, pwmd_strerror (rc
));
1311 xmlbuf
[st
.st_size
] = 0;
1313 * Make sure the document validates.
1315 if ((doc
= xmlReadDoc (xmlbuf
, NULL
, "UTF-8", XML_PARSE_NOBLANKS
)) == NULL
)
1317 log_write ("xmlReadDoc() failed");
1323 xmlNodePtr n
= xmlDocGetRootElement (doc
);
1324 if (n
&& !xmlStrEqual (n
->name
, (xmlChar
*) "pwmd"))
1326 log_write (_("Could not find root \"pwmd\" element."));
1327 rc
= GPG_ERR_BAD_DATA
;
1331 rc
= validate_import (NULL
, n
? n
->children
: n
);
1335 log_write ("ERR %i: %s", rc
, pwmd_strerror (rc
));
1340 xmlDocDumpMemory (doc
, &xml
, &len
);
1342 crypto
->save
.s2k_count
= s2k_count
;
1343 crypto
->save
.hdr
.iterations
= iterations
;
1346 rc
= export_common (NULL
, 0, crypto
, xml
, len
, outfile
, keyfile
, &key
,
1347 &keylen
, 0, 0, no_passphrase
);
1349 log_write (_("Success!"));
1354 rc
= agent_set_pinentry_options (crypto
->agent
);
1356 rc
= agent_export_common (crypto
, keygrip
, sign_keygrip
, no_passphrase
,
1357 xml
, len
, outfile
, params
, keyfile
);
1365 send_error (NULL
, rc
);
1369 cleanup_crypto (&crypto
);
1373 cleanup_crypto (&crypto
);
1378 do_cache_push (const char *filename
, struct crypto_s
*crypto
)
1380 unsigned char md5file
[16];
1385 struct cache_data_s
*cdata
;
1389 log_write (_("Trying to add datafile '%s' to the file cache ..."),
1392 if (valid_filename (filename
) == 0)
1394 log_write (_("%s: Invalid characters in filename"), filename
);
1398 rc
= decrypt_common (NULL
, 0, crypto
, filename
, &key
, &keylen
);
1402 rc
= parse_doc ((char *) crypto
->plaintext
, crypto
->plaintext_len
, &doc
);
1405 log_write ("%s", pwmd_strerror (rc
));
1410 gcry_md_hash_buffer (GCRY_MD_MD5
, md5file
, filename
, strlen (filename
));
1411 cdata
= xcalloc (1, sizeof (struct cache_data_s
));
1415 log_write ("%s", pwmd_strerror (GPG_ERR_ENOMEM
));
1420 rc
= get_checksum (filename
, &crc
, &len
);
1423 log_write ("ERR %i: %s", rc
, pwmd_strerror (rc
));
1425 free_cache_data_once (cdata
);
1431 rc
= encrypt_xml (NULL
, cache_key
, cache_keysize
, GCRY_CIPHER_AES
,
1432 crypto
->plaintext
, crypto
->plaintext_len
, &cdata
->doc
,
1433 &cdata
->doclen
, &cache_iv
, &cache_blocksize
, 0);
1434 if (!rc
&& !IS_PKI (crypto
))
1437 cdata
->keylen
= keylen
;
1444 log_write ("ERR %i: %s", rc
, pwmd_strerror (rc
));
1446 free_cache_data_once (cdata
);
1451 if (use_agent
&& IS_PKI (crypto
))
1453 gcry_sexp_build ((gcry_sexp_t
*) & cdata
->pubkey
, NULL
, "%S",
1455 gcry_sexp_build ((gcry_sexp_t
*) & cdata
->sigkey
, NULL
, "%S",
1456 crypto
->sigpkey_sexp
);
1460 int timeout
= config_get_integer (filename
, "cache_timeout");
1461 cache_add_file (md5file
, crypto
->grip
, cdata
, timeout
);
1462 log_write (_("Successfully added '%s' to the cache."), filename
);
1467 init_client (int fd
, const char *addr
)
1470 struct client_thread_s
*new = xcalloc (1, sizeof (struct client_thread_s
));
1475 return GPG_ERR_ENOMEM
;
1478 MUTEX_LOCK (&cn_mutex
);
1479 pthread_cleanup_push (cleanup_mutex_cb
, &cn_mutex
);
1481 if (pipe (new->status_msg_pipe
) == -1)
1482 rc
= gpg_error_from_errno (errno
);
1486 fcntl (new->status_msg_pipe
[0], F_SETFL
, O_NONBLOCK
);
1487 fcntl (new->status_msg_pipe
[1], F_SETFL
, O_NONBLOCK
);
1488 pthread_mutex_init (&new->status_mutex
, NULL
);
1494 new->remote
= addr
? 1 : 0;
1497 rc
= create_thread (client_thread
, new, &new->tid
, 1);
1500 close (new->status_msg_pipe
[0]);
1501 close (new->status_msg_pipe
[1]);
1502 pthread_mutex_destroy (&new->status_mutex
);
1508 struct slist_s
*list
= slist_append (cn_thread_list
, new);
1512 cn_thread_list
= list
;
1514 log_write (_("new connection: tid=%p, fd=%i, addr=%s"),
1515 (pthread_t
*) new->tid
, fd
, addr
);
1517 log_write (_("new connection: tid=%p, fd=%i"),
1518 (pthread_t
*) new->tid
, fd
);
1521 rc
= GPG_ERR_ENOMEM
;
1524 pthread_cleanup_pop (1);
1530 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
1531 pwmd_strerror (rc
));
1537 keepalive_thread (void *arg
)
1539 #ifndef HAVE_PTHREAD_CANCEL
1540 int *n
= xmalloc (sizeof (int));
1543 pthread_setspecific (signal_thread_key
, n
);
1547 #ifdef HAVE_PR_SET_NAME
1548 prctl (PR_SET_NAME
, "keepalive");
1550 pthread_setspecific (thread_name_key
, str_dup (__FUNCTION__
));
1554 int n
= config_get_integer ("global", "keepalive_interval");
1555 struct timeval tv
= { n
, 0 };
1556 #ifndef HAVE_PTHREAD_CANCEL
1559 sigusr2
= (int *) pthread_getspecific (signal_thread_key
);
1564 send_status_all (STATUS_KEEPALIVE
, NULL
);
1565 select (0, NULL
, NULL
, NULL
, &tv
);
1572 /* From Beej's Guide to Network Programming. It's a good tutorial. */
1574 get_in_addr (struct sockaddr
*sa
)
1576 if (sa
->sa_family
== AF_INET
)
1577 return &(((struct sockaddr_in
*) sa
)->sin_addr
);
1579 return &(((struct sockaddr_in6
*) sa
)->sin6_addr
);
1583 tcp_accept_thread (void *arg
)
1585 int sockfd
= *(int *) arg
;
1586 #ifndef HAVE_PTHREAD_CANCEL
1587 int *n
= xmalloc (sizeof (int));
1590 pthread_setspecific (signal_thread_key
, n
);
1592 fcntl (sockfd
, F_SETFL
, O_NONBLOCK
);
1595 #ifdef HAVE_PR_SET_NAME
1596 prctl (PR_SET_NAME
, "tcp_accept");
1598 pthread_setspecific (thread_name_key
, str_dup (__FUNCTION__
));
1602 struct sockaddr_storage raddr
;
1603 socklen_t slen
= sizeof (raddr
);
1606 char s
[INET6_ADDRSTRLEN
];
1607 struct timeval tv
= { 0, ACCEPT_TIMEOUT
};
1608 #ifndef HAVE_PTHREAD_CANCEL
1611 sigusr2
= (int *) pthread_getspecific (signal_thread_key
);
1616 fd
= accept (sockfd
, (struct sockaddr
*) &raddr
, &slen
);
1619 if (errno
== EMFILE
|| errno
== ENFILE
)
1620 log_write ("accept(): %s",
1621 pwmd_strerror (gpg_error_from_errno (errno
)));
1622 else if (errno
!= EAGAIN
)
1624 if (!quit
) // probably EBADF
1625 log_write ("accept(): %s", strerror (errno
));
1630 #ifndef HAVE_PTHREAD_CANCEL
1631 select (0, NULL
, NULL
, NULL
, &tv
);
1639 inet_ntop (raddr
.ss_family
, get_in_addr ((struct sockaddr
*) &raddr
),
1641 (void) init_client (fd
, s
);
1642 n
= config_get_integer ("global", "tcp_wait");
1645 tv
.tv_sec
= (n
* 100000) / 100000;
1646 tv
.tv_usec
= (n
* 100000) % 100000;
1647 select (0, NULL
, NULL
, NULL
, &tv
);
1655 start_stop_tls_with_protocol (int ipv6
, int term
)
1657 struct addrinfo hints
, *servinfo
, *p
;
1658 int port
= config_get_integer ("global", "tcp_port");
1662 int *fd
= ipv6
? &tls6_fd
: &tls_fd
;
1664 if (term
|| config_get_boolean ("global", "enable_tcp") == 0)
1670 #ifdef HAVE_PTHREAD_CANCEL
1671 pthread_cancel (tls6_tid
);
1673 pthread_kill (tls6_tid
, SIGUSR2
);
1675 pthread_join (tls6_tid
, NULL
);
1678 shutdown (tls6_fd
, SHUT_RDWR
);
1688 #ifdef HAVE_PTHREAD_CANCEL
1689 pthread_cancel (tls_tid
);
1691 pthread_kill (tls_tid
, SIGUSR2
);
1693 pthread_join (tls_tid
, NULL
);
1696 shutdown (tls_fd
, SHUT_RDWR
);
1702 /* A client may still be connected. */
1703 if (!quit
&& x509_cred
!= NULL
)
1704 tls_deinit_params ();
1709 if ((ipv6
&& tls6_fd
!= -1) || (!ipv6
&& tls_fd
!= -1))
1712 memset (&hints
, 0, sizeof (hints
));
1713 hints
.ai_family
= ipv6
? AF_INET6
: AF_INET
;
1714 hints
.ai_socktype
= SOCK_STREAM
;
1715 hints
.ai_flags
= AI_PASSIVE
;
1716 snprintf (buf
, sizeof (buf
), "%i", port
);
1718 if ((n
= getaddrinfo (NULL
, buf
, &hints
, &servinfo
)) == -1)
1720 log_write ("getaddrinfo(): %s", gai_strerror (n
));
1724 for (n
= 0, p
= servinfo
; p
!= NULL
; p
= p
->ai_next
)
1728 if ((ipv6
&& p
->ai_family
!= AF_INET6
)
1729 || (!ipv6
&& p
->ai_family
!= AF_INET
))
1732 if ((*fd
= socket (p
->ai_family
, p
->ai_socktype
, p
->ai_protocol
)) == -1)
1734 log_write ("socket(): %s", strerror (errno
));
1738 if (setsockopt (*fd
, SOL_SOCKET
, SO_REUSEADDR
, &r
, sizeof (int)) == -1)
1740 log_write ("setsockopt(): %s",
1741 pwmd_strerror (gpg_error_from_errno (errno
)));
1742 freeaddrinfo (servinfo
);
1746 if (bind (*fd
, p
->ai_addr
, p
->ai_addrlen
) == -1)
1749 log_write ("bind(): %s",
1750 pwmd_strerror (gpg_error_from_errno (errno
)));
1758 freeaddrinfo (servinfo
);
1763 #if HAVE_DECL_SO_BINDTODEVICE != 0
1764 char *tmp
= config_get_string ("global", "tcp_interface");
1765 if (tmp
&& setsockopt (*fd
, SOL_SOCKET
, SO_BINDTODEVICE
, tmp
,
1766 strlen (tmp
)) == -1)
1768 log_write ("setsockopt(): %s",
1769 pwmd_strerror (gpg_error_from_errno (errno
)));
1777 if (x509_cred
== NULL
)
1779 rc
= tls_init_params ();
1784 if (listen (*fd
, 0) == -1)
1786 log_write ("listen(): %s", strerror (errno
));
1791 rc
= create_thread (tcp_accept_thread
, fd
, &tls6_tid
, 0);
1793 rc
= create_thread (tcp_accept_thread
, fd
, &tls_tid
, 0);
1797 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
1798 pwmd_strerror (rc
));
1810 start_stop_tls_with_protocol (0, 1);
1823 start_stop_tls (int term
)
1825 char *s
= config_get_string ("global", "tcp_bind");
1831 if (!strcmp (s
, "any"))
1833 b
= start_stop_tls_with_protocol (0, term
);
1835 b
= start_stop_tls_with_protocol (1, term
);
1837 else if (!strcmp (s
, "ipv4"))
1838 b
= start_stop_tls_with_protocol (0, term
);
1839 else if (!strcmp (s
, "ipv6"))
1840 b
= start_stop_tls_with_protocol (1, term
);
1850 accept_thread (void *arg
)
1852 int sockfd
= *(int *) arg
;
1853 #ifndef HAVE_PTHREAD_CANCEL
1854 int *n
= xmalloc (sizeof (int));
1857 pthread_setspecific (signal_thread_key
, n
);
1859 fcntl (sockfd
, F_SETFL
, O_NONBLOCK
);
1862 #ifdef HAVE_PR_SET_NAME
1863 prctl (PR_SET_NAME
, "accept");
1865 pthread_setspecific (thread_name_key
, str_dup (__FUNCTION__
));
1869 socklen_t slen
= sizeof (struct sockaddr_un
);
1870 struct sockaddr_un raddr
;
1872 #ifndef HAVE_PTHREAD_CANCEL
1873 struct timeval tv
= { 0, ACCEPT_TIMEOUT
};
1874 int *sigusr2
= (int *) pthread_getspecific (signal_thread_key
);
1880 fd
= accept (sockfd
, (struct sockaddr
*) &raddr
, &slen
);
1883 if (errno
== EMFILE
|| errno
== ENFILE
)
1884 log_write ("accept(): %s",
1885 pwmd_strerror (gpg_error_from_errno (errno
)));
1886 else if (errno
!= EAGAIN
)
1888 if (!quit
) // probably EBADF
1889 log_write ("accept(): %s",
1890 pwmd_strerror (gpg_error_from_errno (errno
)));
1895 #ifndef HAVE_PTHREAD_CANCEL
1896 select (0, NULL
, NULL
, NULL
, &tv
);
1901 (void) init_client (fd
, NULL
);
1904 /* Just in case accept() failed for some reason other than EBADF */
1910 cache_timer_thread (void *arg
)
1912 #ifndef HAVE_PTHREAD_CANCEL
1913 int *n
= xmalloc (sizeof (int));
1916 pthread_setspecific (signal_thread_key
, n
);
1920 #ifdef HAVE_PR_SET_NAME
1921 prctl (PR_SET_NAME
, "cache timer");
1923 pthread_setspecific (thread_name_key
, str_dup (__FUNCTION__
));
1927 struct timeval tv
= { 1, 0 };
1928 #ifndef HAVE_PTHREAD_CANCEL
1931 n
= (int *) pthread_getspecific (signal_thread_key
);
1936 select (0, NULL
, NULL
, NULL
, &tv
);
1937 cache_adjust_timeout ();
1944 signal_loop (sigset_t sigset
)
1953 sigwait (&sigset
, &sig
);
1956 log_write (_("caught signal %i (%s)"), sig
, strsignal (sig
));
1961 pthread_cond_signal (&rcfile_cond
);
1964 log_write (_("clearing file cache"));
1966 send_status_all (STATUS_CACHE
, NULL
);
1985 log_write (_ ("Caught signal %i (%s). Exiting."), sig
, strsignal (sig
));
1986 #ifdef HAVE_BACKTRACE
1987 BACKTRACE (__FUNCTION__
);
1993 waiting_for_exit (void *arg
)
1996 #ifndef HAVE_PTHREAD_CANCEL
1997 int *n
= xmalloc (sizeof (int));
2000 pthread_setspecific (signal_thread_key
, n
);
2004 #ifdef HAVE_PR_SET_NAME
2005 prctl (PR_SET_NAME
, "exiting");
2007 pthread_setspecific (thread_name_key
, str_dup (__FUNCTION__
));
2008 log_write (_("waiting for all clients to disconnect"));
2009 MUTEX_LOCK (&quit_mutex
);
2010 pthread_cleanup_push (cleanup_mutex_cb
, &quit_mutex
);
2017 MUTEX_LOCK (&cn_mutex
);
2018 n
= slist_length (cn_thread_list
);
2019 MUTEX_UNLOCK (&cn_mutex
);
2023 #ifndef HAVE_PTHREAD_CANCEL
2024 int *s
= (int *) pthread_getspecific (signal_thread_key
);
2031 log_write (_("%i clients remain"), n
);
2035 INIT_TIMESPEC (SIG_TIMEOUT
, ts
);
2036 pthread_cond_timedwait (&quit_cond
, &quit_mutex
, &ts
);
2039 kill (getpid (), SIGQUIT
);
2040 pthread_cleanup_pop (1);
2045 server_loop (int sockfd
, char **socketpath
)
2047 pthread_t accept_tid
;
2048 pthread_t cache_timeout_tid
;
2049 int cancel_timeout_thread
= 0, cancel_accept_thread
= 0;
2050 int cancel_keepalive_thread
= 0;
2057 sigemptyset (&sigset
);
2060 sigaddset (&sigset
, SIGTERM
);
2061 sigaddset (&sigset
, SIGINT
);
2063 /* Clears the file cache. */
2064 sigaddset (&sigset
, SIGUSR1
);
2066 /* Configuration file reloading. */
2067 sigaddset (&sigset
, SIGHUP
);
2069 /* For exiting cleanly. */
2070 sigaddset (&sigset
, SIGQUIT
);
2072 #ifndef HAVE_PTHREAD_CANCEL
2074 The socket, cache and rcfile threads use this signal when
2075 pthread_cancel() is unavailable. Prevent the main thread from
2076 catching this signal from another process.
2078 sigaddset (&sigset
, SIGUSR2
);
2081 /* When mem.c cannot find a pointer in the list (double free). */
2082 signal (SIGABRT
, catchsig
);
2083 sigaddset (&sigset
, SIGABRT
);
2084 sigprocmask (SIG_BLOCK
, &sigset
, NULL
);
2086 #ifndef HAVE_PTHREAD_CANCEL
2087 /* Remove this signal from the watched signals in signal_loop(). */
2088 sigdelset (&sigset
, SIGUSR2
);
2091 /* Ignored everywhere. When a client disconnects abnormally this signal
2092 * gets raised. It isn't needed though because client_thread() will check
2093 * for rcs even after the client disconnects. */
2094 signal (SIGPIPE
, SIG_IGN
);
2096 /* Can show a backtrace of the stack in the log. */
2097 signal (SIGSEGV
, catchsig
);
2100 /* Needs to be done after the fork(). */
2101 if (!start_stop_tls (0))
2108 pthread_mutex_init (&quit_mutex
, NULL
);
2109 pthread_cond_init (&quit_cond
, NULL
);
2110 char *p
= get_username (getuid());
2111 log_write (_("%s started for user %s"), PACKAGE_STRING
, p
);
2115 if (config_get_boolean ("global", "enable_tcp"))
2116 log_write (_("Listening on %s and TCP port %i as user %i"), *socketpath
,
2117 config_get_integer ("global", "tcp_port"), invoking_uid
);
2119 log_write (_("Listening on %s"), *socketpath
);
2121 log_write (_("Listening on %s"), *socketpath
);
2124 rc
= create_thread (keepalive_thread
, NULL
, &keepalive_tid
, 0);
2127 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
2128 pwmd_strerror (rc
));
2132 cancel_keepalive_thread
= 1;
2133 rc
= create_thread (reload_rcfile_thread
, NULL
, &rcfile_tid
, 0);
2136 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
2137 pwmd_strerror (rc
));
2141 rc
= create_thread (cache_timer_thread
, NULL
, &cache_timeout_tid
, 0);
2144 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
2145 pwmd_strerror (rc
));
2149 cancel_timeout_thread
= 1;
2150 rc
= create_thread (accept_thread
, &sockfd
, &accept_tid
, 0);
2153 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
2154 pwmd_strerror (rc
));
2158 cancel_accept_thread
= 1;
2160 signal_loop (sigset
);
2166 * We're out of the main server loop. This happens when a signal was sent
2167 * to terminate the daemon. We'll wait for all clients to disconnect
2168 * before exiting but exit immediately if another termination signal is
2171 if (cancel_accept_thread
)
2173 #ifdef HAVE_PTHREAD_CANCEL
2174 int n
= pthread_cancel (accept_tid
);
2176 int n
= pthread_kill (accept_tid
, SIGUSR2
);
2179 pthread_join (accept_tid
, NULL
);
2185 shutdown (sockfd
, SHUT_RDWR
);
2187 unlink (*socketpath
);
2188 xfree (*socketpath
);
2190 MUTEX_LOCK (&cn_mutex
);
2191 n
= slist_length (cn_thread_list
);
2192 MUTEX_UNLOCK (&cn_mutex
);
2198 rc
= create_thread (waiting_for_exit
, NULL
, &tid
, 0);
2201 if (signal_loop (sigset
))
2203 log_write (_("Received second termination request. Exiting."));
2204 #ifdef HAVE_PTHREAD_CANCEL
2205 pthread_cancel (tid
);
2207 pthread_kill (tid
, SIGUSR2
);
2209 pthread_join (tid
, NULL
);
2213 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
2214 pwmd_strerror (rc
));
2217 if (cancel_timeout_thread
)
2219 #ifdef HAVE_PTHREAD_CANCEL
2220 pthread_cancel (cache_timeout_tid
);
2222 pthread_kill (cache_timeout_tid
, SIGUSR2
);
2224 pthread_join (cache_timeout_tid
, NULL
);
2227 if (cancel_keepalive_thread
)
2229 #ifdef HAVE_PTHREAD_CANCEL
2230 pthread_cancel (keepalive_tid
);
2232 pthread_kill (keepalive_tid
, SIGUSR2
);
2234 pthread_join (keepalive_tid
, NULL
);
2237 cleanup_all_clients (0);
2242 pthread_cond_destroy (&quit_cond
);
2243 pthread_mutex_destroy (&quit_mutex
);
2244 return segv
? EXIT_FAILURE
: EXIT_SUCCESS
;;
2251 ("Failed to add a file to the cache. Use --ignore to force startup. Exiting."));
2255 /* This is called from cache.c:clear_once(). See
2256 * command.c:clearcache_command() for details about lock checking.
2259 free_cache_data (file_cache_t
* cache
)
2261 gpg_error_t rc
= GPG_ERR_NO_DATA
;
2263 struct client_thread_s
*found
= NULL
;
2270 MUTEX_LOCK (&cn_mutex
);
2271 pthread_cleanup_push (cleanup_mutex_cb
, &cn_mutex
);
2272 t
= slist_length (cn_thread_list
);
2274 for (i
= 0; i
< t
; i
++)
2276 struct client_thread_s
*thd
= slist_nth_data (cn_thread_list
, i
);
2281 if (!memcmp (thd
->cl
->md5file
, cache
->filename
,
2282 sizeof (cache
->filename
)))
2284 if (pthread_equal (pthread_self (), thd
->tid
))
2291 /* Continue trying to find a client who has the same file open and
2292 * also has a lock. */
2293 rc
= cache_lock_mutex (thd
->cl
->ctx
, thd
->cl
->md5file
, -1, 0, -1);
2303 if (self
&& (!rc
|| rc
== GPG_ERR_NO_DATA
))
2304 rc
= cache_lock_mutex (found
->cl
->ctx
, found
->cl
->md5file
, -1, 0, -1);
2306 if (exiting
|| !rc
|| rc
== GPG_ERR_NO_DATA
)
2308 free_cache_data_once (cache
->data
);
2310 cache
->defer_clear
= 0;
2311 cache
->timeout
= -1;
2314 cache_unlock_mutex (found
->cl
->md5file
, 0);
2320 cache
->defer_clear
= 1;
2322 pthread_cleanup_pop (1);
2328 convert_v2_datafile (const char *filename
, const char *cipher
,
2329 const char *keyfile
, const char *keygrip
,
2330 const char *sign_keygrip
, int nopass
,
2331 const char *outfile
, const char *keyparam
,
2332 unsigned long s2k_count
, uint64_t iterations
)
2337 struct crypto_s
*crypto
= NULL
;
2343 if (outfile
[0] == '-' && outfile
[1] == 0)
2346 log_write (_("Converting version 2 data file \"%s\" ..."), filename
);
2347 if (access (filename
, R_OK
) == -1)
2349 log_write ("%s: %s", filename
,
2350 pwmd_strerror (gpg_error_from_errno (errno
)));
2356 log_write (_("Using passphrase file \"%s\" for decryption ..."),
2358 if (access (keyfile
, R_OK
) == -1)
2360 log_write ("%s: %s", keyfile
,
2361 pwmd_strerror (gpg_error_from_errno (errno
)));
2366 rc
= read_v2_datafile (filename
, keyfile
, &data
, &datalen
, &ver
, &algo
);
2369 log_write ("ERR %i: %s", rc
, pwmd_strerror (rc
));
2375 algo
= cipher_string_to_gcrypt (cipher
);
2378 rc
= GPG_ERR_CIPHER_ALGO
;
2387 rc
= parse_doc (data
, datalen
, &doc
);
2391 rc
= convert_pre_212_elements (doc
);
2396 xmlDocDumpFormatMemory (doc
, (xmlChar
**) & data
, (int *) &datalen
,
2399 rc
= GPG_ERR_ENOMEM
;
2407 rc
= init_client_crypto (&crypto
);
2410 memcpy (&crypto
->save
.hdr
, &crypto
->hdr
, sizeof (file_header_t
));
2411 crypto
->save
.hdr
.flags
= set_cipher_flag (crypto
->save
.hdr
.flags
, algo
);
2412 crypto
->save
.s2k_count
= s2k_count
;
2413 crypto
->save
.hdr
.iterations
= iterations
;
2417 rc
= export_common (NULL
, 0, crypto
, data
, datalen
, outfile
, keyfile
,
2418 &key
, &keylen
, 0, 0, nopass
);
2423 rc
= agent_set_pinentry_options (crypto
->agent
);
2425 rc
= agent_export_common (crypto
, keygrip
, sign_keygrip
, nopass
,
2426 data
, datalen
, outfile
, keyparam
,
2427 no_passphrase_file
? NULL
: keyfile
);
2431 log_write (_("Output written to \"%s\"."), outfile
);
2441 cleanup_crypto (&crypto
);
2444 log_write ("ERR %i: %s", rc
, pwmd_strerror (rc
));
2449 usage (const char *pn
, int status
)
2451 FILE *fp
= status
== EXIT_FAILURE
? stderr
: stdout
;
2453 fprintf (fp
, _("Usage: %s [OPTIONS] [file1] [...]\n"
2454 " -f, --rcfile=filename load the specfied configuration file\n"
2455 " (~/.pwmd/config)\n"
2456 " --homedir alternate pwmd home directory (~/.pwmd)\n"
2458 " --use-agent enable use of gpg-agent\n"
2460 " -n, --no-fork run as a foreground process\n"
2461 " -D, --disable-dump disable the LIST, XPATH and DUMP commands\n"
2462 " --ignore, --force ignore file errors during startup\n"
2463 " --debug-level=keywords log protocol output (see manual for details)\n"
2464 " -o, --outfile=filename output file when importing or converting\n"
2465 " -C, --convert=filename convert a version 2 data file to version 3\n"
2466 " -I, --import=filename import a pwmd DTD formatted XML file)\n"
2467 " -k, --passphrase-file=file for use when importing or converting\n"
2468 " --no-passphrase-file prompt instead of using --passphrase-file when\n"
2470 " --no-passphrase when importing or converting\n"
2471 " --keygrip=hex public key to use when encrypting\n"
2472 " --sign-keygrip=hex private key to use when signing\n"
2473 " --keyparam=s-exp custom key parameters to use (RSA-2048)\n"
2474 " --cipher=string encryption cipher (aes256)\n"
2475 " --cipher-iterations=N cipher iteration count (N+1)\n"
2476 " --s2k-count=N hash iteration count (>65536, calibrated)\n"
2477 " --help this help text\n"
2478 " --version show version and compile time features\n"),
2484 unlink_stale_socket (const char *sock
, const char *pidfile
)
2486 log_write (_ ("removing stale socket %s"), sock
);
2492 test_pidfile (const char *path
, const char *sock
, char *buf
, size_t buflen
,
2493 char **pidfile
, int create
, mode_t mode
)
2501 snprintf (buf
, buflen
, "%s/%s.pid", homedir
, sock
);
2502 *pidfile
= str_dup (buf
);
2503 fd
= open (buf
, O_RDONLY
);
2506 fd
= open (*pidfile
, O_CREAT
|O_WRONLY
|O_TRUNC
, mode
);
2510 if (!create
&& errno
!= ENOENT
)
2512 log_write ("%s: %s", buf
, pwmd_strerror (errno
));
2520 log_write ("%s: %s", *pidfile
, strerror (errno
));
2526 snprintf (buf
, buflen
, "%i", getpid ());
2527 write (fd
, buf
, strlen (buf
));
2532 len
= read (fd
, buf
, sizeof(buf
));
2536 unlink_stale_socket (path
, *pidfile
);
2540 if (sscanf (buf
, "%5i", &pid
) != 1 || pid
== 0)
2542 unlink_stale_socket (path
, *pidfile
);
2546 if (kill (pid
, 0) == -1)
2548 unlink_stale_socket (path
, *pidfile
);
2552 log_write (_ ("an instance for socket %s is already running"), path
);
2559 main (int argc
, char *argv
[])
2562 struct sockaddr_un addr
;
2564 char *socketpath
= NULL
, *socketdir
, *socketname
= NULL
;
2565 char *socketarg
= NULL
;
2566 char *datadir
= NULL
;
2567 char *pidfile
= NULL
;
2571 char **cache_push
= NULL
;
2572 char *import
= NULL
, *keygrip
= NULL
, *sign_keygrip
= NULL
;
2573 char *keyparam
= NULL
;
2574 int estatus
= EXIT_FAILURE
;
2576 char *outfile
= NULL
;
2579 int show_version
= 0;
2581 int no_passphrase
= 0;
2583 char *convertfile
= NULL
;
2584 char *cipher
= NULL
;
2585 char *keyfile
= NULL
;
2586 unsigned long s2k_count
= 0;
2587 uint64_t iterations
= 0;
2589 char *debug_level_opt
= NULL
;
2591 /* Must maintain the same order as longopts[] */
2594 OPT_VERSION
, OPT_HELP
,
2598 OPT_DEBUG_LEVEL
, OPT_HOMEDIR
, OPT_NO_FORK
, OPT_DISABLE_DUMP
,
2599 OPT_IGNORE
, OPT_FORCE
, OPT_RCFILE
, OPT_CONVERT
,
2600 OPT_PASSPHRASE_FILE
, OPT_IMPORT
, OPT_OUTFILE
,
2601 OPT_NO_PASSPHRASE_FILE
, OPT_KEYGRIP
, OPT_SIGN_KEYGRIP
,
2602 OPT_KEYPARAM
, OPT_CIPHER
, OPT_ITERATIONS
, OPT_S2K_COUNT
,
2605 const char *optstring
= "nf:C:k:I:o:";
2606 const struct option longopts
[] = {
2607 {"version", no_argument
, 0, 0},
2608 {"help", no_argument
, 0, 0},
2610 {"use-agent", no_argument
, 0, 0},
2612 {"debug-level", required_argument
, 0, 0},
2613 {"homedir", required_argument
, 0, 0},
2614 {"no-fork", no_argument
, 0, 'n'},
2615 {"disable_dump", no_argument
, 0, 0},
2616 {"ignore", no_argument
, 0, 0},
2617 {"force", no_argument
, 0, 0},
2618 {"rcfile", required_argument
, 0, 'f'},
2619 {"convert", required_argument
, 0, 'C'},
2620 {"passphrase-file", required_argument
, 0, 'k'},
2621 {"import", required_argument
, 0, 'I'},
2622 {"outfile", required_argument
, 0, 'o'},
2623 {"no-passphrase-file", no_argument
, 0, 0},
2624 {"keygrip", required_argument
, 0, 0},
2625 {"sign-keygrip", required_argument
, 0, 0},
2626 {"keyparam", required_argument
, 0, 0},
2627 {"cipher", required_argument
, 0, 0},
2628 {"cipher-iterations", required_argument
, 0, 0},
2629 {"s2k-count", required_argument
, 0, 0},
2630 {"no-passphrase", no_argument
, 0, 0},
2637 #ifdef HAVE_SETRLIMIT
2640 rl
.rlim_cur
= rl
.rlim_max
= 0;
2642 if (setrlimit (RLIMIT_CORE
, &rl
) != 0)
2643 err (EXIT_FAILURE
, "setrlimit()");
2646 #ifdef HAVE_PR_SET_DUMPABLE
2647 prctl (PR_SET_DUMPABLE
, 0);
2652 setlocale (LC_ALL
, "");
2653 bindtextdomain ("pwmd", LOCALEDIR
);
2654 textdomain ("pwmd");
2662 if (setup_crypto ())
2663 exit (EXIT_FAILURE
);
2666 gnutls_global_set_mem_functions (xmalloc
, xmalloc
, secure_mem_check
,
2668 gnutls_global_init ();
2669 gnutls_global_set_log_function (tls_log
);
2670 gnutls_global_set_log_level (1);
2674 xmlMemSetup (xfree
, xmalloc
, xrealloc
, str_dup
);
2682 while ((opt
= getopt_long (argc
, argv
, optstring
, longopts
, &optindex
))
2691 convertfile
= optarg
;
2706 rcfile
= str_dup (optarg
);
2709 usage (argv
[0], EXIT_FAILURE
);
2725 case OPT_DEBUG_LEVEL
:
2726 debug_level_opt
= optarg
;
2729 homedir
= str_dup (optarg
);
2734 case OPT_DISABLE_DUMP
:
2742 rcfile
= str_dup (optarg
);
2745 convertfile
= optarg
;
2747 case OPT_PASSPHRASE_FILE
:
2756 case OPT_NO_PASSPHRASE_FILE
:
2757 no_passphrase_file
= 1;
2762 case OPT_SIGN_KEYGRIP
:
2763 sign_keygrip
= optarg
;
2771 case OPT_ITERATIONS
:
2772 iterations
= strtoull (optarg
, NULL
, 10);
2775 s2k_count
= strtoul (optarg
, NULL
, 10);
2777 case OPT_NO_PASSPHRASE
:
2789 "Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014\n"
2791 "Released under the terms of the GPL v2. Use at your own risk.\n\n"
2792 "Compile time features:\n%s"), PACKAGE_STRING
,
2795 "+PWMD_HOMEDIR=" PWMD_HOMEDIR
"\n"
2828 exit (EXIT_SUCCESS
);
2833 homedir
= str_dup(PWMD_HOMEDIR
);
2835 homedir
= str_asprintf ("%s/.pwmd", get_home_dir());
2838 if (mkdir (homedir
, 0700) == -1 && errno
!= EEXIST
)
2839 err (EXIT_FAILURE
, "%s", homedir
);
2841 snprintf (buf
, sizeof (buf
), "%s/data", homedir
);
2842 if (mkdir (buf
, 0700) == -1 && errno
!= EEXIST
)
2843 err (EXIT_FAILURE
, "%s", buf
);
2845 datadir
= str_dup (buf
);
2846 pthread_mutexattr_t attr
;
2847 pthread_mutexattr_init (&attr
);
2848 pthread_mutexattr_settype (&attr
, PTHREAD_MUTEX_RECURSIVE
);
2849 pthread_mutex_init (&rcfile_mutex
, &attr
);
2850 pthread_cond_init (&rcfile_cond
, NULL
);
2851 pthread_mutex_init (&cn_mutex
, &attr
);
2852 pthread_mutexattr_destroy (&attr
);
2853 pthread_key_create (&last_error_key
, free_key
);
2854 #ifndef HAVE_PTHREAD_CANCEL
2855 pthread_key_create (&signal_thread_key
, free_key
);
2859 rcfile
= str_asprintf ("%s/config", homedir
);
2861 global_config
= config_parse (rcfile
);
2863 exit (EXIT_FAILURE
);
2867 use_agent
= config_get_boolean ("global", "use_agent");
2872 if (debug_level_opt
)
2873 debug_level
= str_split (debug_level_opt
, ",", 0);
2875 x
= config_get_int_param (global_config
, "global", "priority", &exists
);
2876 if (exists
&& x
!= atoi(INVALID_PRIORITY
))
2879 if (setpriority (PRIO_PROCESS
, 0, x
) == -1)
2881 log_write ("setpriority(): %s",
2882 pwmd_strerror (gpg_error_from_errno (errno
)));
2886 #ifdef HAVE_MLOCKALL
2887 if (disable_mlock
== 0 && mlockall (MCL_CURRENT
| MCL_FUTURE
) == -1)
2889 log_write ("mlockall(): %s",
2890 pwmd_strerror (gpg_error_from_errno (errno
)));
2895 rc
= cache_init (free_cache_data
);
2898 log_write ("pwmd: ERR %i: %s", rc
,
2899 gpg_err_code (rc
) == GPG_ERR_UNKNOWN_VERSION
2900 ? _("incompatible gpg-agent version: 2.1.0 or later required")
2901 : pwmd_strerror (rc
));
2906 s2k_count
= config_get_ulong (NULL
, "s2k_count");
2910 if (!outfile
|| !*outfile
|| argc
!= optind
)
2911 usage (argv
[0], EXIT_FAILURE
);
2913 estatus
= convert_v2_datafile (convertfile
, cipher
, keyfile
, keygrip
,
2914 sign_keygrip
, no_passphrase
, outfile
,
2915 keyparam
, s2k_count
, iterations
);
2916 config_free (global_config
);
2923 if (!outfile
|| !*outfile
|| argc
!= optind
)
2924 usage (argv
[0], EXIT_FAILURE
);
2926 if (outfile
&& outfile
[0] == '-' && outfile
[1] == 0)
2929 estatus
= xml_import (import
, outfile
, keygrip
, sign_keygrip
, keyfile
,
2930 no_passphrase
, cipher
, keyparam
, s2k_count
,
2932 config_free (global_config
);
2937 p
= config_get_string ("global", "socket_path");
2939 p
= str_asprintf ("%s/socket", homedir
);
2941 socketarg
= expand_homedir (p
);
2945 disable_list_and_dump
= config_get_boolean ("global",
2946 "disable_list_and_dump");
2948 disable_list_and_dump
= secure
;
2950 cache_push
= config_get_list ("global", "cache_push");
2952 while (optind
< argc
)
2954 if (strv_printf (&cache_push
, "%s", argv
[optind
++]) == 0)
2955 errx (EXIT_FAILURE
, "%s", pwmd_strerror (GPG_ERR_ENOMEM
));
2958 if (strchr (socketarg
, '/') == NULL
)
2960 socketdir
= getcwd (buf
, sizeof (buf
));
2961 socketname
= str_dup (socketarg
);
2962 socketpath
= str_asprintf ("%s/%s", socketdir
, socketname
);
2966 socketname
= str_dup (strrchr (socketarg
, '/'));
2968 socketarg
[strlen (socketarg
) - strlen (socketname
) - 1] = 0;
2969 socketdir
= str_dup (socketarg
);
2970 socketpath
= str_asprintf ("%s/%s", socketdir
, socketname
);
2973 if (chdir (datadir
))
2975 log_write ("%s: %s", datadir
,
2976 pwmd_strerror (gpg_error_from_errno (errno
)));
2977 unlink (socketpath
);
2981 if (test_pidfile (socketpath
, socketname
, buf
, sizeof(buf
), &pidfile
, 0,
2986 * bind() doesn't like the full pathname of the socket or any non alphanum
2987 * characters so change to the directory where the socket is wanted then
2988 * create it then change to datadir.
2990 if (chdir (socketdir
))
2992 log_write ("%s: %s", socketdir
,
2993 pwmd_strerror (gpg_error_from_errno (errno
)));
2999 if ((sockfd
= socket (PF_UNIX
, SOCK_STREAM
, 0)) == -1)
3001 log_write ("socket(): %s", pwmd_strerror (gpg_error_from_errno (errno
)));
3005 addr
.sun_family
= AF_UNIX
;
3006 snprintf (addr
.sun_path
, sizeof (addr
.sun_path
), "%s", socketname
);
3008 if (bind (sockfd
, (struct sockaddr
*) &addr
, sizeof (struct sockaddr
)) ==
3011 log_write ("bind(): %s", pwmd_strerror (gpg_error_from_errno (errno
)));
3013 if (errno
== EADDRINUSE
)
3016 log_write (_("Either there is another pwmd running or '%s' is a \n"
3017 "stale socket. Please remove it manually."), socketpath
);
3024 char *t
= config_get_string ("global", "socket_perms");
3029 mode
= strtol (t
, NULL
, 8);
3033 if (chmod (socketname
, mode
) == -1)
3035 log_write ("%s: %s", socketname
,
3036 pwmd_strerror (gpg_error_from_errno (errno
)));
3046 xfree (--socketname
);
3048 if (chdir (datadir
))
3050 log_write ("%s: %s", datadir
,
3051 pwmd_strerror (gpg_error_from_errno (errno
)));
3059 * Set the cache entry for a file. Prompts for the password.
3063 struct crypto_s
*crypto
= NULL
;
3064 gpg_error_t rc
= init_client_crypto (&crypto
);
3068 estatus
= EXIT_FAILURE
;
3075 rc
= agent_set_pinentry_options (crypto
->agent
);
3078 estatus
= EXIT_FAILURE
;
3084 for (opt
= 0; cache_push
[opt
]; opt
++)
3086 if (!do_cache_push (cache_push
[opt
], crypto
) && !force
)
3088 strv_free (cache_push
);
3090 estatus
= EXIT_FAILURE
;
3091 cleanup_crypto (&crypto
);
3095 cleanup_crypto_stage1 (crypto
);
3100 (void) kill_scd (crypto
->agent
);
3103 cleanup_crypto (&crypto
);
3104 strv_free (cache_push
);
3105 log_write (!nofork
? _("Done. Daemonizing...") :
3106 _("Done. Waiting for connections..."));
3109 config_clear_keys ();
3111 if (listen (sockfd
, 0) == -1)
3113 log_write ("listen(): %s", pwmd_strerror (gpg_error_from_errno (errno
)));
3122 log_write ("fork(): %s",
3123 pwmd_strerror (gpg_error_from_errno (errno
)));
3132 _exit (EXIT_SUCCESS
);
3136 (void)test_pidfile (socketpath
, socketname
, buf
, sizeof(buf
), &pidfile
, 1,
3139 pthread_key_create (&thread_name_key
, free_key
);
3140 pthread_setspecific (thread_name_key
, str_dup ("main"));
3141 estatus
= server_loop (sockfd
, &socketpath
);
3144 if (socketpath
&& do_unlink
)
3146 unlink (socketpath
);
3152 gnutls_global_deinit ();
3153 xfree (invoking_tls
);
3157 #ifdef HAVE_PTHREAD_CANCEL
3158 pthread_cancel (rcfile_tid
);
3160 pthread_kill (rcfile_tid
, SIGUSR2
);
3161 pthread_cond_signal (&rcfile_cond
);
3163 pthread_join (rcfile_tid
, NULL
);
3166 pthread_cond_destroy (&rcfile_cond
);
3167 pthread_mutex_destroy (&rcfile_mutex
);
3168 pthread_key_delete (last_error_key
);
3169 #ifndef HAVE_PTHREAD_CANCEL
3170 pthread_key_delete (signal_thread_key
);
3174 config_free (global_config
);
3177 xfree (home_directory
);
3179 xmlCleanupParser ();
3180 xmlCleanupGlobals ();
3186 if (estatus
== EXIT_SUCCESS
)
3187 log_write (_("pwmd exiting normally"));
3189 pthread_key_delete (thread_name_key
);
3191 #if defined(DEBUG) && !defined(MEM_DEBUG)