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