X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=plugins%2Fsudoers%2Fauth%2Fkerb4.c;fp=plugins%2Fsudoers%2Fauth%2Fkerb4.c;h=176d6a797e1ca12f3d59507f5ef7afb43ec60575;hb=7a01b10fee894dea7ecb3252886912eab41e9693;hp=0000000000000000000000000000000000000000;hpb=f3530d8198251b72d01da9a07b1fa518446ec0f0;p=debian%2Fsudo diff --git a/plugins/sudoers/auth/kerb4.c b/plugins/sudoers/auth/kerb4.c new file mode 100644 index 0000000..176d6a7 --- /dev/null +++ b/plugins/sudoers/auth/kerb4.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 1999-2005, 2007, 2010-2011 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#include + +#include +#include +#include +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif /* STDC_HEADERS */ +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_UNISTD_H +# include +#endif /* HAVE_UNISTD_H */ +#include +#include + +#include "sudoers.h" +#include "sudo_auth.h" + +int +kerb4_init(struct passwd *pw, char **promptp, sudo_auth *auth) +{ + static char realm[REALM_SZ]; + + /* Don't try to verify root */ + if (pw->pw_uid == 0) + return AUTH_FAILURE; + + /* Get the local realm, or retrun failure (no krb.conf) */ + if (krb_get_lrealm(realm, 1) != KSUCCESS) + return AUTH_FAILURE; + + /* Stash a pointer to the realm (used in kerb4_verify) */ + auth->data = (void *) realm; + + return AUTH_SUCCESS; +} + +int +kerb4_verify(struct passwd *pw, char *pass, sudo_auth *auth) +{ + char tkfile[sizeof(_PATH_SUDO_TIMEDIR) + 4 + MAX_UID_T_LEN]; + char *realm = (char *) auth->data; + int error; + + /* + * Set the ticket file to be in sudo sudo timedir so we don't + * wipe out other (real) kerberos tickets. + */ + (void) snprintf(tkfile, sizeof(tkfile), "%s/tkt%u", + _PATH_SUDO_TIMEDIR, (unsigned int) pw->pw_uid); + (void) krb_set_tkt_string(tkfile); + + /* Convert the password to a ticket given. */ + error = krb_get_pw_in_tkt(pw->pw_name, "", realm, "krbtgt", realm, + DEFAULT_TKT_LIFE, pass); + + switch (error) { + case INTK_OK: + dest_tkt(); /* we are done with the temp ticket */ + return AUTH_SUCCESS; + break; + case INTK_BADPW: + case KDC_PR_UNKNOWN: + break; + default: + (void) fprintf(stderr, "Warning: Kerberos error: %s\n", + krb_err_txt[error]); + } + + return AUTH_FAILURE; +}