const char *pass_attrs;
/* template to expand into key path, turns on local validation support */
const char *local_validation_key_dict;
+ /* valid token issuers */
+ const char *issuers;
/* TLS options */
const char *tls_ca_cert_file;
DEF_STR(active_value),
DEF_STR(client_id),
DEF_STR(client_secret),
+ DEF_STR(issuers),
DEF_INT(timeout_msecs),
DEF_INT(max_idle_time_msecs),
DEF_INT(max_parallel_connections),
.active_value = "",
.client_id = "",
.client_secret = "",
+ .issuers = "",
.pass_attrs = "",
.local_validation_key_dict = "",
.rawlog_dir = "",
db->oauth2_set.key_cache = oauth2_validation_key_cache_init();
}
+ if (*db->set.issuers != '\0')
+ db->oauth2_set.issuers = (const char *const *)
+ p_strsplit_spaces(pool, db->set.issuers, " ");
+
DLLIST_PREPEND(&db_oauth2_head, db);
return db;
#include "json-tree.h"
#include "array.h"
#include "base64.h"
+#include "str-sanitize.h"
#include "dcrypt.h"
#include "var-expand.h"
#include "oauth2.h"
}
static int
-oauth2_jwt_body_process(ARRAY_TYPE(oauth2_field) *fields, struct json_tree *tree,
+oauth2_jwt_body_process(const struct oauth2_settings *set,
+ ARRAY_TYPE(oauth2_field) *fields, struct json_tree *tree,
const char **error_r)
{
const char *sub = get_field(tree, "sub");
return -1;
}
+ const char *iss = get_field(tree, "iss");
+ if (set->issuers != NULL && *set->issuers != NULL) {
+ if (iss == NULL) {
+ *error_r = "Token is missing 'iss' field";
+ return -1;
+ }
+ if (!str_array_find(set->issuers, iss)) {
+ *error_r = t_strdup_printf("Issuer '%s' is not allowed",
+ str_sanitize_utf8(iss, 128));
+ return -1;
+ }
+ }
+
oauth2_jwt_copy_fields(fields, tree);
return 0;
}
t_base64url_decode_str(BASE64_DECODE_FLAG_NO_PADDING, blobs[1]);
if (oauth2_json_tree_build(body, &body_tree, error_r) == -1)
return -1;
- ret = oauth2_jwt_body_process(fields, body_tree, error_r);
+ ret = oauth2_jwt_body_process(set, fields, body_tree, error_r);
json_tree_deinit(&body_tree);
return ret;
struct dict *key_dict;
/* cache for validation keys */
struct oauth2_validation_key_cache *key_cache;
+ /* valid issuer names */
+ const char *const *issuers;
enum {
INTROSPECTION_MODE_GET_AUTH,