Search in sources :

Example 1 with PreferencesUseragentProvider

use of ch.cyberduck.core.PreferencesUseragentProvider in project cyberduck by iterate-ch.

the class StoregateSession method connect.

@Override
protected StoregateApiClient connect(final Proxy proxy, final HostKeyCallback key, final LoginCallback prompt, final CancelCallback cancel) {
    final HttpClientBuilder configuration = builder.build(proxy, this, prompt);
    final PreferencesReader preferences = new HostPreferences(host);
    authorizationService = new OAuth2RequestInterceptor(builder.build(proxy, this, prompt).addInterceptorLast(new HttpRequestInterceptor() {

        @Override
        public void process(final HttpRequest request, final HttpContext context) {
            request.addHeader(HttpHeaders.AUTHORIZATION, String.format("Basic %s", Base64.encodeToString(String.format("%s:%s", host.getProtocol().getOAuthClientId(), host.getProtocol().getOAuthClientSecret()).getBytes(StandardCharsets.UTF_8), false)));
        }
    }).build(), host).withRedirectUri(CYBERDUCK_REDIRECT_URI.equals(host.getProtocol().getOAuthRedirectUrl()) ? host.getProtocol().getOAuthRedirectUrl() : Scheme.isURL(host.getProtocol().getOAuthRedirectUrl()) ? host.getProtocol().getOAuthRedirectUrl() : new HostUrlProvider().withUsername(false).withPath(true).get(host.getProtocol().getScheme(), host.getPort(), null, host.getHostname(), host.getProtocol().getOAuthRedirectUrl())).withParameter("login_hint", preferences.getProperty("storegate.login.hint"));
    // Force login even if browser session already exists
    authorizationService.withParameter("prompt", "login");
    configuration.setServiceUnavailableRetryStrategy(new OAuth2ErrorResponseInterceptor(host, authorizationService, prompt));
    configuration.addInterceptorLast(authorizationService);
    final CloseableHttpClient apache = configuration.build();
    final StoregateApiClient client = new StoregateApiClient(apache);
    client.setBasePath(new HostUrlProvider().withUsername(false).withPath(true).get(host.getProtocol().getScheme(), host.getPort(), null, host.getHostname(), host.getProtocol().getContext()));
    client.setHttpClient(ClientBuilder.newClient(new ClientConfig().register(new InputStreamProvider()).register(MultiPartFeature.class).register(new JSON()).register(JacksonFeature.class).connectorProvider(new HttpComponentsProvider(apache))));
    final int timeout = preferences.getInteger("connection.timeout.seconds") * 1000;
    client.setConnectTimeout(timeout);
    client.setReadTimeout(timeout);
    client.setUserAgent(new PreferencesUseragentProvider().get());
    return client;
}
Also used : HttpRequest(org.apache.http.HttpRequest) CloseableHttpClient(org.apache.http.impl.client.CloseableHttpClient) HostUrlProvider(ch.cyberduck.core.HostUrlProvider) InputStreamProvider(org.glassfish.jersey.message.internal.InputStreamProvider) HttpContext(org.apache.http.protocol.HttpContext) OAuth2ErrorResponseInterceptor(ch.cyberduck.core.oauth.OAuth2ErrorResponseInterceptor) JSON(ch.cyberduck.core.storegate.io.swagger.client.JSON) PreferencesUseragentProvider(ch.cyberduck.core.PreferencesUseragentProvider) HttpClientBuilder(org.apache.http.impl.client.HttpClientBuilder) PreferencesReader(ch.cyberduck.core.preferences.PreferencesReader) HostPreferences(ch.cyberduck.core.preferences.HostPreferences) JacksonFeature(org.glassfish.jersey.jackson.JacksonFeature) OAuth2RequestInterceptor(ch.cyberduck.core.oauth.OAuth2RequestInterceptor) MultiPartFeature(org.glassfish.jersey.media.multipart.MultiPartFeature) HttpRequestInterceptor(org.apache.http.HttpRequestInterceptor) ClientConfig(org.glassfish.jersey.client.ClientConfig) HttpComponentsProvider(ch.cyberduck.core.jersey.HttpComponentsProvider)

