AUTH_STANDALONE
#else
# ifndef WITHOUT_PASSWD
- AUTH_ENTRY(0, "passwd", NULL, passwd_verify, NULL)
+ AUTH_ENTRY(0, "passwd", NULL, NULL, passwd_verify, NULL)
# endif
# if defined(HAVE_SECUREWARE) && !defined(WITHOUT_PASSWD)
- AUTH_ENTRY(0, "secureware", secureware_setup, secureware_verify, NULL)
+ AUTH_ENTRY(0, "secureware", secureware_init, NULL, secureware_verify, NULL)
# endif
# ifdef HAVE_AFS
- AUTH_ENTRY(1, "afs", NULL, afs_verify, NULL)
+ AUTH_ENTRY(1, "afs", NULL, NULL, afs_verify, NULL)
# endif
# ifdef HAVE_KERB4
- AUTH_ENTRY(1, "kerb4", kerb4_setup, kerb4_verify, NULL)
+ AUTH_ENTRY(1, "kerb4", kerb4_init, NULL, kerb4_verify, NULL)
# endif
# ifdef HAVE_KERB5
- AUTH_ENTRY(1, "kerb5", kerb5_setup, kerb5_verify, NULL)
+ AUTH_ENTRY(1, "kerb5", kerb5_init, NULL, kerb5_verify, NULL)
# endif
# if defined(HAVE_SKEY) || defined(HAVE_OPIE)
- AUTH_ENTRY(1, "skey", rfc1938_setup, rfc1938_verify, NULL)
+ AUTH_ENTRY(1, "rfc1938", NULL, rfc1938_setup, rfc1938_verify, NULL)
# endif
#endif /* AUTH_STANDALONE */
- AUTH_ENTRY(0, NULL, NULL, NULL, NULL)
+ AUTH_ENTRY(0, NULL, NULL, NULL, NULL, NULL)
};
int nil_pw; /* I hate resorting to globals like this... */
char *p;
sudo_auth *auth;
+ /* Initialize auth methods and unconfigure the method if necessary. */
+ for (auth = auth_switch; auth->name; auth++) {
+ if (auth->init && auth->configured) {
+ if (auth->need_root)
+ set_perms(PERM_ROOT, 0);
+
+ status = (auth->init)(sudo_user.pw, &user_prompt, &auth->data);
+ if (status == AUTH_FAILURE)
+ auth->configured = 0;
+ else if (status == AUTH_FATAL) /* XXX log */
+ exit(1); /* assume error msg already printed */
+
+ if (auth->need_root)
+ set_perms(PERM_USER, 0);
+ }
+ }
+
while (--counter) {
/* Do any per-method setup and unconfigure the method if needed */
for (auth = auth_switch; auth->name; auth++) {
int status; /* status from verify routine */
char *name;
void *data; /* method-specific data pointer */
+ int (*init) __P((struct passwd *pw, char **prompt, void **data));
int (*setup) __P((struct passwd *pw, char **prompt, void **data));
int (*verify) __P((struct passwd *pw, char *p, void **data));
int (*cleanup) __P((struct passwd *pw, int status, void **data));
} sudo_auth;
/* Prototypes for standalone methods */
-int fwtk_setup __P((struct passwd *pw, char **prompt, void **data));
+int fwtk_init __P((struct passwd *pw, char **prompt, void **data));
int fwtk_verify __P((struct passwd *pw, char *prompt, void **data));
int fwtk_cleanup __P((struct passwd *pw, int status, void **data));
-int pam_setup __P((struct passwd *pw, char **prompt, void **data));
+int pam_init __P((struct passwd *pw, char **prompt, void **data));
int pam_verify __P((struct passwd *pw, char *prompt, void **data));
int pam_cleanup __P((struct passwd *pw, int status, void **data));
int sia_setup __P((struct passwd *pw, char **prompt, void **data));
/* Prototypes for normal methods */
int passwd_verify __P((struct passwd *pw, char *pass, void **data));
-int secureware_setup __P((struct passwd *pw, char **prompt, void **data));
+int secureware_init __P((struct passwd *pw, char **prompt, void **data));
int secureware_verify __P((struct passwd *pw, char *pass, void **data));
int rfc1938_setup __P((struct passwd *pw, char **prompt, void **data));
int rfc1938_verify __P((struct passwd *pw, char *pass, void **data));
int afs_verify __P((struct passwd *pw, char *pass, void **data));
-int kerb4_setup __P((struct passwd *pw, char **prompt, void **data));
+int kerb4_init __P((struct passwd *pw, char **prompt, void **data));
int kerb4_verify __P((struct passwd *pw, char *pass, void **data));
-int kerb5_setup __P((struct passwd *pw, char **prompt, void **data));
+int kerb5_init __P((struct passwd *pw, char **prompt, void **data));
int kerb5_verify __P((struct passwd *pw, char *pass, void **data));
+int securid_init __P((struct passwd *pw, char **prompt, void **data));
+int securid_setup __P((struct passwd *pw, char **prompt, void **data));
+int securid_verify __P((struct passwd *pw, char *pass, void **data));
-/* Fields: need_root, name, setup, verify, cleanup */
-#define AUTH_ENTRY(r, n, s, v, c) { r, 1, AUTH_FAILURE, n, NULL, s, v, c },
+/* Fields: need_root, name, init, setup, verify, cleanup */
+#define AUTH_ENTRY(r, n, i, s, v, c) { r, 1, AUTH_FAILURE, n, NULL, i, s, v, c },
/* Some methods cannots (or should not) interoperate with any others */
#if defined(HAVE_PAM)
# define AUTH_STANDALONE \
- AUTH_ENTRY(1, "pam", pam_setup, pam_verify, pam_cleanup)
+ AUTH_ENTRY(1, "pam", pam_init, NULL, pam_verify, pam_cleanup)
#elif defined(HAVE_SECURID)
# define AUTH_STANDALONE \
- AUTH_ENTRY(1, "SecurId", securid_setup, securid_verify, NULL)
+ AUTH_ENTRY(1, "SecurId", securid_init, securid_setup, securid_verify, NULL)
#elif defined(HAVE_SIA)
# define AUTH_STANDALONE \
- AUTH_ENTRY(1, "sia", sia_setup, sia_verify, sia_cleanup)
+ AUTH_ENTRY(1, "sia", NULL, sia_setup, sia_verify, sia_cleanup)
#elif defined(HAVE_DCE)
# define AUTH_STANDALONE \
- AUTH_ENTRY(1, "dce", NULL, dce_verify, NULL)
+ AUTH_ENTRY(1, "dce", NULL, NULL, dce_verify, NULL)
#elif defined(HAVE_AUTHENTICATE)
# define AUTH_STANDALONE \
- AUTH_ENTRY(1, "aixauth", NULL, aixauth_verify, NULL)
+ AUTH_ENTRY(1, "aixauth", NULL, NULL, aixauth_verify, NULL)
#elif defined(HAVE_FWTK)
# define AUTH_STANDALONE \
- AUTH_ENTRY(1, "fwtk", fwtk_setup, fwtk_verify, fwtk_cleanup)
+ AUTH_ENTRY(1, "fwtk", fwtk_init, NULL, fwtk_verify, fwtk_cleanup)
#elif defined(OTP_ONLY) && (defined(HAVE_SKEY) || defined(HAVE_OPIE))
# define AUTH_STANDALONE \
- AUTH_ENTRY(1, "rfc1938", rfc1938_setup, rfc1938_verify, NULL)
+ AUTH_ENTRY(1, "rfc1938", NULL, rfc1938_setup, rfc1938_verify, NULL)
# define AUTH_STANDALONE_GETPASS
#endif