feat(audit): take IP from header
This commit is contained in:
parent
e45a9ace66
commit
fb027dee58
35
src/Audit.hs
35
src/Audit.hs
@ -8,10 +8,13 @@ module Audit
|
|||||||
|
|
||||||
|
|
||||||
import Import.NoModel
|
import Import.NoModel
|
||||||
|
import Settings
|
||||||
import Model
|
import Model
|
||||||
import Database.Persist.Sql
|
import Database.Persist.Sql
|
||||||
import Audit.Types
|
import Audit.Types
|
||||||
|
|
||||||
|
import qualified Data.Text.Encoding as Text
|
||||||
|
|
||||||
import Utils.Lens
|
import Utils.Lens
|
||||||
import qualified Network.Wai as Wai
|
import qualified Network.Wai as Wai
|
||||||
import qualified Network.Socket as Wai
|
import qualified Network.Socket as Wai
|
||||||
@ -27,13 +30,33 @@ data AuditRemoteException
|
|||||||
instance Exception AuditRemoteException
|
instance Exception AuditRemoteException
|
||||||
|
|
||||||
|
|
||||||
getRemote :: (MonadHandler m, MonadThrow m) => m IP
|
getRemote :: (MonadHandler m, MonadThrow m, HasAppSettings (HandlerSite m)) => m IP
|
||||||
getRemote = do
|
getRemote = do
|
||||||
|
ipFromHeader <- getsYesod $ view _appIpFromHeader
|
||||||
wai <- waiRequest
|
wai <- waiRequest
|
||||||
case Wai.remoteHost wai of
|
|
||||||
Wai.SockAddrInet _ hAddr -> let (b1, b2, b3, b4) = Wai.hostAddressToTuple hAddr in return $ IP.ipv4 b1 b2 b3 b4
|
if
|
||||||
Wai.SockAddrInet6 _ _ hAddr _ -> let (w1, w2, w3, w4, w5, w6, w7, w8) = Wai.hostAddress6ToTuple hAddr in return $ IP.ipv6 w1 w2 w3 w4 w5 w6 w7 w8
|
| ipFromHeader
|
||||||
_other -> throwM ARUnsupportedSocketKind
|
, Just ip <- byHeader wai
|
||||||
|
-> return ip
|
||||||
|
| otherwise
|
||||||
|
-> byRemoteHost wai
|
||||||
|
|
||||||
|
where
|
||||||
|
byHeader wai = listToMaybe $ do
|
||||||
|
(h, v) <- Wai.requestHeaders wai
|
||||||
|
guard $ h `elem` ["x-real-ip", "x-forwarded-for"]
|
||||||
|
v' <- either (const mzero) return $ Text.decodeUtf8' v
|
||||||
|
maybeToList $ IP.decode v'
|
||||||
|
|
||||||
|
byRemoteHost wai = case Wai.remoteHost wai of
|
||||||
|
Wai.SockAddrInet _ hAddr
|
||||||
|
-> let (b1, b2, b3, b4) = Wai.hostAddressToTuple hAddr
|
||||||
|
in return $ IP.ipv4 b1 b2 b3 b4
|
||||||
|
Wai.SockAddrInet6 _ _ hAddr _
|
||||||
|
-> let (w1, w2, w3, w4, w5, w6, w7, w8) = Wai.hostAddress6ToTuple hAddr
|
||||||
|
in return $ IP.ipv6 w1 w2 w3 w4 w5 w6 w7 w8
|
||||||
|
_other -> throwM ARUnsupportedSocketKind
|
||||||
|
|
||||||
|
|
||||||
data AuditException
|
data AuditException
|
||||||
@ -51,6 +74,7 @@ audit :: ( AuthId (HandlerSite m) ~ Key User
|
|||||||
, YesodAuthPersist (HandlerSite m)
|
, YesodAuthPersist (HandlerSite m)
|
||||||
, MonadHandler m
|
, MonadHandler m
|
||||||
, MonadCatch m
|
, MonadCatch m
|
||||||
|
, HasAppSettings (HandlerSite m)
|
||||||
)
|
)
|
||||||
=> Transaction -- ^ Transaction to record
|
=> Transaction -- ^ Transaction to record
|
||||||
-> [UserId] -- ^ Affected users
|
-> [UserId] -- ^ Affected users
|
||||||
@ -81,6 +105,7 @@ audit' :: ( AuthId (HandlerSite m) ~ Key User
|
|||||||
, YesodAuthPersist (HandlerSite m)
|
, YesodAuthPersist (HandlerSite m)
|
||||||
, MonadHandler m
|
, MonadHandler m
|
||||||
, MonadCatch m
|
, MonadCatch m
|
||||||
|
, HasAppSettings (HandlerSite m)
|
||||||
)
|
)
|
||||||
=> Transaction -- ^ Transaction to record
|
=> Transaction -- ^ Transaction to record
|
||||||
-> ReaderT (YesodPersistBackend (HandlerSite m)) m ()
|
-> ReaderT (YesodPersistBackend (HandlerSite m)) m ()
|
||||||
|
|||||||
Reference in New Issue
Block a user