1package s3shared
2
3import (
4	"strings"
5
6	"github.com/aws/aws-sdk-go/aws"
7	awsarn "github.com/aws/aws-sdk-go/aws/arn"
8	"github.com/aws/aws-sdk-go/aws/request"
9	"github.com/aws/aws-sdk-go/internal/s3shared/arn"
10)
11
12// ResourceRequest represents the request and arn resource
13type ResourceRequest struct {
14	Resource arn.Resource
15	Request  *request.Request
16}
17
18// ARN returns the resource ARN
19func (r ResourceRequest) ARN() awsarn.ARN {
20	return r.Resource.GetARN()
21}
22
23// AllowCrossRegion returns a bool value to denote if S3UseARNRegion flag is set
24func (r ResourceRequest) AllowCrossRegion() bool {
25	return aws.BoolValue(r.Request.Config.S3UseARNRegion)
26}
27
28// UseFIPS returns true if request config region is FIPS
29func (r ResourceRequest) UseFIPS() bool {
30	return IsFIPS(aws.StringValue(r.Request.Config.Region))
31}
32
33// ResourceConfiguredForFIPS returns true if resource ARNs region is FIPS
34//
35// Deprecated: FIPS pseudo-regions will not be in the ARN
36func (r ResourceRequest) ResourceConfiguredForFIPS() bool {
37	return IsFIPS(r.ARN().Region)
38}
39
40// IsCrossPartition returns true if client is configured for another partition, than
41// the partition that resource ARN region resolves to.
42func (r ResourceRequest) IsCrossPartition() bool {
43	return r.Request.ClientInfo.PartitionID != r.Resource.GetARN().Partition
44}
45
46// IsCrossRegion returns true if ARN region is different than client configured region
47func (r ResourceRequest) IsCrossRegion() bool {
48	return IsCrossRegion(r.Request, r.Resource.GetARN().Region)
49}
50
51// HasCustomEndpoint returns true if custom client endpoint is provided
52func (r ResourceRequest) HasCustomEndpoint() bool {
53	return len(aws.StringValue(r.Request.Config.Endpoint)) > 0
54}
55
56// IsFIPS returns true if region is a fips region
57func IsFIPS(clientRegion string) bool {
58	return strings.HasPrefix(clientRegion, "fips-") || strings.HasSuffix(clientRegion, "-fips")
59}
60
61// IsCrossRegion returns true if request signing region is not same as configured region
62func IsCrossRegion(req *request.Request, otherRegion string) bool {
63	return req.ClientInfo.SigningRegion != otherRegion
64}
65