Skip to content

Commit

Permalink
Add ability to revoke installations (#391)
Browse files Browse the repository at this point in the history
* add revokaction ability and inbox state

* write a test for it

* get the test passing

* update the resolved
  • Loading branch information
nplasterer authored Aug 21, 2024
1 parent 0896eea commit 2b3e409
Show file tree
Hide file tree
Showing 6 changed files with 98 additions and 5 deletions.
2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ let package = Package(
.package(url: "https://github.com/1024jp/GzipSwift", from: "5.2.0"),
.package(url: "https://github.com/bufbuild/connect-swift", exact: "0.12.0"),
.package(url: "https://github.com/apple/swift-docc-plugin.git", from: "1.0.0"),
.package(url: "https://github.com/xmtp/libxmtp-swift.git", exact: "0.5.7-beta4"),
.package(url: "https://github.com/xmtp/libxmtp-swift.git", exact: "0.5.8-beta0"),
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
Expand Down
22 changes: 22 additions & 0 deletions Sources/XMTPiOS/Client.swift
Original file line number Diff line number Diff line change
Expand Up @@ -603,4 +603,26 @@ public final class Client {
}
try await client.requestHistorySync()
}

public func revokeAllOtherInstallations(signingKey: SigningKey) async throws {
guard let client = v3Client else {
throw ClientError.noV3Client("Error: No V3 client initialized")
}

let signatureRequest = try await client.revokeAllOtherInstallations()
do {
let signedData = try await signingKey.sign(message: signatureRequest.signatureText())
try await signatureRequest.addEcdsaSignature(signatureBytes: signedData.rawData)
try await client.applySignatureRequest(signatureRequest: signatureRequest)
} catch {
throw ClientError.creationError("Failed to sign the message: \(error.localizedDescription)")
}
}

public func inboxState(refreshFromNetwork: Bool) async throws -> InboxState {
guard let client = v3Client else {
throw ClientError.noV3Client("Error: No V3 client initialized")
}
return InboxState(ffiInboxState: try await client.inboxState(refreshFromNetwork: refreshFromNetwork))
}
}
34 changes: 34 additions & 0 deletions Sources/XMTPiOS/Mls/InboxState.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
//
// InboxState.swift
//
//
// Created by Naomi Plasterer on 8/21/24.
//

import Foundation
import LibXMTP

public struct InboxState {
var ffiInboxState: FfiInboxState

init(ffiInboxState: FfiInboxState) {
self.ffiInboxState = ffiInboxState
}

public var inboxId: String {
ffiInboxState.inboxId
}

public var addresses: [String] {
ffiInboxState.accountAddresses
}

public var installationIds: [String] {
ffiInboxState.installationIds.map { $0.toHex }
}

public var recoveryAddress: String {
ffiInboxState.recoveryAddress
}

}
37 changes: 37 additions & 0 deletions Tests/XMTPTests/ClientTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -455,4 +455,41 @@ class ClientTests: XCTestCase {

XCTAssertEqual(inboxId, alixClient.inboxID)
}

func testRevokesAllOtherInstallations() async throws {
let key = try Crypto.secureRandomBytes(count: 32)
let alix = try PrivateKey.generate()
let options = ClientOptions.init(
api: .init(env: .local, isSecure: false),
enableV3: true,
encryptionKey: key
)

let alixClient = try await Client.create(
account: alix,
options: options
)
try alixClient.dropLocalDatabaseConnection()
try alixClient.deleteLocalDatabase()

let alixClient2 = try await Client.create(
account: alix,
options: options
)
try alixClient2.dropLocalDatabaseConnection()
try alixClient2.deleteLocalDatabase()

let alixClient3 = try await Client.create(
account: alix,
options: options
)

let state = try await alixClient3.inboxState(refreshFromNetwork: true)
XCTAssertEqual(state.installationIds.count, 3)

try await alixClient3.revokeAllOtherInstallations(signingKey: alix)

let newState = try await alixClient3.inboxState(refreshFromNetwork: true)
XCTAssertEqual(newState.installationIds.count, 1)
}
}
4 changes: 2 additions & 2 deletions XMTP.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ Pod::Spec.new do |spec|
#

spec.name = "XMTP"
spec.version = "0.14.7"
spec.version = "0.14.8"
spec.summary = "XMTP SDK Cocoapod"

# This description is used to generate tags and improve search results.
Expand Down Expand Up @@ -44,5 +44,5 @@ Pod::Spec.new do |spec|
spec.dependency "web3.swift"
spec.dependency "GzipSwift"
spec.dependency "Connect-Swift", "= 0.12.0"
spec.dependency 'LibXMTP', '= 0.5.7-beta4'
spec.dependency 'LibXMTP', '= 0.5.8-beta0'
end
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/xmtp/libxmtp-swift.git",
"state" : {
"revision" : "39a3bfd39adc93cf3207946ab302a3579014f369",
"version" : "0.5.7-beta4"
"revision" : "5ff057ed6ab42ba8cdc9cb9c107dddfc5fb4746b",
"version" : "0.5.8-beta0"
}
},
{
Expand Down

0 comments on commit 2b3e409

Please sign in to comment.