Skip to content

Commit 2b28546

Browse files
committed
🎨完善工具与规则展示相关逻辑与接口
1 parent a223be5 commit 2b28546

File tree

12 files changed

+123
-52
lines changed

12 files changed

+123
-52
lines changed

scripts/deploy/tca_docker_compose.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ function init_main() {
111111
python manage.py createcachetable; \
112112
python manage.py initializedb_open; \
113113
python manage.py initialize_exclude_paths; \
114+
python manage.py loadlibs all --dirname open_source_toollib --ignore-auth; \
114115
python manage.py loadcheckers all --dirname open_source; \
115116
python manage.py loadpackages all --dirname open_source_package;
116117
"

scripts/server/init_data.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ function init_main_data() {
6060
python manage.py initializedb_open
6161
python manage.py initialize_exclude_paths
6262
LOG_INFO "[TCAServer] Init checker config..."
63+
python manage.py loadlibs all --dirname open_source_toollib --ignore-auth >/dev/null
6364
python manage.py loadcheckers all --dirname open_source >/dev/null
6465
python manage.py loadpackages all --dirname open_source_package >/dev/null
6566
LOG_INFO "Init checkertool and checkerpackage successfully"

server/projects/main/apps/job/api_urls/v2_job.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,7 @@
1717
# 前缀 /api/v2/jobs/
1818
urlpatterns = [
1919
path("", apis.JobListApiView.as_view(), name="apiv2_job_list"),
20+
path("<int:job_id>/cancel/", apis.JobCancelApiView.as_view(),
21+
name="apiv2_job_cancel"),
2022
path("tasks/", apis.TaskListApiView.as_view(), name="apiv2_task_list"),
2123
]

server/projects/main/apps/scan_conf/api_urls/v3_global_scheme.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@
5656
apis.CheckRuleListAPIView.as_view()),
5757
path("allrules/<int:checkrule_id>/",
5858
apis.CheckRuleDetailAPIView.as_view()),
59+
path("allrules/byname/",
60+
apis.CheckRuleDetailByNameAPIView.as_view()),
5961
path("checkprofile/", include(checkprofile_urlpatterns)),
6062
path("checkprofile/checkpackages/", include(checkpackage_urlpatterns)),
6163
]

server/projects/main/apps/scan_conf/api_urls/v3_scheme.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@
5757
apis.CheckRuleListAPIView.as_view()),
5858
path("allrules/<int:checkrule_id>/",
5959
apis.CheckRuleDetailAPIView.as_view()),
60+
path("allrules/byname/",
61+
apis.CheckRuleDetailByNameAPIView.as_view()),
6062
path("checkprofile/", include(checkprofile_urlpatterns)),
6163
path("checkprofile/checkpackages/", include(checkpackage_urlpatterns)),
6264
]

server/projects/main/apps/scan_conf/apis/v3/scheme.py

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from rest_framework import generics, status
1616
from rest_framework.views import APIView
1717
from rest_framework.response import Response
18+
from rest_framework.exceptions import ParseError, NotFound
1819

