comparison mod_http_oauth2/mod_http_oauth2.lua @ 5449:9c19a6b8e542

mod_http_oauth2: Describe type signatures of scope handling functions
author Kim Alvefur <zash@zash.se>
date Thu, 11 May 2023 21:41:37 +0200
parents 9d542e86e19a
children d2594bbf7c36
comparison
equal deleted inserted replaced
5448:9d542e86e19a 5449:9c19a6b8e542
89 -- Tie it to the host if global 89 -- Tie it to the host if global
90 verification_key = hashes.hmac_sha256(registration_key, module.host); 90 verification_key = hashes.hmac_sha256(registration_key, module.host);
91 jwt_sign, jwt_verify = jwt.init(registration_algo, registration_key, registration_key, registration_options); 91 jwt_sign, jwt_verify = jwt.init(registration_algo, registration_key, registration_key, registration_options);
92 end 92 end
93 93
94 -- scope : string | array | set
95 --
96 -- at each step, allow the same or a subset of scopes
97 -- (all ( client ( grant ( token ) ) ))
98 -- preserve order since it determines role if more than one granted
99
100 -- string -> array
94 local function parse_scopes(scope_string) 101 local function parse_scopes(scope_string)
95 return array(scope_string:gmatch("%S+")); 102 return array(scope_string:gmatch("%S+"));
96 end 103 end
97 104
98 local openid_claims = set.new({ "openid", "profile"; "email"; "address"; "phone" }); 105 local openid_claims = set.new({ "openid", "profile"; "email"; "address"; "phone" });
99 106
107 -- array -> array, array, array
100 local function split_scopes(scope_list) 108 local function split_scopes(scope_list)
101 local claims, roles, unknown = array(), array(), array(); 109 local claims, roles, unknown = array(), array(), array();
102 local all_roles = usermanager.get_all_roles(module.host); 110 local all_roles = usermanager.get_all_roles(module.host);
103 for _, scope in ipairs(scope_list) do 111 for _, scope in ipairs(scope_list) do
104 if openid_claims:contains(scope) then 112 if openid_claims:contains(scope) then
114 122
115 local function can_assume_role(username, requested_role) 123 local function can_assume_role(username, requested_role)
116 return usermanager.user_can_assume_role(username, module.host, requested_role); 124 return usermanager.user_can_assume_role(username, module.host, requested_role);
117 end 125 end
118 126
127 -- function (string) : function(string) : boolean
119 local function role_assumable_by(username) 128 local function role_assumable_by(username)
120 return function(role) 129 return function(role)
121 return can_assume_role(username, role); 130 return can_assume_role(username, role);
122 end 131 end
123 end 132 end
124 133
134 -- string, array --> array
125 local function user_assumable_roles(username, requested_roles) 135 local function user_assumable_roles(username, requested_roles)
126 return array.filter(requested_roles, role_assumable_by(username)); 136 return array.filter(requested_roles, role_assumable_by(username));
127 end 137 end
128 138
139 -- string, string|nil --> string, string
129 local function filter_scopes(username, requested_scope_string) 140 local function filter_scopes(username, requested_scope_string)
130 local requested_scopes, requested_roles = split_scopes(parse_scopes(requested_scope_string or "")); 141 local requested_scopes, requested_roles = split_scopes(parse_scopes(requested_scope_string or ""));
131 142
132 local granted_roles = user_assumable_roles(username, requested_roles); 143 local granted_roles = user_assumable_roles(username, requested_roles);
133 local granted_scopes = requested_scopes + granted_roles; 144 local granted_scopes = requested_scopes + granted_roles;