Home | History | Annotate | Line # | Download | only in dist
pam_auth.c revision 1.1
      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 = { 0 };
      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