| @@ -20,6 +20,7 @@ | |||||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| # SOFTWARE. | # SOFTWARE. | ||||
| from fnmatch import fnmatch | |||||
| import sqlite3 as sqlite | import sqlite3 as sqlite | ||||
| from threading import Lock | from threading import Lock | ||||
| @@ -53,7 +54,7 @@ class PermissionsDB(object): | |||||
| """Return True if the given user has the given rank, else False.""" | """Return True if the given user has the given rank, else False.""" | ||||
| try: | try: | ||||
| for rule in self._data[rank]: | for rule in self._data[rank]: | ||||
| if user == rule: | |||||
| if user in rule: | |||||
| return True | return True | ||||
| except KeyError: | except KeyError: | ||||
| return False | return False | ||||
| @@ -114,29 +115,9 @@ class _User(object): | |||||
| """Return a nice string representation of the User.""" | """Return a nice string representation of the User.""" | ||||
| return "{0}!{1}@{2}".format(self.nick, self.ident, self.host) | return "{0}!{1}@{2}".format(self.nick, self.ident, self.host) | ||||
| def __eq__(self, user): | |||||
| if self._compare(self.nick, user.nick): | |||||
| if self._compare(self.ident, user.ident): | |||||
| if self._compare(self.host, user.host): | |||||
| def __contains__(self, user): | |||||
| if fnmatch(user.nick, self.nick): | |||||
| if fnmatch(user.ident, self.ident): | |||||
| if fnmatch(user.host, self.host): | |||||
| return True | return True | ||||
| return False | return False | ||||
| def __ne__(self, user): | |||||
| return not self == user | |||||
| def _compare(self, field1, field2): | |||||
| if field1 == "*" or field2 == "*": | |||||
| return True | |||||
| if "*" in field1: | |||||
| regex = re.escape(field1).replace(r"\*", r".*?") + "$" | |||||
| if re.match(regex, field2, re.I): | |||||
| if "*" in field2: | |||||
| regex = re.escape(field2).replace(r"\*", r".*?") + "$" | |||||
| return re.match(regex, field1, re.I) | |||||
| return True | |||||
| else: | |||||
| return False | |||||
| elif "*" in field2: | |||||
| regex = re.escape(field2).replace(r"\*", r".*?") + "$" | |||||
| return re.match(regex, field1, re.I) | |||||
| return field1 == field2 | |||||