1*77683380Schristos /* $NetBSD: pam_afslog.c,v 1.2 2006/01/20 16:51:15 christos Exp $ */
24019a421Stsarna
34019a421Stsarna /*-
44019a421Stsarna * Copyright 2005 Tyler C. Sarna <tsarna@netbsd.org>
54019a421Stsarna *
64019a421Stsarna * This code is derived from software contributed to The NetBSD Foundation
74019a421Stsarna * by Tyler C. Sarna
84019a421Stsarna *
94019a421Stsarna * Redistribution and use in source and binary forms, with or without
104019a421Stsarna * modification, are permitted provided that the following conditions
114019a421Stsarna * are met:
124019a421Stsarna * 1. Redistributions of source code must retain the above copyright
134019a421Stsarna * notice, this list of conditions and the following disclaimer.
144019a421Stsarna * 2. Neither the name of The NetBSD Foundation nor the names of its
154019a421Stsarna * contributors may be used to endorse or promote products derived
164019a421Stsarna * from this software without specific prior written permission.
174019a421Stsarna *
184019a421Stsarna * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
194019a421Stsarna * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
204019a421Stsarna * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
214019a421Stsarna * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
224019a421Stsarna * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
234019a421Stsarna * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
244019a421Stsarna * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
254019a421Stsarna * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
264019a421Stsarna * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
274019a421Stsarna * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
284019a421Stsarna * POSSIBILITY OF SUCH DAMAGE.
294019a421Stsarna */
304019a421Stsarna
314019a421Stsarna #include <sys/cdefs.h>
324019a421Stsarna
33*77683380Schristos __RCSID("$NetBSD: pam_afslog.c,v 1.2 2006/01/20 16:51:15 christos Exp $");
344019a421Stsarna
354019a421Stsarna #include <krb5/krb5.h>
364019a421Stsarna #include <krb5/kafs.h>
374019a421Stsarna
38*77683380Schristos #define PAM_SM_AUTH
39*77683380Schristos #define PAM_SM_CRED
404019a421Stsarna #include <security/pam_appl.h>
414019a421Stsarna #include <security/pam_modules.h>
424019a421Stsarna #include <security/pam_mod_misc.h>
434019a421Stsarna
444019a421Stsarna PAM_EXTERN int
pam_sm_authenticate(pam_handle_t * pamh,int flags __unused,int argc __unused,const char * argv[]__unused)454019a421Stsarna pam_sm_authenticate(pam_handle_t *pamh, int flags __unused,
464019a421Stsarna int argc __unused, const char *argv[] __unused)
474019a421Stsarna {
484019a421Stsarna return PAM_IGNORE;
494019a421Stsarna }
504019a421Stsarna
514019a421Stsarna PAM_EXTERN int
pam_sm_setcred(pam_handle_t * pamh,int flags,int argc __unused,const char * argv[]__unused)524019a421Stsarna pam_sm_setcred(pam_handle_t *pamh, int flags,
534019a421Stsarna int argc __unused, const char *argv[] __unused)
544019a421Stsarna {
554019a421Stsarna krb5_context ctx;
564019a421Stsarna krb5_ccache ccache;
574019a421Stsarna krb5_principal principal;
584019a421Stsarna krb5_error_code kret;
594019a421Stsarna const void *service = NULL;
604019a421Stsarna const char *ccname = NULL;
614019a421Stsarna int do_afslog = 0, ret = PAM_SUCCESS;
624019a421Stsarna
634019a421Stsarna pam_get_item(pamh, PAM_SERVICE, &service);
644019a421Stsarna if (service == NULL)
654019a421Stsarna service = "pam_afslog";
664019a421Stsarna
674019a421Stsarna kret = krb5_init_context(&ctx);
684019a421Stsarna if (kret != 0) {
694019a421Stsarna PAM_LOG("Error: krb5_init_context() failed");
704019a421Stsarna ret = PAM_SERVICE_ERR;
714019a421Stsarna } else {
724019a421Stsarna ccname = pam_getenv(pamh, "KRB5CCNAME");
734019a421Stsarna if (ccname)
744019a421Stsarna kret = krb5_cc_resolve(ctx, ccname, &ccache);
754019a421Stsarna else
764019a421Stsarna kret = krb5_cc_default(ctx, &ccache);
774019a421Stsarna if (kret != 0) {
784019a421Stsarna PAM_LOG("Error: failed to open ccache");
794019a421Stsarna ret = PAM_SERVICE_ERR;
804019a421Stsarna } else {
814019a421Stsarna kret = krb5_cc_get_principal(ctx, ccache, &principal);
824019a421Stsarna if (kret != 0) {
834019a421Stsarna PAM_LOG("Error: krb5_cc_get_principal() failed");
844019a421Stsarna ret = PAM_SERVICE_ERR;
854019a421Stsarna } else {
864019a421Stsarna krb5_appdefault_boolean(ctx,
874019a421Stsarna (const char *)service,
884019a421Stsarna krb5_principal_get_realm(
894019a421Stsarna ctx, principal),
904019a421Stsarna "afslog", FALSE, &do_afslog);
914019a421Stsarna
924019a421Stsarna /* silently bail if not enabled */
934019a421Stsarna
944019a421Stsarna if (do_afslog && k_hasafs()) {
954019a421Stsarna switch (flags & ~PAM_SILENT) {
964019a421Stsarna case 0:
974019a421Stsarna case PAM_ESTABLISH_CRED:
984019a421Stsarna k_setpag();
994019a421Stsarna
1004019a421Stsarna /* FALLTHROUGH */
1014019a421Stsarna
1024019a421Stsarna case PAM_REINITIALIZE_CRED:
1034019a421Stsarna case PAM_REFRESH_CRED:
1044019a421Stsarna krb5_afslog(ctx, ccache,
1054019a421Stsarna NULL, NULL);
1064019a421Stsarna break;
1074019a421Stsarna
1084019a421Stsarna case PAM_DELETE_CRED:
1094019a421Stsarna k_unlog();
1104019a421Stsarna break;
1114019a421Stsarna }
1124019a421Stsarna }
1134019a421Stsarna
1144019a421Stsarna krb5_free_principal(ctx, principal);
1154019a421Stsarna }
1164019a421Stsarna
1174019a421Stsarna krb5_cc_close(ctx, ccache);
1184019a421Stsarna }
1194019a421Stsarna
1204019a421Stsarna krb5_free_context(ctx);
1214019a421Stsarna }
1224019a421Stsarna
1234019a421Stsarna return ret;
1244019a421Stsarna }
1254019a421Stsarna
1264019a421Stsarna PAM_MODULE_ENTRY("pam_afslog");
127