X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=ImplantFile.hs;h=ae749b9886c5a7422cd25bceb2137a83debb796f;hb=73b5fba4907604681d778d3bd54cd65fd84b4454;hp=26be80e73e7dcd109160dcfe68be812ff4c66af2;hpb=3d017dd65ddede9a11c5b7a34a91e04340e67bc4;p=Lucu.git diff --git a/ImplantFile.hs b/ImplantFile.hs index 26be80e..ae749b9 100644 --- a/ImplantFile.hs +++ b/ImplantFile.hs @@ -5,17 +5,17 @@ import Data.Bits import qualified Data.ByteString.Lazy as Lazy (ByteString) import qualified Data.ByteString.Lazy as L hiding (ByteString) import Data.Char -import Data.Digest.SHA1 import Data.Int import Data.Maybe import Data.Time import Data.Time.Clock.POSIX -import Data.Word import Language.Haskell.Pretty import Language.Haskell.Syntax import Network.HTTP.Lucu.MIMEType import Network.HTTP.Lucu.MIMEType.DefaultExtensionMap import Network.HTTP.Lucu.MIMEType.Guess +import OpenSSL +import OpenSSL.EVP.Digest import System.Console.GetOpt import System.Environment import System.Exit @@ -75,7 +75,8 @@ printUsage = do putStrLn "" main :: IO () -main = do (opts, sources, errors) <- return . getOpt Permute options =<< getArgs +main = withOpenSSL $ + do (opts, sources, errors) <- return . getOpt Permute options =<< getArgs when (not $ null errors) $ do mapM_ putStr errors @@ -105,7 +106,8 @@ generateHaskellSource opts srcFile output <- openOutput opts eTag <- getETag opts input - let gzippedData = compressWith BestCompression input + let compParams = defaultCompressParams { compressLevel = BestCompression } + gzippedData = compressWith compParams input originalLen = L.length input gzippedLen = L.length gzippedData useGZip = originalLen > gzippedLen @@ -120,6 +122,8 @@ generateHaskellSource opts srcFile False Nothing Nothing , HsImportDecl undefined (Module "Data.ByteString.Lazy") True (Just (Module "L")) Nothing + , HsImportDecl undefined (Module "Data.Maybe") + False Nothing Nothing , HsImportDecl undefined (Module "Data.Time") False Nothing Nothing , HsImportDecl undefined (Module "Network.HTTP.Lucu") @@ -300,8 +304,10 @@ generateHaskellSource opts srcFile defGZippedData = HsApp (HsVar (Qual (Module "L") (HsIdent "pack"))) (HsParen - (HsApp (HsVar (UnQual (HsIdent "decode"))) - (HsLit (HsString gzippedB64)))) + (HsApp (HsVar (UnQual (HsIdent "fromJust"))) + (HsParen + (HsApp (HsVar (UnQual (HsIdent "decode"))) + (HsLit (HsString gzippedB64)))))) declRawData :: [HsDecl] declRawData @@ -316,8 +322,10 @@ generateHaskellSource opts srcFile defRawData = HsApp (HsVar (Qual (Module "L") (HsIdent "pack"))) (HsParen - (HsApp (HsVar (UnQual (HsIdent "decode"))) - (HsLit (HsString rawB64)))) + (HsApp (HsVar (UnQual (HsIdent "fromJust"))) + (HsParen + (HsApp (HsVar (UnQual (HsIdent "decode"))) + (HsLit (HsString rawB64)))))) hPutStrLn output header hPutStrLn output (prettyPrint hsModule) @@ -393,7 +401,7 @@ getMIMEType opts srcFile getLastModified :: FilePath -> IO UTCTime getLastModified "-" = getCurrentTime getLastModified fpath = getFileStatus fpath - >>= return . posixSecondsToUTCTime . toEnum . fromEnum . modificationTime + >>= return . posixSecondsToUTCTime . fromRational . toRational . modificationTime getETag :: [CmdOpt] -> Lazy.ByteString -> IO String @@ -403,16 +411,16 @@ getETag opts input _ -> False) opts in case eTagOpts of - [] -> return mkETagFromInput + [] -> getDigestByName "SHA1" >>= return . mkETagFromInput . fromJust (OptETag str):[] -> return str _ -> error "too many --etag options." where - mkETagFromInput :: String - mkETagFromInput = "SHA-1:" ++ (toHex $ hash $ L.unpack input) + mkETagFromInput :: Digest -> String + mkETagFromInput sha1 = "SHA-1:" ++ (toHex $ digestLBS sha1 input) - toHex :: [Word8] -> String + toHex :: [Char] -> String toHex [] = "" - toHex (x:xs) = hexByte (fromIntegral x) ++ toHex xs + toHex (x:xs) = hexByte (fromEnum x) ++ toHex xs hexByte :: Int -> String hexByte n @@ -459,6 +467,7 @@ openOutput opts module Foo.Bar.Baz (baz) where import Codec.Binary.Base64 import qualified Data.ByteString.Lazy as L + import Data.Maybe import Data.Time import Network.HTTP.Lucu @@ -486,7 +495,7 @@ openOutput opts contentType = read "image/png" rawData :: L.ByteString - rawData = L.pack (decode "IyEvdXNyL2Jpbi9lbnYgcnVuZ2hjCgppbXBvcnQgRGlzdHJ...") + rawData = L.pack (fromJust (decode "IyEvdXNyL2Jpbi9lbnYgcnVuZ2hjCgppbXBvcnQgRGlzdHJ...")) ------------------------------------------------------------------------------ 壓縮される場合は次のやうに變はる: @@ -518,6 +527,6 @@ openOutput opts -- rawData の代はりに gzippedData gzippedData :: L.ByteString - gzippedData = L.pack (decode "Otb/+DniOlRgAAAAYAAAAGAAAAB/6QOmToAEIGAAAAB...") + gzippedData = L.pack (fromJust (decode "Otb/+DniOlRgAAAAYAAAAGAAAAB/6QOmToAEIGAAAAB...")) ------------------------------------------------------------------------------ -}