censor_bear 0.1.7 → 0.1.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/app/controllers/censor_bear/logs_controller.rb +17 -14
- data/app/controllers/censor_bear/mod_logs_controller.rb +30 -10
- data/app/views/censor_bear/logs/_log.html.haml +37 -32
- data/app/views/censor_bear/logs/destroy.turbo_stream.haml +1 -0
- data/app/views/censor_bear/logs/index.html.haml +2 -2
- data/app/views/censor_bear/mod_logs/_mod_log.html.haml +45 -0
- data/app/views/censor_bear/mod_logs/destroy.turbo_stream.haml +1 -0
- data/app/views/censor_bear/mod_logs/index.html.haml +18 -0
- data/config/locales/censor_bear.yml +23 -1
- data/db/migrate/20211208041114_add_labels_to_censor_bear_logs.rb +6 -0
- data/lib/censor_bear/censor.rb +74 -12
- data/lib/censor_bear/configuration.rb +4 -0
- data/lib/censor_bear/engine.rb +8 -0
- data/lib/censor_bear/version.rb +1 -1
- data/lib/censor_bear.rb +7 -1
- metadata +31 -13
- data/app/views/censor_bear/mod_logs/index.html.erb +0 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a5519d5695908f0b7d3316070221bb2350da7d5869d7c6f8f202d1cb5d3a903
|
4
|
+
data.tar.gz: aa507b18784d4472427dad1c694f1cf1a552b957c54ef89d66fd1e57faa73403
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b1b68d93591c793a14c52d19c8fdbadf601adb5c2c24ce7575f3da001bf8922e6ee074e2ee5f3873005fdb8c620dfc50f5d6527f9b646573d190f8823470a592
|
7
|
+
data.tar.gz: 5763a681a0dc9c7dcb813ccf6b8f997e8df5ea782fc64c928d6dd04d870ef5c46a5e662ad4de0e2b9f4b4da341b6f11be4fd7044c6c04afe1f69d0e542384e29
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@ require_dependency "censor_bear/application_controller"
|
|
2
2
|
|
3
3
|
module CensorBear
|
4
4
|
class LogsController < ApplicationController
|
5
|
-
before_action :set_log, only: [
|
5
|
+
before_action :set_log, only: %i[show edit update destroy]
|
6
6
|
|
7
7
|
# GET /logs
|
8
8
|
def index
|
@@ -45,7 +45,11 @@ module CensorBear
|
|
45
45
|
# DELETE /logs/1
|
46
46
|
def destroy
|
47
47
|
@log.destroy
|
48
|
-
|
48
|
+
|
49
|
+
respond_to do |format|
|
50
|
+
format.turbo_stream
|
51
|
+
format.html { redirect_to logs_url, notice: 'Log was successfully destroyed.' }
|
52
|
+
end
|
49
53
|
end
|
50
54
|
|
51
55
|
def load_logs
|
@@ -56,21 +60,20 @@ module CensorBear
|
|
56
60
|
@pagy, @logs = pagy(builder)
|
57
61
|
end
|
58
62
|
|
59
|
-
|
60
63
|
private
|
61
64
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
65
|
+
# Use callbacks to share common setup or constraints between actions.
|
66
|
+
def set_log
|
67
|
+
@log = Log.find(params[:id])
|
68
|
+
end
|
66
69
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
+
def log_scope
|
71
|
+
Log
|
72
|
+
end
|
70
73
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
74
|
+
# Only allow a list of trusted parameters through.
|
75
|
+
def log_params
|
76
|
+
params.require(:log).permit(:original_content, :action, :filtered_content, :mod_words)
|
77
|
+
end
|
75
78
|
end
|
76
79
|
end
|
@@ -2,10 +2,11 @@ require_dependency "censor_bear/application_controller"
|
|
2
2
|
|
3
3
|
module CensorBear
|
4
4
|
class ModLogsController < ApplicationController
|
5
|
-
before_action :set_mod_log, only: [
|
5
|
+
before_action :set_mod_log, only: %i[show edit update destroy ignore approve ban delete]
|
6
6
|
|
7
7
|
# GET /mod_logs
|
8
8
|
def index
|
9
|
+
load_mod_logs
|
9
10
|
@mod_logs = ModLog.pending.all
|
10
11
|
end
|
11
12
|
|
@@ -45,9 +46,14 @@ module CensorBear
|
|
45
46
|
# DELETE /mod_logs/1
|
46
47
|
def destroy
|
47
48
|
@mod_log.destroy
|
48
|
-
|
49
|
+
|
50
|
+
respond_to do |format|
|
51
|
+
format.turbo_stream
|
52
|
+
format.html { redirect_to mod_logs_url, notice: 'Mod log was successfully destroyed.' }
|
53
|
+
end
|
49
54
|
end
|
50
55
|
|
56
|
+
|
51
57
|
def ignore
|
52
58
|
@mod_log.suspend!
|
53
59
|
|
@@ -73,15 +79,29 @@ module CensorBear
|
|
73
79
|
redirect_to mod_logs_url, notice: 'successfully baned.'
|
74
80
|
end
|
75
81
|
|
82
|
+
def load_mod_logs
|
83
|
+
builder ||= mod_log_scope
|
84
|
+
builder = builder.where("content ilike ?", "%#{params[:q]}%") if params[:q].present?
|
85
|
+
|
86
|
+
builder = builder.order(id: :desc)
|
87
|
+
|
88
|
+
@pagy, @logs = pagy(builder)
|
89
|
+
end
|
90
|
+
|
76
91
|
private
|
77
|
-
# Use callbacks to share common setup or constraints between actions.
|
78
|
-
def set_mod_log
|
79
|
-
@mod_log = ModLog.find(params[:id] || params[:mod_log_id])
|
80
|
-
end
|
81
92
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
93
|
+
# Use callbacks to share common setup or constraints between actions.
|
94
|
+
def set_mod_log
|
95
|
+
@mod_log = ModLog.find(params[:id] || params[:mod_log_id])
|
96
|
+
end
|
97
|
+
|
98
|
+
def mod_log_scope
|
99
|
+
ModLog
|
100
|
+
end
|
101
|
+
|
102
|
+
# Only allow a list of trusted parameters through.
|
103
|
+
def mod_log_params
|
104
|
+
params.require(:mod_log).permit(:record_id, :record_type, :mod_words, :user_id, :reason)
|
105
|
+
end
|
86
106
|
end
|
87
107
|
end
|
@@ -1,32 +1,37 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
1
|
+
= turbo_frame_tag dom_id(log) do
|
2
|
+
%div{class: "flex flex-col"}
|
3
|
+
%div{class: "border rounded-md mb-2 p-2 flex flex-col space-y-1"}
|
4
|
+
%div{class: "flex justify-between"}
|
5
|
+
%div{class: ""}
|
6
|
+
- unless log.scenario.blank?
|
7
|
+
%span{class: "text-sm bg-blue-100 text-blue-600 py-1 px-2 rounded-lg"}= log.scenario.upcase
|
8
|
+
- unless log.stage.blank?
|
9
|
+
%span{class: "text-sm bg-pink-100 text-pink-600 py-1 px-2 rounded-lg"}=t("censor_log.stage.#{log.stage}")
|
10
|
+
- unless log.action.blank?
|
11
|
+
%span{class: "text-sm bg-yellow-100 text-yellow-600 py-1 px-2 rounded-lg"}=t("censor_log.action.#{log.action.downcase}")
|
12
|
+
- unless log.user_id.blank?
|
13
|
+
%span{class: "text-sm bg-gray-100 text-gray-600 py-1 px-2 rounded-lg font-bold"}="##{log.user_id}"
|
14
|
+
- unless log.ip.blank?
|
15
|
+
%span{class: "text-sm bg-gray-100 text-gray-600 py-1 px-2 rounded-lg"}=log.ip
|
16
|
+
- unless log.labels.blank?
|
17
|
+
- log.labels.each do |label|
|
18
|
+
%span{class: "text-sm bg-red-100 text-red-600 py-1 px-2 rounded-lg"}=t("censor_log.label.#{label}")
|
19
|
+
|
20
|
+
%span{class: "text-sm bg-gray-100 text-gray-600 py-1 px-2 rounded-lg"}= log.created_at
|
21
|
+
%div{class: "flex space-x-2 items-center"}
|
22
|
+
%span
|
23
|
+
= link_to '详情', log
|
24
|
+
%span
|
25
|
+
= button_to '删除', log, method: :delete, data: { confirm: 'Are you sure?' }, class: "text-red-600 rounded-md px-2 py-0.5"
|
26
|
+
%div{class: "flex justify-between items-center"}
|
27
|
+
%div{class: "flex flex-col"}
|
28
|
+
%div{class: ""}
|
29
|
+
%div= log.original_content
|
30
|
+
- if log.filtered_content
|
31
|
+
%div{class: "border-t"}
|
32
|
+
%div= log.filtered_content
|
33
|
+
%div{class: "text-yellow-500 font-meidum text-xl"}
|
34
|
+
- log.mod_words.each do |word|
|
35
|
+
%span [
|
36
|
+
%span= link_to word, stop_words_path(q: word)
|
37
|
+
%span ]
|
@@ -0,0 +1 @@
|
|
1
|
+
= turbo_stream.remove(@log)
|
@@ -1,11 +1,11 @@
|
|
1
1
|
%div{class: "flex flex-col space-y-2 justify-center"}
|
2
2
|
%div{class: "flex justify-between"}
|
3
3
|
%div
|
4
|
-
= form_with(url:
|
4
|
+
= form_with(url: mod_logs_path, method: :get, class: "flex items-center") do |f|
|
5
5
|
%div{class: "space-x-0.5"}
|
6
6
|
= f.text_field :q, value: params[:q], placeholder: "关键词", class: "border rounded-md m py-0.5 px-1"
|
7
7
|
= f.submit "检索", class: "rounded-md px-2 py-1 text-sm bg-black text-white cursor-pointer"
|
8
|
-
= link_to "重置",
|
8
|
+
= link_to "重置", mod_logs_path, class: "text-sm"
|
9
9
|
|
10
10
|
%div="共 #{@pagy.count} 条"
|
11
11
|
%div
|
@@ -0,0 +1,45 @@
|
|
1
|
+
= turbo_frame_tag dom_id(mod_log) do
|
2
|
+
%div{class: "flex flex-col"}
|
3
|
+
%div{class: "border rounded-md mb-2 p-2 flex flex-col space-y-1"}
|
4
|
+
%div{class: "flex justify-between"}
|
5
|
+
%div{class: ""}
|
6
|
+
= link_to mod_log.record_path do
|
7
|
+
%span{class: "text-sm bg-indigo-100 text-indigo-600 py-1 px-2 rounded-lg"}="#{mod_log.record_type.upcase}##{mod_log.record_id}"
|
8
|
+
- unless mod_log.labels.blank?
|
9
|
+
- mod_log.labels.each do |label|
|
10
|
+
%span{class: "text-sm bg-red-100 text-red-600 py-1 px-2 rounded-lg"}=t("censor_log.label.#{label}")
|
11
|
+
- unless mod_log.mod_words.blank?
|
12
|
+
- mod_log.mod_words.each do |word|
|
13
|
+
%span{class: "text-sm bg-yellow-100 text-yellow-600 py-1 px-2 rounded-lg"}="##{word}"
|
14
|
+
%span{class: "text-sm bg-gray-100 text-gray-600 py-1 px-2 rounded-lg"}= mod_log.created_at
|
15
|
+
%div{class: "flex space-x-2 items-center"}
|
16
|
+
- if mod_log.reason
|
17
|
+
%span{class: "bg-red-100 text-red-600 p-1 rounded-lg"}
|
18
|
+
= mod_log.reason
|
19
|
+
%span{class: "bg-green-100 text-green-600 rounded-md p-1"}
|
20
|
+
- if mod_log.status == 0
|
21
|
+
= "待审"
|
22
|
+
- if mod_log.status == 1
|
23
|
+
= "已处理"
|
24
|
+
- if mod_log.status == 2
|
25
|
+
= "暂缓"
|
26
|
+
%span
|
27
|
+
= link_to "详情", mod_log
|
28
|
+
%span
|
29
|
+
= button_to '删除', mod_log, method: :delete, data: { confirm: 'Are you sure?'}, class: "text-red-600 rounded-md px-2 py-0.5"
|
30
|
+
%div{class: "flex justify-between items-center"}
|
31
|
+
%div{class: "flex flex-col"}
|
32
|
+
%div{class: "text-sm border rounded-lg border-black p-2"}
|
33
|
+
%div= mod_log.content
|
34
|
+
%div
|
35
|
+
%div{class: "flex space-x-2"}
|
36
|
+
%span{class: "text-yellow-600"}
|
37
|
+
= link_to "忽略", mod_log_ignore_path(mod_log)
|
38
|
+
%span{class: "text-green-600"}
|
39
|
+
= link_to "通过", mod_log_approve_path(mod_log)
|
40
|
+
%div
|
41
|
+
= form_with(url: mod_log_delete_path(mod_log), method: :get, class: "space-x-1 flex items-center") do |f|
|
42
|
+
= f.submit "删除", class: "rounded-md px-2 py-1 text-sm bg-red-600 text-white cursor-pointer"
|
43
|
+
= f.text_field :reason, value: mod_log.reason, placeholder: "不通过原因", class: "border rounded-md m py-0.5 px-1"
|
44
|
+
-#%span{class: "text-red-600 font-bold"}
|
45
|
+
-# = link_to "封禁用户!", mod_log_ban_path(mod_log)
|
@@ -0,0 +1 @@
|
|
1
|
+
= turbo_stream.remove(@mod_log)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
%div{class: "flex flex-col space-y-2 justify-center"}
|
2
|
+
%div{class: "flex justify-between"}
|
3
|
+
%div
|
4
|
+
= form_with(url: logs_path, method: :get, class: "flex items-center") do |f|
|
5
|
+
%div{class: "space-x-0.5"}
|
6
|
+
= f.text_field :q, value: params[:q], placeholder: "关键词", class: "border rounded-md m py-0.5 px-1"
|
7
|
+
= f.submit "检索", class: "rounded-md px-2 py-1 text-sm bg-black text-white cursor-pointer"
|
8
|
+
= link_to "重置", logs_path, class: "text-sm"
|
9
|
+
|
10
|
+
%div="共 #{@pagy.count} 条"
|
11
|
+
%div
|
12
|
+
- if @logs.blank?
|
13
|
+
%div{class: "flex justify-center text-gray-500 p-8 border rounded-md"} 空空如也
|
14
|
+
- else
|
15
|
+
- @logs.each do |log|
|
16
|
+
= render log
|
17
|
+
%div{class: "flex justify-center"}
|
18
|
+
= raw pagy_nav(@pagy)
|
@@ -4,4 +4,26 @@ en:
|
|
4
4
|
mod: 审核
|
5
5
|
banned: 禁用
|
6
6
|
ignore: 忽略
|
7
|
-
replace: 替换
|
7
|
+
replace: 替换
|
8
|
+
block: 禁用
|
9
|
+
pass: 忽略
|
10
|
+
review: 审核
|
11
|
+
stage:
|
12
|
+
aliyun_check: "阿里云检查"
|
13
|
+
tencent_check: "腾讯云检查"
|
14
|
+
local_check: "本地检查"
|
15
|
+
qq_regex: "QQ正则检查"
|
16
|
+
wechat_regex: "微信正则检查"
|
17
|
+
label:
|
18
|
+
normal: 正常文本
|
19
|
+
spam: 含垃圾信息
|
20
|
+
ad: 广告
|
21
|
+
politics: 涉政
|
22
|
+
terrorism: 暴恐
|
23
|
+
abuse: 辱骂
|
24
|
+
porn: 色情
|
25
|
+
flood: 灌水
|
26
|
+
contraband: 违禁
|
27
|
+
meaningless: 无意义
|
28
|
+
harmful: 不良场景
|
29
|
+
customized: 自定义
|
data/lib/censor_bear/censor.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
module CensorBear
|
2
2
|
class Result
|
3
|
-
attr_accessor :is_mod, :mod_words, :content
|
3
|
+
attr_accessor :is_mod, :mod_words, :content, :labels
|
4
4
|
|
5
|
-
def initialize(content, is_mod = false, mod_words = [])
|
5
|
+
def initialize(content, is_mod = false, mod_words = [], labels = [])
|
6
6
|
@is_mod = is_mod
|
7
7
|
@mod_words = mod_words
|
8
|
+
@labels = labels
|
8
9
|
@content = content || ''
|
9
10
|
end
|
10
11
|
end
|
@@ -16,6 +17,7 @@ module CensorBear
|
|
16
17
|
def initialize(content, type = 'ugc', options = {})
|
17
18
|
@is_mod = false
|
18
19
|
@mod_words = []
|
20
|
+
@labels = []
|
19
21
|
@content = content
|
20
22
|
@type = type.to_s
|
21
23
|
@options = options
|
@@ -27,6 +29,7 @@ module CensorBear
|
|
27
29
|
return Result.new(@content) if @content.blank?
|
28
30
|
return Result.new(@content) unless CensorBear::StopWord::FIELDS.include?(@type)
|
29
31
|
|
32
|
+
# 正则过滤
|
30
33
|
if @content.match(QQ_REG)
|
31
34
|
CensorBear.info(@content, @type, 'BANNED', 'qq_regex', ip: @ip, user_id: @user_id)
|
32
35
|
raise NotPassedException
|
@@ -37,28 +40,31 @@ module CensorBear
|
|
37
40
|
raise NotPassedException
|
38
41
|
end
|
39
42
|
|
43
|
+
# 本地自定义词库粗查
|
40
44
|
local_check
|
45
|
+
# 第三方云端复查
|
46
|
+
aliyun_check unless @is_mod
|
41
47
|
|
42
48
|
# 用户相关类型直接禁止创建
|
43
49
|
raise NotPassedException if @is_mod && %w[username signature dialog nickname].include?(@type)
|
44
50
|
|
45
|
-
Result.new(@content, @is_mod, @mod_words.uniq)
|
51
|
+
Result.new(@content, @is_mod, @mod_words.uniq, @labels.uniq)
|
46
52
|
end
|
47
53
|
|
48
54
|
# default type = :ugc
|
49
|
-
def check_search
|
50
|
-
|
55
|
+
def check_search
|
56
|
+
flag = false
|
51
57
|
stop_words = CensorBear::StopWord.where("#{@type} != 'IGNORE'")
|
52
58
|
stop_words.each do |word|
|
53
59
|
finder = Regexp.new(Regexp.escape(word.key))
|
54
60
|
action = word.send(@type.to_sym).upcase
|
55
61
|
if finder.match(@content)
|
56
|
-
|
62
|
+
flag = true
|
57
63
|
CensorBear.info(@content, @type, action, 'check_search', mod_words: [word.key], ip: @ip, user_id: @user_id)
|
58
64
|
break
|
59
65
|
end
|
60
66
|
end
|
61
|
-
|
67
|
+
flag
|
62
68
|
end
|
63
69
|
|
64
70
|
def local_check
|
@@ -68,10 +74,11 @@ module CensorBear
|
|
68
74
|
finder = Regexp.new(Regexp.escape(word.key))
|
69
75
|
action = word.send(@type.to_sym).upcase
|
70
76
|
next unless finder.match(@content)
|
77
|
+
|
71
78
|
@mod_words.push(word.key)
|
72
79
|
case action
|
73
80
|
when 'REPLACE'
|
74
|
-
replacement = word.replacement.blank? ?
|
81
|
+
replacement = word.replacement.blank? ? '**' : word.replacement
|
75
82
|
@content = @content.gsub(finder, replacement)
|
76
83
|
CensorBear.info(
|
77
84
|
original_content, @type, action, 'local_check',
|
@@ -88,7 +95,6 @@ module CensorBear
|
|
88
95
|
ip: @ip, user_id: @user_id
|
89
96
|
)
|
90
97
|
when 'BANNED'
|
91
|
-
@is_mod = true
|
92
98
|
# 禁止的直接抛出异常
|
93
99
|
CensorBear.info(
|
94
100
|
original_content, @type, action, 'local_check',
|
@@ -101,12 +107,68 @@ module CensorBear
|
|
101
107
|
end
|
102
108
|
end
|
103
109
|
|
104
|
-
def
|
110
|
+
def aliyun_check
|
111
|
+
response = AliyunGreen::Text.scan(@content)
|
112
|
+
d = response['data'].first
|
113
|
+
r = d['results'].first
|
114
|
+
action = r['suggestion']
|
115
|
+
rate = r['rate']
|
116
|
+
@mod_words = concat_words(r['details'])
|
117
|
+
@labels = concat_labels(r['details'])
|
118
|
+
if action == 'block' && rate >= 70 && %w[politics terrorism abuse].include?(r['label'])
|
119
|
+
CensorBear.info(
|
120
|
+
d['content'], @type, action, 'aliyun_check',
|
121
|
+
filtered_content: d['filteredContent'],
|
122
|
+
mod_words: @mod_words,
|
123
|
+
labels: @labels,
|
124
|
+
ip: @ip, user_id: @user_id
|
125
|
+
)
|
126
|
+
raise NotPassedException
|
127
|
+
elsif action == 'block'
|
128
|
+
@is_mod = true
|
129
|
+
CensorBear.info(
|
130
|
+
d['content'], @type, action, 'aliyun_check',
|
131
|
+
filtered_content: d['filteredContent'],
|
132
|
+
mod_words: @mod_words,
|
133
|
+
labels: @labels,
|
134
|
+
ip: @ip, user_id: @user_id
|
135
|
+
)
|
136
|
+
elsif action == 'review'
|
137
|
+
@is_mod = true
|
138
|
+
CensorBear.info(
|
139
|
+
d['content'], @type, action, 'aliyun_check',
|
140
|
+
filtered_content: d['filteredContent'],
|
141
|
+
mod_words: @mod_words,
|
142
|
+
labels: @labels,
|
143
|
+
ip: @ip, user_id: @user_id
|
144
|
+
)
|
145
|
+
end
|
146
|
+
end
|
105
147
|
|
106
148
|
private
|
107
149
|
|
108
|
-
def
|
150
|
+
def concat_labels(data)
|
151
|
+
labels = []
|
152
|
+
data.map do |d|
|
153
|
+
next if d['label'].blank?
|
154
|
+
|
155
|
+
labels.push(d['label'])
|
156
|
+
end
|
157
|
+
labels
|
158
|
+
end
|
159
|
+
|
160
|
+
def concat_words(data)
|
161
|
+
words = []
|
162
|
+
data.each do |d|
|
163
|
+
next if d['contexts'].blank?
|
164
|
+
|
165
|
+
d['contexts'].each do |c|
|
166
|
+
words.push(c['context'])
|
167
|
+
end
|
168
|
+
end
|
169
|
+
words
|
170
|
+
end
|
109
171
|
|
110
|
-
def
|
172
|
+
def tencent_check; end
|
111
173
|
end
|
112
174
|
end
|
@@ -13,5 +13,9 @@ module CensorBear
|
|
13
13
|
attr_accessor :import_file_path
|
14
14
|
attr_accessor :format_from_file_path
|
15
15
|
attr_accessor :format_dest_file_path
|
16
|
+
|
17
|
+
attr_accessor :aliyun_green_access_key_id
|
18
|
+
attr_accessor :aliyun_green_access_key_secret
|
19
|
+
attr_accessor :aliyun_green_enable_internal
|
16
20
|
end
|
17
21
|
end
|
data/lib/censor_bear/engine.rb
CHANGED
@@ -7,5 +7,13 @@ module CensorBear
|
|
7
7
|
initializer "censor_bear.assets.precompile" do |app|
|
8
8
|
app.config.assets.precompile += %w( censor_bear/application.css )
|
9
9
|
end
|
10
|
+
|
11
|
+
config.after_initialize do
|
12
|
+
AliyunGreen.configure do |config|
|
13
|
+
config.access_key_id = CensorBear.config.aliyun_green_access_key_id
|
14
|
+
config.access_key_secret = CensorBear.config.aliyun_green_access_key_secret
|
15
|
+
config.enable_internal = CensorBear.config.aliyun_green_enable_internal
|
16
|
+
end
|
17
|
+
end
|
10
18
|
end
|
11
19
|
end
|
data/lib/censor_bear/version.rb
CHANGED
data/lib/censor_bear.rb
CHANGED
@@ -5,6 +5,7 @@ require 'censor_bear/configuration'
|
|
5
5
|
|
6
6
|
require 'hamlit'
|
7
7
|
require 'pagy'
|
8
|
+
require 'aliyun_green'
|
8
9
|
|
9
10
|
module CensorBear
|
10
11
|
class NotPassedException < StandardError; end
|
@@ -20,6 +21,9 @@ module CensorBear
|
|
20
21
|
@config.import_file_path = "#{Rails.root}/tmp/dest_sensitives.txt"
|
21
22
|
@config.format_from_file_path = "#{Rails.root}/tmp/from_sensitives.txt"
|
22
23
|
@config.format_dest_file_path = "#{Rails.root}/tmp/dest_sensitives.txt"
|
24
|
+
@config.aliyun_green_access_key_id = ''
|
25
|
+
@config.aliyun_green_access_key_secret = ''
|
26
|
+
@config.aliyun_green_enable_internal = false
|
23
27
|
@config
|
24
28
|
end
|
25
29
|
|
@@ -32,12 +36,13 @@ module CensorBear
|
|
32
36
|
end
|
33
37
|
|
34
38
|
def check_search(content, options = {})
|
35
|
-
Censor.new(content,
|
39
|
+
Censor.new(content, 'ugc', options).check_search
|
36
40
|
end
|
37
41
|
|
38
42
|
def info(content, scenario, action, stage, options = {})
|
39
43
|
filtered_content = options[:filtered_content] || nil
|
40
44
|
mod_words = options[:mod_words] || []
|
45
|
+
labels = options[:labels] || []
|
41
46
|
ip = options[:ip] || nil
|
42
47
|
user_id = options[:user_id] || nil
|
43
48
|
|
@@ -48,6 +53,7 @@ module CensorBear
|
|
48
53
|
stage: stage,
|
49
54
|
filtered_content: filtered_content,
|
50
55
|
mod_words: mod_words,
|
56
|
+
labels: labels,
|
51
57
|
ip: ip,
|
52
58
|
user_id: user_id,
|
53
59
|
)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: censor_bear
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 42up
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-12-
|
11
|
+
date: 2021-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -30,6 +30,20 @@ dependencies:
|
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 6.0.4.1
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: aliyun_green
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 0.1.1
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 0.1.1
|
33
47
|
- !ruby/object:Gem::Dependency
|
34
48
|
name: hamlit
|
35
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,33 +73,33 @@ dependencies:
|
|
59
73
|
- !ruby/object:Gem::Version
|
60
74
|
version: '2.0'
|
61
75
|
- !ruby/object:Gem::Dependency
|
62
|
-
name:
|
76
|
+
name: pagy
|
63
77
|
requirement: !ruby/object:Gem::Requirement
|
64
78
|
requirements:
|
65
|
-
- - "
|
79
|
+
- - "~>"
|
66
80
|
- !ruby/object:Gem::Version
|
67
|
-
version: '
|
81
|
+
version: '5.6'
|
68
82
|
type: :runtime
|
69
83
|
prerelease: false
|
70
84
|
version_requirements: !ruby/object:Gem::Requirement
|
71
85
|
requirements:
|
72
|
-
- - "
|
86
|
+
- - "~>"
|
73
87
|
- !ruby/object:Gem::Version
|
74
|
-
version: '
|
88
|
+
version: '5.6'
|
75
89
|
- !ruby/object:Gem::Dependency
|
76
|
-
name:
|
90
|
+
name: turbo-rails
|
77
91
|
requirement: !ruby/object:Gem::Requirement
|
78
92
|
requirements:
|
79
|
-
- - "
|
93
|
+
- - ">="
|
80
94
|
- !ruby/object:Gem::Version
|
81
|
-
version: '
|
95
|
+
version: '0'
|
82
96
|
type: :runtime
|
83
97
|
prerelease: false
|
84
98
|
version_requirements: !ruby/object:Gem::Requirement
|
85
99
|
requirements:
|
86
|
-
- - "
|
100
|
+
- - ">="
|
87
101
|
- !ruby/object:Gem::Version
|
88
|
-
version: '
|
102
|
+
version: '0'
|
89
103
|
description: Description of CensorBear.
|
90
104
|
email:
|
91
105
|
- foobar@v2up.com
|
@@ -119,13 +133,16 @@ files:
|
|
119
133
|
- app/models/censor_bear/stop_word.rb
|
120
134
|
- app/views/censor_bear/logs/_form.html.erb
|
121
135
|
- app/views/censor_bear/logs/_log.html.haml
|
136
|
+
- app/views/censor_bear/logs/destroy.turbo_stream.haml
|
122
137
|
- app/views/censor_bear/logs/edit.html.erb
|
123
138
|
- app/views/censor_bear/logs/index.html.haml
|
124
139
|
- app/views/censor_bear/logs/new.html.erb
|
125
140
|
- app/views/censor_bear/logs/show.html.erb
|
126
141
|
- app/views/censor_bear/mod_logs/_form.html.erb
|
142
|
+
- app/views/censor_bear/mod_logs/_mod_log.html.haml
|
143
|
+
- app/views/censor_bear/mod_logs/destroy.turbo_stream.haml
|
127
144
|
- app/views/censor_bear/mod_logs/edit.html.erb
|
128
|
-
- app/views/censor_bear/mod_logs/index.html.
|
145
|
+
- app/views/censor_bear/mod_logs/index.html.haml
|
129
146
|
- app/views/censor_bear/mod_logs/new.html.erb
|
130
147
|
- app/views/censor_bear/mod_logs/show.html.erb
|
131
148
|
- app/views/censor_bear/stop_words/_form.html.haml
|
@@ -144,6 +161,7 @@ files:
|
|
144
161
|
- db/migrate/20211129093508_create_censor_bear_logs.rb
|
145
162
|
- db/migrate/20211129110218_create_censor_bear_mod_logs.rb
|
146
163
|
- db/migrate/20211206092626_add_ip_to_censor_bear_logs.rb
|
164
|
+
- db/migrate/20211208041114_add_labels_to_censor_bear_logs.rb
|
147
165
|
- lib/censor_bear.rb
|
148
166
|
- lib/censor_bear/censor.rb
|
149
167
|
- lib/censor_bear/configuration.rb
|
@@ -1,44 +0,0 @@
|
|
1
|
-
<p id="notice"><%= notice %></p>
|
2
|
-
|
3
|
-
<h1>Mod Logs</h1>
|
4
|
-
|
5
|
-
<table>
|
6
|
-
<thead>
|
7
|
-
<tr>
|
8
|
-
<th>Record</th>
|
9
|
-
<th>Record type</th>
|
10
|
-
<th>Mod words</th>
|
11
|
-
<th>User</th>
|
12
|
-
<th colspan="3"></th>
|
13
|
-
</tr>
|
14
|
-
</thead>
|
15
|
-
|
16
|
-
<tbody>
|
17
|
-
<% @mod_logs.each do |mod_log| %>
|
18
|
-
<tr>
|
19
|
-
<td><%= mod_log.record_id %></td>
|
20
|
-
<td><%= mod_log.record_type %></td>
|
21
|
-
<td><%= mod_log.mod_words %></td>
|
22
|
-
<td><%= mod_log.user_id %></td>
|
23
|
-
<td><%= link_to 'Show', mod_log %></td>
|
24
|
-
<td><%= link_to 'Show', mod_log %></td>
|
25
|
-
<td><%= link_to 'Edit', edit_mod_log_path(mod_log) %></td>
|
26
|
-
<td><%= link_to 'Destroy', mod_log, method: :delete, data: { confirm: 'Are you sure?' } %></td>
|
27
|
-
<td><%= link_to "查看详情", mod_log.record_path %></td>
|
28
|
-
<td><%= link_to "忽略内容", mod_log_ignore_path(mod_log) %></td>
|
29
|
-
<td><%= link_to "通过内容", mod_log_approve_path(mod_log) %></td>
|
30
|
-
<td><%= link_to "封禁用户", mod_log_ban_path(mod_log) %></td>
|
31
|
-
<td>
|
32
|
-
<%= form_with(url: mod_log_delete_path(mod_log), method: :get, class: "flex items-center") do |f| %>
|
33
|
-
<%= f.text_field :reason, value: mod_log.reason, placeholder: "原因", class: "border rounded-md m py-0.5 px-1" %>
|
34
|
-
<td><%= f.submit "删除内容", class: "rounded-md px-2 py-1 text-sm bg-black text-white cursor-pointer" %></td>
|
35
|
-
<% end %>
|
36
|
-
</td>
|
37
|
-
</tr>
|
38
|
-
<% end %>
|
39
|
-
</tbody>
|
40
|
-
</table>
|
41
|
-
|
42
|
-
<br>
|
43
|
-
|
44
|
-
<%= link_to 'New Mod Log', new_mod_log_path %>
|