diff --git a/go.mod b/go.mod index a4361c1..d1db87e 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.17 require ( github.com/antihax/optional v1.0.0 github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d - github.com/free5gc/openapi v1.0.7-0.20230802173229-2b3ded4db293 + github.com/free5gc/openapi v1.0.7-0.20231216094313-e15a4ff046f6 github.com/free5gc/util v1.0.5-0.20231001095115-433858e5be94 github.com/gin-gonic/gin v1.9.1 github.com/google/uuid v1.3.0 diff --git a/go.sum b/go.sum index 74085c6..585dbb7 100644 --- a/go.sum +++ b/go.sum @@ -60,8 +60,8 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/free5gc/openapi v1.0.7-0.20230802173229-2b3ded4db293 h1:BSIvKCYu7646sE8J9R1L8v2R435otUik3wOFN33csfs= -github.com/free5gc/openapi v1.0.7-0.20230802173229-2b3ded4db293/go.mod h1:iw/N0E+FlX44EEx24IBi2EdZW8v+bkj3ETWPGnlK9DI= +github.com/free5gc/openapi v1.0.7-0.20231216094313-e15a4ff046f6 h1:8P/wOkTAQMgZJe9pUUNSTE5PWeAdlMrsU9kLsI+VAVE= +github.com/free5gc/openapi v1.0.7-0.20231216094313-e15a4ff046f6/go.mod h1:qv9KqEucoZSeENPRFGxfTe+33ZWYyiYFx1Rj+H0DoWA= github.com/free5gc/util v1.0.5-0.20231001095115-433858e5be94 h1:tNylIqH/m5Kq+3KuC+jjXGl06Y6EmM8yq61ZUgNrPBY= github.com/free5gc/util v1.0.5-0.20231001095115-433858e5be94/go.mod h1:aMszJZbCkcg5xaGgzya+55jz+OPMsJqPLq5Z3fWDFPE= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= @@ -308,7 +308,6 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= @@ -528,6 +527,7 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/internal/context/context.go b/internal/context/context.go index 03fc149..7e579a8 100644 --- a/internal/context/context.go +++ b/internal/context/context.go @@ -1,6 +1,7 @@ package context import ( + "context" "fmt" "math" "os" @@ -13,6 +14,7 @@ import ( "github.com/free5gc/openapi" "github.com/free5gc/openapi/Nnrf_NFDiscovery" "github.com/free5gc/openapi/models" + "github.com/free5gc/openapi/oauth" "github.com/free5gc/udm/internal/logger" "github.com/free5gc/udm/pkg/factory" "github.com/free5gc/udm/pkg/suci" @@ -45,11 +47,13 @@ type UDMContext struct { NFDiscoveryClient *Nnrf_NFDiscovery.APIClient UdmUePool sync.Map // map[supi]*UdmUeContext NrfUri string + NrfCertPem string GpsiSupiList models.IdentityData SharedSubsDataMap map[string]models.SharedData // sharedDataIds as key SubscriptionOfSharedDataChange sync.Map // subscriptionID as key SuciProfiles []suci.SuciProfile EeSubscriptionIDGenerator *idgenerator.IDGenerator + OAuth2Required bool } type UdmUeContext struct { @@ -121,6 +125,7 @@ func InitUdmContext(context *UDMContext) { } } udmContext.NrfUri = configuration.NrfUri + context.NrfCertPem = configuration.NrfCertPem servingNameList := configuration.ServiceNameList udmContext.SuciProfiles = configuration.SuciProfiles @@ -478,6 +483,16 @@ func (context *UDMContext) InitNFService(serviceName []string, version string) { } } +func (c *UDMContext) GetTokenCtx(scope, targetNF string) ( + context.Context, *models.ProblemDetails, error, +) { + if !c.OAuth2Required { + return context.TODO(), nil, nil + } + return oauth.GetTokenCtx(models.NfType_UDM, + c.NfId, c.NrfUri, scope, targetNF) +} + func GetSelf() *UDMContext { return &udmContext } diff --git a/internal/sbi/consumer/nf_discovery.go b/internal/sbi/consumer/nf_discovery.go index b30cc8e..66f1b03 100644 --- a/internal/sbi/consumer/nf_discovery.go +++ b/internal/sbi/consumer/nf_discovery.go @@ -1,7 +1,6 @@ package consumer import ( - "context" "fmt" "net/http" @@ -26,7 +25,12 @@ func SendNFIntances(nrfUri string, targetNfType, requestNfType models.NfType, configuration.SetBasePath(nrfUri) // addr clientNRF := Nnrf_NFDiscovery.NewAPIClient(configuration) - result, res, err1 := clientNRF.NFInstancesStoreApi.SearchNFInstances(context.TODO(), targetNfType, + ctx, _, err := udm_context.GetSelf().GetTokenCtx("nnrf-disc", "NRF") + if err != nil { + return + } + + result, res, err1 := clientNRF.NFInstancesStoreApi.SearchNFInstances(ctx, targetNfType, requestNfType, ¶m) if err1 != nil { err = err1 diff --git a/internal/sbi/consumer/nf_management.go b/internal/sbi/consumer/nf_management.go index 34bbdbf..9446bcc 100644 --- a/internal/sbi/consumer/nf_management.go +++ b/internal/sbi/consumer/nf_management.go @@ -47,7 +47,8 @@ func SendRegisterNFInstance(nrfUri, nfInstanceId string, profile models.NfProfil var res *http.Response for { - _, res, err = client.NFInstanceIDDocumentApi.RegisterNFInstance(context.TODO(), nfInstanceId, profile) + var nf models.NfProfile + nf, res, err = client.NFInstanceIDDocumentApi.RegisterNFInstance(context.TODO(), nfInstanceId, profile) if err != nil || res == nil { // TODO : add log fmt.Println(fmt.Errorf("UDM register to NRF Error[%v]", err.Error())) @@ -69,6 +70,19 @@ func SendRegisterNFInstance(nrfUri, nfInstanceId string, profile models.NfProfil resourceUri := res.Header.Get("Location") resouceNrfUri = resourceUri[:strings.Index(resourceUri, "/nnrf-nfm/")] retrieveNfInstanceId = resourceUri[strings.LastIndex(resourceUri, "/")+1:] + + oauth2 := false + if nf.CustomInfo != nil { + v, ok := nf.CustomInfo["oauth2"].(bool) + if ok { + oauth2 = v + logger.MainLog.Infoln("OAuth2 setting receive from NRF:", oauth2) + } + } + udm_context.GetSelf().OAuth2Required = oauth2 + if oauth2 && udm_context.GetSelf().NrfCertPem == "" { + logger.CfgLog.Error("OAuth2 enable but no nrfCertPem provided in config.") + } break } else { fmt.Println("handler returned wrong status code", status) @@ -81,6 +95,11 @@ func SendRegisterNFInstance(nrfUri, nfInstanceId string, profile models.NfProfil func SendDeregisterNFInstance() (problemDetails *models.ProblemDetails, err error) { logger.ConsumerLog.Infof("Send Deregister NFInstance") + ctx, pd, err := udm_context.GetSelf().GetTokenCtx("nnrf-nfm", "NRF") + if err != nil { + return pd, err + } + udmSelf := udm_context.GetSelf() // Set client and set url configuration := Nnrf_NFManagement.NewConfiguration() @@ -89,9 +108,9 @@ func SendDeregisterNFInstance() (problemDetails *models.ProblemDetails, err erro var res *http.Response - res, err = client.NFInstanceIDDocumentApi.DeregisterNFInstance(context.Background(), udmSelf.NfId) + res, err = client.NFInstanceIDDocumentApi.DeregisterNFInstance(ctx, udmSelf.NfId) if err == nil { - return + return nil, err } else if res != nil { defer func() { if rspCloseErr := res.Body.Close(); rspCloseErr != nil { @@ -100,12 +119,12 @@ func SendDeregisterNFInstance() (problemDetails *models.ProblemDetails, err erro }() if res.Status != err.Error() { - return + return nil, err } problem := err.(openapi.GenericOpenAPIError).Model().(models.ProblemDetails) problemDetails = &problem } else { err = openapi.ReportError("server no response") } - return + return problemDetails, err } diff --git a/internal/sbi/producer/subscriber_data_management.go b/internal/sbi/producer/subscriber_data_management.go index 2e0d834..40151c1 100644 --- a/internal/sbi/producer/subscriber_data_management.go +++ b/internal/sbi/producer/subscriber_data_management.go @@ -827,7 +827,7 @@ func getSmfSelectDataProcedure(supi string, plmnID string, supportedFeatures str } return nil, problemDetails } - return + return nil, problemDetails } defer func() { if rspCloseErr := res.Body.Close(); rspCloseErr != nil { diff --git a/internal/sbi/producer/ue_context_management.go b/internal/sbi/producer/ue_context_management.go index 0a39eae..5fff6aa 100644 --- a/internal/sbi/producer/ue_context_management.go +++ b/internal/sbi/producer/ue_context_management.go @@ -587,7 +587,7 @@ func UpdateAmfNon3gppAccessProcedure(request models.AmfNon3GppAccessRegistration } }() - return nil + return problemDetails } func HandleDeregistrationSmfRegistrations(request *httpwrapper.Request) *httpwrapper.Response { diff --git a/pkg/factory/config.go b/pkg/factory/config.go index 0b67bf7..6f4652d 100644 --- a/pkg/factory/config.go +++ b/pkg/factory/config.go @@ -62,6 +62,7 @@ type Configuration struct { Sbi *Sbi `yaml:"sbi,omitempty" valid:"required"` ServiceNameList []string `yaml:"serviceNameList,omitempty" valid:"required"` NrfUri string `yaml:"nrfUri,omitempty" valid:"required, url"` + NrfCertPem string `yaml:"nrfCertPem,omitempty" valid:"optional"` SuciProfiles []suci.SuciProfile `yaml:"SuciProfile,omitempty"` } type Logger struct {