Mercurial > prosody-modules
comparison mod_http_oauth2/mod_http_oauth2.lua @ 5956:97375a78d2b5
mod_http_oauth2: Reject URLs with 'userinfo' part (thanks mimi89999)
The LuaSocket parser supports these but they're deprecated without
replacement by RFC 3986
> Use of the format "user:password" in the userinfo field is deprecated
Allowing it in OAuth2 URLs is probably bad from a security perspective.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Thu, 29 Aug 2024 16:02:46 +0200 |
parents | 46394b327d17 |
children | e8bf46a7bb27 |
comparison
equal
deleted
inserted
replaced
5955:0616a6687d0c | 5956:97375a78d2b5 |
---|---|
24 | 24 |
25 local function tmap(t) | 25 local function tmap(t) |
26 return function(k) | 26 return function(k) |
27 return t[k]; | 27 return t[k]; |
28 end | 28 end |
29 end | |
30 | |
31 local function strict_url_parse(urlstr) | |
32 local url_parts = url.parse(urlstr); | |
33 if not url_parts then return url_parts; end | |
34 if url_parts.userinfo then return false; end | |
35 return url_parts; | |
29 end | 36 end |
30 | 37 |
31 local function strict_formdecode(query) | 38 local function strict_formdecode(query) |
32 if not query then | 39 if not query then |
33 return nil; | 40 return nil; |
1359 props["policy_uri#" .. locale] = props["policy_uri"]; | 1366 props["policy_uri#" .. locale] = props["policy_uri"]; |
1360 end | 1367 end |
1361 end | 1368 end |
1362 | 1369 |
1363 local function redirect_uri_allowed(redirect_uri, client_uri, app_type) | 1370 local function redirect_uri_allowed(redirect_uri, client_uri, app_type) |
1364 local uri = url.parse(redirect_uri); | 1371 local uri = strict_url_parse(redirect_uri); |
1365 if not uri then | 1372 if not uri then |
1366 return false; | 1373 return false; |
1367 end | 1374 end |
1368 if not uri.scheme then | 1375 if not uri.scheme then |
1369 return false; -- no relative URLs | 1376 return false; -- no relative URLs |
1394 }; | 1401 }; |
1395 }; | 1402 }; |
1396 }); | 1403 }); |
1397 end | 1404 end |
1398 | 1405 |
1399 local client_uri = url.parse(client_metadata.client_uri); | 1406 local client_uri = strict_url_parse(client_metadata.client_uri); |
1400 if not client_uri or client_uri.scheme ~= "https" or loopbacks:contains(client_uri.host) then | 1407 if not client_uri or client_uri.scheme ~= "https" or loopbacks:contains(client_uri.host) then |
1401 return nil, oauth_error("invalid_client_metadata", "Missing, invalid or insecure client_uri"); | 1408 return nil, oauth_error("invalid_client_metadata", "Missing, invalid or insecure client_uri"); |
1402 end | 1409 end |
1403 | 1410 |
1404 if not client_metadata.application_type and redirect_uri_allowed(client_metadata.redirect_uris[1], client_uri, "native") then | 1411 if not client_metadata.application_type and redirect_uri_allowed(client_metadata.redirect_uris[1], client_uri, "native") then |