2 Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015,
4 Ben Kibbey <bjk@luxsci.net>
6 This file is part of pwmd.
8 Pwmd is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 2 of the License, or
11 (at your option) any later version.
13 Pwmd is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with Pwmd. If not, see <http://www.gnu.org/licenses/>.
31 #include <sys/socket.h>
45 #include <netinet/in.h>
46 #include <arpa/inet.h>
49 #include <sys/resource.h>
64 #ifdef HAVE_GETOPT_LONG
69 #include "getopt_long.h"
72 #ifdef HAVE_PR_SET_NAME
73 #include <sys/prctl.h>
76 #include "pwmd-error.h"
79 #include "util-misc.h"
85 #include "util-string.h"
90 /* In tenths of a second. */
93 /* For (tcp_)accept_thread (usec). */
94 #define ACCEPT_TIMEOUT 50000
101 static pthread_cond_t quit_cond
;
102 static pthread_mutex_t quit_mutex
;
103 static pthread_t keepalive_tid
;
105 static unsigned assuan_level
;
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 gpg_error_t
do_cache_push (struct crypto_s
*crypto
);
123 static int signal_loop (sigset_t sigset
);
125 #ifndef HAVE_PTHREAD_CANCEL
126 #define INIT_THREAD_SIGNAL do { \
127 struct sigaction act; \
129 sigemptyset (&sigset); \
130 sigaddset (&sigset, SIGUSR2); \
131 pthread_sigmask (SIG_UNBLOCK, &sigset, NULL); \
132 memset (&act, 0, sizeof(act)); \
133 act.sa_flags = SA_SIGINFO; \
134 act.sa_mask = sigset; \
135 act.sa_sigaction = catch_thread_signal; \
136 sigaction (SIGUSR2, &act, NULL); \
140 catch_thread_signal (int sig
, siginfo_t
*info
, void *ctx
)
142 int *n
= (int *) pthread_getspecific (signal_thread_key
);
145 pthread_setspecific (signal_thread_key
, n
);
152 int n
= config_get_boolean ("global", "enable_logging");
156 char *p
= config_get_string ("global", "log_path");
158 if (!p
|| (logfile
&& p
&& log_fd
!= -1 && strcmp(p
, logfile
)))
169 logfile
= expand_homedir (p
);
183 log_syslog
= config_get_boolean ("global", "syslog");
185 openlog ("pwmd", LOG_NDELAY
| LOG_PID
, LOG_DAEMON
);
189 reload_rcfile_thread (void *arg
)
191 #ifndef HAVE_PTHREAD_CANCEL
192 int *n
= xmalloc (sizeof (int));
195 pthread_setspecific (signal_thread_key
, n
);
199 #ifdef HAVE_PR_SET_NAME
200 prctl (PR_SET_NAME
, "reload rcfile");
202 pthread_setspecific (thread_name_key
, str_asprintf ("!%s", __FUNCTION__
));
203 MUTEX_LOCK (&rcfile_mutex
);
207 struct slist_s
*keep
= NULL
;
208 struct slist_s
*config
;
209 int b
= disable_list_and_dump
;
211 pthread_cleanup_push (cleanup_mutex_cb
, &rcfile_mutex
);
212 pthread_cond_wait (&rcfile_cond
, &rcfile_mutex
);
213 #ifndef HAVE_PTHREAD_CANCEL
214 int *cancel
= (int *) pthread_getspecific (signal_thread_key
);
219 keep
= config_keep_save ();
220 log_write (_("reloading configuration file '%s'"), rcfile
);
222 config
= config_parse (rcfile
, 1);
225 config_free (global_config
);
226 global_config
= config
;
230 config_keep_restore (keep
);
231 disable_list_and_dump
= !disable_list_and_dump
? b
: 1;
234 /* Kill existing listening threads since the configured listening
235 * protocols may have changed. */
239 crypto_set_keepalive ();
240 pthread_cleanup_pop (0);
243 MUTEX_UNLOCK (&rcfile_mutex
);
248 send_error (assuan_context_t ctx
, gpg_error_t e
)
250 struct client_s
*client
= assuan_get_pointer (ctx
);
252 if (gpg_err_source (e
) == GPG_ERR_SOURCE_UNKNOWN
)
259 return assuan_process_done (ctx
, 0);
263 log_write ("ERR %i: %s", e
, pwmd_strerror (e
));
267 if (client
&& client
->xml_error
)
269 log_write ("%s", client
->xml_error
->message
);
270 xfree (client
->last_error
);
271 client
->last_error
= NULL
;
272 if (client
->xml_error
->message
)
273 client
->last_error
= str_dup (client
->xml_error
->message
);
275 e
= assuan_process_done (ctx
,
276 assuan_set_error (ctx
, e
,
277 client
->xml_error
->message
? client
->xml_error
->message
: NULL
));
278 xmlResetLastError ();
279 xmlResetError (client
->xml_error
);
280 xfree (client
->xml_error
);
281 client
->xml_error
= NULL
;
285 return assuan_process_done (ctx
,
286 assuan_set_error (ctx
, e
, pwmd_strerror (e
)));
290 log_write (const char *fmt
, ...)
296 pthread_t tid
= pthread_self ();
297 static pthread_mutex_t m
= PTHREAD_MUTEX_INITIALIZER
;
299 if ((!logfile
&& !isatty (STDERR_FILENO
) && !log_syslog
) || !fmt
)
302 pthread_mutex_lock (&m
);
303 pthread_cleanup_push ((void (*)(void *)) pthread_mutex_unlock
, &m
);
305 if (!cmdline
&& logfile
&& log_fd
== -1)
307 log_fd
= open (logfile
, O_WRONLY
| O_CREAT
| O_APPEND
, 0600);
309 warn ("%s", logfile
);
314 if (str_vasprintf (&args
, fmt
, ap
) != -1)
318 pthread_cleanup_push (xfree
, args
);
319 fprintf (stderr
, "pwmd: %s\n", args
);
321 pthread_cleanup_pop (1);
325 char *name
= pthread_getspecific (thread_name_key
);
328 pthread_cleanup_push (xfree
, args
);
329 snprintf (buf
, sizeof (buf
),
330 name
&& *name
== '!' ? "%s: " : name
? "%s(%p): " : "%s",
331 name
? *name
== '!' ? name
+1 : name
: "",
332 name
&& *name
== '!' ? 0 : name
? (pthread_t
*) tid
: 0);
335 if (!cmdline
&& log_syslog
&& !nofork
)
336 syslog (LOG_INFO
, "%s%s", name
, args
);
339 struct tm
*tm
= localtime (&now
);
341 strftime (tbuf
, sizeof (tbuf
), "%b %d %Y %H:%M:%S ", tm
);
342 tbuf
[sizeof (tbuf
) - 1] = 0;
344 if (args
[strlen (args
) - 1] == '\n')
345 args
[strlen (args
) - 1] = 0;
347 line
= str_asprintf ("%s %i %s%s\n", tbuf
, getpid (), name
,
349 pthread_cleanup_pop (1);
352 pthread_cleanup_push (xfree
, line
);
353 if (logfile
&& log_fd
!= -1)
355 ssize_t ret
= write (log_fd
, line
, strlen (line
));
362 fprintf (stdout
, "%s", line
);
366 pthread_cleanup_pop (1);
372 pthread_cleanup_pop (0);
374 if (log_fd
!= -1 && log_keepopen
<= 0)
380 pthread_mutex_unlock (&m
);
386 if (!gcry_check_version (GCRYPT_VERSION
))
388 fprintf (stderr
, _("gcry_check_version(): Incompatible libgcrypt. "
389 "Wanted %s, got %s.\n"), GCRYPT_VERSION
,
390 gcry_check_version (NULL
));
391 return GPG_ERR_UNKNOWN_VERSION
;
394 gcry_set_allocation_handler (xmalloc
, xmalloc
, NULL
, xrealloc
, xfree
);
399 do_validate_peer (assuan_context_t ctx
, const char *section
,
400 assuan_peercred_t
* peer
)
405 struct client_s
*client
= assuan_get_pointer (ctx
);
408 return GPG_ERR_FORBIDDEN
;
411 if (client
->thd
->remote
)
412 return tls_validate_access (client
, section
);
415 rc
= assuan_get_peercred (ctx
, peer
);
419 users
= config_get_list (section
, "allowed");
422 for (char **p
= users
; !rc
&& *p
; p
++)
424 rc
= acl_check_common(client
, *p
, (*peer
)->uid
, (*peer
)->gid
,
431 return allowed
&& !rc
? 0 : rc
? rc
: GPG_ERR_FORBIDDEN
;
434 /* Test if uid is a member of group 'name'. Invert when 'not' is true. */
435 #ifdef HAVE_GETGRNAM_R
437 acl_check_group (const char *name
, uid_t uid
, gid_t gid
, int not, int *allowed
)
440 struct group gr
, *gresult
;
441 size_t len
= sysconf (_SC_GETGR_R_SIZE_MAX
);
450 return GPG_ERR_ENOMEM
;
452 err
= getgrnam_r (name
, &gr
, buf
, len
, &gresult
);
455 if (gresult
->gr_gid
== gid
)
462 for (char **t
= gresult
->gr_mem
; !rc
&& *t
; t
++)
466 struct passwd
*result
= get_pwd_struct (*t
, 0, &pw
, &tbuf
, &rc
);
468 if (!rc
&& result
&& result
->pw_uid
== uid
)
482 rc
= gpg_error_from_errno (err
);
485 return rc
? rc
: !gresult
? 0 : GPG_ERR_EACCES
;
489 acl_check_group (const char *name
, uid_t uid
, gid_t gid
, int not, int *allowed
)
491 struct group
*gresult
;
495 gresult
= getgrnam (name
);
496 if (!errno
&& gresult
&& gresult
->gr_gid
== gid
)
502 rc
= gpg_error_from_syserror ();
506 for (char **t
= gresult
->gr_mem
; !rc
&& *t
; t
++)
510 struct passwd
*result
= get_pwd_struct (*t
, 0, &pw
, &buf
, &rc
);
512 if (!rc
&& result
&& result
->pw_uid
== uid
)
527 peer_is_invoker(struct client_s
*client
)
529 struct invoking_user_s
*user
;
532 if (client
->thd
->state
== CLIENT_STATE_UNKNOWN
)
533 return GPG_ERR_EACCES
;
535 for (user
= invoking_users
; user
; user
= user
->next
)
538 if (client
->thd
->remote
)
540 if (user
->type
== INVOKING_TLS
541 && !strcmp(client
->thd
->tls
->fp
, user
->id
))
542 allowed
= user
->not ? 0 : 1;
548 if (user
->type
== INVOKING_GID
)
550 gpg_error_t rc
= acl_check_group (user
->id
,
551 client
->thd
->peer
->uid
,
552 client
->thd
->peer
->gid
,
553 user
->not, &allowed
);
557 else if (user
->type
== INVOKING_UID
&& client
->thd
->peer
->uid
== user
->uid
)
558 allowed
= user
->not ? 0 : 1;
561 return allowed
? 0 : GPG_ERR_EACCES
;
564 #ifdef HAVE_GETGRNAM_R
566 acl_check_common (struct client_s
*client
, const char *user
, uid_t uid
,
567 gid_t gid
, int *allowed
)
577 if (*user
== '-' || *user
== '!')
580 if (*user
== '+') // not implemented yet
583 if (*user
== '#') // TLS fingerprint hash
586 if (not || rw
|| tls
)
592 if (client
->thd
->remote
)
594 if (!strcasecmp (client
->thd
->tls
->fp
, user
))
604 else if (client
->thd
->remote
) // Remote client with no FP in the ACL
608 if (*user
== '@') // all users in group
609 return acl_check_group (user
+1, uid
, gid
, not, allowed
);
614 struct passwd
*pwd
= get_pwd_struct (user
, 0, &pw
, &buf
, &rc
);
616 if (!rc
&& pwd
&& pwd
->pw_uid
== uid
)
626 acl_check_common (struct client_s
*client
, const char *user
, uid_t uid
,
627 gid_t gid
, int *allowed
)
637 if (*user
== '-' || *user
== '!')
640 if (*user
== '+') // not implemented yet
643 if (*user
== '#') // TLS fingerprint hash
646 if (not || rw
|| tls
)
652 if (client
->thd
->remote
)
654 if (!strcasecmp (client
->thd
->tls
->fp
, user
))
664 if (*user
== '@') // all users in group
665 return acl_check_group (user
+1, uid
, gid
, not, allowed
);
670 struct passwd
*result
= get_pwd_struct (user
, 0, &pw
, &buf
, &rc
);
672 if (!rc
&& result
&& result
->pw_uid
== uid
)
683 validate_peer (struct client_s
*cl
)
689 return tls_validate_access (cl
, NULL
);
692 MUTEX_LOCK (&cn_mutex
);
693 rc
= do_validate_peer (cl
->ctx
, "global", &cl
->thd
->peer
);
694 MUTEX_UNLOCK (&cn_mutex
);
695 log_write ("peer %s: uid=%i, gid=%i, pid=%i, rc=%u",
696 !rc
? _("accepted") : _("rejected"), cl
->thd
->peer
->uid
,
697 cl
->thd
->peer
->gid
, cl
->thd
->peer
->pid
, rc
);
702 xml_error_cb (void *data
, xmlErrorPtr e
)
704 struct client_s
*client
= data
;
707 * Keep the first reported error as the one to show in the error
708 * description. Reset in send_error().
710 if (client
->xml_error
)
713 client
->xml_error
= xcalloc (1, sizeof(xmlError
));
714 xmlCopyError (e
, client
->xml_error
);
718 hook_waitpid (assuan_context_t ctx
, pid_t pid
, int action
,
719 int *status
, int options
)
721 return waitpid (pid
, status
, options
);
725 hook_read (assuan_context_t ctx
, assuan_fd_t fd
, void *data
, size_t len
)
728 struct client_s
*client
= assuan_get_pointer (ctx
);
730 if (client
->thd
->remote
)
731 return tls_read_hook (ctx
, (int) fd
, data
, len
);
734 return read ((int) fd
, data
, len
);
738 hook_write (assuan_context_t ctx
, assuan_fd_t fd
,
739 const void *data
, size_t len
)
742 struct client_s
*client
= assuan_get_pointer (ctx
);
744 if (client
->thd
->remote
)
745 return tls_write_hook (ctx
, (int) fd
, data
, len
);
748 return write ((int) fd
, data
, len
);
752 assuan_log_cb (assuan_context_t ctx
, void *data
, unsigned cat
,
755 struct client_s
*client
= data
;
760 if (!(assuan_level
& cat
))
768 case ASSUAN_LOG_INIT
:
769 str
= "ASSUAN[INIT]";
774 case ASSUAN_LOG_ENGINE
:
775 str
= "ASSUAN[ENGINE]";
777 case ASSUAN_LOG_DATA
:
778 str
= "ASSUAN[DATA]";
780 case ASSUAN_LOG_SYSIO
:
781 str
= "ASSUAN[SYSIO]";
783 case ASSUAN_LOG_CONTROL
:
784 str
= "ASSUAN[CONTROL]";
787 str
= "ASSUAN[UNKNOWN]";
791 log_write ("%s: %s", str
, msg
);
796 new_connection (struct client_s
*cl
)
799 static struct assuan_malloc_hooks mhooks
= { xmalloc
, xrealloc
, xfree
};
800 static struct assuan_system_hooks shooks
= {
801 ASSUAN_SYSTEM_HOOKS_VERSION
,
809 NULL
, //sendmsg both are used for FD passing
820 char *prio
= config_get_string ("global", "tls_cipher_suite");
822 cl
->thd
->timeout
= config_get_integer ("global", "tls_timeout");
823 if (fcntl (cl
->thd
->fd
, F_SETFL
, O_NONBLOCK
) == -1)
826 cl
->thd
->tls
= tls_init (cl
->thd
->fd
, cl
->thd
->timeout
, prio
);
833 rc
= assuan_new_ext (&cl
->ctx
, GPG_ERR_SOURCE_DEFAULT
, &mhooks
,
838 assuan_ctx_set_system_hooks (cl
->ctx
, &shooks
);
839 rc
= assuan_init_socket_server (cl
->ctx
, cl
->thd
->fd
, 2);
843 assuan_set_pointer (cl
->ctx
, cl
);
844 assuan_set_hello_line (cl
->ctx
, PACKAGE_STRING
);
845 rc
= register_commands (cl
->ctx
);
849 rc
= assuan_accept (cl
->ctx
);
853 rc
= validate_peer (cl
);
854 /* May not be implemented on all platforms. */
855 if (rc
&& gpg_err_code (rc
) != GPG_ERR_ASS_GENERAL
)
858 MUTEX_LOCK (&cn_mutex
);
859 cl
->thd
->state
= CLIENT_STATE_INIT
;
860 MUTEX_UNLOCK (&cn_mutex
);
861 cl
->lock_timeout
= config_get_integer ("global", "lock_timeout");
862 xmlSetStructuredErrorFunc (cl
, xml_error_cb
);
866 log_write ("%s", pwmd_strerror (rc
));
871 * This is called after a client_thread() terminates. Set with
872 * pthread_cleanup_push().
875 cleanup_cb (void *arg
)
877 struct client_thread_s
*cn
= arg
;
878 struct client_s
*cl
= cn
->cl
;
880 MUTEX_LOCK (&cn_mutex
);
881 cn_thread_list
= slist_remove (cn_thread_list
, cn
);
882 MUTEX_UNLOCK (&cn_mutex
);
886 unlock_flock (&cl
->flock_fd
);
889 xmlResetError (cl
->xml_error
);
891 xfree (cl
->xml_error
);
896 gnutls_deinit (cn
->tls
->ses
);
902 if (!cn
->atfork
&& cl
->ctx
)
903 assuan_release (cl
->ctx
);
904 else if (!cn
->atfork
&& cl
->thd
&& cl
->thd
->fd
!= -1)
908 crypto_cleanup (cl
->crypto
);
919 while (cn
->msg_queue
)
921 struct status_msg_s
*msg
= cn
->msg_queue
;
923 cn
->msg_queue
= msg
->next
;
928 if (!cn
->atfork
&& cn
->status_msg_pipe
[0] != -1)
929 close (cn
->status_msg_pipe
[0]);
931 if (!cn
->atfork
&& cn
->status_msg_pipe
[1] != -1)
932 close (cn
->status_msg_pipe
[1]);
934 pthread_mutex_destroy (&cn
->status_mutex
);
938 log_write (_("exiting, fd=%i"), cn
->fd
);
939 send_status_all (STATUS_CLIENTS
, NULL
);
944 xfree (cn
->peeraddr
);
947 pthread_cond_signal (&quit_cond
);
951 cleanup_all_clients (int atfork
)
953 /* This function may be called from pthread_atfork() which requires
957 pthread_mutexattr_t attr
;
959 pthread_mutexattr_init (&attr
);
960 pthread_mutexattr_settype (&attr
, PTHREAD_MUTEX_RECURSIVE
);
961 pthread_mutex_init (&cn_mutex
, &attr
);
962 pthread_mutexattr_destroy (&attr
);
966 MUTEX_LOCK (&cn_mutex
);
968 while (slist_length (cn_thread_list
))
970 struct client_thread_s
*thd
= slist_nth_data (cn_thread_list
, 0);
972 thd
->atfork
= atfork
;
977 MUTEX_UNLOCK (&cn_mutex
);
978 cache_deinit (atfork
);
982 send_msg_queue (struct client_thread_s
*thd
)
984 MUTEX_LOCK (&thd
->status_mutex
);
989 ret
= read (thd
->status_msg_pipe
[0], &c
, 1);
990 rc
= gpg_error_from_syserror ();
991 if (ret
== -1 && gpg_err_code (rc
) != GPG_ERR_EAGAIN
)
992 log_write ("%s (%i): %s", __FUNCTION__
, __LINE__
, pwmd_strerror (rc
));
996 thd
->wrote_status
= 0;
998 while (thd
->msg_queue
)
1000 struct status_msg_s
*msg
= thd
->msg_queue
;
1002 #ifndef HAVE_PTHREAD_CANCEL
1007 thd
->msg_queue
= thd
->msg_queue
->next
;
1008 MUTEX_UNLOCK (&thd
->status_mutex
);
1009 rc
= send_status (thd
->cl
->ctx
, msg
->s
, msg
->line
);
1010 MUTEX_LOCK (&thd
->status_mutex
);
1018 MUTEX_UNLOCK (&thd
->status_mutex
);
1019 if (rc
&& gpg_err_code (rc
) != GPG_ERR_EPIPE
)
1020 log_write ("%s (%i): %s", __FUNCTION__
, __LINE__
, pwmd_strerror (rc
));
1026 client_thread (void *data
)
1028 struct client_thread_s
*thd
= data
;
1029 struct client_s
*cl
= xcalloc (1, sizeof (struct client_s
));
1031 #ifdef HAVE_PR_SET_NAME
1032 prctl (PR_SET_NAME
, "client");
1034 pthread_setspecific (thread_name_key
, str_dup (__FUNCTION__
));
1038 log_write ("%s(%i): %s", __FILE__
, __LINE__
,
1039 pwmd_strerror (GPG_ERR_ENOMEM
));
1043 MUTEX_LOCK (&cn_mutex
);
1044 pthread_cleanup_push (cleanup_cb
, thd
);
1048 MUTEX_UNLOCK (&cn_mutex
);
1050 if (new_connection (cl
))
1054 struct pollfd fds
[2];
1056 fds
[0].fd
= thd
->fd
;
1057 fds
[0].events
= POLLIN
;
1058 fds
[1].fd
= thd
->status_msg_pipe
[0];
1059 fds
[1].events
= POLLIN
;
1061 send_status_all (STATUS_CLIENTS
, NULL
);
1062 rc
= send_status (cl
->ctx
, STATUS_CACHE
, NULL
);
1065 log_write ("%s(%i): %s", __FILE__
, __LINE__
, pwmd_strerror (rc
));
1074 n
= poll (fds
, 2, -1);
1077 log_write ("%s", strerror (errno
));
1081 if (fds
[1].revents
& POLLIN
)
1083 rc
= send_msg_queue (thd
);
1084 if (rc
&& gpg_err_code (rc
) != GPG_ERR_EPIPE
)
1088 #ifdef HAVE_PTHREAD_CANCEL
1089 if (!(fds
[0].revents
& POLLIN
))
1091 if (thd
->fd
!= -1 && !(fds
[0].revents
& POLLIN
))
1095 rc
= assuan_process_next (cl
->ctx
, &eof
);
1098 if (gpg_err_code (rc
) == GPG_ERR_EOF
|| eof
)
1101 log_write ("assuan_process_next(): rc=%i %s", rc
,
1102 pwmd_strerror (rc
));
1103 if (rc
== gpg_error (GPG_ERR_ETIMEDOUT
))
1106 rc
= send_error (cl
->ctx
, rc
);
1109 log_write ("assuan_process_done(): rc=%i %s", rc
,
1110 pwmd_strerror (rc
));
1115 /* Since the msg queue pipe fd's are non-blocking, check for
1116 * pending status msgs here. GPG_ERR_EPIPE can be seen when the
1117 * client has already disconnected and will be converted to
1118 * GPG_ERR_EOF during assuan_process_next().
1120 rc
= send_msg_queue (thd
);
1121 if (rc
&& gpg_err_code (rc
) != GPG_ERR_EPIPE
)
1126 /* Don't do pthread_exit() here because any set pthread_cleanup_push
1127 * functions would be called after a command failed but then the client
1128 * exited normally which may lead to a double free. */
1129 pthread_cleanup_pop (1);
1134 xml_import (const char *filename
, const char *outfile
, char **keyid
,
1135 char **sign_keyid
, const char *keyfile
, const char *keyparam
,
1144 struct crypto_s
*crypto
= NULL
;
1146 if (stat (filename
, &st
) == -1)
1148 rc
= gpg_error_from_errno (errno
);
1152 fd
= open (filename
, O_RDONLY
);
1154 return gpg_error_from_errno (errno
);
1156 xmlbuf
= xmalloc (st
.st_size
+ 1);
1160 return GPG_ERR_ENOMEM
;
1163 if (read (fd
, xmlbuf
, st
.st_size
) == -1)
1165 rc
= gpg_error_from_errno (errno
);
1172 xmlbuf
[st
.st_size
] = 0;
1173 // Be sure the document validates.
1174 doc
= xmlReadDoc (xmlbuf
, NULL
, "UTF-8", XML_PARSE_NOBLANKS
);
1177 return GPG_ERR_BAD_DATA
;
1179 xmlNodePtr n
= xmlDocGetRootElement (doc
);
1180 if (n
&& !xmlStrEqual (n
->name
, (xmlChar
*) "pwmd"))
1181 rc
= GPG_ERR_BAD_DATA
;
1185 rc
= xml_validate_import (NULL
, n
? n
->children
: n
);
1188 rc
= crypto_init (&crypto
, NULL
, filename
, keyfile
!= NULL
);
1193 crypto
->flags
|= CRYPTO_FLAG_KEYFILE
;
1194 crypto
->keyfile
= str_dup (keyfile
);
1197 xmlDocDumpMemory (doc
, &crypto
->plaintext
, &len
);
1199 crypto
->plaintext_size
= len
;
1201 rc
= GPG_ERR_ENOMEM
;
1208 if (!symmetric
&& (keyparam
|| !keyid
))
1214 fd
= open (keyparam
, O_RDONLY
);
1216 rc
= gpg_error_from_errno (errno
);
1220 if (stat (keyparam
, &st
) == -1)
1221 rc
= gpg_error_from_errno (errno
);
1225 buf
= xmalloc (st
.st_size
+1);
1227 rc
= GPG_ERR_ENOMEM
;
1231 len
= read (fd
, buf
, st
.st_size
);
1232 if (len
!= st
.st_size
)
1233 rc
= gpg_error_from_errno (errno
);
1246 buf
= crypto_default_key_params ();
1248 rc
= GPG_ERR_ENOMEM
;
1252 rc
= crypto_genkey (NULL
, crypto
, (unsigned char *)buf
);
1258 crypto
->save
.pubkey
= strv_dup (keyid
);
1259 crypto
->save
.sigkey
= strv_dup (sign_keyid
);
1264 crypto
->flags
|= symmetric
? CRYPTO_FLAG_SYMMETRIC
: 0;
1265 rc
= crypto_encrypt (NULL
, crypto
);
1271 if (!strcmp (outfile
, "-"))
1274 xfree (crypto
->plaintext
);
1275 crypto
->plaintext
= NULL
;
1276 xfree (crypto
->filename
);
1277 crypto
->filename
= outfile
? str_dup (outfile
) : NULL
;
1278 rc
= crypto_write_file (crypto
);
1282 crypto_cleanup (crypto
);
1287 do_cache_push (struct crypto_s
*crypto
)
1289 unsigned char md5file
[16];
1292 struct cache_data_s
*cdata
;
1297 log_write (_("Trying to add datafile '%s' to the file cache ..."),
1300 if (valid_filename (crypto
->filename
) == 0)
1302 log_write (_("%s: Invalid characters in filename"), crypto
->filename
);
1303 return GPG_ERR_INV_VALUE
;
1306 rc
= lock_flock (NULL
, crypto
->filename
, LOCK_SH
, &fd
);
1308 rc
= crypto_decrypt (NULL
, crypto
);
1315 rc
= xml_parse_doc ((char *) crypto
->plaintext
, crypto
->plaintext_size
, &doc
);
1319 log_write ("%s", pwmd_strerror (rc
));
1323 gcry_md_hash_buffer (GCRY_MD_MD5
, md5file
, crypto
->filename
,
1324 strlen (crypto
->filename
));
1325 cdata
= xcalloc (1, sizeof (struct cache_data_s
));
1330 return GPG_ERR_ENOMEM
;
1333 rc
= get_checksum (crypto
->filename
, &crc
, &len
);
1338 free_cache_data_once (cdata
);
1343 rc
= cache_encrypt (crypto
);
1346 cdata
->doc
= crypto
->plaintext
;
1347 cdata
->size
= crypto
->plaintext_size
;
1348 crypto
->plaintext
= NULL
;
1349 cdata
->pubkey
= crypto
->pubkey
;
1350 cdata
->sigkey
= crypto
->sigkey
;
1351 crypto
->pubkey
= NULL
;
1352 crypto
->sigkey
= NULL
;
1357 free_cache_data_once (cdata
);
1361 int timeout
= config_get_integer (crypto
->filename
, "cache_timeout");
1362 rc
= cache_add_file (md5file
, cdata
, timeout
);
1367 init_client (int fd
, const char *addr
)
1370 struct client_thread_s
*new = xcalloc (1, sizeof (struct client_thread_s
));
1375 return GPG_ERR_ENOMEM
;
1378 MUTEX_LOCK (&cn_mutex
);
1379 new->conntime
= time (NULL
);
1380 pthread_cleanup_push (cleanup_mutex_cb
, &cn_mutex
);
1382 if (pipe (new->status_msg_pipe
) == -1)
1383 rc
= gpg_error_from_errno (errno
);
1387 if (fcntl (new->status_msg_pipe
[0], F_SETFL
, O_NONBLOCK
) == -1)
1388 rc
= gpg_error_from_errno (errno
);
1391 if (fcntl (new->status_msg_pipe
[1], F_SETFL
, O_NONBLOCK
) == -1)
1392 rc
= gpg_error_from_errno (errno
);
1394 pthread_mutex_init (&new->status_mutex
, NULL
);
1400 new->remote
= addr
? 1 : 0;
1403 rc
= create_thread (client_thread
, new, &new->tid
, 1);
1406 close (new->status_msg_pipe
[0]);
1407 close (new->status_msg_pipe
[1]);
1408 pthread_mutex_destroy (&new->status_mutex
);
1414 struct slist_s
*list
= slist_append (cn_thread_list
, new);
1418 cn_thread_list
= list
;
1421 log_write (_("new connection: tid=%p, fd=%i, addr=%s"),
1422 (pthread_t
*) new->tid
, fd
, addr
);
1424 new->peeraddr
= str_dup (addr
);
1428 log_write (_("new connection: tid=%p, fd=%i"),
1429 (pthread_t
*) new->tid
, fd
);
1432 rc
= GPG_ERR_ENOMEM
;
1435 pthread_cleanup_pop (1);
1441 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
1442 pwmd_strerror (rc
));
1448 keepalive_thread (void *arg
)
1450 #ifndef HAVE_PTHREAD_CANCEL
1451 int *n
= xmalloc (sizeof (int));
1454 pthread_setspecific (signal_thread_key
, n
);
1458 #ifdef HAVE_PR_SET_NAME
1459 prctl (PR_SET_NAME
, "keepalive");
1461 pthread_setspecific (thread_name_key
, str_asprintf ("!%s", __FUNCTION__
));
1465 int n
= config_get_integer ("global", "keepalive_interval");
1466 struct timeval tv
= { n
, 0 };
1467 #ifndef HAVE_PTHREAD_CANCEL
1470 sigusr2
= (int *) pthread_getspecific (signal_thread_key
);
1475 send_status_all (STATUS_KEEPALIVE
, NULL
);
1476 select (0, NULL
, NULL
, NULL
, &tv
);
1483 /* From Beej's Guide to Network Programming. It's a good tutorial. */
1485 get_in_addr (struct sockaddr
*sa
)
1487 if (sa
->sa_family
== AF_INET
)
1488 return &(((struct sockaddr_in
*) sa
)->sin_addr
);
1490 return &(((struct sockaddr_in6
*) sa
)->sin6_addr
);
1494 tcp_accept_thread (void *arg
)
1496 int sockfd
= *(int *) arg
;
1499 int regen_interval
= config_get_integer ("global", "tls_regen_interval");
1500 char *tmp
= config_get_string ("global", "tls_dh_level");
1501 #ifndef HAVE_PTHREAD_CANCEL
1502 int *n
= xmalloc (sizeof (int));
1505 pthread_setspecific (signal_thread_key
, n
);
1507 fcntl (sockfd
, F_SETFL
, O_NONBLOCK
);
1510 #ifdef HAVE_PR_SET_NAME
1511 prctl (PR_SET_NAME
, "tcp_accept");
1513 pthread_setspecific (thread_name_key
, str_asprintf ("!%s", __FUNCTION__
));
1514 fcntl (sockfd
, F_SETFL
, O_NONBLOCK
);
1516 rc
= tls_init_params (tmp
);
1525 struct sockaddr_storage raddr
;
1526 socklen_t slen
= sizeof (raddr
);
1529 char s
[INET6_ADDRSTRLEN
];
1530 struct timeval tv
= { 0, ACCEPT_TIMEOUT
};
1531 #ifndef HAVE_PTHREAD_CANCEL
1534 sigusr2
= (int *) pthread_getspecific (signal_thread_key
);
1539 fd
= accept (sockfd
, (struct sockaddr
*) &raddr
, &slen
);
1540 if (init
== 0 || fd
== -1)
1542 if ((init
== 0 && (errno
== EAGAIN
|| errno
== EWOULDBLOCK
))
1543 || (errno
== EAGAIN
|| errno
== EWOULDBLOCK
))
1545 if (regen_interval
> 0
1546 && (init
== 0 || time (NULL
) - init
>= regen_interval
))
1549 int remote_client
= 0;
1551 MUTEX_LOCK(&cn_mutex
);
1552 for (i
= 0; i
< slist_length (cn_thread_list
); i
++)
1554 struct client_thread_s
*thd
=
1555 slist_nth_data (cn_thread_list
, i
);
1563 MUTEX_UNLOCK(&cn_mutex
);
1567 char *tmp
= config_get_string ("global", "tls_dh_level");
1570 rc
= tls_init_params (tmp
);
1592 select (0, NULL
, NULL
, NULL
, &tv
);
1597 if (errno
== EMFILE
|| errno
== ENFILE
)
1598 log_write ("accept(): %s",
1599 pwmd_strerror (gpg_error_from_errno (errno
)));
1600 else if (errno
!= EAGAIN
)
1602 if (!quit
) // probably EBADF
1603 log_write ("accept(): %s", strerror (errno
));
1608 #ifndef HAVE_PTHREAD_CANCEL
1609 select (0, NULL
, NULL
, NULL
, &tv
);
1620 inet_ntop (raddr
.ss_family
, get_in_addr ((struct sockaddr
*) &raddr
),
1622 (void) init_client (fd
, s
);
1623 n
= config_get_integer ("global", "tcp_wait");
1626 tv
.tv_sec
= (n
* 100000) / 100000;
1627 tv
.tv_usec
= (n
* 100000) % 100000;
1628 select (0, NULL
, NULL
, NULL
, &tv
);
1636 start_stop_tls_with_protocol (int ipv6
, int term
)
1638 struct addrinfo hints
, *servinfo
, *p
;
1639 int port
= config_get_integer ("global", "tcp_port");
1643 int *fd
= ipv6
? &tls6_fd
: &tls_fd
;
1645 if (term
|| config_get_boolean ("global", "enable_tcp") == 0)
1651 #ifdef HAVE_PTHREAD_CANCEL
1652 pthread_cancel (tls6_tid
);
1654 pthread_kill (tls6_tid
, SIGUSR2
);
1656 pthread_join (tls6_tid
, NULL
);
1659 shutdown (tls6_fd
, SHUT_RDWR
);
1669 #ifdef HAVE_PTHREAD_CANCEL
1670 pthread_cancel (tls_tid
);
1672 pthread_kill (tls_tid
, SIGUSR2
);
1674 pthread_join (tls_tid
, NULL
);
1677 shutdown (tls_fd
, SHUT_RDWR
);
1686 if ((ipv6
&& tls6_fd
!= -1) || (!ipv6
&& tls_fd
!= -1))
1689 memset (&hints
, 0, sizeof (hints
));
1690 hints
.ai_family
= ipv6
? AF_INET6
: AF_INET
;
1691 hints
.ai_socktype
= SOCK_STREAM
;
1692 hints
.ai_flags
= AI_PASSIVE
;
1693 snprintf (buf
, sizeof (buf
), "%i", port
);
1695 if ((n
= getaddrinfo (NULL
, buf
, &hints
, &servinfo
)) == -1)
1697 log_write ("getaddrinfo(): %s", gai_strerror (n
));
1701 for (n
= 0, p
= servinfo
; p
!= NULL
; p
= p
->ai_next
)
1705 if ((ipv6
&& p
->ai_family
!= AF_INET6
)
1706 || (!ipv6
&& p
->ai_family
!= AF_INET
))
1709 if ((*fd
= socket (p
->ai_family
, p
->ai_socktype
, p
->ai_protocol
)) == -1)
1711 log_write ("socket(): %s", strerror (errno
));
1715 if (setsockopt (*fd
, SOL_SOCKET
, SO_REUSEADDR
, &r
, sizeof (int)) == -1)
1717 log_write ("setsockopt(): %s",
1718 pwmd_strerror (gpg_error_from_errno (errno
)));
1719 freeaddrinfo (servinfo
);
1723 if (bind (*fd
, p
->ai_addr
, p
->ai_addrlen
) == -1)
1726 log_write ("bind(): %s",
1727 pwmd_strerror (gpg_error_from_errno (errno
)));
1735 freeaddrinfo (servinfo
);
1740 #if HAVE_DECL_SO_BINDTODEVICE != 0
1741 char *tmp
= config_get_string ("global", "tcp_interface");
1742 if (tmp
&& setsockopt (*fd
, SOL_SOCKET
, SO_BINDTODEVICE
, tmp
,
1743 strlen (tmp
)) == -1)
1745 log_write ("setsockopt(): %s",
1746 pwmd_strerror (gpg_error_from_errno (errno
)));
1754 if (listen (*fd
, 128) == -1)
1756 log_write ("listen(): %s", strerror (errno
));
1761 rc
= create_thread (tcp_accept_thread
, fd
, &tls6_tid
, 0);
1763 rc
= create_thread (tcp_accept_thread
, fd
, &tls_tid
, 0);
1767 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
1768 pwmd_strerror (rc
));
1780 start_stop_tls_with_protocol (0, 1);
1793 start_stop_tls (int term
)
1795 char *s
= config_get_string ("global", "tcp_bind");
1801 if (!strcmp (s
, "any"))
1803 b
= start_stop_tls_with_protocol (0, term
);
1805 b
= start_stop_tls_with_protocol (1, term
);
1807 else if (!strcmp (s
, "ipv4"))
1808 b
= start_stop_tls_with_protocol (0, term
);
1809 else if (!strcmp (s
, "ipv6"))
1810 b
= start_stop_tls_with_protocol (1, term
);
1820 accept_thread (void *arg
)
1822 int sockfd
= *(int *) arg
;
1823 #ifndef HAVE_PTHREAD_CANCEL
1824 int *n
= xmalloc (sizeof (int));
1827 pthread_setspecific (signal_thread_key
, n
);
1829 fcntl (sockfd
, F_SETFL
, O_NONBLOCK
);
1832 #ifdef HAVE_PR_SET_NAME
1833 prctl (PR_SET_NAME
, "accept");
1835 pthread_setspecific (thread_name_key
, str_asprintf ("!%s", __FUNCTION__
));
1839 socklen_t slen
= sizeof (struct sockaddr_un
);
1840 struct sockaddr_un raddr
;
1842 #ifndef HAVE_PTHREAD_CANCEL
1843 struct timeval tv
= { 0, ACCEPT_TIMEOUT
};
1844 int *sigusr2
= (int *) pthread_getspecific (signal_thread_key
);
1850 fd
= accept (sockfd
, (struct sockaddr
*) &raddr
, &slen
);
1853 if (errno
== EMFILE
|| errno
== ENFILE
)
1854 log_write ("accept(): %s",
1855 pwmd_strerror (gpg_error_from_errno (errno
)));
1856 else if (errno
!= EAGAIN
)
1858 if (!quit
) // probably EBADF
1859 log_write ("accept(): %s",
1860 pwmd_strerror (gpg_error_from_errno (errno
)));
1865 #ifndef HAVE_PTHREAD_CANCEL
1866 select (0, NULL
, NULL
, NULL
, &tv
);
1871 (void) init_client (fd
, NULL
);
1874 /* Just in case accept() failed for some reason other than EBADF */
1880 cache_timer_thread (void *arg
)
1882 #ifndef HAVE_PTHREAD_CANCEL
1883 int *n
= xmalloc (sizeof (int));
1886 pthread_setspecific (signal_thread_key
, n
);
1890 #ifdef HAVE_PR_SET_NAME
1891 prctl (PR_SET_NAME
, "cache timer");
1893 pthread_setspecific (thread_name_key
, str_asprintf ("!%s", __FUNCTION__
));
1897 struct timeval tv
= { 1, 0 };
1898 #ifndef HAVE_PTHREAD_CANCEL
1901 n
= (int *) pthread_getspecific (signal_thread_key
);
1906 select (0, NULL
, NULL
, NULL
, &tv
);
1907 cache_adjust_timeout ();
1914 signal_loop (sigset_t sigset
)
1923 sigwait (&sigset
, &sig
);
1926 log_write (_("caught signal %i (%s)"), sig
, strsignal (sig
));
1931 pthread_cond_signal (&rcfile_cond
);
1934 log_write (_("clearing file cache"));
1936 send_status_all (STATUS_CACHE
, NULL
);
1955 log_write (_ ("Caught signal %i (%s). Exiting."), sig
, strsignal (sig
));
1956 #ifdef HAVE_BACKTRACE
1957 BACKTRACE (__FUNCTION__
);
1963 waiting_for_exit (void *arg
)
1966 #ifndef HAVE_PTHREAD_CANCEL
1967 int *n
= xmalloc (sizeof (int));
1970 pthread_setspecific (signal_thread_key
, n
);
1974 #ifdef HAVE_PR_SET_NAME
1975 prctl (PR_SET_NAME
, "exiting");
1977 pthread_setspecific (thread_name_key
, str_asprintf ("!%s", __FUNCTION__
));
1978 log_write (_("waiting for all clients to disconnect"));
1979 MUTEX_LOCK (&quit_mutex
);
1980 pthread_cleanup_push (cleanup_mutex_cb
, &quit_mutex
);
1987 MUTEX_LOCK (&cn_mutex
);
1988 n
= slist_length (cn_thread_list
);
1989 MUTEX_UNLOCK (&cn_mutex
);
1993 #ifndef HAVE_PTHREAD_CANCEL
1994 int *s
= (int *) pthread_getspecific (signal_thread_key
);
2001 log_write (_("%i clients remain"), n
);
2005 INIT_TIMESPEC (SIG_TIMEOUT
, ts
);
2006 pthread_cond_timedwait (&quit_cond
, &quit_mutex
, &ts
);
2009 kill (getpid (), SIGQUIT
);
2010 pthread_cleanup_pop (1);
2015 server_loop (int sockfd
, char **socketpath
)
2017 pthread_t accept_tid
;
2018 pthread_t cache_timeout_tid
;
2019 int cancel_timeout_thread
= 0, cancel_accept_thread
= 0;
2020 int cancel_keepalive_thread
= 0;
2027 sigemptyset (&sigset
);
2030 sigaddset (&sigset
, SIGTERM
);
2031 sigaddset (&sigset
, SIGINT
);
2033 /* Clears the file cache. */
2034 sigaddset (&sigset
, SIGUSR1
);
2036 /* Configuration file reloading. */
2037 sigaddset (&sigset
, SIGHUP
);
2039 /* For exiting cleanly. */
2040 sigaddset (&sigset
, SIGQUIT
);
2042 #ifndef HAVE_PTHREAD_CANCEL
2044 The socket, cache and rcfile threads use this signal when
2045 pthread_cancel() is unavailable. Prevent the main thread from
2046 catching this signal from another process.
2048 sigaddset (&sigset
, SIGUSR2
);
2051 /* When mem.c cannot find a pointer in the list (double free). */
2052 signal (SIGABRT
, catchsig
);
2053 sigaddset (&sigset
, SIGABRT
);
2054 sigprocmask (SIG_BLOCK
, &sigset
, NULL
);
2056 #ifndef HAVE_PTHREAD_CANCEL
2057 /* Remove this signal from the watched signals in signal_loop(). */
2058 sigdelset (&sigset
, SIGUSR2
);
2061 /* Can show a backtrace of the stack in the log. */
2062 signal (SIGSEGV
, catchsig
);
2065 /* Needs to be done after the fork(). */
2066 if (!start_stop_tls (0))
2073 pthread_mutex_init (&quit_mutex
, NULL
);
2074 pthread_cond_init (&quit_cond
, NULL
);
2075 char *p
= get_username (getuid());
2076 log_write (_("%s started for user %s"), PACKAGE_STRING
, p
);
2080 if (config_get_boolean ("global", "enable_tcp"))
2081 log_write (_("Listening on %s and TCP port %i"), *socketpath
,
2082 config_get_integer ("global", "tcp_port"));
2084 log_write (_("Listening on %s"), *socketpath
);
2086 log_write (_("Listening on %s"), *socketpath
);
2089 rc
= create_thread (keepalive_thread
, NULL
, &keepalive_tid
, 0);
2092 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
2093 pwmd_strerror (rc
));
2097 cancel_keepalive_thread
= 1;
2098 rc
= create_thread (reload_rcfile_thread
, NULL
, &rcfile_tid
, 0);
2101 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
2102 pwmd_strerror (rc
));
2106 rc
= create_thread (cache_timer_thread
, NULL
, &cache_timeout_tid
, 0);
2109 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
2110 pwmd_strerror (rc
));
2114 cancel_timeout_thread
= 1;
2115 rc
= create_thread (accept_thread
, &sockfd
, &accept_tid
, 0);
2118 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
2119 pwmd_strerror (rc
));
2123 cancel_accept_thread
= 1;
2125 signal_loop (sigset
);
2131 * We're out of the main server loop. This happens when a signal was sent
2132 * to terminate the daemon. We'll wait for all clients to disconnect
2133 * before exiting but exit immediately if another termination signal is
2136 if (cancel_accept_thread
)
2138 #ifdef HAVE_PTHREAD_CANCEL
2139 int n
= pthread_cancel (accept_tid
);
2141 int n
= pthread_kill (accept_tid
, SIGUSR2
);
2144 pthread_join (accept_tid
, NULL
);
2150 shutdown (sockfd
, SHUT_RDWR
);
2152 unlink (*socketpath
);
2153 xfree (*socketpath
);
2155 MUTEX_LOCK (&cn_mutex
);
2156 n
= slist_length (cn_thread_list
);
2157 MUTEX_UNLOCK (&cn_mutex
);
2163 rc
= create_thread (waiting_for_exit
, NULL
, &tid
, 0);
2166 if (signal_loop (sigset
))
2168 log_write (_("Received second termination request. Exiting."));
2169 #ifdef HAVE_PTHREAD_CANCEL
2170 pthread_cancel (tid
);
2172 pthread_kill (tid
, SIGUSR2
);
2174 pthread_join (tid
, NULL
);
2178 log_write ("%s(%i): pthread_create(): %s", __FILE__
, __LINE__
,
2179 pwmd_strerror (rc
));
2182 if (cancel_timeout_thread
)
2184 #ifdef HAVE_PTHREAD_CANCEL
2185 pthread_cancel (cache_timeout_tid
);
2187 pthread_kill (cache_timeout_tid
, SIGUSR2
);
2189 pthread_join (cache_timeout_tid
, NULL
);
2192 if (cancel_keepalive_thread
)
2194 #ifdef HAVE_PTHREAD_CANCEL
2195 pthread_cancel (keepalive_tid
);
2197 pthread_kill (keepalive_tid
, SIGUSR2
);
2199 pthread_join (keepalive_tid
, NULL
);
2202 cleanup_all_clients (0);
2207 pthread_cond_destroy (&quit_cond
);
2208 pthread_mutex_destroy (&quit_mutex
);
2209 return segv
? EXIT_FAILURE
: EXIT_SUCCESS
;;
2216 ("Failed to add a file to the cache. Use --force to force startup. Exiting."));
2220 /* This is called from cache.c:clear_once(). See
2221 * command.c:clearcache_command() for details about lock checking.
2224 free_cache_data (file_cache_t
* cache
)
2226 gpg_error_t rc
= GPG_ERR_NO_DATA
;
2228 struct client_thread_s
*found
= NULL
;
2235 MUTEX_LOCK (&cn_mutex
);
2236 pthread_cleanup_push (cleanup_mutex_cb
, &cn_mutex
);
2237 t
= slist_length (cn_thread_list
);
2239 for (i
= 0; i
< t
; i
++)
2241 struct client_thread_s
*thd
= slist_nth_data (cn_thread_list
, i
);
2246 if (!memcmp (thd
->cl
->md5file
, cache
->filename
,
2247 sizeof (cache
->filename
)))
2249 if (pthread_equal (pthread_self (), thd
->tid
))
2256 /* Continue trying to find a client who has the same file open and
2257 * also has a lock. */
2258 rc
= cache_lock_mutex (thd
->cl
->ctx
, thd
->cl
->md5file
, -1, 0, -1);
2268 if (self
&& (!rc
|| rc
== GPG_ERR_NO_DATA
))
2269 rc
= cache_lock_mutex (found
->cl
->ctx
, found
->cl
->md5file
, -1, 0, -1);
2271 if (exiting
|| !rc
|| rc
== GPG_ERR_NO_DATA
)
2273 free_cache_data_once (cache
->data
);
2275 cache
->defer_clear
= 0;
2276 cache
->timeout
= -1;
2279 cache_unlock_mutex (found
->cl
->md5file
, 0);
2285 cache
->defer_clear
= 1;
2287 pthread_cleanup_pop (1);
2293 usage (const char *pn
, int status
)
2295 FILE *fp
= status
== EXIT_FAILURE
? stderr
: stdout
;
2297 fprintf (fp
, _("Usage: %s [OPTIONS] [file1] [...]\n"
2298 " --debug=[a:..][,g:N][,t:N] enable debugging (a:[ixedsc],g:[1-9],t:[0-N])\n"
2299 " -f, --rcfile=filename load the specfied configuration file\n"
2300 " (~/.pwmd/config)\n"
2301 " --homedir alternate pwmd home directory (~/.pwmd)\n"
2302 " --kill terminate an existing instance of pwmd\n"
2303 " -n, --no-fork run as a foreground process\n"
2304 " -D, --disable-dump disable the LIST, XPATH and DUMP commands\n"
2305 " --ignore, --force ignore file errors during startup\n"
2306 " -o, --outfile=filename output file when importing or converting\n"
2307 " -C, --convert=filename convert a version 2 data file to version 3\n"
2308 " -I, --import=filename import a pwmd DTD formatted XML file)\n"
2309 " -k, --passphrase-file=file for use when importing or converting\n"
2310 " --no-passphrase-file prompt instead of using --passphrase-file when\n"
2312 " --no-passphrase when importing or converting\n"
2313 " --keyid=keyID[,..] public key to use when encrypting\n"
2314 " --sign-keyid=fpr[,..] fingerprint of the signing key to use\n"
2315 " --symmetric use conventional encryption with optional signer\n"
2316 " --keyparam=filename custom key parameters to use (gpg default)\n"
2317 " --help this help text\n"
2318 " --version show version and compile time features\n"),
2324 unlink_stale_socket (const char *sock
, const char *pidfile
)
2326 log_write (_ ("removing stale socket %s"), sock
);
2332 test_pidfile (const char *path
, const char *sock
, char *buf
, size_t buflen
,
2333 char **pidfile
, int create
, mode_t mode
, int terminate
)
2341 snprintf (buf
, buflen
, "%s/%s.pid", homedir
, sock
);
2342 *pidfile
= str_dup (buf
);
2343 fd
= open (buf
, O_RDONLY
);
2346 fd
= open (*pidfile
, O_CREAT
|O_WRONLY
|O_TRUNC
, mode
);
2350 if (!create
&& errno
!= ENOENT
)
2352 log_write ("%s: %s", buf
, pwmd_strerror (errno
));
2357 else if (!create
&& !terminate
)
2360 log_write ("%s: %s", *pidfile
, strerror (errno
));
2366 snprintf (buf
, buflen
, "%i", getpid ());
2367 ssize_t ret
= write (fd
, buf
, strlen (buf
));
2369 log_write ("%s (%i): %s", __FUNCTION__
, __LINE__
,
2370 pwmd_strerror (gpg_error_from_syserror ()));
2375 len
= read (fd
, buf
, buflen
);
2379 unlink_stale_socket (path
, *pidfile
);
2383 if (sscanf (buf
, "%5i", &pid
) != 1 || pid
== 0)
2387 unlink_stale_socket (path
, *pidfile
);
2392 if (kill (pid
, 0) == -1)
2394 unlink_stale_socket (path
, *pidfile
);
2400 if (kill (pid
, SIGTERM
) == -1)
2401 log_write ("%s: %s", path
, pwmd_strerror (errno
));
2404 log_write (_ ("an instance for socket %s is already running"), path
);
2412 parse_debug_level (const char *str
, unsigned *debug
, int *gpgme
, int *tls
)
2418 for (p
= str
; p
&& *p
; p
++)
2420 if (*p
== 'a') // assuan debug flags
2430 level
|= ASSUAN_LOG_INIT
;
2433 level
|= ASSUAN_LOG_CTX
;
2436 level
|= ASSUAN_LOG_ENGINE
;
2439 level
|= ASSUAN_LOG_DATA
;
2442 level
|= ASSUAN_LOG_SYSIO
;
2445 level
|= ASSUAN_LOG_CONTROL
;
2460 else if (*p
== 'g' || *p
== 't') // gpgme and TLS debug level
2468 if (!isdigit (*++p
))
2477 if (tl
< 0 || gl
< 0 || gl
> 9)
2480 while (isdigit (*p
))
2484 if (*(p
+1) && *(p
+1) != ',')
2504 main (int argc
, char *argv
[])
2507 struct sockaddr_un addr
;
2509 char *socketpath
= NULL
, *socketdir
, *socketname
= NULL
;
2510 char *socketarg
= NULL
;
2511 char *datadir
= NULL
;
2512 char *pidfile
= NULL
;
2516 char **cache_push
= NULL
;
2517 char *import
= NULL
, *keyid
= NULL
, *sign_keyid
= NULL
;
2518 char *keyparam
= NULL
;
2519 int estatus
= EXIT_FAILURE
;
2521 char *outfile
= NULL
;
2524 int show_version
= 0;
2528 char *keyfile
= NULL
;
2533 int gpgme_level
= -1;
2535 /* Must maintain the same order as longopts[] */
2538 OPT_VERSION
, OPT_HELP
, OPT_HOMEDIR
, OPT_NO_FORK
, OPT_DISABLE_DUMP
,
2539 OPT_FORCE
, OPT_RCFILE
, OPT_PASSPHRASE_FILE
, OPT_IMPORT
, OPT_OUTFILE
,
2540 OPT_KEYID
, OPT_SIGN_KEYID
, OPT_SYMMETRIC
, OPT_KEYPARAM
, OPT_KILL
,
2543 const char *optstring
= "nf:C:k:I:o:s";
2544 const struct option longopts
[] = {
2545 {"version", no_argument
, 0, 0},
2546 {"help", no_argument
, 0, 0},
2547 {"homedir", required_argument
, 0, 0},
2548 {"no-fork", no_argument
, 0, 'n'},
2549 {"disable_dump", no_argument
, 0, 0},
2550 {"force", no_argument
, 0, 0},
2551 {"rcfile", required_argument
, 0, 'f'},
2552 {"passphrase-file", required_argument
, 0, 'k'},
2553 {"import", required_argument
, 0, 'I'},
2554 {"outfile", required_argument
, 0, 'o'},
2555 {"keyid", required_argument
, 0, 0},
2556 {"sign-keyid", required_argument
, 0, 0},
2557 {"symmetric", no_argument
, 0, 's'},
2558 {"keyparam", required_argument
, 0, 0},
2559 {"kill", no_argument
, 0, 0},
2560 {"debug", required_argument
, 0, 0},
2568 #ifdef HAVE_SETRLIMIT
2571 rl
.rlim_cur
= rl
.rlim_max
= 0;
2573 if (setrlimit (RLIMIT_CORE
, &rl
) != 0)
2574 err (EXIT_FAILURE
, "setrlimit()");
2577 #ifdef HAVE_PR_SET_DUMPABLE
2578 prctl (PR_SET_DUMPABLE
, 0);
2583 setlocale (LC_ALL
, "");
2584 bindtextdomain ("pwmd", LOCALEDIR
);
2585 textdomain ("pwmd");
2593 if (setup_crypto ())
2594 exit (EXIT_FAILURE
);
2596 rc
= cache_init (free_cache_data
);
2599 log_write ("pwmd: ERR %i: %s", rc
, pwmd_strerror (rc
));
2600 exit (EXIT_FAILURE
);
2604 gnutls_global_init ();
2605 tls_level
= tls_level
== -1 ? 1 : tls_level
;
2606 gnutls_global_set_log_level (tls_level
);
2607 gnutls_global_set_log_function (tls_log
);
2608 gnutls_global_set_audit_log_function (tls_audit_log
);
2612 xmlMemSetup (xfree
, xmalloc
, xrealloc
, str_dup
);
2618 while ((opt
= getopt_long (argc
, argv
, optstring
, longopts
, &optindex
))
2639 rcfile
= str_dup (optarg
);
2645 usage (argv
[0], EXIT_FAILURE
);
2651 if (parse_debug_level (optarg
, &assuan_level
, &gpgme_level
,
2653 usage (argv
[0], EXIT_FAILURE
);
2662 usage (argv
[0], EXIT_SUCCESS
);
2665 homedir
= str_dup (optarg
);
2670 case OPT_DISABLE_DUMP
:
2677 rcfile
= str_dup (optarg
);
2679 case OPT_PASSPHRASE_FILE
:
2691 case OPT_SIGN_KEYID
:
2692 sign_keyid
= optarg
;
2701 usage (argv
[0], EXIT_FAILURE
);
2709 "Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016\n"
2711 "Released under the terms of the GPL v2. Use at your own risk.\n\n"
2712 "Compile time features:\n%s"), PACKAGE_STRING
,
2715 "+PWMD_HOMEDIR=" PWMD_HOMEDIR
"\n"
2743 exit (EXIT_SUCCESS
);
2748 homedir
= str_dup(PWMD_HOMEDIR
);
2750 homedir
= str_asprintf ("%s/.pwmd", get_home_dir());
2753 if (mkdir (homedir
, 0700) == -1 && errno
!= EEXIST
)
2754 err (EXIT_FAILURE
, "%s", homedir
);
2757 rcfile
= str_asprintf ("%s/config", homedir
);
2759 pthread_key_create (&last_error_key
, free_key
);
2760 #ifndef HAVE_PTHREAD_CANCEL
2761 pthread_key_create (&signal_thread_key
, free_key
);
2764 pthread_mutexattr_t attr
;
2765 pthread_mutexattr_init (&attr
);
2766 pthread_mutexattr_settype (&attr
, PTHREAD_MUTEX_RECURSIVE
);
2767 pthread_mutex_init (&rcfile_mutex
, &attr
);
2768 global_config
= config_parse (rcfile
, 0);
2771 pthread_mutexattr_destroy (&attr
);
2772 pthread_mutex_destroy (&rcfile_mutex
);
2773 exit (EXIT_FAILURE
);
2776 p
= config_get_string ("global", "gpg_homedir");
2778 datadir
= str_asprintf ("%s/.gnupg", homedir
);
2780 datadir
= expand_homedir (p
);
2783 if (mkdir (datadir
, 0700) == -1 && errno
!= EEXIST
)
2784 err (EXIT_FAILURE
, "%s", datadir
);
2786 if (gpgme_level
!= -1)
2788 char s
[2] = { gpgme_level
+ '0', 0 };
2790 if (getenv ("GPGME_DEBUG"))
2791 log_write (_ ("Overriding GPGME_DEBUG environment with level %u!"),
2794 gpgme_set_global_flag ("debug", s
);
2797 if (!gpgme_check_version (NULL
))
2799 log_write ("gpgme_check_version() failed");
2800 exit (EXIT_FAILURE
);
2803 grc
= gpgme_engine_check_version (GPGME_PROTOCOL_OPENPGP
);
2806 log_write ("%u: %s", grc
, gpgme_strerror (grc
));
2807 exit (EXIT_FAILURE
);
2811 gpgme_set_locale (NULL
, LC_CTYPE
, setlocale (LC_CTYPE
, NULL
));
2812 gpgme_set_locale (NULL
, LC_MESSAGES
, setlocale (LC_MESSAGES
, NULL
));
2814 rc
= gpgme_set_engine_info (GPGME_PROTOCOL_OpenPGP
, NULL
, datadir
);
2817 snprintf (buf
, sizeof (buf
), "%s/data", homedir
);
2818 if (mkdir (buf
, 0700) == -1 && errno
!= EEXIST
)
2819 err (EXIT_FAILURE
, "%s", buf
);
2821 datadir
= str_dup (buf
);
2822 pthread_cond_init (&rcfile_cond
, NULL
);
2823 pthread_mutex_init (&cn_mutex
, &attr
);
2824 pthread_mutexattr_destroy (&attr
);
2828 x
= config_get_int_param (global_config
, "global", "priority", &exists
);
2829 if (exists
&& x
!= atoi(INVALID_PRIORITY
))
2832 if (setpriority (PRIO_PROCESS
, 0, x
) == -1)
2834 log_write ("setpriority(): %s",
2835 pwmd_strerror (gpg_error_from_errno (errno
)));
2839 #ifdef HAVE_MLOCKALL
2840 if (disable_mlock
== 0 && mlockall (MCL_CURRENT
| MCL_FUTURE
) == -1)
2842 log_write ("mlockall(): %s",
2843 pwmd_strerror (gpg_error_from_errno (errno
)));
2850 char **keyids
= NULL
, **sign_keyids
= NULL
;
2852 if (!outfile
|| !*outfile
|| argc
!= optind
)
2853 usage (argv
[0], EXIT_FAILURE
);
2856 keyids
= str_split (keyid
, ",", 0);
2858 sign_keyids
= str_split (sign_keyid
, ",", 0);
2859 rc
= xml_import (import
, outfile
, keyids
, sign_keyids
, keyfile
, keyparam
, sym
);
2861 strv_free (sign_keyids
);
2864 if (gpg_err_source (rc
) == GPG_ERR_SOURCE_UNKNOWN
)
2865 rc
= gpg_error (rc
);
2867 log_write ("%s: %u: %s", import
, rc
, pwmd_strerror (rc
));
2870 config_free (global_config
);
2872 exit (rc
? EXIT_FAILURE
: EXIT_SUCCESS
);
2875 p
= config_get_string ("global", "socket_path");
2877 p
= str_asprintf ("%s/socket", homedir
);
2879 socketarg
= expand_homedir (p
);
2883 disable_list_and_dump
= config_get_boolean ("global",
2884 "disable_list_and_dump");
2886 disable_list_and_dump
= secure
;
2888 cache_push
= config_get_list ("global", "cache_push");
2890 while (optind
< argc
)
2892 if (strv_printf (&cache_push
, "%s", argv
[optind
++]) == 0)
2893 errx (EXIT_FAILURE
, "%s", pwmd_strerror (GPG_ERR_ENOMEM
));
2896 if (strchr (socketarg
, '/') == NULL
)
2898 socketdir
= getcwd (buf
, sizeof (buf
));
2899 socketname
= str_dup (socketarg
);
2900 socketpath
= str_asprintf ("%s/%s", socketdir
, socketname
);
2904 socketname
= str_dup (strrchr (socketarg
, '/'));
2906 socketarg
[strlen (socketarg
) - strlen (socketname
) - 1] = 0;
2907 socketdir
= str_dup (socketarg
);
2908 socketpath
= str_asprintf ("%s/%s", socketdir
, socketname
);
2911 if (chdir (datadir
))
2913 log_write ("%s: %s", datadir
,
2914 pwmd_strerror (gpg_error_from_errno (errno
)));
2915 unlink (socketpath
);
2919 x
= test_pidfile (socketpath
, socketname
, buf
, sizeof(buf
), &pidfile
, 0,
2921 if (!terminate
&& x
)
2925 estatus
= x
!= 1 ? EXIT_FAILURE
: EXIT_SUCCESS
;
2930 * bind() doesn't like the full pathname of the socket or any non alphanum
2931 * characters so change to the directory where the socket is wanted then
2932 * create it then change to datadir.
2934 if (chdir (socketdir
))
2936 log_write ("%s: %s", socketdir
,
2937 pwmd_strerror (gpg_error_from_errno (errno
)));
2943 if ((sockfd
= socket (PF_UNIX
, SOCK_STREAM
, 0)) == -1)
2945 log_write ("socket(): %s", pwmd_strerror (gpg_error_from_errno (errno
)));
2949 addr
.sun_family
= AF_UNIX
;
2950 snprintf (addr
.sun_path
, sizeof (addr
.sun_path
), "%s", socketname
);
2952 if (bind (sockfd
, (struct sockaddr
*) &addr
, sizeof (struct sockaddr
)) ==
2955 log_write ("bind(): %s", pwmd_strerror (gpg_error_from_errno (errno
)));
2957 if (errno
== EADDRINUSE
)
2960 log_write (_("Either there is another pwmd running or '%s' is a \n"
2961 "stale socket. Please remove it manually."), socketpath
);
2968 char *t
= config_get_string ("global", "socket_perms");
2973 mode
= strtol (t
, NULL
, 8);
2977 if (chmod (socketname
, mode
) == -1)
2979 log_write ("%s: %s", socketname
,
2980 pwmd_strerror (gpg_error_from_errno (errno
)));
2990 xfree (--socketname
);
2992 if (chdir (datadir
))
2994 log_write ("%s: %s", datadir
,
2995 pwmd_strerror (gpg_error_from_errno (errno
)));
3003 * Set the cache entry for a file. Prompts for the password.
3007 for (opt
= 0; cache_push
[opt
]; opt
++)
3009 struct crypto_s
*crypto
= NULL
;
3010 char *pw_file
= config_get_string (cache_push
[opt
],
3012 gpg_error_t rc
= crypto_init (&crypto
, NULL
, cache_push
[opt
],
3017 crypto
->flags
|= pw_file
? CRYPTO_FLAG_KEYFILE
: 0;
3018 crypto
->keyfile
= pw_file
;
3025 estatus
= EXIT_FAILURE
;
3029 rc
= do_cache_push (crypto
);
3032 log_write ("ERR %u: %s", rc
, pwmd_strerror(rc
));
3033 strv_free (cache_push
);
3035 estatus
= EXIT_FAILURE
;
3036 crypto_cleanup (crypto
);
3040 log_write ("%s: %s", crypto
->filename
, pwmd_strerror(rc
));
3042 log_write (_("Successfully added '%s' to the cache."),
3045 crypto_cleanup (crypto
);
3048 strv_free (cache_push
);
3049 log_write (!nofork
? _("Done. Daemonizing...") :
3050 _("Done. Waiting for connections..."));
3053 if (listen (sockfd
, 128) == -1)
3055 log_write ("listen(): %s", pwmd_strerror (gpg_error_from_errno (errno
)));
3064 log_write ("fork(): %s",
3065 pwmd_strerror (gpg_error_from_errno (errno
)));
3074 _exit (EXIT_SUCCESS
);
3078 (void)test_pidfile (socketpath
, socketname
, buf
, sizeof(buf
), &pidfile
, 1,
3081 pthread_key_create (&thread_name_key
, free_key
);
3082 estatus
= server_loop (sockfd
, &socketpath
);
3085 if (socketpath
&& do_unlink
)
3087 unlink (socketpath
);
3093 gnutls_global_deinit ();
3094 tls_deinit_params ();
3098 #ifdef HAVE_PTHREAD_CANCEL
3099 pthread_cancel (rcfile_tid
);
3101 pthread_kill (rcfile_tid
, SIGUSR2
);
3102 pthread_cond_signal (&rcfile_cond
);
3104 pthread_join (rcfile_tid
, NULL
);
3107 pthread_cond_destroy (&rcfile_cond
);
3108 pthread_mutex_destroy (&rcfile_mutex
);
3109 pthread_key_delete (last_error_key
);
3110 #ifndef HAVE_PTHREAD_CANCEL
3111 pthread_key_delete (signal_thread_key
);
3115 config_free (global_config
);
3117 free_invoking_users (invoking_users
);
3119 xfree (home_directory
);
3121 xmlCleanupParser ();
3122 xmlCleanupGlobals ();
3128 if (estatus
== EXIT_SUCCESS
&& !terminate
)
3129 log_write (_("pwmd exiting normally"));
3131 pthread_key_delete (thread_name_key
);
3133 #if defined(DEBUG) && !defined(MEM_DEBUG)
3143 gpg_error_t
lock_flock (assuan_context_t ctx
, const char *filename
,
3149 *fd
= open (filename
, O_RDONLY
);
3151 return gpg_error_from_syserror ();
3153 TRY_FLOCK (ctx
, *fd
, type
, rc
);
3164 void unlock_flock (int *fd
)