mirror of
https://github.com/bitwarden/browser
synced 2024-12-26 01:45:10 +01:00
1password 1pif importer: create hidden fields (#32)
* allow base importer to receive custom field type * 1password importer uses hidden field type for custom fields marked as 'concealed' * 1password 1pif importer specs * remove 'focus' from specs * change field type logic into simple one liner
This commit is contained in:
parent
593870e936
commit
f874ec253d
95
spec/common/importers/onepassword1PifImporter.spec.ts
Normal file
95
spec/common/importers/onepassword1PifImporter.spec.ts
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
import { FieldType } from '../../../src/enums/fieldType';
|
||||||
|
import { OnePassword1PifImporter as Importer } from '../../../src/importers/onepassword1PifImporter';
|
||||||
|
|
||||||
|
import { Utils } from '../../../src/misc/utils';
|
||||||
|
|
||||||
|
if (Utils.isNode) {
|
||||||
|
// Polyfills
|
||||||
|
// tslint:disable-next-line
|
||||||
|
const jsdom: any = require('jsdom');
|
||||||
|
(global as any).DOMParser = new jsdom.JSDOM().window.DOMParser;
|
||||||
|
}
|
||||||
|
|
||||||
|
const TestData: string = `***aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee***\n` +
|
||||||
|
JSON.stringify({
|
||||||
|
uuid: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
||||||
|
updatedAt: 1486071244,
|
||||||
|
securityLevel: 'SL5',
|
||||||
|
contentsHash: 'aaaaaaaa',
|
||||||
|
title: 'Imported Entry',
|
||||||
|
location: 'https://www.google.com',
|
||||||
|
secureContents: {
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
value: 'user@test.net',
|
||||||
|
id: 'email-input',
|
||||||
|
name: 'email',
|
||||||
|
type: 'T',
|
||||||
|
designation: 'username',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'myservicepassword',
|
||||||
|
id: 'password-input',
|
||||||
|
name: 'password',
|
||||||
|
type: 'P',
|
||||||
|
designation: 'password',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
sections: [
|
||||||
|
{
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
k: 'concealed',
|
||||||
|
n: 'AAAAAAAAAAAABBBBBBBBBBBCCCCCCCCC',
|
||||||
|
v: 'console-password-123',
|
||||||
|
t: 'console password',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
title: 'Admin Console',
|
||||||
|
name: 'admin_console',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
URLs: [
|
||||||
|
{
|
||||||
|
label: 'website',
|
||||||
|
url: 'https://www.google.com',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
txTimestamp: 1508941334,
|
||||||
|
createdAt: 1390426636,
|
||||||
|
typeName: 'webforms.WebForm',
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('1Password 1Pif Importer', () => {
|
||||||
|
it('should parse data', async () => {
|
||||||
|
const importer = new Importer();
|
||||||
|
const result = importer.parse(TestData);
|
||||||
|
expect(result != null).toBe(true);
|
||||||
|
|
||||||
|
const cipher = result.ciphers.shift();
|
||||||
|
expect(cipher.login.username).toEqual('user@test.net');
|
||||||
|
expect(cipher.login.password).toEqual('myservicepassword');
|
||||||
|
expect(cipher.login.uris.length).toEqual(1);
|
||||||
|
const uriView = cipher.login.uris.shift();
|
||||||
|
expect(uriView.uri).toEqual('https://www.google.com');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create concealed field as "hidden" type', async () => {
|
||||||
|
const importer = new Importer();
|
||||||
|
const result = importer.parse(TestData);
|
||||||
|
expect(result != null).toBe(true);
|
||||||
|
|
||||||
|
const ciphers = result.ciphers;
|
||||||
|
expect(ciphers.length).toEqual(1);
|
||||||
|
|
||||||
|
const cipher = ciphers.shift();
|
||||||
|
const fields = cipher.fields;
|
||||||
|
expect(fields.length).toEqual(1);
|
||||||
|
|
||||||
|
const field = fields.shift();
|
||||||
|
expect(field.name).toEqual('console password');
|
||||||
|
expect(field.value).toEqual('console-password-123');
|
||||||
|
expect(field.type).toEqual(FieldType.Hidden);
|
||||||
|
});
|
||||||
|
});
|
@ -302,7 +302,7 @@ export abstract class BaseImporter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected processKvp(cipher: CipherView, key: string, value: string) {
|
protected processKvp(cipher: CipherView, key: string, value: string, type: FieldType = FieldType.Text) {
|
||||||
if (this.isNullOrWhitespace(value)) {
|
if (this.isNullOrWhitespace(value)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -319,7 +319,7 @@ export abstract class BaseImporter {
|
|||||||
cipher.fields = [];
|
cipher.fields = [];
|
||||||
}
|
}
|
||||||
const field = new FieldView();
|
const field = new FieldView();
|
||||||
field.type = FieldType.Text;
|
field.type = type;
|
||||||
field.name = key;
|
field.name = key;
|
||||||
field.value = value;
|
field.value = value;
|
||||||
cipher.fields.push(field);
|
cipher.fields.push(field);
|
||||||
|
@ -8,6 +8,7 @@ import { CipherView } from '../models/view/cipherView';
|
|||||||
import { SecureNoteView } from '../models/view/secureNoteView';
|
import { SecureNoteView } from '../models/view/secureNoteView';
|
||||||
|
|
||||||
import { CipherType } from '../enums/cipherType';
|
import { CipherType } from '../enums/cipherType';
|
||||||
|
import { FieldType } from '../enums/fieldType';
|
||||||
import { SecureNoteType } from '../enums/secureNoteType';
|
import { SecureNoteType } from '../enums/secureNoteType';
|
||||||
|
|
||||||
export class OnePassword1PifImporter extends BaseImporter implements Importer {
|
export class OnePassword1PifImporter extends BaseImporter implements Importer {
|
||||||
@ -168,8 +169,9 @@ export class OnePassword1PifImporter extends BaseImporter implements Importer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const fieldType = (field.k === 'concealed') ? FieldType.Hidden : FieldType.Text;
|
||||||
const fieldName = this.isNullOrWhitespace(field[nameKey]) ? 'no_name' : field[nameKey];
|
const fieldName = this.isNullOrWhitespace(field[nameKey]) ? 'no_name' : field[nameKey];
|
||||||
this.processKvp(cipher, fieldName, fieldValue);
|
this.processKvp(cipher, fieldName, fieldValue, fieldType);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user