CVE-2019-3824 ldb: Release ldb 1.2.4
[Samba.git] / lib / ldb / _ldb_text.py
blobf6f1ac06fa7a4d4f95149f9619b63ede59a42260
1 # Text wrapper for ldb bindings
3 # Copyright (C) 2015 Petr Viktorin <pviktori@redhat.com>
4 # Published under the GNU LGPLv3 or later
6 import sys
7 import functools
9 import ldb
12 def _recursive_encode(obj):
13 if isinstance(obj, bytes):
14 return obj
15 elif isinstance(obj, str):
16 return obj.encode('utf-8')
17 else:
18 return [_recursive_encode(o) for o in obj]
21 class _WrapBase(object):
23 @classmethod
24 def _wrap(cls, wrapped):
25 self = cls.__new__(cls)
26 self._wrapped = wrapped
27 return self
29 def __len__(self):
30 return len(self._wrapped)
32 def __eq__(self, other):
33 if hasattr(other, '_wrapped'):
34 return self._wrapped == other._wrapped
35 else:
36 return self._wrapped == other
38 def __ne__(self, other):
39 if hasattr(other, '_wrapped'):
40 return self._wrapped != other._wrapped
41 else:
42 return self._wrapped != other
44 def __lt__(self, other):
45 if hasattr(other, '_wrapped'):
46 return self._wrapped < other._wrapped
47 else:
48 return self._wrapped < other
50 def __le__(self, other):
51 if hasattr(other, '_wrapped'):
52 return self._wrapped >= other._wrapped
53 else:
54 return self._wrapped >= other
56 def __gt__(self, other):
57 if hasattr(other, '_wrapped'):
58 return self._wrapped > other._wrapped
59 else:
60 return self._wrapped > other
62 def __ge__(self, other):
63 if hasattr(other, '_wrapped'):
64 return self._wrapped >= other._wrapped
65 else:
66 return self._wrapped >= other
68 def __repr__(self):
69 return '%s.text' % repr(self._wrapped)
72 class MessageElementTextWrapper(_WrapBase):
74 """Text interface for a LDB message element"""
76 def __iter__(self):
77 for item in self._wrapped:
78 yield item.decode('utf-8')
80 def __getitem__(self, key):
81 result = self._wrapped[key]
82 if result is None:
83 return None
84 else:
85 return result.decode('utf-8')
87 @property
88 def flags(self):
89 return self._wrapped.flags
91 @property
92 def set_flags(self):
93 return self._wrapped.set_flags
95 _wrap_element = MessageElementTextWrapper._wrap
98 class MessageTextWrapper(_WrapBase):
100 """Text interface for a LDB message"""
102 def __getitem__(self, key):
103 result = self._wrapped[key]
104 if result is None:
105 return None
106 else:
107 return _wrap_element(result)
109 def get(self, *args, **kwargs):
110 result = self._wrapped.get(*args, **kwargs)
111 if isinstance(result, ldb.MessageElement):
112 return _wrap_element(result)
113 elif isinstance(result, bytes):
114 return result.decode('utf-8')
115 else:
116 return result
118 def __setitem__(self, key, item):
119 self._wrapped[key] = _recursive_encode(item)
121 def __delitem__(self, key):
122 del self._wrapped[key]
124 def elements(self):
125 return [_wrap_element(el) for el in self._wrapped.elements()]
127 def items(self):
128 return [(attr, _wrap_element(el)) for attr, el in self._wrapped.items()]
130 @property
131 def keys(self):
132 return self._wrapped.keys
134 @property
135 def remove(self):
136 return self._wrapped.remove
138 @property
139 def add(self):
140 return self._wrapped.add
142 @property
143 def dn(self):
144 return self._wrapped.dn
146 @dn.setter
147 def dn(self, new_value):
148 self._wrapped.dn = new_value