Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/passman.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--controller/translationcontroller.php14
-rw-r--r--css/app.css13
-rw-r--r--css/app.css.map2
-rw-r--r--js/app/controllers/generic-csv-importer.js209
-rw-r--r--js/app/controllers/settings.js2
-rw-r--r--js/app/directives/autoscroll.js4
-rw-r--r--js/app/directives/credentialtemplate.js47
-rw-r--r--js/app/directives/fileselect.js12
-rw-r--r--js/templates.js18
-rw-r--r--sass/settings.scss33
-rw-r--r--templates/main.php2
-rw-r--r--templates/views/partials/credential_template.html96
-rw-r--r--templates/views/partials/forms/settings/generic_csv_import.html68
-rw-r--r--templates/views/partials/forms/settings/import.html16
-rw-r--r--templates/views/show_vault.html90
15 files changed, 516 insertions, 110 deletions
diff --git a/controller/translationcontroller.php b/controller/translationcontroller.php
index e87d73e7..5f24e211 100644
--- a/controller/translationcontroller.php
+++ b/controller/translationcontroller.php
@@ -74,7 +74,21 @@ class TranslationController extends ApiController {
'import.no.label' => $this->trans->t('Credential has no label, skipping'),
'import.adding' => $this->trans->t('Adding {{credential}}'),
'import.added' => $this->trans->t('Added {{credential}}'),
+ 'import.skipping' => $this->trans->t('Skipping credential, missing label on line {{line}}'),
'import.loaded' => $this->trans->t('Parsed {{num}} credentials, starting to import'),
+ 'import.importing' => $this->trans->t('Importing'),
+ 'import.start' => $this->trans->t('Start import'),
+
+ 'select.csv' => $this->trans->t('Select csv file'),
+ 'parsed.csv.rows' => $this->trans->t('Parsed {{rows}} lines from csv file'),
+ 'skip.first.row' => $this->trans->t('Skip first row'),
+ 'import.csv.label.req' => $this->trans->t('You need to assign the label field before you can start the import.'),
+ 'first.five.lines' => $this->trans->t('First 5 lines of the csv are shown.'),
+ 'assign.column' => $this->trans->t('Assign the proper fields to each column.'),
+ 'example.credential' => $this->trans->t('Example imported credential'),
+ 'missing.importer' => $this->trans->t('Missing an importer? Try it with the generic csv importer.'),
+ 'missing.importer.back' => $this->trans->t('Go back to importers.'),
+
// js/app/controllers/revision.js
'revision.deleted' => $this->trans->t('Revision deleted'),
diff --git a/css/app.css b/css/app.css
index 20a584d4..f1dd5817 100644
--- a/css/app.css
+++ b/css/app.css
@@ -892,6 +892,19 @@
.import-steps li {
list-style-type: disc; }
+.import-table-outter {
+ overflow-x: scroll; }
+
+.import-table {
+ padding-right: 15px; }
+ .import-table .inspect {
+ text-align: center;
+ width: 25px;
+ cursor: pointer; }
+ .import-table th, .import-table td {
+ text-align: left;
+ padding: 3px 5px; }
+
#app-settings-content:not(.ng-hide) {
height: 90px;
display: inherit !important;
diff --git a/css/app.css.map b/css/app.css.map
index 2f37db9e..ee8782a0 100644
--- a/css/app.css.map
+++ b/css/app.css.map
@@ -1,6 +1,6 @@
{
"version": 3,
-"mappings": "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",
+"mappings": "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",
"sources": ["../sass/app.scss","../sass/variables.scss","../sass/mixins.scss","../sass/partials/button.scss","../sass/partials/popovermenu.scss","../sass/partials/tabs.scss","../sass/partials/pwgen.scss","../sass/vaults.scss","../sass/credentials.scss","../sass/menu.scss","../sass/share_credential.scss","../sass/settings.scss"],
"names": [],
"file": "app.css"
diff --git a/js/app/controllers/generic-csv-importer.js b/js/app/controllers/generic-csv-importer.js
new file mode 100644
index 00000000..e3cc178c
--- /dev/null
+++ b/js/app/controllers/generic-csv-importer.js
@@ -0,0 +1,209 @@
+/**
+ * Nextcloud - passman
+ *
+ * @copyright Copyright (c) 2016, Sander Brand (brantje@gmail.com)
+ * @copyright Copyright (c) 2016, Marcos Zuriaga Miguel (wolfi@wolfi.es)
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+(function () {
+ 'use strict';
+
+
+ /**
+ * @ngdoc function
+ * @name passmanApp.controller:MenuCtrl
+ * @description
+ * # MenuCtrl
+ * Controller of the passmanApp
+ */
+ angular.module('passmanApp')
+ .controller('GenericCsvImportCtrl', ['$scope', 'CredentialService', '$translate',
+ function ($scope, CredentialService, $translate) {
+ $scope.hello = 'world';
+
+ $scope.credentialProperties = [
+ {
+ label: 'Label',
+ prop: 'label',
+ matching: ['label', 'title', 'name']
+ },
+ {
+ label: 'Username',
+ prop: 'username',
+ matching: ['username', 'user', 'login', 'login name']
+ },
+ {
+ label: 'Password',
+ prop: 'password',
+ matching: ['password', 'pass', 'pw']
+ },
+ {
+ label: 'TOTP Secret',
+ prop: 'otp',
+ matching: ['totp']
+ },
+ {
+ label: 'Custom field',
+ prop: 'custom_field'
+ },
+ {
+ label: 'Notes',
+ prop: 'description',
+ matching: ['notes', 'description', 'comments']
+ },
+ {
+ label: 'Email',
+ prop: 'email',
+ matching: ['email', 'mail']
+ },
+ {
+ label: 'URL',
+ prop: 'url',
+ matching: ['website', 'url', 'fulladdress', 'site', 'web site']
+ },
+ {
+ label: 'Tags',
+ prop: 'tags'
+ },
+ {
+ label: 'Ignored',
+ prop: null
+ }
+ ];
+
+ var rowToCredential = function (row) {
+ var _credential = PassmanImporter.newCredential();
+ for(var k = 0; k < $scope.import_fields.length; k++){
+ var field = $scope.import_fields[k];
+ if(field){
+ if(field === 'otp'){
+ _credential.otp.secret = row[k]
+ } else if(field === 'custom_field'){
+ var key = ($scope.matched) ? $scope.parsed_csv[0][k] : 'Custom field '+ k;
+ _credential.custom_fields.push({
+ 'label': key,
+ 'value': row[k],
+ 'secret': 0
+ })
+ } else if(field === 'tags'){
+ if( row[k]) {
+ console.log(row, k);
+ var tags = row[k].split(',');
+ console.log();
+ _credential.tags = tags.map(function (t) {
+ console.log(t);
+ return {text: t}
+ });
+ }
+ } else{
+ _credential[field] = row[k];
+ }
+ }
+ }
+ return _credential
+ };
+
+
+ $scope.inspectCredential = function (row) {
+ $scope.inspected_credential = rowToCredential(row);
+ };
+
+ $scope.csvLoaded = function (file) {
+ $scope.import_fields = [];
+ $scope.inspected_credential = false;
+ $scope.matched = false;
+ $scope.skipFirstRow = false;
+ var file_data = file.data.split(',');
+ file_data = decodeURIComponent(escape(window.atob(file_data[1])));
+ Papa.parse(file_data, {
+ complete: function(results) {
+ if(results.data) {
+ for(var i = 0; i < results.data[0].length; i++){
+ var propName = results.data[0][i];
+ $scope.import_fields[i] = null;
+ for(var p = 0; p < $scope.credentialProperties.length; p++){
+ var credentialProperty = $scope.credentialProperties[p];
+ if(credentialProperty.matching){
+ if(credentialProperty.matching.indexOf(propName.toLowerCase()) !== -1){
+ $scope.import_fields[i] = credentialProperty.prop;
+ $scope.matched = true;
+ }
+ }
+ }
+ }
+ if($scope.matched){
+ $scope.inspectCredential(results.data[1]);
+ }
+ $scope.parsed_csv = results.data;
+ $scope.$apply();
+ }
+ }
+ });
+ };
+
+ var addCredential = function (index) {
+ function handleState (index) {
+ if ($scope.parsed_csv[index + 1]) {
+ $scope.import_progress = {
+ progress: index / $scope.parsed_csv.length * 100,
+ loaded: index,
+ total: $scope.parsed_csv.length
+ };
+
+ addCredential(index + 1);
+ } else {
+ $scope.import_progress = {
+ progress: 100,
+ loaded: $scope.parsed_csv.length,
+ total: $scope.parsed_csv.length
+ };
+ $scope.log.push($translate.instant('done'));
+ $scope.importing = false;
+ }
+ }
+
+ var _credential = rowToCredential($scope.parsed_csv[index]);
+ _credential.vault_id = $scope.active_vault.vault_id;
+ if (!_credential.label) {
+ $scope.log.push($translate.instant('import.skipping', {line: index}));
+ handleState(index);
+ return;
+ }
+ $scope.log.push($translate.instant('import.adding', {credential: _credential.label}));
+ CredentialService.createCredential(_credential).then(function (result) {
+ if (result.credential_id) {
+ $scope.log.push($translate.instant('import.added', {credential: _credential.label}));
+ handleState(index);
+ }
+ });
+ };
+
+ $scope.importing = false;
+ $scope.startImport = function () {
+ $scope.importing = true;
+ $scope.log = [];
+ var start = ($scope.skipFirstRow) ? 1 : 0;
+ addCredential(start);
+ };
+
+ $scope.updateExample = function () {
+ var start = ($scope.skipFirstRow) ? 1 : 0;
+ $scope.inspectCredential($scope.parsed_csv[start]);
+ }
+ }]);
+}()); \ No newline at end of file
diff --git a/js/app/controllers/settings.js b/js/app/controllers/settings.js
index 01b17d2a..96742330 100644
--- a/js/app/controllers/settings.js
+++ b/js/app/controllers/settings.js
@@ -36,6 +36,8 @@
function ($scope, $rootScope, SettingsService, VaultService, CredentialService, $location, $routeParams, $http, EncryptService, NotificationService, $sce, $translate) {
$scope.vault_settings = {};
$scope.new_vault_name = '';
+ $scope.showGenericImport = false;
+
$scope.active_vault = VaultService.getActiveVault();
if (!SettingsService.getSetting('defaultVault') || !SettingsService.getSetting('defaultVaultPass')) {
if (!$scope.active_vault) {
diff --git a/js/app/directives/autoscroll.js b/js/app/directives/autoscroll.js
index 714bb225..38cd9a11 100644
--- a/js/app/directives/autoscroll.js
+++ b/js/app/directives/autoscroll.js
@@ -35,9 +35,9 @@
scope: {
autoScroll: '='
},
- link: function postLink (scope) {
+ link: function postLink (scope, el) {
scope.$watch('autoScroll', function () {
- $('#import_log').scrollTop($('#import_log')[0].scrollHeight);
+ $(el).scrollTop($(el)[0].scrollHeight);
}, true);
}
};
diff --git a/js/app/directives/credentialtemplate.js b/js/app/directives/credentialtemplate.js
new file mode 100644
index 00000000..66f47271
--- /dev/null
+++ b/js/app/directives/credentialtemplate.js
@@ -0,0 +1,47 @@
+/**
+ * Nextcloud - passman
+ *
+ * @copyright Copyright (c) 2016, Sander Brand (brantje@gmail.com)
+ * @copyright Copyright (c) 2016, Marcos Zuriaga Miguel (wolfi@wolfi.es)
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+(function () {
+ 'use strict';
+ /**
+ * @ngdoc directive
+ * @name passmanApp.directive:passwordGen
+ * @description
+ * # passwordGen
+ */
+ angular.module('passmanApp')
+ .directive('credentialTemplate', [function () {
+ return {
+ templateUrl: 'views/partials/credential_template.html',
+ replace: true,
+ restrict: 'A',
+ scope: {
+ credential: '=credentialTemplate'
+ },
+
+ link: function (scope, element, attrs) {
+ console.log(attrs.showLabel)
+ scope.showLabel = (attrs.hasOwnProperty('showLabel'));
+ }
+ };
+ }]);
+}()); \ No newline at end of file
diff --git a/js/app/directives/fileselect.js b/js/app/directives/fileselect.js
index c7dfcf1c..20ecc0f1 100644
--- a/js/app/directives/fileselect.js
+++ b/js/app/directives/fileselect.js
@@ -53,11 +53,13 @@
fileReader.onprogress = function (event) {
var percent = (event.loaded / event.total * 100);
- scope.$apply(scope.progress({
- file_total: event.total,
- file_loaded: event.loaded,
- file_percent: percent
- }));
+ if(scope.progress) {
+ scope.$apply(scope.progress({
+ file_total: event.total,
+ file_loaded: event.loaded,
+ file_percent: percent
+ }));
+ }
};
fileReader.onerror = function () {
diff --git a/js/templates.js b/js/templates.js
index a39e2fcc..55388a81 100644
--- a/js/templates.js
+++ b/js/templates.js
@@ -1,4 +1,4 @@
-angular.module('templates-main', ['views/credential_revisions.html', 'views/edit_credential.html', 'views/partials/forms/edit_credential/basics.html', 'views/partials/forms/edit_credential/custom_fields.html', 'views/partials/forms/edit_credential/files.html', 'views/partials/forms/edit_credential/otp.html', 'views/partials/forms/edit_credential/password.html', 'views/partials/forms/settings/export.html', 'views/partials/forms/settings/general_settings.html', 'views/partials/forms/settings/import.html', 'views/partials/forms/settings/password_settings.html', 'views/partials/forms/settings/sharing.html', 'views/partials/forms/settings/tool.html', 'views/partials/forms/share_credential/basics.html', 'views/partials/forms/share_credential/link_sharing.html', 'views/partials/password-meter.html', 'views/settings.html', 'views/share_credential.html', 'views/show_vault.html', 'views/vaults.html']);
+angular.module('templates-main', ['views/credential_revisions.html', 'views/edit_credential.html', 'views/partials/credential_template.html', 'views/partials/forms/edit_credential/basics.html', 'views/partials/forms/edit_credential/custom_fields.html', 'views/partials/forms/edit_credential/files.html', 'views/partials/forms/edit_credential/otp.html', 'views/partials/forms/edit_credential/password.html', 'views/partials/forms/settings/export.html', 'views/partials/forms/settings/general_settings.html', 'views/partials/forms/settings/generic_csv_import.html', 'views/partials/forms/settings/import.html', 'views/partials/forms/settings/password_settings.html', 'views/partials/forms/settings/sharing.html', 'views/partials/forms/settings/tool.html', 'views/partials/forms/share_credential/basics.html', 'views/partials/forms/share_credential/link_sharing.html', 'views/partials/password-meter.html', 'views/settings.html', 'views/share_credential.html', 'views/show_vault.html', 'views/vaults.html']);
angular.module('views/credential_revisions.html', []).run(['$templateCache', function ($templateCache) {
'use strict';
@@ -12,6 +12,12 @@ angular.module('views/edit_credential.html', []).run(['$templateCache', function
'<div id="controls"><div class="actions creatable"><div class="breadcrumb"><div class="crumb svg ui-droppable" data-dir="/"><a ng-click="logout()"><i class="fa fa-home"></i></a></div><div class="crumb svg" data-dir="/Test"><a ng-click="cancel()">{{active_vault.name}}</a></div><div class="crumb svg last" data-dir="/Test"><a ng-if="storedCredential.credential_id">{{ \'edit.credential\' | translate}} "{{storedCredential.label}}"</a> <a ng-if="!storedCredential.credential_id">{{ \'create.credential\' | translate}}</a></div></div></div></div><ul class="tab_header"><li ng-repeat="tab in tabs track by $index" class="tab" ng-class="{active:isActiveTab(tab)}" ng-click="onClickTab(tab)" use-theme color="\'true\'">{{tab.title}}<div class="indicator" use-theme negative="\'true\'"></div></li></ul><div class="tab_container edit_credential" use-theme type="\'border-top-color\'"><div ng-include="currentTab.url"></div><button ng-click="saveCredential()">{{ \'save\' | translate}}</button> <button ng-click="cancel()">{{ \'cancel\' | translate}}</button></div>');
}]);
+angular.module('views/partials/credential_template.html', []).run(['$templateCache', function ($templateCache) {
+ 'use strict';
+ $templateCache.put('views/partials/credential_template.html',
+ '<div class="credential-data"><div class="row" ng-show="credential.label && showLabel"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'label\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.label"></span></div></div><div class="row" ng-show="credential.username"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'account\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.username"></span></div></div><div class="row" ng-show="credential.password"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'password\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.password" secret="\'true\'"></span></div></div><div class="row" ng-show="credential.otp.secret"><div class="col-xs-4 col-md-3 col-lg-3">{{\'otp\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span otp-generator secret="credential.otp.secret"></span></div></div><div class="row" ng-show="credential.email"><div class="col-xs-4 col-md-3 col-lg-3">{{\'email\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.email"></span></div></div><div class="row" ng-show="credential.url"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'url\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.url"></span></div></div><div class="row" ng-show="credential.description"><div class="col-xs-4 col-md-3 col-lg-3">{{\'notes\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.description_html"></span></div></div><div class="row" ng-show="credential.files.length > 0"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'files\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><div ng-repeat="file in credential.files" class="link" ng-click="downloadFile(credential, file)">{{file.filename}} ({{file.size | bytes}})</div></div></div><div class="row" ng-repeat="field in credential.custom_fields"><div class="col-xs-4 col-md-3 col-lg-3">{{field.label}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="field.value" secret="field.secret" ng-if="field.field_type !== \'file\' || !field.field_type"></span> <span ng-if="field.field_type === \'file\'" class="link" ng-click="downloadFile(credential, field.value)">{{field.value.filename}} ({{field.value.size | bytes}})</span></div></div><div class="row" ng-show="credential.expire_time > 0"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'expire.time\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9">{{credential.expire_time * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row" ng-show="credential.changed"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'changed\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9">{{credential.changed * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row" ng-show="credential.created"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'created\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9">{{credential.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row"><div class="col-xs-12"><div class="tags"><span class="tag" ng-repeat="tag in credential.tags track by $index">{{tag.text}}</span></div></div></div></div>');
+}]);
+
angular.module('views/partials/forms/edit_credential/basics.html', []).run(['$templateCache', function ($templateCache) {
'use strict';
$templateCache.put('views/partials/forms/edit_credential/basics.html',
@@ -54,10 +60,16 @@ angular.module('views/partials/forms/settings/general_settings.html', []).run(['
'<div class="row"><div class="col-xs-12 col-md-6"><h3>{{ \'rename.vault\' | translate}}</h3><label>{{ \'rename.vault.name\' | translate}}</label><input type="text" ng-model="$parent.new_vault_name"> <button ng-click="saveVaultSettings()">{{ \'change\' | translate}}</button><h3>{{ \'change.vault.key\' | translate}}</h3><label>{{ \'old.vault.password\' | translate}}</label><input type="password" ng-model="oldVaultPass"><label>{{ \'new.vault.password\' | translate}}</label><password-gen ng-model="newVaultPass"></password-gen><ng-password-meter password="newVaultPass"></ng-password-meter><label>{{ \'new.vault.pw.r\' | translate}}</label><input type="password" ng-model="newVaultPass2"><div ng-show="error" class="error"><ul><li>{{error}}</li></ul></div><button ng-click="changeVaultPassword(oldVaultPass,newVaultPass,newVaultPass2)">{{ \'change\' | translate}}</button><div ng-show="change_pw.total > 0">{{\'warning.leave\' | translate}}<br>{{ \'processing\' | translate}} {{cur_state.process}}<div progress-bar="cur_state.calculated" index="cur_state.current" total="cur_state.total"></div>{{ \'total.progress\' | translate}}<div progress-bar="change_pw.percent" index="change_pw.done" total="change_pw.total"></div></div><h3>{{\'delete.vault\' | translate}}</h3><b>{{ \'vault.remove.notice\' | translate }}</b><label>{{\'vault.password\' | translate}}</label><input type="password" ng-model="$parent.delete_vault_password"> <input type="checkbox" ng-model="$parent.confirm_vault_delete"> {{\'delete.vault.checkbox\' | translate}}<br><button class="btn btn-danger" ng-click="delete_vault()">{{\'delete.vault.confirm\' | translate}}</button><div ng-show="remove_pw">{{\'deleting.pw\' | translate:translationData}}<div progress-bar="remove_pw.percent" index="remove_pw.done" total="remove_pw.total"></div></div></div><div class="col-xs-12 col-md-6"><h3>{{ \'about.passman\' | translate}}</h3><p>{{ \'version\' | translate}}: <b>{{passman_version}}</b><br><br><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=6YS8F97PETVU2" target="_blank" class="link">{{ \'donate.support\' | translate}}</a><br></p><h3>{{ \'bookmarklet\' | translate}}</h3><div><p>{{ \'bookmarklet.info1\' | translate}}<br>{{ \'bookmarklet.info2\' | translate}}<br></p></div><div><p ng-bind-html="bookmarklet" style="margin-top: 5px"></p></div></div></div>');
}]);
+angular.module('views/partials/forms/settings/generic_csv_import.html', []).run(['$templateCache', function ($templateCache) {
+ 'use strict';
+ $templateCache.put('views/partials/forms/settings/generic_csv_import.html',
+ '<div ng-controller="GenericCsvImportCtrl"><div class="row"><div class="col-xs-12 col-md-3"><div>{{ \'select.csv\' | translate}} <input type="file" file-select accept=".csv" success="csvLoaded"></div><div ng-show="parsed_csv"><span translate="parsed.csv.rows" translate-value-rows="{{ parsed_csv.length }}"></span></div><div ng-show="parsed_csv"><input type="checkbox" ng-model="skipFirstRow" ng-checked="matched"> {{ \'skip.first.row\' | translate}}</div><div ng-show="import_fields.indexOf(\'label\') === -1 && parsed_csv"><b>{{ \'import.csv.label.req\' | translate}}</b></div><div ng-show="import_fields.indexOf(\'label\') !== -1 && parsed_csv"><button class="btn btn-success" ng-disabled="importing" ng-click="startImport()"><i class="fa fa-spinner fa-spin" ng-show="importing"></i> {{ (importing) ? (\'import.importing\' | translate) : (\'import.start\' | translate) }}</button></div><div><div ng-if="import_progress.progress > 0">{{ \'upload.progress\' | translate}}<div progress-bar="import_progress.progress" index="import_progress.loaded" total="import_progress.total"></div></div></div><div><div ng-if="log" class="import_log"><textarea id="import_log" auto-scroll="log">{{log.join(\'\\n\')}}</textarea></div></div></div><div class="col-xs-12 col-md-9" ng-show="parsed_csv"><b>{{ \'first.five.lines\' | translate }}</b><br>{{ \'assign.column\' | translate }}<div class="import-table-outter"><table class="import-table"><tr ng-repeat="line in parsed_csv | limitTo:5"><td class="inspect"><i class="fa fa-search" ng-click="inspectCredential(line)" ng-if="($index > 0 && matched && import_fields.length > 0) || ($index >= 0 && !matched && import_fields.length > 0)"></i></td><td ng-repeat="prop in line track by $index">{{line[$index]}}</td></tr><tr ng-repeat="line in parsed_csv | limitTo:1"><td></td><td ng-repeat="prop in line track by $index"><select ng-model="import_fields[$index]" ng-change="updateExample()" ng-options="property.prop as property.label for property in credentialProperties"></select></td></tr></table></div><div ng-show="inspected_credential && import_fields.length > 0"><b>{{ \'example.credential\' | translate}}</b><div credential-template="inspected_credential" show-label></div></div></div></div></div>');
+}]);
+
angular.module('views/partials/forms/settings/import.html', []).run(['$templateCache', function ($templateCache) {
'use strict';
$templateCache.put('views/partials/forms/settings/import.html',
- '<div ng-controller="ImportCtrl"><div class="row"><div class="col-xs-6"><label>{{ \'import.type\' | translate}}<select ng-init="importerType" ng-model="importerType" ng-change="setImporter(importerType)"><option ng-repeat="importer in available_importers" value="{{importer}}">{{importer.name}}</option></select></label><div ng-show="selectedImporter"><b>{{ \'import.steps\' | translate }}</b><ul class="import-steps"><li ng-repeat="step in selectedImporter.exportSteps">{{step}}</li></ul></div><input ng-if="selectedImporter" type="file" file-select success="fileLoaded" error="fileLoadError" progress="fileSelectProgress"><br><button class="button" ng-click="startImport()" ng-if="selectedImporter">{{ \'import\' | translate}}</button><div ng-if="file_read_progress.percent > 0">{{ \'read.progress\' | translate}}<div progress-bar="file_read_progress.percent" index="file_read_progress.loaded" total="file_read_progress.total"></div></div><div ng-if="import_progress.progress > 0">{{ \'upload.progress\' | translate}}<div progress-bar="import_progress.progress" index="import_progress.loaded" total="import_progress.total"></div></div></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>');
+ '<div><div ng-click="showGenericImport = !showGenericImport;" class="link"><span ng-show="!showGenericImport">{{\'missing.importer\' | translate}}</span> <span ng-show="showGenericImport">{{\'missing.importer.back\' | translate}}</span></div></div><div ng-controller="ImportCtrl" ng-show="!showGenericImport"><div class="row"><div class="col-xs-6"><label>{{ \'import.type\' | translate}}<select ng-init="importerType" ng-model="importerType" ng-change="setImporter(importerType)"><option ng-repeat="importer in available_importers" value="{{importer}}">{{importer.name}}</option></select></label><div ng-show="selectedImporter"><b>{{ \'import.steps\' | translate }}</b><ul class="import-steps"><li ng-repeat="step in selectedImporter.exportSteps">{{step}}</li></ul></div><input ng-if="selectedImporter" type="file" file-select success="fileLoaded" error="fileLoadError" progress="fileSelectProgress"><br><button class="button" ng-click="startImport()" ng-if="selectedImporter">{{ \'import\' | translate}}</button><div ng-if="file_read_progress.percent > 0">{{ \'read.progress\' | translate}}<div progress-bar="file_read_progress.percent" index="file_read_progress.loaded" total="file_read_progress.total"></div></div><div ng-if="import_progress.progress > 0">{{ \'upload.progress\' | translate}}<div progress-bar="import_progress.progress" index="import_progress.loaded" total="import_progress.total"></div></div></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><div ng-include="\'views/partials/forms/settings/generic_csv_import.html\'" ng-show="showGenericImport"></div>');
}]);
angular.module('views/partials/forms/settings/password_settings.html', []).run(['$templateCache', function ($templateCache) {
@@ -113,7 +125,7 @@ angular.module('views/share_credential.html', []).run(['$templateCache', functio
angular.module('views/show_vault.html', []).run(['$templateCache', function ($templateCache) {
'use strict';
$templateCache.put('views/show_vault.html',
- '<div off-click="closeSelected()" off-click-filter="\'.download-js-link, .sidebar-shown\'"><div id="passman-controls" ng-class="{ \'sidebar-shown\': selectedCredential }"><div class="breadcrumb"><div class="breadcrumb"><div class="crumb svg ui-droppable" data-dir="/"><a><i class="fa fa-home"></i></a></div><div class="crumb svg last" ng-click="clearState()"><span>{{active_vault.name}}</span></div></div></div><div class="actions creatable"><span ng-click="addCredential()" class="button new"><span>+</span></span></div><div class="title" credential-counter="filtered_credentials" vault="active_vault" delete-time="delete_time" filters="filterOptions"></div><div class="searchboxContainer" ng-init="filterOptionShown = false;" off-click="filterOptionShown = false;"><input type="text" ng-model="filterOptions.filterText" class="searchbox" id="searchBox" placeholder="{{\'search.credential\' | translate}}" select-on-click clear-btn ng-click="filterOptionShown = true;"><div class="searchOptions" ng-show="filterOptionShown"><input type="checkbox" ng-model="filterOptions.useRegex"> {{ \'use.regex\' | translate }}</div></div><div class="viewModes"><div class="view-mode" ng-class="{\'active\': view_mode === \'list\' }" ng-click="switchViewMode(\'list\')"><i class="fa fa-list"></i></div><div class="view-mode" ng-class="{\'active\': view_mode === \'grid\' }" ng-click="switchViewMode(\'grid\')"><i class="fa fa-th-large"></i></div></div></div><div class="loaderContainer" ng-if="show_spinner"><div class="loader" use-theme type="\'border-bottom-color\'"></div></div><div ng-init="menuOpen = false;"><table class="credential-table" ng-if="view_mode === \'list\'"><tr ng-repeat="credential in filtered_credentials | orderBy:\'label\'" ng-if="showCredentialRow(credential)" ng-click="selectCredential(credential)" ng-dblclick="editCredential(credential)" ng-class="{\'selected\': selectedCredential.credential_id == credential.credential_id}"><td><span class="tags"><span class="tag" ng-repeat="tag in credential.tags_raw">{{ ::tag.text}}</span> </span><span class="icon"><i class="fa fa-lock" ng-if="!credential.acl && !credential.shared_key"></i> <i class="fa fa-share-alt" ng-if="credential.acl"></i> <i class="fa fa-share-alt-square" ng-if="credential.shared_key"></i> </span><span class="label">{{ ::credential.label}}</span></td></tr></table><ul class="grid-view" ng-if="view_mode === \'grid\'"><li class="credential" ng-repeat="credential in filtered_credentials | orderBy:\'label\'" ng-if="credential.hidden == 0 && showCredentialRow(credential)" ng-click="selectCredential(credential)" use-theme type="\'border-color\'"><div class="credential_content"><div class="label">{{ ::credential.label}}</div><div class="tags"><div class="tag" ng-repeat="tag in credential.tags_raw">{{ ::tag.text}}</div></div></div></li></ul></div><div id="app-sidebar" class="detailsView scroll-container app_sidebar" ng-show="selectedCredential"><h2>{{selectedCredential.label}}</h2><span class="close icon-close" ng-click="closeSelected()" alt="Close"></span><div class="credential-data"><div class="row" ng-show="selectedCredential.username"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'account\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedCredential.username"></span></div></div><div class="row" ng-show="selectedCredential.password"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'password\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedCredential.password" secret="\'true\'"></span></div></div><div class="row" ng-show="selectedCredential.otp.secret"><div class="col-xs-4 col-md-3 col-lg-3">{{\'otp\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span otp-generator secret="selectedCredential.otp.secret"></span></div></div><div class="row" ng-show="selectedCredential.email"><div class="col-xs-4 col-md-3 col-lg-3">{{\'email\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedCredential.email"></span></div></div><div class="row" ng-show="selectedCredential.url"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'url\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedCredential.url"></span></div></div><div class="row" ng-show="selectedCredential.description"><div class="col-xs-4 col-md-3 col-lg-3">{{\'notes\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedCredential.description_html"></span></div></div><div class="row" ng-show="selectedCredential.files.length > 0"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'files\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><div ng-repeat="file in selectedCredential.files" class="link" ng-click="downloadFile(selectedCredential, file)">{{file.filename}} ({{file.size | bytes}})</div></div></div><div class="row" ng-repeat="field in selectedCredential.custom_fields"><div class="col-xs-4 col-md-3 col-lg-3">{{field.label}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="field.value" secret="field.secret" ng-if="field.field_type !== \'file\' || !field.field_type"></span> <span ng-if="field.field_type === \'file\'" class="link" ng-click="downloadFile(selectedCredential, field.value)">{{field.value.filename}} ({{field.value.size | bytes}})</span></div></div><div class="row" ng-show="selectedCredential.expire_time > 0"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'expire.time\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9">{{selectedCredential.expire_time * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row" ng-show="selectedCredential.changed"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'changed\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9">{{selectedCredential.changed * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row" ng-show="selectedCredential.created"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'created\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9">{{selectedCredential.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row"><div class="col-xs-12"><div class="tags"><span class="tag" ng-repeat="tag in selectedCredential.tags">{{tag.text}}</span></div></div></div></div><div ng-show="selectedCredential"><div><button class="button" ng-click="editCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && hasPermission(selectedCredential.acl.permissions, permissions.permissions.WRITE)"><span class="fa fa-edit"></span> {{ \'edit\' | translate}}</button> <button class="button" ng-click="deleteCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && hasPermission(selectedCredential.acl.permissions, permissions.permissions.WRITE)"><span class="fa fa-trash"></span> {{ \'delete\' | translate}}</button> <button class="button" ng-click="shareCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && selectedCredential.acl === undefined &&\n' +
+ '<div off-click="closeSelected()" off-click-filter="\'.download-js-link, .sidebar-shown\'"><div id="passman-controls" ng-class="{ \'sidebar-shown\': selectedCredential }"><div class="breadcrumb"><div class="breadcrumb"><div class="crumb svg ui-droppable" data-dir="/"><a><i class="fa fa-home"></i></a></div><div class="crumb svg last" ng-click="clearState()"><span>{{active_vault.name}}</span></div></div></div><div class="actions creatable"><span ng-click="addCredential()" class="button new"><span>+</span></span></div><div class="title" credential-counter="filtered_credentials" vault="active_vault" delete-time="delete_time" filters="filterOptions"></div><div class="searchboxContainer" ng-init="filterOptionShown = false;" off-click="filterOptionShown = false;"><input type="text" ng-model="filterOptions.filterText" class="searchbox" id="searchBox" placeholder="{{\'search.credential\' | translate}}" select-on-click clear-btn ng-click="filterOptionShown = true;"><div class="searchOptions" ng-show="filterOptionShown"><input type="checkbox" ng-model="filterOptions.useRegex"> {{ \'use.regex\' | translate }}</div></div><div class="viewModes"><div class="view-mode" ng-class="{\'active\': view_mode === \'list\' }" ng-click="switchViewMode(\'list\')"><i class="fa fa-list"></i></div><div class="view-mode" ng-class="{\'active\': view_mode === \'grid\' }" ng-click="switchViewMode(\'grid\')"><i class="fa fa-th-large"></i></div></div></div><div class="loaderContainer" ng-if="show_spinner"><div class="loader" use-theme type="\'border-bottom-color\'"></div></div><div ng-init="menuOpen = false;"><table class="credential-table" ng-if="view_mode === \'list\'"><tr ng-repeat="credential in filtered_credentials | orderBy:\'label\'" ng-if="showCredentialRow(credential)" ng-click="selectCredential(credential)" ng-dblclick="editCredential(credential)" ng-class="{\'selected\': selectedCredential.credential_id == credential.credential_id}"><td><span class="tags"><span class="tag" ng-repeat="tag in credential.tags_raw">{{ ::tag.text}}</span> </span><span class="icon"><i class="fa fa-lock" ng-if="!credential.acl && !credential.shared_key"></i> <i class="fa fa-share-alt" ng-if="credential.acl"></i> <i class="fa fa-share-alt-square" ng-if="credential.shared_key"></i> </span><span class="label">{{ ::credential.label}}</span></td></tr></table><ul class="grid-view" ng-if="view_mode === \'grid\'"><li class="credential" ng-repeat="credential in filtered_credentials | orderBy:\'label\'" ng-if="credential.hidden == 0 && showCredentialRow(credential)" ng-click="selectCredential(credential)" use-theme type="\'border-color\'"><div class="credential_content"><div class="label">{{ ::credential.label}}</div><div class="tags"><div class="tag" ng-repeat="tag in credential.tags_raw">{{ ::tag.text}}</div></div></div></li></ul></div><div id="app-sidebar" class="detailsView scroll-container app_sidebar" ng-show="selectedCredential"><h2>{{selectedCredential.label}}</h2><span class="close icon-close" ng-click="closeSelected()" alt="Close"></span><div credential-template="selectedCredential"></div><div ng-show="selectedCredential"><div><button class="button" ng-click="editCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && hasPermission(selectedCredential.acl.permissions, permissions.permissions.WRITE)"><span class="fa fa-edit"></span> {{ \'edit\' | translate}}</button> <button class="button" ng-click="deleteCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && hasPermission(selectedCredential.acl.permissions, permissions.permissions.WRITE)"><span class="fa fa-trash"></span> {{ \'delete\' | translate}}</button> <button class="button" ng-click="shareCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && selectedCredential.acl === undefined &&\n' +
' (settings.user_sharing_enabled === 1 || settings.user_sharing_enabled === \'1\' || settings.link_sharing_enabled === 1 || settings.link_sharing_enabled === \'1\')"><span class="fa fa-share"></span> {{ \'share\' | translate}}</button> <button class="button" ng-click="getRevisions(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && hasPermission(selectedCredential.acl.permissions, permissions.permissions.HISTORY)"><span class="fa fa-undo"></span> {{ \'revisions\' | translate}}</button> <button class="button" ng-if="selectedCredential.delete_time > 0" ng-click="recoverCredential(selectedCredential) && hasPermission(selectedCredential.acl.permissions, permissions.permissions.WRITE)"><span class="fa fa-recycle"></span> {{\'recover\' | translate}}</button> <button class="button" ng-if="selectedCredential.delete_time > 0" ng-click="destroyCredential(selectedCredential)"><span class="fa fa-bomb"></span> {{\'destroy\' | translate}}</button></div></div></div></div><div class="share_popup" style="display: none">{{ \'sharereq.title\' | translate}}<br>{{ \'sharereq.line1\' | translate}}<br>{{ \'sharereq.line2\' | translate}} {{active_vault.vault_id}}<table class="table"><thead><tr><td>{{ \'label\' | translate}}</td><td>{{ \'permissions\' | translate}}</td><td>{{ \'received.from\' | translate}}</td><td>{{ \'date\' | translate}}</td></tr></thead><tr ng-repeat="share_request in incoming_share_requests" ng-if="share_request.target_vault_id == active_vault.vault_id"><td>{{share_request.credential_label}}</td><td>{{share_request.permissions}}</td><td>{{share_request.from_user_id}}</td><td>{{share_request.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</td><td><span class="link" ng-click="acceptShareRequest(share_request)">{{ \'accept\' | translate}}</span> | <span class="link" ng-click="declineShareRequest(share_request)">{{ \'decline\' | translate}}</span></td></tr></table></div>');
}]);
diff --git a/sass/settings.scss b/sass/settings.scss
index 6d29e792..51f1a415 100644
--- a/sass/settings.scss
+++ b/sass/settings.scss
@@ -20,31 +20,50 @@
*
*/
-.scan-result-table{
+.scan-result-table {
margin-top: 10px;
- .score{
+ .score {
padding-left: 0px;
padding-right: 15px;
}
}
-.error{
+
+.error {
color: #ce3702;
}
+
.import_log {
max-height: 600px;
overflow-y: auto;
- textarea{
+ textarea {
width: 90%;
height: 200px;
}
}
-.tab_container.settings{
+
+.tab_container.settings {
margin-bottom: 50px;
}
-.import-steps{
+
+.import-steps {
padding-left: 16px;
- li{
+ li {
list-style-type: disc;
}
margin-bottom: 10px;
+}
+.import-table-outter {
+ overflow-x: scroll;
+}
+.import-table {
+ padding-right: 15px;
+ .inspect{
+ text-align: center;
+ width: 25px;
+ cursor: pointer;
+ }
+ th, td {
+ text-align: left;
+ padding: 3px 5px;
+ }
} \ No newline at end of file
diff --git a/templates/main.php b/templates/main.php
index ec91a71f..412a54d1 100644
--- a/templates/main.php
+++ b/templates/main.php
@@ -45,6 +45,7 @@ script('passman', 'app/controllers/revision');
script('passman', 'app/controllers/settings');
script('passman', 'app/controllers/import');
script('passman', 'app/controllers/export');
+script('passman', 'app/controllers/generic-csv-importer');
script('passman', 'app/filters/range');
script('passman', 'app/filters/propsfilter');
script('passman', 'app/filters/byte');
@@ -76,6 +77,7 @@ script('passman', 'app/directives/clickselect');
script('passman', 'app/directives/colorfromstring');
script('passman', 'app/directives/credentialcounter');
script('passman', 'app/directives/clearbutton2');
+script('passman', 'app/directives/credentialtemplate');
script('passman', 'importers/import-main');
script('passman', 'importers/importer-keepasscsv');
script('passman', 'importers/importer-lastpasscsv');
diff --git a/templates/views/partials/credential_template.html b/templates/views/partials/credential_template.html
new file mode 100644
index 00000000..43cad306
--- /dev/null
+++ b/templates/views/partials/credential_template.html
@@ -0,0 +1,96 @@
+<div class="credential-data">
+ <div class="row" ng-show="credential.label && showLabel">
+ <div class="col-xs-4 col-md-3 col-lg-3">{{ 'label' | translate }}</div>
+ <div class="col-xs-8 col-md-9 col-lg-9"><span credential-field
+ value="credential.label"></span></div>
+ </div>
+
+ <div class="row" ng-show="credential.username">
+ <div class="col-xs-4 col-md-3 col-lg-3">{{ 'account' | translate }}</div>
+ <div class="col-xs-8 col-md-9 col-lg-9"><span credential-field
+ value="credential.username"></span></div>
+ </div>
+
+
+ <div class="row" ng-show="credential.password">
+ <div class="col-xs-4 col-md-3 col-lg-3">{{ 'password' | translate }}</div>
+ <div class="col-xs-8 col-md-9 col-lg-9">
+ <span credential-field value="credential.password" secret="'true'">
+
+ </span>
+ </div>
+ </div>
+
+ <div class="row" ng-show="credential.otp.secret">
+ <div class="col-xs-4 col-md-3 col-lg-3">{{'otp' | translate}}</div>
+ <div class="col-xs-8 col-md-9 col-lg-9"><span otp-generator
+ secret="credential.otp.secret"></span></div>
+ </div>
+
+
+ <div class="row" ng-show="credential.email">
+ <div class="col-xs-4 col-md-3 col-lg-3">{{'email' | translate}}</div>
+ <div class="col-xs-8 col-md-9 col-lg-9"><span credential-field
+ value="credential.email"></span></div>
+ </div>
+
+ <div class="row" ng-show="credential.url">
+ <div class="col-xs-4 col-md-3 col-lg-3">{{ 'url' | translate}}</div>
+ <div class="col-xs-8 col-md-9 col-lg-9"><span credential-field
+ value="credential.url"></span></div>
+ </div>
+
+ <div class="row" ng-show="credential.description">
+ <div class="col-xs-4 col-md-3 col-lg-3">{{'notes' | translate}}</div>
+ <div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.description_html"></span></div>
+ </div>
+
+ <div class="row" ng-show="credential.files.length > 0">
+ <div class="col-xs-4 col-md-3 col-lg-3">{{ 'files' | translate}}</div>
+ <div class="col-xs-8 col-md-9 col-lg-9"><div ng-repeat="file in credential.files"
+ class="link" ng-click="downloadFile(credential, file)">
+ {{file.filename}} ({{file.size | bytes}})
+ </div></div>
+ </div>
+
+ <div class="row" ng-repeat="field in credential.custom_fields">
+ <div class="col-xs-4 col-md-3 col-lg-3">{{field.label}}</div>
+ <div class="col-xs-8 col-md-9 col-lg-9">
+ <span credential-field value="field.value" secret="field.secret" ng-if="field.field_type !== 'file' || !field.field_type"></span>
+ <span ng-if="field.field_type === 'file'" class="link" ng-click="downloadFile(credential, field.value)">{{field.value.filename}} ({{field.value.size | bytes}})</span>
+
+ </div>
+ </div>
+
+
+ <div class="row" ng-show="credential.expire_time > 0">
+ <div class="col-xs-4 col-md-3 col-lg-3">{{ 'expire.time' | translate }}</div>
+ <div class="col-xs-8 col-md-9 col-lg-9">
+ {{credential.expire_time * 1000 | date:'dd-MM-yyyy @ HH:mm:ss'}}
+ </div>
+ </div>
+
+
+ <div class="row" ng-show="credential.changed">
+ <div class="col-xs-4 col-md-3 col-lg-3">{{ 'changed' | translate}}</div>
+ <div class="col-xs-8 col-md-9 col-lg-9">
+ {{credential.changed * 1000 | date:'dd-MM-yyyy @ HH:mm:ss'}}
+ </div>
+ </div>
+
+
+ <div class="row" ng-show="credential.created">
+ <div class="col-xs-4 col-md-3 col-lg-3">{{ 'created' | translate}}</div>
+ <div class="col-xs-8 col-md-9 col-lg-9">
+ {{credential.created * 1000 | date:'dd-MM-yyyy @ HH:mm:ss'}}
+ </div>
+ </div>
+
+ <div class="row">
+ <div class="col-xs-12">
+ <div class="tags">
+ <span class="tag" ng-repeat="tag in credential.tags track by $index">{{tag.text}}</span>
+ </div>
+ </div>
+ </div>
+</div> \ No newline at end of file
diff --git a/templates/views/partials/forms/settings/generic_csv_import.html b/templates/views/partials/forms/settings/generic_csv_import.html
new file mode 100644
index 00000000..3dfa1ab9
--- /dev/null
+++ b/templates/views/partials/forms/settings/generic_csv_import.html
@@ -0,0 +1,68 @@
+<div ng-controller="GenericCsvImportCtrl">
+ <div class="row">
+ <div class="col-xs-12 col-md-3">
+ <div>{{ 'select.csv' | translate}}
+ <input type="file" file-select accept=".csv"
+ success="csvLoaded">
+ </div>
+ <div ng-show="parsed_csv">
+ <span translate="parsed.csv.rows" translate-value-rows="{{ parsed_csv.length }}">
+
+ </span>
+ </div>
+ <div ng-show="parsed_csv">
+ <input type="checkbox" ng-model="skipFirstRow" ng-checked="matched"> {{ 'skip.first.row' | translate}}
+ </div>
+ <div ng-show="import_fields.indexOf('label') === -1 && parsed_csv">
+ <b>{{ 'import.csv.label.req' | translate}}</b>
+ </div>
+ <div ng-show="import_fields.indexOf('label') !== -1 && parsed_csv">
+ <button class="btn btn-success" ng-disabled="importing" ng-click="startImport()"><i class="fa fa-spinner fa-spin" ng-show="importing"></i> {{ (importing) ? ('import.importing' | translate) : ('import.start' | translate) }}</button>
+ </div>
+ <div>
+ <div ng-if="import_progress.progress > 0">
+ {{ 'upload.progress' | translate}}
+ <div progress-bar="import_progress.progress" index="import_progress.loaded" total="import_progress.total"></div>
+ </div>
+ </div>
+ <div>
+ <div ng-if="log" class="import_log">
+ <textarea id="import_log" auto-scroll="log">{{log.join('\n')}}</textarea>
+ </div>
+ </div>
+ </div>
+ <div class="col-xs-12 col-md-9" ng-show="parsed_csv">
+ <b>{{ 'first.five.lines' | translate }}</b><br />
+ {{ 'assign.column' | translate }}
+ <div class="import-table-outter">
+ <table class="import-table">
+ <tr ng-repeat="line in parsed_csv | limitTo:5">
+ <td class="inspect"><i class="fa fa-search"
+ ng-click="inspectCredential(line)"
+ ng-if="($index > 0 && matched && import_fields.length > 0) || ($index >= 0 && !matched && import_fields.length > 0)"></i>
+ </td>
+ <td ng-repeat="prop in line track by $index">
+ {{line[$index]}}
+ </td>
+ </tr>
+ <tr ng-repeat="line in parsed_csv | limitTo:1">
+ <td></td>
+ <td ng-repeat="prop in line track by $index">
+ <select ng-model="import_fields[$index]" ng-change="updateExample()"
+ ng-options="property.prop as property.label for property in credentialProperties">
+
+ </select>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div ng-show="inspected_credential && import_fields.length > 0">
+ <b>{{ 'example.credential' | translate}}</b>
+ <div credential-template="inspected_credential" show-label>
+
+ </div>
+ </div>
+ </div>
+
+ </div>
+</div> \ No newline at end of file
diff --git a/templates/views/partials/forms/settings/import.html b/templates/views/partials/forms/settings/import.html
index 3e66d8d2..97c01169 100644
--- a/templates/views/partials/forms/settings/import.html
+++ b/templates/views/partials/forms/settings/import.html
@@ -1,4 +1,11 @@
-<div ng-controller="ImportCtrl">
+<div>
+ <div ng-click="showGenericImport = !showGenericImport;" class="link">
+ <span ng-show="!showGenericImport">{{'missing.importer' | translate}}</span>
+ <span ng-show="showGenericImport">{{'missing.importer.back' | translate}}</span>
+ </div>
+</div>
+
+<div ng-controller="ImportCtrl" ng-show="!showGenericImport">
<div class="row">
<div class="col-xs-6">
<label>{{ 'import.type' | translate}}
@@ -8,7 +15,9 @@
value="{{importer}}">
{{importer.name}}
</option>
- </select></label>
+ </select>
+ </label>
+
<div ng-show="selectedImporter">
<b>{{ 'import.steps' | translate }}</b>
<ul class="import-steps">
@@ -37,4 +46,5 @@
</div>
</div>
</div>
-</div> \ No newline at end of file
+</div>
+<div ng-include="'views/partials/forms/settings/generic_csv_import.html'" ng-show="showGenericImport"></div> \ No newline at end of file
diff --git a/templates/views/show_vault.html b/templates/views/show_vault.html
index a584d46b..578b1e5f 100644
--- a/templates/views/show_vault.html
+++ b/templates/views/show_vault.html
@@ -87,96 +87,8 @@
<span class="close icon-close" ng-click="closeSelected()"
alt="Close"></span>
- <div class="credential-data">
- <div class="row" ng-show="selectedCredential.username">
- <div class="col-xs-4 col-md-3 col-lg-3">{{ 'account' | translate }}</div>
- <div class="col-xs-8 col-md-9 col-lg-9"><span credential-field
- value="selectedCredential.username"></span></div>
- </div>
-
-
- <div class="row" ng-show="selectedCredential.password">
- <div class="col-xs-4 col-md-3 col-lg-3">{{ 'password' | translate }}</div>
- <div class="col-xs-8 col-md-9 col-lg-9">
- <span credential-field value="selectedCredential.password" secret="'true'">
-
- </span>
- </div>
- </div>
-
-
- <div class="row" ng-show="selectedCredential.otp.secret">
- <div class="col-xs-4 col-md-3 col-lg-3">{{'otp' | translate}}</div>
- <div class="col-xs-8 col-md-9 col-lg-9"><span otp-generator
- secret="selectedCredential.otp.secret"></span></div>
- </div>
-
-
- <div class="row" ng-show="selectedCredential.email">
- <div class="col-xs-4 col-md-3 col-lg-3">{{'email' | translate}}</div>
- <div class="col-xs-8 col-md-9 col-lg-9"><span credential-field
- value="selectedCredential.email"></span></div>
- </div>
-
- <div class="row" ng-show="selectedCredential.url">
- <div class="col-xs-4 col-md-3 col-lg-3">{{ 'url' | translate}}</div>
- <div class="col-xs-8 col-md-9 col-lg-9"><span credential-field
- value="selectedCredential.url"></span></div>
- </div>
-
- <div class="row" ng-show="selectedCredential.description">
- <div class="col-xs-4 col-md-3 col-lg-3">{{'notes' | translate}}</div>
- <div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedCredential.description_html"></span></div>
- </div>
-
- <div class="row" ng-show="selectedCredential.files.length > 0">
- <div class="col-xs-4 col-md-3 col-lg-3">{{ 'files' | translate}}</div>
- <div class="col-xs-8 col-md-9 col-lg-9"><div ng-repeat="file in selectedCredential.files"
- class="link" ng-click="downloadFile(selectedCredential, file)">
- {{file.filename}} ({{file.size | bytes}})
- </div></div>
- </div>
-
- <div class="row" ng-repeat="field in selectedCredential.custom_fields">
- <div class="col-xs-4 col-md-3 col-lg-3">{{field.label}}</div>
- <div class="col-xs-8 col-md-9 col-lg-9">
- <span credential-field value="field.value" secret="field.secret" ng-if="field.field_type !== 'file' || !field.field_type"></span>
- <span ng-if="field.field_type === 'file'" class="link" ng-click="downloadFile(selectedCredential, field.value)">{{field.value.filename}} ({{field.value.size | bytes}})</span>
+ <div credential-template="selectedCredential">
- </div>
- </div>
-
-
- <div class="row" ng-show="selectedCredential.expire_time > 0">
- <div class="col-xs-4 col-md-3 col-lg-3">{{ 'expire.time' | translate }}</div>
- <div class="col-xs-8 col-md-9 col-lg-9">
- {{selectedCredential.expire_time * 1000 | date:'dd-MM-yyyy @ HH:mm:ss'}}
- </div>
- </div>
-
-
- <div class="row" ng-show="selectedCredential.changed">
- <div class="col-xs-4 col-md-3 col-lg-3">{{ 'changed' | translate}}</div>
- <div class="col-xs-8 col-md-9 col-lg-9">
- {{selectedCredential.changed * 1000 | date:'dd-MM-yyyy @ HH:mm:ss'}}
- </div>
- </div>
-
-
- <div class="row" ng-show="selectedCredential.created">
- <div class="col-xs-4 col-md-3 col-lg-3">{{ 'created' | translate}}</div>
- <div class="col-xs-8 col-md-9 col-lg-9">
- {{selectedCredential.created * 1000 | date:'dd-MM-yyyy @ HH:mm:ss'}}
- </div>
- </div>
-
- <div class="row">
- <div class="col-xs-12">
- <div class="tags">
- <span class="tag" ng-repeat="tag in selectedCredential.tags">{{tag.text}}</span>
- </div>
- </div>
- </div>
</div>