Allow for one-time upload allowances

This commit is contained in:
Michael Snoyman 2013-09-01 15:16:17 +03:00
parent dd589bc8f3
commit 1833e72d68
2 changed files with 36 additions and 10 deletions

View File

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

View File

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