mirror of
https://github.com/commercialhaskell/stackage.git
synced 2026-02-28 14:04:35 +01:00
Allow for one-time upload allowances
This commit is contained in:
parent
dd589bc8f3
commit
1833e72d68
@ -1,3 +1,4 @@
|
|||||||
|
{-# LANGUAGE PatternGuards #-}
|
||||||
-- | Review the upload log and compare against a locally kept list of allowed
|
-- | Review the upload log and compare against a locally kept list of allowed
|
||||||
-- uploaders.
|
-- uploaders.
|
||||||
module Stackage.Uploads
|
module Stackage.Uploads
|
||||||
@ -6,6 +7,7 @@ module Stackage.Uploads
|
|||||||
, filterForbidden
|
, filterForbidden
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
import Control.Arrow (second)
|
||||||
import Control.Exception (assert, evaluate)
|
import Control.Exception (assert, evaluate)
|
||||||
import Control.Monad (forM_, unless)
|
import Control.Monad (forM_, unless)
|
||||||
import Data.Map (Map)
|
import Data.Map (Map)
|
||||||
@ -68,9 +70,16 @@ type PackageName = String
|
|||||||
|
|
||||||
type PackageHistory = Map Version (UserName, UTCTime)
|
type PackageHistory = Map Version (UserName, UTCTime)
|
||||||
type UploadLog = MonoidMap PackageName PackageHistory
|
type UploadLog = MonoidMap PackageName PackageHistory
|
||||||
type Allowed = MonoidMap PackageName (Set UserName)
|
type Allowed = MonoidMap PackageName (Map UserName AllowedVersions)
|
||||||
type Forbidden = UploadLog
|
type Forbidden = UploadLog
|
||||||
|
|
||||||
|
data AllowedVersions = AllVersions | SpecificVersions (Set Version)
|
||||||
|
instance Monoid AllowedVersions where
|
||||||
|
mempty = SpecificVersions mempty
|
||||||
|
AllVersions `mappend` _ = AllVersions
|
||||||
|
_ `mappend` AllVersions = AllVersions
|
||||||
|
SpecificVersions x `mappend` SpecificVersions y = SpecificVersions (x `mappend` y)
|
||||||
|
|
||||||
getUploadLog :: IO UploadLog
|
getUploadLog :: IO UploadLog
|
||||||
getUploadLog = do
|
getUploadLog = do
|
||||||
rsp <- simpleHTTP $ getRequest logURL
|
rsp <- simpleHTTP $ getRequest logURL
|
||||||
@ -101,7 +110,13 @@ readAllowed fp = do
|
|||||||
go :: String -> Allowed
|
go :: String -> Allowed
|
||||||
go s = fromMaybe mempty $ do
|
go s = fromMaybe mempty $ do
|
||||||
pkg:users <- Just $ words s
|
pkg:users <- Just $ words s
|
||||||
Just $ msingleton pkg $ Set.fromList users
|
Just $ msingleton pkg $ Map.unionsWith mappend $ map parseUserAllowed users
|
||||||
|
|
||||||
|
parseUserAllowed s =
|
||||||
|
case break (== '-') s of
|
||||||
|
(user, '-':version) ->
|
||||||
|
Map.singleton user $ SpecificVersions $ Set.singleton version
|
||||||
|
_ -> Map.singleton s AllVersions
|
||||||
|
|
||||||
updateAllowed :: UploadLog -> Allowed -> (Allowed, Forbidden)
|
updateAllowed :: UploadLog -> Allowed -> (Allowed, Forbidden)
|
||||||
updateAllowed uploads allowed =
|
updateAllowed uploads allowed =
|
||||||
@ -125,19 +140,30 @@ updateAllowed uploads allowed =
|
|||||||
| otherwise = msingleton pkg fval
|
| otherwise = msingleton pkg fval
|
||||||
in (mempty, forbidden)
|
in (mempty, forbidden)
|
||||||
|
|
||||||
getAllUsers :: PackageHistory -> Set UserName
|
getAllUsers :: PackageHistory -> Map UserName AllowedVersions
|
||||||
getAllUsers = Set.fromList . map fst . Map.elems
|
getAllUsers = Map.fromList . map (second $ const AllVersions) . Map.elems
|
||||||
|
|
||||||
check :: Set UserName -> (Version, (UserName, UTCTime)) -> Map Version (UserName, UTCTime)
|
check :: Map UserName AllowedVersions
|
||||||
check allowed' (ver, (user, time))
|
-> (Version, (UserName, UTCTime))
|
||||||
| user `Set.member` allowed' = Map.empty
|
-> Map Version (UserName, UTCTime)
|
||||||
| otherwise = Map.singleton ver (user, time)
|
check allowed' (ver, (user, time)) = maybe (Map.singleton ver (user, time)) (const Map.empty) $ do
|
||||||
|
versions <- Map.lookup user allowed'
|
||||||
|
case versions of
|
||||||
|
AllVersions -> return ()
|
||||||
|
SpecificVersions vs
|
||||||
|
| ver `Set.member` vs -> return ()
|
||||||
|
| otherwise -> Nothing
|
||||||
|
|
||||||
writeAllowed :: FilePath -> Allowed -> IO ()
|
writeAllowed :: FilePath -> Allowed -> IO ()
|
||||||
writeAllowed fp =
|
writeAllowed fp =
|
||||||
writeFile fp . unlines . map go . Map.toList . unMonoidMap
|
writeFile fp . unlines . map go . Map.toList . unMonoidMap
|
||||||
where
|
where
|
||||||
go (pkg, users) = unwords $ pkg : Set.toList users
|
go (pkg, users) = unwords $ pkg : concatMap toStr (Map.toList users)
|
||||||
|
toStr (user, AllVersions) = [user]
|
||||||
|
toStr (user, SpecificVersions vs) =
|
||||||
|
map helper $ Set.toList vs
|
||||||
|
where
|
||||||
|
helper v = concat [user, "-", v]
|
||||||
|
|
||||||
printForbidden :: Forbidden -> IO ()
|
printForbidden :: Forbidden -> IO ()
|
||||||
printForbidden (MonoidMap forbidden) = unless (Map.null forbidden) $ do
|
printForbidden (MonoidMap forbidden) = unless (Map.null forbidden) $ do
|
||||||
|
|||||||
@ -2632,7 +2632,7 @@ hpc-strobe ThorkilNaur
|
|||||||
hpc-tracer AndyGill
|
hpc-tracer AndyGill
|
||||||
hplaylist TimChevalier
|
hplaylist TimChevalier
|
||||||
hpodder JohnGoerzen
|
hpodder JohnGoerzen
|
||||||
hprotoc ChrisKuklewicz
|
hprotoc ChrisKuklewicz DavidFeng-2.0.15
|
||||||
hps RohanDrape
|
hps RohanDrape
|
||||||
hps-cairo RohanDrape
|
hps-cairo RohanDrape
|
||||||
hps-kmeans RodrigoGadea
|
hps-kmeans RodrigoGadea
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user