Extension.hs 2.4 KB

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