Skip to content

Commit

Permalink
Merge pull request #461 from WalletConnect/test-respond-error
Browse files Browse the repository at this point in the history
[Auth] Test respond error
  • Loading branch information
llbartekll authored Aug 24, 2022
2 parents d577fb9 + da03606 commit c97545a
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 17 deletions.
23 changes: 21 additions & 2 deletions Example/IntegrationTests/Auth/AuthTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ final class AuthTests: XCTestCase {
Task(priority: .high) {
let signature = try! MessageSigner().sign(message: message, privateKey: prvKey)
let cacaoSignature = CacaoSignature(t: "eip191", s: signature)
try! await wallet.respond(requestId: id, result: .success(cacaoSignature))
try! await wallet.respond(requestId: id, signature: cacaoSignature)
}
}
.store(in: &publishers)
Expand All @@ -81,6 +81,25 @@ final class AuthTests: XCTestCase {
wait(for: [responseExpectation], timeout: 5)
}

func testUserRespondError() async {
let responseExpectation = expectation(description: "error response delivered")
let uri = try! await app.request(RequestParams.stub())
try! await wallet.pair(uri: uri)
wallet.authRequestPublisher.sink { [unowned self] (id, message) in
Task(priority: .high) {
try! await wallet.reject(requestId: id)
}
}
.store(in: &publishers)
app.authResponsePublisher.sink { (id, result) in
guard case .failure(let error) = result else { XCTFail(); return }
XCTAssertEqual(error, .userRejeted)
responseExpectation.fulfill()
}
.store(in: &publishers)
wait(for: [responseExpectation], timeout: 5)
}

func testRespondSignatureVerificationFailed() async {
let responseExpectation = expectation(description: "invalid signature response delivered")
let uri = try! await app.request(RequestParams.stub())
Expand All @@ -89,7 +108,7 @@ final class AuthTests: XCTestCase {
Task(priority: .high) {
let invalidSignature = "438effc459956b57fcd9f3dac6c675f9cee88abf21acab7305e8e32aa0303a883b06dcbd956279a7a2ca21ffa882ff55cc22e8ab8ec0f3fe90ab45f306938cfa1b"
let cacaoSignature = CacaoSignature(t: "eip191", s: invalidSignature)
try! await wallet.respond(requestId: id, result: .success(cacaoSignature))
try! await wallet.respond(requestId: id, signature: cacaoSignature)
}
}
.store(in: &publishers)
Expand Down
9 changes: 7 additions & 2 deletions Sources/Auth/AuthClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import WalletConnectUtils
import WalletConnectPairing
import WalletConnectRelay


public class AuthClient {
enum Errors: Error {
case malformedPairingURI
Expand Down Expand Up @@ -87,9 +88,13 @@ public class AuthClient {
try await appRequestService.request(params: params, topic: topic)
}

public func respond(requestId: RPCID, result: Result<CacaoSignature, Never>) async throws {
public func respond(requestId: RPCID, signature: CacaoSignature) async throws {
guard let account = account else { throw Errors.unknownWalletAddress }
try await walletRespondService.respond(requestId: requestId, result: result, account: account)
try await walletRespondService.respond(requestId: requestId, signature: signature, account: account)
}

public func reject(requestId: RPCID) async throws {
try await walletRespondService.respondError(requestId: requestId)
}

public func getPendingRequests() throws -> [AuthRequest] {
Expand Down
11 changes: 9 additions & 2 deletions Sources/Auth/Services/App/AppRespondSubscriber.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,23 @@ class AppRespondSubscriber {

private func subscribeForResponse() {
networkingInteractor.responsePublisher.sink { [unowned self] subscriptionPayload in
let response = subscriptionPayload.response
guard
let requestId = subscriptionPayload.response.id,
let requestId = response.id,
let request = rpcHistory.get(recordId: requestId)?.request,
let requestParams = request.params, request.method == "wc_authRequest"
else { return }

networkingInteractor.unsubscribe(topic: subscriptionPayload.topic)

if let errorResponse = response.error,
let error = AuthError(code: errorResponse.code) {
onResponse?(requestId, .failure(error))
return
}

guard
let cacao = try? subscriptionPayload.response.result?.get(Cacao.self),
let cacao = try? response.result?.get(Cacao.self),
let address = try? DIDPKH(iss: cacao.payload.iss).account.address,
let message = try? messageFormatter.formatMessage(from: cacao.payload)
else { self.onResponse?(requestId, .failure(.malformedResponseParams)); return }
Expand Down
13 changes: 2 additions & 11 deletions Sources/Auth/Services/Wallet/WalletRespondService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,7 @@ actor WalletRespondService {
self.rpcHistory = rpcHistory
}

func respond(requestId: RPCID, result: Result<CacaoSignature, Never>, account: Account) async throws {
switch result {
case .success(let signature):
try await respond(requestId: requestId, signature: signature, account: account)
case .failure:
try await respondError(requestId: requestId)
}
}

private func respond(requestId: RPCID, signature: CacaoSignature, account: Account) async throws {
func respond(requestId: RPCID, signature: CacaoSignature, account: Account) async throws {
let authRequestParams = try getAuthRequestParams(requestId: requestId)
let (topic, keys) = try generateAgreementKeys(requestParams: authRequestParams)

Expand All @@ -44,7 +35,7 @@ actor WalletRespondService {
try await networkingInteractor.respond(topic: topic, response: response, tag: AuthResponseParams.tag, envelopeType: .type1(pubKey: keys.publicKey.rawRepresentation))
}

private func respondError(requestId: RPCID) async throws {
func respondError(requestId: RPCID) async throws {
let authRequestParams = try getAuthRequestParams(requestId: requestId)
let (topic, keys) = try generateAgreementKeys(requestParams: authRequestParams)

Expand Down
17 changes: 17 additions & 0 deletions Sources/Auth/Types/Errors/AuthError.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,23 @@ public enum AuthError: Codable, Equatable, Error {

extension AuthError: Reason {

init?(code: Int) {
switch code {
case Self.userRejeted.code:
self = .userRejeted
case Self.malformedResponseParams.code:
self = .malformedResponseParams
case Self.malformedRequestParams.code:
self = .malformedRequestParams
case Self.messageCompromised.code:
self = .messageCompromised
case Self.signatureVerificationFailed.code:
self = .signatureVerificationFailed
default:
return nil
}
}

public var code: Int {
switch self {
case .userRejeted:
Expand Down

0 comments on commit c97545a

Please sign in to comment.