Remove url building in AuthInterceptor
This commit is contained in:
parent
3d0ff2619f
commit
629ca050a3
@ -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()
|
||||
}
|
||||
|
||||
|
@ -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")
|
||||
|
@ -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())
|
||||
}
|
||||
}
|
@ -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")
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user