24 Commits

Author SHA1 Message Date
85920c26a0 minor refactor to app/Util.hs to make hlint happy 2023-05-04 14:47:20 -04:00
8be90e9822 add blank line before prompting for service name to search for 2023-05-04 14:24:55 -04:00
bb85081380 removed copyright years from individual source files
it remains intact in the README.md and package.yml files
2023-05-02 19:40:22 -04:00
f423d202ce fixed installation instructions 2023-05-02 17:45:48 -04:00
82f2c6c5fb version 0.3.1.1 2023-05-02 17:29:31 -04:00
d7da4b2924 use LTS 20.19 resolver 2023-05-02 17:27:58 -04:00
0267ce8792 removed GitHub references 2023-05-02 16:48:44 -04:00
d0d80223f7 added bug reports link 2021-11-14 03:47:53 -05:00
180af04891 updated description
The old one still pointed to GitHub.
2021-11-13 23:54:06 -05:00
a048e0ad8b moved priject to codeberg 2021-11-13 23:50:08 -05:00
d3a54f19b9 updated cabal file 2021-10-25 15:51:19 -04:00
b9d52070f1 version 0.3.1 2021-05-14 13:55:01 -04:00
6585d63385 allow user to specify temporary alternate master password 2021-05-14 13:46:52 -04:00
258ebf29fe max version for transformers package
...because I'm an idiot.
2021-05-09 14:41:20 -04:00
1d6fbb5f40 version 0.3.0.2
more dependency versions
2021-05-09 13:36:27 -04:00
08d2827613 version 0.3.0.1
- updated to latest lts
- specified dependency versions
2021-05-09 12:57:38 -04:00
4ac3d37913 version 0.3.0 2021-01-05 21:26:12 -05:00
4be38eb87a updated ChangeLog 2021-01-05 21:25:29 -05:00
807e09a5ae switched from lens package to microlens 2021-01-05 21:22:41 -05:00
c5cdde8f73 removed unnecessary import 2021-01-05 21:22:05 -05:00
d87ccc4346 updated copyright
modified in 2021
2021-01-05 21:08:41 -05:00
2d70a9e284 updated to more recent snapshot 2021-01-05 10:28:18 -05:00
97a5ff4c92 updated email address 2020-12-14 22:41:24 -05:00
df5f0a4334 updated copyright 2020-12-14 22:10:14 -05:00
27 changed files with 259 additions and 110 deletions

1
.gitignore vendored
View File

@@ -1,3 +1,2 @@
.stack-work/ .stack-work/
passman.cabal
*~ *~

View File

@@ -1,5 +1,34 @@
# Changelog for passman # Changelog for passman
## current
- minor UI tweak
- minor refactoring
## 0.3.1.1
- updated documentation to on longer mention GitHub
- updated resolver to LTS 20.19
## 0.3.1
- set maximum version of transformers package
- allow user to specifiy a temporary master password to retrieve a password
## 0.3.0.2
- more dependency versions
## 0.3.0.1
- updated to latest stackage LTS
- specified versions for dependencies
## 0.3.0
- updated to more recent LTS snapshot
- use microlens instead of lens
## 0.2.1 ## 0.2.1
- refactoring - refactoring

View File

