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 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 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 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 101 cron_pam_child_close (void) 102 { 103 pam_end (pamh, PAM_DATA_SILENT); 104 pamh = NULL; 105 log_close (); 106 } 107 108 char ** 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