diff options
author | Stefan Niedermann <info@niedermann.it> | 2020-06-17 18:58:00 +0300 |
---|---|---|
committer | Niedermann IT-Dienstleistungen <stefan-niedermann@users.noreply.github.com> | 2020-06-17 19:14:01 +0300 |
commit | a220f84861447cfd860fd2b5110b28501903efcf (patch) | |
tree | edc39b0d24ae4af5330fc75f7bf6d1da0ee28db5 /app/src/main/java/it/niedermann/nextcloud/deck/util | |
parent | f0c884f2e3c9accef8564beabd8f0932117d72d9 (diff) |
Fix #531 Issue with Glide SSO module
Diffstat (limited to 'app/src/main/java/it/niedermann/nextcloud/deck/util')
2 files changed, 51 insertions, 5 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnOriginHeader.java b/app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnOriginHeader.java new file mode 100644 index 000000000..0c7d1e5a2 --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnOriginHeader.java @@ -0,0 +1,38 @@ +package it.niedermann.nextcloud.deck.util.glide; + +import androidx.annotation.NonNull; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.model.Headers; +import com.bumptech.glide.load.model.LazyHeaders; +import com.nextcloud.android.sso.helper.SingleAccountHelper; +import com.nextcloud.android.sso.model.SingleSignOnAccount; + +import java.util.Map; + +import it.niedermann.nextcloud.deck.model.Account; + +public class SingleSignOnOriginHeader implements Headers { + + private LazyHeaders headers; + + /** + * Use this header and set the {@link SingleSignOnAccount} name property as value + * Format of the value needs to be + */ + public static final String X_HEADER_SSO_ACCOUNT_NAME = "X-SSO-Account-Name"; + + /** + * Use this as {@link Headers} if you want to do a {@link Glide} request for an {@link SingleSignOnAccount} which is not set by {@link SingleAccountHelper} as current {@link SingleSignOnAccount}. + * + * @param account Account from which host the request should be fired + */ + public SingleSignOnOriginHeader(@NonNull Account account) { + this.headers = new LazyHeaders.Builder().addHeader(X_HEADER_SSO_ACCOUNT_NAME, account.getName()).build(); + } + + @Override + public Map<String, String> getHeaders() { + return this.headers.getHeaders(); + } +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnStreamFetcher.java b/app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnStreamFetcher.java index 4cf16d2c5..ad0c5cd33 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnStreamFetcher.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnStreamFetcher.java @@ -8,6 +8,7 @@ import com.bumptech.glide.Priority; import com.bumptech.glide.load.DataSource; import com.bumptech.glide.load.data.DataFetcher; import com.bumptech.glide.load.model.GlideUrl; +import com.nextcloud.android.sso.AccountImporter; import com.nextcloud.android.sso.aidl.NextcloudRequest; import com.nextcloud.android.sso.api.NextcloudAPI; import com.nextcloud.android.sso.api.Response; @@ -27,6 +28,8 @@ import java.util.Map; import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.api.GsonConfig; +import static it.niedermann.nextcloud.deck.util.glide.SingleSignOnOriginHeader.X_HEADER_SSO_ACCOUNT_NAME; + /** * Fetches an {@link InputStream} using the Nextcloud SSO library. @@ -48,12 +51,17 @@ public class SingleSignOnStreamFetcher implements DataFetcher<InputStream> { @Override public void loadData(@NonNull Priority priority, @NonNull final DataCallback<? super InputStream> callback) { - NextcloudAPI client = null; + NextcloudAPI client; try { - SingleSignOnAccount ssoAccount = SingleAccountHelper.getCurrentSingleSignOnAccount(context); + final SingleSignOnAccount ssoAccount; + if (url.getHeaders().containsKey(X_HEADER_SSO_ACCOUNT_NAME)) { + ssoAccount = AccountImporter.getSingleSignOnAccount(context, url.getHeaders().get(X_HEADER_SSO_ACCOUNT_NAME)); + } else { + ssoAccount = SingleAccountHelper.getCurrentSingleSignOnAccount(context); + } client = INITIALIZED_APIs.get(ssoAccount.name); boolean didInitialize = false; - if (client == null){ + if (client == null) { client = new NextcloudAPI(context, ssoAccount, GsonConfig.getGson(), new NextcloudAPI.ApiConnectedListener() { @Override public void onConnected() { @@ -69,7 +77,7 @@ public class SingleSignOnStreamFetcher implements DataFetcher<InputStream> { didInitialize = true; } - NextcloudRequest.Builder requestBuilder = null; + NextcloudRequest.Builder requestBuilder; try { requestBuilder = new NextcloudRequest.Builder() .setMethod(METHOD_GET) @@ -86,7 +94,7 @@ public class SingleSignOnStreamFetcher implements DataFetcher<InputStream> { } catch (MalformedURLException e) { callback.onLoadFailed(e); } catch (TokenMismatchException e) { - if (!didInitialize){ + if (!didInitialize) { DeckLog.warn("SSO Glide loader failed with TokenMismatchException, trying to re-initialize..."); client.stop(); INITIALIZED_APIs.remove(ssoAccount.name); |