Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
haskell-gargantext
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
148
Issues
148
List
Board
Labels
Milestones
Merge Requests
7
Merge Requests
7
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
gargantext
haskell-gargantext
Commits
529ab6bc
Commit
529ab6bc
authored
Feb 05, 2024
by
Alfredo Di Napoli
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Improve CORS support
parent
ecc36158
Pipeline
#5570
failed with stages
in 14 minutes and 7 seconds
Changes
7
Pipelines
2
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
103 additions
and
23 deletions
+103
-23
gargantext-cors-settings.toml
gargantext-cors-settings.toml
+17
-0
gargantext.cabal
gargantext.cabal
+3
-0
API.hs
src/Gargantext/API.hs
+16
-16
Settings.hs
src/Gargantext/API/Admin/Settings.hs
+3
-2
CORS.hs
src/Gargantext/API/Admin/Settings/CORS.hs
+57
-0
Types.hs
src/Gargantext/API/Admin/Types.hs
+2
-4
Middleware.hs
src/Gargantext/API/Middleware.hs
+5
-1
No files found.
gargantext-cors-settings.toml
0 → 100644
View file @
529ab6bc
allowed-origins
=
[
"https://demo.gargantext.org"
,
"https://formation.gargantext.org"
,
"https://academia.sub.gargantext.org"
,
"https://cnrs.gargantext.org"
,
"https://imt.sub.gargantext.org"
,
"https://helloword.gargantext.org"
,
"https://complexsystems.gargantext.org"
,
"https://europa.gargantext.org"
,
"https://earth.sub.gargantext.org"
,
"https://health.sub.gargantext.org"
,
"https://msh.sub.gargantext.org"
,
"https://dev.sub.gargantext.org"
,
"http://localhost:8008"
]
use-origins-for-hosts
=
true
gargantext.cabal
View file @
529ab6bc
...
...
@@ -36,6 +36,7 @@ data-files:
test-data/phylo/open_science.json
test-data/phylo/issue-290-small.golden.json
test-data/test_config.ini
gargantext-cors-settings.toml
.clippy.dhall
-- When enabled, it swaps the hashing algorithm
...
...
@@ -56,6 +57,7 @@ library
Gargantext.API.Admin.Auth.Types
Gargantext.API.Admin.EnvTypes
Gargantext.API.Admin.Settings
Gargantext.API.Admin.Settings.CORS
Gargantext.API.Admin.Orchestrator.Types
Gargantext.API.Admin.Types
Gargantext.API.Auth.PolicyCheck
...
...
@@ -574,6 +576,7 @@ library
, timezone-series ^>= 0.1.13
, transformers ^>= 0.5.6.2
, transformers-base ^>= 0.4.6
, tomland >= 1.3.3.2
, tuple ^>= 0.3.0.2
, unordered-containers ^>= 0.2.16.0
, uri-encode ^>= 1.5.0.7
...
...
src/Gargantext/API.hs
View file @
529ab6bc
...
...
@@ -38,12 +38,14 @@ import Control.Concurrent
import
Control.Lens
hiding
(
Level
)
import
Data.List
(
lookup
)
import
Data.Text
(
pack
)
import
Data.Text.Encoding
qualified
as
TE
import
Data.Text.IO
(
putStrLn
)
import
Data.Validity
import
Gargantext.API.Admin.Auth.Types
(
AuthContext
)
import
Gargantext.API.Admin.EnvTypes
(
Env
,
Mode
(
..
))
import
Gargantext.API.Admin.Settings
(
newEnv
)
import
Gargantext.API.Admin.Types
(
FireWall
(
..
),
PortNumber
,
cookieSettings
,
jwtSettings
,
settings
)
import
Gargantext.API.Admin.Settings.CORS
import
Gargantext.API.Admin.Types
(
FireWall
(
..
),
PortNumber
,
cookieSettings
,
jwtSettings
,
settings
,
corsSettings
)
import
Gargantext.API.EKG
import
Gargantext.API.Middleware
(
logStdoutDevSanitised
)
import
Gargantext.API.Ngrams
(
saveNodeStoryImmediate
)
...
...
@@ -70,7 +72,7 @@ startGargantext mode port file = withLoggerHoisted mode $ \logger -> do
runDbCheck
env
portRouteInfo
port
app
<-
makeApp
env
mid
<-
makeGargMiddleware
mode
mid
<-
makeGargMiddleware
(
env
^.
settings
.
corsSettings
)
mode
periodicActions
<-
schedulePeriodicActions
env
run
port
(
mid
app
)
`
finally
`
stopGargantext
env
periodicActions
...
...
@@ -137,27 +139,25 @@ fireWall req fw = do
then
pure
True
else
pure
False
makeGargMiddleware
::
Mode
->
IO
Middleware
makeGargMiddleware
mode
=
do
let
corsMiddleware
=
cors
$
\
_
->
Just
CorsResourcePolicy
-- { corsOrigins = Just ([env^.settings.allowedOrigin], False)
{
corsOrigins
=
Nothing
-- == /*
,
corsMethods
=
[
methodGet
,
methodPost
,
methodPut
,
methodDelete
,
methodOptions
,
methodHead
]
,
corsRequestHeaders
=
[
"authorization"
,
"content-type"
]
,
corsExposedHeaders
=
Nothing
,
corsMaxAge
=
Just
(
60
*
60
*
24
)
-- one day
,
corsVaryOrigin
=
False
,
corsRequireOrigin
=
False
makeGargMiddleware
::
CORSSettings
->
Mode
->
IO
Middleware
makeGargMiddleware
crsSettings
mode
=
do
let
corsMiddleware
=
cors
$
\
_incomingRq
->
Just
simpleCorsResourcePolicy
{
corsOrigins
=
Just
(
map
mkCorsOrigin
(
crsSettings
^.
corsAllowedOrigins
),
True
)
,
corsMethods
=
[
methodGet
,
methodPost
,
methodPut
,
methodDelete
,
methodOptions
,
methodHead
]
,
corsIgnoreFailures
=
False
,
corsRequestHeaders
=
[
"authorization"
,
"content-type"
,
"x-garg-error-scheme"
]
,
corsMaxAge
=
Just
(
60
*
60
*
24
)
-- one day
}
case
mode
of
Prod
->
pure
$
logStdout
.
corsMiddleware
_
->
do
loggerMiddleware
<-
logStdoutDevSanitised
pure
$
loggerMiddleware
.
corsMiddleware
where
mkCorsOrigin
::
CORSOrigin
->
Origin
mkCorsOrigin
=
TE
.
encodeUtf8
.
_CORSOrigin
---------------------------------------------------------------------
-- | API Global
...
...
src/Gargantext/API/Admin/Settings.hs
View file @
529ab6bc
...
...
@@ -28,6 +28,7 @@ import Data.Pool (Pool)
import
qualified
Data.Pool
as
Pool
import
Database.PostgreSQL.Simple
(
Connection
,
connect
,
close
,
ConnectInfo
)
import
Gargantext.API.Admin.EnvTypes
import
Gargantext.API.Admin.Settings.CORS
import
Gargantext.API.Admin.Types
import
Gargantext.API.Errors.Types
import
Gargantext.API.Prelude
...
...
@@ -57,9 +58,9 @@ devSettings jwkFile = do
jwkExists
<-
doesFileExist
jwkFile
when
(
not
jwkExists
)
$
writeKey
jwkFile
jwk
<-
readKey
jwkFile
gargCorsSettings
<-
loadGargCorsSettings
pure
$
Settings
{
_allowedOrigin
=
"http://localhost:8008"
,
_allowedHost
=
"localhost:3000"
{
_corsSettings
=
gargCorsSettings
,
_appPort
=
3000
,
_logLevelLimit
=
LevelDebug
-- , _dbServer = "localhost"
...
...
src/Gargantext/API/Admin/Settings/CORS.hs
0 → 100644
View file @
529ab6bc
{--| Support in Gargantext for CORS (Cross-origin resource sharing) --}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
module
Gargantext.API.Admin.Settings.CORS
where
import
Prelude
import
Data.Text
qualified
as
T
import
Toml
import
Gargantext.System.Logging
import
Paths_gargantext
import
Data.String
import
Control.Arrow
import
Control.Lens.TH
newtype
CORSOrigin
=
CORSOrigin
{
_CORSOrigin
::
T
.
Text
}
deriving
(
Show
,
Eq
,
IsString
)
data
CORSSettings
=
CORSSettings
{
_corsAllowedOrigins
::
[
CORSOrigin
]
,
_corsAllowedHosts
::
[
CORSOrigin
]
-- | If 'True', we will reuse the origin whitelist
-- as the allowed hosts as well. This allows, for example,
-- to connect from \"demo.gargantext.org\" to \"dev.sub.gargantext.org\"
-- and vice-versa.
,
_corsUseOriginsForHosts
::
!
Bool
}
deriving
(
Show
,
Eq
)
corsOriginCodec
::
TomlBiMap
CORSOrigin
AnyValue
corsOriginCodec
=
_Orig
>>>
_Text
where
_Orig
::
BiMap
e
CORSOrigin
T
.
Text
_Orig
=
iso
_CORSOrigin
CORSOrigin
corsSettingsCodec
::
TomlCodec
CORSSettings
corsSettingsCodec
=
CORSSettings
<$>
(
Toml
.
arrayOf
corsOriginCodec
"allowed-origins"
.=
_corsAllowedOrigins
)
<*>
pure
mempty
-- FIXME(adn) Currently we don't need to support this field.
<*>
Toml
.
bool
"use-origins-for-hosts"
.=
_corsUseOriginsForHosts
-- | Loads the 'CORSSettings' from the 'toml' file.
loadGargCorsSettings
::
IO
CORSSettings
loadGargCorsSettings
=
do
corsFile
<-
getDataFileName
"gargantext-cors-settings.toml"
tomlRes
<-
Toml
.
decodeFileEither
corsSettingsCodec
corsFile
case
tomlRes
of
Left
errs
->
do
withLogger
()
$
\
ioLogger
->
do
logMsg
ioLogger
WARNING
$
T
.
unpack
$
"Error, gargantext-cors-settings.toml parsing failed: "
<>
Toml
.
prettyTomlDecodeErrors
errs
pure
$
CORSSettings
[
"http://localhost:8008"
]
[
"http://localhost:3000"
]
False
Right
settings0
->
case
_corsUseOriginsForHosts
settings0
of
True
->
pure
$
settings0
{
_corsAllowedHosts
=
"http://localhost:3000"
:
(
_corsAllowedOrigins
settings0
)
}
False
->
pure
$
settings0
{
_corsAllowedHosts
=
"http://localhost:3000"
:
(
_corsAllowedHosts
settings0
)
}
makeLenses
''
C
ORSSettings
src/Gargantext/API/Admin/Types.hs
View file @
529ab6bc
-- |
{-# LANGUAGE TemplateHaskell #-}
module
Gargantext.API.Admin.Types
where
...
...
@@ -7,6 +5,7 @@ module Gargantext.API.Admin.Types where
import
Control.Lens
import
Control.Monad.Logger
(
LogLevel
)
import
GHC.Enum
import
Gargantext.API.Admin.Settings.CORS
import
Gargantext.Prelude
import
Servant.Auth.Server
(
JWTSettings
,
CookieSettings
(
..
))
import
Servant.Client
(
BaseUrl
)
...
...
@@ -20,8 +19,7 @@ data SendEmailType = SendEmailViaAws
deriving
(
Show
,
Read
,
Enum
,
Bounded
,
Generic
)
data
Settings
=
Settings
{
_allowedOrigin
::
!
ByteString
-- allowed origin for CORS
,
_allowedHost
::
!
ByteString
-- allowed host for CORS
{
_corsSettings
::
!
CORSSettings
-- CORS settings
,
_appPort
::
!
PortNumber
,
_logLevelLimit
::
!
LogLevel
-- log level from the monad-logger package
-- , _dbServer :: Text
...
...
src/Gargantext/API/Middleware.hs
View file @
529ab6bc
...
...
@@ -12,7 +12,9 @@ import Data.Aeson qualified as A
import
Data.Aeson.Lens
qualified
as
L
import
Data.ByteString
(
ByteString
)
import
Data.ByteString
qualified
as
BS
import
Data.ByteString.Builder
qualified
as
BS
import
Data.ByteString.Char8
qualified
as
C8
import
Data.ByteString.Lazy
qualified
as
B
import
Data.CaseInsensitive
qualified
as
CI
import
Data.List
qualified
as
L
import
Data.String
...
...
@@ -43,7 +45,7 @@ atKey i = L._Object . at (fromString $ T.unpack i)
{-# INLINE atKey #-}
customOutput
::
OutputFormatterWithDetailsAndHeaders
customOutput
_zonedDate
rq
status
_mb_response_size
request_dur
(
sanitiseBody
.
mconcat
->
reqbody
)
_
raw_response
(
map
sanitiseHeader
->
headers
)
=
customOutput
_zonedDate
rq
status
_mb_response_size
request_dur
(
sanitiseBody
.
mconcat
->
reqbody
)
raw_response
(
map
sanitiseHeader
->
headers
)
=
let
params
=
map
sanitiseQueryItem
(
queryString
rq
)
in
mkRequestLog
params
reqbody
<>
mkResponseLog
...
...
@@ -66,6 +68,8 @@ customOutput _zonedDate rq status _mb_response_size request_dur (sanitiseBody .
foldMap
toLogStr
(
ansiColor'
White
" Status: "
)
<>
foldMap
toLogStr
(
ansiStatusCode'
status
(
C8
.
pack
(
show
$
statusCode
status
)
<>
" "
<>
statusMessage
status
))
<>
" "
<>
(
toLogStr
.
B
.
toStrict
$
(
BS
.
toLazyByteString
raw_response
))
<>
" "
<>
"Served in "
<>
toLogStr
(
C8
.
pack
$
show
$
request_dur
)
<>
"
\n
"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment