From a79ade2efd3301ca0514dcdf522830241c6c8205 Mon Sep 17 00:00:00 2001 From: jliddev Date: Wed, 18 Nov 2020 11:36:32 -0600 Subject: [PATCH] Add per provider addon id validation --- .../src/app/addon-providers/addon-provider.ts | 1 + .../addon-providers/curse-addon-provider.ts | 4 +++ .../addon-providers/github-addon-provider.ts | 4 +++ .../addon-providers/tukui-addon-provider.ts | 4 +++ .../wow-interface-addon-provider.ts | 10 +++++-- .../addon-providers/wowup-addon-provider.ts | 4 +++ .../src/app/services/addons/addon.service.ts | 28 +++++++++++-------- 7 files changed, 41 insertions(+), 14 deletions(-) diff --git a/wowup-electron/src/app/addon-providers/addon-provider.ts b/wowup-electron/src/app/addon-providers/addon-provider.ts index b8f60d22..5ed869f7 100644 --- a/wowup-electron/src/app/addon-providers/addon-provider.ts +++ b/wowup-electron/src/app/addon-providers/addon-provider.ts @@ -26,6 +26,7 @@ export interface AddonProvider { getById(addonId: string, clientType: WowClientType): Observable; isValidAddonUri(addonUri: URL): boolean; + isValidAddonId(addonId: string): boolean; onPostInstall(addon: Addon): void; diff --git a/wowup-electron/src/app/addon-providers/curse-addon-provider.ts b/wowup-electron/src/app/addon-providers/curse-addon-provider.ts index 5790a335..6c197ccc 100644 --- a/wowup-electron/src/app/addon-providers/curse-addon-provider.ts +++ b/wowup-electron/src/app/addon-providers/curse-addon-provider.ts @@ -342,6 +342,10 @@ export class CurseAddonProvider implements AddonProvider { return addonUri.host && addonUri.host.endsWith("curseforge.com") && addonUri.pathname.startsWith("/wow/addons"); } + isValidAddonId(addonId: string): boolean { + return !!addonId && !isNaN(parseInt(addonId, 10)); + } + onPostInstall(addon: Addon): void { throw new Error("Method not implemented."); } diff --git a/wowup-electron/src/app/addon-providers/github-addon-provider.ts b/wowup-electron/src/app/addon-providers/github-addon-provider.ts index 673492d8..503972d2 100644 --- a/wowup-electron/src/app/addon-providers/github-addon-provider.ts +++ b/wowup-electron/src/app/addon-providers/github-addon-provider.ts @@ -148,6 +148,10 @@ export class GitHubAddonProvider implements AddonProvider { return addonUri.host && addonUri.host.endsWith("github.com"); } + public isValidAddonId(addonId: string): boolean { + return addonId.indexOf("/") !== -1; + } + public onPostInstall(addon: Addon): void {} public async scan( diff --git a/wowup-electron/src/app/addon-providers/tukui-addon-provider.ts b/wowup-electron/src/app/addon-providers/tukui-addon-provider.ts index d675b6e3..1e0fdb70 100644 --- a/wowup-electron/src/app/addon-providers/tukui-addon-provider.ts +++ b/wowup-electron/src/app/addon-providers/tukui-addon-provider.ts @@ -108,6 +108,10 @@ export class TukUiAddonProvider implements AddonProvider { return false; } + isValidAddonId(addonId: string): boolean { + return !!addonId && !isNaN(parseInt(addonId, 10)); + } + onPostInstall(addon: Addon): void {} async scan( diff --git a/wowup-electron/src/app/addon-providers/wow-interface-addon-provider.ts b/wowup-electron/src/app/addon-providers/wow-interface-addon-provider.ts index 11c7b52d..36ab67b4 100644 --- a/wowup-electron/src/app/addon-providers/wow-interface-addon-provider.ts +++ b/wowup-electron/src/app/addon-providers/wow-interface-addon-provider.ts @@ -88,17 +88,21 @@ export class WowInterfaceAddonProvider implements AddonProvider { throw new Error("Method not implemented."); } - getById(addonId: string, clientType: WowClientType): Observable { + public getById(addonId: string, clientType: WowClientType): Observable { return from(this._circuitBreaker.fire(addonId)).pipe( map((result) => (result ? this.toAddonSearchResult(result, "") : undefined)) ); } - isValidAddonUri(addonUri: URL): boolean { + public isValidAddonUri(addonUri: URL): boolean { return addonUri.host && addonUri.host.endsWith("wowinterface.com"); } - onPostInstall(addon: Addon): void { + public isValidAddonId(addonId: string): boolean { + return !!addonId && !isNaN(parseInt(addonId, 10)); + } + + public onPostInstall(addon: Addon): void { throw new Error("Method not implemented."); } diff --git a/wowup-electron/src/app/addon-providers/wowup-addon-provider.ts b/wowup-electron/src/app/addon-providers/wowup-addon-provider.ts index e98e3275..8b91d74a 100644 --- a/wowup-electron/src/app/addon-providers/wowup-addon-provider.ts +++ b/wowup-electron/src/app/addon-providers/wowup-addon-provider.ts @@ -67,6 +67,10 @@ export class WowUpAddonProvider implements AddonProvider { return false; } + isValidAddonId(addonId: string): boolean { + return true; + } + onPostInstall(addon: Addon): void { throw new Error("Method not implemented."); } diff --git a/wowup-electron/src/app/services/addons/addon.service.ts b/wowup-electron/src/app/services/addons/addon.service.ts index 4a7373c3..a67e2983 100644 --- a/wowup-electron/src/app/services/addons/addon.service.ts +++ b/wowup-electron/src/app/services/addons/addon.service.ts @@ -217,7 +217,7 @@ export class AddonService { addonId, onUpdate, completion, - originalAddon: originalAddon ? { ...originalAddon } : undefined + originalAddon: originalAddon ? { ...originalAddon } : undefined, }); return promise; @@ -306,8 +306,9 @@ export class AddonService { this._addonStorage.set(addon.id, addon); - const actionLabel = `${getEnumName(WowClientType, addon.clientType)}|${addon.providerName}|${addon.externalId}|${addon.name - }`; + const actionLabel = `${getEnumName(WowClientType, addon.clientType)}|${addon.providerName}|${addon.externalId}|${ + addon.name + }`; this._analyticsService.trackAction("install-addon", { clientType: getEnumName(WowClientType, addon.clientType), provider: addon.providerName, @@ -647,21 +648,21 @@ export class AddonService { } const externalIds: AddonExternalId[] = []; - if (toc.wowInterfaceId) { + if (this.getProvider(ADDON_PROVIDER_WOWINTERFACE).isValidAddonId(toc.wowInterfaceId)) { externalIds.push({ id: toc.wowInterfaceId, providerName: ADDON_PROVIDER_WOWINTERFACE, }); } - if (toc.tukUiProjectId) { + if (this.getProvider(ADDON_PROVIDER_TUKUI).isValidAddonId(toc.tukUiProjectId)) { externalIds.push({ id: toc.tukUiProjectId, providerName: ADDON_PROVIDER_TUKUI, }); } - if (toc.curseProjectId) { + if (this.getProvider(ADDON_PROVIDER_CURSEFORGE).isValidAddonId(toc.curseProjectId)) { externalIds.push({ id: toc.curseProjectId, providerName: ADDON_PROVIDER_CURSEFORGE, @@ -672,7 +673,7 @@ export class AddonService { if (!this.containsOwnExternalId(addon, externalIds)) { externalIds.push({ id: addon.externalId, - providerName: addon.providerName + providerName: addon.providerName, }); } @@ -701,14 +702,19 @@ export class AddonService { return; } - oldAddon.externalIds.forEach(oldExtId => { - const match = newAddon.externalIds.find(newExtId => newExtId.id === oldExtId.id && newExtId.providerName === oldExtId.providerName); + oldAddon.externalIds.forEach((oldExtId) => { + const match = newAddon.externalIds.find( + (newExtId) => newExtId.id === oldExtId.id && newExtId.providerName === oldExtId.providerName + ); if (match) { return; } console.log(`Reconciling external id: ${oldExtId.providerName}|${oldExtId.id}`); newAddon.externalIds.push({ ...oldExtId }); - }) + }); + + // Remove external ids that are not valid that we may have saved previously + _.remove(newAddon.externalIds, (extId) => !this.getProvider(extId.providerName).isValidAddonId(extId.providerName)); this.saveAddon(newAddon); } @@ -761,7 +767,7 @@ export class AddonService { public containsOwnExternalId(addon: Addon, array?: AddonExternalId[]): boolean { const arr = array || addon.externalIds; - const result = arr && !!arr.find(ext => ext.id === addon.externalId && ext.providerName === addon.providerName); + const result = arr && !!arr.find((ext) => ext.id === addon.externalId && ext.providerName === addon.providerName); return result; }