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