OWL ITS + 탐지시스템(인터넷 진흥원)
이민희
2022-03-17 916a3cbabe4e50062fce61ff6f2f5d46c05dfbd1
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -7,7 +7,6 @@
import kr.wisestone.owl.constant.*;
import kr.wisestone.owl.data.CheckIssueData;
import kr.wisestone.owl.domain.*;
import kr.wisestone.owl.domain.enumType.CustomFieldType;
import kr.wisestone.owl.domain.enumType.EmailType;
import kr.wisestone.owl.domain.enumType.IssueHistoryType;
import kr.wisestone.owl.domain.enumType.IssueStatusType;
@@ -48,9 +47,9 @@
import java.io.IOException;
import java.text.ParseException;
import java.util.*;
import java.util.regex.Pattern;
import static kr.wisestone.owl.domain.enumType.CustomFieldType.*;
import static kr.wisestone.owl.web.condition.CompanyFieldCondition.IP_DEFAULT;
@Service
public class IssueServiceImpl extends AbstractServiceImpl<Issue, Long, JpaRepository<Issue, Long>> implements IssueService {
@@ -311,7 +310,7 @@
                }
                // 중복된 상위 이슈검색
                List<Issue> issues = this.findIssue(issueApiForm, issueForm, customFieldApiOverlaps, user.getId());
                List<Issue> issues = this.findIssue(issueApiForm, issueForm, customFieldApiOverlaps);
                int size = issues.size();
                if (size > 0) {
                    Issue targetIssue = issues.get(0);
@@ -341,6 +340,7 @@
    /**
     * 도메인이 동일한 업체 찾기
     *
     * @param issueForm IssueForm
     * @return IssueForm
     */
@@ -400,20 +400,74 @@
    }
    /**
     * 입력한 ip가 기존 업체 중에 속해있는지 체크
     *
     * @param ip IP
     * @param startIps 업체 테이블에 존재하는 start_ip(정수로 변환한 값)
     * @param endIps 업체 테이블에 존재하는 end_ip(정수로 변환한 값)
     * @return IP가 속해 있는지 결과 값
     */
    boolean containsIP(Long ip, List<Long> startIps, List<Long> endIps) {
        if (startIps != null && startIps.size() > 0 && endIps != null && endIps.size() > 0) {
            for (int i = 0; i < startIps.size(); i++) {
                if (startIps.get(i) <= ip && endIps.get(i) >= ip) {
                    return true;
                }
            }
        }
        return false;
    }
    /**
     * 조건에 맞는 파트너 정보 찾기
     *
     * @param condition CompanyFieldCondition
     * @param issueCompanyFields List<Map<String, Object>>
     * @param issueIspFields List<Map<String, Object>>
     * @param issueHostingFields List<Map<String, Object>>
     */
    private void findPartner(CompanyFieldCondition condition, List<Map<String, Object>> issueCompanyFields
    private CompanyFieldVo findPartner(CompanyFieldCondition condition, List<Map<String, Object>> issueCompanyFields
            , List<Map<String, Object>> issueIspFields, List<Map<String, Object>> issueHostingFields) {
        List<Map<String, Object>> companyFields = this.companyFieldService.find(condition);
        Long ip = condition.getIp();
        List<Map<String, Object>> companyFieldList = Lists.newArrayList();
        if (ip > IP_DEFAULT) {
            List<CompanyField> companyFields = this.companyFieldService.findAll();
        if(companyFields != null && companyFields.size() > 0) {
            for (Map<String, Object> companyField : companyFields) {
                CompanyFieldVo companyFieldVo = ConvertUtil.convertMapToClass(companyField, CompanyFieldVo.class);
                for (CompanyField companyField : companyFields) {
                    if (companyField.getIpStart() != null && companyField.getIpEnd() != null) {
                        List<Long> startIps = ConvertUtil.ipToLongs(companyField.getIpStart());
                        List<Long> endIps = ConvertUtil.ipToLongs(companyField.getIpEnd());
                        if (containsIP(ip, startIps, endIps)) {
                            companyFieldList.add(ConvertUtil.convertObjectToMap(companyField));
                            break;
                        }
                    }
                }
                //  api 사용자정의필드 값에 IP,URL 둘 다 입력 했을 경우
                if (!StringUtils.isEmpty(condition.getUrl()) && companyFieldList.size() > 0) {
                    for (Map<String, Object> companyFieldMap : companyFieldList) {
                        CompanyField companyField = ConvertUtil.convertMapToClass(companyFieldMap, CompanyField.class);
                        if (companyField != null && !StringUtils.isEmpty(companyField.getUrl())) {
                            if (!companyField.getUrl().contains(condition.getUrl())) {
                                companyFieldList.clear();
                            }
                            break;
                        }
                    }
                }
            }
        } else {
            companyFieldList = this.companyFieldService.find(condition);
        }
        CompanyFieldVo companyFieldVo = null;
        if (companyFieldList != null && companyFieldList.size() > 0) {
            for (Map<String, Object> companyField : companyFieldList) {
                companyFieldVo = ConvertUtil.convertMapToClass(companyField, CompanyFieldVo.class);
                companyField.put("companyId", companyField.get("id"));
                issueCompanyFields.add(companyField);
                if(companyFieldVo.getIspId() != null && companyFieldVo.getIspId() != -1) {
@@ -432,6 +486,7 @@
                }
            }
        }
        return companyFieldVo;
    }
    private User convertToUser(String token) {
@@ -487,114 +542,56 @@
    }
    /**
     * url 정규식 표현
     * @param url String
     * 사용자정의 필드 검사
     * 도메인 or IP 일 경우만 처리하기 위함
     *
     * @param issueCustomFieldValueForms 사용자 정의 필드 값 배열
     * @return 업체 검색 조건
     */
    private boolean verifyUrl(String url) {
        boolean urlChk = false;
        if (!StringUtils.isEmpty(url)) {
            String reg = "^((http|https)://)?(www.)?([a-zA-Z0-9]+)\\.[a-z]+([a-zA-z0-9.?#]+)?";
            if(Pattern.matches(reg, url)) {
                urlChk = true;
            }
        }
        return urlChk;
    }
    /**
     * ip 정규식 표현
     * @param ip String
     * @return boolean
     */
    private boolean verifyIp(String ip) {
        boolean ipChk = false;
        if (!StringUtils.isEmpty(ip)) {
            if (Pattern.matches("^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\" +
                    ".(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$", ip)) {
                ipChk = true;
            }
        }
        return ipChk;
    }
    // 중복된 상위 이슈 검색
    private List<Issue> findIssue(IssueApiForm issueApiform, IssueForm issueForm, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) {
        List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues();
        List<Issue> resultIssueVos = Lists.newArrayList();
        String comma = ",";
    private CompanyFieldCondition validIssueCustomFieldValue(List<IssueCustomFieldValueForm> issueCustomFieldValueForms, List<CustomFieldApiOverlap> customFieldApiOverlaps) {
        CompanyFieldCondition condition = new CompanyFieldCondition();
        if (issueCustomFieldValueForms.size() > 0) {
            String concatUseValue = "";
            String customFieldType = "";
            int useIdx = 0;
            int cntIp = 0;
            int cntSite = 0;
            IssueCustomFieldValueFormComparator comp = new IssueCustomFieldValueFormComparator();
            Collections.sort(issueCustomFieldValueForms, comp);
            List<String> userValues = Lists.newArrayList();
            CompanyFieldCondition condition = new CompanyFieldCondition();
            List<Map<String, Object>> issueCompanyFields = Lists.newArrayList();
            List<Map<String, Object>> issueIspFields = Lists.newArrayList();
            List<Map<String, Object>> issueHostingFields = Lists.newArrayList();
            for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) {
                for (CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) {
                    if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValueForm.getCustomFieldId())) {
                        String useValue = issueCustomFieldValueForm.getUseValue();
                        if (CommonUtil.verifyIp(useValue)) {
                            long ip = ConvertUtil.ipToLong(useValue);
                            if (condition.getIp() <= IP_DEFAULT) {
                                condition.setIp(ip);
                            } else {
                                throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_IP_ERROR));
                            }
                        } else if (CommonUtil.verifyUrl(useValue)) {
                            if (StringUtils.isEmpty(condition.getUrl())) {
                                condition.setUrl(useValue);
                            } else {
                                throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_URL_ERROR));
                            }
                        }
                    }
                }
            }
        }
        return condition;
    }
    String ConvertToString(List<IssueCustomFieldValueForm> issueCustomFieldValueForms, List<CustomFieldApiOverlap> customFieldApiOverlaps) {
        String concatUseValue = "";
        int useIdx = 0;
            for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) {
                userValues.add(issueCustomFieldValueForm.getUseValue());
                for(CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) {
                    if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValueForm.getCustomFieldId())) {
                        String useValue = issueCustomFieldValueForm.getUseValue();
                        if (useValue.contains(" ")) {
                            useValue = useValue.replace(" ","");
                        }
                        if (this.verifyIp(useValue)) {
                            long ip = ConvertUtil.ipToLong(useValue);
                            customFieldType = IP_ADDRESS.toString();
                            if (cntIp == 0){
                                condition.setIp(ip);
                            }
                            cntIp ++;
                        }
                        if (this.verifyUrl(useValue)) {
                            customFieldType = SITE.toString();
                            if (cntSite == 0) {
                                condition.setUrl(useValue);
                            }
                            cntSite ++;
                        }
                        /*if (customFieldApiOverlap.getCustomField().getCustomFieldType().equals(IP_ADDRESS)) {
                            long ip = ConvertUtil.ipToLong(useValue);
                            customFieldType = IP_ADDRESS.toString();
                            if (cntIp == 0){
                                condition.setIp(ip);
                            }
                            cntIp ++;
                        }*/
                        /*if(customFieldApiOverlap.getCustomField().getCustomFieldType().equals(SITE)) {
                            customFieldType = SITE.toString();
                            String[] urlArr = null;
                            List<String> urls = Lists.newArrayList();
                            if (useValue.contains(",")) {
                                urlArr = useValue.split(",");
                                urls.addAll(Arrays.asList(urlArr));
                            } else {
                                urls.add(useValue);
                            }
                            if (cntSite == 0) {
                                condition.setUrl(urls);
                            }
                            cntSite ++;
                        }*/
                        if (useIdx > 0) {
                            concatUseValue = concatUseValue.concat(comma);
                        concatUseValue = concatUseValue.concat(CommonUtil.COMMA);
                        }
                        concatUseValue = concatUseValue.concat(issueCustomFieldValueForm.getUseValue());
                        useIdx++;
@@ -602,38 +599,44 @@
                }
            }
            // 추가 할 url or ip에 포함되어있는 파트너 찾기
            if ((condition.getIp() > 0) || (condition.getUrl() != null && !condition.getUrl().equals(""))) {
                this.findPartner(condition, issueCompanyFields, issueIspFields, issueHostingFields);
        return  concatUseValue;
            }
            issueForm.setIssueCompanyFields(issueCompanyFields);
            issueForm.setIssueIspFields(issueIspFields);
            issueForm.setIssueHostingFields(issueHostingFields);
    List<String> GetOverlapUseValues(List<IssueCustomFieldValueForm> issueCustomFieldValueForms) {
        List<String> resultValues = Lists.newArrayList();
        for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) {
            resultValues.add(issueCustomFieldValueForm.getUseValue());
        }
        return resultValues;
    }
    // 중복된 상위 이슈 검색
    private List<Issue> findIssue(IssueApiForm issueApiform, IssueForm issueForm, List<CustomFieldApiOverlap> customFieldApiOverlaps) {
        List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues();
        List<Issue> resultIssueVos = Lists.newArrayList();
        CompanyFieldVo companyFieldVo = null;
        CompanyFieldCondition condition = validIssueCustomFieldValue(issueCustomFieldValueForms, customFieldApiOverlaps);
        if (condition.getIp() != null || !StringUtils.isEmpty(condition.getUrl())) {
            // 추가 할 url or ip에 포함되어있는 파트너 찾기
            companyFieldVo = this.findPartner(condition, issueForm.getIssueCompanyFields(), issueForm.getIssueIspFields(), issueForm.getIssueHostingFields());
        }
        if (issueCustomFieldValueForms.size() > 0) {
            String concatUseValue = ConvertToString(issueCustomFieldValueForms, customFieldApiOverlaps);
            List<String> useValues = GetOverlapUseValues(issueCustomFieldValueForms);
            IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
            issueCustomFieldValueCondition.setUseValue(concatUseValue);
            issueCustomFieldValueCondition.setUseValues(userValues);
            issueCustomFieldValueCondition.setUseValues(useValues);
            issueCustomFieldValueCondition.setIssueTypeId(issueApiform.getIssueTypeId());
            issueCustomFieldValueCondition.setCustomFieldType(customFieldType);
//            issueCustomFieldValueCondition.setIssueStatusType("CLOSE");
            List<Map<String, Object>> results = Lists.newArrayList();
            if (customFieldType.equals(IP_ADDRESS.toString()) && issueForm.getIssueCompanyFields() != null && issueForm.getIssueCompanyFields().size() > 0) {
                long ipValue = 0;
                if (concatUseValue.contains(",")) {
                    String[] arr = concatUseValue.split(",");
                    for (String str : arr) {
                        ipValue = ConvertUtil.ipToLong(str);
                    }
                } else {
                    ipValue = ConvertUtil.ipToLong(concatUseValue);
                }
                issueCustomFieldValueCondition.setUseValue(String.valueOf(ipValue));
            }
            if (issueCustomFieldValueCondition.getCustomFieldType() != null && !issueCustomFieldValueCondition.getCustomFieldType().equals("")) {
                //  사용자정의필드 타입이 IP_ADDRESS 또는 SITE 일 경우
                results = this.issueMapper.findByCustomFieldValueByCompany(issueCustomFieldValueCondition);
            if (companyFieldVo != null) {
                //  url or ip를 통해 업체를 찾았을 경우
                issueCustomFieldValueCondition.setUseValue(companyFieldVo.getUrl());
                results = this.issueMapper.findByCustomFieldValueBySite(issueCustomFieldValueCondition);
            } else {
                results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
            }
@@ -851,6 +854,7 @@
    /**
     * Issue를 IssueVo로 변환(하위이슈의 파트너 정보 상속 시 필요)
     *
     * @param issue Issue
     * @return IssueVo
     */
@@ -1070,6 +1074,7 @@
    /**
     * 날짜 유효성 체크
     *
     * @param startDate 시작 일자(문자)
     * @param completeDate 종료 일자(문자)
     */
@@ -1083,6 +1088,7 @@
    /**
     * 날짜 유효성 체크
     *
     * @param start 시작 일자
     * @param end 종료 일자
     */
@@ -1512,8 +1518,7 @@
                return true;
            }/*else if (MngPermission.checkMngPermission(userLevel.getPermission(), MngPermission.USER_PERMISSION_MNG_ISSUE)){
                projects = this.projectService.findByWorkspaceIdAndIncludeProjectAll(projectStatues, condition.getProjectType());
            }*/
            else {
            }*/ else {
                projects = this.projectService.findByWorkspaceIdAndIncludeProject(projectStatues, condition.getProjectType());
            }
@@ -2267,7 +2272,6 @@
        UserVo userVo = ConvertUtil.copyProperties(user, UserVo.class);
        log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(userVo, ElasticSearchConstants.ISSUE_MODIFY));
    }
    private Issue saveIssue(IssueForm issueForm, CheckIssueData checkIssueData) {
@@ -3440,6 +3444,7 @@
    /**
     * 엑셀로 입력한 파트너 정보 저장
     *
     * @param issueForm IssueForm
     */
    private void setIssuePartners(IssueForm issueForm, Issue issue) {
@@ -3607,6 +3612,7 @@
    /**
     * 엑셀에 업체명을 입력하지 않았을 경우 같은 도메인 업체 찾기
     *
     * @param issueForm IssueForm
     */
    private void findPartnerByDomain(IssueForm issueForm) {
@@ -3695,6 +3701,7 @@
    /**
     * cell String으로 변환 함수
     *
     * @param cell Cell
     * @param isNull boolean
     * @return String
@@ -3714,6 +3721,7 @@
    /**
     * cell NULL 체크 함수
     * 빈 값이 아닌 cell 체크
     *
     * @param cell Cell
     * @return boolean
     */
@@ -3934,6 +3942,7 @@
            issueForm.setUserIds(userIds);
        }
    }
    //  시작일, 종료일을 IssueForm 에 저장한다.
    private void setIssueFormPeriod(String periodDate, IssueForm issueForm, Boolean checkStartDate, int rowIndex, boolean isNull) throws ParseException {
        if (!isNull) {
@@ -4390,6 +4399,7 @@
    /**
     * 상위이슈의 파트너 정보 상속받기
     *
     * @param issue Issue
     * @param parentIssue Issue
     * @return Issue