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