diff --git a/jslib b/jslib index 9fa99f3a6ec..0d30a1a1c9b 160000 --- a/jslib +++ b/jslib @@ -1 +1 @@ -Subproject commit 9fa99f3a6ecf7c4a14e5d7271562b3908cf64728 +Subproject commit 0d30a1a1c9bd2c323189069fe4ec233ab85c35fe diff --git a/package-lock.json b/package-lock.json index 1320c65f51f..524d2b72bd4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -602,9 +602,9 @@ "dev": true }, "@types/tldjs": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@types/tldjs/-/tldjs-1.7.1.tgz", - "integrity": "sha1-BdPvPLbgPPOt8eSgQ8FHDPIOF5k=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@types/tldjs/-/tldjs-2.3.0.tgz", + "integrity": "sha512-+gqspH/N6YjpApp96/XzM2AZK4R0Bk2qb4e5o16indSvgblfFaAIxNV8BdJmbqfSAYUyZubLzvrmpvdVEmBq3A==", "dev": true }, "@types/uglify-js": { diff --git a/package.json b/package.json index 5eacde0cf7a..32344c19b78 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "@types/safari-extension": "^0.0.27", "@types/safari-extension-content": "^0.0.14", "@types/source-map": "0.5.2", - "@types/tldjs": "^1.7.1", + "@types/tldjs": "^2.3.0", "@types/webcrypto": "^0.0.28", "@types/webpack": "^4.4.11", "angular2-template-loader": "^0.6.2", diff --git a/src/background/main.background.ts b/src/background/main.background.ts index e63d9b658a4..a5554d62551 100644 --- a/src/background/main.background.ts +++ b/src/background/main.background.ts @@ -50,6 +50,7 @@ import { NotificationsService as NotificationsServiceAbstraction } from 'jslib/a import { SearchService as SearchServiceAbstraction } from 'jslib/abstractions/search.service'; import { Analytics } from 'jslib/misc'; +import { Utils } from 'jslib/misc/utils'; import { BrowserApi } from '../browser/browserApi'; @@ -134,8 +135,7 @@ export default class MainBackground { this.userService = new UserService(this.tokenService, this.storageService); this.settingsService = new SettingsService(this.userService, this.storageService); this.cipherService = new CipherService(this.cryptoService, this.userService, this.settingsService, - this.apiService, this.storageService, this.i18nService, this.platformUtilsService, - () => this.searchService); + this.apiService, this.storageService, this.i18nService, () => this.searchService); this.folderService = new FolderService(this.cryptoService, this.userService, this.apiService, this.storageService, this.i18nService, this.cipherService); this.collectionService = new CollectionService(this.cryptoService, this.userService, this.storageService, @@ -156,7 +156,7 @@ export default class MainBackground { this.passwordGenerationService = new PasswordGenerationService(this.cryptoService, this.storageService); this.totpService = new TotpService(this.storageService, cryptoFunctionService); this.autofillService = new AutofillService(this.cipherService, this.userService, this.totpService); - this.containerService = new ContainerService(this.cryptoService, this.platformUtilsService); + this.containerService = new ContainerService(this.cryptoService); this.auditService = new AuditService(cryptoFunctionService, this.apiService); this.exportService = new ExportService(this.folderService, this.cipherService, this.apiService); this.notificationsService = new NotificationsService(this.userService, this.syncService, this.appIdService, @@ -529,7 +529,7 @@ export default class MainBackground { return; } - const tabDomain = this.platformUtilsService.getDomain(tab.url); + const tabDomain = Utils.getDomain(tab.url); if (tabDomain == null) { return; } diff --git a/src/background/runtime.background.ts b/src/background/runtime.background.ts index ed3e4351d71..ba73c49b587 100644 --- a/src/background/runtime.background.ts +++ b/src/background/runtime.background.ts @@ -200,7 +200,7 @@ export default class RuntimeBackground { continue; } - const tabDomain = this.platformUtilsService.getDomain(tab.url); + const tabDomain = Utils.getDomain(tab.url); if (tabDomain != null && tabDomain !== queueMessage.domain) { continue; } @@ -235,7 +235,7 @@ export default class RuntimeBackground { continue; } - const tabDomain = this.platformUtilsService.getDomain(tab.url); + const tabDomain = Utils.getDomain(tab.url); if (tabDomain != null && tabDomain !== queueMessage.domain) { continue; } @@ -264,7 +264,7 @@ export default class RuntimeBackground { continue; } - const tabDomain = this.platformUtilsService.getDomain(tab.url); + const tabDomain = Utils.getDomain(tab.url); if (tabDomain != null && tabDomain !== queueMessage.domain) { continue; } @@ -278,7 +278,7 @@ export default class RuntimeBackground { } private async addLogin(loginInfo: any, tab: any) { - const loginDomain = this.platformUtilsService.getDomain(loginInfo.url); + const loginDomain = Utils.getDomain(loginInfo.url); if (loginDomain == null) { return; } @@ -314,7 +314,7 @@ export default class RuntimeBackground { } private async changedPassword(changeData: any, tab: any) { - const loginDomain = this.platformUtilsService.getDomain(changeData.url); + const loginDomain = Utils.getDomain(changeData.url); if (loginDomain == null) { return; } diff --git a/src/services/browserPlatformUtils.service.spec.ts b/src/services/browserPlatformUtils.service.spec.ts index f1db61a19ec..2d5911af368 100644 --- a/src/services/browserPlatformUtils.service.spec.ts +++ b/src/services/browserPlatformUtils.service.spec.ts @@ -3,35 +3,6 @@ import BrowserPlatformUtilsService from './browserPlatformUtils.service'; import { DeviceType } from 'jslib/enums'; describe('Browser Utils Service', () => { - describe('getDomain', () => { - it('should fail for invalid urls', () => { - expect(BrowserPlatformUtilsService.getDomain(null)).toBeNull(); - expect(BrowserPlatformUtilsService.getDomain(undefined)).toBeNull(); - expect(BrowserPlatformUtilsService.getDomain(' ')).toBeNull(); - expect(BrowserPlatformUtilsService.getDomain('https://bit!:"_&ward.com')).toBeNull(); - expect(BrowserPlatformUtilsService.getDomain('bitwarden')).toBeNull(); - }); - - it('should handle urls without protocol', () => { - expect(BrowserPlatformUtilsService.getDomain('bitwarden.com')).toBe('bitwarden.com'); - expect(BrowserPlatformUtilsService.getDomain('wrong://bitwarden.com')).toBe('bitwarden.com'); - }); - - it('should handle valid urls', () => { - expect(BrowserPlatformUtilsService.getDomain('https://bitwarden')).toBe('bitwarden'); - expect(BrowserPlatformUtilsService.getDomain('https://bitwarden.com')).toBe('bitwarden.com'); - expect(BrowserPlatformUtilsService.getDomain('http://bitwarden.com')).toBe('bitwarden.com'); - expect(BrowserPlatformUtilsService.getDomain('http://vault.bitwarden.com')).toBe('bitwarden.com'); - expect(BrowserPlatformUtilsService.getDomain('https://user:password@bitwarden.com:8080/password/sites?and&query#hash')).toBe('bitwarden.com'); - expect(BrowserPlatformUtilsService.getDomain('https://bitwarden.unknown')).toBe('bitwarden.unknown'); - }); - - it('should support localhost and IP', () => { - expect(BrowserPlatformUtilsService.getDomain('https://localhost')).toBe('localhost'); - expect(BrowserPlatformUtilsService.getDomain('https://192.168.1.1')).toBe('192.168.1.1'); - }); - }); - describe('getBrowser', () => { const originalUserAgent = navigator.userAgent; const originalSafari = (window as any).safari; @@ -55,7 +26,7 @@ describe('Browser Utils Service', () => { configurable: true, value: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36' }); - + const browserPlatformUtilsService = new BrowserPlatformUtilsService(null); expect(browserPlatformUtilsService.getDevice()).toBe(DeviceType.ChromeExtension); }); @@ -65,7 +36,7 @@ describe('Browser Utils Service', () => { configurable: true, value: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0' }); - + const browserPlatformUtilsService = new BrowserPlatformUtilsService(null); expect(browserPlatformUtilsService.getDevice()).toBe(DeviceType.FirefoxExtension); }); @@ -80,7 +51,7 @@ describe('Browser Utils Service', () => { configurable: true, value: {} }); - + const browserPlatformUtilsService = new BrowserPlatformUtilsService(null); expect(browserPlatformUtilsService.getDevice()).toBe(DeviceType.OperaExtension); }); @@ -90,7 +61,7 @@ describe('Browser Utils Service', () => { configurable: true, value: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; ServiceUI 9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063' }); - + const browserPlatformUtilsService = new BrowserPlatformUtilsService(null); expect(browserPlatformUtilsService.getDevice()).toBe(DeviceType.EdgeExtension); }); diff --git a/src/services/browserPlatformUtils.service.ts b/src/services/browserPlatformUtils.service.ts index ad1832d8208..6d8fb222333 100644 --- a/src/services/browserPlatformUtils.service.ts +++ b/src/services/browserPlatformUtils.service.ts @@ -1,5 +1,3 @@ -import * as tldjs from 'tldjs'; - import { BrowserApi } from '../browser/browserApi'; import { DeviceType } from 'jslib/enums/deviceType'; @@ -12,43 +10,6 @@ import { AnalyticsIds } from 'jslib/misc/analytics'; const DialogPromiseExpiration = 600000; // 10 minutes export default class BrowserPlatformUtilsService implements PlatformUtilsService { - static getDomain(uriString: string): string { - if (uriString == null) { - return null; - } - - uriString = uriString.trim(); - if (uriString === '') { - return null; - } - - if (uriString.startsWith('http://') || uriString.startsWith('https://')) { - try { - const url = new URL(uriString); - - if (url.hostname === 'localhost' || BrowserPlatformUtilsService.validIpAddress(url.hostname)) { - return url.hostname; - } - - const urlDomain = tldjs.getDomain(url.hostname); - return urlDomain != null ? urlDomain : url.hostname; - } catch (e) { } - } - - const domain = tldjs.getDomain(uriString); - if (domain != null) { - return domain; - } - - return null; - } - - private static validIpAddress(ipString: string): boolean { - // tslint:disable-next-line - const ipRegex = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; - return ipRegex.test(ipString); - } - identityClientId: string = 'browser'; private showDialogResolves = new Map void, date: Date }>(); @@ -127,10 +88,6 @@ export default class BrowserPlatformUtilsService implements PlatformUtilsService return this.analyticsIdCache; } - getDomain(uriString: string): string { - return BrowserPlatformUtilsService.getDomain(uriString); - } - isViewOpen(): boolean { if (BrowserApi.isPopupOpen()) { return true;