Add export functionality

This commit is contained in:
brantje 2016-10-08 13:26:48 +02:00
parent f7cb2a4c6d
commit 842e27d439
No known key found for this signature in database
GPG key ID: 5FF1D117F918687F
7 changed files with 126 additions and 4 deletions

View file

@ -34,6 +34,7 @@ module.exports = function (grunt) {
globals: {
"angular": true,
"PassmanImporter": true,
"PassmanExporter": true,
"OC": true,
"window": true,
"console": true,

View file

@ -1,7 +1,6 @@
(function () {
'use strict';
/**
* @ngdoc function
* @name passmanApp.controller:ImportCtrl
@ -10,7 +9,56 @@
* Controller of the passmanApp
*/
angular.module('passmanApp')
.controller('ExportCtrl', ['$scope', function ($scope) {
.controller('ExportCtrl', ['$scope', '$window', 'CredentialService', 'VaultService', function ($scope, $window, CredentialService, VaultService) {
$scope.available_exporters = [];
$scope.active_vault = VaultService.getActiveVault();
$scope.$watch(function () {
return $window.PassmanExporter;
}, function (exporters) {
for (var key in exporters) {
var exporter = exporters[key];
if (exporter.hasOwnProperty('info')) {
$scope.available_exporters.push(exporter.info);
}
}
}, true);
$scope.log = [];
$scope.setExporter = function (exporter) {
console.log(exporter)
exporter = JSON.parse(exporter);
$scope.selectedExporter = exporter;
};
var _log = function (str) {
$scope.log.push(str);
};
$scope.startExport = function () {
_log('Starting export');
var _credentials = [];
VaultService.getVault(VaultService.getActiveVault()).then(function (vault) {
_log('Decrypting credentials');
if(vault.hasOwnProperty('credentials')){
if(vault.credentials.length > 0){
for(var i =0; i < vault.credentials.length; i++){
var _credential = angular.copy(vault.credentials[i]);
if(_credential.hidden === 0){
_credential = CredentialService.decryptCredential(_credential);
_credentials.push(_credential);
}
}
$window.PassmanExporter[$scope.selectedExporter.id].export(_credentials).then(function () {
_log('Done');
});
}
}
});
}
}]);

View file

@ -0,0 +1,46 @@
// Importers should always start with this
if (!window['PassmanExporter']) {
var PassmanExporter = {}
}
// Define the importer
PassmanExporter.csv = {
info: {
name: 'CSV',
id: 'csv',
description: 'Export credentials as csv.'
}
};
PassmanExporter.csv.export = function (credentials) {
return new C_Promise(function () {
var _this = this;
var headers = ['label','username','password','email','description','tags'];
var file_data = '"'+headers.join('","')+'"\n';
for(var i = 0; i < credentials.length; i++){
var _credential = credentials[i];
var row_data = [];
for(var h=0; h < headers.length; h++ ){
var field = headers[h];
if(field === 'tags'){
var _tags = [];
for(var t = 0; t < _credential[field].length; t++){
_tags.push(_credential[field][t].text);
}
var data = '[' + _tags.join(",") + ']';
row_data.push('"' + data + '"');
} else {
row_data.push('"' + _credential[field] + '"');
}
}
var progress = {
percent: i/credentials.length*100,
loaded: i,
total: credentials.length
};
_this.call_progress(progress);
file_data += row_data.join(',')+"\n";
}
_this.call_then();
download(file_data, 'passman-export.csv');
});
};

View file

@ -0,0 +1,5 @@
// Importers should always start with this
if(!window['PassmanExporter']){
var PassmanExporter = {}
}

View file

@ -45,7 +45,7 @@ angular.module('views/partials/forms/edit_credential/password.html', []).run(['$
angular.module('views/partials/forms/settings/export.html', []).run(['$templateCache', function($templateCache) {
'use strict';
$templateCache.put('views/partials/forms/settings/export.html',
'<div ng-controller="ExportCtrl">Export credentials</div>');
'<div ng-controller="ExportCtrl"><div class="row"><div class="col-xs-6"><label>Export type<select ng-init="raw" ng-model="raw" ng-change="setExporter(raw)"><option ng-repeat="exporter in available_exporters" value="{{exporter}}">{{exporter.name}}</option></select></label><div><b>{{selectedExporter.description}}</b></div><button class="button" ng-click="startExport()" ng-if="selectedExporter">Export</button></div><div class="col-xs-6"><div ng-if="log" class="import_log"><textarea id="import_log" auto-scroll="log">{{log.join(\'\\n\')}}</textarea></div></div></div></div>');
}]);
angular.module('views/partials/forms/settings/general_settings.html', []).run(['$templateCache', function($templateCache) {

View file

@ -77,6 +77,8 @@ script('passman', 'importers/importer-passmanjson');
script('passman', 'importers/importer-clipperz');
script('passman', 'importers/importer-passpackcsv');
script('passman', 'importers/importer-randomdata');
script('passman', 'exporters/exporter-main');
script('passman', 'exporters/exporter-csv');
/*
* Styles

View file

@ -1,3 +1,23 @@
<div ng-controller="ExportCtrl">
Export credentials
<div class="row">
<div class="col-xs-6">
<label>Export type
<select ng-init="raw" ng-model="raw"
ng-change="setExporter(raw)">
<option ng-repeat="exporter in available_exporters"
value="{{exporter}}">
{{exporter.name}}
</option>
</select></label>
<div><b>{{selectedExporter.description}}</b></div>
<button class="button" ng-click="startExport()"
ng-if="selectedExporter">Export
</button>
</div>
<div class="col-xs-6">
<div ng-if="log" class="import_log">
<textarea id="import_log" auto-scroll="log">{{log.join('\n')}}</textarea>
</div>
</div>
</div>
</div>