Merge pull request #271 from begriffs/surprise-404
Allow continued auth access after db errors
This commit is contained in:
@@ -13,6 +13,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|||||||
- Allow filters by computed columns - @diogob
|
- Allow filters by computed columns - @diogob
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
- Reset user role on error
|
||||||
- Compatible with Stack
|
- Compatible with Stack
|
||||||
- Add materialized views to results in GET / - @diogob
|
- Add materialized views to results in GET / - @diogob
|
||||||
- Indicate insertable=true for views that are insertable through triggers - @diogob
|
- Indicate insertable=true for views that are insertable through triggers - @diogob
|
||||||
|
|||||||
@@ -53,14 +53,11 @@ checkPass :: Text -> Text -> Bool
|
|||||||
checkPass = (. cs) . validatePassword . cs
|
checkPass = (. cs) . validatePassword . cs
|
||||||
|
|
||||||
setRole :: Text -> H.Tx P.Postgres s ()
|
setRole :: Text -> H.Tx P.Postgres s ()
|
||||||
setRole role = H.unitEx $ B.Stmt ("set role " <> cs (pgFmtLit role)) V.empty True
|
setRole role = H.unitEx $ B.Stmt ("set local role " <> cs (pgFmtLit role)) V.empty True
|
||||||
|
|
||||||
resetRole :: H.Tx P.Postgres s ()
|
|
||||||
resetRole = H.unitEx [H.stmt|reset role|]
|
|
||||||
|
|
||||||
setUserId :: Text -> H.Tx P.Postgres s ()
|
setUserId :: Text -> H.Tx P.Postgres s ()
|
||||||
setUserId uid = if uid /= "" then
|
setUserId uid = if uid /= "" then
|
||||||
H.unitEx $ B.Stmt ("set user_vars.user_id = " <> cs (pgFmtLit uid)) V.empty True
|
H.unitEx $ B.Stmt ("set local user_vars.user_id = " <> cs (pgFmtLit uid)) V.empty True
|
||||||
else
|
else
|
||||||
resetUserId
|
resetUserId
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ main = do
|
|||||||
|
|
||||||
runSettings appSettings $ middle $ \req respond -> do
|
runSettings appSettings $ middle $ \req respond -> do
|
||||||
body <- strictRequestBody req
|
body <- strictRequestBody req
|
||||||
resOrError <- liftIO $ H.session pool $ H.tx Nothing $
|
resOrError <- liftIO $ H.session pool $ H.tx (Just (H.ReadCommitted, Just True)) $
|
||||||
authenticated conf (app conf body) req
|
authenticated conf (app conf body) req
|
||||||
either (respond . errResponse) respond resOrError
|
either (respond . errResponse) respond resOrError
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import Network.Wai.Middleware.Static (staticPolicy, only)
|
|||||||
import Network.URI (URI(..), parseURI)
|
import Network.URI (URI(..), parseURI)
|
||||||
|
|
||||||
import PostgREST.Config (AppConfig(..), corsPolicy)
|
import PostgREST.Config (AppConfig(..), corsPolicy)
|
||||||
import PostgREST.Auth (LoginAttempt(..), signInRole, signInWithJWT, setRole, resetRole, setUserId, resetUserId)
|
import PostgREST.Auth (LoginAttempt(..), signInRole, signInWithJWT, setRole, setUserId)
|
||||||
import PostgREST.App (contentTypeForAccept)
|
import PostgREST.App (contentTypeForAccept)
|
||||||
import Codec.Binary.Base64.String (decode)
|
import Codec.Binary.Base64.String (decode)
|
||||||
|
|
||||||
@@ -62,10 +62,7 @@ authenticated conf app req = do
|
|||||||
runInRole r uid = do
|
runInRole r uid = do
|
||||||
setUserId uid
|
setUserId uid
|
||||||
setRole r
|
setRole r
|
||||||
res <- app req
|
app req
|
||||||
resetRole
|
|
||||||
resetUserId
|
|
||||||
return res
|
|
||||||
|
|
||||||
|
|
||||||
redirectInsecure :: Application -> Application
|
redirectInsecure :: Application -> Application
|
||||||
|
|||||||
@@ -29,6 +29,13 @@ spec = beforeAll
|
|||||||
request methodGet "/authors_only" [auth] ""
|
request methodGet "/authors_only" [auth] ""
|
||||||
`shouldRespondWith` 200
|
`shouldRespondWith` 200
|
||||||
|
|
||||||
|
it "recovers after 400 error with logged in user" $ do
|
||||||
|
_ <- post "/postgrest/users" [json| { "id":"jdoe", "pass": "1234", "role": "postgrest_test_author" } |]
|
||||||
|
let auth = authHeaderBasic "jdoe" "1234"
|
||||||
|
_ <- request methodPost "/rpc/problem" [auth] ""
|
||||||
|
request methodGet "/authors_only" [auth] ""
|
||||||
|
`shouldRespondWith` 200
|
||||||
|
|
||||||
it "allows users to login (JWT)" $ do
|
it "allows users to login (JWT)" $ do
|
||||||
_ <- post "/postgrest/users" [json| { "id":"jdoe", "pass": "1234", "role": "postgrest_test_author" } |]
|
_ <- post "/postgrest/users" [json| { "id":"jdoe", "pass": "1234", "role": "postgrest_test_author" } |]
|
||||||
post "/postgrest/tokens" [json| { "id":"jdoe", "pass": "1234" } |]
|
post "/postgrest/tokens" [json| { "id":"jdoe", "pass": "1234" } |]
|
||||||
|
|||||||
+1
-1
@@ -54,7 +54,7 @@ withApp perform = do
|
|||||||
|
|
||||||
perform $ middle $ \req resp -> do
|
perform $ middle $ \req resp -> do
|
||||||
body <- strictRequestBody req
|
body <- strictRequestBody req
|
||||||
result <- liftIO $ H.session pool $ H.tx Nothing
|
result <- liftIO $ H.session pool $ H.tx (Just (H.ReadCommitted, Just True))
|
||||||
$ authenticated cfg (app cfg body) req
|
$ authenticated cfg (app cfg body) req
|
||||||
either (resp . errResponse) resp result
|
either (resp . errResponse) resp result
|
||||||
|
|
||||||
|
|||||||
Vendored
+13
@@ -228,6 +228,14 @@ CREATE FUNCTION "1".sayhello(name text) RETURNS text AS $$
|
|||||||
$$ LANGUAGE SQL;
|
$$ LANGUAGE SQL;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE FUNCTION "1".problem() RETURNS void LANGUAGE plpgsql AS
|
||||||
|
$$
|
||||||
|
BEGIN
|
||||||
|
RAISE 'bad thing';
|
||||||
|
END;
|
||||||
|
$$;
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE menagerie (
|
CREATE TABLE menagerie (
|
||||||
"integer" integer NOT NULL,
|
"integer" integer NOT NULL,
|
||||||
double double precision NOT NULL,
|
double double precision NOT NULL,
|
||||||
@@ -544,6 +552,11 @@ GRANT EXECUTE ON FUNCTION sayhello(text) TO postgrest_test;
|
|||||||
GRANT EXECUTE ON FUNCTION sayhello(text) TO postgrest_anonymous;
|
GRANT EXECUTE ON FUNCTION sayhello(text) TO postgrest_anonymous;
|
||||||
|
|
||||||
|
|
||||||
|
REVOKE ALL ON FUNCTION problem() FROM PUBLIC;
|
||||||
|
REVOKE ALL ON FUNCTION problem() FROM postgrest_test_author;
|
||||||
|
GRANT EXECUTE ON FUNCTION problem() TO postgrest_test_author;
|
||||||
|
|
||||||
|
|
||||||
REVOKE ALL ON SEQUENCE items_id_seq FROM PUBLIC;
|
REVOKE ALL ON SEQUENCE items_id_seq FROM PUBLIC;
|
||||||
REVOKE ALL ON SEQUENCE items_id_seq FROM postgrest_test;
|
REVOKE ALL ON SEQUENCE items_id_seq FROM postgrest_test;
|
||||||
GRANT ALL ON SEQUENCE items_id_seq TO postgrest_test;
|
GRANT ALL ON SEQUENCE items_id_seq TO postgrest_test;
|
||||||
|
|||||||
Reference in New Issue
Block a user