Example 2 with PreferencesUseragentProvider

use of ch.cyberduck.core.PreferencesUseragentProvider in project cyberduck by iterate-ch.

the class DriveSession method connect.

@Override
protected Drive connect(final Proxy proxy, final HostKeyCallback callback, final LoginCallback prompt, final CancelCallback cancel) throws HostParserException {
    final HttpClientBuilder configuration = builder.build(proxy, this, prompt);
    authorizationService = new OAuth2RequestInterceptor(builder.build(ProxyFactory.get().find(host.getProtocol().getOAuthAuthorizationUrl()), this, prompt).build(), host.getProtocol()).withRedirectUri(host.getProtocol().getOAuthRedirectUrl());
    configuration.addInterceptorLast(authorizationService);
    configuration.setServiceUnavailableRetryStrategy(new OAuth2ErrorResponseInterceptor(host, authorizationService, prompt));
    configuration.addInterceptorLast(new RateLimitingHttpRequestInterceptor(new DefaultHttpRateLimiter(new HostPreferences(host).getInteger("googledrive.limit.requests.second"))));
    this.transport = new ApacheHttpTransport(configuration.build());
    final UseragentProvider ua = new PreferencesUseragentProvider();
    return new Drive.Builder(transport, new GsonFactory(), new UserAgentHttpRequestInitializer(ua)).setApplicationName(ua.get()).build();
}
Also used : UseragentProvider(ch.cyberduck.core.UseragentProvider) PreferencesUseragentProvider(ch.cyberduck.core.PreferencesUseragentProvider) GsonFactory(com.google.api.client.json.gson.GsonFactory) UserAgentHttpRequestInitializer(ch.cyberduck.core.http.UserAgentHttpRequestInitializer) OAuth2RequestInterceptor(ch.cyberduck.core.oauth.OAuth2RequestInterceptor) DefaultHttpRateLimiter(ch.cyberduck.core.http.DefaultHttpRateLimiter) HttpClientBuilder(org.apache.http.impl.client.HttpClientBuilder) OAuth2ErrorResponseInterceptor(ch.cyberduck.core.oauth.OAuth2ErrorResponseInterceptor) PreferencesUseragentProvider(ch.cyberduck.core.PreferencesUseragentProvider) HttpClientBuilder(org.apache.http.impl.client.HttpClientBuilder) RateLimitingHttpRequestInterceptor(ch.cyberduck.core.http.RateLimitingHttpRequestInterceptor) ApacheHttpTransport(com.google.api.client.http.apache.v2.ApacheHttpTransport) HostPreferences(ch.cyberduck.core.preferences.HostPreferences)

Example 3 with PreferencesUseragentProvider

use of ch.cyberduck.core.PreferencesUseragentProvider in project cyberduck by iterate-ch.

the class OAuth2AuthorizationService method refresh.

