(req *common.NhpAuthRequest, res *common.ResourceData)
| 1051 | } |
| 1052 | |
| 1053 | func (s *UdpServer) handleNhpOpenResource(req *common.NhpAuthRequest, res *common.ResourceData) (ackMsg *common.ServerKnockAckMsg, err error) { |
| 1054 | knkMsg := req.Msg |
| 1055 | srcAddr := req.SrcAddr |
| 1056 | addrStr := srcAddr.String() |
| 1057 | ackMsg = req.Ack |
| 1058 | |
| 1059 | acDstIpMap := make(map[string][]*common.NetAddress) |
| 1060 | for resName, info := range res.Resources { |
| 1061 | addrs, exist := acDstIpMap[resName] |
| 1062 | if exist { |
| 1063 | addrs = append(addrs, info.Addr) |
| 1064 | acDstIpMap[resName] = addrs |
| 1065 | } else { |
| 1066 | acDstIpMap[resName] = []*common.NetAddress{info.Addr} |
| 1067 | } |
| 1068 | } |
| 1069 | |
| 1070 | // PART III: request ac operation for each resource and block for response |
| 1071 | var acWg sync.WaitGroup |
| 1072 | var artMsgsMutex sync.Mutex |
| 1073 | artMsgs := make(map[string]*common.ACOpsResultMsg) |
| 1074 | ackMsg.ResourceHost = make(map[string]string) |
| 1075 | ackMsg.ACTokens = make(map[string]string) |
| 1076 | ackMsg.PreAccessActions = make(map[string]*common.PreAccessInfo) |
| 1077 | |
| 1078 | for resName, addrs := range acDstIpMap { |
| 1079 | resInfo := res.Resources[resName] |
| 1080 | if resInfo == nil { |
| 1081 | continue |
| 1082 | } |
| 1083 | acId := resInfo.ACId |
| 1084 | s.acConnectionMapMutex.Lock() |
| 1085 | acConn, found := s.acConnectionMap[acId] |
| 1086 | s.acConnectionMapMutex.Unlock() |
| 1087 | if !found { |
| 1088 | log.Warning("server-agent(%s@%s)-ac(@%s)[handleNhpOpenResource] no ac connection is available", knkMsg.UserId, addrStr, acId) |
| 1089 | artMsg := &common.ACOpsResultMsg{} |
| 1090 | err = common.ErrACConnectionNotFound |
| 1091 | artMsg.ErrCode = common.ErrACConnectionNotFound.ErrorCode() |
| 1092 | artMsg.ErrMsg = err.Error() |
| 1093 | artMsgsMutex.Lock() |
| 1094 | artMsgs[resName] = artMsg |
| 1095 | artMsgsMutex.Unlock() |
| 1096 | continue |
| 1097 | } |
| 1098 | |
| 1099 | acWg.Add(1) |
| 1100 | go func(name string, info *common.ResourceInfo, dstAddrs []*common.NetAddress) { |
| 1101 | defer acWg.Done() |
| 1102 | |
| 1103 | openTime := res.OpenTime |
| 1104 | if knkMsg.HeaderType == core.NHP_EXT { |
| 1105 | openTime = 1 // timeout in 1 second |
| 1106 | } |
| 1107 | artMsg, err := s.processACOperation(knkMsg, acConn, srcAddr, dstAddrs, openTime) |
| 1108 | artMsgsMutex.Lock() |
| 1109 | artMsgs[name] = artMsg |
| 1110 | if err == nil { |
no test coverage detected