1920
# 项目内
2021
from apps.scan_conf import models
@@ -202,16 +203,23 @@ class ScanSchemeCheckProfileRuleCreateAPIView(ScanSchemeCheckProfileRuleBatch):
202203
```python
203204
{
204205
"checkrules": [x], # int, 规则id
206+
"checktool": xx # int, 工具id,可选,如果存在checktool, 则一键添加该工具所有规则,忽略 checkrules
205207
}
206208
```
207209
"""
208210
serializer_class = serializers.CheckPackageRuleAddSerializer
209211

210212
def post(self, request, *args, **kwargs):
211213
serializer, checkpackage, tool_key = self.get_and_check_batch_data(request)
214+
checktool = serializer.validated_data.get("checktool")
212215
checkrules = serializer.validated_data.get("checkrules")
213-
err_message = CheckPackageManager.add_rules(checkpackage, checkrules, request.user, tool_key=tool_key)
214-
message = "已成功添加规则"
216+
if checktool:
217+
CheckPackageManager.add_checktool_rules(checkpackage, checktool, request.user, tool_key=tool_key)
218+
err_message = []
219+
message = "已成功添加工具规则"
220+
else:
221+
err_message = CheckPackageManager.add_rules(checkpackage, checkrules, request.user, tool_key=tool_key)
222+
message = "已成功添加规则"
215223
return Response({
216224
"detail": message,
217225
"err_message": err_message
@@ -390,3 +398,33 @@ class CheckRuleDetailAPIView(generics.RetrieveAPIView, V3GetModelMixinAPIView):
390398
def get_queryset(self):
391399
tool_key = CheckToolManager.get_tool_key(org=self.get_org())
392400
return CheckRuleManager.filter_pkg_usable(tool_keys=[tool_key])
401+
402+
403+
class CheckRuleDetailByNameAPIView(generics.RetrieveAPIView, V3GetModelMixinAPIView):
404+
"""分析方案-规则配置-有权限使用的规则详情接口,根据工具、规则名称获取规则详情
405+
406+
### get
407+
应用场景:根据工具name和规则real_name获取规则详情
408+
409+
```python
410+
{
411+
checktool_name: '工具真实名称',
412+
checkrule_real_name: '规则真实名称
413+
}
414+
```
415+
"""
416+
permission_classes = [SchemeDefaultPermission]
417+
serializer_class = serializers.CheckRuleSerializer
418+
419+
def get_object(self):
420+
query_params = self.request.query_params
421+
checktool_name = query_params.get("checktool_name")
422+
checkrule_real_name = query_params.get("checkrule_real_name")
423+
if not checktool_name or not checkrule_real_name:
424+
raise ParseError("checktool_name、checkrule_real_name参数必填")
425+
tool_key = CheckToolManager.get_tool_key(org=self.get_org())
426+
checkrule = CheckRuleManager.filter_pkg_usable(tool_keys=[tool_key]) \
427+
.filter(checktool__name=checktool_name, real_name=checkrule_real_name).first()
428+
if checkrule:
429+
return checkrule
430+
raise NotFound("没有找到该规则")
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 3.1.14 on 2022-09-05 15:34
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('scan_conf', '0003_auto_20220518_1055'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='language',
15+
name='name',
16+
field=models.CharField(choices=[('cpp', 'C/C++'), ('java', 'Java'), ('js', 'JavaScript'), ('oc', 'Objective-C'), ('php', 'PHP'), ('python', 'Python'), ('cs', 'C#'), ('ruby', 'Ruby'), ('kotlin', 'Kotlin'), ('Go', 'Go'), ('Lua', 'Lua'), ('swift', 'Swift'), ('html', 'Html'), ('css', 'Css'), ('ts', 'TypeScript'), ('scala', 'Scala'), ('visualbasic', 'Visual Basic'), ('plsql', 'PL/SQL'), ('cobol', 'COBOL'), ('abap', 'ABAP'), ('tsql', 'T-SQL'), ('flex', 'Flex'), ('rpg', 'RPG'), ('apex', 'Apex'), ('pli', 'PL/I'), ('xml', 'XML'), ('dart', 'Dart'), ('shell', 'Shell'), ('protobuf', 'Protocol Buffers'), ('sql', 'SQL'), ('wasm', 'WebAssembly'), ('rust', 'Rust')], help_text='程序语言', max_length=32, null=True),
17+
),
18+
]

server/projects/main/apps/scan_conf/models/package.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,6 @@ def __str__(self):
135135
return "packagemap-%s-%s" % (self.checkpackage_id, self.checkrule_id)
136136

137137

138-
139-
def get_checkprofile_admins(checkprofile):
140-
"""获取规则集admins,开源版规则集无单独权限
141-
"""
142-
return []
143-
144-
145138
class CheckProfile(CDBaseModel):
146139
"""规则集表
147140
"""
@@ -216,10 +209,9 @@ def get_checkrules(self):
216209
return (official_pms | custom_pms).distinct()
217210

218211
def get_admins(self):
219-
"""由于规则集依附代码库admin权限,因此该方法获取规则集+对应代码库的admins
220-
开源版规则集无单独的权限
212+
"""获取规则集admins,开源版规则集无单独权限
221213
"""
222-
return get_checkprofile_admins(self)
214+
return []
223215

