Mastodonのクライアント情報再利用チェックでAPIがエラーを返した際のフォールバックが不足していた
This commit is contained in:
parent
953cdea115
commit
c4150b1ff1
|
@ -104,51 +104,53 @@ class AuthMastodon(override val client: TootApiClient) : AuthBase() {
|
||||||
// スコープ一覧を取得する
|
// スコープ一覧を取得する
|
||||||
val scopeString = mastodonScope(tootInstance)
|
val scopeString = mastodonScope(tootInstance)
|
||||||
|
|
||||||
when {
|
try {
|
||||||
// 古いクライアント情報は使わない。削除もしない。
|
when {
|
||||||
AUTH_VERSION != clientInfo?.int(KEY_AUTH_VERSION) -> Unit
|
// 古いクライアント情報は使わない。削除もしない。
|
||||||
|
AUTH_VERSION != clientInfo?.int(KEY_AUTH_VERSION) -> Unit
|
||||||
|
|
||||||
// Misskeyにはclient情報をまだ利用できるかどうか調べる手段がないので、再利用しない
|
// Misskeyにはclient情報をまだ利用できるかどうか調べる手段がないので、再利用しない
|
||||||
clientInfo.boolean(KEY_IS_MISSKEY) == true -> Unit
|
clientInfo.boolean(KEY_IS_MISSKEY) == true -> Unit
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
val clientCredential = prepareClientCredential(apiHost, clientInfo, clientName)
|
val clientCredential = prepareClientCredential(apiHost, clientInfo, clientName)
|
||||||
// client_credential があるならcredentialがまだ使えるか確認する
|
// client_credential があるならcredentialがまだ使えるか確認する
|
||||||
if (!clientCredential.isNullOrEmpty()) {
|
if (!clientCredential.isNullOrEmpty()) {
|
||||||
|
|
||||||
// 存在確認するだけで、結果は使ってない
|
// 存在確認するだけで、結果は使ってない
|
||||||
api.verifyClientCredential(apiHost, clientCredential)
|
api.verifyClientCredential(apiHost, clientCredential)
|
||||||
|
|
||||||
// 過去にはスコープを+で連結したものを保存していた
|
// 過去にはスコープを+で連結したものを保存していた
|
||||||
val oldScope = clientInfo.string(KEY_CLIENT_SCOPE)
|
val oldScope = clientInfo.string(KEY_CLIENT_SCOPE)
|
||||||
?.replace("+", " ")
|
?.replace("+", " ")
|
||||||
|
|
||||||
when {
|
when {
|
||||||
// クライアント情報を再利用する
|
// クライアント情報を再利用する
|
||||||
!forceUpdateClient && oldScope == scopeString -> return clientInfo
|
!forceUpdateClient && oldScope == scopeString -> return clientInfo
|
||||||
|
|
||||||
else -> try {
|
else -> {
|
||||||
// マストドン2.4でスコープが追加された
|
// マストドン2.4でスコープが追加された
|
||||||
// 取得時のスコープ指定がマッチしない(もしくは記録されていない)ならクライアント情報を再利用してはいけない
|
// 取得時のスコープ指定がマッチしない(もしくは記録されていない)ならクライアント情報を再利用してはいけない
|
||||||
daoClientInfo.delete(apiHost, clientName)
|
daoClientInfo.delete(apiHost, clientName)
|
||||||
|
|
||||||
// クライアントアプリ情報そのものはまだサーバに残っているが、明示的に消す方法は現状存在しない
|
// クライアントアプリ情報そのものはまだサーバに残っているが、明示的に消す方法は現状存在しない
|
||||||
// client credential だけは消せる
|
// client credential だけは消せる
|
||||||
api.revokeClientCredential(
|
api.revokeClientCredential(
|
||||||
apiHost = apiHost,
|
apiHost = apiHost,
|
||||||
clientId = clientInfo.string("client_id")
|
clientId = clientInfo.string("client_id")
|
||||||
?: error("revokeClientCredential: missing client_id"),
|
?: error("revokeClientCredential: missing client_id"),
|
||||||
clientSecret = clientInfo.string("client_secret")
|
clientSecret = clientInfo.string("client_secret")
|
||||||
?: error("revokeClientCredential: missing client_secret"),
|
?: error("revokeClientCredential: missing client_secret"),
|
||||||
clientCredential = clientCredential,
|
clientCredential = clientCredential,
|
||||||
)
|
)
|
||||||
} catch (ex: Throwable) {
|
}
|
||||||
// クライアント情報の削除処理はエラーが起きても無視する
|
|
||||||
log.w(ex, "can't delete client information.")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (ex: Throwable) {
|
||||||
|
// クライアント再利用チェックやクライアント情報の削除処理はエラーが起きても無視する
|
||||||
|
log.w(ex, "can't verify/delete client information.")
|
||||||
}
|
}
|
||||||
|
|
||||||
clientInfo = api.registerClient(apiHost, scopeString, clientName, callbackUrl).apply {
|
clientInfo = api.registerClient(apiHost, scopeString, clientName, callbackUrl).apply {
|
||||||
|
@ -156,7 +158,7 @@ class AuthMastodon(override val client: TootApiClient) : AuthBase() {
|
||||||
put(KEY_AUTH_VERSION, AUTH_VERSION)
|
put(KEY_AUTH_VERSION, AUTH_VERSION)
|
||||||
put(KEY_CLIENT_SCOPE, scopeString)
|
put(KEY_CLIENT_SCOPE, scopeString)
|
||||||
}
|
}
|
||||||
if(DEBUG_AUTH) log.i("DEBUG_AUTH client_id=${clientInfo.string("client_id")}")
|
if (DEBUG_AUTH) log.i("DEBUG_AUTH client_id=${clientInfo.string("client_id")}")
|
||||||
// client credentialを取得して保存する
|
// client credentialを取得して保存する
|
||||||
// この時点ではまだ client credential がないので、必ず更新と保存が行われる
|
// この時点ではまだ client credential がないので、必ず更新と保存が行われる
|
||||||
prepareClientCredential(apiHost, clientInfo, clientName)
|
prepareClientCredential(apiHost, clientInfo, clientName)
|
||||||
|
@ -295,7 +297,7 @@ class AuthMastodon(override val client: TootApiClient) : AuthBase() {
|
||||||
|
|
||||||
val accessToken = tokenInfo.string("access_token")
|
val accessToken = tokenInfo.string("access_token")
|
||||||
?.notEmpty() ?: error("can't parse access token.")
|
?.notEmpty() ?: error("can't parse access token.")
|
||||||
if(DEBUG_AUTH) log.i("DEBUG_AUTH accessToken=${accessToken}")
|
if (DEBUG_AUTH) log.i("DEBUG_AUTH accessToken=${accessToken}")
|
||||||
|
|
||||||
val accountJson = verifyAccount(
|
val accountJson = verifyAccount(
|
||||||
accessToken = accessToken,
|
accessToken = accessToken,
|
||||||
|
|
|
@ -204,7 +204,6 @@ private class EmojiPicker(
|
||||||
}
|
}
|
||||||
|
|
||||||
private inner class VhCategory(
|
private inner class VhCategory(
|
||||||
parent: ViewGroup,
|
|
||||||
view: FrameLayout = FrameLayout(activity),
|
view: FrameLayout = FrameLayout(activity),
|
||||||
) : ViewHolderBase(view) {
|
) : ViewHolderBase(view) {
|
||||||
var lastItem: PickerItemCategory? = null
|
var lastItem: PickerItemCategory? = null
|
||||||
|
@ -212,12 +211,15 @@ private class EmojiPicker(
|
||||||
val tv = AppCompatTextView(activity).apply {
|
val tv = AppCompatTextView(activity).apply {
|
||||||
layoutParams = FrameLayout.LayoutParams(matchParent, wrapContent)
|
layoutParams = FrameLayout.LayoutParams(matchParent, wrapContent)
|
||||||
minHeightCompat = (density * 48f + 0.5f).toInt()
|
minHeightCompat = (density * 48f + 0.5f).toInt()
|
||||||
gravity = Gravity.START or Gravity.CENTER_VERTICAL
|
|
||||||
includeFontPadding = false
|
|
||||||
background = ContextCompat.getDrawable(
|
background = ContextCompat.getDrawable(
|
||||||
this@EmojiPicker.activity,
|
this@EmojiPicker.activity,
|
||||||
R.drawable.btn_bg_transparent_round6dp
|
R.drawable.btn_bg_transparent_round6dp
|
||||||
)
|
)
|
||||||
|
gravity = Gravity.START or Gravity.CENTER_VERTICAL
|
||||||
|
includeFontPadding = false
|
||||||
|
val paddingH = (density * 4f + 0.5f).toInt()
|
||||||
|
val paddingV = (density * 2f + 0.5f).toInt()
|
||||||
|
setPadding(paddingH,paddingV,paddingH,paddingV)
|
||||||
compoundDrawablePadding = (density * 4f + 0.5f).toInt()
|
compoundDrawablePadding = (density * 4f + 0.5f).toInt()
|
||||||
|
|
||||||
setOnClickListener {
|
setOnClickListener {
|
||||||
|
@ -401,7 +403,7 @@ private class EmojiPicker(
|
||||||
|
|
||||||
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int) =
|
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int) =
|
||||||
when (viewType) {
|
when (viewType) {
|
||||||
VT_CATEGORY -> VhCategory(viewGroup)
|
VT_CATEGORY -> VhCategory()
|
||||||
VT_CUSTOM_EMOJI -> VhCustomEmoji()
|
VT_CUSTOM_EMOJI -> VhCustomEmoji()
|
||||||
VT_TWEMOJI -> VhTwemoji()
|
VT_TWEMOJI -> VhTwemoji()
|
||||||
VT_COMPAT_EMOJI -> VhAppCompatEmoji()
|
VT_COMPAT_EMOJI -> VhAppCompatEmoji()
|
||||||
|
|
Loading…
Reference in New Issue