Add GUC for accessing the Authorization header
This commit is contained in:
committed by
Steve Chavez
parent
aa0d6a6831
commit
b20e1150a5
@@ -13,6 +13,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|||||||
- #1378, Add support for `Prefer: count=planned` and `Prefer: count=estimated` on GET /table - @steve-chavez
|
- #1378, Add support for `Prefer: count=planned` and `Prefer: count=estimated` on GET /table - @steve-chavez
|
||||||
- #1327, Add support for optional query parameter `on_conflict` to upsert with specified keys for POST - @ykst
|
- #1327, Add support for optional query parameter `on_conflict` to upsert with specified keys for POST - @ykst
|
||||||
- #1430, Allow specifying the foreign key constraint name(`/source?select=fk_constraint(*)`) to disambiguate an embedding - @steve-chavez
|
- #1430, Allow specifying the foreign key constraint name(`/source?select=fk_constraint(*)`) to disambiguate an embedding - @steve-chavez
|
||||||
|
- #1168, Allow access to the Authorization header through the request.header.authorization GUC - @steve-chavez
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ userApiRequest schema rootSpec req reqBody
|
|||||||
. map (join (***) toS . second (fromMaybe BS.empty))
|
. map (join (***) toS . second (fromMaybe BS.empty))
|
||||||
$ qString
|
$ qString
|
||||||
, iJWT = tokenStr
|
, iJWT = tokenStr
|
||||||
, iHeaders = [ (toS $ CI.foldedCase k, toS v) | (k,v) <- hdrs, k /= hAuthorization, k /= hCookie]
|
, iHeaders = [ (toS $ CI.foldedCase k, toS v) | (k,v) <- hdrs, k /= hCookie]
|
||||||
, iCookies = maybe [] parseCookiesText $ lookupHeader "Cookie"
|
, iCookies = maybe [] parseCookiesText $ lookupHeader "Cookie"
|
||||||
}
|
}
|
||||||
where
|
where
|
||||||
|
|||||||
@@ -768,58 +768,6 @@ spec actualPgVersion = do
|
|||||||
, matchHeaders = ["Content-Type" <:> "application/octet-stream; charset=utf-8"]
|
, matchHeaders = ["Content-Type" <:> "application/octet-stream; charset=utf-8"]
|
||||||
}
|
}
|
||||||
|
|
||||||
describe "HTTP request env vars" $ do
|
|
||||||
it "custom header is set" $
|
|
||||||
request methodPost "/rpc/get_guc_value"
|
|
||||||
[("Custom-Header", "test")]
|
|
||||||
[json| { "name": "request.header.custom-header" } |]
|
|
||||||
`shouldRespondWith`
|
|
||||||
[str|"test"|]
|
|
||||||
{ matchStatus = 200
|
|
||||||
, matchHeaders = [ matchContentTypeJson ]
|
|
||||||
}
|
|
||||||
it "standard header is set" $
|
|
||||||
request methodPost "/rpc/get_guc_value"
|
|
||||||
[("Origin", "http://example.com")]
|
|
||||||
[json| { "name": "request.header.origin" } |]
|
|
||||||
`shouldRespondWith`
|
|
||||||
[str|"http://example.com"|]
|
|
||||||
{ matchStatus = 200
|
|
||||||
, matchHeaders = [ matchContentTypeJson ]
|
|
||||||
}
|
|
||||||
it "current role is available as GUC claim" $
|
|
||||||
request methodPost "/rpc/get_guc_value" []
|
|
||||||
[json| { "name": "request.jwt.claim.role" } |]
|
|
||||||
`shouldRespondWith`
|
|
||||||
[str|"postgrest_test_anonymous"|]
|
|
||||||
{ matchStatus = 200
|
|
||||||
, matchHeaders = [ matchContentTypeJson ]
|
|
||||||
}
|
|
||||||
it "single cookie ends up as claims" $
|
|
||||||
request methodPost "/rpc/get_guc_value" [("Cookie","acookie=cookievalue")]
|
|
||||||
[json| {"name":"request.cookie.acookie"} |]
|
|
||||||
`shouldRespondWith`
|
|
||||||
[str|"cookievalue"|]
|
|
||||||
{ matchStatus = 200
|
|
||||||
, matchHeaders = []
|
|
||||||
}
|
|
||||||
it "multiple cookies ends up as claims" $
|
|
||||||
request methodPost "/rpc/get_guc_value" [("Cookie","acookie=cookievalue;secondcookie=anothervalue")]
|
|
||||||
[json| {"name":"request.cookie.secondcookie"} |]
|
|
||||||
`shouldRespondWith`
|
|
||||||
[str|"anothervalue"|]
|
|
||||||
{ matchStatus = 200
|
|
||||||
, matchHeaders = []
|
|
||||||
}
|
|
||||||
it "app settings available" $
|
|
||||||
request methodPost "/rpc/get_guc_value" []
|
|
||||||
[json| { "name": "app.settings.app_host" } |]
|
|
||||||
`shouldRespondWith`
|
|
||||||
[str|"localhost"|]
|
|
||||||
{ matchStatus = 200
|
|
||||||
, matchHeaders = [ matchContentTypeJson ]
|
|
||||||
}
|
|
||||||
|
|
||||||
describe "values with quotes in IN and NOT IN" $ do
|
describe "values with quotes in IN and NOT IN" $ do
|
||||||
it "succeeds when only quoted values are present" $ do
|
it "succeeds when only quoted values are present" $ do
|
||||||
get "/w_or_wo_comma_names?name=in.(\"Hebdon, John\")" `shouldRespondWith`
|
get "/w_or_wo_comma_names?name=in.(\"Hebdon, John\")" `shouldRespondWith`
|
||||||
|
|||||||
@@ -506,6 +506,66 @@ spec actualPgVersion =
|
|||||||
{"id":4,"name":"OSX"}]
|
{"id":4,"name":"OSX"}]
|
||||||
|] { matchHeaders = [matchContentTypeJson] }
|
|] { matchHeaders = [matchContentTypeJson] }
|
||||||
|
|
||||||
|
context "HTTP request env vars" $ do
|
||||||
|
it "custom header is set" $
|
||||||
|
request methodPost "/rpc/get_guc_value"
|
||||||
|
[("Custom-Header", "test")]
|
||||||
|
[json| { "name": "request.header.custom-header" } |]
|
||||||
|
`shouldRespondWith`
|
||||||
|
[str|"test"|]
|
||||||
|
{ matchStatus = 200
|
||||||
|
, matchHeaders = [ matchContentTypeJson ]
|
||||||
|
}
|
||||||
|
it "standard header is set" $
|
||||||
|
request methodPost "/rpc/get_guc_value"
|
||||||
|
[("Origin", "http://example.com")]
|
||||||
|
[json| { "name": "request.header.origin" } |]
|
||||||
|
`shouldRespondWith`
|
||||||
|
[str|"http://example.com"|]
|
||||||
|
{ matchStatus = 200
|
||||||
|
, matchHeaders = [ matchContentTypeJson ]
|
||||||
|
}
|
||||||
|
it "current role is available as GUC claim" $
|
||||||
|
request methodPost "/rpc/get_guc_value" []
|
||||||
|
[json| { "name": "request.jwt.claim.role" } |]
|
||||||
|
`shouldRespondWith`
|
||||||
|
[str|"postgrest_test_anonymous"|]
|
||||||
|
{ matchStatus = 200
|
||||||
|
, matchHeaders = [ matchContentTypeJson ]
|
||||||
|
}
|
||||||
|
it "single cookie ends up as claims" $
|
||||||
|
request methodPost "/rpc/get_guc_value" [("Cookie","acookie=cookievalue")]
|
||||||
|
[json| {"name":"request.cookie.acookie"} |]
|
||||||
|
`shouldRespondWith`
|
||||||
|
[str|"cookievalue"|]
|
||||||
|
{ matchStatus = 200
|
||||||
|
, matchHeaders = []
|
||||||
|
}
|
||||||
|
it "multiple cookies ends up as claims" $
|
||||||
|
request methodPost "/rpc/get_guc_value" [("Cookie","acookie=cookievalue;secondcookie=anothervalue")]
|
||||||
|
[json| {"name":"request.cookie.secondcookie"} |]
|
||||||
|
`shouldRespondWith`
|
||||||
|
[str|"anothervalue"|]
|
||||||
|
{ matchStatus = 200
|
||||||
|
, matchHeaders = []
|
||||||
|
}
|
||||||
|
it "app settings available" $
|
||||||
|
request methodPost "/rpc/get_guc_value" []
|
||||||
|
[json| { "name": "app.settings.app_host" } |]
|
||||||
|
`shouldRespondWith`
|
||||||
|
[str|"localhost"|]
|
||||||
|
{ matchStatus = 200
|
||||||
|
, matchHeaders = [ matchContentTypeJson ]
|
||||||
|
}
|
||||||
|
it "allows getting the Authorization value" $
|
||||||
|
request methodPost "/rpc/get_guc_value" [authHeaderJWT "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoicG9zdGdyZXN0X3Rlc3RfYXV0aG9yIn0.Xod-F15qsGL0WhdOCr2j3DdKuTw9QJERVgoFD3vGaWA"]
|
||||||
|
[json| {"name":"request.header.authorization"} |]
|
||||||
|
`shouldRespondWith`
|
||||||
|
[str|"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoicG9zdGdyZXN0X3Rlc3RfYXV0aG9yIn0.Xod-F15qsGL0WhdOCr2j3DdKuTw9QJERVgoFD3vGaWA"|]
|
||||||
|
{ matchStatus = 200
|
||||||
|
, matchHeaders = []
|
||||||
|
}
|
||||||
|
|
||||||
context "binary output" $ do
|
context "binary output" $ do
|
||||||
context "Proc that returns scalar" $ do
|
context "Proc that returns scalar" $ do
|
||||||
it "can query without selecting column" $
|
it "can query without selecting column" $
|
||||||
|
|||||||
Reference in New Issue
Block a user