remove old Edge browser hacks (#168)

* remove old Edge browser hacks

* Remove final edge hacks

* Update constructor parameters

* Update search-ciphers.pipe.ts

Co-authored-by: Kyle Spearrin <kspearrin@users.noreply.github.com>
This commit is contained in:
Chad Scharf 2020-09-15 10:23:21 -04:00 committed by GitHub
parent fa2b8e834b
commit 5e0a2d1d99
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 7 additions and 37 deletions

View File

@ -49,13 +49,6 @@ describe('Utils Service', () => {
expect(Utils.getHostname('https://bitwarden.com')).toBe('bitwarden.com'); expect(Utils.getHostname('https://bitwarden.com')).toBe('bitwarden.com');
expect(Utils.getHostname('http://bitwarden.com')).toBe('bitwarden.com'); expect(Utils.getHostname('http://bitwarden.com')).toBe('bitwarden.com');
expect(Utils.getHostname('http://vault.bitwarden.com')).toBe('vault.bitwarden.com'); expect(Utils.getHostname('http://vault.bitwarden.com')).toBe('vault.bitwarden.com');
if (Utils.isNode || window.navigator.userAgent.indexOf(' Edge/') === -1) {
// Note: Broken in Edge browser. See
// https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8004284/
expect(Utils.getHostname('https://user:password@bitwarden.com:8080/password/sites?and&query#hash'))
.toBe('bitwarden.com');
}
}); });
it('should support localhost and IP', () => { it('should support localhost and IP', () => {

View File

@ -380,8 +380,8 @@ function testRsaGenerateKeyPair(length: 1024 | 2048 | 4096) {
function getWebCryptoFunctionService() { function getWebCryptoFunctionService() {
const platformUtilsMock = TypeMoq.Mock.ofType<PlatformUtilsService>(PlatformUtilsServiceMock); const platformUtilsMock = TypeMoq.Mock.ofType<PlatformUtilsService>(PlatformUtilsServiceMock);
platformUtilsMock.setup((x) => x.isEdge()).returns(() => navigator.userAgent.indexOf(' Edge/') !== -1); platformUtilsMock.setup((x) => x.isEdge()).returns(() => navigator.userAgent.indexOf(' Edg/') !== -1);
platformUtilsMock.setup((x) => x.isIE()).returns(() => navigator.userAgent.indexOf(' Edge/') === -1 && platformUtilsMock.setup((x) => x.isIE()).returns(() => navigator.userAgent.indexOf(' Edg/') === -1 &&
navigator.userAgent.indexOf(' Trident/') !== -1); navigator.userAgent.indexOf(' Trident/') !== -1);
return new WebCryptoFunctionService(window, platformUtilsMock.object); return new WebCryptoFunctionService(window, platformUtilsMock.object);
} }

View File

@ -105,7 +105,7 @@ export class RegisterComponent {
this.name = this.name === '' ? null : this.name; this.name = this.name === '' ? null : this.name;
this.email = this.email.trim().toLowerCase(); this.email = this.email.trim().toLowerCase();
const kdf = KdfType.PBKDF2_SHA256; const kdf = KdfType.PBKDF2_SHA256;
const useLowerKdf = this.platformUtilsService.isEdge() || this.platformUtilsService.isIE(); const useLowerKdf = this.platformUtilsService.isIE();
const kdfIterations = useLowerKdf ? 10000 : 100000; const kdfIterations = useLowerKdf ? 10000 : 100000;
const key = await this.cryptoService.makeKey(this.masterPassword, this.email, kdf, kdfIterations); const key = await this.cryptoService.makeKey(this.masterPassword, this.email, kdf, kdfIterations);
const encKey = await this.cryptoService.makeEncKey(key); const encKey = await this.cryptoService.makeEncKey(key);

View File

@ -44,7 +44,7 @@ export class SetPasswordComponent extends BaseChangePasswordComponent {
async setupSubmitActions() { async setupSubmitActions() {
this.kdf = KdfType.PBKDF2_SHA256; this.kdf = KdfType.PBKDF2_SHA256;
const useLowerKdf = this.platformUtilsService.isEdge() || this.platformUtilsService.isIE(); const useLowerKdf = this.platformUtilsService.isIE();
this.kdfIterations = useLowerKdf ? 10000 : 100000; this.kdfIterations = useLowerKdf ? 10000 : 100000;
return true; return true;
} }

View File

@ -5,20 +5,10 @@ import {
import { CipherView } from '../../models/view/cipherView'; import { CipherView } from '../../models/view/cipherView';
import { PlatformUtilsService } from '../../abstractions/platformUtils.service';
import { DeviceType } from '../../enums';
@Pipe({ @Pipe({
name: 'searchCiphers', name: 'searchCiphers',
}) })
export class SearchCiphersPipe implements PipeTransform { export class SearchCiphersPipe implements PipeTransform {
private onlySearchName = false;
constructor(platformUtilsService: PlatformUtilsService) {
this.onlySearchName = platformUtilsService.getDevice() === DeviceType.EdgeExtension;
}
transform(ciphers: CipherView[], searchText: string, deleted: boolean = false): CipherView[] { transform(ciphers: CipherView[], searchText: string, deleted: boolean = false): CipherView[] {
if (ciphers == null || ciphers.length === 0) { if (ciphers == null || ciphers.length === 0) {
return []; return [];
@ -38,9 +28,6 @@ export class SearchCiphersPipe implements PipeTransform {
if (c.name != null && c.name.toLowerCase().indexOf(searchText) > -1) { if (c.name != null && c.name.toLowerCase().indexOf(searchText) > -1) {
return true; return true;
} }
if (this.onlySearchName) {
return false;
}
if (searchText.length >= 8 && c.id.startsWith(searchText)) { if (searchText.length >= 8 && c.id.startsWith(searchText)) {
return true; return true;
} }

View File

@ -3,22 +3,17 @@ import * as lunr from 'lunr';
import { CipherView } from '../models/view/cipherView'; import { CipherView } from '../models/view/cipherView';
import { CipherService } from '../abstractions/cipher.service'; import { CipherService } from '../abstractions/cipher.service';
import { PlatformUtilsService } from '../abstractions/platformUtils.service';
import { SearchService as SearchServiceAbstraction } from '../abstractions/search.service'; import { SearchService as SearchServiceAbstraction } from '../abstractions/search.service';
import { CipherType } from '../enums/cipherType'; import { CipherType } from '../enums/cipherType';
import { DeviceType } from '../enums/deviceType';
import { FieldType } from '../enums/fieldType'; import { FieldType } from '../enums/fieldType';
import { UriMatchType } from '../enums/uriMatchType'; import { UriMatchType } from '../enums/uriMatchType';
export class SearchService implements SearchServiceAbstraction { export class SearchService implements SearchServiceAbstraction {
private indexing = false; private indexing = false;
private index: lunr.Index = null; private index: lunr.Index = null;
private onlySearchName = false;
constructor(private cipherService: CipherService, platformUtilsService: PlatformUtilsService) { constructor(private cipherService: CipherService) {
this.onlySearchName = platformUtilsService == null ||
platformUtilsService.getDevice() === DeviceType.EdgeExtension;
} }
clearIndex(): void { clearIndex(): void {
@ -152,9 +147,6 @@ export class SearchService implements SearchServiceAbstraction {
if (c.name != null && c.name.toLowerCase().indexOf(query) > -1) { if (c.name != null && c.name.toLowerCase().indexOf(query) > -1) {
return true; return true;
} }
if (this.onlySearchName) {
return false;
}
if (query.length >= 8 && c.id.startsWith(query)) { if (query.length >= 8 && c.id.startsWith(query)) {
return true; return true;
} }

View File

@ -11,14 +11,12 @@ import { SymmetricCryptoKey } from '../models/domain/symmetricCryptoKey';
export class WebCryptoFunctionService implements CryptoFunctionService { export class WebCryptoFunctionService implements CryptoFunctionService {
private crypto: Crypto; private crypto: Crypto;
private subtle: SubtleCrypto; private subtle: SubtleCrypto;
private isEdge: boolean;
private isIE: boolean; private isIE: boolean;
private isOldSafari: boolean; private isOldSafari: boolean;
constructor(private win: Window, private platformUtilsService: PlatformUtilsService) { constructor(private win: Window, private platformUtilsService: PlatformUtilsService) {
this.crypto = typeof win.crypto !== 'undefined' ? win.crypto : null; this.crypto = typeof win.crypto !== 'undefined' ? win.crypto : null;
this.subtle = (!!this.crypto && typeof win.crypto.subtle !== 'undefined') ? win.crypto.subtle : null; this.subtle = (!!this.crypto && typeof win.crypto.subtle !== 'undefined') ? win.crypto.subtle : null;
this.isEdge = platformUtilsService.isEdge();
this.isIE = platformUtilsService.isIE(); this.isIE = platformUtilsService.isIE();
const ua = win.navigator.userAgent; const ua = win.navigator.userAgent;
this.isOldSafari = platformUtilsService.isSafari() && this.isOldSafari = platformUtilsService.isSafari() &&
@ -27,7 +25,7 @@ export class WebCryptoFunctionService implements CryptoFunctionService {
async pbkdf2(password: string | ArrayBuffer, salt: string | ArrayBuffer, algorithm: 'sha256' | 'sha512', async pbkdf2(password: string | ArrayBuffer, salt: string | ArrayBuffer, algorithm: 'sha256' | 'sha512',
iterations: number): Promise<ArrayBuffer> { iterations: number): Promise<ArrayBuffer> {
if (this.isEdge || this.isIE || this.isOldSafari) { if (this.isIE || this.isOldSafari) {
const forgeLen = algorithm === 'sha256' ? 32 : 64; const forgeLen = algorithm === 'sha256' ? 32 : 64;
const passwordBytes = this.toByteString(password); const passwordBytes = this.toByteString(password);
const saltBytes = this.toByteString(salt); const saltBytes = this.toByteString(salt);
@ -52,7 +50,7 @@ export class WebCryptoFunctionService implements CryptoFunctionService {
} }
async hash(value: string | ArrayBuffer, algorithm: 'sha1' | 'sha256' | 'sha512' | 'md5'): Promise<ArrayBuffer> { async hash(value: string | ArrayBuffer, algorithm: 'sha1' | 'sha256' | 'sha512' | 'md5'): Promise<ArrayBuffer> {
if (((this.isEdge || this.isIE) && algorithm === 'sha1') || algorithm === 'md5') { if ((this.isIE && algorithm === 'sha1') || algorithm === 'md5') {
const md = algorithm === 'md5' ? forge.md.md5.create() : forge.md.sha1.create(); const md = algorithm === 'md5' ? forge.md.md5.create() : forge.md.sha1.create();
const valueBytes = this.toByteString(value); const valueBytes = this.toByteString(value);
md.update(valueBytes, 'raw'); md.update(valueBytes, 'raw');