133 lines
5.9 KiB
Ruby
133 lines
5.9 KiB
Ruby
require 'socket'
|
|
require './http.rb'
|
|
require 'time'
|
|
|
|
class FakeTunnelConnector
|
|
attr_accessor :port, :server, :ssl_context
|
|
|
|
CRLF = "\r\n".freeze
|
|
|
|
def initialize(port, ssl_context = nil)
|
|
@port = port
|
|
@server = TCPServer.open(port)
|
|
@ssl_context = ssl_context
|
|
end
|
|
|
|
def listen_and_respond
|
|
if ssl_context
|
|
tls_server = ssl_server
|
|
tcp_socket = tls_server.accept
|
|
else
|
|
tcp_socket = server.accept
|
|
end
|
|
response = read_socket(tcp_socket)
|
|
location = response[:start_line][:location]
|
|
write_response(tcp_socket, location)
|
|
close_connection(tcp_socket)
|
|
end
|
|
|
|
def ssl_server
|
|
OpenSSL::SSL::SSLServer.new server, ssl_context if ssl_context
|
|
end
|
|
|
|
def read_socket(tcp_socket)
|
|
start_line = []
|
|
headers = []
|
|
puts 'Request Incoming:'
|
|
puts '-------------------'
|
|
# read lines from socket
|
|
while (line = tcp_socket.gets) && (line.chomp.length > 0)
|
|
# check for a valid http verb sent
|
|
start_line = parse_http_start_request_line(line) if Http::METHODS.include?(line.split.first)
|
|
header_line = parse_http_header_request_line(line)
|
|
headers << header_line unless header_line.nil?
|
|
end
|
|
puts start_line
|
|
puts 'Request Headers:'
|
|
puts '-------------------'
|
|
puts headers
|
|
puts CRLF
|
|
{ start_line: start_line, headers: headers }
|
|
end
|
|
|
|
def parse_http_start_request_line(line)
|
|
split_request = line.split
|
|
verb = split_request.first
|
|
location = split_request.select { |l| l if l.start_with?('/') }.first
|
|
protocol = split_request.last
|
|
{
|
|
verb: verb,
|
|
location: location,
|
|
protocol: protocol
|
|
}
|
|
end
|
|
|
|
def parse_http_header_request_line(line)
|
|
if line.split.first.end_with?(':')
|
|
split_request = line.split(':')
|
|
key = split_request[0]
|
|
value = if split_request.count >= 3
|
|
split_request[1] + ':' + split_request[2]
|
|
else
|
|
split_request[1]
|
|
end
|
|
Hash[key, value]
|
|
end
|
|
end
|
|
|
|
def write_response(tcp_socket, location)
|
|
routed_response_string = route_request(location)
|
|
body = ok(routed_response_string)
|
|
tcp_socket.puts(ok_headers)
|
|
tcp_socket.puts(body)
|
|
end
|
|
|
|
def close_connection(tcp_socket)
|
|
tcp_socket.close
|
|
end
|
|
|
|
def ok(body = 'Success')
|
|
body
|
|
end
|
|
|
|
def ok_headers
|
|
"HTTP/1.1 200 OK#{CRLF}" +
|
|
"Date: #{Time.now.utc}#{CRLF}" +
|
|
CRLF
|
|
end
|
|
|
|
def route_request(location)
|
|
if location == '/scans'
|
|
scans
|
|
elsif location == '/session'
|
|
login
|
|
else
|
|
ok
|
|
end
|
|
end
|
|
|
|
def scans
|
|
body = '{
|
|
"folders":[
|
|
{"unread_count":0,"custom":0,"default_tag":0,"type":"trash","name":"Trash","id":821},
|
|
{"unread_count":4,"custom":0,"default_tag":1,"type":"main","name":"My Scans","id":822}
|
|
],
|
|
"scans":[
|
|
{"id":851, "name":"Virtual Tunnel Scan File 1", "folder_id":822,"type":"local","read":false,"last_modification_date":1487137935,"creation_date":1487137921,"status":"completed","uuid":"5afd0023-977a-9124-2638-f14d0958677672812a5da3529d5f","shared":false,"user_permissions":128,"owner":"bmcdevitt","timezone":"Zulu","rrules":"FREQ=ONETIME","starttime":"20170202T160000","enabled":true,"control":true},
|
|
{"id":889, "name":"Virtual Tunnel Scan File 2", "folder_id":822,"type":"local","read":false,"last_modification_date":1487017337,"creation_date":1487017329,"status":"completed","uuid":"0efb416d-bf92-92a6-ec3b-fb309c0a100d9cc9c3d05cb8d15c","shared":false,"user_permissions":128,"owner":"bmcdevitt","timezone":null,"rrules":null,"starttime":null,"enabled":true,"control":true},
|
|
{"id":832, "name":"Virtual Tunnel Scan File 3", "folder_id":822,"type":"local","read":false,"last_modification_date":1486158311,"creation_date":1486156633,"status":"completed","uuid":"e96a9447-c500-a02c-b321-aaa54243ea83668c7d3bec760ead","shared":false,"user_permissions":128,"owner":"bmcdevitt","timezone":null,"rrules":null,"starttime":null,"enabled":true,"control":true},
|
|
{"id":834, "name":"Virtual Tunnel Scan File 4", "folder_id":822,"type":"local","read":false,"last_modification_date":1486156549,"creation_date":1486156540,"status":"completed","uuid":"fe3c45b9-e17c-748f-85e2-f6529e7c997fcc048b683781b8fc","shared":false,"user_permissions":128,"owner":"bmcdevitt","timezone":null,"rrules":null,"starttime":null,"enabled":true,"control":true},
|
|
{"id":835, "name":"Virtual Tunnel Scan File 5", "folder_id":822,"type":"local","read":false,"last_modification_date":1486156549,"creation_date":1486156540,"status":"completed","uuid":"f4170000-e17c-748f-85e2-f6529e7c997fcc048b683781b8fc","shared":false,"user_permissions":128,"owner":"bmcdevitt","timezone":null,"rrules":null,"starttime":null,"enabled":true,"control":true},
|
|
{"id":823, "name":"Virtual Tunnel Scan File 6", "folder_id":821,"type":"local","read":true,"last_modification_date":1480977444,"creation_date":1480977430,"status":"completed","uuid":"bf1d0958-5a67-f413-dffd-35131927f5084ad38817344c69ef","shared":false,"user_permissions":128,"owner":"bmcdevitt","timezone":null,"rrules":null,"starttime":null,"enabled":false,"control":true},
|
|
{"id":826, "name":"Virtual Tunnel Scan File 7", "folder_id":821,"type":"local","read":true,"last_modification_date":1480976737,"creation_date":1480974579,"status":"completed","uuid":"60f7f497-4f3b-e3a8-6364-72a6f763d20b2da84f89010c7883","shared":false,"user_permissions":128,"owner":"bmcdevitt","timezone":null,"rrules":null,"starttime":null,"enabled":false,"control":true},
|
|
{"id":873, "name":"Virtual Tunnel Scan File 8", "folder_id":821,"type":null,"read":true,"last_modification_date":0,"creation_date":0,"status":"empty","uuid":null,"shared":false,"user_permissions":128,"owner":"bmcdevitt","timezone":null,"rrules":null,"starttime":null,"enabled":false,"control":true}
|
|
],
|
|
"timestamp":1487197426}'
|
|
ok(body)
|
|
end
|
|
|
|
def login
|
|
body = '{"token":"3b51619a125d90cd0778bd4c02cd7be34de6dc9268eecd25"}'
|
|
ok(body)
|
|
end
|
|
end
|