Extensions.hs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. {-# LANGUAGE OverloadedStrings #-}
  2. module Data.SMTP.Extensions where
  3. import Data.List
  4. import Data.ByteString (ByteString)
  5. import qualified Data.ByteString as BS
  6. import Text.StringConvert
  7. data Extension = OnlyExt ExtName | IntExt ExtName Int | StringExt ExtName ByteString
  8. | AuthExt ExtName [SaslMethod] deriving (Eq, Ord, Read, Show)
  9. data ExtName = E8BITMIME | AUTH | CHUNKING | HELP | SIZE | SMTPUTF8 |
  10. STARTTLS | PIPELINING | ATRN | DSN | ETRN | UTF8SMTP |
  11. UNRECOGNIZED | ENHANCEDSTATUSCODES | EXPN | BINARYMIME |
  12. CHECKPOINT | DELIVERBY | NOSOLICITING | MTRK | SUBMITTER |
  13. BURL | FUTURERELEASE | CONPERM | CONNEG | MTPRIORITY | RRVS deriving (Eq, Ord, Read, Show)
  14. ehloValue :: Extension -> ByteString
  15. ehloValue (OnlyExt e) = printExtName e
  16. ehloValue (IntExt e v) = BS.intercalate " " [printExtName e, s $ show v]
  17. ehloValue (StringExt e v) = BS.intercalate " " [printExtName e, v]
  18. ehloValue (AuthExt e v) = BS.intercalate " " (printExtName e : map saslValue v)
  19. printExtName :: ExtName -> ByteString
  20. printExtName E8BITMIME = "8BITMIME"
  21. printExtName NOSOLICITING = "NO-SOLICITING"
  22. printExtName MTPRIORITY = "MT-PRIORITY"
  23. printExtName e = s . show $ e
  24. hasExtension :: [Extension] -> ExtName -> Bool
  25. hasExtension [] _ = False
  26. hasExtension (e:ee) name = (name' == name) || hasExtension ee name
  27. where
  28. name' = getExtName e
  29. getExtension :: [Extension] -> ExtName -> Maybe Extension
  30. getExtension [] _ = Nothing
  31. getExtension (e:ee) name = if name' == name then Just e else getExtension ee name
  32. where
  33. name' = getExtName e
  34. getExtName :: Extension -> ExtName
  35. getExtName (OnlyExt a) = a
  36. getExtName (IntExt a _) = a
  37. getExtName (StringExt a _) = a
  38. getExtName (AuthExt a _) = a
  39. data SaslMethod = PLAIN | DIGEST_MD5 | GSSAPI | UNRECOGNIZED_SASL deriving (Eq, Ord, Read, Show)
  40. saslValue :: SaslMethod -> ByteString
  41. saslValue DIGEST_MD5 = "DIGEST-MD5"
  42. saslValue v = s . show $ v
  43. readAllSasl :: String -> [SaslMethod]
  44. readAllSasl [] = []
  45. readAllSasl (' ':ss) = readAllSasl ss
  46. readAllSasl ss
  47. | "DIGEST-MD5" `isPrefixOf` ss = DIGEST_MD5 : readAllSasl (drop 10 ss)
  48. | "PLAIN" `isPrefixOf` ss = PLAIN : readAllSasl (drop 5 ss)
  49. | "GSSAPI" `isPrefixOf` ss = GSSAPI : readAllSasl (drop 6 ss)
  50. readAllSasl (_:ss) = readAllSasl ss