Abstract out the initiator filter function, it will be needed for the
acceptor too. Remove negHints. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@19409 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -64,37 +64,10 @@ send_reject (OM_uint32 *minor_status,
|
|||||||
return GSS_S_BAD_MECH;
|
return GSS_S_BAD_MECH;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
initiator_approved(gss_name_t target_name, gss_OID mech)
|
|
||||||
{
|
|
||||||
OM_uint32 min_stat, maj_stat;
|
|
||||||
gss_ctx_id_t ctx = GSS_C_NO_CONTEXT;
|
|
||||||
gss_buffer_desc out;
|
|
||||||
|
|
||||||
maj_stat = gss_init_sec_context(&min_stat,
|
|
||||||
GSS_C_NO_CREDENTIAL,
|
|
||||||
&ctx,
|
|
||||||
target_name,
|
|
||||||
mech,
|
|
||||||
0,
|
|
||||||
GSS_C_INDEFINITE,
|
|
||||||
GSS_C_NO_CHANNEL_BINDINGS,
|
|
||||||
GSS_C_NO_BUFFER,
|
|
||||||
NULL,
|
|
||||||
&out,
|
|
||||||
NULL,
|
|
||||||
NULL);
|
|
||||||
if (GSS_ERROR(maj_stat))
|
|
||||||
return 0;
|
|
||||||
gss_release_buffer(&min_stat, &out);
|
|
||||||
gss_delete_sec_context(&min_stat, &ctx, NULL);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
OM_uint32
|
OM_uint32
|
||||||
_gss_spnego_indicate_mechtypelist (OM_uint32 *minor_status,
|
_gss_spnego_indicate_mechtypelist (OM_uint32 *minor_status,
|
||||||
gss_name_t target_name,
|
gss_name_t target_name,
|
||||||
|
int (*func)(gss_name_t, gss_OID),
|
||||||
int includeMSCompatOID,
|
int includeMSCompatOID,
|
||||||
const gssspnego_cred cred_handle,
|
const gssspnego_cred cred_handle,
|
||||||
MechTypeList *mechtypelist,
|
MechTypeList *mechtypelist,
|
||||||
@@ -138,7 +111,7 @@ _gss_spnego_indicate_mechtypelist (OM_uint32 *minor_status,
|
|||||||
return GSS_S_FAILURE;
|
return GSS_S_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target_name && initiator_approved(target_name, GSS_KRB5_MECHANISM)) {
|
if (func && (*func)(target_name, GSS_KRB5_MECHANISM)) {
|
||||||
ret = _gss_spnego_add_mech_type(GSS_KRB5_MECHANISM,
|
ret = _gss_spnego_add_mech_type(GSS_KRB5_MECHANISM,
|
||||||
includeMSCompatOID,
|
includeMSCompatOID,
|
||||||
mechtypelist);
|
mechtypelist);
|
||||||
@@ -153,8 +126,7 @@ _gss_spnego_indicate_mechtypelist (OM_uint32 *minor_status,
|
|||||||
if (gss_oid_equal(&supported_mechs->elements[i], GSS_KRB5_MECHANISM))
|
if (gss_oid_equal(&supported_mechs->elements[i], GSS_KRB5_MECHANISM))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (target_name && !initiator_approved(target_name,
|
if (func && !(*func)(target_name, &supported_mechs->elements[i]))
|
||||||
&supported_mechs->elements[i]))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ret = _gss_spnego_add_mech_type(&supported_mechs->elements[i],
|
ret = _gss_spnego_add_mech_type(&supported_mechs->elements[i],
|
||||||
@@ -194,14 +166,6 @@ send_supported_mechs (OM_uint32 *minor_status,
|
|||||||
gss_buffer_t output_token)
|
gss_buffer_t output_token)
|
||||||
{
|
{
|
||||||
NegotiationToken nt;
|
NegotiationToken nt;
|
||||||
#if 0
|
|
||||||
char hostname[MAXHOSTNAMELEN], *p;
|
|
||||||
gss_buffer_desc name_buf;
|
|
||||||
gss_OID name_type;
|
|
||||||
gss_name_t target_princ;
|
|
||||||
gss_name_t canon_princ;
|
|
||||||
OM_uint32 minor;
|
|
||||||
#endif
|
|
||||||
size_t buf_len;
|
size_t buf_len;
|
||||||
gss_buffer_desc data;
|
gss_buffer_desc data;
|
||||||
OM_uint32 ret;
|
OM_uint32 ret;
|
||||||
@@ -211,92 +175,17 @@ send_supported_mechs (OM_uint32 *minor_status,
|
|||||||
nt.element = choice_NegotiationToken_negTokenInit;
|
nt.element = choice_NegotiationToken_negTokenInit;
|
||||||
nt.u.negTokenInit.reqFlags = NULL;
|
nt.u.negTokenInit.reqFlags = NULL;
|
||||||
nt.u.negTokenInit.mechToken = NULL;
|
nt.u.negTokenInit.mechToken = NULL;
|
||||||
#if 0
|
|
||||||
nt.u.negTokenInit.negHints = NULL;
|
|
||||||
#endif
|
|
||||||
nt.u.negTokenInit.mechListMIC = NULL;
|
nt.u.negTokenInit.mechListMIC = NULL;
|
||||||
|
|
||||||
ret = _gss_spnego_indicate_mechtypelist(minor_status, GSS_C_NO_NAME, 1,
|
ret = _gss_spnego_indicate_mechtypelist(minor_status, GSS_C_NO_NAME,
|
||||||
NULL,
|
NULL, 1, NULL,
|
||||||
&nt.u.negTokenInit.mechTypes, NULL);
|
&nt.u.negTokenInit.mechTypes, NULL);
|
||||||
if (ret != GSS_S_COMPLETE) {
|
if (ret != GSS_S_COMPLETE) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
ASN1_MALLOC_ENCODE(NegotiationToken, data.value, data.length,
|
||||||
memset(&target_princ, 0, sizeof(target_princ));
|
&nt, &buf_len, ret);
|
||||||
if (gethostname(hostname, sizeof(hostname) - 1) != 0) {
|
|
||||||
*minor_status = errno;
|
|
||||||
free_NegotiationToken(&nt);
|
|
||||||
return GSS_S_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Send the constructed SAM name for this host */
|
|
||||||
for (p = hostname; *p != '\0' && *p != '.'; p++) {
|
|
||||||
*p = toupper((unsigned char)*p);
|
|
||||||
}
|
|
||||||
*p++ = '$';
|
|
||||||
*p = '\0';
|
|
||||||
|
|
||||||
name_buf.length = strlen(hostname);
|
|
||||||
name_buf.value = hostname;
|
|
||||||
|
|
||||||
ret = gss_import_name(minor_status, &name_buf,
|
|
||||||
GSS_C_NO_OID,
|
|
||||||
&target_princ);
|
|
||||||
if (ret != GSS_S_COMPLETE) {
|
|
||||||
free_NegotiationToken(&nt);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
name_buf.length = 0;
|
|
||||||
name_buf.value = NULL;
|
|
||||||
|
|
||||||
/* Canonicalize the name using the preferred mechanism */
|
|
||||||
ret = gss_canonicalize_name(minor_status,
|
|
||||||
target_princ,
|
|
||||||
GSS_C_NO_OID,
|
|
||||||
&canon_princ);
|
|
||||||
if (ret != GSS_S_COMPLETE) {
|
|
||||||
free_NegotiationToken(&nt);
|
|
||||||
gss_release_name(&minor, &target_princ);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = gss_display_name(minor_status, canon_princ,
|
|
||||||
&name_buf, &name_type);
|
|
||||||
if (ret != GSS_S_COMPLETE) {
|
|
||||||
free_NegotiationToken(&nt);
|
|
||||||
gss_release_name(&minor, &canon_princ);
|
|
||||||
gss_release_name(&minor, &target_princ);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
gss_release_name(&minor, &canon_princ);
|
|
||||||
gss_release_name(&minor, &target_princ);
|
|
||||||
|
|
||||||
ALLOC(nt.u.negTokenInit.negHints, 1);
|
|
||||||
if (nt.u.negTokenInit.negHints == NULL) {
|
|
||||||
*minor_status = ENOMEM;
|
|
||||||
gss_release_buffer(&minor, &name_buf);
|
|
||||||
free_NegotiationToken(&nt);
|
|
||||||
return GSS_S_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
ALLOC(nt.u.negTokenInit.negHints->hintName, 1);
|
|
||||||
if (nt.u.negTokenInit.negHints->hintName == NULL) {
|
|
||||||
*minor_status = ENOMEM;
|
|
||||||
gss_release_buffer(&minor, &name_buf);
|
|
||||||
free_NegotiationToken(&nt);
|
|
||||||
return GSS_S_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
*(nt.u.negTokenInit.negHints->hintName) = name_buf.value;
|
|
||||||
name_buf.value = NULL;
|
|
||||||
nt.u.negTokenInit.negHints->hintAddress = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ASN1_MALLOC_ENCODE(NegotiationToken, data.value, data.length, &nt, &buf_len, ret);
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
free_NegotiationToken(&nt);
|
free_NegotiationToken(&nt);
|
||||||
return ret;
|
return ret;
|
||||||
|
Reference in New Issue
Block a user