apache-md5 0.6.0.0 → 0.6.1.0
raw patch · 9 files changed
+80/−21 lines, 9 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- ChangeLog.md +11/−0
- LICENSE +1/−1
- README.md +2/−1
- apache-md5.cabal +2/−2
- example.hs +2/−1
- src/Data/Digest/ApacheMD5.hs +19/−10
- src/Data/Digest/ApacheMD5/Internal.hs +18/−2
- test/benchmark-main.hs +9/−2
- test/unit-tests-main.hs +16/−2
ChangeLog.md view
@@ -1,5 +1,16 @@ # ChangeLog / ReleaseNotes ++## Version 0.6.1.0++* Function `mkSalt` rejects empty `ByteString` and returns `Nothing` for it.+* Using `NoImplicitPrelude` language extension.+* Example program is once again compilable.+* Minor documentation updates including `README.md`.+* Uploaded to [Hackage][]:+ <http://hackage.haskell.org/package/apache-md5-0.6.1.0>++ ## Version 0.6.0.0 * Introducing Salt newtype wrapper to guarantee that it consists of only
LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2009, 2010, 2012, 2013, Peter Trsko+Copyright (c) 2009, 2010, 2012 - 2014, Peter Trsko All rights reserved.
README.md view
@@ -51,7 +51,8 @@ import qualified Data.ByteString as BS (index, pack) import qualified Data.ByteString.Char8 as C8 (concat, pack, putStrLn, singleton) -- bytestring package http://hackage.haskell.org/package/bytestring-import Data.Digest.ApacheMD5 (Salt, alpha64, apacheMD5, mkSalt, unSalt)+import Data.Digest.ApacheMD5 (Salt, apacheMD5, mkSalt, unSalt)+import Data.Digest.ApacheMD5.Internal (alpha64) htpasswdEntry :: String -> String -> Salt -> ByteString
apache-md5.cabal view
@@ -1,5 +1,5 @@ name: apache-md5-version: 0.6.0.0+version: 0.6.1.0 synopsis: Apache specific MD5 digest algorighm. description: Haskell implementation of Apache HTTP server specific MD5 digest algorithm@@ -140,4 +140,4 @@ source-repository this type: git location: git://github.com/trskop/apache-md5.git- tag: v0.6.0.0+ tag: v0.6.1.0
example.hs view
@@ -23,7 +23,8 @@ import qualified Data.ByteString as BS (index, pack) import qualified Data.ByteString.Char8 as C8 (concat, pack, putStrLn, singleton) -- bytestring package http://hackage.haskell.org/package/bytestring-import Data.Digest.ApacheMD5 (Salt, alpha64, apacheMD5, mkSalt, unSalt)+import Data.Digest.ApacheMD5 (Salt, apacheMD5, mkSalt, unSalt)+import Data.Digest.ApacheMD5.Internal (alpha64) htpasswdEntry :: String -> String -> Salt -> ByteString
src/Data/Digest/ApacheMD5.hs view
@@ -1,10 +1,12 @@+{-# LANGUAGE NoImplicitPrelude #-} -- | -- Module: Data.Digest.ApacheMD5 -- Copyright: (c) 2009, 2010, 2012 - 2014 Peter Trško -- License: BSD3 -- Maintainer: Peter Trško <peter.trsko@gmail.com> -- Stability: Provisional--- Portability: non-portable (depends on non-portable internal module)+-- Portability: non-portable (NoImplicitPrelude, depends on non-portable+-- internal module) -- -- ApacheMD5 is one of the hash algorithms used by Apache HTTP server for basic -- authentication. It is Apache specific, but e.g. nginx supports this@@ -27,10 +29,10 @@ -- usage. See also @htpasswd@ documentation on -- <http://httpd.apache.org/docs/current/programs/htpasswd.html>. - -- ** Example: Creating htpasswd-like entry+ -- * Example: Creating htpasswd-like entry --- -- | Output of this function is not identical to what @htpasswd@ does. To- -- create @htpasswd@-like entry do:+ -- | Output of 'apacheMD5' function is not identical to what @htpasswd@+ -- does. To create @htpasswd@-like entry one needs to do: -- -- > import Data.ByteString (ByteString) -- > import qualified Data.ByteString.Char8 as C8 (concat, pack, singleton)@@ -54,8 +56,12 @@ ) where +import Data.Bool ((&&), not, otherwise)+import Data.Function ((.), ($))+import Data.Maybe (Maybe(Nothing, Just))+ import Data.ByteString (ByteString)-import qualified Data.ByteString as BS (all)+import qualified Data.ByteString as BS (all, null) import Data.Digest.ApacheMD5.Internal (Password, Salt(Salt)) import qualified Data.Digest.ApacheMD5.Internal as Internal@@ -66,13 +72,16 @@ ) --- | Smart constructor for 'Salt'. It tests all octets to be members of--- 'Data.Digest.ApacheMD5.Internal.alpha64' by using 'Internal.isAlpha64'--- predicate.+-- | Smart constructor for 'Salt'. It tests that provided 'ByteString' is not+-- empty and that all its octets are members of alphabet used for base 64+-- encoding 'Data.Digest.ApacheMD5.Internal.alpha64' and it uses+-- 'Internal.isAlpha64' predicate to do so. mkSalt :: ByteString -> Maybe Salt mkSalt str- | BS.all Internal.isAlpha64 str = Just $ Salt str- | otherwise = Nothing+ | isValidSalt = Just $ Salt str+ | otherwise = Nothing+ where+ isValidSalt = not (BS.null str) && BS.all Internal.isAlpha64 str -- | Unpack 'Salt' in to 'ByteString'. unSalt :: Salt -> ByteString
src/Data/Digest/ApacheMD5/Internal.hs view
@@ -12,6 +12,7 @@ #endif {-# LANGUAGE ForeignFunctionInterface #-}+{-# LANGUAGE NoImplicitPrelude #-} -- | -- Module: Data.Digest.ApacheMD5.Internal@@ -20,7 +21,7 @@ -- Maintainer: Peter Trško <peter.trsko@gmail.com> -- Stability: Provisional -- Portability: non-portable (BangPatterns, CPP, DeriveDataTypeable,--- DeriveGeneric, ForeignFunctionInterface)+-- DeriveGeneric, ForeignFunctionInterface, NoImplicitPrelude) -- -- Internal and unsafe functions used for implementing Apache MD5 -- hash algorithm.@@ -47,12 +48,27 @@ ) where +import Prelude+ ( Integral(div, mod, rem, toInteger)+ , Num((+), fromInteger)+ , Read+ , Show+ , fromIntegral+ )+ import Control.Applicative (liftA2) import Control.Monad (void) import Data.Bits (Bits((.|.), (.&.), shiftL, shiftR))+import Data.Bool (Bool, (||), (&&), otherwise)+import Data.Eq (Eq((==)))+import Data.Function ((.), ($))+import Data.Int (Int)+import Data.List (concatMap, foldl1, iterate, map, replicate, take)+import Data.Ord (Ord((<), (<=), (>), (>=))) import Data.Word (Word8, Word16, Word32) import Foreign (Ptr) import Foreign.C.Types (CChar(..), CULong(..))+import System.IO (IO) import System.IO.Unsafe (unsafePerformIO) #ifdef WITH_deepseq@@ -91,7 +107,7 @@ -- | Apache MD5 hash salt. When constructing @.htpasswd@ file it is necessary -- for the salt to be consisting of octets from 'alpha64' \"set\". This newtype--- along with 'mkSalt' smart constructor are here to ensure such invariant.+-- along with @mkSalt@ smart constructor are here to ensure such invariant. newtype Salt = Salt ByteString deriving ( Eq, Ord, Read, Show
test/benchmark-main.hs view
@@ -1,9 +1,16 @@ {-# LANGUAGE BangPatterns #-}+{-# LANGUAGE NoImplicitPrelude #-} module Main where -import Control.Applicative ((<$>))-import Control.Monad (replicateM)+import Control.Applicative ((<$>))+import Control.Monad (Monad((>>=), return), replicateM)+import Data.Bool (Bool(True))+import Data.Function ((.), ($))+import Data.Int (Int)+import Data.String (String)+import Data.Tuple (uncurry)+import System.IO (IO) import Data.ByteString (ByteString)
test/unit-tests-main.hs view
@@ -1,13 +1,27 @@+{-# LANGUAGE NoImplicitPrelude #-} module Main (main) where +import Prelude (Show(show), error)+ import Control.Arrow (Arrow(second))-import Control.Monad (replicateM, replicateM_, void, when)+import Control.Monad+ ( Monad((>>=), return)+ , replicateM+ , replicateM_+ , void+ , when+ ) import Control.Monad.IO.Class (liftIO) import Control.Monad.Random import qualified Data.ByteString.Char8 as C8-import Data.Function (on)+import Data.Eq (Eq((==), (/=)))+import Data.Function ((.), ($), on)+import Data.Int (Int)+import Data.List ((++), break, concat, drop, dropWhile, takeWhile, unlines)+import Data.String (String) import System.Exit (ExitCode(..))+import System.IO (IO) import System.Process (readProcessWithExitCode) import Test.Framework import Test.Framework.Providers.HUnit (testCase)