summaryrefslogtreecommitdiffstats
path: root/lib/libpam/modules/pam_krb5/support.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libpam/modules/pam_krb5/support.c')
-rw-r--r--lib/libpam/modules/pam_krb5/support.c185
1 files changed, 0 insertions, 185 deletions
diff --git a/lib/libpam/modules/pam_krb5/support.c b/lib/libpam/modules/pam_krb5/support.c
deleted file mode 100644
index 8e1aecd..0000000
--- a/lib/libpam/modules/pam_krb5/support.c
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * support.c
- *
- * Support functions for pam_krb5
- *
- * $FreeBSD$
- */
-
-static const char rcsid[] = "$Id: support.c,v 1.8 2000/01/04 09:50:03 fcusack Exp $";
-
-#include <errno.h>
-#include <stdio.h> /* BUFSIZ */
-#include <stdlib.h> /* malloc */
-#include <string.h> /* strncpy */
-#include <syslog.h> /* syslog */
-#include <security/pam_appl.h>
-#include <security/pam_modules.h>
-#include <krb5.h>
-#include <com_err.h>
-#include "pam_krb5.h"
-
-/*
- * Get info from the user. Disallow null responses (regardless of flags).
- * response gets allocated and filled in on successful return. Caller
- * is responsible for freeing it.
- */
-int
-get_user_info(pam_handle_t *pamh, char *prompt, int type, char **response)
-{
- int pamret;
- struct pam_message msg;
- const struct pam_message *pmsg;
- struct pam_response *resp = NULL;
- struct pam_conv *conv;
-
- if ((pamret = pam_get_item(pamh, PAM_CONV, (const void **) &conv)) != 0)
- return pamret;
-
- /* set up conversation call */
- pmsg = &msg;
- msg.msg_style = type;
- msg.msg = prompt;
-
- if ((pamret = conv->conv(1, &pmsg, &resp, conv->appdata_ptr)) != 0)
- return pamret;
-
- /* Caller should ignore errors for non-response conversations */
- if (!resp)
- return PAM_CONV_ERR;
-
- if (!(resp->resp && resp->resp[0])) {
- free(resp);
- return PAM_AUTH_ERR;
- }
-
- *response = resp->resp;
- free(resp);
- return pamret;
-}
-
-/*
- * This routine with some modification is from the MIT V5B6 appl/bsd/login.c
- * Modified by Sam Hartman <hartmans@mit.edu> to support PAM services
- * for Debian.
- *
- * Verify the Kerberos ticket-granting ticket just retrieved for the
- * user. If the Kerberos server doesn't respond, assume the user is
- * trying to fake us out (since we DID just get a TGT from what is
- * supposedly our KDC). If the host/<host> service is unknown (i.e.,
- * the local keytab doesn't have it), and we cannot find another
- * service we do have, let her in.
- *
- * Returns 1 for confirmation, -1 for failure, 0 for uncertainty.
- */
-int
-verify_krb_v5_tgt(krb5_context context, krb5_ccache ccache,
- char * pam_service, int debug)
-{
- char phost[BUFSIZ];
- char *services [3];
- char **service;
- krb5_error_code retval = -1;
- krb5_principal princ;
- krb5_keyblock * keyblock = 0;
- krb5_data packet;
- krb5_auth_context auth_context = NULL;
-
- packet.data = 0;
-
- /*
- * If possible we want to try and verify the ticket we have
- * received against a keytab. We will try multiple service
- * principals, including at least the host principal and the PAM
- * service principal. The host principal is preferred because access
- * to that key is generally sufficient to compromise root, while the
- * service key for this PAM service may be less carefully guarded.
- * It is important to check the keytab first before the KDC so we do
- * not get spoofed by a fake KDC.*/
- services [0] = "host";
- services [1] = pam_service;
- services [2] = NULL;
- for ( service = &services[0]; *service != NULL; service++ ) {
- if ((retval = krb5_sname_to_principal(context, NULL, *service, KRB5_NT_SRV_HST,
- &princ)) != 0) {
- if (debug)
- syslog(LOG_DEBUG, "pam_krb5: verify_krb_v5_tgt(): %s: %s",
- "krb5_sname_to_principal()", error_message(retval));
- return -1;
- }
-
- /* Extract the name directly. */
- strncpy(phost, compat_princ_component(context, princ, 1), BUFSIZ);
- phost[BUFSIZ - 1] = '\0';
-
- /*
- * Do we have service/<host> keys?
- * (use default/configured keytab, kvno IGNORE_VNO to get the
- * first match, and ignore enctype.)
- */
- if ((retval = krb5_kt_read_service_key(context, NULL, princ, 0,
- 0, &keyblock)) != 0)
- continue;
- break;
- }
- if (retval != 0 ) { /* failed to find key */
- /* Keytab or service key does not exist */
- if (debug)
- syslog(LOG_DEBUG, "pam_krb5: verify_krb_v5_tgt(): %s: %s",
- "krb5_kt_read_service_key()", error_message(retval));
- retval = 0;
- goto cleanup;
- }
- if (keyblock)
- krb5_free_keyblock(context, keyblock);
-
- /* Talk to the kdc and construct the ticket. */
- retval = krb5_mk_req(context, &auth_context, 0, *service, phost,
- NULL, ccache, &packet);
- if (auth_context) {
- krb5_auth_con_free(context, auth_context);
- auth_context = NULL; /* setup for rd_req */
- }
- if (retval) {
- if (debug)
- syslog(LOG_DEBUG, "pam_krb5: verify_krb_v5_tgt(): %s: %s",
- "krb5_mk_req()", error_message(retval));
- retval = -1;
- goto cleanup;
- }
-
- /* Try to use the ticket. */
- retval = krb5_rd_req(context, &auth_context, &packet, princ,
- NULL, NULL, NULL);
- if (retval) {
- if (debug)
- syslog(LOG_DEBUG, "pam_krb5: verify_krb_v5_tgt(): %s: %s",
- "krb5_rd_req()", error_message(retval));
- retval = -1;
- } else {
- retval = 1;
- }
-
-cleanup:
- if (packet.data)
- compat_free_data_contents(context, &packet);
- krb5_free_principal(context, princ);
- return retval;
-
-}
-
-
-/* Free the memory for cache_name. Called by pam_end() */
-void
-cleanup_cache(pam_handle_t *pamh, void *data, int pam_end_status)
-{
- krb5_context pam_context;
- krb5_ccache ccache;
-
- if (krb5_init_context(&pam_context))
- return;
-
- ccache = (krb5_ccache) data;
- (void) krb5_cc_destroy(pam_context, ccache);
- krb5_free_context(pam_context);
-}
OpenPOWER on IntegriCloud