e_debug(authdb_event(req->auth_request),
"Introspection result: %s",
- result->success ? "success" : "failed");
+ result->error == NULL ? "success" : "failed");
- if (!result->success) {
+ if (result->error != NULL) {
/* fail here */
passdb_result = PASSDB_RESULT_INTERNAL_FAILURE;
error = result->error;
req->req = NULL;
- if (!result->success) {
+ if (result->error != NULL) {
passdb_result = PASSDB_RESULT_INTERNAL_FAILURE;
error = result->error;
} else if (!result->valid) {
if (!result->valid) {
passdb_result = PASSDB_RESULT_INTERNAL_FAILURE;
- if (result->success) {
+ if (result->error == NULL) {
error = NULL;
array_foreach(result->fields, f) {
if (strcmp(f->name, "error") == 0) {
oauth2_request_callback(struct oauth2_request *req,
struct oauth2_request_result *res)
{
- i_assert(res->success == (res->error == NULL));
i_assert(req->req_callback != NULL);
oauth2_request_callback_t *callback = req->req_callback;
req->req_callback = NULL;
if (strcasecmp(field->name, "expires_in") == 0) {
uint32_t expires_in = 0;
if (str_to_uint32(field->value, &expires_in) < 0) {
- res->success = FALSE;
res->error = t_strdup_printf(
"Malformed number '%s' in expires_in",
field->value);
}
} else if (strcasecmp(field->name, "token_type") == 0) {
if (strcasecmp(field->value, "bearer") != 0) {
- res->success = FALSE;
res->error = t_strdup_printf(
"Expected Bearer token, got '%s'",
field->value);
unsigned int status_hi = req->response_status/100;
- res.success = error == NULL && (status_hi == 2 || status_hi == 4);
- res.valid = error == NULL && (status_hi == 2);
- res.error = error;
-
- if (res.success) {
+ if (error != NULL)
+ res.error = error;
+ else if (status_hi != 2 && status_hi != 4)
+ res.error = "Internal Server Error";
+ else {
const struct oauth2_field *field;
/* see if we can figure out when it expires */
array_foreach(&req->fields, field) {
if (!oauth2_request_field_parse(field, &res))
break;
}
- } else if (res.error == NULL)
- res.error = "Internal Server Error";
+ res.valid = (status_hi == 2) && res.error == NULL;
+ }
res.fields = &req->fields;
struct oauth2_request_result {
/* Oauth2 server response fields */
ARRAY_TYPE(oauth2_field) *fields;
- /* Error message */
+ /* Non-NULL if there was an unexpected internal error. */
const char *error;
- /* Request handled successfully */
- bool success:1;
/* timestamp token expires at */
time_t expires_at;
- /* User authenticated successfully */
+ /* User authenticated successfully. Implies that error==NULL. */
bool valid:1;
};