Compare commits

...

2 commits

Author SHA1 Message Date
Benjamin Renard
cb4b8d6974 ldap: add option to disable referral following
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2022-12-09 12:33:09 +01:00
Benjamin Renard
c643fd30ac oracle: fix closing cursors 2022-12-09 12:20:01 +01:00
3 changed files with 36 additions and 14 deletions

View file

@ -60,12 +60,14 @@ class LdapServer:
con = 0 con = 0
def __init__(self, uri, dn=None, pwd=None, v2=None, def __init__(self, uri, dn=None, pwd=None, v2=None,
raiseOnError=False, logger=False, checkCert=True): raiseOnError=False, logger=False, checkCert=True,
disableReferral=False):
self.uri = uri self.uri = uri
self.dn = dn self.dn = dn
self.pwd = pwd self.pwd = pwd
self.raiseOnError = raiseOnError self.raiseOnError = raiseOnError
self.checkCert = checkCert self.checkCert = checkCert
self.disableReferral = disableReferral
if v2: if v2:
self.v2 = True self.v2 = True
if logger: if logger:
@ -85,6 +87,9 @@ class LdapServer:
if not self.checkCert: if not self.checkCert:
# pylint: disable=no-member # pylint: disable=no-member
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
if self.disableReferral:
# pylint: disable=no-member
ldap.set_option(ldap.OPT_REFERRALS, ldap.OPT_OFF)
con = ldap.initialize(self.uri) con = ldap.initialize(self.uri)
if self.v2: if self.v2:
con.protocol_version = ldap.VERSION2 # pylint: disable=no-member con.protocol_version = ldap.VERSION2 # pylint: disable=no-member
@ -468,6 +473,9 @@ class LdapClient:
section.add_option( section.add_option(
BooleanOption, 'checkcert', default=True, BooleanOption, 'checkcert', default=True,
comment='Check LDAP certificate') comment='Check LDAP certificate')
section.add_option(
BooleanOption, 'disablereferral', default=False,
comment='Disable referral following')
return section return section
@ -480,7 +488,9 @@ class LdapClient:
log.info("Connect to LDAP server %s as %s", uri, binddn if binddn else 'annonymous') log.info("Connect to LDAP server %s as %s", uri, binddn if binddn else 'annonymous')
self._conn = LdapServer( self._conn = LdapServer(
uri, dn=binddn, pwd=self._get_option('bindpwd'), uri, dn=binddn, pwd=self._get_option('bindpwd'),
checkCert=self._get_option('checkcert'), raiseOnError=True checkCert=self._get_option('checkcert'),
disableReferral=self._get_option('disablereferral'),
raiseOnError=True
) )
# Reset cache # Reset cache
self._cached_objects = {} self._cached_objects = {}

View file

@ -125,7 +125,6 @@ class OracleDB:
log.debug("Just-try mode : do not really execute SQL query '%s'", sql) log.debug("Just-try mode : do not really execute SQL query '%s'", sql)
return True return True
cursor = self._conn.cursor()
try: try:
log.debug( log.debug(
'Run SQL query "%s" %s', 'Run SQL query "%s" %s',
@ -135,6 +134,7 @@ class OracleDB:
for key, value in params.items() for key, value in params.items()
]) if params else "without params" ]) if params else "without params"
) )
with self._conn.cursor() as cursor:
if isinstance(params, dict): if isinstance(params, dict):
cursor.execute(sql, **params) cursor.execute(sql, **params)
else: else:
@ -164,7 +164,6 @@ class OracleDB:
:return: List of selected rows as dict on success, False otherwise :return: List of selected rows as dict on success, False otherwise
:rtype: list, bool :rtype: list, bool
""" """
cursor = self._conn.cursor()
try: try:
log.debug( log.debug(
'Run SQL SELECT query "%s" %s', 'Run SQL SELECT query "%s" %s',
@ -174,11 +173,14 @@ class OracleDB:
for key, value in params.items() for key, value in params.items()
]) if params else "without params" ]) if params else "without params"
) )
with self._conn.cursor() as cursor:
if isinstance(params, dict): if isinstance(params, dict):
cursor.execute(sql, **params) cursor.execute(sql, **params)
else: else:
cursor.execute(sql) cursor.execute(sql)
cursor.rowfactory = lambda *args: dict(zip([d[0] for d in cursor.description], args)) cursor.rowfactory = lambda *args: dict(
zip([d[0] for d in cursor.description], args)
)
results = cursor.fetchall() results = cursor.fetchall()
return results return results
except Exception: except Exception:

View file

@ -15,8 +15,10 @@ class FakeCXOracleCursor:
self.expected_return = expected_return self.expected_return = expected_return
self.expected_just_try = expected_just_try self.expected_just_try = expected_just_try
self.expected_exception = expected_exception self.expected_exception = expected_exception
self.opened = True
def execute(self, sql, **params): def execute(self, sql, **params):
assert self.opened
if self.expected_exception: if self.expected_exception:
raise Exception("%s.execute(%s, %s): expected exception" % (self, sql, params)) raise Exception("%s.execute(%s, %s): expected exception" % (self, sql, params))
if self.expected_just_try and not sql.lower().startswith('select '): if self.expected_just_try and not sql.lower().startswith('select '):
@ -26,8 +28,16 @@ class FakeCXOracleCursor:
return self.expected_return return self.expected_return
def fetchall(self): def fetchall(self):
assert self.opened
return self.expected_return return self.expected_return
def __enter__(self):
self.opened = True
return self
def __exit__(self, *args):
self.opened = False
def __repr__(self): def __repr__(self):
return "FakeCXOracleCursor(%s, %s, %s, %s)" % ( return "FakeCXOracleCursor(%s, %s, %s, %s)" % (
self.expected_sql, self.expected_params, self.expected_sql, self.expected_params,