diff --git a/src/modules/network_data/controller/udm_auth.go b/src/modules/network_data/controller/udm_auth.go index e19888a9..d916957c 100644 --- a/src/modules/network_data/controller/udm_auth.go +++ b/src/modules/network_data/controller/udm_auth.go @@ -15,6 +15,7 @@ import ( "be.ems/src/framework/vo/result" "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" + neFetchlink "be.ems/src/modules/network_element/fetch_link" neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" @@ -411,7 +412,11 @@ func (s *UDMAuthController) Export(c *gin.Context) { data := [][]string{} data = append(data, []string{"imsi", "ki", "algo", "amf", "opc"}) for _, v := range list { - data = append(data, []string{v.IMSI, v.Ki, v.AlgoIndex, v.Amf, v.Opc}) + opc := v.Opc + if opc == "-" { + opc = "" + } + data = append(data, []string{v.IMSI, v.Ki, v.AlgoIndex, v.Amf, opc}) } // 输出到文件 err := file.WriterFileCSV(data, filePath) @@ -425,7 +430,11 @@ func (s *UDMAuthController) Export(c *gin.Context) { // 转换数据 data := [][]string{} for _, v := range list { - data = append(data, []string{v.IMSI, v.Ki, v.AlgoIndex, v.Amf, v.Opc}) + opc := v.Opc + if opc == "-" { + opc = "" + } + data = append(data, []string{v.IMSI, v.Ki, v.AlgoIndex, v.Amf, opc}) } // 输出到文件 err = file.WriterFileTXT(data, ",", filePath) @@ -446,6 +455,8 @@ func (s *UDMAuthController) Import(c *gin.Context) { var body struct { NeId string `json:"neId" binding:"required"` UploadPath string `json:"uploadPath" binding:"required"` + TypeVal string `json:"typeVal" binding:"required,oneof=default k4"` + TypeData any `json:"typeData"` } if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) @@ -497,16 +508,30 @@ func (s *UDMAuthController) Import(c *gin.Context) { } defer telnetClient.Close() - // 发送MML - cmd := fmt.Sprintf("import authdat:path=%s", neFilePath) - data, err := telnet.ConvertToStr(telnetClient, cmd) - if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + // 结果信息 + var resultMsg string + var resultErr error + + // 默认的情况 发送MML + if body.TypeVal == "default" { + cmd := fmt.Sprintf("import authdat:path=%s", neFilePath) + resultMsg, resultErr = telnet.ConvertToStr(telnetClient, cmd) + } + + // K4类型发特定请求 + if body.TypeVal == "k4" { + resultMsg, resultErr = neFetchlink.UDMImportAuth(neInfo.IP, map[string]any{ + "path": neFilePath, "k4": body.TypeData, + }) + } + + if resultErr != nil { + c.JSON(200, result.ErrMsg(resultErr.Error())) return } // 命令ok时 - if strings.Contains(data, "ok") { + if strings.Contains(resultMsg, "ok") { if strings.HasSuffix(body.UploadPath, ".csv") { data := file.ReadFileCSV(localFilePath) neId := "" @@ -518,5 +543,5 @@ func (s *UDMAuthController) Import(c *gin.Context) { go s.udmAuthService.InsertData(neId, "txt", data) } } - c.JSON(200, result.OkMsg(data)) + c.JSON(200, result.OkMsg(resultMsg)) } diff --git a/src/modules/network_data/udm_k4_test.go b/src/modules/network_data/udm_k4_test.go new file mode 100644 index 00000000..99580c4f --- /dev/null +++ b/src/modules/network_data/udm_k4_test.go @@ -0,0 +1,54 @@ +package networkdata + +import ( + "crypto/des" + "errors" + "testing" +) + +// 加密 +func encrypt(origData, key []byte) ([]byte, error) { + if len(origData) < 1 || len(key) < 1 { + return nil, errors.New("wrong data or key") + } + block, err := des.NewCipher(key) + if err != nil { + return nil, err + } + bs := block.BlockSize() + if len(origData)%bs != 0 { + return nil, errors.New("wrong padding") + } + out := make([]byte, len(origData)) + dst := out + for len(origData) > 0 { + block.Encrypt(dst, origData[:bs]) + origData = origData[bs:] + dst = dst[bs:] + } + return out, nil +} + +func TestEncrypt(t *testing.T) { + // key := []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef} + // 0123456789abcdef + + // ki := []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef} + // 0123456789abcdef0123456789abcdef + + // 密码 + key := []byte{0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34} + // 1234123412341234 + + // 要加密的ki + ki := []byte{0x80, 0x5D, 0xAD, 0xC6, 0xE8, 0xA5, 0x4A, 0x0D, 0x59, 0xD6, 0x22, 0xC7, 0xA0, 0x4D, 0x08, 0xE0} + // 805DADC6E8A54A0D59D622C7A04D08E0 + + kis, err := encrypt(ki, key) + + // 加密后的,放导入导入文件里ki + t.Errorf("kis: %x\n", kis) + // 3e479135bb16f45dc874a18831b54d71 + + t.Errorf("err: %v\n", err) +} diff --git a/src/modules/network_element/fetch_link/udm.go b/src/modules/network_element/fetch_link/udm.go index 0a82641b..2f1119c3 100644 --- a/src/modules/network_element/fetch_link/udm.go +++ b/src/modules/network_element/fetch_link/udm.go @@ -3,6 +3,7 @@ package fetchlink import ( "encoding/json" "fmt" + "strings" "be.ems/src/framework/logger" "be.ems/src/framework/utils/fetch" @@ -30,7 +31,7 @@ func UDMImportAuth(udmIP string, data map[string]any) (string, error) { return "", err } if v, ok := resData["code"]; ok && v == "00000" { - return "ok", nil + return strings.TrimSpace(strings.ToLower(resData["message"])), nil } return "", fmt.Errorf(resData["message"]) }