From: Luke Howard Date: Wed, 8 Sep 2010 17:48:00 +0000 (+0200) Subject: work on cred functions X-Git-Url: http://www.project-moonshot.org/gitweb/?p=cyrus-sasl.git;a=commitdiff_plain;h=08de53f1611944baa573fae991d75d67ba1d8da4 work on cred functions --- diff --git a/mech_eap/inquire_context.c b/mech_eap/inquire_context.c index fec50af..d1143e8 100644 --- a/mech_eap/inquire_context.c +++ b/mech_eap/inquire_context.c @@ -66,7 +66,12 @@ gss_inquire_context(OM_uint32 *minor, if (lifetime_rec != NULL) { time_t now = time(NULL); - time_t lifetime = now - ctx->expiryTime; + time_t lifetime; + + if (ctx->expiryTime == ~0) + lifetime = GSS_C_INDEFINITE; + else + lifetime = now - ctx->expiryTime; if (lifetime < 0) lifetime = 0; diff --git a/mech_eap/inquire_cred.c b/mech_eap/inquire_cred.c index 8c24866..986bdf6 100644 --- a/mech_eap/inquire_cred.c +++ b/mech_eap/inquire_cred.c @@ -34,11 +34,60 @@ OM_uint32 gss_inquire_cred(OM_uint32 *minor, - gss_cred_id_t cred_handle, + gss_cred_id_t cred, gss_name_t *name, - OM_uint32 *lifetime, + OM_uint32 *pLifetime, gss_cred_usage_t *cred_usage, gss_OID_set *mechanisms) { - GSSEAP_NOT_IMPLEMENTED; + OM_uint32 major = GSS_S_COMPLETE; + + if (name != NULL) { + major = gss_duplicate_name(minor, cred->name, name); + if (GSS_ERROR(major)) + goto cleanup; + } + + if (pLifetime != NULL) { + time_t now = time(NULL); + time_t lifetime; + + if (cred->expiryTime == ~0) + lifetime = GSS_C_INDEFINITE; + else + lifetime = now - cred->expiryTime; + + if (lifetime < 0) + lifetime = 0; + + *pLifetime = lifetime; + } + + if (cred_usage != NULL) { + OM_uint32 flags = (cred->flags & (CRED_FLAG_INITIATE | CRED_FLAG_ACCEPT)); + + switch (flags) { + case CRED_FLAG_INITIATE: + *cred_usage = GSS_C_INITIATE; + break; + case CRED_FLAG_ACCEPT: + *cred_usage = GSS_C_ACCEPT; + break; + default: + *cred_usage = GSS_C_BOTH; + break; + } + } + + if (mechanisms != NULL) { + if (cred->mechanisms != GSS_C_NO_OID_SET) + major = duplicateOidSet(minor, cred->mechanisms, mechanisms); + else + major = gssEapIndicateMechs(minor, mechanisms); + if (GSS_ERROR(major)) + goto cleanup; + } + +cleanup: + return major; } diff --git a/mech_eap/inquire_cred_by_oid.c b/mech_eap/inquire_cred_by_oid.c index e6d2972..651da45 100644 --- a/mech_eap/inquire_cred_by_oid.c +++ b/mech_eap/inquire_cred_by_oid.c @@ -32,11 +32,29 @@ #include "gssapiP_eap.h" +static struct { + gss_OID_desc oid; + OM_uint32 (*inquire)(OM_uint32 *, const gss_cred_id_t, + const gss_OID, gss_buffer_set_t *); +} inquireCredOps[] = { +}; + OM_uint32 gss_inquire_cred_by_oid(OM_uint32 *minor, const gss_cred_id_t cred_handle, const gss_OID desired_object, gss_buffer_set_t *data_set) { - GSSEAP_NOT_IMPLEMENTED; + OM_uint32 major = GSS_S_UNAVAILABLE; + int i; + + for (i = 0; i < sizeof(inquireCredOps) / sizeof(inquireCredOps[0]); i++) { + if (oidEqual(&inquireCredOps[i].oid, desired_object)) { + major = (*inquireCredOps[i].inquire)(minor, cred_handle, + desired_object, data_set); + break; + } + } + + return major; } diff --git a/mech_eap/inquire_sec_context_by_oid.c b/mech_eap/inquire_sec_context_by_oid.c index 578a955..6718b3d 100644 --- a/mech_eap/inquire_sec_context_by_oid.c +++ b/mech_eap/inquire_sec_context_by_oid.c @@ -32,11 +32,29 @@ #include "gssapiP_eap.h" +static struct { + gss_OID_desc oid; + OM_uint32 (*inquire)(OM_uint32 *, const gss_ctx_id_t, + const gss_OID, gss_buffer_set_t *); +} inquireCtxOps[] = { +}; + OM_uint32 gss_inquire_sec_context_by_oid(OM_uint32 *minor, const gss_ctx_id_t context_handle, const gss_OID desired_object, gss_buffer_set_t *data_set) { - GSSEAP_NOT_IMPLEMENTED; + OM_uint32 major = GSS_S_UNAVAILABLE; + int i; + + for (i = 0; i < sizeof(inquireCtxOps) / sizeof(inquireCtxOps[0]); i++) { + if (oidEqual(&inquireCtxOps[i].oid, desired_object)) { + major = (*inquireCtxOps[i].inquire)(minor, context_handle, + desired_object, data_set); + break; + } + } + + return major; } diff --git a/mech_eap/set_sec_context_option.c b/mech_eap/set_sec_context_option.c index 3b1abf5..07ad740 100644 --- a/mech_eap/set_sec_context_option.c +++ b/mech_eap/set_sec_context_option.c @@ -32,11 +32,29 @@ #include "gssapiP_eap.h" +static struct { + gss_OID_desc oid; + OM_uint32 (*setOption)(OM_uint32 *, gss_ctx_id_t *pCtx, + const gss_OID, const gss_buffer_t); +} setCtxOps[] = { +}; + OM_uint32 gss_set_sec_context_option(OM_uint32 *minor, - gss_ctx_id_t *pCred, + gss_ctx_id_t *pCtx, const gss_OID desired_object, const gss_buffer_t value) { - GSSEAP_NOT_IMPLEMENTED; + OM_uint32 major = GSS_S_UNAVAILABLE; + int i; + + for (i = 0; i < sizeof(setCtxOps) / sizeof(setCtxOps[0]); i++) { + if (oidEqual(&setCtxOps[i].oid, desired_object)) { + major = (*setCtxOps[i].setOption)(minor, pCtx, + desired_object, value); + break; + } + } + + return major; } diff --git a/mech_eap/store_cred.c b/mech_eap/store_cred.c index ce45d02..4ddac48 100644 --- a/mech_eap/store_cred.c +++ b/mech_eap/store_cred.c @@ -42,5 +42,6 @@ gss_store_cred(OM_uint32 *minor, gss_OID_set *elements_stored, gss_cred_usage_t *cred_usage_stored) { - GSSEAP_NOT_IMPLEMENTED; + *minor = 0; + return GSS_S_UNAVAILABLE; }