1*e7d22a2eSchristos /* $NetBSD: pam_echo.c,v 1.2 2004/12/12 08:18:44 christos Exp $ */
2*e7d22a2eSchristos
36f11bdf1Schristos /*-
46f11bdf1Schristos * Copyright (c) 2001,2003 Networks Associates Technology, Inc.
56f11bdf1Schristos * All rights reserved.
66f11bdf1Schristos *
76f11bdf1Schristos * This software was developed for the FreeBSD Project by ThinkSec AS and
86f11bdf1Schristos * NAI Labs, the Security Research Division of Network Associates, Inc.
96f11bdf1Schristos * under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the
106f11bdf1Schristos * DARPA CHATS research program.
116f11bdf1Schristos *
126f11bdf1Schristos * Redistribution and use in source and binary forms, with or without
136f11bdf1Schristos * modification, are permitted provided that the following conditions
146f11bdf1Schristos * are met:
156f11bdf1Schristos * 1. Redistributions of source code must retain the above copyright
166f11bdf1Schristos * notice, this list of conditions and the following disclaimer.
176f11bdf1Schristos * 2. Redistributions in binary form must reproduce the above copyright
186f11bdf1Schristos * notice, this list of conditions and the following disclaimer in the
196f11bdf1Schristos * documentation and/or other materials provided with the distribution.
206f11bdf1Schristos * 3. The name of the author may not be used to endorse or promote
216f11bdf1Schristos * products derived from this software without specific prior written
226f11bdf1Schristos * permission.
236f11bdf1Schristos *
246f11bdf1Schristos * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
256f11bdf1Schristos * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
266f11bdf1Schristos * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
276f11bdf1Schristos * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
286f11bdf1Schristos * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
296f11bdf1Schristos * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
306f11bdf1Schristos * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
316f11bdf1Schristos * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
326f11bdf1Schristos * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
336f11bdf1Schristos * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
346f11bdf1Schristos * SUCH DAMAGE.
356f11bdf1Schristos */
366f11bdf1Schristos
376f11bdf1Schristos #include <sys/cdefs.h>
38*e7d22a2eSchristos #ifdef __FreeBSD__
396f11bdf1Schristos __FBSDID("$FreeBSD: src/lib/libpam/modules/pam_echo/pam_echo.c,v 1.4 2003/12/11 13:55:15 des Exp $");
40*e7d22a2eSchristos #else
41*e7d22a2eSchristos __RCSID("$NetBSD: pam_echo.c,v 1.2 2004/12/12 08:18:44 christos Exp $");
42*e7d22a2eSchristos #endif
436f11bdf1Schristos
446f11bdf1Schristos #include <stdio.h>
456f11bdf1Schristos #include <stdlib.h>
466f11bdf1Schristos #include <string.h>
476f11bdf1Schristos
486f11bdf1Schristos #include <security/pam_appl.h>
496f11bdf1Schristos #include <security/pam_modules.h>
506f11bdf1Schristos #include <security/openpam.h>
516f11bdf1Schristos
526f11bdf1Schristos static int
_pam_echo(pam_handle_t * pamh,int flags,int argc,const char * argv[])536f11bdf1Schristos _pam_echo(pam_handle_t *pamh, int flags,
546f11bdf1Schristos int argc, const char *argv[])
556f11bdf1Schristos {
566f11bdf1Schristos char msg[PAM_MAX_MSG_SIZE];
576f11bdf1Schristos const void *str;
586f11bdf1Schristos const char *p, *q;
596f11bdf1Schristos int err, i, item;
606f11bdf1Schristos size_t len;
616f11bdf1Schristos
626f11bdf1Schristos if (flags & PAM_SILENT)
636f11bdf1Schristos return (PAM_SUCCESS);
646f11bdf1Schristos for (i = 0, len = 0; i < argc && len < sizeof(msg) - 1; ++i) {
656f11bdf1Schristos if (i > 0)
666f11bdf1Schristos msg[len++] = ' ';
676f11bdf1Schristos for (p = argv[i]; *p != '\0' && len < sizeof(msg) - 1; ++p) {
686f11bdf1Schristos if (*p != '%' || p[1] == '\0') {
696f11bdf1Schristos msg[len++] = *p;
706f11bdf1Schristos continue;
716f11bdf1Schristos }
726f11bdf1Schristos switch (*++p) {
736f11bdf1Schristos case 'H':
746f11bdf1Schristos item = PAM_RHOST;
756f11bdf1Schristos break;
766f11bdf1Schristos case 'h':
776f11bdf1Schristos /* not implemented */
786f11bdf1Schristos item = -1;
796f11bdf1Schristos break;
806f11bdf1Schristos case 's':
816f11bdf1Schristos item = PAM_SERVICE;
826f11bdf1Schristos break;
836f11bdf1Schristos case 't':
846f11bdf1Schristos item = PAM_TTY;
856f11bdf1Schristos break;
866f11bdf1Schristos case 'U':
876f11bdf1Schristos item = PAM_RUSER;
886f11bdf1Schristos break;
896f11bdf1Schristos case 'u':
906f11bdf1Schristos item = PAM_USER;
916f11bdf1Schristos break;
926f11bdf1Schristos default:
936f11bdf1Schristos item = -1;
946f11bdf1Schristos msg[len++] = *p;
956f11bdf1Schristos break;
966f11bdf1Schristos }
976f11bdf1Schristos if (item == -1)
986f11bdf1Schristos continue;
996f11bdf1Schristos err = pam_get_item(pamh, item, &str);
1006f11bdf1Schristos if (err != PAM_SUCCESS)
1016f11bdf1Schristos return (err);
1026f11bdf1Schristos if (str == NULL)
1036f11bdf1Schristos str = "(null)";
1046f11bdf1Schristos for (q = str; *q != '\0' && len < sizeof(msg) - 1; ++q)
1056f11bdf1Schristos msg[len++] = *q;
1066f11bdf1Schristos }
1076f11bdf1Schristos }
1086f11bdf1Schristos msg[len] = '\0';
1096f11bdf1Schristos return (pam_info(pamh, "%s", msg));
1106f11bdf1Schristos }
1116f11bdf1Schristos
1126f11bdf1Schristos PAM_EXTERN int
pam_sm_authenticate(pam_handle_t * pamh,int flags,int argc,const char * argv[])1136f11bdf1Schristos pam_sm_authenticate(pam_handle_t *pamh, int flags,
1146f11bdf1Schristos int argc, const char *argv[])
1156f11bdf1Schristos {
1166f11bdf1Schristos
1176f11bdf1Schristos return (_pam_echo(pamh, flags, argc, argv));
1186f11bdf1Schristos }
1196f11bdf1Schristos
1206f11bdf1Schristos PAM_EXTERN int
pam_sm_setcred(pam_handle_t * pamh __unused,int flags __unused,int argc __unused,const char * argv[]__unused)1216f11bdf1Schristos pam_sm_setcred(pam_handle_t *pamh __unused, int flags __unused,
1226f11bdf1Schristos int argc __unused, const char *argv[] __unused)
1236f11bdf1Schristos {
1246f11bdf1Schristos
1256f11bdf1Schristos return (PAM_SUCCESS);
1266f11bdf1Schristos }
1276f11bdf1Schristos
1286f11bdf1Schristos PAM_EXTERN int
pam_sm_acct_mgmt(pam_handle_t * pamh,int flags,int argc,const char * argv[])1296f11bdf1Schristos pam_sm_acct_mgmt(pam_handle_t *pamh, int flags,
1306f11bdf1Schristos int argc, const char *argv[])
1316f11bdf1Schristos {
1326f11bdf1Schristos
1336f11bdf1Schristos return (_pam_echo(pamh, flags, argc, argv));
1346f11bdf1Schristos }
1356f11bdf1Schristos
1366f11bdf1Schristos PAM_EXTERN int
pam_sm_open_session(pam_handle_t * pamh,int flags,int argc,const char * argv[])1376f11bdf1Schristos pam_sm_open_session(pam_handle_t *pamh, int flags,
1386f11bdf1Schristos int argc, const char *argv[])
1396f11bdf1Schristos {
1406f11bdf1Schristos
1416f11bdf1Schristos return (_pam_echo(pamh, flags, argc, argv));
1426f11bdf1Schristos }
1436f11bdf1Schristos
1446f11bdf1Schristos PAM_EXTERN int
pam_sm_close_session(pam_handle_t * pamh,int flags,int argc,const char * argv[])1456f11bdf1Schristos pam_sm_close_session(pam_handle_t *pamh, int flags,
1466f11bdf1Schristos int argc, const char *argv[])
1476f11bdf1Schristos {
1486f11bdf1Schristos
1496f11bdf1Schristos return (_pam_echo(pamh, flags, argc, argv));
1506f11bdf1Schristos }
1516f11bdf1Schristos
1526f11bdf1Schristos PAM_EXTERN int
pam_sm_chauthtok(pam_handle_t * pamh,int flags,int argc,const char * argv[])1536f11bdf1Schristos pam_sm_chauthtok(pam_handle_t *pamh, int flags,
1546f11bdf1Schristos int argc, const char *argv[])
1556f11bdf1Schristos {
1566f11bdf1Schristos
1576f11bdf1Schristos if (flags & PAM_PRELIM_CHECK)
1586f11bdf1Schristos return (PAM_SUCCESS);
1596f11bdf1Schristos return (_pam_echo(pamh, flags, argc, argv));
1606f11bdf1Schristos }
1616f11bdf1Schristos
1626f11bdf1Schristos PAM_MODULE_ENTRY("pam_echo");
163