1package s3shared
2
3import (
4	"fmt"
5
6	"github.com/aws/aws-sdk-go/aws/awserr"
7	"github.com/aws/aws-sdk-go/internal/s3shared/arn"
8)
9
10const (
11	invalidARNErrorErrCode    = "InvalidARNError"
12	configurationErrorErrCode = "ConfigurationError"
13)
14
15// InvalidARNError denotes the error for Invalid ARN
16type InvalidARNError struct {
17	message  string
18	resource arn.Resource
19	origErr  error
20}
21
22// Error returns the InvalidARNError
23func (e InvalidARNError) Error() string {
24	var extra string
25	if e.resource != nil {
26		extra = "ARN: " + e.resource.String()
27	}
28	return awserr.SprintError(e.Code(), e.Message(), extra, e.origErr)
29}
30
31// Code returns the invalid ARN error code
32func (e InvalidARNError) Code() string {
33	return invalidARNErrorErrCode
34}
35
36// Message returns the message for Invalid ARN error
37func (e InvalidARNError) Message() string {
38	return e.message
39}
40
41// OrigErr is the original error wrapped by Invalid ARN Error
42func (e InvalidARNError) OrigErr() error {
43	return e.origErr
44}
45
46// NewInvalidARNError denotes invalid arn error
47func NewInvalidARNError(resource arn.Resource, err error) InvalidARNError {
48	return InvalidARNError{
49		message:  "invalid ARN",
50		origErr:  err,
51		resource: resource,
52	}
53}
54
55// NewInvalidARNWithCustomEndpointError ARN not supported for custom clients endpoints
56func NewInvalidARNWithCustomEndpointError(resource arn.Resource, err error) InvalidARNError {
57	return InvalidARNError{
58		message:  "resource ARN not supported with custom client endpoints",
59		origErr:  err,
60		resource: resource,
61	}
62}
63
64// NewInvalidARNWithUnsupportedPartitionError ARN not supported for the target partition
65func NewInvalidARNWithUnsupportedPartitionError(resource arn.Resource, err error) InvalidARNError {
66	return InvalidARNError{
67		message:  "resource ARN not supported for the target ARN partition",
68		origErr:  err,
69		resource: resource,
70	}
71}
72
73// NewInvalidARNWithFIPSError ARN not supported for FIPS region
74//
75// Deprecated: FIPS will not appear in the ARN region component.
76func NewInvalidARNWithFIPSError(resource arn.Resource, err error) InvalidARNError {
77	return InvalidARNError{
78		message:  "resource ARN not supported for FIPS region",
79		resource: resource,
80		origErr:  err,
81	}
82}
83
84// ConfigurationError is used to denote a client configuration error
85type ConfigurationError struct {
86	message           string
87	resource          arn.Resource
88	clientPartitionID string
89	clientRegion      string
90	origErr           error
91}
92
93// Error returns the Configuration error string
94func (e ConfigurationError) Error() string {
95	extra := fmt.Sprintf("ARN: %s, client partition: %s, client region: %s",
96		e.resource, e.clientPartitionID, e.clientRegion)
97
98	return awserr.SprintError(e.Code(), e.Message(), extra, e.origErr)
99}
100
101// Code returns configuration error's error-code
102func (e ConfigurationError) Code() string {
103	return configurationErrorErrCode
104}
105
106// Message returns the configuration error message
107func (e ConfigurationError) Message() string {
108	return e.message
109}
110
111// OrigErr is the original error wrapped by Configuration Error
112func (e ConfigurationError) OrigErr() error {
113	return e.origErr
114}
115
116// NewClientPartitionMismatchError  stub
117func NewClientPartitionMismatchError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError {
118	return ConfigurationError{
119		message:           "client partition does not match provided ARN partition",
120		origErr:           err,
121		resource:          resource,
122		clientPartitionID: clientPartitionID,
123		clientRegion:      clientRegion,
124	}
125}
126
127// NewClientRegionMismatchError denotes cross region access error
128func NewClientRegionMismatchError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError {
129	return ConfigurationError{
130		message:           "client region does not match provided ARN region",
131		origErr:           err,
132		resource:          resource,
133		clientPartitionID: clientPartitionID,
134		clientRegion:      clientRegion,
135	}
136}
137
138// NewFailedToResolveEndpointError denotes endpoint resolving error
139func NewFailedToResolveEndpointError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError {
140	return ConfigurationError{
141		message:           "endpoint resolver failed to find an endpoint for the provided ARN region",
142		origErr:           err,
143		resource:          resource,
144		clientPartitionID: clientPartitionID,
145		clientRegion:      clientRegion,
146	}
147}
148
149// NewClientConfiguredForFIPSError denotes client config error for unsupported cross region FIPS access
150func NewClientConfiguredForFIPSError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError {
151	return ConfigurationError{
152		message:           "client configured for fips but cross-region resource ARN provided",
153		origErr:           err,
154		resource:          resource,
155		clientPartitionID: clientPartitionID,
156		clientRegion:      clientRegion,
157	}
158}
159
160// NewFIPSConfigurationError denotes a configuration error when a client or request is configured for FIPS
161func NewFIPSConfigurationError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError {
162	return ConfigurationError{
163		message:           "use of ARN is not supported when client or request is configured for FIPS",
164		origErr:           err,
165		resource:          resource,
166		clientPartitionID: clientPartitionID,
167		clientRegion:      clientRegion,
168	}
169}
170
171// NewClientConfiguredForAccelerateError denotes client config error for unsupported S3 accelerate
172func NewClientConfiguredForAccelerateError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError {
173	return ConfigurationError{
174		message:           "client configured for S3 Accelerate but is not supported with resource ARN",
175		origErr:           err,
176		resource:          resource,
177		clientPartitionID: clientPartitionID,
178		clientRegion:      clientRegion,
179	}
180}
181
182// NewClientConfiguredForCrossRegionFIPSError denotes client config error for unsupported cross region FIPS request
183func NewClientConfiguredForCrossRegionFIPSError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError {
184	return ConfigurationError{
185		message:           "client configured for FIPS with cross-region enabled but is supported with cross-region resource ARN",
186		origErr:           err,
187		resource:          resource,
188		clientPartitionID: clientPartitionID,
189		clientRegion:      clientRegion,
190	}
191}
192
193// NewClientConfiguredForDualStackError denotes client config error for unsupported S3 Dual-stack
194func NewClientConfiguredForDualStackError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError {
195	return ConfigurationError{
196		message:           "client configured for S3 Dual-stack but is not supported with resource ARN",
197		origErr:           err,
198		resource:          resource,
199		clientPartitionID: clientPartitionID,
200		clientRegion:      clientRegion,
201	}
202}
203