NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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)