Revoke token and destroy stores when logging out
This commit is contained in:
parent
8bd6f53f01
commit
0e1cbce10d
|
@ -155,6 +155,27 @@ public class Client {
|
|||
}
|
||||
}
|
||||
|
||||
public func revokeAccessToken() async throws {
|
||||
guard let accessToken else {
|
||||
return
|
||||
}
|
||||
let request = Request<Empty>(method: .post, path: "/oauth/revoke", body: ParametersBody([
|
||||
"token" => accessToken,
|
||||
"client_id" => clientID!,
|
||||
"client_secret" => clientSecret!,
|
||||
]))
|
||||
return try await withCheckedThrowingContinuation({ continuation in
|
||||
self.run(request) { response in
|
||||
switch response {
|
||||
case .failure(let error):
|
||||
continuation.resume(throwing: error)
|
||||
case .success(_, _):
|
||||
continuation.resume()
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
public func nodeInfo(completion: @escaping Callback<NodeInfo>) {
|
||||
let wellKnown = Request<WellKnown>(method: .get, path: "/.well-known/nodeinfo")
|
||||
run(wellKnown) { result in
|
||||
|
|
|
@ -326,6 +326,7 @@
|
|||
D6DD2A45273D6C5700386A6C /* GIFImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6DD2A44273D6C5700386A6C /* GIFImageView.swift */; };
|
||||
D6DD353D22F28CD000A9563A /* ContentWarningCopyMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6DD353C22F28CD000A9563A /* ContentWarningCopyMode.swift */; };
|
||||
D6DD353F22F502EC00A9563A /* Preferences+Notification.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6DD353E22F502EC00A9563A /* Preferences+Notification.swift */; };
|
||||
D6DD8FFD298495A8002AD3FD /* LogoutService.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6DD8FFC298495A8002AD3FD /* LogoutService.swift */; };
|
||||
D6DF95C12533F5DE0027A9B6 /* RelationshipMO.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6DF95C02533F5DE0027A9B6 /* RelationshipMO.swift */; };
|
||||
D6DFC69E242C490400ACC392 /* TrackpadScrollGestureRecognizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6DFC69D242C490400ACC392 /* TrackpadScrollGestureRecognizer.swift */; };
|
||||
D6DFC6A0242C4CCC00ACC392 /* Weak.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6DFC69F242C4CCC00ACC392 /* Weak.swift */; };
|
||||
|
@ -738,6 +739,7 @@
|
|||
D6DD2A44273D6C5700386A6C /* GIFImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GIFImageView.swift; sourceTree = "<group>"; };
|
||||
D6DD353C22F28CD000A9563A /* ContentWarningCopyMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentWarningCopyMode.swift; sourceTree = "<group>"; };
|
||||
D6DD353E22F502EC00A9563A /* Preferences+Notification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Preferences+Notification.swift"; sourceTree = "<group>"; };
|
||||
D6DD8FFC298495A8002AD3FD /* LogoutService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogoutService.swift; sourceTree = "<group>"; };
|
||||
D6DF95C02533F5DE0027A9B6 /* RelationshipMO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelationshipMO.swift; sourceTree = "<group>"; };
|
||||
D6DFC69D242C490400ACC392 /* TrackpadScrollGestureRecognizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackpadScrollGestureRecognizer.swift; sourceTree = "<group>"; };
|
||||
D6DFC69F242C4CCC00ACC392 /* Weak.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Weak.swift; sourceTree = "<group>"; };
|
||||
|
@ -1664,6 +1666,7 @@
|
|||
D61F75B4293BD97400C0B37F /* DeleteFilterService.swift */,
|
||||
D65B4B6129771A3F00DABDFB /* FetchStatusService.swift */,
|
||||
D65B4B6529773AE600DABDFB /* DeleteStatusService.swift */,
|
||||
D6DD8FFC298495A8002AD3FD /* LogoutService.swift */,
|
||||
);
|
||||
path = API;
|
||||
sourceTree = "<group>";
|
||||
|
@ -1941,6 +1944,7 @@
|
|||
D6093FB725BE0CF3004811E6 /* TrendHistoryView.swift in Sources */,
|
||||
D6EBF01723C55E0D00AE061B /* UISceneSession+MastodonController.swift in Sources */,
|
||||
D61F759229365C6C00C0B37F /* CollectionViewController.swift in Sources */,
|
||||
D6DD8FFD298495A8002AD3FD /* LogoutService.swift in Sources */,
|
||||
04DACE8C212CB14B009840C4 /* MainTabBarViewController.swift in Sources */,
|
||||
D68E525D24A3E8F00054355A /* SearchViewController.swift in Sources */,
|
||||
D61F75BB293C183100C0B37F /* HTMLConverter.swift in Sources */,
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
//
|
||||
// LogoutService.swift
|
||||
// Tusker
|
||||
//
|
||||
// Created by Shadowfacts on 1/27/23.
|
||||
// Copyright © 2023 Shadowfacts. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
@MainActor
|
||||
class LogoutService {
|
||||
let accountInfo: LocalData.UserAccountInfo
|
||||
private let mastodonController: MastodonController
|
||||
|
||||
init(accountInfo: LocalData.UserAccountInfo) {
|
||||
self.accountInfo = accountInfo
|
||||
self.mastodonController = MastodonController.getForAccount(accountInfo)
|
||||
}
|
||||
|
||||
func run() {
|
||||
Task.detached {
|
||||
try? await self.mastodonController.client.revokeAccessToken()
|
||||
}
|
||||
MastodonController.removeForAccount(accountInfo)
|
||||
LocalData.shared.removeAccount(accountInfo)
|
||||
let psc = mastodonController.persistentContainer.persistentStoreCoordinator
|
||||
for store in psc.persistentStores {
|
||||
guard let url = store.url else {
|
||||
continue
|
||||
}
|
||||
try? psc.destroyPersistentStore(at: url, type: .sqlite)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -31,6 +31,10 @@ class MastodonController: ObservableObject {
|
|||
}
|
||||
}
|
||||
|
||||
static func removeForAccount(_ account: LocalData.UserAccountInfo) {
|
||||
all.removeValue(forKey: account)
|
||||
}
|
||||
|
||||
static func resetAll() {
|
||||
all = [:]
|
||||
}
|
||||
|
|
|
@ -214,7 +214,7 @@ class MainSceneDelegate: UIResponder, UIWindowSceneDelegate, TuskerSceneDelegate
|
|||
guard let account = window?.windowScene?.session.mastodonController?.accountInfo else {
|
||||
return
|
||||
}
|
||||
LocalData.shared.removeAccount(account)
|
||||
LogoutService(accountInfo: account).run()
|
||||
if LocalData.shared.onboardingComplete {
|
||||
activateAccount(LocalData.shared.accounts.first!, animated: false)
|
||||
} else {
|
||||
|
|
|
@ -85,7 +85,7 @@ class PreferencesNavigationController: UINavigationController {
|
|||
sceneDelegate.logoutCurrent()
|
||||
}
|
||||
} else {
|
||||
LocalData.shared.removeAccount(LocalData.shared.getMostRecentAccount()!)
|
||||
LogoutService(accountInfo: LocalData.shared.getMostRecentAccount()!).run()
|
||||
let accountID = LocalData.shared.getMostRecentAccount()?.id
|
||||
UIApplication.shared.requestSceneSessionActivation(nil, userActivity: UserActivityManager.mainSceneActivity(accountID: accountID), options: nil)
|
||||
UIApplication.shared.requestSceneSessionDestruction(windowScene.session, options: nil)
|
||||
|
|
|
@ -54,7 +54,7 @@ struct PreferencesView: View {
|
|||
indices.remove(index)
|
||||
}
|
||||
|
||||
indices.forEach { localData.removeAccount(localData.accounts[$0]) }
|
||||
indices.forEach { LogoutService(accountInfo: localData.accounts[$0]).run() }
|
||||
|
||||
if logoutFromCurrent {
|
||||
self.logoutPressed()
|
||||
|
|
Loading…
Reference in New Issue