ignore "Move brackets to avoid $"
ignore "Reduce duplication"
ignore "Redundant $"
+ignore "Redundant do"
ignore "Use camelCase"
ignore "Use import/export shortcut"
ignore "Use tuple-section"
{-# OPTIONS_GHC -Wno-missing-signatures #-}
module Hjugement.CLI where
-import Control.Applicative (Applicative(..), Alternative(..))
import Control.Monad (Monad(..))
import Data.Bool
-import Data.Either (Either(..))
-import Data.Function (($), (.))
-import Data.Functor ((<$>), (<$))
-import Data.Int (Int)
-import Data.List.NonEmpty (NonEmpty(..))
-import Data.Maybe (Maybe(..), fromMaybe)
-import Data.Ord (Ord(..))
+import Data.Function (($))
import Data.Semigroup (Semigroup(..))
-import Data.String (String)
import Data.Text (Text)
import Data.Void (Void)
import Symantic.CLI as CLI
-import System.Environment (getArgs)
-import System.IO (IO, FilePath, print, stderr, putStrLn)
-import Text.Show (Show(..))
-import Type.Reflection (Typeable)
-import qualified Data.Set as Set
import qualified Data.Text as Text
-import qualified Data.Text.Lazy.IO as TL
import qualified Data.Version as Version
import qualified Paths_hjugement_cli as Hjugement
import qualified Symantic.Document as Doc
-import qualified System.IO as IO
import Hjugement.CLI.Utils
import Hjugement.CLI.Administrator
{-# OPTIONS_GHC -Wno-missing-signatures #-}
module Hjugement.CLI.Administrator where
-import Control.Applicative (Applicative(..), Alternative(..))
-import Control.Monad (Monad(..), forM, forM_, join, unless, void)
-import Control.Monad.Trans.Class (MonadTrans(..))
+import Control.Applicative (Applicative(..))
+import Control.Monad (Monad(..), forM_, unless)
import Control.Monad.Trans.Except (runExcept)
import Control.Monad.Trans.Maybe (MaybeT(..))
-import Control.Monad.Trans.State.Strict (runState, runStateT)
-import Data.Bits (setBit)
+import Control.Monad.Trans.State.Strict (runState)
import Data.Bool
-import Data.ByteString (ByteString)
import Data.Either (Either(..))
import Data.Eq (Eq(..))
-import Data.Foldable (Foldable, foldMap, length, null)
-import Data.Function (($), (.), id, flip)
-import Data.Functor ((<$>), (<$))
-import Data.Int (Int)
-import Data.Maybe (Maybe(..), maybe, fromMaybe, fromJust)
-import Data.Monoid (Monoid(..))
+import Data.Function (($), id, flip)
+import Data.Functor ((<$>))
+import Data.Maybe (Maybe(..), fromMaybe)
import Data.Ord (Ord(..))
import Data.Proxy (Proxy(..))
import Data.Semigroup (Semigroup(..))
-import Data.String (String)
import Data.Text (Text)
-import GHC.Natural (minusNatural, minusNaturalMaybe)
-import GHC.Prim (coerce)
-import Numeric.Natural (Natural)
-import Pipes ((>->))
-import Prelude (logBase, ceiling, Num(..), (/), (^), fromIntegral, Double)
import Symantic.CLI as CLI
-import System.IO (IO, FilePath)
import Text.Show (Show(..))
-import qualified Crypto.Hash as Crypto
import qualified Data.Aeson as JSON
-import qualified Data.ByteArray as ByteArray
-import qualified Data.ByteString as BS
-import qualified Data.ByteString.Char8 as BS8
import qualified Data.ByteString.Lazy as BSL
import qualified Data.List as List
import qualified Data.Text as Text
-import qualified Data.Text.Encoding as Text
-import qualified Data.Text.Lazy as TL
-import qualified Data.Text.Lazy.Builder as TLB
-import qualified Data.Text.Lazy.Builder.Int as TLB
-import qualified Data.Text.Lazy.Encoding as TL
-import qualified Data.Text.Lazy.IO as TL
-import qualified Data.Time as Time
-import qualified Lens.Family as Lens
-import qualified Lens.Family.State.Strict as Lens
import qualified Pipes as Pip
-import qualified Pipes.ByteString as PipBS
-import qualified Pipes.Group as Pip
import qualified Pipes.Prelude as Pip
-import qualified Pipes.Aeson as PipJSON (DecodingError(..))
-import qualified Pipes.Aeson.Unchecked as PipJSON
-import qualified Pipes.Safe as Pip
-import qualified Pipes.Safe.Prelude as Pip
-import qualified Pipes.Text as PipText
-import qualified Pipes.Text.Encoding as PipText
-import qualified Pipes.Text.IO as PipText
import qualified Symantic.Document as Doc
import qualified System.FilePath as FP
-import qualified System.IO as IO
-import qualified System.Posix as Posix
import qualified System.Random as Rand
import qualified Voting.Protocol as VP
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wno-missing-signatures #-}
module Hjugement.CLI.Registrar where
import Control.Arrow (left)
import Control.Applicative (Applicative(..))
-import Control.Monad (Monad(..), forM, forM_, join, void)
-import Control.Monad.Trans.Class (MonadTrans(..))
+import Control.Monad (Monad(..))
import Control.Monad.Trans.Maybe (MaybeT(..))
-import Control.Monad.Trans.State.Strict (runState, runStateT)
+import Control.Monad.Trans.State.Strict (runState)
import Data.Bool
-import Data.ByteString (ByteString)
import Data.Either (Either(..))
-import Data.Foldable (Foldable, foldMap, length)
-import Data.Function (($), (.), flip)
+import Data.Function (($), (.))
import Data.Functor ((<$>))
-import Data.Int (Int)
-import Data.Maybe (Maybe(..), maybe, fromMaybe)
-import Data.Ord (Ord(..))
+import Data.Maybe (Maybe(..))
import Data.Proxy (Proxy(..))
import Data.Semigroup (Semigroup(..))
-import Data.String (String)
-import Data.Text (Text)
-import GHC.Natural (minusNatural, minusNaturalMaybe)
+import GHC.Natural (minusNatural)
import Numeric.Natural (Natural)
import Pipes ((>->))
import Prelude (logBase, ceiling, Num(..), (/), (^), fromIntegral, Double)
import Symantic.CLI as CLI
import Text.Show (Show(..))
-import qualified Data.ByteString as BS
-import qualified Data.ByteString.Char8 as BS8
-import qualified Data.ByteString.Lazy as BSL
import qualified Data.List as List
import qualified Data.Text as T
-import qualified Data.Text.Encoding as T
-import qualified Data.Text.Lazy as TL
-import qualified Data.Text.Lazy.Encoding as TL
-import qualified Data.Text.Lazy.IO as TL
import qualified Data.Time as Time
import qualified Lens.Family as Lens
-import qualified Lens.Family.State.Strict as Lens
import qualified Pipes as Pip
import qualified Pipes.ByteString as PipBS
import qualified Pipes.Group as Pip
import qualified Pipes.Prelude as Pip
-import qualified Pipes.Safe as Pip
import qualified Pipes.Safe.Prelude as Pip
import qualified Pipes.Text as PipText
import qualified Pipes.Text.Encoding as PipText
-import qualified Pipes.Text.IO as PipText
import qualified Symantic.Document as Doc
import qualified System.FilePath as FP
import qualified System.IO as IO
-import qualified System.Posix as Posix
import qualified System.Random as Rand
import qualified Voting.Protocol as VP
<.> response @Natural
run_registrar_pubkey
Global_Params{..}
- o@Registrar_Params{..}
+ Registrar_Params{..}
cred =
return $
VP.reify registrar_election_crypto $ \(_::Proxy c) ->
<.> response @(Maybe ())
run_registrar_credentials
glob@Global_Params{..}
- o@Registrar_Params{..} =
+ Registrar_Params{..} =
run_count :!:
run_file
where
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wno-missing-signatures #-}
module Hjugement.CLI.Trustee where
import Control.Applicative (Applicative(..))
-import Control.Monad (Monad(..), forM, forM_, join, void)
-import Control.Monad.Trans.Class (MonadTrans(..))
+import Control.Monad (Monad(..))
import Control.Monad.Trans.Maybe (MaybeT(..))
-import Control.Monad.Trans.State.Strict (runState, runStateT)
-import Data.Bits (setBit)
+import Control.Monad.Trans.State.Strict (runState)
import Data.Bool
-import Data.ByteString (ByteString)
-import Data.Either (Either(..))
import Data.Eq (Eq(..))
-import Data.Foldable (Foldable, foldMap, length, null)
+import Data.Foldable (null)
import Data.Function (($), (.), id, flip)
import Data.Functor ((<$>))
-import Data.Int (Int)
-import Data.Maybe (Maybe(..), maybe, fromMaybe)
-import Data.Monoid (Monoid(..))
+import Data.Maybe (Maybe(..))
import Data.Ord (Ord(..))
import Data.Proxy (Proxy(..))
import Data.Semigroup (Semigroup(..))
-import Data.String (String)
-import Data.Text (Text)
-import GHC.Natural (minusNatural, minusNaturalMaybe)
import GHC.Prim (coerce)
-import Numeric.Natural (Natural)
import Pipes ((>->))
-import Prelude (logBase, ceiling, Num(..), (/), (^), fromIntegral, Double)
import Symantic.CLI as CLI
import Text.Show (Show(..))
-import System.IO (IO, FilePath)
-import qualified Crypto.Hash as Crypto
-import qualified Data.Aeson as JSON
-import qualified Data.ByteArray as ByteArray
-import qualified Data.ByteString as BS
-import qualified Data.ByteString.Char8 as BS8
-import qualified Data.ByteString.Lazy as BSL
+import System.IO (FilePath)
import qualified Data.List as List
import qualified Data.Text as T
-import qualified Data.Text.Encoding as T
-import qualified Data.Text.Lazy as TL
-import qualified Data.Text.Lazy.Builder as TLB
-import qualified Data.Text.Lazy.Builder.Int as TLB
-import qualified Data.Text.Lazy.Encoding as TL
-import qualified Data.Text.Lazy.IO as TL
-import qualified Data.Time as Time
-import qualified Lens.Family as Lens
-import qualified Lens.Family.State.Strict as Lens
import qualified Pipes as Pip
-import qualified Pipes.ByteString as PipBS
-import qualified Pipes.Group as Pip
import qualified Pipes.Prelude as Pip
-import qualified Pipes.Aeson as PipJSON (DecodingError(..))
-import qualified Pipes.Aeson.Unchecked as PipJSON
-import qualified Pipes.Safe as Pip
-import qualified Pipes.Safe.Prelude as Pip
-import qualified Pipes.Text as PipText
-import qualified Pipes.Text.Encoding as PipText
-import qualified Pipes.Text.IO as PipText
import qualified Symantic.Document as Doc
import qualified System.FilePath as FP
-import qualified System.IO as IO
-import qualified System.Posix as Posix
import qualified System.Random as Rand
import qualified Voting.Protocol as VP
response @()
run_trustee_generate
glob@Global_Params{..}
- o@Trustee_Params{..} =
+ Trustee_Params{..} =
VP.reify trustee_crypto $ \(_crypto::Proxy c) -> do
- keys@(secKey, pubKey) <- Pip.liftIO $ Rand.getStdRandom $ runState $ do
+ (secKey, pubKey) <- Pip.liftIO $ Rand.getStdRandom $ runState $ do
secKey <- VP.randomSecretKey @c
pubKey <- VP.proveIndispensableTrusteePublicKey secKey
return (secKey, pubKey)
run_trustee_decrypt
glob@Global_Params{..}
- o@Trustee_Params{..}
+ Trustee_Params{..}
TrusteeDecrypt_Params{..} =
VP.reify trustee_crypto $ \(_crypto::Proxy c) -> runMaybeT $ do
(secKey::VP.E c) <- loadJSON glob trusteeDecrypt_privkey
outputInfo glob "tally the encrypted ballots"
-- FIXME: actually support fetching through an URL
let ballotsPath = trusteeDecrypt_url FP.</> "ballots.jsons"
- (encTally, numBallots) <- runPipeWithError glob $
+ (encTally, _numBallots) <- runPipeWithError glob $
Pip.fold'
(flip VP.insertEncryptedTally)
VP.emptyEncryptedTally id $
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE UndecidableInstances #-} -- for VP.Reifies instances
{-# OPTIONS_GHC -Wno-missing-signatures #-}
+{-# OPTIONS_GHC -Wno-orphans #-}
module Hjugement.CLI.Utils where
import Control.Applicative (Applicative(..), Alternative(..))
import Control.Arrow (left)
import Control.Monad (Monad(..), forM_, when)
import Control.Monad.Trans.Maybe (MaybeT(..))
-import Control.Monad.Trans.Except (ExceptT, runExceptT)
-import Control.Monad.Trans.State.Strict (StateT(..), evalStateT)
-import Data.Bits (setBit)
+import Control.Monad.Trans.Except (runExceptT)
import Data.Bool
-import Data.ByteString (ByteString)
import Data.Either (Either(..))
import Data.Eq (Eq(..))
import Data.Foldable (Foldable)
import Data.Monoid (Monoid(..))
import Data.Ord (Ord(..))
import Data.Semigroup (Semigroup(..))
-import Data.String (IsString(..))
import Data.Text (Text)
import Prelude (min, max, (-))
import Symantic.CLI as CLI
import System.IO (IO)
import Text.Show (Show(..))
-import qualified Crypto.Hash as Crypto
import qualified Data.Aeson as JSON
-import qualified Data.ByteArray as ByteArray
-import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as BS8
import qualified Data.ByteString.Lazy.Char8 as BSL8
import qualified Data.Text as Text
import qualified Data.Text.Encoding as T
-import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.Builder as TLB
-import qualified Data.Text.Lazy.Builder.Int as TLB
import qualified Lens.Family as Lens
-import qualified Lens.Family.State.Strict as Lens
import qualified Pipes as Pip
import qualified Pipes.Aeson as PipJSON (DecodingError(..))
import qualified Pipes.Aeson.Unchecked as PipJSON
import qualified Pipes.ByteString as PipBS
-import qualified Pipes.Group as Pip
-import qualified Pipes.Parse as Pip
-import qualified Pipes.Prelude as Pip
import qualified Pipes.Safe as Pip
import qualified Pipes.Safe.Prelude as Pip
import qualified Symantic.Document as Doc
where
open = Pip.liftIO $ do
IO.createDirectoryIfMissing True $ FP.takeDirectory filePath
- h <- IO.openFile filePath IO.WriteMode
- return h
+ IO.openFile filePath IO.WriteMode
close h = Pip.liftIO $ do
fd <- Posix.handleToFd h
Posix.setFdMode fd fileMode
where
open = Pip.liftIO $ do
IO.createDirectoryIfMissing True $ FP.takeDirectory filePath
- h <- IO.openFile filePath IO.WriteMode
- return h
+ IO.openFile filePath IO.WriteMode
close h = Pip.liftIO $ do
fd <- Posix.handleToFd h
Posix.setFdMode fd fileMode
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wno-missing-signatures #-}
module Hjugement.CLI.Voter where
import Control.Applicative (Applicative(..), Alternative(..))
-import Control.Monad (Monad(..), forM, forM_, join, unless, void, when)
-import Control.Monad.Trans.Class (MonadTrans(..))
+import Control.Monad (Monad(..), join, unless, void, when)
import Control.Monad.Trans.Maybe (MaybeT(..))
-import Control.Monad.Trans.Except (runExcept, runExceptT)
-import Control.Monad.Trans.State.Strict (runState, runStateT)
-import Data.Bits (setBit)
+import Control.Monad.Trans.Except (runExcept)
+import Control.Monad.Trans.State.Strict (runStateT)
import Data.Bool
-import Data.ByteString (ByteString)
-import Data.Either (Either(..), either)
+import Data.Either (Either(..))
import Data.Eq (Eq(..))
-import Data.Foldable (Foldable, foldMap, length, null, sum)
-import Data.Function (($), (.), id, flip)
-import Data.Functor ((<$>), (<$))
-import Data.Int (Int)
-import Data.Maybe (Maybe(..), maybe, fromMaybe, fromJust)
-import Data.Monoid (Monoid(..))
+import Data.Foldable (sum)
+import Data.Function (($))
+import Data.Functor ((<$>))
+import Data.Maybe (Maybe(..))
import Data.Ord (Ord(..))
-import Data.Proxy (Proxy(..))
import Data.Semigroup (Semigroup(..))
import Data.String (String)
import Data.Text (Text)
-import Data.Traversable (sequence)
-import GHC.Natural (minusNatural, minusNaturalMaybe)
-import GHC.Prim (coerce)
import Numeric.Natural (Natural)
-import Pipes ((>->))
-import Prelude (logBase, ceiling, Num(..), (/), (^), fromIntegral, Double)
+import Prelude (Num(..))
import Symantic.CLI as CLI
-import System.IO (IO, FilePath)
+import System.IO (FilePath)
import Text.Show (Show(..))
-import qualified Crypto.Hash as Crypto
import qualified Data.Aeson as JSON
-import qualified Data.ByteArray as ByteArray
-import qualified Data.ByteString as BS
-import qualified Data.ByteString.Char8 as BS8
-import qualified Data.ByteString.Lazy as BSL
import qualified Data.ByteString.Lazy.Char8 as BSL8
import qualified Data.List as List
import qualified Data.Text as Text
-import qualified Data.Text.Encoding as Text
-import qualified Data.Text.Lazy as TL
-import qualified Data.Text.Lazy.Builder as TLB
-import qualified Data.Text.Lazy.Builder.Int as TLB
-import qualified Data.Text.Lazy.Encoding as TL
-import qualified Data.Text.Lazy.IO as TL
-import qualified Data.Time as Time
-import qualified Lens.Family as Lens
-import qualified Lens.Family.State.Strict as Lens
import qualified Pipes as Pip
-import qualified Pipes.Aeson as PipJSON (DecodingError(..))
-import qualified Pipes.Aeson.Unchecked as PipJSON
-import qualified Pipes.ByteString as PipBS
-import qualified Pipes.Group as Pip
import qualified Pipes.Prelude as Pip
-import qualified Pipes.Safe as Pip
-import qualified Pipes.Safe.Prelude as Pip
-import qualified Pipes.Text as PipText
-import qualified Pipes.Text.Encoding as PipText
-import qualified Pipes.Text.IO as PipText
import qualified Symantic.Document as Doc
import qualified System.Directory as IO
import qualified System.FilePath as FP
import qualified System.IO as IO
-import qualified System.Posix as Posix
import qualified System.Random as Rand
import qualified Voting.Protocol as VP
import qualified Voting.Protocol.Utils as VP
run_voter_vote
glob@Global_Params{..}
- o@VoterVote_Params{..} = runMaybeT $ do
+ VoterVote_Params{..} = runMaybeT $ do
rawElec <- loadElection glob $ voterVote_url FP.</> "election.json"
VP.reifyElection rawElec $ \(elec@VP.Election{..} :: VP.Election c) -> do
outputInfo glob $ "Voted"<>Doc.from (show voterVote_grades)
run_voter_verify
glob@Global_Params{..}
- o@VoterVerify_Params{..} = runMaybeT $ do
+ VoterVerify_Params{..} = runMaybeT $ do
rawElec <- loadElection glob $ voterVerify_url FP.</> "election.json"
VP.reifyElection rawElec $ \(elec@VP.Election{..} :: VP.Election c) -> do
outputInfo glob $ "verifying ballots"
- (fails :: Natural, (encTally :: VP.EncryptedTally c, numBallots)) <- runPipeWithError glob $
+ (fails :: Natural, (encTally :: VP.EncryptedTally c, _numBallots)) <- runPipeWithError glob $
Pip.foldM'
(\(fails, acc@(_, numBallots)) ballot@VP.Ballot{..} -> do
let ballotNum = numBallots + fails