refactor(backend): replace punyHost with new URL().host

This commit is contained in:
Kagami Sascha Rosylight 2024-12-21 19:51:16 +01:00
parent f123be38b9
commit 41548fc0bd
5 changed files with 14 additions and 21 deletions

View file

@ -36,7 +36,7 @@ export class UtilityService {
@bindThis @bindThis
public isUriLocal(uri: string): boolean { public isUriLocal(uri: string): boolean {
return this.punyHost(uri) === this.toPuny(this.config.host); return new URL(uri).host === this.toPuny(this.config.host);
} }
@bindThis @bindThis
@ -115,13 +115,6 @@ export class UtilityService {
return toASCII(host.toLowerCase()); return toASCII(host.toLowerCase());
} }
@bindThis
public punyHost(url: string): string {
const urlObj = new URL(url);
const host = `${this.toPuny(urlObj.hostname)}${urlObj.port.length > 0 ? ':' + urlObj.port : ''}`;
return host;
}
@bindThis @bindThis
public isFederationAllowedHost(host: string): boolean { public isFederationAllowedHost(host: string): boolean {
if (this.meta.federation === 'none') return false; if (this.meta.federation === 'none') return false;

View file

@ -242,7 +242,7 @@ export class ApRequestService {
const alternate = document.querySelector('head > link[rel="alternate"][type="application/activity+json"]'); const alternate = document.querySelector('head > link[rel="alternate"][type="application/activity+json"]');
if (alternate) { if (alternate) {
const href = alternate.getAttribute('href'); const href = alternate.getAttribute('href');
if (href && this.utilityService.punyHost(url) === this.utilityService.punyHost(href)) { if (href && new URL(url).host === new URL(href).host) {
return await this.signedGet(href, user, false); return await this.signedGet(href, user, false);
} }
} }

View file

@ -127,7 +127,7 @@ export class Resolver {
throw new IdentifiableError('ad2dc287-75c1-44c4-839d-3d2e64576675', 'invalid AP object: missing id'); throw new IdentifiableError('ad2dc287-75c1-44c4-839d-3d2e64576675', 'invalid AP object: missing id');
} }
if (this.utilityService.punyHost(object.id) !== this.utilityService.punyHost(value)) { if (new URL(object.id).host !== new URL(value).host) {
throw new IdentifiableError('fd93c2fa-69a8-440f-880b-bf178e0ec877', `invalid AP object ${value}: id ${object.id} has different host`); throw new IdentifiableError('fd93c2fa-69a8-440f-880b-bf178e0ec877', `invalid AP object ${value}: id ${object.id} has different host`);
} }

View file

@ -159,7 +159,7 @@ export class ApNoteService {
throw new Error('unexpected schema of note url: ' + url); throw new Error('unexpected schema of note url: ' + url);
} }
if (this.utilityService.punyHost(url) !== this.utilityService.punyHost(note.id)) { if (new URL(url).host !== new URL(note.id).host) {
throw new Error(`note url & uri host mismatch: note url: ${url}, note uri: ${note.id}`); throw new Error(`note url & uri host mismatch: note url: ${url}, note uri: ${note.id}`);
} }
} }

View file

