Exemple #1
0
    def proxy_dispatcher(self, proxy_web_socket, path):
        self.logger.log("Connection established with CLIENT")

        connection = WebSocketConnection()

        if not self.is_forced_url_no_password_server():
            connection.credentials = yield from self.get_credentials(proxy_web_socket)

            if self.authenticate(connection):
                authenticated_message = "Authenticated " + self.get_post_authentication_directions()
                yield from proxy_web_socket.send(get_json_status_response("ok", authenticated_message + "'}"))
                if self.is_open_url_server():
                    proxied_url_value = yield from self.get_proxy_url_from_client(proxy_web_socket)

                    if proxied_url_value is None:
                        return
                else:
                    proxied_url_value = self.proxied_url

                proxied_web_socket = yield from self.connect_to_proxy_server(proxied_url_value, proxy_web_socket)
                yield from self.process_arbitrary_requests(proxy_web_socket, proxied_web_socket, connection)
            else:
                auth_failed_message = "Authentication failed. Password invalid [" + connection.credentials + "]"
                yield from proxy_web_socket.send(get_json_status_response("error", auth_failed_message + "'}"))
                self.logger.log("CLIENT authentication credentials [" + connection.credentials + "] rejected.")
        else:
            proxied_url_value = self.proxied_url
            proxied_web_socket = yield from self.connect_to_proxy_server(proxied_url_value, proxy_web_socket)
            yield from self.process_arbitrary_requests(proxy_web_socket, proxied_web_socket, connection)
    def proxy_dispatcher(self, proxy_web_socket, path):
        self.logger.log("Connection established with CLIENT")

        connection = WebSocketConnection()

        if not self.is_forced_url_no_password_server():
            connection.credentials = yield from self.get_credentials(proxy_web_socket)

            if self.authenticate(connection):
                authenticated_message = "Authenticated " + self.get_post_authentication_directions()
                yield from proxy_web_socket.send(get_json_status_response("ok", authenticated_message + "'}"))
                if self.is_open_url_server():
                    proxied_url_value = yield from self.get_proxy_url_from_client(proxy_web_socket)

                    if proxied_url_value is None:
                        return
                else:
                    proxied_url_value = self.proxied_url

                proxied_web_socket = yield from self.connect_to_proxy_server(proxied_url_value, proxy_web_socket)
                yield from self.process_arbitrary_requests(proxy_web_socket, proxied_web_socket, connection)
            else:
                auth_failed_message = "Authentication failed. Password invalid [" + connection.credentials + "]"
                yield from proxy_web_socket.send(get_json_status_response("error", auth_failed_message + "'}"))
                self.logger.log("CLIENT authentication credentials [" + connection.credentials + "] rejected.")
        else:
            proxied_url_value = self.proxied_url
            proxied_web_socket = yield from self.connect_to_proxy_server(proxied_url_value, proxy_web_socket)
            yield from self.process_arbitrary_requests(proxy_web_socket, proxied_web_socket, connection)
Exemple #3
0
    def process_arbitrary_requests(self, proxy_web_socket, proxied_web_socket, connection):
        while True:
            request_for_proxy = yield from proxy_web_socket.recv()
            self.logger.log("Received request from CLIENT [" + request_for_proxy + "]")

            if self.is_close(request_for_proxy):
                self.logger.log("Received CLOSE from CLIENT [" + request_for_proxy + "]")
                return

            if self.send_prefix is not None and self.send_suffix is not None:
                request_for_proxy = self.send_prefix + request_for_proxy + self.send_suffix
            yield from self.send_to_web_socket_connection_aware(proxy_web_socket, proxied_web_socket, request_for_proxy)
            connection.request_count += 1

            if connection.request_count > self.requests_per_connection:
                connection_limit_error = "Unable to proxy request, connection exceeds config limit of [" + str(
                    self.requests_per_connection) + "] requests per connection."
                self.logger.log(connection_limit_error)
                yield from proxy_web_socket.send(get_json_status_response("error", connection_limit_error))
                return

            self.logger.log(
                "Sending request [" + str(connection.request_count) + "] to PROXIED SERVER [" + request_for_proxy + "]")
            response_from_proxy = yield from proxied_web_socket.recv()
            self.logger.log("Received response from PROXIED SERVER [" + response_from_proxy + "]")
            yield from proxy_web_socket.send(response_from_proxy)
            self.logger.log("Sending response to CLIENT [" + response_from_proxy + "]")
    def process_arbitrary_requests(self, proxy_web_socket, proxied_web_socket, connection):
        while True:
            request_for_proxy = yield from proxy_web_socket.recv()
            self.logger.log("Received request from CLIENT [" + request_for_proxy + "]")

            if self.is_close(request_for_proxy):
                self.logger.log("Received CLOSE from CLIENT [" + request_for_proxy + "]")
                return

            if self.send_prefix is not None and self.send_suffix is not None:
                request_for_proxy = self.send_prefix + request_for_proxy + self.send_suffix
            yield from self.send_to_web_socket_connection_aware(proxy_web_socket, proxied_web_socket, request_for_proxy)
            connection.request_count += 1

            if connection.request_count > self.requests_per_connection:
                connection_limit_error = "Unable to proxy request, connection exceeds config limit of [" + str(
                    self.requests_per_connection) + "] requests per connection."
                self.logger.log(connection_limit_error)
                yield from proxy_web_socket.send(get_json_status_response("error", connection_limit_error))
                return

            self.logger.log(
                "Sending request [" + str(connection.request_count) + "] to PROXIED SERVER [" + request_for_proxy + "]")
            response_from_proxy = yield from proxied_web_socket.recv()
            self.logger.log("Received response from PROXIED SERVER [" + response_from_proxy + "]")
            yield from proxy_web_socket.send(response_from_proxy)
            self.logger.log("Sending response to CLIENT [" + response_from_proxy + "]")
