use OkHttpClient Authenticator instead of always adding credentials in headers (#1767)
[Komga] better handling of authentication
This commit is contained in:
		
							parent
							
								
									12f71a7278
								
							
						
					
					
						commit
						231705d8c1
					
				@ -5,7 +5,7 @@ ext {
 | 
			
		||||
    appName = 'Tachiyomi: Komga'
 | 
			
		||||
    pkgNameSuffix = 'all.komga'
 | 
			
		||||
    extClass = '.Komga'
 | 
			
		||||
    extVersionCode = 3
 | 
			
		||||
    extVersionCode = 4
 | 
			
		||||
    libVersion = '1.2'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -21,20 +21,19 @@ import uy.kohesive.injekt.Injekt
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
import java.text.SimpleDateFormat
 | 
			
		||||
import java.util.*
 | 
			
		||||
import java.util.concurrent.TimeUnit
 | 
			
		||||
 | 
			
		||||
open class Komga : ConfigurableSource, HttpSource() {
 | 
			
		||||
    override fun popularMangaRequest(page: Int): Request =
 | 
			
		||||
        GET("$baseUrl/api/v1/series?page=${page - 1}", headers)
 | 
			
		||||
 | 
			
		||||
    override fun popularMangaParse(response: Response): MangasPage =
 | 
			
		||||
        processSeriePage(response)
 | 
			
		||||
        processSeriesPage(response)
 | 
			
		||||
 | 
			
		||||
    override fun latestUpdatesRequest(page: Int): Request =
 | 
			
		||||
        GET("$baseUrl/api/v1/series/latest?page=${page - 1}", headers)
 | 
			
		||||
 | 
			
		||||
    override fun latestUpdatesParse(response: Response): MangasPage =
 | 
			
		||||
        processSeriePage(response)
 | 
			
		||||
        processSeriesPage(response)
 | 
			
		||||
 | 
			
		||||
    override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
 | 
			
		||||
        val url = HttpUrl.parse("$baseUrl/api/v1/series?search=$query&page=${page - 1}")!!.newBuilder()
 | 
			
		||||
@ -59,7 +58,7 @@ open class Komga : ConfigurableSource, HttpSource() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun searchMangaParse(response: Response): MangasPage =
 | 
			
		||||
        processSeriePage(response)
 | 
			
		||||
        processSeriesPage(response)
 | 
			
		||||
 | 
			
		||||
    override fun mangaDetailsRequest(manga: SManga): Request =
 | 
			
		||||
        GET(baseUrl + manga.url, headers)
 | 
			
		||||
@ -106,7 +105,7 @@ open class Komga : ConfigurableSource, HttpSource() {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun processSeriePage(response: Response): MangasPage {
 | 
			
		||||
    private fun processSeriesPage(response: Response): MangasPage {
 | 
			
		||||
        val page = gson.fromJson<PageWrapperDto<SeriesDto>>(response.body()?.charStream()!!)
 | 
			
		||||
        val mangas = page.content.map {
 | 
			
		||||
            it.toSManga()
 | 
			
		||||
@ -149,9 +148,7 @@ open class Komga : ConfigurableSource, HttpSource() {
 | 
			
		||||
 | 
			
		||||
    private var libraries = emptyList<LibraryDto>()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    override val name = "Komga"
 | 
			
		||||
 | 
			
		||||
    override val lang = "en"
 | 
			
		||||
    override val supportsLatest = true
 | 
			
		||||
 | 
			
		||||
@ -160,36 +157,26 @@ open class Komga : ConfigurableSource, HttpSource() {
 | 
			
		||||
    private val password by lazy { getPrefPassword() }
 | 
			
		||||
    private val gson by lazy { Gson() }
 | 
			
		||||
 | 
			
		||||
    init {
 | 
			
		||||
        Single.fromCallable {
 | 
			
		||||
            client.newCall(GET("$baseUrl/api/v1/libraries", headers)).execute()
 | 
			
		||||
        }
 | 
			
		||||
            .subscribeOn(Schedulers.io())
 | 
			
		||||
            .observeOn(AndroidSchedulers.mainThread())
 | 
			
		||||
            .subscribe({
 | 
			
		||||
                libraries = try {
 | 
			
		||||
                    gson.fromJson(it.body()?.charStream()!!)
 | 
			
		||||
                } catch (e: Exception) {
 | 
			
		||||
                    emptyList()
 | 
			
		||||
                }
 | 
			
		||||
            }, {})
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun headersBuilder(): Headers.Builder =
 | 
			
		||||
        Headers.Builder()
 | 
			
		||||
            .add("Authorization", Credentials.basic(username, password))
 | 
			
		||||
            .add("User-Agent", "Tachiyomi Komga v${BuildConfig.VERSION_NAME}")
 | 
			
		||||
 | 
			
		||||
    private val preferences: SharedPreferences by lazy {
 | 
			
		||||
        Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun clientBuilder(): OkHttpClient = network.client.newBuilder()
 | 
			
		||||
        .connectTimeout(10, TimeUnit.SECONDS)
 | 
			
		||||
        .readTimeout(30, TimeUnit.SECONDS)
 | 
			
		||||
        .cache(null)
 | 
			
		||||
        .build()!!
 | 
			
		||||
    override val client: OkHttpClient =
 | 
			
		||||
        network.client.newBuilder()
 | 
			
		||||
            .authenticator { _, response ->
 | 
			
		||||
                if (response.request().header("Authorization") != null) {
 | 
			
		||||
                    null // Give up, we've already failed to authenticate.
 | 
			
		||||
                } else {
 | 
			
		||||
                    response.request().newBuilder()
 | 
			
		||||
                        .addHeader("Authorization", Credentials.basic(username, password))
 | 
			
		||||
                        .build()
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            .build()
 | 
			
		||||
 | 
			
		||||
    override fun setupPreferenceScreen(screen: PreferenceScreen) {
 | 
			
		||||
        screen.addPreference(screen.editTextPreference(ADDRESS_TITLE, ADDRESS_DEFAULT, baseUrl))
 | 
			
		||||
@ -223,6 +210,22 @@ open class Komga : ConfigurableSource, HttpSource() {
 | 
			
		||||
    private fun getPrefUsername(): String = preferences.getString(USERNAME_TITLE, USERNAME_DEFAULT)!!
 | 
			
		||||
    private fun getPrefPassword(): String = preferences.getString(PASSWORD_TITLE, PASSWORD_DEFAULT)!!
 | 
			
		||||
 | 
			
		||||
    init {
 | 
			
		||||
        Single.fromCallable {
 | 
			
		||||
            client.newCall(GET("$baseUrl/api/v1/libraries", headers)).execute()
 | 
			
		||||
        }
 | 
			
		||||
            .subscribeOn(Schedulers.io())
 | 
			
		||||
            .observeOn(AndroidSchedulers.mainThread())
 | 
			
		||||
            .subscribe({
 | 
			
		||||
                libraries = try {
 | 
			
		||||
                    gson.fromJson(it.body()?.charStream()!!)
 | 
			
		||||
                } catch (e: Exception) {
 | 
			
		||||
                    emptyList()
 | 
			
		||||
                }
 | 
			
		||||
            }, {})
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    companion object {
 | 
			
		||||
        private const val ADDRESS_TITLE = "Address"
 | 
			
		||||
        private const val ADDRESS_DEFAULT = ""
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user