From e6950ea5260ad4b1db549dec9083b090282d6c3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Er=C3=A8be?= Date: Wed, 15 Jun 2016 14:01:50 +0200 Subject: [PATCH] maj sock5 --- src/socks5.hs | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/socks5.hs b/src/socks5.hs index 55a7ef4..a0873f3 100644 --- a/src/socks5.hs +++ b/src/socks5.hs @@ -9,7 +9,8 @@ module Socks5 where import ClassyPrelude -import qualified Data.Binary.Get as Bin +import Data.Binary +import Data.Binary.Get import Network.Socket (HostName, PortNumber) data AuthMethod = NoAuth @@ -24,6 +25,40 @@ data RequestAuth = RequestAuth , methods :: Vector AuthMethod } deriving (Show, Read) +instance Binary AuthMethod where + put val = case val of + NoAuth -> putWord8 0x00 + GSSAPI -> putWord8 0x01 + Login -> putWord8 0x02 + NotAllowed -> putWord8 0xFF + _ {- Reserverd -} -> putWord8 0x03 + + get = do + method <- getWord8 + return $ case method of + 0x00 -> NoAuth + 0x01 -> GSSAPI + 0x02 -> Login + 0xFF -> NotAllowed + _ -> Reserved + + +instance Binary RequestAuth where + put RequestAuth{..} = do + putWord8 (fromIntegral version) + putWord8 (fromIntegral $ length methods) + sequence_ ( put <$> methods) + + get = do + version <- fromIntegral <$> getWord8 + guard (version == 0x05) + nbMethods <- fromIntegral <$> getWord8 + guard (version <= 0xFF) + methods <- replicateM nbMethods get + return $ RequestAuth version methods + + + data Request = Request { version :: Int