Do not redirect insecure requests

This commit is contained in:
calebmer
2015-11-05 17:42:48 -05:00
parent 4803d7c828
commit 34c153086c
2 changed files with 11 additions and 26 deletions
+1
View File
@@ -14,6 +14,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
### Removed ### Removed
- API versioning feature - @calebmer - API versioning feature - @calebmer
- `--db-x` command line arguments - @calebmer - `--db-x` command line arguments - @calebmer
- Secure flag responds with 403 instead of redirect - @calebmer
### Fixed ### Fixed
- Tolerate a missing role in user creation - @calebmer - Tolerate a missing role in user creation - @calebmer
+10 -26
View File
@@ -4,19 +4,15 @@
module PostgREST.Middleware where module PostgREST.Middleware where
import Data.Maybe (fromMaybe, isNothing) import Data.Maybe (fromMaybe, isNothing)
import Data.Monoid
import Data.Text import Data.Text
import Data.String.Conversions (cs) import Data.String.Conversions (cs)
import qualified Hasql as H import qualified Hasql as H
import qualified Hasql.Postgres as P import qualified Hasql.Postgres as P
import Network.HTTP.Types.Header (hAccept, hAuthorization, import Network.HTTP.Types.Header (hAccept, hAuthorization)
hLocation) import Network.HTTP.Types.Status (status403, status415)
import Network.HTTP.Types.Status (status301, status400, status415)
import Network.URI (URI (..), parseURI)
import Network.Wai (Application, Request (..), import Network.Wai (Application, Request (..),
Response, isSecure, rawPathInfo, Response, isSecure, requestHeaders,
rawQueryString, requestHeaders,
responseLBS) responseLBS)
import Network.Wai.Middleware.Cors (cors) import Network.Wai.Middleware.Cors (cors)
import Network.Wai.Middleware.Gzip (def, gzip) import Network.Wai.Middleware.Gzip (def, gzip)
@@ -54,26 +50,14 @@ runWithClaims conf app req = do
else setRole anon : jwtEnv else setRole anon : jwtEnv
jwtEnv = claimsToSQL claims jwtEnv = claimsToSQL claims
redirectInsecure :: Application -> Application checkInsecure :: Application -> Application
redirectInsecure app req respond = do checkInsecure app req respond =
let hdrs = requestHeaders req
host = lookup "host" hdrs
uriM = parseURI . cs =<< mconcat [
Just "https://",
host,
Just $ rawPathInfo req,
Just $ rawQueryString req]
isHerokuSecure = lookup "x-forwarded-proto" hdrs == Just "https"
if not (isSecure req || isHerokuSecure) if not (isSecure req || isHerokuSecure)
then case uriM of then respond $ responseLBS status403 [] "SSL is required"
Just uri ->
respond $ responseLBS status301 [
(hLocation, cs . show $ uri { uriScheme = "https:" })
] ""
Nothing ->
respond $ responseLBS status400 [] "SSL is required"
else app req respond else app req respond
where
hdrs = requestHeaders req
isHerokuSecure = lookup "x-forwarded-proto" hdrs == Just "https"
unsupportedAccept :: Application -> Application unsupportedAccept :: Application -> Application
unsupportedAccept app req respond = do unsupportedAccept app req respond = do
@@ -84,7 +68,7 @@ unsupportedAccept app req respond = do
else app req respond else app req respond
defaultMiddle :: Bool -> Application -> Application defaultMiddle :: Bool -> Application -> Application
defaultMiddle secure = (if secure then redirectInsecure else id) defaultMiddle secure = (if secure then checkInsecure else id)
. gzip def . cors corsPolicy . gzip def . cors corsPolicy
. staticPolicy (only [("favicon.ico", "static/favicon.ico")]) . staticPolicy (only [("favicon.ico", "static/favicon.ico")])
. unsupportedAccept . unsupportedAccept