From 03569fc666a49fa4a06fc8bf9c04dc767475757a Mon Sep 17 00:00:00 2001 From: Johan Danielsson Date: Tue, 28 Aug 2001 15:25:43 +0000 Subject: [PATCH] try using "host" if there's no "ftp" principal git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@10579 ec53bebd-3082-4978-b11e-865c3cabbd6b --- appl/ftp/ftp/gssapi.c | 46 +++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/appl/ftp/ftp/gssapi.c b/appl/ftp/ftp/gssapi.c index 7d6d16c8b..9910cb35a 100644 --- a/appl/ftp/ftp/gssapi.c +++ b/appl/ftp/ftp/gssapi.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998 - 2000 Kungliga Tekniska Högskolan + * Copyright (c) 1998 - 2001 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -37,6 +37,7 @@ #include "ftp_locl.h" #endif #include +#include RCSID("$Id$"); @@ -265,24 +266,16 @@ struct sec_server_mech gss_server_mech = { extern struct sockaddr *hisctladdr, *myctladdr; static int -gss_auth(void *app_data, char *host) +import_name(const char *kname, const char *host, gss_name_t *target_name) { - OM_uint32 maj_stat, min_stat; gss_buffer_desc name; - gss_name_t target_name; - gss_buffer_desc input, output_token; - int context_established = 0; - char *p; - int n; - gss_channel_bindings_t bindings; - struct gss_data *d = app_data; - - name.length = asprintf((char**)&name.value, "ftp@%s", host); + + name.length = asprintf((char**)&name.value, "%s@%s", kname, host); maj_stat = gss_import_name(&min_stat, &name, GSS_C_NT_HOSTBASED_SERVICE, - &target_name); + target_name); if (GSS_ERROR(maj_stat)) { OM_uint32 new_stat; OM_uint32 msg_ctx = 0; @@ -301,7 +294,28 @@ gss_auth(void *app_data, char *host) return AUTH_ERROR; } free(name.value); + return 0; +} + +static int +gss_auth(void *app_data, char *host) +{ + OM_uint32 maj_stat, min_stat; + gss_buffer_desc name; + gss_name_t target_name; + gss_buffer_desc input, output_token; + int context_established = 0; + char *p; + int n; + gss_channel_bindings_t bindings; + struct gss_data *d = app_data; + + const char *knames[] = { "ftp", "host", NULL }, **kname = knames; + + + if(import_name(*kname++, host, &target_name)) + return AUTH_ERROR; input.length = 0; input.value = NULL; @@ -337,6 +351,12 @@ gss_auth(void *app_data, char *host) OM_uint32 new_stat; OM_uint32 msg_ctx = 0; gss_buffer_desc status_string; + + if(min_stat == KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN && *kname != NULL) { + if(import_name(*kname++, host, &target_name)) + return AUTH_ERROR; + continue; + } gss_display_status(&new_stat, min_stat,