001/**
002 * Copyright (C) 2006-2022 Talend Inc. - www.talend.com
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.talend.sdk.component.api.service.http.configurer.oauth1;
017
018import static lombok.AccessLevel.PRIVATE;
019
020import java.security.PrivateKey;
021import java.util.Iterator;
022import java.util.Map;
023import java.util.ServiceLoader;
024
025import org.talend.sdk.component.api.meta.Internal;
026import org.talend.sdk.component.api.meta.Partial;
027
028import lombok.Builder;
029import lombok.Data;
030import lombok.NoArgsConstructor;
031
032@Partial("This doesn't fully implement oauth1 yet but is a good example of configurer entry point")
033@NoArgsConstructor(access = PRIVATE)
034public final class OAuth1 {
035
036    public static class Configurer implements org.talend.sdk.component.api.service.http.Configurer {
037
038        @Override
039        public void configure(final Connection connection, final Configurer.ConfigurerConfiguration configuration) {
040            loadProvider().newConfigurer().configure(connection, configuration);
041        }
042    }
043
044    public Map<String, String> buildParameters(final String method, final String url, final byte[] payload,
045            final OAuth1.Configuration oauth1Config) {
046        return loadProvider().buildParameters(method, url, payload, oauth1Config);
047    }
048
049    private static OAuth1Provider loadProvider() {
050        final Iterator<OAuth1Provider> iterator = ServiceLoader.load(OAuth1Provider.class).iterator();
051        if (!iterator.hasNext()) {
052            throw new IllegalStateException("No registered implementation of OAuth1Provider");
053        }
054        return iterator.next();
055    }
056
057    /**
058     * This is the SPI to load the implementation, WARNING: this is an internal API.
059     */
060    @Internal
061    public interface OAuth1Provider {
062
063        Map<String, String> buildParameters(String method, String url, byte[] payload,
064                OAuth1.Configuration oauth1Config);
065
066        org.talend.sdk.component.api.service.http.Configurer newConfigurer();
067    }
068
069    @Data
070    @Builder
071    public static class Configuration {
072
073        /**
074         * The header name to set, by default it uses Authorization.
075         */
076        private String header;
077
078        /**
079         * The prefix to preppend to the header value, by default it uses "OAuth".
080         */
081        private String headerPrefix;
082
083        /**
084         * The payload hashing algorithm, default to null (ignored).
085         */
086        private String payloadHashAlgorithm;
087
088        /**
089         * The signing algorithm, default to HmacSHA1.
090         */
091        private String algorithm;
092
093        /**
094         * When using a hmac algorithm the key, if null default one is composed based on consumer key and token secret.
095         */
096        private byte[] signingHmacKey;
097
098        /**
099         * When using a signature algorithm the private key to use.
100         */
101        private PrivateKey signingSignatureKey;
102
103        /**
104         * Additional oauth parameters (not encoded).
105         */
106        private Map<String, String> oauthParameters;
107
108        /**
109         * oauth_token if set, otherwise ignored.
110         */
111        private String token;
112
113        /**
114         * OAuth token secret.
115         */
116        private String tokenSecret;
117
118        /**
119         * OAuth consumer key.
120         */
121        private String consumerKey;
122
123        /**
124         * OAuth consumer secret.
125         */
126        private String consumerSecret;
127
128        /**
129         * The nonce to use if set, otherwise it is generated.
130         */
131        private String nonce;
132
133        /**
134         * The timestamp to use if set, otherwise it is generated.
135         */
136        private Long timestamp;
137    }
138}