From 3a2cf29b0f1405004f86e47d244eb231f5b45b81 Mon Sep 17 00:00:00 2001 From: Alex Forshtat Date: Thu, 16 Mar 2023 20:48:42 +0400 Subject: [PATCH] OG-1021: Missing trailing '/' in URLs breaks relay URLs with paths (#957) --- packages/common/src/HttpClient.ts | 9 +++++---- packages/common/src/Utils.ts | 8 ++++++++ packages/provider/src/VerifierUtils.ts | 4 ++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/packages/common/src/HttpClient.ts b/packages/common/src/HttpClient.ts index 7f9a647dd..798e6acb5 100644 --- a/packages/common/src/HttpClient.ts +++ b/packages/common/src/HttpClient.ts @@ -8,6 +8,7 @@ import { RelayTransactionRequest } from './types/RelayTransactionRequest' import { AuditRequest, AuditResponse } from './types/AuditRequest' import { ConfigResponse } from './ConfigResponse' import { Address, ObjectMap } from './types/Aliases' +import { appendSlashTrim } from './Utils' export class HttpClient { private readonly httpWrapper: HttpWrapper @@ -19,7 +20,7 @@ export class HttpClient { } async getPingResponse (relayUrl: string, paymaster?: string): Promise { - const url = new URL('getaddr', relayUrl.trim()) + const url = new URL('getaddr', appendSlashTrim(relayUrl)) if (paymaster != null) { url.searchParams.set('paymaster', paymaster) } @@ -32,7 +33,7 @@ export class HttpClient { } async relayTransaction (relayUrl: string, request: RelayTransactionRequest): Promise<{ signedTx: PrefixedHexString, nonceGapFilled: ObjectMap }> { - const url = new URL('relay', relayUrl.trim()) + const url = new URL('relay', appendSlashTrim(relayUrl)) const { signedTx, nonceGapFilled, @@ -49,7 +50,7 @@ export class HttpClient { } async auditTransaction (relayUrl: string, signedTx: PrefixedHexString): Promise { - const url = new URL('audit', relayUrl.trim()) + const url = new URL('audit', appendSlashTrim(relayUrl)) const auditRequest: AuditRequest = { signedTx } const auditResponse: AuditResponse = await this.httpWrapper.sendPromise(url, auditRequest) this.logger.info(`auditTransaction response: ${JSON.stringify(auditResponse)}`) @@ -63,7 +64,7 @@ export class HttpClient { } async getVerifyingPaymasterAddress (verifierServerUrl: string, chainId: number): Promise
{ - const url = new URL('getPaymasterAddress', verifierServerUrl.trim()) + const url = new URL('getPaymasterAddress', appendSlashTrim(verifierServerUrl)) url.searchParams.set('chainId', chainId.toString()) const { paymasterAddress } = await this.httpWrapper.sendPromise(url) this.logger.info(`VerifyingPaymaster address: ${JSON.stringify(paymasterAddress)}`) diff --git a/packages/common/src/Utils.ts b/packages/common/src/Utils.ts index ce362fcd9..9f8027d78 100644 --- a/packages/common/src/Utils.ts +++ b/packages/common/src/Utils.ts @@ -539,3 +539,11 @@ export function wrapWeb3JsProvider (provider: any): JsonRpcProvider { } return provider } + +export function appendSlashTrim (urlInput: string): string { + urlInput = urlInput.trim() + if (urlInput[urlInput.length - 1] !== '/') { + urlInput += '/' + } + return urlInput +} diff --git a/packages/provider/src/VerifierUtils.ts b/packages/provider/src/VerifierUtils.ts index 7ca746f7f..1597894c7 100644 --- a/packages/provider/src/VerifierUtils.ts +++ b/packages/provider/src/VerifierUtils.ts @@ -1,5 +1,5 @@ import { PrefixedHexString } from 'ethereumjs-util' -import { ApprovalDataCallback, HttpWrapper, LoggerInterface, RelayRequest } from '@opengsn/common' +import { ApprovalDataCallback, HttpWrapper, LoggerInterface, RelayRequest, appendSlashTrim } from '@opengsn/common' // TODO: replace with production URL before release export const DEFAULT_VERIFIER_SERVER_URL = 'https://staging-api.opengsn.org' @@ -32,7 +32,7 @@ export function createVerifierApprovalDataCallback ( relayRequest, relayRequestId } - const signRelayRequestResponse = await httpWrapper.sendPromise(new URL('signRelayRequest', verifierUrl), approvalRequest) + const signRelayRequestResponse = await httpWrapper.sendPromise(new URL('signRelayRequest', appendSlashTrim(verifierUrl)), approvalRequest) logger.info(`signRelayRequest response: ${JSON.stringify(signRelayRequestResponse)}`) return signRelayRequestResponse.signature }