Remove url building in AuthInterceptor

This commit is contained in:
Shinokuni 2021-07-08 19:05:25 +02:00
parent 3d0ff2619f
commit 629ca050a3
7 changed files with 52 additions and 51 deletions

View File

@ -2,6 +2,7 @@ package com.readrops.api
import com.chimerapps.niddler.interceptor.okhttp.NiddlerOkHttpInterceptor
import com.readrops.api.localfeed.LocalRSSDataSource
import com.readrops.api.services.Credentials
import com.readrops.api.services.freshrss.FreshRSSDataSource
import com.readrops.api.services.freshrss.FreshRSSService
import com.readrops.api.services.freshrss.adapters.FreshRSSFeedsAdapter
@ -25,8 +26,6 @@ import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.moshi.MoshiConverterFactory
import java.util.concurrent.TimeUnit
const val BASE_URL = "https://baseurl.com"
val apiModule = module {
single(createdAtStart = true) {
@ -44,19 +43,19 @@ val apiModule = module {
//region freshrss
single { FreshRSSDataSource(get()) }
factory { params -> FreshRSSDataSource(get(parameters = { params })) }
single {
get<Retrofit>(named("freshrssRetrofit"))
factory { params ->
get<Retrofit>(named("freshrssRetrofit"), parameters = { params })
.create(FreshRSSService::class.java)
}
single(named("freshrssRetrofit")) {
Retrofit.Builder() // url will be set dynamically in AuthInterceptor
.baseUrl(BASE_URL)
factory(named("freshrssRetrofit")) { (credentials: Credentials) ->
Retrofit.Builder()
.baseUrl(credentials.url)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(get<OkHttpClient>())
.addConverterFactory(MoshiConverterFactory.create(get<Moshi>(named("freshrssMoshi"))))
.client(get())
.addConverterFactory(MoshiConverterFactory.create(get(named("freshrssMoshi"))))
.build()
}
@ -73,19 +72,19 @@ val apiModule = module {
//region nextcloud news
single { NextNewsDataSource(get()) }
factory { params -> NextNewsDataSource(get(parameters = { params })) }
single {
get<Retrofit>(named("nextcloudNewsRetrofit"))
factory { params ->
get<Retrofit>(named("nextcloudNewsRetrofit"), parameters = { params })
.create(NextNewsService::class.java)
}
single(named("nextcloudNewsRetrofit")) {
Retrofit.Builder() // url will be set dynamically in AuthInterceptor
.baseUrl(BASE_URL)
factory(named("nextcloudNewsRetrofit")) { (credentials: Credentials) ->
Retrofit.Builder()
.baseUrl(credentials.url)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(get<OkHttpClient>())
.addConverterFactory(MoshiConverterFactory.create(get<Moshi>(named("nextcloudNewsMoshi"))))
.client(get())
.addConverterFactory(MoshiConverterFactory.create(get(named("nextcloudNewsMoshi"))))
.build()
}

View File

@ -20,7 +20,7 @@ import retrofit2.http.Query;
public interface NextNewsService {
String END_POINT = "/index.php/apps/news/api/v1-2";
String END_POINT = "/index.php/apps/news/api/v1-2/";
@GET("/ocs/v1.php/cloud/users/{userId}")
@Headers("OCS-APIRequest: true")

View File

@ -9,22 +9,13 @@ class AuthInterceptor(var credentials: Credentials? = null) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val requestBuilder = chain.request().newBuilder()
val urlBuilder = chain.request().url.newBuilder()
if (credentials != null) {
if (credentials!!.url != null) {
val uri = URI.create(credentials!!.url)
urlBuilder
.scheme(uri.scheme!!)
.host(uri.host!!)
.encodedPath(uri.path + chain.request().url.encodedPath)
}
if (credentials!!.authorization != null) {
requestBuilder.addHeader("Authorization", credentials!!.authorization)
credentials?.let {
if (it.authorization != null) {
requestBuilder.addHeader("Authorization", it.authorization)
}
}
return chain.proceed(requestBuilder.url(urlBuilder.build()).build())
return chain.proceed(requestBuilder.build())
}
}

View File

@ -3,6 +3,7 @@ package com.readrops.app
import androidx.preference.PreferenceManager
import com.chimerapps.niddler.core.AndroidNiddler
import com.chimerapps.niddler.core.Niddler
import com.readrops.api.services.Credentials
import com.readrops.app.account.AccountViewModel
import com.readrops.app.addfeed.AddFeedsViewModel
import com.readrops.app.feedsfolders.ManageFeedsFoldersViewModel
@ -18,6 +19,7 @@ import com.readrops.db.entities.account.AccountType
import org.koin.android.ext.koin.androidApplication
import org.koin.android.ext.koin.androidContext
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.core.parameter.parametersOf
import org.koin.dsl.module
val appModule = module {
@ -25,8 +27,10 @@ val appModule = module {
factory { (account: Account) ->
when (account.accountType) {
AccountType.LOCAL -> LocalFeedRepository(get(), get(), androidContext(), account)
AccountType.NEXTCLOUD_NEWS -> NextNewsRepository(get(), get(), androidContext(), account)
AccountType.FRESHRSS -> FreshRSSRepository(get(), get(), androidContext(), account)
AccountType.NEXTCLOUD_NEWS -> NextNewsRepository(get(parameters = { parametersOf(Credentials.toCredentials(account)) }),
get(), androidContext(), account)
AccountType.FRESHRSS -> FreshRSSRepository(get(parameters = { parametersOf(Credentials.toCredentials(account)) }),
get(), androidContext(), account)
else -> throw IllegalArgumentException("Account type not supported")
}
}

View File

@ -12,7 +12,6 @@ import com.readrops.db.Database;
import com.readrops.db.entities.Feed;
import com.readrops.db.entities.Folder;
import com.readrops.db.entities.account.Account;
import com.readrops.db.entities.account.AccountType;
import org.koin.core.parameter.DefinitionParametersKt;
import org.koin.java.KoinJavaComponent;
@ -32,17 +31,13 @@ public class AccountViewModel extends ViewModel {
this.database = database;
}
public void setAccountType(AccountType accountType) {
repository = KoinJavaComponent.get(ARepository.class, null,
() -> DefinitionParametersKt.parametersOf(new Account(null, null, accountType)));
}
public void setAccount(Account account) {
repository = KoinJavaComponent.get(ARepository.class, null,
() -> DefinitionParametersKt.parametersOf(account));
}
public Completable login(Account account, boolean insert) {
setAccount(account);
return repository.login(account, insert);
}

View File

@ -61,15 +61,13 @@ public class AddAccountActivity extends AppCompatActivity {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
if (accountToEdit != null) {
viewModel.setAccountType(accountToEdit.getAccountType());
editAccount = true;
fillFields();
} else {
viewModel.setAccountType(accountType);
binding.providerImage.setImageResource(accountType.getIconRes());
binding.providerName.setText(accountType.getName());
binding.addAccountName.setText(accountType.getName());
if (accountType == AccountType.FRESHRSS) {
binding.addAccountPasswordLayout.setHelperText(getString(R.string.password_helper));
}

View File

@ -11,9 +11,8 @@ import androidx.annotation.Nullable;
import com.readrops.api.services.SyncResult;
import com.readrops.api.services.SyncType;
import com.readrops.api.services.nextcloudnews.NextNewsDataSource;
import com.readrops.api.services.nextcloudnews.NextNewsService;
import com.readrops.api.services.nextcloudnews.NextNewsSyncData;
import com.readrops.api.utils.AuthInterceptor;
import com.readrops.api.services.nextcloudnews.adapters.NextNewsUserAdapter;
import com.readrops.api.utils.exceptions.UnknownFormatException;
import com.readrops.app.addfeed.FeedInsertionResult;
import com.readrops.app.addfeed.ParsingResult;
@ -37,6 +36,9 @@ import java.util.stream.Collectors;
import io.reactivex.Completable;
import io.reactivex.Observable;
import io.reactivex.Single;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class NextNewsRepository extends ARepository {
@ -54,16 +56,23 @@ public class NextNewsRepository extends ARepository {
public Completable login(Account account, boolean insert) {
setCredentials(account);
return Single.<String>create(emitter -> {
// workaround to have the Nextcloud API call working, as I don't know how to do otherwise
AuthInterceptor authInterceptor = KoinJavaComponent.get(AuthInterceptor.class);
authInterceptor.getCredentials().setUrl(authInterceptor.getCredentials().getUrl().replace(NextNewsService.END_POINT, ""));
OkHttpClient httpClient = KoinJavaComponent.get(OkHttpClient.class);
String displayName = dataSource.login(account.getLogin());
Request request = new Request.Builder()
.url(account.getUrl() + "/ocs/v1.php/cloud/users/" + account.getLogin())
.addHeader("OCS-APIRequest", "true")
.build();
Response response = httpClient.newCall(request).execute();
if (response.isSuccessful()) {
String displayName = new NextNewsUserAdapter().fromXml(response.body().byteStream());
response.body().close();
if (displayName != null) {
emitter.onSuccess(displayName);
} else {
emitter.onError(new Exception("Login failed. Please check your credentials and your Nextcloud News setup."));
// TODO better error handling
emitter.onError(new Exception("Login exception : " + response.code() + " error"));
}
}).flatMapCompletable(displayName -> {
account.setDisplayedName(displayName);
@ -211,6 +220,7 @@ public class NextNewsRepository extends ARepository {
@Override
public Completable updateFeed(Feed feed) {
setCredentials(account);
return Completable.create(emitter -> {
Folder folder = feed.getFolderId() == null ? null : database.folderDao().select(feed.getFolderId());
@ -232,6 +242,7 @@ public class NextNewsRepository extends ARepository {
@Override
public Completable deleteFeed(Feed feed) {
setCredentials(account);
return Completable.create(emitter -> {
try {
if (dataSource.deleteFeed(Integer.parseInt(feed.getRemoteId()))) {
@ -248,6 +259,7 @@ public class NextNewsRepository extends ARepository {
@Override
public Single<Long> addFolder(Folder folder) {
setCredentials(account);
return Single.<Folder>create(emitter -> {
try {
List<Folder> folders = dataSource.createFolder(folder);
@ -267,6 +279,7 @@ public class NextNewsRepository extends ARepository {
@Override
public Completable updateFolder(Folder folder) {
setCredentials(account);
return Completable.create(emitter -> {
try {
if (dataSource.renameFolder(folder)) {
@ -284,6 +297,7 @@ public class NextNewsRepository extends ARepository {
@Override
public Completable deleteFolder(Folder folder) {
setCredentials(account);
return Completable.create(emitter -> {
try {
if (dataSource.deleteFolder(folder)) {