@@ -1,7 +1,7 @@
# passman # passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) 2018-2023 Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as
@@ -38,19 +38,14 @@ This package uses [Haskell Stack](https://haskellstack.org). Please
refer to [their refer to [their
website](https://docs.haskellstack.org/en/stable/README/#how-to-install) website](https://docs.haskellstack.org/en/stable/README/#how-to-install)
for instructions on installing Haskell Stack. Once you have done for instructions on installing Haskell Stack. Once you have done
this, you can simply enter the command `stack install passman` in the this, you can simply enter the command `stack install` in the terminal
terminal to install passman. from this directory to install passman.
## GitHub ## Codeberg
The most recent version of passman can be found on GitHub at The most recent version of passman can be found on Codeberg at
<https://github.com/jlamothe/passman>. <https://codeberg.org/jlamothe/passman>.
## Pull Requests ## Pull Requests
Pull requests are welcome, but should be made to the `dev` branch. Pull requests are welcome, but should be made to the `dev` branch.
## Donations
Bitcoin donations are accepted (but not required) at:
18hqEsXCinyauDp6smPUEVuscjDdasTKvr

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as
@@ -22,7 +22,6 @@ License along with this program. If not, see
module Main where module Main where
import Control.Monad (mapM_)
import Control.Monad.Trans.State as S import Control.Monad.Trans.State as S
import System.Console.HCL (Request, reqIO, runRequest) import System.Console.HCL (Request, reqIO, runRequest)
import System.EasyFile import System.EasyFile

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as
@@ -24,8 +24,9 @@ License along with this program. If not, see
module Types (Status (Status), gen, dbPath, masterPass, database) where module Types (Status (Status), gen, dbPath, masterPass, database) where
import Control.Lens (makeLenses, set, (^.)) import Lens.Micro (set, (^.))
import System.Random (RandomGen (next, split), StdGen) import Lens.Micro.TH (makeLenses)
import System.Random (RandomGen (genWord64, split), StdGen)
import Password import Password
@@ -39,8 +40,8 @@ data Status = Status
makeLenses ''Status makeLenses ''Status
instance RandomGen Status where instance RandomGen Status where
next s = (x, s') where genWord64 s = (x, s') where
(x, g') = next g (x, g') = genWord64 g
s' = set gen g' s s' = set gen g' s
g = s^.gen g = s^.gen
split s = (s1, s2) where split s = (s1, s2) where

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as
@@ -24,10 +24,11 @@ License along with this program. If not, see
module UI (getMasterPass, mainMenu) where module UI (getMasterPass, mainMenu) where
import Control.Lens (over, set, view, (^.))
import Control.Monad (when) import Control.Monad (when)
import Control.Monad.Trans.Class (lift) import Control.Monad.Trans.Class (lift)
import qualified Control.Monad.Trans.State as S import qualified Control.Monad.Trans.State as S
import Lens.Micro (over, set, (^.), (.~))
import Lens.Micro.Extras (view)
import System.Console.HCL import System.Console.HCL
( Request ( Request
, prompt , prompt
@@ -141,7 +142,7 @@ buildData = do
searchServ :: S.StateT Status IO () searchServ :: S.StateT Status IO ()
searchServ = do searchServ = do
svc <- req $ prompt "service name: " reqResp svc <- req $ prompt "\nservice name: " reqResp
db <- S.gets $ view database db <- S.gets $ view database
case pwSearch svc db of case pwSearch svc db of
[] -> do [] -> do
@@ -160,11 +161,12 @@ selectServ xs = menu "Select Service" $
servMenu :: String -> S.StateT Status IO () servMenu :: String -> S.StateT Status IO ()
servMenu x = menu x servMenu x = menu x
[ ( "show password", showPass x >> servMenu x ) [ ( "show password", showPass x >> servMenu x )
, ( "edit password", editPassMenu x ) , ( "show alternate password", showAltPass x )
, ( "remove service", removeServ x ) , ( "edit password", editPassMenu x )
, ( "rename service", renameServ x ) , ( "remove service", removeServ x )
, ( "back", mainMenu ) , ( "rename service", renameServ x )
, ( "back", mainMenu )
] ]
editPassMenu :: String -> S.StateT Status IO () editPassMenu :: String -> S.StateT Status IO ()
@@ -224,15 +226,24 @@ doEditPolicy x = withService x mainMenu $ \d -> do
editPassMenu x editPassMenu x
showPass :: String -> S.StateT Status IO () showPass :: String -> S.StateT Status IO ()
showPass x = do showPass x = withService x
(lift $ putStrLn "The service could not be found in the database.") $
\d -> do
lift $ putStrLn ""
mp <- S.gets $ view masterPass
lift $ putStrLn $ case pwGenerate mp d of
Nothing -> "The password data were not valid."
Just pw -> "password for " ++ x ++ ": " ++ pw
showAltPass :: String -> S.StateT Status IO ()
showAltPass srv = do
lift $ putStrLn "" lift $ putStrLn ""
withService x old <- S.gets $ view masterPass
(lift $ putStrLn "The service could not be found in the database.") $ Just new <- lift $ runRequest $ required $ prompt "alternate master password: " reqPassword
\d -> do S.modify $ masterPass .~ new
mp <- S.gets $ view masterPass showPass srv
lift $ putStrLn $ case pwGenerate mp d of S.modify $ masterPass .~ old
Nothing -> "The password data were not valid." servMenu srv
Just pw -> "password for " ++ x ++ ": " ++ pw
-- TODO: refactor this monstrosity -- TODO: refactor this monstrosity
editPolicy :: PWPolicy -> Request PWPolicy editPolicy :: PWPolicy -> Request PWPolicy

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as
@@ -33,12 +33,13 @@ module Util
, save , save
) where ) where
import Control.Lens (over, view)
import Control.Monad (join) import Control.Monad (join)
import Control.Monad.Trans.Class (lift) import Control.Monad.Trans.Class (lift)
import qualified Control.Monad.Trans.State as S import qualified Control.Monad.Trans.State as S
import Data.Aeson (decodeFileStrict, encodeFile) import Data.Aeson (decodeFileStrict, encodeFile)
import Data.Maybe (fromJust, fromMaybe) import Data.Maybe (fromJust, fromMaybe)
import Lens.Micro (over)
import Lens.Micro.Extras (view)
import System.Console.HCL import System.Console.HCL
( Request ( Request
, prompt , prompt
@@ -104,9 +105,9 @@ confirm :: String -> Request Bool
confirm x = prompt (x ++ " (y/n): ") $ reqAgree Nothing $ fmap return reqChar confirm x = prompt (x ++ " (y/n): ") $ reqAgree Nothing $ fmap return reqChar
loadFrom :: FilePath -> Request PWDatabase loadFrom :: FilePath -> Request PWDatabase
loadFrom path = reqDefault loadFrom path = fromMaybe newPWDatabase <$> reqDefault
(reqIO (decodeFileStrict path)) (reqIO (decodeFileStrict path))
(Just newPWDatabase) >>= (return . fromMaybe newPWDatabase) (Just newPWDatabase)
save :: S.StateT Status IO () save :: S.StateT Status IO ()
save = do save = do

View File

@@ -1,10 +1,11 @@
name: passman name: passman
version: 0.2.1 version: 0.3.1.1
github: "jlamothe/passman" license: LGPL-3.0-or-later
license: LGPL-3
author: "Jonathan Lamothe" author: "Jonathan Lamothe"
maintainer: "jlamothe1980@gmail.com" maintainer: "jonathan@jlamothe.net"
copyright: "(C) 2018, 2019 Jonathan Lamothe" copyright: "(C) 2018-2023 Jonathan Lamothe"
homepage: https://codeberg.org/jlamothe/passman
bug-reports: https://codeberg.org/jlamothe/passman/issues
extra-source-files: extra-source-files:
- README.md - README.md
@@ -17,15 +18,16 @@ category: Security
# To avoid duplicated efforts in documentation and dealing with the # To avoid duplicated efforts in documentation and dealing with the
# complications of embedding Haddock markup inside cabal files, it is # complications of embedding Haddock markup inside cabal files, it is
# common to point users to the README.md file. # common to point users to the README.md file.
description: Please see the README on GitHub at <https://github.com/jlamothe/passman#readme> description: a simple password manager - see README.md for details
dependencies: dependencies:
- base >= 4.7 && < 5 - base >= 4.7 && < 5
- aeson - aeson >= 2.0.3.0 && < 2.1
- bytestring - bytestring >= 0.11.4.0 && < 0.12
- containers - containers >= 0.6.2.1 && < 0.7
- lens - microlens >= 0.4.11.2 && < 0.5
- random - microlens-th >= 0.4.3.6 && < 0.5
- random >=1.2.1.1 && < 1.3
ghc-options: ghc-options:
- -Wall - -Wall
@@ -33,10 +35,10 @@ ghc-options:
library: library:
source-dirs: src source-dirs: src
dependencies: dependencies:
- base16-bytestring - base16-bytestring >= 1.0.2.0 && < 1.1
- base64-bytestring - base64-bytestring >= 1.2.1.0 && < 1.3
- SHA - SHA >= 1.6.4.4 && < 1.7
- text - text >= 1.2.4.1 && < 1.3
executables: executables:
passman: passman:
@@ -49,8 +51,8 @@ executables:
dependencies: dependencies:
- passman - passman
- easy-file >= 0.2.2 && < 0.3 - easy-file >= 0.2.2 && < 0.3
- HCL >= 1.7.1 && < 2 - HCL >= 1.8 && < 1.9
- transformers - transformers >= 0.5.6.2 && < 0.6
tests: tests:
passman-test: passman-test:

110
passman.cabal Normal file
View File

@@ -0,0 +1,110 @@
cabal-version: 2.2
-- This file has been generated from package.yaml by hpack version 0.35.1.
--
-- see: https://github.com/sol/hpack
--
-- hash: da6c3020622e5c4c06814752b3f3334e52925005f8b3be9516efb9fd1976af9c
name: passman
version: 0.3.1.1
synopsis: a simple password manager
description: a simple password manager - see README.md for details
category: Security
homepage: https://codeberg.org/jlamothe/passman
bug-reports: https://codeberg.org/jlamothe/passman/issues
author: Jonathan Lamothe
maintainer: jonathan@jlamothe.net
copyright: (C) 2018-2023 Jonathan Lamothe
license: LGPL-3.0-or-later
license-file: LICENSE
build-type: Simple
extra-source-files:
README.md
ChangeLog.md
library
exposed-modules:
Password
other-modules:
Paths_passman
autogen-modules:
Paths_passman
hs-source-dirs:
src
ghc-options: -Wall
build-depends:
SHA >=1.6.4.4 && <1.7
, aeson >=2.0.3.0 && <2.1
, base >=4.7 && <5
, base16-bytestring >=1.0.2.0 && <1.1
, base64-bytestring >=1.2.1.0 && <1.3
, bytestring >=0.11.4.0 && <0.12
, containers >=0.6.2.1 && <0.7
, microlens >=0.4.11.2 && <0.5
, microlens-th >=0.4.3.6 && <0.5
, random >=1.2.1.1 && <1.3
, text >=1.2.4.1 && <1.3
default-language: Haskell2010
executable passman
main-is: Main.hs
other-modules:
Types
UI
Util
Paths_passman
autogen-modules:
Paths_passman
hs-source-dirs:
app
ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N
build-depends:
HCL ==1.8.*
, aeson >=2.0.3.0 && <2.1
, base >=4.7 && <5
, bytestring >=0.11.4.0 && <0.12
, containers >=0.6.2.1 && <0.7
, easy-file >=0.2.2 && <0.3
, microlens >=0.4.11.2 && <0.5
, microlens-th >=0.4.3.6 && <0.5
, passman
, random >=1.2.1.1 && <1.3
, transformers >=0.5.6.2 && <0.6
default-language: Haskell2010
test-suite passman-test
type: exitcode-stdio-1.0
main-is: Spec.hs
other-modules:
Spec.JSON
Spec.NewPWData
Spec.NewPWDatabase
Spec.NewPWPolicy
Spec.NewPWSalt
Spec.PWGenerate
Spec.PWGetService
Spec.PWHasService
Spec.PWRemoveService
Spec.PWSearch
Spec.PWSetService
Spec.ValidatePWData
Spec.ValidatePWDatabase
Spec.ValidatePWPolicy
Paths_passman
autogen-modules:
Paths_passman
hs-source-dirs:
test
ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N
build-depends:
HUnit
, aeson >=2.0.3.0 && <2.1
, base >=4.7 && <5
, bytestring >=0.11.4.0 && <0.12
, containers >=0.6.2.1 && <0.7
, microlens >=0.4.11.2 && <0.5
, microlens-th >=0.4.3.6 && <0.5
, passman
, random >=1.2.1.1 && <1.3
default-language: Haskell2010

View File

@@ -2,9 +2,9 @@
Module: Password Module: Password
Description: a simple password manager Description: a simple password manager
Copyright: (C) 2018, 2019 Jonathan Lamothe Copyright: (C) Jonathan Lamothe
License: LGPLv3 (or later) License: LGPLv3 (or later)
Maintainer: jlamothe1980@gmail.com Maintainer: jonathan@jlamothe.net
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as
@@ -47,7 +47,6 @@ module Password (
pwHasService, pwSetService, pwGetService, pwRemoveService, pwSearch pwHasService, pwSetService, pwGetService, pwRemoveService, pwSearch
) where ) where
import Control.Lens (makeLenses, over, set, to, (^.))
import Data.Aeson import Data.Aeson
( FromJSON (parseJSON) ( FromJSON (parseJSON)
, ToJSON (toJSON) , ToJSON (toJSON)
@@ -64,9 +63,12 @@ import qualified Data.ByteString.Base16.Lazy as B16
import qualified Data.ByteString.Base64.Lazy as B64 import qualified Data.ByteString.Base64.Lazy as B64
import Data.Char (isUpper, isLower, isDigit, isAlphaNum, toLower) import Data.Char (isUpper, isLower, isDigit, isAlphaNum, toLower)
import Data.Digest.Pure.SHA import Data.Digest.Pure.SHA
import Data.Either (fromRight)
import qualified Data.Map as M import qualified Data.Map as M
import Data.Maybe (fromMaybe) import Data.Maybe (fromMaybe)
import qualified Data.Text as T import qualified Data.Text as T
import Lens.Micro (over, set, to, (^.))
import Lens.Micro.TH (makeLenses)
import System.Random (RandomGen, randoms, split) import System.Random (RandomGen, randoms, split)
-- | a mapping of service names to password data -- | a mapping of service names to password data
@@ -340,7 +342,7 @@ mkSeed :: String -> PWData ->B.ByteString
mkSeed pw d = toUTF8 pw `B.append` (d^.pwSalt.to runPWSalt) mkSeed pw d = toUTF8 pw `B.append` (d^.pwSalt.to runPWSalt)
mkHash :: B.ByteString -> B.ByteString mkHash :: B.ByteString -> B.ByteString
mkHash = fst . B16.decode . toUTF8 . show . sha256 mkHash = fromRight "" . B16.decode . toUTF8 . show . sha256
nextPolicy :: Char -> PWPolicy -> PWPolicy nextPolicy :: Char -> PWPolicy -> PWPolicy
nextPolicy x p = over pwLength pred $ nextPolicy x p = over pwLength pred $

View File

@@ -17,7 +17,7 @@
# #
# resolver: ./custom-snapshot.yaml # resolver: ./custom-snapshot.yaml
# resolver: https://example.com/snapshots/2018-01-01.yaml # resolver: https://example.com/snapshots/2018-01-01.yaml
resolver: lts-12.21 resolver: lts-20.19
# User packages to be built. # User packages to be built.
# Various formats can be used as shown in the example below. # Various formats can be used as shown in the example below.
@@ -38,7 +38,7 @@ packages:
# using the same syntax as the packages field. # using the same syntax as the packages field.
# (e.g., acme-missiles-0.3) # (e.g., acme-missiles-0.3)
extra-deps: extra-deps:
- HCL-1.7.1@sha256:7bc617fbc9ba4b1f9c10d9b3e195042c1f031629f86d08253eec87660492d646 - HCL-1.8@sha256:39ec0da0cd6157f20c395e1b0df474df45efb0088afdaab20bb9dfb3662baf7c,1726
# Override default flag values for local packages and extra-deps # Override default flag values for local packages and extra-deps
# flags: {} # flags: {}

View File

@@ -5,15 +5,15 @@
packages: packages:
- completed: - completed:
hackage: HCL-1.7.1@sha256:7bc617fbc9ba4b1f9c10d9b3e195042c1f031629f86d08253eec87660492d646,1627 hackage: HCL-1.8@sha256:39ec0da0cd6157f20c395e1b0df474df45efb0088afdaab20bb9dfb3662baf7c,1726
pantry-tree: pantry-tree:
sha256: 5c93c5184dc378de5ecf235aa1a60dc24163ab7e0efad19c8f3bbc94354cf2b8
size: 1223 size: 1223
sha256: 5dd9d6b52e85caae6e47d8686be92873e00de14791c4e2c2753492ff288454fe
original: original:
hackage: HCL-1.7.1@sha256:7bc617fbc9ba4b1f9c10d9b3e195042c1f031629f86d08253eec87660492d646 hackage: HCL-1.8@sha256:39ec0da0cd6157f20c395e1b0df474df45efb0088afdaab20bb9dfb3662baf7c,1726
snapshots: snapshots:
- completed: - completed:
size: 508406 sha256: 42f77c84b34f68c30c2cd0bf8c349f617a0f428264362426290847a6a2019b64
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/12/21.yaml size: 649618
sha256: 609dd00c32f59e11bb333b9113d9d2e54269627de1268cbb3cc576af8c7b6237 url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/20/19.yaml
original: lts-12.21 original: lts-20.19

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as
@@ -22,7 +22,7 @@ License along with this program. If not, see
module Spec.NewPWData (tests) where module Spec.NewPWData (tests) where
import Control.Lens ((^.)) import Lens.Micro ((^.))
import System.Random (mkStdGen, StdGen) import System.Random (mkStdGen, StdGen)
import Test.HUnit (Test (..), (~?=)) import Test.HUnit (Test (..), (~?=))

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as
@@ -22,7 +22,7 @@ License along with this program. If not, see
module Spec.NewPWPolicy (tests) where module Spec.NewPWPolicy (tests) where
import Control.Lens ((^.)) import Lens.Micro ((^.))
import Test.HUnit (Test(..), (~?=)) import Test.HUnit (Test(..), (~?=))
import Password import Password

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as
@@ -22,8 +22,8 @@ License along with this program. If not, see
module Spec.PWGenerate (tests) where module Spec.PWGenerate (tests) where
import Control.Lens (set, (^.))
import Data.Maybe (fromJust) import Data.Maybe (fromJust)
import Lens.Micro (set, (^.))
import System.Random (mkStdGen, StdGen) import System.Random (mkStdGen, StdGen)
import Test.HUnit import Test.HUnit
(Test (..) (Test (..)

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as
@@ -22,8 +22,8 @@ License along with this program. If not, see
module Spec.ValidatePWData (tests) where module Spec.ValidatePWData (tests) where
import Control.Lens (set)
import qualified Data.ByteString.Lazy as B import qualified Data.ByteString.Lazy as B
import Lens.Micro (set)
import System.Random (mkStdGen, StdGen) import System.Random (mkStdGen, StdGen)
import Test.HUnit (Test (..), (~?=)) import Test.HUnit (Test (..), (~?=))

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as
@@ -22,8 +22,8 @@ License along with this program. If not, see
module Spec.ValidatePWDatabase (tests) where module Spec.ValidatePWDatabase (tests) where
import Control.Lens (set)
import qualified Data.Map as M import qualified Data.Map as M
import Lens.Micro (set)
import System.Random (mkStdGen, StdGen) import System.Random (mkStdGen, StdGen)
import Test.HUnit (Test (..), (~?=)) import Test.HUnit (Test (..), (~?=))

View File

@@ -1,8 +1,8 @@
{- {-
passman passman
Copyright (C) 2018, 2019 Jonathan Lamothe Copyright (C) Jonathan Lamothe
<jlamothe1980@gmail.com> <jonathan@jlamothe.net>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as it under the terms of the GNU Lesser General Public License as
@@ -22,7 +22,7 @@ License along with this program. If not, see
module Spec.ValidatePWPolicy (tests) where module Spec.ValidatePWPolicy (tests) where
import Control.Lens (set) import Lens.Micro (set)
import Test.HUnit (Test(..), (~?=)) import Test.HUnit (Test(..), (~?=))
import Password import Password