Skip to content
This repository has been archived by the owner on May 23, 2023. It is now read-only.

Commit

Permalink
Merge pull request #263 from Bidaya0/feature/issue-256
Browse files Browse the repository at this point in the history
fix bugs and add switch for vuln validation
  • Loading branch information
Bidaya0 authored Dec 1, 2021
2 parents 327c340 + 39bb357 commit b100963
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 86 deletions.
12 changes: 9 additions & 3 deletions iast/serializers/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@
from rest_framework import serializers

from dongtai.models.agent import IastAgent
from dongtai.models.project import IastProject
from dongtai.models.project import (IastProject, VulValidation)
from dongtai.models.vul_level import IastVulLevel
from dongtai.models.vulnerablity import IastVulnerabilityModel
from dongtai.models.vulnerablity import IastVulnerabilityStatus
from dongtai.utils import const

from dongtai.utils.systemsettings import get_vul_validate

class ProjectSerializer(serializers.ModelSerializer):
vul_count = serializers.SerializerMethodField(
Expand All @@ -23,12 +23,13 @@ class ProjectSerializer(serializers.ModelSerializer):
agent_language = serializers.SerializerMethodField(
help_text="Agent language currently included in the project")
USER_MAP = {}
vul_validation = serializers.SerializerMethodField(help_text="vul validation switch")

class Meta:
model = IastProject
fields = [
'id', 'name', 'mode', 'vul_count', 'agent_count', 'owner',
'latest_time', 'agent_language'
'latest_time', 'agent_language', 'vul_validation'
]

def get_agents(self, obj):
Expand Down Expand Up @@ -61,3 +62,8 @@ def get_agent_language(self, obj):
res = self.get_agents(obj).all().values_list(
'language', flat=True).distinct()
return list(res)

def get_vul_validation(self, obj):
return get_vul_validate(
) if obj.vul_validation == VulValidation.FOLLOW_GLOBAL else (
True if obj.vul_validation == VulValidation.ENABLE else False)
181 changes: 98 additions & 83 deletions iast/views/project_add.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@
from dongtai.endpoint import UserEndPoint
from dongtai.models.agent import IastAgent
from dongtai.models.project_version import IastProjectVersion
from dongtai.models.project import IastProject
from dongtai.models.project import (IastProject, VulValidation)
from dongtai.models.strategy_user import IastStrategyUser
from iast.base.project_version import version_modify, ProjectsVersionDataSerializer
from django.utils.translation import gettext_lazy as _
from iast.utils import extend_schema_with_envcheck, get_response_serializer
from rest_framework import serializers
from django.db import transaction

logger = logging.getLogger("django")

Expand All @@ -26,15 +27,16 @@ class _ProjectsAddBodyArgsSerializer(serializers.Serializer):
name = serializers.CharField(help_text=_('The name of project'))
agent_ids = serializers.CharField(help_text=_(
'The id corresponding to the agent, use, for segmentation.'))
mode = serializers.ChoiceField(['插桩模式'],
help_text=_('The mode of project'))
scan_id = serializers.IntegerField(
help_text=_("The id corresponding to the scanning strategy."))
version_name = serializers.CharField(
help_text=_("The version name of the project"))
pid = serializers.IntegerField(help_text=_("The id of the project"))
description = serializers.CharField(
help_text=_("Description of the project"))
vul_validation = serializers.BooleanField(
help_text="vul validation switch")



_ResponseSerializer = get_response_serializer(status_msg_keypair=(
Expand All @@ -60,85 +62,98 @@ class ProjectAdd(UserEndPoint):
response_schema=_ResponseSerializer,
)
def post(self, request):
try:
name = request.data.get("name")
mode = request.data.get("mode")
scan_id = request.data.get("scan_id")

if not scan_id or not name or not mode:
return R.failure(status=202, msg=_('Parameter error'))
auth_users = self.get_auth_users(request.user)
scan = IastStrategyUser.objects.filter(id=scan_id, user=request.user).first()
agent_ids = request.data.get("agent_ids", None)
if agent_ids:
agents = agent_ids.split(',')
else:
agents = []

version_name = request.data.get("version_name", "")
if not version_name:
version_name = "V1.0"
pid = request.data.get("pid", 0)

if pid:

project = IastProject.objects.filter(id=pid, user=request.user).first()
project.name = name
else:

project = IastProject.objects.filter(name=name, user=request.user).first()
if not project:
project = IastProject.objects.create(name=name, user=request.user)
with transaction.atomic():
try:
name = request.data.get("name")
mode = "插桩模式"
scan_id = request.data.get("scan_id")

auth_users = self.get_auth_users(request.user)
scan = IastStrategyUser.objects.filter(id=scan_id, user=request.user).first()
agent_ids = request.data.get("agent_ids", None)
if agent_ids:
try:
agents = [int(i) for i in agent_ids.split(',')]
except Exception as e:
print(e)
return R.failure(status=202, msg=_('Parameter error'))
else:
agents = []
if not scan_id or not name or not mode:
return R.failure(status=202, msg=_('Parameter error'))

version_name = request.data.get("version_name", "")
if not version_name:
version_name = "V1.0"
pid = request.data.get("pid", 0)
vul_validation = request.data.get("vul_validation", None)
vul_validation = vul_validation if vul_validation is None else (
VulValidation.ENABLE
if vul_validation == True else VulValidation.DISABLE)
if pid:
project = IastProject.objects.filter(id=pid, user=request.user).first()
project.name = name
else:

project = IastProject.objects.filter(name=name, user=request.user).first()
if not project:
project = IastProject.objects.create(name=name, user=request.user)
else:
return R.failure(status=203, msg=_('Failed to create, the application name already exists'))
versionInfo = IastProjectVersion.objects.filter(project_id=project.id, user=request.user, current_version=1, status=1).first()
if versionInfo:
project_version_id = versionInfo.id
else:
project_version_id = 0
current_project_version = {
"project_id": project.id,
"version_id": project_version_id,
"version_name": version_name,
"description": request.data.get("description", ""),
"current_version": 1
}
result = version_modify(request.user, current_project_version)
if result.get("status", "202") == "202":
return R.failure(status=202, msg=_("Parameter error"))
else:
project_version_id = result.get("data", {}).get("version_id", 0)

if agent_ids:
haveBind = IastAgent.objects.filter(
~Q(bind_project_id=project.id),
id__in=agents,
bind_project_id__gt=0,
user__in=auth_users).exists()
if haveBind:
return R.failure(status=202, msg=_('Agent has been bound by other application'))

project.scan = scan
project.mode = mode
project.agent_count = len(agents)
project.user = request.user
project.latest_time = int(time.time())
if vul_validation is not None:
project.vul_validation = vul_validation
if agents:
project.agent_count = IastAgent.objects.filter(
Q(id__in=agents) | Q(project_name=name),
user__in=auth_users,
bind_project_id=0,
project_version_id=0
).update(bind_project_id=project.id, project_version_id=project_version_id, online=1)
else:
return R.failure(status=203, msg=_('Failed to create, the application name already exists'))
versionInfo = IastProjectVersion.objects.filter(project_id=project.id, user=request.user, current_version=1, status=1).first()
if versionInfo:
project_version_id = versionInfo.id
else:
project_version_id =0
current_project_version = {
"project_id": project.id,
"version_id": project_version_id,
"version_name": version_name,
"description": request.data.get("description", ""),
"current_version": 1
}
result = version_modify(request.user, current_project_version)
if result.get("status", "202") == "202":
project.agent_count = IastAgent.objects.filter(
project_name=name, user__in=auth_users).update(
bind_project_id=project.id,
project_version_id=project_version_id)
project.save(update_fields=[
'name', 'scan_id', 'mode', 'agent_count', 'user_id',
'latest_time', 'vul_validation'
])

return R.success(
msg=_('Updated success')) if pid else R.success(
msg=_('Created success'))
except Exception as e:
logger.error(e)
return R.failure(status=202, msg=_("Parameter error"))
else:
project_version_id = result.get("data", {}).get("version_id", 0)

if agent_ids:
haveBind = IastAgent.objects.filter(
~Q(bind_project_id=project.id),
id__in=agents,
bind_project_id__gt=0,
user__in=auth_users).exists()
if haveBind:
return R.failure(status=202, msg=_('Agent has been bound by other application'))

project.scan = scan
project.mode = mode
project.agent_count = len(agents)
project.user = request.user
project.latest_time = int(time.time())

if agents:
project.agent_count = IastAgent.objects.filter(
Q(id__in=agents) | Q(project_name=name),
user__in=auth_users,
bind_project_id=0,
project_version_id=0
).update(bind_project_id=project.id, project_version_id=project_version_id, online=1)
else:
project.agent_count = IastAgent.objects.filter(
project_name=name, user__in=auth_users).update(
bind_project_id=project.id,
project_version_id=project_version_id)
project.save(update_fields=['name','scan_id', 'mode', 'agent_count', 'user_id', 'latest_time'])

return R.success(msg=_('Created success'))
except Exception as e:
logger.error(e)
return R.failure(status=202, msg=_("Parameter error"))

0 comments on commit b100963

Please sign in to comment.