package Ġcom . github . c 0 va 2 3 . async S ocks Proxy Ċ Ċ import Ġio . kot lint est . specs . Free Spec Ċ Ċ import Ġcom . github . c 0 va 2 3 . async S ocks Proxy . S ocks 5 Handshake . Address Type Ċ import Ġcom . github . c 0 va 2 3 . async S ocks Proxy . socks 5 Auth Methods . Auth Method Interface Ċ import Ġcom . github . c 0 va 2 3 . async S ocks Proxy . support . Byte Channel Mock Ċ import Ġio . kot lint est . matchers . shouldBe Ċ import Ġio . kot lint est . matchers . should Equal Ċ import Ġio . kot lint est . matchers . should Throw Ċ import Ġio . kot lint est . mock . mock Ċ import Ġio . kot lint est . mock .` when ` Ċ import Ġio . kot lint est . properties . for All Ċ import Ġio . kot lint est . properties . headers Ċ import Ġio . kot lint est . properties . row Ċ import Ġio . kot lint est . properties . table Ċ import Ġjava . net . Inet 4 Address Ċ import Ġjava . net . Inet 6 Address Ċ import Ġjava . net . Inet Address Ċ Ċ class ĠS ocks 5 Handshake Spec Ġ: ĠFree Spec () Ġ{ ĊĠĠĠ Ġprivate Ġfun Ġbuild Auth Request Payload ( var arg Ġmethods : ĠByte ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethods . size . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* methods ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Command Request Payload ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand : ĠCommand , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Type : ĠAddress Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Host : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġport : ĠInt ĊĠĠĠ Ġ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaddress Payload Ġ= Ġwhen Ġ( address Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAddress Type . Ipv 4 , ĠAddress Type . Ipv 6 Ġ-> ĠInet Address . get ByName ( address Host ). address ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAddress Type . DomainName Ġ-> Ġbyte ArrayOf ( address Host . length . to Byte ()) Ġ+ Ġaddress Host . toByteArray () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 5 , Ġ// ĠVersion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ// ĠReserved ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Type . code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* address Payload , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* port . to Port Bytes () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġone Instance Per Test Ġ= Ġtrue ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ" parse Request ()" Ġ- Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġallowed Method Ġ= Ġmock < Auth Method Interface >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġallowed Method Code : ĠByte Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` when `( allowed Method . code ). thenReturn ( allowed Method Code ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsock s 5 Handshake Ġ= ĠS ocks 5 Handshake ( listOf ( allowed Method )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" when Ġrequest Ġwith Ġallowed Ġmethod " Ġ- Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauth Request Payload Ġ= Ġbuild Auth Request Payload ( allowed Method Code ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" then Ġwrite Ġallowed Ġmethod " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand Request Payload Ġ= Ġbuild Command Request Payload ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand . CONNECT , ĠAddress Type . Ipv 4 , Ġ" 1 2 7 . 0 . 0 . 1 ", Ġ 8 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbyte Channel Ġ= ĠByte Channel Mock ( listOf ( auth Request Payload , Ġcommand Request Payload )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsock s 5 Handshake . parse Request ( byte Channel ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Response Payload Ġ= Ġbyte Channel . out Buffers [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Response Payload [ 0 ] Ġshould Equal Ġ 0 x 0 5 . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Response Payload [ 1 ] Ġshould Equal Ġallowed Method Code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" then Ġreturn Ġvalid ĠS ocks 5 Request Data " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor All ( table ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders (" Command ", Ġ" Address Ġtype ", Ġ" Address ", Ġ" Port "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( Command . CONNECT , ĠAddress Type . Ipv 4 , Ġ" 8 . 8 . 8 . 8 ", Ġ 8 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( Command . BINDING , ĠAddress Type . Ipv 6 , Ġ" 2 0 0 1 : 4 8 6 0 : 4 8 6 0 :: 8 8 8 8 ", Ġ 4 4 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( Command . CONNECT , ĠAddress Type . DomainName , Ġ" localhost ", Ġ 8 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( Command . UDP _ ASS OCI ATE , ĠAddress Type . Ipv 4 , Ġ" 8 . 8 . 8 . 8 ", Ġ 0 xFFFF ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) Ġ{ Ġcommand : ĠCommand , Ġaddress Type : ĠAddress Type , Ġaddress Host : ĠString , Ġport : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= ĠInet Address . get ByName ( address Host ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand Request Payload Ġ= Ġbuild Command Request Payload ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand , Ġaddress Type , Ġaddress Host , Ġport ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbyte Channel Ġ= ĠByte Channel Mock ( listOf ( auth Request Payload , Ġcommand Request Payload )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsock s 5 Handshake . parse Request ( byte Channel ) ĠshouldBe ĠS ocks 5 Request Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Ġ= Ġcommand , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Ġ= Ġaddress , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= Ġport ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" when Ġrequest Ġwith Ġnot Ġallowed Ġmethod " Ġ- Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" write Ġonly ĠNO _ ACCEPT ABLE _ METHO DS " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauth Request Payload Ġ= Ġbuild Auth Request Payload ( 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbyte Channel Ġ= ĠByte Channel Mock ( listOf ( auth Request Payload )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshould Throw < No Accept able Methods > Ġ{ Ġsock s 5 Handshake . parse Request ( byte Channel ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Channel . out Buffers . size Ġshould Equal Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Response Payload Ġ= Ġbyte Channel . out Buffers [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Response Payload [ 0 ] Ġshould Equal Ġ 0 x 0 5 . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Response Payload [ 1 ] Ġshould Equal Ġ 0 xFF . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" write Response ()" Ġ- Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsocket Table Ġ= Ġtable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders (" IP ", Ġ" Address Ġtype ", Ġ" Port "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( Inet 4 Address . get ByName (" 1 2 7 . 0 . 0 . 1 "), ĠAddress Type . Ipv 4 , Ġ 8 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( Inet 6 Address . get ByName (" :: 1 "), ĠAddress Type . Ipv 6 , Ġ 1 0 8 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsock s 5 Handshake Ġ= ĠS ocks 5 Handshake ( listOf ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" when Ġconnected " Ġ- Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" write Ġsuccess Ġresponse " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor All ( socket Table ) Ġ{ Ġaddress : ĠInet Address , Ġaddress Type : ĠAddress Type , Ġport : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Data Ġ= ĠS ocks 5 Request Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Ġ= Ġaddress , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= Ġport , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Ġ= ĠCommand . CONNECT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbyte Channel Ġ= ĠByte Channel Mock ( listOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsock s 5 Handshake . write Response ( byte Channel , Ġtrue , Ġrequest Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Bytes Ġ= Ġbyte Channel . out Buffers . first () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Bytes [ 0 ] Ġshould Equal Ġ 0 x 0 5 . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Bytes [ 1 ] Ġshould Equal ĠS ocks 5 Handshake . Response . SUCCEEDED . code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Bytes [ 2 ] Ġshould Equal Ġ 0 . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Bytes [ 3 ] Ġshould Equal Ġaddress Type . code ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġresponse Bytes . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddress Bytes Ġ= Ġresponse Bytes . slice ( 4 Ġuntil Ġsize Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Bytes Ġshould Equal Ġaddress . address . toList () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġport Bytes Ġ= Ġresponse Bytes . slice ( size Ġ- Ġ 2 Ġuntil Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Bytes ĠshouldBe Ġport . to Port Bytes (). toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" when Ġnot Ġconnected " Ġ- Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" write Ġreject Ġresponse " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor All ( socket Table ) Ġ{ Ġaddress : ĠInet Address , Ġaddress Type : ĠAddress Type , Ġport : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Data Ġ= ĠS ocks 5 Request Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Ġ= Ġaddress , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= Ġport , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Ġ= ĠCommand . CONNECT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbyte Channel Ġ= ĠByte Channel Mock ( listOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsock s 5 Handshake . write Response ( byte Channel , Ġfalse , Ġrequest Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Bytes Ġ= Ġbyte Channel . out Buffers . first () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Bytes [ 0 ] Ġshould Equal Ġ 0 x 0 5 . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Bytes [ 1 ] Ġshould Equal ĠS ocks 5 Handshake . Response . FAILURE . code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Bytes [ 2 ] Ġshould Equal Ġ 0 . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Bytes [ 3 ] Ġshould Equal Ġaddress Type . code ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġresponse Bytes . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddress Bytes Ġ= Ġresponse Bytes . slice ( 4 Ġuntil Ġsize Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Bytes Ġshould Equal Ġaddress . address . toList () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġport Bytes Ġ= Ġresponse Bytes . slice ( size Ġ- Ġ 2 Ġuntil Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Bytes ĠshouldBe Ġport . to Port Bytes (). toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