bannedwords_regexes.py (3023B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\bannedwords\bannedwords_regexes.py 2 import re 3 import blue 4 from eveexceptions import UserError 5 import logging 6 from bannedwords.bannedwords_marker_stripper import format_stripper 7 MAX_CHECK_LENGTH = 200 8 OVERLAPPING_CHOP = 20 9 10 class Regexes: 11 12 def __init__(self, fetch_method, reg_type): 13 self.regex_list = [] 14 self.pattern_list = [] 15 self.reg_type = reg_type 16 self.fetch_method = fetch_method 17 self._logger = logging.getLogger('bannedwords.regexes') 18 19 def fetch_and_compile(self): 20 self._logger.info('fetching regexes for banned words...') 21 try: 22 result = self.fetch_method(self.reg_type) 23 except Exception as e: 24 self._logger.exception('Failed getting banned words from external server %s', str(e)) 25 return 26 27 self._logger.info('done fetching %s regexes for banned words about to compile', len(result)) 28 self.update_compile(result, self.reg_type) 29 30 def update_compile(self, reg_list, regex_type): 31 if not reg_list: 32 return 33 if len(reg_list) > 0: 34 deleted = [ d['hash'] for d in self.regex_list if d not in reg_list ] 35 added = [ a for a in reg_list if a not in self.regex_list ] 36 for r in self.regex_list: 37 if r['hash'] in deleted: 38 self.regex_list.remove(r) 39 40 for p in self.pattern_list: 41 if p['hash'] in deleted: 42 self.pattern_list.remove(p) 43 44 number_added = len(added) 45 for idx, new in enumerate(added): 46 reg = new['regex'] 47 hash = new['hash'] 48 try: 49 pattern = re.compile(reg) 50 except: 51 self._logger.error('[banned words] Failed to compile regex %s', reg) 52 53 if pattern: 54 self.regex_list.append(new) 55 self.pattern_list.append({'hash': hash, 56 'pattern': pattern}) 57 self._logger.info('done compiling %s of %s', idx + 1, number_added) 58 59 self._logger.info('done compiling regexes') 60 61 def filter_and_slice_words(self, words): 62 filtered_words = format_stripper(words) 63 str_l = len(filtered_words) 64 if str_l > MAX_CHECK_LENGTH: 65 return [ filtered_words[i:i + MAX_CHECK_LENGTH] for i in range(0, str_l, MAX_CHECK_LENGTH - OVERLAPPING_CHOP) ] 66 return [filtered_words] 67 68 def check_words_allowed(self, words, err_message = 'LocationNameInvalidBannedWord'): 69 if not words: 70 return 71 if not self.pattern_list: 72 raise UserError('BannedWordsDown') 73 words_list = self.filter_and_slice_words(words) 74 for w in words_list: 75 for p in self.pattern_list: 76 blue.pyos.BeNice() 77 if p['pattern'].search(w) is not None: 78 raise UserError(err_message)