public OAuthTokens refresh(final OAuthTokens tokens) throws BackgroundException {
    if (StringUtils.isBlank(tokens.getRefreshToken())) {
        log.warn("Missing refresh token");
        return tokens;
    }
    if (log.isDebugEnabled()) {
        log.debug(String.format("Refresh expired tokens %s", tokens));
    }
    try {
        final TokenResponse response = new RefreshTokenRequest(transport, json, new GenericUrl(tokenServerUrl), tokens.getRefreshToken()).setRequestInitializer(new UserAgentHttpRequestInitializer(new PreferencesUseragentProvider())).setClientAuthentication(new ClientParametersAuthentication(clientid, clientsecret)).executeUnparsed().parseAs(PermissiveTokenResponse.class).toTokenResponse();
        final long expiryInMilliseconds = System.currentTimeMillis() + response.getExpiresInSeconds() * 1000;
        if (StringUtils.isBlank(response.getRefreshToken())) {
            return new OAuthTokens(response.getAccessToken(), tokens.getRefreshToken(), expiryInMilliseconds);
        }
        return new OAuthTokens(response.getAccessToken(), response.getRefreshToken(), expiryInMilliseconds);
    } catch (TokenResponseException e) {
        throw new OAuthExceptionMappingService().map(e);
    } catch (HttpResponseException e) {
        throw new DefaultHttpResponseExceptionMappingService().map(new org.apache.http.client.HttpResponseException(e.getStatusCode(), e.getStatusMessage()));
    } catch (IOException e) {
        throw new DefaultIOExceptionMappingService().map(e);
    }
}
Also used : DefaultHttpResponseExceptionMappingService(ch.cyberduck.core.http.DefaultHttpResponseExceptionMappingService) UserAgentHttpRequestInitializer(ch.cyberduck.core.http.UserAgentHttpRequestInitializer) OAuthTokens(ch.cyberduck.core.OAuthTokens) PreferencesUseragentProvider(ch.cyberduck.core.PreferencesUseragentProvider) HttpResponseException(com.google.api.client.http.HttpResponseException) GenericUrl(com.google.api.client.http.GenericUrl) IOException(java.io.IOException) RefreshTokenRequest(com.google.api.client.auth.oauth2.RefreshTokenRequest) ClientParametersAuthentication(com.google.api.client.auth.oauth2.ClientParametersAuthentication) TokenResponse(com.google.api.client.auth.oauth2.TokenResponse) DefaultIOExceptionMappingService(ch.cyberduck.core.DefaultIOExceptionMappingService) TokenResponseException(com.google.api.client.auth.oauth2.TokenResponseException)

Example 4 with PreferencesUseragentProvider

use of ch.cyberduck.core.PreferencesUseragentProvider in project cyberduck by iterate-ch.

the class OAuth2AuthorizationService method authorizeWithCode.

