-
Notifications
You must be signed in to change notification settings - Fork 83
/
servicedetailsvalidation.go
108 lines (83 loc) · 2.71 KB
/
servicedetailsvalidation.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/**
Copied from https://github.com/kyma-project/kyma/tree/main/components/application-registry
*/
package validation
import (
"github.com/kyma-incubator/compass/components/connectivity-adapter/pkg/apperrors"
"github.com/kyma-incubator/compass/components/connectivity-adapter/pkg/model"
"gopkg.in/asaskevich/govalidator.v9"
)
type ServiceDetailsValidator interface {
Validate(details model.ServiceDetails) apperrors.AppError
}
type ServiceDetailsValidatorFunc func(details model.ServiceDetails) apperrors.AppError
func (f ServiceDetailsValidatorFunc) Validate(details model.ServiceDetails) apperrors.AppError {
return f(details)
}
func NewServiceDetailsValidator() ServiceDetailsValidator {
return ServiceDetailsValidatorFunc(func(details model.ServiceDetails) apperrors.AppError {
_, err := govalidator.ValidateStruct(details)
if err != nil {
return apperrors.WrongInput("Incorrect structure of service definition, %s", err.Error())
}
if details.Api == nil && details.Events == nil {
return apperrors.WrongInput(
"At least one of service definition attributes: 'api', 'events' have to be provided")
}
var apperr apperrors.AppError
if details.Api != nil {
apperr = validateApiCredentials(details.Api.Credentials)
if apperr != nil {
return apperr
}
apperr = validateSpecificationCredentials(details.Api.SpecificationCredentials)
if apperr != nil {
return apperr
}
}
return nil
})
}
func validateApiCredentials(credentials *model.CredentialsWithCSRF) apperrors.AppError {
if credentials != nil {
var basic *model.BasicAuth
var oauth *model.Oauth
var cert *model.CertificateGen
if credentials.BasicWithCSRF != nil {
basic = &credentials.BasicWithCSRF.BasicAuth
}
if credentials.OauthWithCSRF != nil {
oauth = &credentials.OauthWithCSRF.Oauth
}
if credentials.CertificateGenWithCSRF != nil {
cert = &credentials.CertificateGenWithCSRF.CertificateGen
}
if validateCredentials(basic, oauth, cert) {
return apperrors.WrongInput("api.CredentialsWithCSRF is invalid: too many authentication methods provided")
}
}
return nil
}
func validateSpecificationCredentials(credentials *model.Credentials) apperrors.AppError {
if credentials != nil {
basic := credentials.Basic
oauth := credentials.Oauth
if validateCredentials(basic, oauth, nil) {
return apperrors.WrongInput("api.CredentialsWithCSRF is invalid: too many authentication methods provided")
}
}
return nil
}
func validateCredentials(basic *model.BasicAuth, oauth *model.Oauth, cert *model.CertificateGen) bool {
credentialsCount := 0
if basic != nil {
credentialsCount++
}
if oauth != nil {
credentialsCount++
}
if cert != nil {
credentialsCount++
}
return credentialsCount > 1
}