@ -136,7 +136,7 @@ export class ApPersonService implements OnModuleInit {
*/ */
@bindThis @bindThis
private validateActor(x: IObject, uri: string): IActor { private validateActor(x: IObject, uri: string): IActor {
const expectHost = this.utilityService.punyHost(uri); const expectHost = new URL(uri).host;
if (!isActor(x)) { if (!isActor(x)) {
throw new Error(`invalid Actor type '${x.type}'`); throw new Error(`invalid Actor type '${x.type}'`);
@ -150,14 +150,14 @@ export class ApPersonService implements OnModuleInit {
throw new Error('invalid Actor: wrong inbox'); throw new Error('invalid Actor: wrong inbox');
} }
if (this.utilityService.punyHost(x.inbox) !== expectHost) { if (new URL(x.inbox).host !== expectHost) {
throw new Error('invalid Actor: inbox has different host'); throw new Error('invalid Actor: inbox has different host');
} }
const sharedInboxObject = x.sharedInbox ?? (x.endpoints ? x.endpoints.sharedInbox : undefined); const sharedInboxObject = x.sharedInbox ?? (x.endpoints ? x.endpoints.sharedInbox : undefined);
if (sharedInboxObject != null) { if (sharedInboxObject != null) {
const sharedInbox = getApId(sharedInboxObject); const sharedInbox = getApId(sharedInboxObject);
if (!(typeof sharedInbox === 'string' && sharedInbox.length > 0 && this.utilityService.punyHost(sharedInbox) === expectHost)) { if (!(typeof sharedInbox === 'string' && sharedInbox.length > 0 && new URL(sharedInbox).host === expectHost)) {
throw new Error('invalid Actor: wrong shared inbox'); throw new Error('invalid Actor: wrong shared inbox');
} }
} }
@ -167,7 +167,7 @@ export class ApPersonService implements OnModuleInit {
if (xCollection != null) { if (xCollection != null) {
const collectionUri = getApId(xCollection); const collectionUri = getApId(xCollection);
if (typeof collectionUri === 'string' && collectionUri.length > 0) { if (typeof collectionUri === 'string' && collectionUri.length > 0) {
if (this.utilityService.punyHost(collectionUri) !== expectHost) { if (new URL(collectionUri).host !== expectHost) {
throw new Error(`invalid Actor: ${collection} has different host`); throw new Error(`invalid Actor: ${collection} has different host`);
} }
} else if (collectionUri != null) { } else if (collectionUri != null) {
@ -199,7 +199,7 @@ export class ApPersonService implements OnModuleInit {
x.summary = truncate(x.summary, summaryLength); x.summary = truncate(x.summary, summaryLength);
} }
const idHost = this.utilityService.punyHost(x.id); const idHost = new URL(x.id).host;
if (idHost !== expectHost) { if (idHost !== expectHost) {
throw new Error('invalid Actor: id has different host'); throw new Error('invalid Actor: id has different host');
} }
@ -209,7 +209,7 @@ export class ApPersonService implements OnModuleInit {
throw new Error('invalid Actor: publicKey.id is not a string'); throw new Error('invalid Actor: publicKey.id is not a string');
} }
const publicKeyIdHost = this.utilityService.punyHost(x.publicKey.id); const publicKeyIdHost = new URL(x.publicKey.id).host;
if (publicKeyIdHost !== expectHost) { if (publicKeyIdHost !== expectHost) {
throw new Error('invalid Actor: publicKey.id has different host'); throw new Error('invalid Actor: publicKey.id has different host');
} }
@ -257,7 +257,7 @@ export class ApPersonService implements OnModuleInit {
if (Array.isArray(img)) { if (Array.isArray(img)) {
img = img.find(item => item && item.url) ?? null; img = img.find(item => item && item.url) ?? null;
} }
// if we have an explicitly missing image, return an // if we have an explicitly missing image, return an
// explicitly-null set of values // explicitly-null set of values
if ((img == null) || (typeof img === 'object' && img.url == null)) { if ((img == null) || (typeof img === 'object' && img.url == null)) {
@ -300,7 +300,7 @@ export class ApPersonService implements OnModuleInit {
public async createPerson(uri: string, resolver?: Resolver): Promise<MiRemoteUser> { public async createPerson(uri: string, resolver?: Resolver): Promise<MiRemoteUser> {
if (typeof uri !== 'string') throw new Error('uri is not string'); if (typeof uri !== 'string') throw new Error('uri is not string');
const host = this.utilityService.punyHost(uri); const host = new URL(uri).host;
if (host === this.utilityService.toPuny(this.config.host)) { if (host === this.utilityService.toPuny(this.config.host)) {
throw new StatusError('cannot resolve local user', 400, 'cannot resolve local user'); throw new StatusError('cannot resolve local user', 400, 'cannot resolve local user');
} }
@ -349,7 +349,7 @@ export class ApPersonService implements OnModuleInit {
throw new Error('unexpected schema of person url: ' + url); throw new Error('unexpected schema of person url: ' + url);
} }
if (this.utilityService.punyHost(url) !== this.utilityService.punyHost(person.id)) { if (new URL(url).host !== new URL(person.id).host) {
throw new Error(`person url <> uri host mismatch: ${url} <> ${person.id}`); throw new Error(`person url <> uri host mismatch: ${url} <> ${person.id}`);
} }
} }
@ -552,7 +552,7 @@ export class ApPersonService implements OnModuleInit {
throw new Error('unexpected schema of person url: ' + url); throw new Error('unexpected schema of person url: ' + url);
} }
if (this.utilityService.punyHost(url) !== this.utilityService.punyHost(person.id)) { if (new URL(url).host !== new URL(person.id).host) {
throw new Error(`person url <> uri host mismatch: ${url} <> ${person.id}`); throw new Error(`person url <> uri host mismatch: ${url} <> ${person.id}`);
} }
} }