224216
def get_custom_checkpackage_content(self):
225217
"""自定义规则包内容

server/projects/main/apps/scan_conf/serializers/base/pkg.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,26 @@ class CheckProfilePackageAddSerializer(serializers.Serializer):
2727
many=True)
2828

2929

30+
class CheckPackageRuleAddSerializer(serializers.Serializer):
31+
"""用于规则包批量添加规则序列化
32+
"""
33+
checkrules = serializers.ListField(
34+
child=serializers.PrimaryKeyRelatedField(queryset=models.CheckRule.objects.all()),
35+
required=False, allow_null=True, help_text="规则列表"
36+
)
37+
checktool = serializers.PrimaryKeyRelatedField(
38+
queryset=models.CheckTool.objects.all(),
39+
required=False, allow_null=True, help_text="工具"
40+
)
41+
42+
def validate(self, attrs):
43+
checkrules = attrs.get("checkrules")
44+
checktool = attrs.get("checktool")
45+
if not checktool and not checkrules:
46+
raise serializers.ValidationError({"cd_error": "请传入checkrules或checktool"})
47+
return attrs
48+
49+
3050
class CheckPackageRuleUpdateSerializer(serializers.Serializer):
3151
"""用于规则包批量更新规则严重级别、规则参数、状态等序列化
3252
"""

server/projects/main/apps/scan_conf/serializers/base/rule.py

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
# 项目内
1717
from apps.scan_conf import models
18-
from apps.base.serializers import CDBaseModelSerializer, OnlySuperAdminReadField
18+
from apps.base.serializers import CDBaseModelSerializer
1919

2020
logger = logging.getLogger(__name__)
2121

@@ -29,30 +29,26 @@ class Meta:
2929
fields = ["desc_type", "desc"]
3030

3131

32-
class CheckToolSimpleSerializer(serializers.ModelSerializer):
33-
"""工具简单序列化
32+
class CheckRuleSimpleSerializer(serializers.ModelSerializer):
33+
"""规则简单序列化,用于仅展示规则简要信息,不包含工具信息
3434
"""
35-
display_name = serializers.SerializerMethodField()
36-
scope = serializers.SerializerMethodField()
37-
name = OnlySuperAdminReadField()
35+
category_name = serializers.CharField(source="get_category_display")
36+
severity_name = serializers.CharField(source="get_severity_display")
37+
languages = serializers.SlugRelatedField(help_text="适用语言", slug_field="name", many=True, read_only=True)
3838

39-
def get_display_name(self, checktool):
40-
"""获取工具展示名称
41-
"""
42-
request = self.context.get("request")
43-
user = request.user if request else None
44-
return checktool.get_show_name(user=user)
39+
class Meta:
40+
model = models.CheckRule
41+
fields = ["id", "real_name", "display_name", "rule_title", "severity", "severity_name",
42+
"category", "category_name", "rule_params", "solution", "languages", "disable"]
4543

46-
def get_scope(self, checktool):
47-
"""公有True/私有False工具
48-
"""
49-
if checktool.is_public():
50-
return models.CheckTool.ScopeEnum.PUBLIC
51-
return models.CheckTool.ScopeEnum.PRIVATE
44+
45+
class CheckRuleToolSimpleSerializer(serializers.ModelSerializer):
46+
"""规则的工具简单序列化,用于在规则中序列化显示其工具简要信息
47+
"""
5248

5349
class Meta:
5450
model = models.CheckTool
55-
fields = ["id", "name", "display_name", "scope", "status", "show_display_name", "build_flag"]
51+
fields = ["id", "display_name", "build_flag", "status"]
5652

5753

5854
class CheckRuleSerializer(CDBaseModelSerializer):
@@ -71,7 +67,7 @@ class SelectStateTypeEnum:
7167
queryset=models.Language.objects.all())
7268
category_name = serializers.CharField(source="get_category_display", read_only=True)
7369
severity_name = serializers.CharField(source="get_severity_display", read_only=True)
74-
checktool = CheckToolSimpleSerializer(read_only=True)
70+
checktool = CheckRuleToolSimpleSerializer(read_only=True)
7571
select_state = serializers.SerializerMethodField()
7672

7773
def get_select_state(self, checkrule):

0 commit comments

Comments
 (0)