1 /*
2  * Copyright 2010-2020 Amazon.com, Inc. or its affiliates. All Rights
3  * Reserved.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License").
6  * You may not use this file except in compliance with the License.
7  * A copy of the License is located at
8  *
9  *  http://aws.amazon.com/apache2.0
10  *
11  * or in the "license" file accompanying this file. This file is distributed
12  * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied. See the License for the specific language governing
14  * permissions and limitations under the License.
15  */

16 package com.amazonaws.internal.auth;
17
18 import com.amazonaws.AmazonWebServiceClient;
19 import com.amazonaws.AmazonWebServiceRequest;
20 import com.amazonaws.Request;
21 import com.amazonaws.auth.Signer;
22 import com.amazonaws.auth.SignerFactory;
23 import com.amazonaws.auth.SignerParams;
24 import com.amazonaws.auth.SignerTypeAware;
25 import com.amazonaws.regions.EndpointToRegion;
26 import java.net.URI;
27
28 public class DefaultSignerProvider extends SignerProvider {
29
30     private final AmazonWebServiceClient awsClient;
31     private final Signer defaultSigner;
32
33     public DefaultSignerProvider(final AmazonWebServiceClient awsClient,
34                                  final Signer defaultSigner) {
35         this.awsClient = awsClient;
36         this.defaultSigner = defaultSigner;
37     }
38
39     @Override
40     public Signer getSigner(SignerProviderContext context) {
41     Request<?> request = context.getRequest();
42         if (request == null || shouldUseDefaultSigner(request.getOriginalRequest())) {
43             if (context.isRedirect()) {
44                 return awsClient.getSignerByURI(context.getUri());
45             }
46             return defaultSigner;
47         }
48
49         SignerTypeAware signerTypeAware = (SignerTypeAware) request.getOriginalRequest();
50         SignerParams params = new SignerParams(awsClient.getServiceName(), getSigningRegionForRequestURI(request.getEndpoint()));
51         return SignerFactory.createSigner(signerTypeAware.getSignerType(), params);
52     }
53
54     private boolean shouldUseDefaultSigner(AmazonWebServiceRequest originalRequest) {
55         return !(originalRequest instanceof SignerTypeAware) || isSignerOverridden();
56     }
57
58     private boolean isSignerOverridden() {
59         return awsClient.getSignerOverride() != null;
60     }
61
62     private String getSigningRegionForRequestURI(URI uri) {
63         String regionName = awsClient.getSignerRegionOverride();
64         if (regionName == null) {
65             regionName = EndpointToRegion.guessRegionNameForEndpoint(uri.getHost(), awsClient.getEndpointPrefix());
66         }
67         return regionName;
68     }
69 }
70