import { BaseImporter } from './baseImporter'; import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; import { FolderView } from '../models/view/folderView'; export class PasswordDragonXmlImporter extends BaseImporter implements Importer { parse(data: string): ImportResult { const result = new ImportResult(); const doc = this.parseXml(data); if (doc == null) { result.success = false; return result; } const records = doc.querySelectorAll('PasswordManager > record'); Array.from(records).forEach((record) => { const category = this.querySelectorDirectChild(record, 'Category'); let folderIndex = result.folders.length; const hasFolder = category != null && !this.isNullOrWhitespace(category.textContent) && category.textContent !== 'Unfiled'; let addFolder = hasFolder; if (hasFolder) { for (let i = 0; i < result.folders.length; i++) { if (result.folders[i].name === category.textContent) { addFolder = false; folderIndex = i; break; } } } if (addFolder) { const f = new FolderView(); f.name = category.textContent; result.folders.push(f); } if (hasFolder) { result.folderRelationships.push([result.ciphers.length, folderIndex]); } const accountName = this.querySelectorDirectChild(record, 'Account-Name'); const userId = this.querySelectorDirectChild(record, 'User-Id'); const password = this.querySelectorDirectChild(record, 'Password'); const url = this.querySelectorDirectChild(record, 'URL'); const notes = this.querySelectorDirectChild(record, 'Notes'); const cipher = this.initLoginCipher(); cipher.name = accountName != null ? this.getValueOrDefault(accountName.textContent, '--') : '--'; cipher.notes = notes != null ? this.getValueOrDefault(notes.textContent) : ''; cipher.login.username = userId != null ? this.getValueOrDefault(userId.textContent) : null; cipher.login.password = password != null ? this.getValueOrDefault(password.textContent) : null; cipher.login.uris = url != null ? this.makeUriArray(url.textContent) : null; const attributes: string[] = []; for (let i = 1; i <= 10; i++) { attributes.push('Attribute-' + i); } this.querySelectorAllDirectChild(record, attributes.join(',')).forEach((attr) => { if (this.isNullOrWhitespace(attr.textContent) || attr.textContent === 'null') { return; } this.processKvp(cipher, attr.tagName, attr.textContent); }); this.cleanupCipher(cipher); result.ciphers.push(cipher); }); if (this.organization) { this.moveFoldersToCollections(result); } result.success = true; return result; } }