private TokenResponse authorizeWithCode(final Host bookmark, final LoginCallback prompt, final CancelCallback cancel, final Credentials credentials) throws BackgroundException {
    if (PreferencesFactory.get().getBoolean("oauth.browser.open.warn")) {
        prompt.warn(bookmark, LocaleFactory.localizedString("Provide additional login credentials", "Credentials"), new StringAppender().append(LocaleFactory.localizedString("Open web browser to authenticate and obtain an authorization code", "Credentials")).append(LocaleFactory.localizedString("Please contact your web hosting service provider for assistance", "Support")).toString(), LocaleFactory.localizedString("Continue", "Credentials"), LocaleFactory.localizedString("Cancel"), "oauth.browser.open.warn");
    }
    // Start OAuth2 flow within browser
    final AuthorizationCodeFlow flow = new AuthorizationCodeFlow.Builder(method, transport, json, new GenericUrl(tokenServerUrl), new ClientParametersAuthentication(clientid, clientsecret), clientid, authorizationServerUrl).setScopes(scopes).setRequestInitializer(new UserAgentHttpRequestInitializer(new PreferencesUseragentProvider())).build();
    final AuthorizationCodeRequestUrl authorizationCodeRequestUrl = flow.newAuthorizationUrl();
    authorizationCodeRequestUrl.setRedirectUri(redirectUri);
    final String state = new AlphanumericRandomStringService().random();
    authorizationCodeRequestUrl.setState(state);
    for (Map.Entry<String, String> values : additionalParameters.entrySet()) {
        authorizationCodeRequestUrl.set(values.getKey(), values.getValue());
    }
    // Direct the user to an authorization page to grant access to their protected data.
    final String url = authorizationCodeRequestUrl.build();
    if (log.isDebugEnabled()) {
        log.debug(String.format("Open browser with URL %s", url));
    }
    if (!browser.open(url)) {
        log.warn(String.format("Failed to launch web browser for %s", url));
    }
    final AtomicReference<String> authenticationCode = new AtomicReference<>();
    if (StringUtils.contains(redirectUri, CYBERDUCK_REDIRECT_URI)) {
        final CountDownLatch signal = new CountDownLatch(1);
        final OAuth2TokenListenerRegistry registry = OAuth2TokenListenerRegistry.get();
        registry.register(state, new OAuth2TokenListener() {

            @Override
            public void callback(final String code) {
                if (log.isInfoEnabled()) {
                    log.info(String.format("Callback with code %s", code));
                }
                if (!StringUtils.isBlank(code)) {
                    credentials.setSaved(PreferencesFactory.get().getBoolean("connection.login.keychain"));
                    authenticationCode.set(code);
                }
                signal.countDown();
            }
        });
        prompt.await(signal, bookmark, LocaleFactory.localizedString("Login", "Login"), LocaleFactory.localizedString("Open web browser to authenticate and obtain an authorization code", "Credentials"));
        if (StringUtils.isBlank(authenticationCode.get())) {
            throw new LoginCanceledException();
        }
    } else {
        final Credentials input = prompt.prompt(bookmark, LocaleFactory.localizedString("Login", "Login"), LocaleFactory.localizedString("Paste the authentication code from your web browser", "Credentials"), new LoginOptions(bookmark.getProtocol()).keychain(true).user(false).oauth(true).passwordPlaceholder(LocaleFactory.localizedString("Authentication Code", "Credentials")));
        credentials.setSaved(input.isSaved());
        authenticationCode.set(input.getPassword());
    }
    try {
        if (StringUtils.isBlank(authenticationCode.get())) {
            throw new LoginCanceledException();
        }
        if (log.isDebugEnabled()) {
            log.debug(String.format("Request tokens for authentication code %s", authenticationCode.get()));
        }
        // Swap the given authorization token for access/refresh tokens
        return flow.newTokenRequest(authenticationCode.get()).setRedirectUri(redirectUri).setScopes(scopes.isEmpty() ? null : scopes).executeUnparsed().parseAs(PermissiveTokenResponse.class).toTokenResponse();
    } catch (TokenResponseException e) {
        throw new OAuthExceptionMappingService().map(e);
    } catch (HttpResponseException e) {
        throw new DefaultHttpResponseExceptionMappingService().map(new org.apache.http.client.HttpResponseException(e.getStatusCode(), e.getStatusMessage()));
    } catch (IOException e) {
        throw new DefaultIOExceptionMappingService().map(e);
    }
}
Also used : UserAgentHttpRequestInitializer(ch.cyberduck.core.http.UserAgentHttpRequestInitializer) HttpResponseException(com.google.api.client.http.HttpResponseException) GenericUrl(com.google.api.client.http.GenericUrl) LoginOptions(ch.cyberduck.core.LoginOptions) AuthorizationCodeRequestUrl(com.google.api.client.auth.oauth2.AuthorizationCodeRequestUrl) ClientParametersAuthentication(com.google.api.client.auth.oauth2.ClientParametersAuthentication) StringAppender(ch.cyberduck.core.StringAppender) TokenResponseException(com.google.api.client.auth.oauth2.TokenResponseException) DefaultHttpResponseExceptionMappingService(ch.cyberduck.core.http.DefaultHttpResponseExceptionMappingService) LoginCanceledException(ch.cyberduck.core.exception.LoginCanceledException) PreferencesUseragentProvider(ch.cyberduck.core.PreferencesUseragentProvider) AtomicReference(java.util.concurrent.atomic.AtomicReference) IOException(java.io.IOException) CountDownLatch(java.util.concurrent.CountDownLatch) AuthorizationCodeFlow(com.google.api.client.auth.oauth2.AuthorizationCodeFlow) AlphanumericRandomStringService(ch.cyberduck.core.AlphanumericRandomStringService) DefaultIOExceptionMappingService(ch.cyberduck.core.DefaultIOExceptionMappingService) HashMap(java.util.HashMap) Map(java.util.Map) Credentials(ch.cyberduck.core.Credentials)

