gitee.com/h79/goutils@v1.22.10/sensitive/sensitive.go (about) 1 // ζζθ―εΊ 2 3 package sensitive 4 5 import ( 6 "encoding/json" 7 "errors" 8 "gitee.com/h79/goutils/common/logger" 9 "gitee.com/h79/goutils/common/option" 10 "io" 11 "net/http" 12 "sync" 13 "time" 14 ) 15 16 func WithRegexOpt() option.Option { 17 return option.WithOpt(true, "", 1) 18 } 19 20 func WithDefaultGroupOpt() option.Option { 21 return option.WithOpt(true, "", 2) 22 } 23 24 type SensMgr struct { 25 locker sync.RWMutex 26 filterMap map[string]*Filter 27 } 28 29 const DefaultGroup = "def" 30 31 func NewMgr(opts ...option.Option) *SensMgr { 32 m := &SensMgr{ 33 filterMap: make(map[string]*Filter), 34 } 35 if option.Select(2, true, opts...) { 36 m.Add(DefaultGroup) 37 } 38 return m 39 } 40 41 func (m *SensMgr) Add(group string, opts ...option.Option) *Filter { 42 m.locker.Lock() 43 if filter, ok := m.filterMap[group]; ok { 44 m.locker.Unlock() 45 return filter 46 } 47 filter := New(option.Select(1, false, opts...)) 48 m.filterMap[group] = filter 49 m.locker.Unlock() 50 return filter 51 } 52 53 func (m *SensMgr) Get(group string) *Filter { 54 m.locker.RLock() 55 if filter, ok := m.filterMap[group]; ok { 56 m.locker.RUnlock() 57 return filter 58 } 59 m.locker.RUnlock() 60 return nil 61 } 62 63 func (m *SensMgr) Load(group string, path string) error { 64 filter := m.Add(group) 65 if filter == nil { 66 return errors.New("filter not exist") 67 } 68 if err := filter.LoadWordDict(path); err != nil { 69 logger.Error("sensitive load, path= '%s'", path) 70 return err 71 } 72 return nil 73 } 74 75 func (m *SensMgr) LoadNetworkFileByGroup(group string, url string) error { 76 filter := m.Add(group) 77 if filter == nil { 78 return errors.New("filter not exist") 79 } 80 if err := filter.LoadWordDictByNetworkFile(url); err != nil { 81 logger.Error("sensitive load, url= '%s'", url) 82 return err 83 } 84 return nil 85 } 86 87 // LoadUrl 88 // {"code":200,"data":{"title":[],"":[]}} 89 90 func (m *SensMgr) LoadUrl(url string) error { 91 92 c := http.Client{ 93 Timeout: 5 * time.Second, 94 } 95 rsp, err := c.Get(url) 96 if err != nil { 97 logger.E("sensitive", "Loaded url=%s, err=%+v", url, err) 98 return err 99 } 100 defer rsp.Body.Close() 101 102 out, er := io.ReadAll(rsp.Body) 103 if er != nil { 104 logger.E("sensitive", "read url=%s, err=%+v", url, er) 105 return err 106 } 107 logger.N("sensitive", "data=%v ", logger.Byte2(logger.NDebugLevel, out)) 108 type Result struct { 109 Code int `json:"code"` 110 Data map[string][]string `json:"data"` 111 } 112 d := Result{} 113 if er = json.Unmarshal(out, &d); er != nil { 114 logger.E("sensitive", "read url=%s, err=%+v", url, er) 115 return err 116 } 117 for k, v := range d.Data { 118 filter := m.Add(k) 119 filter.AddWord(v...) 120 } 121 return nil 122 }