Exemple #5
0
 def send_to_web_socket_connection_aware(self, proxy_web_socket,
                                         proxied_web_socket,
                                         request_for_proxy):
     try:
         yield from proxied_web_socket.send(request_for_proxy)
     except websockets.exceptions.InvalidState:
         proxy_web_socket.send(
             get_json_status_response("ok", "Proxied connection closed."))
    def get_proxy_url_from_client(self, proxy_web_socket, ):
        proxied_url_json = yield from proxy_web_socket.recv()
        proxied_url_value = self.parse_destination_url(proxied_url_json)
        self.logger.log("PROXIED SERVER url received [" + proxied_url_value + "]")

        if proxied_url_value is None:
            url_missing_message = "Couldn't establish proxy. Url not provided in [" + proxied_url_json + "]"
            yield from proxy_web_socket.send(get_json_status_response("error", url_missing_message + "'}"))

        return proxied_url_value
    def connect_to_proxy_server(self, proxied_url_value, proxy_web_socket):
        try:
            proxied_web_socket = yield from websockets.connect(proxied_url_value)
        except ConnectionRefusedError:
            yield from self.respond_with_proxy_connect_error(proxied_url_value, proxy_web_socket)
            return
        self.logger.log("Established proxied connection with PROXIED SERVER [" + proxied_url_value + "]")

        connection_open_message = "Proxied connection [" + proxied_url_value + "] open for arbitrary requests.'"
        yield from proxy_web_socket.send(get_json_status_response("ok", connection_open_message))

        return proxied_web_socket
Exemple #8
0
    def get_proxy_url_from_client(
        self,
        proxy_web_socket,
    ):
        proxied_url_json = yield from proxy_web_socket.recv()
        proxied_url_value = self.parse_destination_url(proxied_url_json)
        self.logger.log("PROXIED SERVER url received [" + proxied_url_value +
                        "]")

        if proxied_url_value is None:
            url_missing_message = "Couldn't establish proxy. Url not provided in [" + proxied_url_json + "]"
            yield from proxy_web_socket.send(
                get_json_status_response("error", url_missing_message + "'}"))

        return proxied_url_value
Exemple #9
0
    def connect_to_proxy_server(self, proxied_url_value, proxy_web_socket):
        try:
            proxied_web_socket = yield from websockets.connect(
                proxied_url_value)
        except ConnectionRefusedError:
            yield from self.respond_with_proxy_connect_error(
                proxied_url_value, proxy_web_socket)
            return
        self.logger.log(
            "Established proxied connection with PROXIED SERVER [" +
            proxied_url_value + "]")

        connection_open_message = "Proxied connection [" + proxied_url_value + "] open for arbitrary requests.'"
        yield from proxy_web_socket.send(
            get_json_status_response("ok", connection_open_message))

        return proxied_web_socket
Exemple #10
0
 def respond_with_proxy_connect_error(self, proxied_url_value,
                                      proxy_web_socket):
     error_message = "Unable to connect with proxied url [" + proxied_url_value + "]. Connection closed."
     yield from proxy_web_socket.send(
         get_json_status_response("error", error_message + "'}"))
     self.logger.log(error_message)
Exemple #11
0
 def send_to_web_socket_connection_aware(self, proxy_web_socket, proxied_web_socket, request_for_proxy):
     try:
         yield from proxied_web_socket.send(request_for_proxy)
     except websockets.exceptions.InvalidState:
         proxy_web_socket.send(get_json_status_response("ok", "Proxied connection closed."))
Exemple #12
0
 def respond_with_proxy_connect_error(self, proxied_url_value, proxy_web_socket):
         error_message = "Unable to connect with proxied url [" + proxied_url_value + "]. Connection closed."
         yield from proxy_web_socket.send(get_json_status_response("error", error_message + "'}"))
         self.logger.log(error_message)