/*
- * Copyright (c) 2010, JANET(UK)
+ * Copyright (c) 2011, JANET(UK)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
return expiryTime;
}
-/*
- * Map C++ exception to GSS status
- */
-static OM_uint32
-mapException(OM_uint32 *minor, std::exception &e)
+OM_uint32
+gss_eap_attr_ctx::mapException(OM_uint32 *minor, std::exception &e) const
{
- OM_uint32 major = GSS_S_FAILURE;
+ unsigned int i;
+ OM_uint32 major;
- /* XXX TODO implement other mappings */
- if (typeid(e) == typeid(std::bad_alloc))
+ /* Errors we handle ourselves */
+ major = GSS_S_FAILURE;
+
+ if (typeid(e) == typeid(std::bad_alloc)) {
*minor = ENOMEM;
- else
- *minor = 0;
+ goto cleanup;
+ }
-#ifdef GSSEAP_DEBUG
+ /* Errors we delegate to providers */
+ major = GSS_S_CONTINUE_NEEDED;
+
+ for (i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
+ gss_eap_attr_provider *provider = m_providers[i];
+
+ if (provider == NULL)
+ continue;
+
+ major = provider->mapException(minor, e);
+ if (major != GSS_S_CONTINUE_NEEDED)
+ break;
+ }
+
+ if (major == GSS_S_CONTINUE_NEEDED) {
+ *minor = GSSEAP_ATTR_CONTEXT_FAILURE;
+ major = GSS_S_FAILURE;
+ }
+
+cleanup:
+#if 0
/* rethrow for now for debugging */
throw e;
#endif
+ assert(GSS_ERROR(major));
+
return major;
}
return GSS_S_UNAVAILABLE;
}
} catch (std::exception &e) {
- return mapException(minor, e);
+ return name->attrCtx->mapException(minor, e);
}
return GSS_S_COMPLETE;
return GSS_S_UNAVAILABLE;
}
} catch (std::exception &e) {
- return mapException(minor, e);
+ return name->attrCtx->mapException(minor, e);
}
return GSS_S_COMPLETE;
(int)attr->length, (char *)attr->value);
return GSS_S_UNAVAILABLE;
}
- } catch (std::exception &ex) {
- return mapException(minor, ex);
+ } catch (std::exception &e) {
+ return name->attrCtx->mapException(minor, e);
}
return GSS_S_COMPLETE;
(int)attr->length, (char *)attr->value);
return GSS_S_UNAVAILABLE;
}
- } catch (std::exception &ex) {
- return mapException(minor, ex);
+ } catch (std::exception &e) {
+ return name->attrCtx->mapException(minor, e);
}
return GSS_S_COMPLETE;
try {
name->attrCtx->exportToBuffer(buffer);
} catch (std::exception &e) {
- return mapException(minor, e);
+ return name->attrCtx->mapException(minor, e);
}
return GSS_S_COMPLETE;
name->attrCtx = ctx;
} catch (std::exception &e) {
delete ctx;
- return mapException(minor, e);
+ return name->attrCtx->mapException(minor, e);
}
}
}
} catch (std::exception &e) {
delete ctx;
- return mapException(minor, e);
+ return in->attrCtx->mapException(minor, e);
}
return GSS_S_COMPLETE;
try {
*output = name->attrCtx->mapToAny(authenticated, type_id);
} catch (std::exception &e) {
- return mapException(minor, e);
+ return name->attrCtx->mapException(minor, e);
}
return GSS_S_COMPLETE;
name->attrCtx->releaseAnyNameMapping(type_id, *input);
*input = NULL;
} catch (std::exception &e) {
- return mapException(minor, e);
+ return name->attrCtx->mapException(minor, e);
}
return GSS_S_COMPLETE;
gssEapCreateAttrContext(OM_uint32 *minor,
gss_cred_id_t gssCred,
gss_ctx_id_t gssCtx,
- struct gss_eap_attr_ctx **pAttrContext)
+ struct gss_eap_attr_ctx **pAttrContext,
+ time_t *pExpiryTime)
{
gss_eap_attr_ctx *ctx;
OM_uint32 major;
if (GSS_ERROR(major))
return major;
- ctx = new gss_eap_attr_ctx();
- if (!ctx->initFromGssContext(gssCred, gssCtx)) {
+ try {
+ ctx = new gss_eap_attr_ctx();
+ if (!ctx->initFromGssContext(gssCred, gssCtx)) {
+ delete ctx;
+ *minor = GSSEAP_ATTR_CONTEXT_FAILURE;
+ return GSS_S_FAILURE;
+ }
+ } catch (std::exception &e) {
+ major = ctx->mapException(minor, e);
delete ctx;
- *minor = GSSEAP_ATTR_CONTEXT_FAILURE;
- return GSS_S_FAILURE;
+ return major;
}
- gssCtx->expiryTime = ctx->getExpiryTime();
+ *pAttrContext = ctx;
+ *pExpiryTime = ctx->getExpiryTime();
*minor = 0;
return GSS_S_COMPLETE;