Mercurial > prosody-modules
comparison mod_http_oauth2/mod_http_oauth2.lua @ 4998:5ab134b7e510
mod_http_oauth2: Updates for Prosody's new role API (backwards-compatible)
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 13 Jul 2022 11:20:09 +0100 |
| parents | 1b81b7269858 |
| children | 5dadbe0718f1 |
comparison
equal
deleted
inserted
replaced
| 4997:1b5869c34026 | 4998:5ab134b7e510 |
|---|---|
| 12 | 12 |
| 13 local tokens = module:depends("tokenauth"); | 13 local tokens = module:depends("tokenauth"); |
| 14 | 14 |
| 15 local clients = module:open_store("oauth2_clients", "map"); | 15 local clients = module:open_store("oauth2_clients", "map"); |
| 16 | 16 |
| 17 local function filter_scopes(request_jid, requested_scope_string) --luacheck: ignore 212/requested_scope_string | 17 local function filter_scopes(username, host, requested_scope_string) |
| 18 -- We currently don't really support scopes, so override | 18 if host ~= module.host then |
| 19 -- to whatever real permissions the user has | 19 return usermanager.get_jid_role(username.."@"..host, module.host).name; |
| 20 if usermanager.is_admin(request_jid, module.host) then | 20 end |
| 21 return "prosody:scope:admin"; | 21 |
| 22 end | 22 if requested_scope_string then -- Specific role requested |
| 23 return "prosody:scope:default"; | 23 -- TODO: The requested scope string is technically a space-delimited list |
| 24 -- of scopes, but for simplicity we're mapping this slot to role names. | |
| 25 local user_roles = usermanager.get_user_roles(username, module.host); | |
| 26 if user_roles[requested_scope_string] then | |
| 27 return requested_scope_string; | |
| 28 end | |
| 29 end | |
| 30 | |
| 31 return usermanager.get_user_default_role(username, module.host).name; | |
| 24 end | 32 end |
| 25 | 33 |
| 26 local function code_expires_in(code) | 34 local function code_expires_in(code) |
| 27 return os.difftime(os.time(), code.issued); | 35 return os.difftime(os.time(), code.issued); |
| 28 end | 36 end |
| 79 if not usermanager.test_password(request_username, request_host, request_password) then | 87 if not usermanager.test_password(request_username, request_host, request_password) then |
| 80 return oauth_error("invalid_grant", "incorrect credentials"); | 88 return oauth_error("invalid_grant", "incorrect credentials"); |
| 81 end | 89 end |
| 82 | 90 |
| 83 local granted_jid = jid.join(request_username, request_host, request_resource); | 91 local granted_jid = jid.join(request_username, request_host, request_resource); |
| 84 local granted_scopes = filter_scopes(granted_jid, params.scope); | 92 local granted_scopes = filter_scopes(request_username, request_host, params.scope); |
| 85 return json.encode(new_access_token(granted_jid, granted_scopes, nil)); | 93 return json.encode(new_access_token(granted_jid, granted_scopes, nil)); |
| 86 end | 94 end |
| 87 | 95 |
| 88 function response_type_handlers.code(params, granted_jid) | 96 function response_type_handlers.code(params, granted_jid) |
| 89 if not params.client_id then return oauth_error("invalid_request", "missing 'client_id'"); end | 97 if not params.client_id then return oauth_error("invalid_request", "missing 'client_id'"); end |
| 97 if err then error(err); end | 105 if err then error(err); end |
| 98 if not client then | 106 if not client then |
| 99 return oauth_error("invalid_client", "incorrect credentials"); | 107 return oauth_error("invalid_client", "incorrect credentials"); |
| 100 end | 108 end |
| 101 | 109 |
| 102 local granted_scopes = filter_scopes(granted_jid, params.scope); | 110 local granted_scopes = filter_scopes(client_owner, client_host, params.scope); |
| 103 | 111 |
| 104 local code = uuid.generate(); | 112 local code = uuid.generate(); |
| 105 local ok = codes:set(params.client_id .. "#" .. code, { | 113 local ok = codes:set(params.client_id .. "#" .. code, { |
| 106 issued = os.time(); | 114 issued = os.time(); |
| 107 granted_jid = granted_jid; | 115 granted_jid = granted_jid; |
