feat(audit): take IP from header

This commit is contained in:
Gregor Kleen 2019-08-06 08:31:22 +02:00
parent e45a9ace66
commit fb027dee58

View File

@ -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 ()