def initialize(username, password, address)
@socket = connect_to_server(address)
begin
@channel = MessageChannel.new(@socket)
result = @channel.read
if result.nil?
raise EOFError
elsif result.size != 2 || result[0] != "version"
raise IOError, "The message server didn't sent a valid version identifier"
elsif result[1] != "1"
raise IOError, "Unsupported message server protocol version #{result[1]}"
end
@channel.write_scalar(username)
@channel.write_scalar(password)
result = @channel.read
if result.nil?
raise EOFError
elsif result[0] != "status"
raise ProtocolError, "Invalid authentication response: expected \"status\", got #{result[0].inspect}"
elsif result[1] == "ok"
elsif result[1] == "error"
if result[2]
raise SecurityError, "Authentication error: #{result[2]}"
else
raise SecurityError, "Authentication error (no server message given)"
end
else
raise ProtocolError, "Invalid authentication response: #{result.inspect}"
end
rescue Exception
@socket.close
raise
end
end