diff --git a/src/app/services/importService.js b/src/app/services/importService.js index 7af82856..0b7f1624 100644 --- a/src/app/services/importService.js +++ b/src/app/services/importService.js @@ -47,6 +47,9 @@ case 'passworddragonxml': importPasswordDragonXml(file, success, error); break; + case 'enpasscsv': + importEnpassCsv(file, success, error); + break; default: error(); break; @@ -982,5 +985,69 @@ }; } + function importEnpassCsv(file, success, error) { + Papa.parse(file, { + encoding: 'UTF-8', + complete: function (results) { + parseCsvErrors(results); + + var folders = [], + sites = [], + siteRelationships = []; + + for (var j = 0; j < results.data.length; j++) { + var row = results.data[j]; + if (row.length < 2) { + continue; + } + if (j === 0 && row[0] === 'Title') { + continue; + } + + var note = row[row.length - 1]; + var site = { + name: row[0], + favorite: false, + uri: null, + password: null, + username: null, + notes: note && note !== '' ? note : null, + }; + + if (row.length > 2 && (row.length % 2) === 0) { + for (var i = 0; i < row.length - 2; i += 2) { + var value = row[i + 2]; + if (!value || value === '') { + continue; + } + + var field = row[i + 1]; + var fieldLower = field.toLowerCase(); + + if (fieldLower === 'url' && !site.uri) { + site.uri = trimUri(value); + } + else if ((fieldLower === 'username' || fieldLower === 'email') && !site.username) { + site.username = value; + } + else if (fieldLower === 'password' && !site.password) { + site.password = value; + } + else { + // other custom fields + site.notes = site.notes === null ? field + ': ' + value + : site.notes + '\n' + field + ': ' + value; + } + } + } + + sites.push(site); + } + + success(folders, sites, siteRelationships); + } + }); + } + return _service; }); diff --git a/src/app/tools/views/toolsImport.html b/src/app/tools/views/toolsImport.html index 93e16196..bdb94924 100644 --- a/src/app/tools/views/toolsImport.html +++ b/src/app/tools/views/toolsImport.html @@ -19,6 +19,7 @@ +