X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=Lucu.git;a=blobdiff_plain;f=ImplantFile.hs;fp=ImplantFile.hs;h=26be80e73e7dcd109160dcfe68be812ff4c66af2;hp=a16c76ec8bee3eb9331cdf9c42a24b99facd99ec;hb=3d017dd65ddede9a11c5b7a34a91e04340e67bc4;hpb=e1e74c8f81ccbc57bf5a09987b0a9dd42648f020 diff --git a/ImplantFile.hs b/ImplantFile.hs index a16c76e..26be80e 100644 --- a/ImplantFile.hs +++ b/ImplantFile.hs @@ -2,12 +2,14 @@ import Codec.Binary.Base64 import Codec.Compression.GZip import Control.Monad import Data.Bits -import Data.ByteString.Base (LazyByteString) -import qualified Data.ByteString.Lazy as L +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 @@ -15,11 +17,10 @@ import Network.HTTP.Lucu.MIMEType import Network.HTTP.Lucu.MIMEType.DefaultExtensionMap import Network.HTTP.Lucu.MIMEType.Guess import System.Console.GetOpt -import System.Directory import System.Environment import System.Exit +import System.Posix.Files import System.IO -import System.Time data CmdOpt = OptOutput FilePath @@ -111,19 +112,17 @@ generateHaskellSource opts srcFile rawB64 = encode $ L.unpack input gzippedB64 = encode $ L.unpack gzippedData - header = mkHeader srcFile originalLen gzippedLen useGZip mimeType eTag lastMod + header <- mkHeader srcFile originalLen gzippedLen useGZip mimeType eTag lastMod - hsModule = HsModule undefined (Module modName) (Just exports) imports decls + let hsModule = HsModule undefined (Module modName) (Just exports) imports decls exports = [HsEVar (UnQual (HsIdent symName))] imports = [ HsImportDecl undefined (Module "Codec.Binary.Base64") False Nothing Nothing - , HsImportDecl undefined (Module "Data.ByteString.Base") - False Nothing (Just (False, [HsIVar (HsIdent "LazyByteString")])) , HsImportDecl undefined (Module "Data.ByteString.Lazy") True (Just (Module "L")) Nothing - , HsImportDecl undefined (Module "Network.HTTP.Lucu") + , HsImportDecl undefined (Module "Data.Time") False Nothing Nothing - , HsImportDecl undefined (Module "System.Time") + , HsImportDecl undefined (Module "Network.HTTP.Lucu") False Nothing Nothing ] ++ @@ -263,18 +262,15 @@ generateHaskellSource opts srcFile declLastModified = [ HsTypeSig undefined [HsIdent "lastModified"] (HsQualType [] - (HsTyCon (UnQual (HsIdent "ClockTime")))) + (HsTyCon (UnQual (HsIdent "UTCTime")))) , HsFunBind [HsMatch undefined (HsIdent "lastModified") [] (HsUnGuardedRhs defLastModified) []] ] defLastModified :: HsExp defLastModified - = let TOD a b = lastMod - in - (HsApp (HsApp (HsCon (UnQual (HsIdent "TOD"))) - (HsLit (HsInt a))) - (HsLit (HsInt b))) + = HsApp (HsVar (UnQual (HsIdent "read"))) + (HsLit (HsString $ show lastMod)) declContentType :: [HsDecl] @@ -295,7 +291,7 @@ generateHaskellSource opts srcFile declGZippedData = [ HsTypeSig undefined [HsIdent "gzippedData"] (HsQualType [] - (HsTyCon (UnQual (HsIdent "LazyByteString")))) + (HsTyCon (Qual (Module "L") (HsIdent "ByteString")))) , HsFunBind [HsMatch undefined (HsIdent "gzippedData") [] (HsUnGuardedRhs defGZippedData) []] ] @@ -311,7 +307,7 @@ generateHaskellSource opts srcFile declRawData = [ HsTypeSig undefined [HsIdent "rawData"] (HsQualType [] - (HsTyCon (UnQual (HsIdent "LazyByteString")))) + (HsTyCon (Qual (Module "L") (HsIdent "ByteString")))) , HsFunBind [HsMatch undefined (HsIdent "rawData") [] (HsUnGuardedRhs defRawData) []] ] @@ -328,23 +324,24 @@ generateHaskellSource opts srcFile hClose output -mkHeader :: FilePath -> Int64 -> Int64 -> Bool -> MIMEType -> String -> ClockTime -> String +mkHeader :: FilePath -> Int64 -> Int64 -> Bool -> MIMEType -> String -> UTCTime -> IO String mkHeader srcFile originalLen gzippedLen useGZip mimeType eTag lastMod - = "{- DO NOT EDIT THIS FILE.\n" ++ - " This file is automatically generated by the lucu-implant-file program.\n" ++ - "\n" ++ - " Source: " ++ (if srcFile == "-" - then "(stdin)" - else srcFile) ++ "\n" ++ - " Original Length: " ++ show originalLen ++ " bytes\n" ++ - (if useGZip - then " Compressed Length: " ++ show gzippedLen ++ " bytes\n" ++ - " Compression: gzip\n" - else " Compression: disabled\n") ++ - " MIME Type: " ++ show mimeType ++ "\n" ++ - " ETag: " ++ eTag ++ "\n" ++ - " Last Modified: " ++ show lastMod ++ "\n" ++ - " -}" + = do localLastMod <- utcToLocalZonedTime lastMod + return ("{- DO NOT EDIT THIS FILE.\n" ++ + " This file is automatically generated by the lucu-implant-file program.\n" ++ + "\n" ++ + " Source: " ++ (if srcFile == "-" + then "(stdin)" + else srcFile) ++ "\n" ++ + " Original Length: " ++ show originalLen ++ " bytes\n" ++ + (if useGZip + then " Compressed Length: " ++ show gzippedLen ++ " bytes\n" ++ + " Compression: gzip\n" + else " Compression: disabled\n") ++ + " MIME Type: " ++ show mimeType ++ "\n" ++ + " ETag: " ++ eTag ++ "\n" ++ + " Last Modified: " ++ show localLastMod ++ "\n" ++ + " -}") getModuleName :: [CmdOpt] -> IO String @@ -369,6 +366,7 @@ getSymbolName opts modName defaultSymName = mkDefault modName mkDefault = headToLower . getLastComp headToLower = \ str -> case str of + [] -> error "module name must not be empty" (x:xs) -> toLower x : xs getLastComp = reverse . fst . break (== '.') . reverse in @@ -392,12 +390,13 @@ getMIMEType opts srcFile _ -> error "too many --mime-type options." -getLastModified :: FilePath -> IO ClockTime -getLastModified "-" = getClockTime -getLastModified fpath = getModificationTime fpath +getLastModified :: FilePath -> IO UTCTime +getLastModified "-" = getCurrentTime +getLastModified fpath = getFileStatus fpath + >>= return . posixSecondsToUTCTime . toEnum . fromEnum . modificationTime -getETag :: [CmdOpt] -> LazyByteString -> IO String +getETag :: [CmdOpt] -> Lazy.ByteString -> IO String getETag opts input = let eTagOpts = filter (\ x -> case x of OptETag _ -> True @@ -421,11 +420,12 @@ getETag opts input hex4bit :: Int -> Char hex4bit n - | n < 10 = (chr $ ord '0' + n ) - | n < 16 = (chr $ ord 'a' + n - 10) + | n < 10 = (chr $ ord '0' + n ) + | n < 16 = (chr $ ord 'a' + n - 10) + | otherwise = undefined -openInput :: FilePath -> IO LazyByteString +openInput :: FilePath -> IO Lazy.ByteString openInput "-" = L.getContents openInput fpath = L.readFile fpath @@ -454,14 +454,13 @@ openOutput opts Compression: disabled MIME Type: image/png ETag: d41d8cd98f00b204e9800998ecf8427e - Last Modified: Wed, 03 Oct 2007 00:55:45 JST + Last Modified: 2007-11-05 13:53:42.231882 JST -} module Foo.Bar.Baz (baz) where import Codec.Binary.Base64 - import Data.ByteString.Base (LazyByteString) import qualified Data.ByteString.Lazy as L + import Data.Time import Network.HTTP.Lucu - import System.Time baz :: ResourceDef baz = ResourceDef { @@ -480,13 +479,13 @@ openOutput opts entityTag :: ETag entityTag = strongETag "d41d8cd98f00b204e9800998ecf8427e" - lastModified :: ClockTime - lastModified = TOD 1191340545 0 + lastModified :: UTCTime + lastModified = read "2007-11-05 04:47:56.008366 UTC" contentType :: MIMEType contentType = read "image/png" - rawData :: LazyByteString + rawData :: L.ByteString rawData = L.pack (decode "IyEvdXNyL2Jpbi9lbnYgcnVuZ2hjCgppbXBvcnQgRGlzdHJ...") ------------------------------------------------------------------------------ @@ -518,7 +517,7 @@ openOutput opts } -- rawData の代はりに gzippedData - gzippedData :: LazyByteString + gzippedData :: L.ByteString gzippedData = L.pack (decode "Otb/+DniOlRgAAAAYAAAAGAAAAB/6QOmToAEIGAAAAB...") ------------------------------------------------------------------------------ -}