From c2436043c7261c3222b6e77be82f076bfeea018f Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Thu, 23 Feb 2023 13:01:01 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=AA=8D=E8=A8=BC=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E3=82=92Token=E3=81=8B=E3=82=89Auth=E3=81=AB=E6=8A=BD=E8=B1=A1?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/kotlin/dev/usbharu/multim/MultiM.kt | 20 +++++++++++++++++++ .../kotlin/dev/usbharu/multim/ServiceInfo.kt | 3 ++- .../multim/factory/PlatformApiFactory.kt | 10 ++++++++++ .../multim/factory/ServiceInfoFactory.kt | 14 ++++++++++++- .../kotlin/dev/usbharu/multim/model/Auth.kt | 5 +++++ .../multim/misskey/v12/MisskeyV12Info.kt | 3 ++- .../usbharu/multim/misskey/v12/api/Drive.kt | 2 +- .../v12/common/api/MisskeyApiClient.kt | 11 +++++----- .../multim/misskey/v12/api/MetaTest.kt | 3 ++- .../multim/misskey/v12/api/TimelineTest.kt | 3 ++- .../dev/usbharu/multim/v12/api/ApTest.kt | 9 +++++---- .../dev/usbharu/multim/v12/api/NotesTest.kt | 15 +++++++------- .../v12/common/api/MisskeyStatusApiTest.kt | 3 ++- 13 files changed, 77 insertions(+), 24 deletions(-) create mode 100644 core/src/main/kotlin/dev/usbharu/multim/model/Auth.kt diff --git a/core/src/main/kotlin/dev/usbharu/multim/MultiM.kt b/core/src/main/kotlin/dev/usbharu/multim/MultiM.kt index f3a6ffd..d64c2a7 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/MultiM.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/MultiM.kt @@ -8,6 +8,7 @@ import dev.usbharu.multim.api.NodeinfoApi import dev.usbharu.multim.error.MultiMError import dev.usbharu.multim.factory.MultiMApis import dev.usbharu.multim.factory.PlatformApiFactory +import dev.usbharu.multim.model.Auth import dev.usbharu.multim.multi.MultiAccountApiBase import io.ktor.client.* import io.ktor.client.engine.cio.* @@ -57,6 +58,25 @@ object MultiM { return result } + suspend fun createClient( + url:String, + auth: Auth, + factory: PlatformApiFactory, + httpClient: HttpClient = httpClientWithJson + ) : Result { + dev.usbharu.multim.Logger.info("Create Client","START Create cient with url:$url.") + dev.usbharu.multim.Logger.debug("Create Client","Create client with url:$url auth:${auth::class.simpleName}") + val result = NodeinfoApi(httpClient).nodeinfo(url) + .map { nodeInfo -> factory.factory(nodeInfo, httpClient, auth, url) } + result.onSuccess { + dev.usbharu.multim.Logger.info("Create Client","SUCCESS Create Client with url:$url") + } + result.onFailure { + dev.usbharu.multim.Logger.error("Create Client","FAILURE Create Client with url:$url auth:${auth::class.simpleName}",it) + } + return result + } + fun createMultiAccountClients(serviceInfoList: List = listOf()): MultiAccountApiBase { dev.usbharu.multim.Logger.info("Create Client","START Create multi account client with ${serviceInfoList.size} services.") val multiAccountApiBase = MultiAccountApiBase(serviceInfoList) diff --git a/core/src/main/kotlin/dev/usbharu/multim/ServiceInfo.kt b/core/src/main/kotlin/dev/usbharu/multim/ServiceInfo.kt index 25a59fc..9a5a591 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/ServiceInfo.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/ServiceInfo.kt @@ -3,6 +3,7 @@ package dev.usbharu.multim import dev.usbharu.multim.api.ApiClient import dev.usbharu.multim.api.PlatformApis import dev.usbharu.multim.factory.MultiMApis +import dev.usbharu.multim.model.Auth import io.ktor.client.* /** @@ -16,7 +17,7 @@ import io.ktor.client.* abstract class ServiceInfo( val serviceNameMatchRegex: Regex, val versionMatchRegex: Regex, - val apiClient:(String,String,HttpClient)->ApiClient, + val apiClient:(Auth,String,HttpClient)->ApiClient, val platFormApis:(ApiClient)->PlatformApis, val multiMApis: (PlatformApis)->MultiMApis ) diff --git a/core/src/main/kotlin/dev/usbharu/multim/factory/PlatformApiFactory.kt b/core/src/main/kotlin/dev/usbharu/multim/factory/PlatformApiFactory.kt index 1d05bf6..8cc8116 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/factory/PlatformApiFactory.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/factory/PlatformApiFactory.kt @@ -1,10 +1,12 @@ package dev.usbharu.multim.factory import dev.usbharu.multim.api.PlatformApis +import dev.usbharu.multim.model.Auth import dev.usbharu.multim.model.wellknown.nodeinfo.NodeInfo import io.ktor.client.* interface PlatformApiFactory { + @Deprecated("トークンが一つの場合にしか対応できないので廃止。") fun factory( nodeInfo: NodeInfo, httpClient: HttpClient, @@ -12,4 +14,12 @@ interface PlatformApiFactory { baseUrl: String, build: MultiMApis.(PlatformApis) -> Unit = {} ): MultiMApis + + fun factory( + nodeInfo: NodeInfo, + httpClient: HttpClient, + auth: Auth, + baseUrl: String, + build:MultiMApis.(PlatformApis) -> Unit = {} + ):MultiMApis } diff --git a/core/src/main/kotlin/dev/usbharu/multim/factory/ServiceInfoFactory.kt b/core/src/main/kotlin/dev/usbharu/multim/factory/ServiceInfoFactory.kt index 1e418ee..d9ab869 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/factory/ServiceInfoFactory.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/factory/ServiceInfoFactory.kt @@ -3,6 +3,8 @@ package dev.usbharu.multim.factory import dev.usbharu.multim.Logger import dev.usbharu.multim.ServiceInfo import dev.usbharu.multim.api.PlatformApis +import dev.usbharu.multim.model.Auth +import dev.usbharu.multim.model.SingleTokenAuth import dev.usbharu.multim.model.wellknown.nodeinfo.NodeInfo import io.ktor.client.* @@ -13,6 +15,16 @@ class ServiceInfoFactory(private val services: List) : PlatformApiF token: String, baseUrl: String, build: MultiMApis.(PlatformApis) -> Unit + ): MultiMApis { + return this.factory(nodeInfo, httpClient, SingleTokenAuth(token), baseUrl, build) + } + + override fun factory( + nodeInfo: NodeInfo, + httpClient: HttpClient, + auth: Auth, + baseUrl: String, + build: MultiMApis.(PlatformApis) -> Unit ): MultiMApis { for (service in services) { @@ -22,7 +34,7 @@ class ServiceInfoFactory(private val services: List) : PlatformApiF ) { val platFormApis = service.platFormApis( service.apiClient( - token, + auth, baseUrl, httpClient ) diff --git a/core/src/main/kotlin/dev/usbharu/multim/model/Auth.kt b/core/src/main/kotlin/dev/usbharu/multim/model/Auth.kt new file mode 100644 index 0000000..63a15c5 --- /dev/null +++ b/core/src/main/kotlin/dev/usbharu/multim/model/Auth.kt @@ -0,0 +1,5 @@ +package dev.usbharu.multim.model + +abstract class Auth + +class SingleTokenAuth(val token:String): Auth() diff --git a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/MisskeyV12Info.kt b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/MisskeyV12Info.kt index 48d41f3..badac9d 100644 --- a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/MisskeyV12Info.kt +++ b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/MisskeyV12Info.kt @@ -4,11 +4,12 @@ import dev.usbharu.multim.ServiceInfo import dev.usbharu.multim.misskey.v12.api.MisskeyApis import dev.usbharu.multim.misskey.v12.api.MisskeyMultiMApis import dev.usbharu.multim.misskey.v12.common.api.* +import dev.usbharu.multim.model.SingleTokenAuth object MisskeyV12Info : ServiceInfo( Regex("misskey"), Regex("^12\\.[\\d.]+"), - ::MisskeyApiClient, + { auth, baseUrl, client -> MisskeyApiClient(auth as SingleTokenAuth, baseUrl, client) }, { apiClient -> MisskeyApis(apiClient as MisskeyApiClient) }, { diff --git a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/api/Drive.kt b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/api/Drive.kt index fd94a9a..bb5cb7c 100644 --- a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/api/Drive.kt +++ b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/api/Drive.kt @@ -47,7 +47,7 @@ class Drive(val client: MisskeyApiClient) { return client.client.submitFormWithBinaryData( client.baseUrl + "api/drive/files/create", formData = formData { - append("\"i\"", client.token) + append("\"i\"", client.auth.token) append("\"file\"", createRequest.file, Headers.build { append(HttpHeaders.ContentDisposition, "filename=${createRequest.name}") }) diff --git a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/common/api/MisskeyApiClient.kt b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/common/api/MisskeyApiClient.kt index 834ea18..cb33618 100644 --- a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/common/api/MisskeyApiClient.kt +++ b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/common/api/MisskeyApiClient.kt @@ -3,14 +3,13 @@ package dev.usbharu.multim.misskey.v12.common.api import dev.usbharu.multim.MultiM.json import dev.usbharu.multim.api.ApiClient import dev.usbharu.multim.misskey.v12.model.components.MisskeyNeedAuth +import dev.usbharu.multim.model.Auth +import dev.usbharu.multim.model.SingleTokenAuth import io.ktor.client.* import io.ktor.client.plugins.api.* -import io.ktor.client.plugins.contentnegotiation.* -import io.ktor.client.plugins.logging.* import io.ktor.client.plugins.websocket.* import io.ktor.http.* import io.ktor.serialization.kotlinx.* -import io.ktor.serialization.kotlinx.json.* import io.ktor.websocket.* import kotlinx.coroutines.* import kotlinx.coroutines.channels.consumeEach @@ -21,7 +20,7 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.serialization.encodeToString -class MisskeyApiClient(var token: String, baseUrl: String, client: HttpClient) : +class MisskeyApiClient(var auth: SingleTokenAuth, baseUrl: String, client: HttpClient) : ApiClient(baseUrl, client.config { install(WebSockets) { pingInterval = 20_000 @@ -32,7 +31,7 @@ class MisskeyApiClient(var token: String, baseUrl: String, client: HttpClient) : println("request type is :${content::class}") if (content is MisskeyNeedAuth) { println("injection token") - content.i = token + content.i = auth.token } request.headers.append( "Content-Type", ContentType.Application.Json @@ -53,7 +52,7 @@ class MisskeyApiClient(var token: String, baseUrl: String, client: HttpClient) : var commands = MutableStateFlow("a") fun connect() { val launch = coroutineScope.launch { - client.wss("ws" + baseUrl.replaceFirst("http", "") + "streaming?i=$token") { + client.wss("ws" + baseUrl.replaceFirst("http", "") + "streaming?i=${auth.token}") { awaitAll( coroutineScope.async { commands.onEach { println("Sending :$it");outgoing.send(Frame.Text(it)) } diff --git a/impl/misskey/src/test/kotlin/dev/usbharu/multim/misskey/v12/api/MetaTest.kt b/impl/misskey/src/test/kotlin/dev/usbharu/multim/misskey/v12/api/MetaTest.kt index 519324b..d690999 100644 --- a/impl/misskey/src/test/kotlin/dev/usbharu/multim/misskey/v12/api/MetaTest.kt +++ b/impl/misskey/src/test/kotlin/dev/usbharu/multim/misskey/v12/api/MetaTest.kt @@ -4,6 +4,7 @@ import MisskeyTestUtil.assertIsOk import dev.usbharu.multim.api.createHttpClient import dev.usbharu.multim.misskey.v12.common.api.MisskeyApiClient import dev.usbharu.multim.misskey.v12.model.MetaRequest +import dev.usbharu.multim.model.SingleTokenAuth import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.jupiter.api.Assertions.* @@ -15,7 +16,7 @@ class MetaTest class MetaTestE2E{ val misskeyApiClient = MisskeyApiClient( - System.getProperty("multim_misskey_token"),System.getProperty("multim_misskey_instance"), + SingleTokenAuth(System.getProperty("multim_misskey_token")),System.getProperty("multim_misskey_instance"), createHttpClient() ) diff --git a/impl/misskey/src/test/kotlin/dev/usbharu/multim/misskey/v12/api/TimelineTest.kt b/impl/misskey/src/test/kotlin/dev/usbharu/multim/misskey/v12/api/TimelineTest.kt index 5982aea..78a8e48 100644 --- a/impl/misskey/src/test/kotlin/dev/usbharu/multim/misskey/v12/api/TimelineTest.kt +++ b/impl/misskey/src/test/kotlin/dev/usbharu/multim/misskey/v12/api/TimelineTest.kt @@ -10,6 +10,7 @@ import dev.usbharu.multim.misskey.v12.model.StreamRequest.ConnectRequest.Body.Ch import dev.usbharu.multim.misskey.v12.model.StreamRequest.DisconnectRequest import dev.usbharu.multim.misskey.v12.model.StreamResponse.ChannelResponse.ChannelBody.NoteBody import dev.usbharu.multim.misskey.v12.model.components.Note +import dev.usbharu.multim.model.SingleTokenAuth import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay @@ -23,7 +24,7 @@ class TimelineTestE2E { val client = MisskeyApiClient( - System.getProperty("multim_misskey_token"), + SingleTokenAuth(System.getProperty("multim_misskey_token")), System.getProperty("multim_misskey_instance"), createHttpClient() ) diff --git a/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/api/ApTest.kt b/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/api/ApTest.kt index 39dbe0d..6daae0e 100644 --- a/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/api/ApTest.kt +++ b/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/api/ApTest.kt @@ -12,6 +12,7 @@ import dev.usbharu.multim.misskey.v12.api.Ap import dev.usbharu.multim.misskey.v12.common.api.MisskeyApiClient import dev.usbharu.multim.misskey.v12.model.ApShowRequest import dev.usbharu.multim.misskey.v12.model.ApShowResponse +import dev.usbharu.multim.model.SingleTokenAuth import io.github.artsok.RepeatedIfExceptionsTest import io.ktor.client.* import io.ktor.client.engine.mock.* @@ -29,7 +30,7 @@ import org.junit.jupiter.api.Test class ApTest { val misskeyApiClient = MisskeyApiClient( - System.getProperty("multim_misskey_token"), System.getProperty("multim_misskey_instance"), + SingleTokenAuth(System.getProperty("multim_misskey_token")), System.getProperty("multim_misskey_instance"), createHttpClient() ) @@ -49,7 +50,7 @@ class ApTest { }""" val misskeyApiClient = MisskeyApiClient( - "aaaaaaaa", "https://localhost", createMockHttpClient(typeUser) + SingleTokenAuth("aaaaaaaa"), "https://localhost", createMockHttpClient(typeUser) ) val show = Ap(misskeyApiClient).show(ApShowRequest("https://localhost/test/IN7OFhht")).get() assertEquals(json.decodeFromString(typeUser), show) @@ -66,7 +67,7 @@ class ApTest { """.trimIndent() val misskeyApiClient = MisskeyApiClient( - "W7Xw8F", "https://localhost", createMockHttpClient(typeNote) + SingleTokenAuth("W7Xw8F"), "https://localhost", createMockHttpClient(typeNote) ) val show = Ap(misskeyApiClient).show(ApShowRequest("https://localhost/test/C56WI")).get() assertEquals(json.decodeFromString(typeNote), show) @@ -76,7 +77,7 @@ class ApTest { class ApTestE2E { val misskeyApiClient = MisskeyApiClient( - System.getProperty("multim_misskey_token"), System.getProperty("multim_misskey_instance"), + SingleTokenAuth(System.getProperty("multim_misskey_token")), System.getProperty("multim_misskey_instance"), createHttpClient() ) diff --git a/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/api/NotesTest.kt b/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/api/NotesTest.kt index 29b90e2..573f37b 100644 --- a/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/api/NotesTest.kt +++ b/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/api/NotesTest.kt @@ -11,6 +11,7 @@ import dev.usbharu.multim.misskey.v12.api.Drive import dev.usbharu.multim.misskey.v12.api.Notes import dev.usbharu.multim.misskey.v12.common.api.MisskeyApiClient import dev.usbharu.multim.misskey.v12.model.* +import dev.usbharu.multim.model.SingleTokenAuth import io.github.artsok.RepeatedIfExceptionsTest import io.ktor.client.* import io.ktor.client.engine.mock.* @@ -33,7 +34,7 @@ class NotesTest { fun globalTimelineTest() = runTest { val notes = Notes( MisskeyApiClient( - "aaaa", + SingleTokenAuth("aaaa"), "", createMockHttpClient( checkAuth = false, @@ -50,7 +51,7 @@ class NotesTest { fun hybridTimelineTest() = runTest { val notes = Notes( MisskeyApiClient( - "aaaa", + SingleTokenAuth("aaaa"), "", createMockHttpClient(content = json.encodeToString(expectNoteArray)) ) @@ -63,7 +64,7 @@ class NotesTest { fun localTimelineTest() = runTest { val notes = Notes( MisskeyApiClient( - "aaa", + SingleTokenAuth("aaa"), "", createMockHttpClient( checkAuth = false, @@ -80,7 +81,7 @@ class NotesTest { val expectedNote = createFakeNote("mLyakn", "7j1VB0L", "Ymhq", "8V7QrxD6") val notes = Notes( MisskeyApiClient( - "aaa", + SingleTokenAuth("aaa"), "", createMockHttpClient( checkAuth = false, @@ -97,7 +98,7 @@ class NotesTest { val note = createFakeNote("aT9o", "o00672o", "W2kwto", "gold") val notes = Notes( MisskeyApiClient( - "aaa", + SingleTokenAuth("aaa"), "", createMockHttpClient(content = json.encodeToString(NotesCreateResponse(note))) ) @@ -108,7 +109,7 @@ class NotesTest { @Test fun deleteTest() = runTest { - val notes = Notes(MisskeyApiClient("aaa", "", createMockHttpClient(content = ""))) + val notes = Notes(MisskeyApiClient(SingleTokenAuth("aaa"), "", createMockHttpClient(content = ""))) notes.delete(NotesDeleteRequest("Rw4g2CH")) } @@ -186,7 +187,7 @@ class NotesTest { class NotesTestE2E { val client = MisskeyApiClient( - System.getProperty("multim_misskey_token"), + SingleTokenAuth(System.getProperty("multim_misskey_token")), System.getProperty("multim_misskey_instance"), createHttpClient() ) diff --git a/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/common/api/MisskeyStatusApiTest.kt b/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/common/api/MisskeyStatusApiTest.kt index 57bc509..8912097 100644 --- a/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/common/api/MisskeyStatusApiTest.kt +++ b/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/common/api/MisskeyStatusApiTest.kt @@ -6,6 +6,7 @@ import dev.usbharu.multim.misskey.v12.api.MisskeyApis import dev.usbharu.multim.misskey.v12.common.MisskeyStatusId import dev.usbharu.multim.misskey.v12.common.api.MisskeyApiClient import dev.usbharu.multim.misskey.v12.common.api.MisskeyStatusApi +import dev.usbharu.multim.model.SingleTokenAuth import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import kotlinx.serialization.Serializable @@ -19,7 +20,7 @@ class MisskeyStatusApiTest { val misskeyStatusApi = MisskeyStatusApi( MisskeyApis( MisskeyApiClient( - "", + SingleTokenAuth(""), "http://localhost/", MisskeyTestUtil.createMockHttpClient( checkAuth = false, content =