From 4b9b84599bc5b24e95f83d2c1c849d400765ca73 Mon Sep 17 00:00:00 2001 From: Florian Best Date: Sat, 30 Mar 2019 09:35:14 +0100 Subject: [PATCH 1/2] Add ldap.filter.is_filter() which checks filter syntax --- Lib/ldap/filter.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Lib/ldap/filter.py b/Lib/ldap/filter.py index 782737aa..e95b5559 100644 --- a/Lib/ldap/filter.py +++ b/Lib/ldap/filter.py @@ -87,3 +87,21 @@ def time_span_filter( until_timestr=strf_secs(until_timestamp), ) # end of time_span_filter() + + +def is_filter(ldap_filter): + """ + Returns True if `ldap_filter' can be parsed as a valid LDAP filter, otherwise False is returned. + """ + import ldap + lo = ldap.initialize('') + try: + lo.search_ext_s('', ldap.SCOPE_BASE, ldap_filter) + except (ldap.FILTER_ERROR, TypeError, ValueError): + return False + except ldap.SERVER_DOWN: + # the filter syntax is valid, as the connection is not bound we expect SERVER_DOWN here + return True + finally: + lo.unbind() + raise RuntimeError('Could not check filter syntax.') # can not happen From 869809d70213a9ff5b911c87a5eee35a9ace53e4 Mon Sep 17 00:00:00 2001 From: Florian Best Date: Sat, 30 Mar 2019 09:46:07 +0100 Subject: [PATCH 2/2] Implement test cases for ldap.filter.is_filter() --- Tests/t_ldap_filter.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/Tests/t_ldap_filter.py b/Tests/t_ldap_filter.py index 313b3733..972d9bf0 100644 --- a/Tests/t_ldap_filter.py +++ b/Tests/t_ldap_filter.py @@ -10,7 +10,7 @@ # Switch off processing .ldaprc or ldap.conf before importing _ldap os.environ['LDAPNOINIT'] = '1' -from ldap.filter import escape_filter_chars +from ldap.filter import escape_filter_chars, is_filter, filter_format class TestDN(unittest.TestCase): @@ -18,6 +18,27 @@ class TestDN(unittest.TestCase): test ldap.functions """ + def test_is_filter(self): + """ + test function is_filter() + """ + self.assertEqual(is_filter(''), True) + self.assertEqual(is_filter('foo='), True) + self.assertEqual(is_filter('foo=bar'), True) + self.assertEqual(is_filter('foo=*'), True) + self.assertEqual(is_filter(filter_format('foo=%s', ['*'])), True) + self.assertEqual(is_filter('(foo=bar)'), True) + self.assertEqual(is_filter('(&(foo=bar))'), True) + self.assertEqual(is_filter('(|(foo=bar))'), True) + self.assertEqual(is_filter('foo>='), True) + self.assertEqual(is_filter('(foo>=)'), True) + self.assertEqual(is_filter('foo==bar'), True) + self.assertEqual(is_filter('foobar'), False) + self.assertEqual(is_filter('(foo='), False) + self.assertEqual(is_filter('foo=)'), False) + self.assertEqual(is_filter('=bar'), False) + self.assertEqual(is_filter('foo=\x00'), False) + def test_escape_filter_chars_mode0(self): """ test function escape_filter_chars() with escape_mode=0 pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy