xref: /netbsd-src/external/bsd/cron/dist/pam_auth.c (revision ba06b608b5c912b2808abc9b57fade8cc0f03ef2)
1065057e6Schristos #include "cron.h"
2065057e6Schristos 
3065057e6Schristos #ifdef USE_PAM
4065057e6Schristos 
5065057e6Schristos #include <security/pam_appl.h>
6065057e6Schristos 
7065057e6Schristos static pam_handle_t *pamh = NULL;
8*ba06b608Sjoerg static const struct pam_conv cron_conv;
9065057e6Schristos 
10065057e6Schristos int
cron_pam_start(const char * username)11065057e6Schristos cron_pam_start (const char *username)
12065057e6Schristos {
13065057e6Schristos 	int     retval;
14065057e6Schristos 
15065057e6Schristos 	if (pamh)
16065057e6Schristos 		return 0;
17065057e6Schristos 
18065057e6Schristos 	retval = pam_start ("cron", username, &cron_conv, &pamh);
19065057e6Schristos 	log_close ();
20065057e6Schristos 	if (retval != PAM_SUCCESS)
21065057e6Schristos 	{
22065057e6Schristos 		pamh = NULL;
23065057e6Schristos 		log_it ("CRON", getpid (), "pam_start failed",
24065057e6Schristos 			pam_strerror (pamh, retval));
25065057e6Schristos 		return 0;
26065057e6Schristos 	}
27065057e6Schristos 	retval = pam_authenticate (pamh, PAM_SILENT);
28065057e6Schristos 	log_close ();
29065057e6Schristos 	if (retval != PAM_SUCCESS)
30065057e6Schristos 	{
31065057e6Schristos 		log_it ("CRON", getpid (), "pam_authenticate failed",
32065057e6Schristos 			pam_strerror (pamh, retval));
33065057e6Schristos 		pam_end (pamh, retval);
34065057e6Schristos 		pamh = NULL;
35065057e6Schristos 		return 0;
36065057e6Schristos 	}
37065057e6Schristos 	retval = pam_acct_mgmt (pamh, PAM_SILENT);
38065057e6Schristos 	log_close ();
39065057e6Schristos 	if (retval != PAM_SUCCESS)
40065057e6Schristos 	{
41065057e6Schristos 		log_it ("CRON", getpid (), "pam_acct_mgmt failed",
42065057e6Schristos 			pam_strerror (pamh, retval));
43065057e6Schristos 		pam_end (pamh, retval);
44065057e6Schristos 		pamh = NULL;
45065057e6Schristos 		return 0;
46065057e6Schristos 	}
47065057e6Schristos 	retval = pam_open_session (pamh, PAM_SILENT);
48065057e6Schristos 	log_close ();
49065057e6Schristos 	if (retval != PAM_SUCCESS)
50065057e6Schristos 	{
51065057e6Schristos 		log_it ("CRON", getpid (), "pam_open_session failed",
52065057e6Schristos 			pam_strerror (pamh, retval));
53065057e6Schristos 		pam_end (pamh, retval);
54065057e6Schristos 		pamh = NULL;
55065057e6Schristos 		return 0;
56065057e6Schristos 	}
57065057e6Schristos 
58065057e6Schristos 	return 1;
59065057e6Schristos }
60065057e6Schristos 
61065057e6Schristos int
cron_pam_setcred(void)62065057e6Schristos cron_pam_setcred (void)
63065057e6Schristos {
64065057e6Schristos 	int     retval;
65065057e6Schristos 
66065057e6Schristos 	if (!pamh)
67065057e6Schristos 		return 0;
68065057e6Schristos 
69065057e6Schristos 	retval = pam_setcred (pamh, PAM_ESTABLISH_CRED | PAM_SILENT);
70065057e6Schristos 	log_close ();
71065057e6Schristos 	if (retval != PAM_SUCCESS)
72065057e6Schristos 	{
73065057e6Schristos 		log_it ("CRON", getpid (), "pam_setcred failed",
74065057e6Schristos 			pam_strerror (pamh, retval));
75065057e6Schristos 		pam_end (pamh, retval);
76065057e6Schristos 		pamh = NULL;
77065057e6Schristos 		log_close ();
78065057e6Schristos 		return 0;
79065057e6Schristos 	}
80065057e6Schristos 
81065057e6Schristos 	return 1;
82065057e6Schristos }
83065057e6Schristos 
84065057e6Schristos void
cron_pam_finish(void)85065057e6Schristos cron_pam_finish (void)
86065057e6Schristos {
87065057e6Schristos 	if (!pamh)
88065057e6Schristos 		return;
89065057e6Schristos 
90065057e6Schristos 	pam_close_session (pamh, 0);
91065057e6Schristos 	pam_end (pamh, 0);
92065057e6Schristos 	pamh = NULL;
93065057e6Schristos 	log_close ();
94065057e6Schristos }
95065057e6Schristos 
96065057e6Schristos #ifndef PAM_DATA_SILENT
97065057e6Schristos #define PAM_DATA_SILENT 0
98065057e6Schristos #endif
99065057e6Schristos 
100065057e6Schristos void
cron_pam_child_close(void)101065057e6Schristos cron_pam_child_close (void)
102065057e6Schristos {
103065057e6Schristos 	pam_end (pamh, PAM_DATA_SILENT);
104065057e6Schristos 	pamh = NULL;
105065057e6Schristos 	log_close ();
106065057e6Schristos }
107065057e6Schristos 
108065057e6Schristos char  **
cron_pam_getenvlist(char ** envp)109065057e6Schristos cron_pam_getenvlist (char **envp)
110065057e6Schristos {
111065057e6Schristos 	if (!pamh || !envp)
112065057e6Schristos 		return 0;
113065057e6Schristos 
114065057e6Schristos 	for (; *envp; ++envp)
115065057e6Schristos 		if (pam_putenv (pamh, *envp) != PAM_SUCCESS)
116065057e6Schristos 			return 0;
117065057e6Schristos 
118065057e6Schristos 	return pam_getenvlist (pamh);
119065057e6Schristos }
120065057e6Schristos 
121065057e6Schristos #endif /* USE_PAM */
122