You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

402 lines
11 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package ValidationUtil
import (
"dsDataex/MyService/DataEX"
"dsDataex/MyService/DataEX/DataexDAO"
"dsDataex/MyService/MySwagger"
"dsDataex/Utils/CommonUtil"
"encoding/json"
"fmt"
"reflect"
"regexp"
"strings"
"time"
)
var dics []map[string]interface{}
const TIME_LAYOUT = "2020-09-14 15:29:10"
/**
* @title ValidESDataContent
* @Description 校验ESDataContent
* @Author wangshuai
* @Date 2020-09-16
* @Param datasourceCode string 数据源CODE
* @Param datas []MySwagger.Data Data
* @Return bool 校验是否完全通过
* @Return string 提示信息
* @Return []MySwagger.Data 校验通过数据集合
* @Return []string 校验失败ID集合
*/
func ValidESDataContent(datasourceCode string, datas []MySwagger.Data) (bool, string, []MySwagger.Data, []map[string]string, []string) {
var dataContent map[string]interface{}
var failMessages string
var failIDs []string
var dataContentFailIDs []map[string]string
var successDatas []MySwagger.Data
var conditions string
var esData DataEX.ESData
var r bool
var dicIds []string
var dicIdsStr string
fmt.Println("datas: ", datas)
conditions = "datasource_id='" + datasourceCode + "'"
// 获取该数据源对应的元数据集合
result, _, _, metadatas, _ := DataexDAO.GetMetadataResults(conditions)
if result == true {
for _, vv := range metadatas {
// 从元数据集合获取该数据源对应的含有字典ID的字典ID集合
if vv["dic_id"].(string) != "" {
dicIds = append(dicIds, "'" + vv["dic_id"].(string) + "'")
}
}
// 字典ID集合字符串
dicIdsStr = strings.Join(dicIds, ", ")
// 获取含有
_, _, _, dics, _ = DataexDAO.GetJyt2012ResultsByParentIds(dicIdsStr)
for no := 0; no < len(datas) && no < 1000; no++ {
r = true
var jsonData map[string]interface{}
json.Unmarshal([]byte(datas[no].Data), &jsonData)
esData.DataContent = jsonData
dataContent = esData.DataContent
for _, v := range metadatas {
// 判断集合中是否含有该项数据
if _, ok := dataContent[v["item_name"].(string)]; ok {
// 校验数据
res, mes, _ := ValidESDataContentItem(v, v["item_name"].(string), dataContent[v["item_name"].(string)])
//fmt.Println(res, mes)
if res == false {
failMessages = v["item_name"].(string) + mes + " "
r = false
// 将校验失败的ID集合写入到failIDs
//failIDs = append(failIDs, datas[no].DataID)
// 将校验失败的ID和提示信息写入到fails集合
fails := make(map[string]string)
fails["fail_id"] = datas[no].DataID
fails["fail_msg"] = failMessages
dataContentFailIDs = append(dataContentFailIDs,fails)
failIDs = append(failIDs, datas[no].DataID)
break
}
}
}
if r == true {
// 将校验通过的数据集合写入到successDatas
successDatas = append(successDatas, datas[no])
}
}
}
// 首尾去空格
//fails = strings.TrimRight(fails, " ")
return r, failMessages, successDatas, dataContentFailIDs, failIDs
}
/**
* @title ValidESDataContentItem
* @Description 校验ESDataContent每项元数据
* @Author wangshuai
* @Date 2020-09-16
* @Param dataContentItem map[string]interface{} 数据源CODE
* @Param itemName string 校验项名称
* @Param itemValue interface{} 校验项值
* @Return bool 校验是否通过
* @Return string 校验提示信息
* @Return error 错误信息
*/
func ValidESDataContentItem(dataContentItem map[string]interface{}, itemName string, itemValue interface{}) (bool, string, error) {
if dataContentItem != nil {
dicId := dataContentItem["dic_id"].(string)
itemLength := dataContentItem["item_length"].(int64)
itemType := dataContentItem["item_type"].(string)
itemPattern := dataContentItem["item_pattern"].(string)
checkName := dataContentItem["check_name"].(int64)
checkDic := dataContentItem["check_dic"].(int64)
checkType := dataContentItem["check_type"].(int64)
checkPattern := dataContentItem["check_pattern"].(int64)
checkExist := dataContentItem["check_exist"].(int64)
//fmt.Println("dataContentItem: ", dataContentItem)
if itemLength > 0 { // 校验长度
if CommonUtil.ConvertIntToInt64(len(itemValue.(string))) > itemLength {
fmt.Println(itemValue.(string) + "最大长度超出")
return false, "最大长度超出", nil
}
} else if checkName > 0 { // 校验名称
} else if checkDic > 0 { // 校验字典
if CheckDic(itemValue, dicId, dics) == false {
fmt.Println("字典校验不通过")
return false, "字典校验不通过", nil
}
} else if checkType > 0 { // 校验类型
if CheckType(itemValue, itemType) == false {
fmt.Println("类型校验不通过")
return false, "类型校验不通过", nil
}
} else if checkPattern > 0 { // 校验规则
if CheckPattern(itemValue, itemPattern) == false {
fmt.Println("数据项模式校验不通过")
return false, "数据项模式校验不通过", nil
}
} else if checkExist > 0 { // 校验必填项
if itemValue == nil {
fmt.Println("是必填项")
return false, itemName + "是必填项", nil
}
}
} else {
fmt.Println("缺少dataContentItem")
return false, "校验失败, 缺少dataContentItem", nil
}
return true, "ok", nil
}
/**
* @title ValidGPSql
* @Description 校验SQL注入
* @Author wangshuai
* @Date 2021-02-26
* @Param params []string SQL参数
* @Return bool 校验是否通过
* @Return string 校验提示信息
* @Return error 错误信息
*/
func ValidGPSql(params []string) (bool, string, error) {
flag := true
msg := ""
var err error
for _, v := range params {
// 校验关键字
matchKeyword, _ := regexp.MatchString("SELECT|INSERT|DELETE|FROM|COUNT\\(|DROP TABLE|TRUNCATE|\\ASC|MID\\(|CHAR\\(|XP_CMDSHELL|EXEC MASTER|NETLOCALGROUP ADMINISTRATORS|\\:|NET USER|\"\"|OR|AND", strings.ToUpper(v))
// 校验关键字符
matchCharacter, _ := regexp.MatchString("[-|;|,|\\?|/|\\(|\\)|\\[|\\]|}|{|%|\\@|*|!|']", v)
if matchKeyword == true || matchCharacter == true {
flag = false
msg = "SQL注入校验不通过"
}
}
return flag, msg, err
}
/**
* @title ValidHyperSql
* @Description 校验SQL注入
* @Author wangshuai
* @Date 2021-02-26
* @Param params []string SQL参数
* @Return bool 校验是否通过
* @Return string 校验提示信息
* @Return error 错误信息
*/
func ValidHyperSql(params []string) (bool, string, error) {
flag := true
msg := ""
var err error
for _, v := range params {
// 校验关键字
matchKeyword, _ := regexp.MatchString("SELECT|INSERT|DELETE|FROM|COUNT\\(|DROP TABLE|TRUNCATE|\\ASC|MID\\(|CHAR\\(|XP_CMDSHELL|EXEC MASTER|NETLOCALGROUP ADMINISTRATORS|\\:|NET USER|\"\"|OR|AND", strings.ToUpper(v))
// 校验关键字符
matchCharacter, _ := regexp.MatchString("[-|;|,|\\?|/|\\(|\\)|\\[|\\]|}|{|%|\\@|*]", v)
if matchKeyword == true || matchCharacter == true {
flag = false
msg = "SQL注入校验不通过"
}
}
return flag, msg, err
}
/**
* @title CheckDic
* @Description 字典校验
* @Author wangshuai
* @Date 2020-09-16
* @Param itemValue interface{} 字典项值
* @Param dicId string 字典ID
* @Param dics []map[string]interface{} 字典项值
* @Return bool 校验是否通过
*/
func CheckDic(itemValue interface{}, dicId string, dics []map[string]interface{}) bool {
flag := false
for _, v := range dics {
if v["dic_value"] == itemValue && v["parent_id"] == dicId {
flag = true
}
}
return flag
}
/**
* @title CheckType
* @Description 类型校验
* @Author wangshuai
* @Date 2020-09-23
* @Param itemValue interface{} 项值
* @Param itemType string 类型
* @Return bool 校验是否通过
*/
func CheckType(itemValue interface{}, itemType string) bool {
flag := false
fmt.Println("itemType: ", itemType)
if itemType == "string" { // 校验是否是字符串
_, ok := itemValue.(string)
if ok {
flag = true
}
tp := reflect.TypeOf(itemValue)
fmt.Println("tp: ", tp)
} else if itemType == "float" { // 校验是否是浮点数
//tp := reflect.TypeOf(itemValue)
//fmt.Println("tp: ", tp)
_, ok := itemValue.(float32)
if ok {
flag = true
}
_, ok1 := itemValue.(float64)
if ok1 {
flag = true
}
//fmt.Println("flag: ", flag)
} else if itemType == "datetime" { // 校验时间格式是否正确
_, e := time.Parse(TIME_LAYOUT, itemValue.(string))
if e == nil {
flag = true
}
} else if itemType == "text" { // 校验是否是文本
_, ok := itemValue.(string)
if ok {
flag = true
}
}
return flag
}
/**
* @title CheckPattern
* @Description 数据项模式校验
* @Author wangshuai
* @Date 2020-09-23
* @Param itemValue interface{} 项值
* @Param itemPattern string 模式
* @Return bool 校验是否通过
*/
func CheckPattern(itemValue interface{}, itemPattern string) bool {
flag := false
if itemPattern == "valid_email" {
if ValidEmail(itemValue.(string)) {
flag = true
}
} else if itemPattern == "valid_mobile" {
if ValidMobile(itemValue.(string)) {
flag = true
}
}
return flag
}
/**
* @title ValidTelephone
* @Description 校验家用电话(不带前缀) 最高8位
* @Author wangshuai
* @Date 2020-09-23
* @Param str ...string 项值
* @Return bool 校验是否通过
*/
func ValidTelephone(str ...string) bool {
var b bool
for _, s := range str {
b, _ = regexp.MatchString("^[0-9]{8}$", s)
if false == b {
return b
}
}
return b
}
/**
* @title ValidMobile
* @Description 校验手提电话不带前缀最高11位
* @Author wangshuai
* @Date 2020-09-23
* @Param str ...string 项值
* @Return bool 校验是否通过
*/
func ValidMobile(str ...string) bool {
var b bool
for _, s := range str {
b, _ = regexp.MatchString("^1[0-9]{10}$", s)
if false == b {
return b
}
}
return b
}
/**
* @title ValidEmail
* @Description 校验邮箱 最高30位
* @Author wangshuai
* @Date 2020-09-23
* @Param str ...string 项值
* @Return bool 校验是否通过
*/
func ValidEmail(str ...string) bool {
var b bool
for _, s := range str {
b, _ = regexp.MatchString("^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$", s)
if false == b {
return b
}
}
return b
}
// 暂时作废 2020-09-16
func ValidESDataContentBak(datasourceCode string, dataContent map[string]interface{}) (bool, string) {
var fails string
var conditions string
r := true
conditions = " AND datasource_id=" + datasourceCode
result, _, _, metadatas, _ := DataexDAO.GetMetadataResults(conditions)
if result == true {
for _, v := range metadatas {
for _, vv := range v {
if _, ok := dataContent[vv.(string)]; ok {
res, mes, _ := ValidESDataContentItem(v, vv.(string), dataContent[vv.(string)])
if res == false {
fails += vv.(string) + mes + " "
r = false
}
}
}
}
}
fails = strings.TrimRight(fails, " ")
return r, fails
}
// 暂时作废 2020-09-18
func CheckDicBak(dicId string, itemValue interface{}) bool {
total := DataexDAO.GetJyt2012CountByParentIdAndDicValue(dicId, itemValue.(string))
if total > 0 {
return true
} else {
return false
}
}