xref: /netbsd-src/lib/libpam/modules/pam_afslog/pam_afslog.c (revision 7768338003c540f40cbccb4edfc4daa896e43268)
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