Extension.hs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. {-# LANGUAGE OverloadedStrings #-}
  2. -- Parser of mail commands
  3. module Data.SMTP.Parser.Extension (
  4. parseExtension
  5. ) where
  6. import Data.SMTP.Types.Extension
  7. import Control.Applicative ((<|>))
  8. import qualified Data.Attoparsec.ByteString.Char8 as A
  9. import Data.Attoparsec.ByteString (Parser)
  10. import qualified Data.Char as C
  11. noParameterExtensions :: [ExtName]
  12. noParameterExtensions = [E8BITMIME, CHUNKING, HELP, SMTPUTF8, STARTTLS, PIPELINING,
  13. ATRN, DSN, ETRN, UTF8SMTP, ENHANCEDSTATUSCODES, EXPN, BINARYMIME,
  14. CHECKPOINT, DELIVERBY, NOSOLICITING, MTRK, SUBMITTER, BURL,
  15. FUTURERELEASE, CONPERM, CONNEG, MTPRIORITY, RRVS, SIZE]
  16. parseExtension :: Parser Extension
  17. parseExtension = parseAuth <|> parseSize <|> onlyName noParameterExtensions
  18. onlyName :: [ExtName] -> Parser Extension
  19. onlyName = foldr
  20. (\ e ->
  21. (<|>) ((A.stringCI . printExtName $ e) *> (return . OnlyExt $ e)))
  22. (fail "Unknown extension")
  23. parseAuth :: Parser Extension
  24. parseAuth = do
  25. A.stringCI "AUTH "
  26. skipHor
  27. mets <- parseAuthMethods
  28. return $ AuthExt AUTH mets
  29. parseAuthMethods :: Parser [SaslMethod]
  30. parseAuthMethods = parsePlainAuth
  31. parsePlainAuth :: Parser [SaslMethod]
  32. parsePlainAuth = do
  33. A.stringCI "PLAIN"
  34. skipHor
  35. return [PLAIN]
  36. parseSize :: Parser Extension
  37. parseSize = do
  38. A.stringCI "SIZE "
  39. skipHor
  40. size <- A.decimal
  41. return $ IntExt SIZE size
  42. skipHor :: Parser ()
  43. skipHor = A.skipWhile $ A.isHorizontalSpace . fromIntegral . C.ord