Example 5 with PreferencesUseragentProvider

use of ch.cyberduck.core.PreferencesUseragentProvider in project cyberduck by iterate-ch.

the class GoogleStorageSession method connect.

@Override
protected Storage connect(final Proxy proxy, final HostKeyCallback key, final LoginCallback prompt, final CancelCallback cancel) {
    final HttpClientBuilder configuration = builder.build(proxy, this, prompt);
    authorizationService = new OAuth2RequestInterceptor(builder.build(ProxyFactory.get().find(host.getProtocol().getOAuthAuthorizationUrl()), this, prompt).build(), host.getProtocol()).withRedirectUri(host.getProtocol().getOAuthRedirectUrl());
    configuration.addInterceptorLast(authorizationService);
    configuration.setServiceUnavailableRetryStrategy(new OAuth2ErrorResponseInterceptor(host, authorizationService, prompt));
    this.transport = new ApacheHttpTransport(configuration.build());
    final UseragentProvider ua = new PreferencesUseragentProvider();
    return new Storage.Builder(transport, new GsonFactory(), new UserAgentHttpRequestInitializer(ua)).setApplicationName(ua.get()).build();
}
Also used : UseragentProvider(ch.cyberduck.core.UseragentProvider) PreferencesUseragentProvider(ch.cyberduck.core.PreferencesUseragentProvider) GsonFactory(com.google.api.client.json.gson.GsonFactory) UserAgentHttpRequestInitializer(ch.cyberduck.core.http.UserAgentHttpRequestInitializer) OAuth2RequestInterceptor(ch.cyberduck.core.oauth.OAuth2RequestInterceptor) HttpClientBuilder(org.apache.http.impl.client.HttpClientBuilder) OAuth2ErrorResponseInterceptor(ch.cyberduck.core.oauth.OAuth2ErrorResponseInterceptor) PreferencesUseragentProvider(ch.cyberduck.core.PreferencesUseragentProvider) HttpClientBuilder(org.apache.http.impl.client.HttpClientBuilder) ApacheHttpTransport(com.google.api.client.http.apache.v2.ApacheHttpTransport)

Aggregations

PreferencesUseragentProvider (ch.cyberduck.core.PreferencesUseragentProvider)8 UserAgentHttpRequestInitializer (ch.cyberduck.core.http.UserAgentHttpRequestInitializer)4 HttpClientBuilder (org.apache.http.impl.client.HttpClientBuilder)4 OAuth2ErrorResponseInterceptor (ch.cyberduck.core.oauth.OAuth2ErrorResponseInterceptor)3 OAuth2RequestInterceptor (ch.cyberduck.core.oauth.OAuth2RequestInterceptor)3 HostPreferences (ch.cyberduck.core.preferences.HostPreferences)3 DefaultIOExceptionMappingService (ch.cyberduck.core.DefaultIOExceptionMappingService)2 HostUrlProvider (ch.cyberduck.core.HostUrlProvider)2 UseragentProvider (ch.cyberduck.core.UseragentProvider)2 LoginCanceledException (ch.cyberduck.core.exception.LoginCanceledException)2 DefaultHttpResponseExceptionMappingService (ch.cyberduck.core.http.DefaultHttpResponseExceptionMappingService)2 ClientParametersAuthentication (com.google.api.client.auth.oauth2.ClientParametersAuthentication)2 TokenResponseException (com.google.api.client.auth.oauth2.TokenResponseException)2 GenericUrl (com.google.api.client.http.GenericUrl)2 HttpResponseException (com.google.api.client.http.HttpResponseException)2 ApacheHttpTransport (com.google.api.client.http.apache.v2.ApacheHttpTransport)2 GsonFactory (com.google.api.client.json.gson.GsonFactory)2 IOException (java.io.IOException)2 CountDownLatch (java.util.concurrent.CountDownLatch)2 AlphanumericRandomStringService (ch.cyberduck.core.AlphanumericRandomStringService)1