From 926e0f4377768d96b8acb42c33df0f24aa7b4d66 Mon Sep 17 00:00:00 2001 From: LUNEXTLABS Tobi Date: Mon, 30 Oct 2023 09:55:25 +0100 Subject: [PATCH 1/2] very basic imlementation of handling HTTP basic auth --- odoorpc/odoo.py | 9 ++++++++- odoorpc/rpc/__init__.py | 7 +++++-- odoorpc/rpc/jsonrpclib.py | 15 ++++++++++++--- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/odoorpc/odoo.py b/odoorpc/odoo.py index c86df55..96cd86a 100644 --- a/odoorpc/odoo.py +++ b/odoorpc/odoo.py @@ -65,6 +65,7 @@ def __init__( timeout=120, version=None, opener=None, + basic_auth=None, ): if protocol not in ['jsonrpc', 'jsonrpc+ssl']: txt = ( @@ -90,10 +91,16 @@ def __init__( self._password = None self._db = DB(self) self._report = Report(self) + if basic_auth and len(basic_auth) == 3: + # print("using basic auth with:") + # print(basic_auth[0], basic_auth[1], basic_auth[2]) + self._basic_auth = basic_auth + else: + self._basic_auth = None # Instanciate the server connector try: self._connector = rpc.PROTOCOLS[protocol]( - self._host, self._port, timeout, version, opener=opener + self._host, self._port, self._basic_auth, timeout, version, opener=opener ) except rpc.error.ConnectorError as exc: raise error.InternalError(exc.message) diff --git a/odoorpc/rpc/__init__.py b/odoorpc/rpc/__init__.py index ecceace..5b75480 100644 --- a/odoorpc/rpc/__init__.py +++ b/odoorpc/rpc/__init__.py @@ -195,6 +195,7 @@ def __init__( self, host, port=8069, + basic_auth=None, timeout=120, version=None, deserialize=True, @@ -208,9 +209,9 @@ def __init__( cookie_jar = CookieJar() opener = build_opener(HTTPCookieProcessor(cookie_jar)) self._opener = opener - self._proxy_json, self._proxy_http = self._get_proxies() + self._proxy_json, self._proxy_http = self._get_proxies(basic_auth) - def _get_proxies(self): + def _get_proxies(self, basic_auth): """Returns the :class:`ProxyJSON ` and :class:`ProxyHTTP ` instances corresponding to the server version used. @@ -218,6 +219,7 @@ def _get_proxies(self): proxy_json = jsonrpclib.ProxyJSON( self.host, self.port, + basic_auth, self._timeout, ssl=self.ssl, deserialize=self.deserialize, @@ -226,6 +228,7 @@ def _get_proxies(self): proxy_http = jsonrpclib.ProxyHTTP( self.host, self.port, + basic_auth, self._timeout, ssl=self.ssl, opener=self._opener, diff --git a/odoorpc/rpc/jsonrpclib.py b/odoorpc/rpc/jsonrpclib.py index c0350a7..da4af31 100644 --- a/odoorpc/rpc/jsonrpclib.py +++ b/odoorpc/rpc/jsonrpclib.py @@ -8,6 +8,9 @@ import random import sys +import urllib.request +from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler + # Python 2 if sys.version_info[0] < 3: from cookielib import CookieJar @@ -61,16 +64,22 @@ def get_json_log_data(data): class Proxy(object): """Base class to implement a proxy to perform requests.""" - def __init__(self, host, port, timeout=120, ssl=False, opener=None): + def __init__(self, host, port, basic_auth, timeout=120, ssl=False, opener=None): self._root_url = "{http}{host}:{port}".format( http=(ssl and "https://" or "http://"), host=host, port=port ) + self._basic_auth = basic_auth self._timeout = timeout self._builder = URLBuilder(self) self._opener = opener if not opener: cookie_jar = CookieJar() self._opener = build_opener(HTTPCookieProcessor(cookie_jar)) + if self._basic_auth: + passman = HTTPPasswordMgrWithDefaultRealm() + passman.add_password(None, self._basic_auth[0], self._basic_auth[1], self._basic_auth[2]) + self._opener.add_handler(HTTPBasicAuthHandler(passman)) + # print("opener added basicauth handler for ", self._basic_auth[0], self._basic_auth[1], self._basic_auth[2]) def __getattr__(self, name): return getattr(self._builder, name) @@ -88,9 +97,9 @@ class ProxyJSON(Proxy): """ def __init__( - self, host, port, timeout=120, ssl=False, opener=None, deserialize=True + self, host, port, basic_auth, timeout=120, ssl=False, opener=None, deserialize=True ): - Proxy.__init__(self, host, port, timeout, ssl, opener) + Proxy.__init__(self, host, port, basic_auth, timeout, ssl, opener) self._deserialize = deserialize def __call__(self, url, params=None): From efbf104ac2b529b1c55af57dd0d17b29f2ffdd24 Mon Sep 17 00:00:00 2001 From: LUNEXTLABS Tobi Date: Mon, 30 Oct 2023 10:10:26 +0100 Subject: [PATCH 2/2] some cleanup --- odoorpc/odoo.py | 9 +++------ odoorpc/rpc/jsonrpclib.py | 3 +-- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/odoorpc/odoo.py b/odoorpc/odoo.py index 96cd86a..5f1f378 100644 --- a/odoorpc/odoo.py +++ b/odoorpc/odoo.py @@ -91,12 +91,9 @@ def __init__( self._password = None self._db = DB(self) self._report = Report(self) - if basic_auth and len(basic_auth) == 3: - # print("using basic auth with:") - # print(basic_auth[0], basic_auth[1], basic_auth[2]) - self._basic_auth = basic_auth - else: - self._basic_auth = None + self._basic_auth = basic_auth + if self._basic_auth and len(self._basic_auth) != 3: + raise ValueError("basic_auth needs to be tuple with localhost, user, pw") # Instanciate the server connector try: self._connector = rpc.PROTOCOLS[protocol]( diff --git a/odoorpc/rpc/jsonrpclib.py b/odoorpc/rpc/jsonrpclib.py index da4af31..bfefa10 100644 --- a/odoorpc/rpc/jsonrpclib.py +++ b/odoorpc/rpc/jsonrpclib.py @@ -64,7 +64,7 @@ def get_json_log_data(data): class Proxy(object): """Base class to implement a proxy to perform requests.""" - def __init__(self, host, port, basic_auth, timeout=120, ssl=False, opener=None): + def __init__(self, host, port, basic_auth=None, timeout=120, ssl=False, opener=None): self._root_url = "{http}{host}:{port}".format( http=(ssl and "https://" or "http://"), host=host, port=port ) @@ -79,7 +79,6 @@ def __init__(self, host, port, basic_auth, timeout=120, ssl=False, opener=None): passman = HTTPPasswordMgrWithDefaultRealm() passman.add_password(None, self._basic_auth[0], self._basic_auth[1], self._basic_auth[2]) self._opener.add_handler(HTTPBasicAuthHandler(passman)) - # print("opener added basicauth handler for ", self._basic_auth[0], self._basic_auth[1], self._basic_auth[2]) def __getattr__(self, name): return getattr(self._builder, name)