xref: /netbsd-src/external/bsd/cron/dist/pam_auth.c (revision ba06b608b5c912b2808abc9b57fade8cc0f03ef2)
1 #include "cron.h"
2 
3 #ifdef USE_PAM
4 
5 #include <security/pam_appl.h>
6 
7 static pam_handle_t *pamh = NULL;
8 static const struct pam_conv cron_conv;
9 
10 int
cron_pam_start(const char * username)11 cron_pam_start (const char *username)
12 {
13 	int     retval;
14 
15 	if (pamh)
16 		return 0;
17 
18 	retval = pam_start ("cron", username, &cron_conv, &pamh);
19 	log_close ();
20 	if (retval != PAM_SUCCESS)
21 	{
22 		pamh = NULL;
23 		log_it ("CRON", getpid (), "pam_start failed",
24 			pam_strerror (pamh, retval));
25 		return 0;
26 	}
27 	retval = pam_authenticate (pamh, PAM_SILENT);
28 	log_close ();
29 	if (retval != PAM_SUCCESS)
30 	{
31 		log_it ("CRON", getpid (), "pam_authenticate failed",
32 			pam_strerror (pamh, retval));
33 		pam_end (pamh, retval);
34 		pamh = NULL;
35 		return 0;
36 	}
37 	retval = pam_acct_mgmt (pamh, PAM_SILENT);
38 	log_close ();
39 	if (retval != PAM_SUCCESS)
40 	{
41 		log_it ("CRON", getpid (), "pam_acct_mgmt failed",
42 			pam_strerror (pamh, retval));
43 		pam_end (pamh, retval);
44 		pamh = NULL;
45 		return 0;
46 	}
47 	retval = pam_open_session (pamh, PAM_SILENT);
48 	log_close ();
49 	if (retval != PAM_SUCCESS)
50 	{
51 		log_it ("CRON", getpid (), "pam_open_session failed",
52 			pam_strerror (pamh, retval));
53 		pam_end (pamh, retval);
54 		pamh = NULL;
55 		return 0;
56 	}
57 
58 	return 1;
59 }
60 
61 int
cron_pam_setcred(void)62 cron_pam_setcred (void)
63 {
64 	int     retval;
65 
66 	if (!pamh)
67 		return 0;
68 
69 	retval = pam_setcred (pamh, PAM_ESTABLISH_CRED | PAM_SILENT);
70 	log_close ();
71 	if (retval != PAM_SUCCESS)
72 	{
73 		log_it ("CRON", getpid (), "pam_setcred failed",
74 			pam_strerror (pamh, retval));
75 		pam_end (pamh, retval);
76 		pamh = NULL;
77 		log_close ();
78 		return 0;
79 	}
80 
81 	return 1;
82 }
83 
84 void
cron_pam_finish(void)85 cron_pam_finish (void)
86 {
87 	if (!pamh)
88 		return;
89 
90 	pam_close_session (pamh, 0);
91 	pam_end (pamh, 0);
92 	pamh = NULL;
93 	log_close ();
94 }
95 
96 #ifndef PAM_DATA_SILENT
97 #define PAM_DATA_SILENT 0
98 #endif
99 
100 void
cron_pam_child_close(void)101 cron_pam_child_close (void)
102 {
103 	pam_end (pamh, PAM_DATA_SILENT);
104 	pamh = NULL;
105 	log_close ();
106 }
107 
108 char  **
cron_pam_getenvlist(char ** envp)109 cron_pam_getenvlist (char **envp)
110 {
111 	if (!pamh || !envp)
112 		return 0;
113 
114 	for (; *envp; ++envp)
115 		if (pam_putenv (pamh, *envp) != PAM_SUCCESS)
116 			return 0;
117 
118 	return pam_getenvlist (pamh);
119 }
120 
121 #endif /* USE_PAM */
122