From 6767322a22bae9549b439fac40bbdbd2a2df8fee Mon Sep 17 00:00:00 2001 From: brantje Date: Fri, 17 Feb 2017 21:25:18 +0100 Subject: [PATCH] Lock vault after 3 wrong attempts (Fixes #197) Fix share button, fix shared_key not added to storedCredential after sharing (Fixes #249) Add password app importer. Fixes #248 Fix version check via proxy. Fixes #237 Fix activity app not filtering. Fixes #246 Add EnPass txt importer. Fixes #159 Fix for disabled share button Require vault key for export. Fixes #199 Indicate that sharing only works with users that have 1 or more vaults. Fixes #242 Reset tags on logout. Fixes #245 Ability to enter OTP secret manually. Fixes #198 Create teampass importer. Fixes #244 --- ISSUE_TEMPLATE.md | 4 +- README.md | 93 ++++++++++---- appinfo/app.php | 2 +- appinfo/info.xml | 2 +- controller/translationcontroller.php | 6 +- css/app.css | 21 +++ css/app.css.map | 2 +- js/app/controllers/edit_credential.js | 2 +- js/app/controllers/export.js | 12 +- js/app/controllers/menu.js | 1 + js/app/controllers/share.js | 3 + js/app/controllers/vault.js | 52 ++++++-- js/app/services/tagservice.js | 3 + js/importers/import-main.js | 16 +++ js/importers/importer-clipperz.js | 2 +- js/importers/importer-dashlanecsv.js | 2 +- js/importers/importer-enpass.js | 121 ++++++++++++++++++ js/importers/importer-keepasscsv.js | 2 +- js/importers/importer-lastpasscsv.js | 2 +- js/importers/importer-ocpasswords.js | 71 ++++++++++ js/importers/importer-passmanjson.js | 2 +- js/importers/importer-passpackcsv.js | 2 +- js/importers/importer-randomdata.js | 2 +- js/importers/importer-teampass.js | 62 +++++++++ js/importers/importer-zohocsv.js | 2 +- js/templates.js | 58 ++++----- lib/Activity.php | 37 ++++-- sass/app.scss | 11 ++ sass/credentials.scss | 3 + sass/settings.scss | 7 + sass/vaults.scss | 3 + templates/main.php | 5 +- templates/part.admin.php | 32 +++-- .../partials/forms/edit_credential/otp.html | 24 ++-- .../views/partials/forms/settings/export.html | 21 ++- .../views/partials/forms/settings/import.html | 7 +- .../forms/share_credential/basics.html | 5 + templates/views/share_credential.html | 4 +- templates/views/show_vault.html | 2 +- templates/views/vaults.html | 10 +- 40 files changed, 598 insertions(+), 120 deletions(-) create mode 100644 js/importers/importer-enpass.js create mode 100644 js/importers/importer-ocpasswords.js create mode 100644 js/importers/importer-teampass.js diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index c62509c16..a46ade7df 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -8,7 +8,7 @@ To make it possible for us to help you please fill out below information careful If you like to make a feature request, please remove the issue template. If you want to fill in a issue, remove the feature request template. --> -##Issue +## Bug report ### Steps to reproduce 1. @@ -41,10 +41,8 @@ Tell us what happens instead **cloud server:** Nextcloud or ownCloud **cloud version:** (see admin page or version.php) - - #### Browser log
Browser log diff --git a/README.md b/README.md index d2b4926d6..4a4f3388a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ #Passman +Passman is a full featured password manager. [![Build Status](https://travis-ci.org/nextcloud/passman.svg?branch=master)](https://travis-ci.org/nextcloud/passman) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/749bb288c9fd4592a73056549d44a85e)](https://www.codacy.com/app/brantje/passman?utm_source=github.com&utm_medium=referral&utm_content=nextcloud/passman&utm_campaign=Badge_Grade) @@ -6,11 +7,37 @@ [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/nextcloud/passman/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/nextcloud/passman/?branch=master) -Passman is a full featured password manager. -Features: +## Contents +* [Screenshots](https://github.com/nextcloud/passman#Screenshots) +* [Features](https://github.com/nextcloud/passman#features) +* [External apps](https://github.com/nextcloud/passman#external-apps) +* [Security](https://github.com/nextcloud/passman#security) + * [Password generation](https://github.com/nextcloud/passman#password-generation) + * [Storing credentials](https://github.com/nextcloud/passman#storing-credentials) +* [API](https://github.com/nextcloud/passman#api) +* [Docker](https://github.com/nextcloud/passman#docker) +* [Maintainers](https://github.com/nextcloud/passman#main-developers) +* [Contributors](https://github.com/nextcloud/passman#contributors) + + + + +##Screenshots +![Logged in to vault](http://i.imgur.com/ciShQZg.png) + +![Credential selected](http://i.imgur.com/3tENldT.png) + +![Edit credential](http://i.imgur.com/Iwm3hUe.png) + +![Password tool](http://i.imgur.com/ZYkN70r.png) + +For more screenshots: [Click here](http://imgur.com/a/giKVt) + + +## Features: - Vaults - Vault key is never sent to the server -- Credentials are stored with 256 bit AES +- Credentials are stored with 256 bit AES (see [security](https://github.com/nextcloud/passman#security)) - Ability to add custom fields to credentials - Built-in OTP(One Time Password) generator - Password analyzer @@ -21,7 +48,9 @@ Features: - DashLane - ZOHO - Clipperz.is - + - EnPass + - [ocPasswords](https://github.com/fcturner/passwords) + For a demo of this app visit [https://demo.passman.cc](https://demo.passman.cc) @@ -29,10 +58,10 @@ For a demo of this app visit [https://demo.passman.cc](https://demo.passman.cc) - NextCloud 10 / 11 - ownCloud 9.1+ -## Browser extensions -At this moment we don't have any extensions available, sorry! -However, if you're interested in helping us (or you want to guide us while building) -Check out: https://github.com/nextcloud/passman-chrome-extension + +## External apps +- [Firefox / chrome extension](https://github.com/nextcloud/passman-webextension) +- [Android app](https://github.com/nextcloud/passman-android) ## Supported databases @@ -44,28 +73,46 @@ Check out: https://github.com/nextcloud/passman-chrome-extension Untested databases: - pgsql +## Security -##Screenshots -![Logged in to vault](http://i.imgur.com/ciShQZg.png) +### Password generation +Passman features a build in password generator. +Not it only generates passwords, but it also measures their strength using [zxcvbn](https://github.com/dropbox/zxcvbn). +![](http://i.imgur.com/2qVBUfM.png) -![Credential selected](http://i.imgur.com/3tENldT.png) +Generate passwords as you like +![](http://i.imgur.com/jcRicOV.png) +Passwords are generated using the random functions from `sjcl`. -![Edit credential](http://i.imgur.com/Iwm3hUe.png) -![Password tool](http://i.imgur.com/ZYkN70r.png) +### Storing credentials +All passwords are encrypted client side using [sjcl](https://github.com/bitwiseshiftleft/sjcl) which uses AES-256 bit. +Users supply a vault key which is feed into sjcl as encryption key. +After the credentials are encrypted they are send to the server, there they will be encrypted again. +This time using the following routine: +- A key is generated using `passwordsalt` and `secret` from config.php *so back those up* +- Then the key is [stretched](http://en.wikipedia.org/wiki/Key_stretching) using [Password-Based Key Derivation Function 2](http://en.wikipedia.org/wiki/PBKDF2) (PBKDF2). +- [Encrypt-then-MAC](http://en.wikipedia.org/wiki/Authenticated_encryption#Approaches_to_Authenticated_Encryption) (EtM) is used for ensuring the authenticity of the encrypted data. +- Uses openssl with the `aes-256-cbc` ciper. +- [Initialization vector](http://en.wikipedia.org/wiki/Initialization_vector) (IV) is hidden +- [Double Hash-based Message Authentication Code](http://en.wikipedia.org/wiki/Hash-based_message_authentication_code) (HMAC) is applied for verification of the source data. -For more screenshots: [Click here](http://imgur.com/a/giKVt) -## Encryption (server side) -All passwords are encrypted client side AND server side. -This means that if you move to another server you have to backup the following from config.php -- `passwordsalt` -- `secret` +### Sharing credentials. +Passman allows users to share passwords (this can be turned off by an administrator). -## Support Passman -If you like passman, support us via [patreon](https://www.patreon.com/user?u=4833592) or [paypal](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=6YS8F97PETVU2) +## API +For developers passman offers an [api](https://github.com/nextcloud/passman/wiki/API). + +## Support Passman +Passman is open source, but we would gladly accept a beer (or pizza!) +Please consider donating via +- [Paypal](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=6YS8F97PETVU2) +- [Patreon](https://www.patreon.com/user?u=4833592) +- Bitcoin: 1H2c5tkGX54n48yEtM4Wm4UrAGTW85jQpe + ## Code reviews If you have any improvements regarding our code. Please do the following @@ -77,8 +124,8 @@ Please do the following Or if you're feeling lazy, create an issue, and we'll think about it. ## Docker -To run passman with docker you can use `docker run -p 8080:80 -p 8443:443 brantje/passman` -To use your own SSL cert mount them as below +To run passman with docker you can use `docker run -p 8080:80 -p 8443:443 brantje/passman` +You have to supply your own ssl certs. Example: `docker run -p 8080:80 -p 8443:443 -v /directory/cert.pem:/data/ssl/cert.pem -v /directory/cert.key:/data/ssl/cert.key brantje/passman` diff --git a/appinfo/app.php b/appinfo/app.php index 1403c4ae1..07e41ac2a 100644 --- a/appinfo/app.php +++ b/appinfo/app.php @@ -40,7 +40,7 @@ $manager = \OC::$server->getActivityManager(); $manager->registerExtension(function() { return new Activity( - \OC::$server->getL10NFactory() + \OC::$server->getURLGenerator() ); }); diff --git a/appinfo/info.xml b/appinfo/info.xml index 941e967f9..88c5dc042 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -18,7 +18,7 @@ For an demo of this app visit [https://demo.passman.cc](https://demo.passman.cc) ]]> AGPL - 2.0.2 + 2.1.0 Sander Brand Marcos Zuriaga Passman diff --git a/controller/translationcontroller.php b/controller/translationcontroller.php index 75515b6f0..e87d73e7a 100644 --- a/controller/translationcontroller.php +++ b/controller/translationcontroller.php @@ -69,6 +69,7 @@ public function getLanguageStrings() { // js/app/controllers/import.js 'import.file.read' => $this->trans->t('File read successfully!'), + 'import.steps' => $this->trans->t('Follow the following steps to import your file'), 'import.no.label' => $this->trans->t('Credential has no label, skipping'), 'import.adding' => $this->trans->t('Adding {{credential}}'), @@ -144,7 +145,7 @@ public function getLanguageStrings() { // templates/views/partials/edit_credential/otp.html - 'upload.qr' => $this->trans->t('Upload your OTP qr code'), + 'upload.qr' => $this->trans->t('Upload or enter your OTP secret'), 'current.qr' => $this->trans->t('Current OTP settings'), 'issuer' => $this->trans->t('Issuer'), 'secret' => $this->trans->t('Secret'), @@ -173,6 +174,7 @@ public function getLanguageStrings() { // templates/views/partials/forms/settings/export.html 'export.type' => $this->trans->t('Export type'), 'export' => $this->trans->t('Export'), + 'export.confirm.text' => $this->trans->t('Enter vault password to confirm export.'), // templates/views/partials/forms/settings/general_settings.html 'rename.vault' => $this->trans->t('Rename vault'), @@ -226,6 +228,7 @@ public function getLanguageStrings() { // templates/vieuws/partials/forms/share_credential/basics.html 'search.u.g' => $this->trans->t('Search users or groups...'), + 'search.result.missing' => $this->trans->t('Missing users? Only users that have vaults are shown.'), 'cyphering' => $this->trans->t('Cyphering'), 'uploading' => $this->trans->t('Uploading'), 'user' => $this->trans->t('User'), @@ -325,6 +328,7 @@ public function getLanguageStrings() { 'accept' => $this->trans->t('Accept'), 'decline' => $this->trans->t('Decline'), 'session.time.left' => $this->trans->t('You have {{session_time}} left before logout.'), + 'vault.locked' => $this->trans->t('Your vault has been locked for {{time}} because of {{tries}} failed attempts!'), // templates/views/vaults.html 'last.access' => $this->trans->t('Last accessed'), diff --git a/css/app.css b/css/app.css index 9c8fd880e..20a584d4a 100644 --- a/css/app.css +++ b/css/app.css @@ -326,6 +326,8 @@ display: inline-block; } .vault_wrapper .login_form .button { margin-top: 10px; } + .vault_wrapper .login_opts { + margin-bottom: 10px; } @media screen and (max-width: 768px) { .vault_wrapper { @@ -637,6 +639,8 @@ #app-content #app-content-wrapper .edit_credential .custom_fields table tr td, #app-content #app-content-wrapper .edit_credential .files table tr td { height: 50px; vertical-align: middle; } + #app-content #app-content-wrapper .edit_credential .otpText { + padding-right: 10px; } #app-content #app-content-wrapper .app_sidebar { padding: 10px; overflow-y: auto; } @@ -882,6 +886,12 @@ .tab_container.settings { margin-bottom: 50px; } +.import-steps { + padding-left: 16px; + margin-bottom: 10px; } + .import-steps li { + list-style-type: disc; } + #app-settings-content:not(.ng-hide) { height: 90px; display: inherit !important; @@ -943,4 +953,15 @@ input[type="checkbox"] { min-height: inherit; } +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; } + +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; } + /*# sourceMappingURL=app.css.map */ diff --git a/css/app.css.map b/css/app.css.map index 4e5b4fc71..2f37db9e9 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/edit_credential.js b/js/app/controllers/edit_credential.js index 73593b046..f084b24eb 100644 --- a/js/app/controllers/edit_credential.js +++ b/js/app/controllers/edit_credential.js @@ -72,7 +72,7 @@ url: 'views/partials/forms/edit_credential/basics.html', color: 'blue' }; - + $scope.otpType = 'qrcode'; $translate(['general', 'password', 'custom.fields','files','otp']).then(function (translations) { $scope.tabs = [{ title: translations.general, diff --git a/js/app/controllers/export.js b/js/app/controllers/export.js index c66523c83..b53b19b1c 100644 --- a/js/app/controllers/export.js +++ b/js/app/controllers/export.js @@ -34,7 +34,7 @@ .controller('ExportCtrl', ['$scope', '$window', 'CredentialService', 'VaultService', '$translate', function ($scope, $window, CredentialService, VaultService, $translate) { $scope.available_exporters = []; $scope.active_vault = VaultService.getActiveVault(); - + $scope.confirm_key = ''; $scope.$watch(function () { return $window.PassmanExporter; @@ -58,6 +58,13 @@ $scope.startExport = function () { + $scope.error = false; + if(VaultService.getActiveVault().vaultKey !== $scope.confirm_key){ + var msg = $translate.instant('invalid.vault.key'); + $scope.error = msg; + _log(msg); + return; + } _log($translate.instant('export.starting')); var _credentials = []; VaultService.getVault(VaultService.getActiveVault()).then(function (vault) { @@ -67,7 +74,8 @@ for (var i = 0; i < vault.credentials.length; i++) { var _credential = angular.copy(vault.credentials[i]); if (_credential.hidden === 0) { - _credential = CredentialService.decryptCredential(_credential); + var key = CredentialService.getSharedKeyFromCredential(_credential); + _credential = CredentialService.decryptCredential(_credential, key); _credentials.push(_credential); } } diff --git a/js/app/controllers/menu.js b/js/app/controllers/menu.js index 944dc54f4..8bc8f391c 100644 --- a/js/app/controllers/menu.js +++ b/js/app/controllers/menu.js @@ -36,6 +36,7 @@ function ($scope, VaultService, $location, $rootScope, TagService, SettingsService) { $rootScope.logout = function () { SettingsService.setSetting('defaultVaultPass', false); + TagService.resetTags(); $rootScope.$broadcast('logout'); $location.path('/'); }; diff --git a/js/app/controllers/share.js b/js/app/controllers/share.js index 9140d34fd..0d9e166ff 100644 --- a/js/app/controllers/share.js +++ b/js/app/controllers/share.js @@ -254,6 +254,8 @@ CredentialService.updateCredential(c, true).then(function () { NotificationService.showNotification($translate.instant('credential.unshared'), 4000); $scope.sharing_complete = true; + $scope.storedCredential.shared_key = null; + $scope.share_settings.credentialSharedWithUserAndGroup = []; }); }); }; @@ -365,6 +367,7 @@ _credential.skip_revision = true; _credential.shared_key = EncryptService.encryptString(key); CredentialService.updateCredential(_credential, true).then(function () { + $scope.storedCredential.shared_key = _credential.shared_key; NotificationService.showNotification($translate.instant('credential.shared'), 4000); $scope.sharing_complete = true; }); diff --git a/js/app/controllers/vault.js b/js/app/controllers/vault.js index 6dba1c691..235017aa4 100644 --- a/js/app/controllers/vault.js +++ b/js/app/controllers/vault.js @@ -31,7 +31,8 @@ * Controller of the passmanApp */ angular.module('passmanApp') - .controller('VaultCtrl', ['$scope', 'VaultService', 'SettingsService', 'CredentialService', '$location', 'ShareService', 'EncryptService', '$translate', '$rootScope', function ($scope, VaultService, SettingsService, CredentialService, $location, ShareService, EncryptService, $translate, $rootScope) { + .controller('VaultCtrl', ['$scope', 'VaultService', 'SettingsService', 'CredentialService', '$location', 'ShareService', 'EncryptService', '$translate', '$rootScope', '$interval', + function ($scope, VaultService, SettingsService, CredentialService, $location, ShareService, EncryptService, $translate, $rootScope, $interval) { VaultService.getVaults().then(function (vaults) { $scope.vaults = vaults; if (SettingsService.getSetting('defaultVault') != null) { @@ -50,6 +51,10 @@ if (SettingsService.getSetting('defaultVaultPass')) { $location.path('/vault/' + vault.guid); } + $scope.vault_tries[vault.guid] = { + tries: 0, + timeout: 0 + }; break; } } @@ -74,12 +79,12 @@ var settingsLoaded = function () { $scope.minimal_value_key_strength = SettingsService.getSetting('vault_key_strength'); - $translate(key_strengths[SettingsService.getSetting('vault_key_strength')]).then(function(translation){ + $translate(key_strengths[SettingsService.getSetting('vault_key_strength')]).then(function (translation) { $scope.required_score = {'strength': translation}; }); }; - if(!SettingsService.getSetting('settings_loaded')){ + if (!SettingsService.getSetting('settings_loaded')) { $rootScope.$on('settings_loaded', function () { settingsLoaded(); }); @@ -107,7 +112,7 @@ } }; - $scope.toggleAutoLogout = function(){ + $scope.toggleAutoLogout = function () { $scope.auto_logout_timer = !$scope.auto_logout_timer; }; @@ -119,6 +124,12 @@ $scope.selectVault = function (vault) { $scope.list_selected_vault = vault; + if(!$scope.vault_tries[vault.guid]) { + $scope.vault_tries[vault.guid] = { + tries: 0, + timeout: 0 + }; + } }; $scope.sharing_keys = {}; $scope.newVault = function () { @@ -144,9 +155,9 @@ var _vault = angular.copy(vault); _vault.vaultKey = angular.copy(vault_key); delete _vault.credentials; - var timer = parseInt($scope.logout_timer); - if($scope.auto_logout_timer && timer > 0 ){ - $rootScope.$broadcast('logout_timer_set', timer*60); + var timer = parseInt($scope.logout_timer); + if ($scope.auto_logout_timer && timer > 0) { + $rootScope.$broadcast('logout_timer_set', timer * 60); } VaultService.setActiveVault(_vault); @@ -158,6 +169,16 @@ $scope.logout_timer = time; }; + var tickLockTimer = function (guid) { + $scope.vault_tries[guid].timeout = $scope.vault_tries[guid].timeout - 1; + if($scope.vault_tries[guid].timeout <= 0){ + $interval.cancel($scope.vault_tries[guid].timer); + $scope.vault_tries[guid].timeout = 0; + } + }; + + $scope.vault_tries = {}; + $scope.vaultDecryptionKey = ''; $scope.loginToVault = function (vault, vault_key) { $scope.error = false; @@ -174,8 +195,23 @@ } catch (e) { $scope.error = $translate.instant('invalid.vault.key'); - } + $scope.vault_tries[vault.guid].tries = $scope.vault_tries[vault.guid].tries + 1; + + if($scope.vault_tries[vault.guid].tries >= 3){ + var duration = (Math.pow(2, 1 / 7) * Math.pow(15, 4 / 7)) * Math.pow((Math.pow(2, 2 / 7) * Math.pow(15, 1 / 7)), $scope.vault_tries[vault.guid].tries); + $scope.vault_tries[vault.guid].timeout = duration; + + if($scope.vault_tries[vault.guid].hasOwnProperty('timer')){ + $interval.cancel($scope.vault_tries[vault.guid].timer); + } + + $scope.vault_tries[vault.guid].timer = $interval(function () { + tickLockTimer(vault.guid); + } ,1000); + } + + } }; diff --git a/js/app/services/tagservice.js b/js/app/services/tagservice.js index f6d3f8071..a9d996f64 100644 --- a/js/app/services/tagservice.js +++ b/js/app/services/tagservice.js @@ -47,6 +47,9 @@ } } } + }, + resetTags: function () { + _tags = []; } }; diff --git a/js/importers/import-main.js b/js/importers/import-main.js index 9417ff8ff..7fb5bd6cb 100644 --- a/js/importers/import-main.js +++ b/js/importers/import-main.js @@ -132,3 +132,19 @@ var PassmanImporter = {}; return JSON.parse(string); }; })(window, $, PassmanImporter); + + +String.prototype.replaceAll = function(search, replacement) { + var target = this; + return target.replace(new RegExp(search, 'g'), replacement); +}; + +Array.prototype.clean = function(deleteValue) { + for (var i = 0; i < this.length; i++) { + if (this[i] === deleteValue) { + this.splice(i, 1); + i--; + } + } + return this; +}; diff --git a/js/importers/importer-clipperz.js b/js/importers/importer-clipperz.js index 37092f935..c4b04ed04 100644 --- a/js/importers/importer-clipperz.js +++ b/js/importers/importer-clipperz.js @@ -29,7 +29,7 @@ var PassmanImporter = PassmanImporter || {}; info: { name: 'Clipperz.is', id: 'clippers', - description: 'Go to menu -> Export -> Download HTML + JSON. Fields will be imported as custom fields.' + exportSteps: ['Go to menu -> Export -> Download HTML + JSON. Fields will be imported as custom fields.'] } }; diff --git a/js/importers/importer-dashlanecsv.js b/js/importers/importer-dashlanecsv.js index e9d17551c..83a3bffc0 100644 --- a/js/importers/importer-dashlanecsv.js +++ b/js/importers/importer-dashlanecsv.js @@ -30,7 +30,7 @@ var PassmanImporter = PassmanImporter || {}; info: { name: 'Dashlane 4 csv', id: 'dashLaneCsv', - description: 'Create an csv export. Go to File -> export -> Unsecured archive (readable) in CSV format' + exportSteps: ['Create an csv export. Go to File -> export -> Unsecured archive (readable) in CSV format'] } }; diff --git a/js/importers/importer-enpass.js b/js/importers/importer-enpass.js new file mode 100644 index 000000000..193a3d49f --- /dev/null +++ b/js/importers/importer-enpass.js @@ -0,0 +1,121 @@ +/** + * 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 . + * + */ + +// Importers should always start with this +/** global: PassmanImporter */ +var PassmanImporter = PassmanImporter || {}; +(function(window, $, PassmanImporter) { + 'use strict'; + // Define the importer + PassmanImporter.EnPassTXT = { + info: { + name: 'EnPass text file', + id: 'EnPassTXT', + exportSteps: ['Access your Enpass Database. Select "File" > "Export" > "As Text"'] + } + }; + + function parseEnpass(fileData){ + var lastProperty, matches, loginBlocks, property; + loginBlocks = fileData.replaceAll("Title :","<~passman~>\nTitle :").split('<~passman~>\n').clean(""); + var regex = /(.*) : (.*)/; + var results = []; + for(var l = 0; l < loginBlocks.length; l++){ + var loginBlock = loginBlocks[l]; + var lrow = loginBlock.split('\n'); + var result = {}; + for(var r = 0; r < lrow.length; r++){ + var row = lrow[r]; + matches = regex.exec(row); + if(matches){ + property = matches[1]; + result[property] = matches[2]; + } else { + if(lastProperty){ + result[lastProperty] += "\n" + row; + } + } + if(property) { + lastProperty = property; + } + } + results.push(result) + } + return results + } + + PassmanImporter.EnPassTXT.readFile = function (file_data) { + var mapper = { + 'Title': 'label', + 'Username': 'username', + 'Password': 'password', + 'Email': 'email', + 'Url': 'url', + 'Note': 'description' + }; + + var secret_fields = ['cvc', 'pin', 'security answer']; + + /** global: C_Promise */ + return new C_Promise(function(){ + var credential_list = []; + var credentials = parseEnpass(file_data); + for (var i = 0; i < credentials.length; i++) { + var enpass_credential = credentials[i]; + var new_credential = PassmanImporter.newCredential(); + for(var key in enpass_credential){ + if(!enpass_credential.hasOwnProperty(key)){ + continue; + } + + if(mapper.hasOwnProperty(key)){ + var prop = mapper[key]; + new_credential[prop] = enpass_credential[key]; + } else { + if(key !== 'TOTP') { + var isSecret = (secret_fields.indexOf(key.toLowerCase()) !== -1) ? 1 : 0; + new_credential.custom_fields.push({ + 'label': key, + 'value': enpass_credential[key], + 'secret': isSecret + }) + } + } + } + + if(enpass_credential.hasOwnProperty('TOTP')){ + new_credential.otp.secret = enpass_credential['TOTP']; + } + + var progress = { + percent: i/credentials.length*100, + loaded: i, + total: credentials.length + }; + + credential_list.push(new_credential); + this.call_progress(progress); + } + this.call_then(credential_list); + }); + }; +})(window, $, PassmanImporter); \ No newline at end of file diff --git a/js/importers/importer-keepasscsv.js b/js/importers/importer-keepasscsv.js index 17b6db9f1..f708c4c3b 100644 --- a/js/importers/importer-keepasscsv.js +++ b/js/importers/importer-keepasscsv.js @@ -30,7 +30,7 @@ var PassmanImporter = PassmanImporter || {}; info: { name: 'KeePass csv', id: 'keepassCsv', - description: 'Create an csv export with the following options enabled: http://i.imgur.com/CaeTA4d.png' + exportSteps: ['Create an csv export with the following options enabled: http://i.imgur.com/CaeTA4d.png'] } }; diff --git a/js/importers/importer-lastpasscsv.js b/js/importers/importer-lastpasscsv.js index 0f7dd315c..27c53e89a 100644 --- a/js/importers/importer-lastpasscsv.js +++ b/js/importers/importer-lastpasscsv.js @@ -30,7 +30,7 @@ var PassmanImporter = PassmanImporter || {}; info: { name: 'LastPass csv', id: 'lastpassCsv', - description: 'Create an csv export. Go to More options -> Advanced -> Export -> Last Pass CSV File' + exportSteps: ['Create an csv export. Go to More options -> Advanced -> Export -> Last Pass CSV File'] } }; diff --git a/js/importers/importer-ocpasswords.js b/js/importers/importer-ocpasswords.js new file mode 100644 index 000000000..1db66bafd --- /dev/null +++ b/js/importers/importer-ocpasswords.js @@ -0,0 +1,71 @@ +/** + * 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 . + * + */ + +// Importers should always start with this +/** global: PassmanImporter */ +var PassmanImporter = PassmanImporter || {}; +(function (window, $, PassmanImporter) { + 'use strict'; + // Define the importer + var steps = [ + 'Backups for the Passwords app need to be enabled on the Admin panel (they are disabled by default).', + 'On the Passwords App, in the bottom left corner, press Settings', + 'Press "Download Backup"', + 'Confirm the export and save the file' + ]; + PassmanImporter.passwordsApp = { + info: { + name: 'Passwords App csv', + id: 'passwordsApp', + exportSteps: steps + } + }; + + PassmanImporter.passwordsApp.readFile = function (file_data) { + /** global: C_Promise */ + var p = new C_Promise(function () { + var parsed_csv = PassmanImporter.readCsv(file_data); + var credential_list = []; + for (var i = 0; i < parsed_csv.length; i++) { + var row = parsed_csv[i]; + var _credential = PassmanImporter.newCredential(); + _credential.label = row.website + ' - '+ row.username; + _credential.username = row.username; + _credential.password = row.password; + _credential.url = row.fulladdress; + _credential.description = row.notes; + + credential_list.push(_credential); + + var progress = { + percent: i / parsed_csv.length * 100, + loaded: i, + total: parsed_csv.length + }; + + this.call_progress(progress); + } + this.call_then(credential_list); + }); + return p; + }; +})(window, $, PassmanImporter); diff --git a/js/importers/importer-passmanjson.js b/js/importers/importer-passmanjson.js index 3df91d92a..6f32ceda9 100644 --- a/js/importers/importer-passmanjson.js +++ b/js/importers/importer-passmanjson.js @@ -29,7 +29,7 @@ var PassmanImporter = PassmanImporter || {}; info: { name: 'Passman JSON', id: 'passmanJson', - description: 'Export the item in passman as passman json, with all fields enabled' + exportSteps: ['Export the item in passman as passman json, with all fields enabled'] } }; diff --git a/js/importers/importer-passpackcsv.js b/js/importers/importer-passpackcsv.js index 4a6e8c058..78365c4b3 100644 --- a/js/importers/importer-passpackcsv.js +++ b/js/importers/importer-passpackcsv.js @@ -30,7 +30,7 @@ var PassmanImporter = PassmanImporter || {}; info: { name: 'Passpack csv', id: 'passpackCsv', - description: 'Go to Tools -> Export. Select Comma Separated Values, All entries then continue.' + exportSteps: ['Go to Tools -> Export. Select Comma Separated Values, All entries then continue.'] } }; diff --git a/js/importers/importer-randomdata.js b/js/importers/importer-randomdata.js index 7280a6747..c0b6929d1 100644 --- a/js/importers/importer-randomdata.js +++ b/js/importers/importer-randomdata.js @@ -32,7 +32,7 @@ var PassmanImporter = PassmanImporter || {}; info: { name: 'Random data', id: 'randomData', - description: 'Create\'s 50 random credentials for testing purposes.' + exportSteps: ['Create\'s 50 random credentials for testing purposes.'] } }; diff --git a/js/importers/importer-teampass.js b/js/importers/importer-teampass.js new file mode 100644 index 000000000..a933b80fd --- /dev/null +++ b/js/importers/importer-teampass.js @@ -0,0 +1,62 @@ +/** + * 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 . + * + */ + +// Importers should always start with this +/** global: PassmanImporter */ +var PassmanImporter = PassmanImporter || {}; +(function(window, $, PassmanImporter) { + 'use strict'; + // Define the importer + PassmanImporter.teamPassCsv = { + info: { + name: 'TeamPass csv', + id: 'teamPassCsv', + exportSteps: ['Go to Tools -> Export. Select Comma Separated Values, All entries then continue.'] + } + }; + + PassmanImporter.teamPassCsv.readFile = function (file_data) { + /** global: C_Promise */ + return new C_Promise(function(){ + var parsed_csv = PassmanImporter.readCsv(file_data, false); + var credential_list = []; + for (var i = 0; i < parsed_csv.length; i++) { + var row = parsed_csv[i]; + var _credential = PassmanImporter.newCredential(); + _credential.label = row[1]; + _credential.description = row[2]; + _credential.password = row[3]; + _credential.username = row[4]; + + var progress = { + percent: i/parsed_csv.length*100, + loaded: i, + total: parsed_csv.length + }; + + credential_list.push(_credential); + this.call_progress(progress); + } + this.call_then(credential_list); + }); + }; +})(window, $, PassmanImporter); \ No newline at end of file diff --git a/js/importers/importer-zohocsv.js b/js/importers/importer-zohocsv.js index bce62f4fc..0deadada0 100644 --- a/js/importers/importer-zohocsv.js +++ b/js/importers/importer-zohocsv.js @@ -32,7 +32,7 @@ var PassmanImporter = PassmanImporter || {}; info: { name: 'ZOHO csv', id: 'zohoCsv', - description: 'Create an csv export. Go to Tools -> Export secrets -> Select "General CSV" and click "Export Secrets"' + exportSteps: ['Create an csv export. Go to Tools -> Export secrets -> Select "General CSV" and click "Export Secrets"'] } }; diff --git a/js/templates.js b/js/templates.js index 6049c0494..a39e2fcc6 100644 --- a/js/templates.js +++ b/js/templates.js @@ -1,124 +1,124 @@ 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('views/credential_revisions.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/credential_revisions.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/credential_revisions.html', - '
{{ \'revision.of\' | translate}} {{revision.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} ({{revision.credential_data.label}}) {{ \'revision.edited.by\' | translate}} {{revision.edited_by}}
{{ \'no.revisions\' | translate}}
{{ \'revision.of\' | translate}} {{selectedRevision.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{ \'label\' | translate }}
{{ \'account\' | translate }}
{{ \'password\' | translate }}
{{\'otp\' | translate}}
{{\'email\' | translate}}
{{ \'url\' | translate}}
{{\'notes\' | translate}}
{{ \'files\' | translate}}
{{field.label}}
{{field.value.filename}} ({{field.value.size | bytes}})
{{ \'expire.time\' | translate }}
{{selectedRevision.credential_data.expire_time * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{ \'changed\' | translate}}
{{selectedRevision.credential_data.changed * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{ \'created\' | translate}}
{{selectedRevision.credential_data.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{tag.text}}
'); + '
{{ \'revision.of\' | translate}} {{revision.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} ({{revision.credential_data.label}}) {{ \'revision.edited.by\' | translate}} {{revision.edited_by}}
{{ \'no.revisions\' | translate}}
{{ \'revision.of\' | translate}} {{selectedRevision.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{ \'label\' | translate }}
{{ \'account\' | translate }}
{{ \'password\' | translate }}
{{\'otp\' | translate}}
{{\'email\' | translate}}
{{ \'url\' | translate}}
{{\'notes\' | translate}}
{{ \'files\' | translate}}
{{field.label}}
{{field.value.filename}} ({{field.value.size | bytes}})
{{ \'expire.time\' | translate }}
{{selectedRevision.credential_data.expire_time * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{ \'changed\' | translate}}
{{selectedRevision.credential_data.changed * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{ \'created\' | translate}}
{{selectedRevision.credential_data.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{tag.text}}
'); }]); -angular.module('views/edit_credential.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/edit_credential.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/edit_credential.html', '
  • {{tab.title}}
'); }]); -angular.module('views/partials/forms/edit_credential/basics.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/partials/forms/edit_credential/basics.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/partials/forms/edit_credential/basics.html', '
'); }]); -angular.module('views/partials/forms/edit_credential/custom_fields.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/partials/forms/edit_credential/custom_fields.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/partials/forms/edit_credential/custom_fields.html', '
{{ \'label\' | translate}}{{ \'value\' | translate}}{{ \'type\' | translate}}{{ \'actions\' | translate}}
{{ field.label || "empty" }}{{ field.value || \'empty\' | translate }} * {{field.value.filename}} ({{field.value.size | bytes}}){{ field.field_type }}
'); }]); -angular.module('views/partials/forms/edit_credential/files.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/partials/forms/edit_credential/files.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/partials/forms/edit_credential/files.html', '
{{ \'file.name\' | translate }}{{ \'upload.date\' | translate}}{{ \'size\' | translate}}{{ \'actions\' | translate}}
{{ file.filename || "empty" }}{{file.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}{{file.size | bytes}}
'); }]); -angular.module('views/partials/forms/edit_credential/otp.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/partials/forms/edit_credential/otp.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/partials/forms/edit_credential/otp.html', - '
{{ \'upload.qr\' | translate}}
{{ \'current.qr\' | translate}}
{{ \'type\' | translate}}:{{storedCredential.otp.type}}
{{ \'label\' | translate}}:{{storedCredential.otp.label}}
{{ \'issuer\' | translate}}:{{storedCredential.otp.issuer}}
{{ \'secret\' | translate}}:{{storedCredential.otp.secret}}
{{ \'otp\' | translate}}:
'); + '
{{ \'upload.qr\' | translate}}
{{ \'current.qr\' | translate}}
{{ \'type\' | translate}}:{{storedCredential.otp.type}}
{{ \'label\' | translate}}:{{storedCredential.otp.label}}
{{ \'issuer\' | translate}}:{{storedCredential.otp.issuer}}
{{ \'secret\' | translate}}:{{storedCredential.otp.secret}}
{{ \'otp\' | translate}}:
'); }]); -angular.module('views/partials/forms/edit_credential/password.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/partials/forms/edit_credential/password.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/partials/forms/edit_credential/password.html', '
{{\'no.expire.date\' | translate}} {{ storedCredential.expire_time | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{ \'generation.settings\' | translate}}
'); }]); -angular.module('views/partials/forms/settings/export.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/partials/forms/settings/export.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/partials/forms/settings/export.html', - '
{{selectedExporter.description}}
'); + '
{{selectedExporter.description}}

{{error}}
'); }]); -angular.module('views/partials/forms/settings/general_settings.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/partials/forms/settings/general_settings.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/partials/forms/settings/general_settings.html', '

{{ \'rename.vault\' | translate}}

{{ \'change.vault.key\' | translate}}

  • {{error}}
{{\'warning.leave\' | translate}}
{{ \'processing\' | translate}} {{cur_state.process}}
{{ \'total.progress\' | translate}}

{{\'delete.vault\' | translate}}

{{ \'vault.remove.notice\' | translate }} {{\'delete.vault.checkbox\' | translate}}
{{\'deleting.pw\' | translate:translationData}}

{{ \'about.passman\' | translate}}

{{ \'version\' | translate}}: {{passman_version}}

{{ \'donate.support\' | translate}}

{{ \'bookmarklet\' | translate}}

{{ \'bookmarklet.info1\' | translate}}
{{ \'bookmarklet.info2\' | translate}}

'); }]); -angular.module('views/partials/forms/settings/import.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/partials/forms/settings/import.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/partials/forms/settings/import.html', - '
{{selectedImporter.description}}

{{ \'read.progress\' | translate}}
{{ \'upload.progress\' | translate}}
'); + '
{{ \'import.steps\' | translate }}
  • {{step}}

{{ \'read.progress\' | translate}}
{{ \'upload.progress\' | translate}}
'); }]); -angular.module('views/partials/forms/settings/password_settings.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/partials/forms/settings/password_settings.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/partials/forms/settings/password_settings.html', '
'); }]); -angular.module('views/partials/forms/settings/sharing.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/partials/forms/settings/sharing.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/partials/forms/settings/sharing.html', '
'); }]); -angular.module('views/partials/forms/settings/tool.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/partials/forms/settings/tool.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/partials/forms/settings/tool.html', '

{{ \'tool.intro\' | translate}}

{{ \'min.strength\' | translate}}

{{ \'scan.result.msg\' | translate}}

{{ \'label\' | translate}}{{ \'score\' | translate}}{{ \'password\' | translate}}{{ \'action\' | translate}}
{{result.label}}
'); }]); -angular.module('views/partials/forms/share_credential/basics.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/partials/forms/share_credential/basics.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/partials/forms/share_credential/basics.html', - '
{{\'cyphering\' | translate}}...
{{ \'uploading\' | translate}}...
{{ \'user\' | translate}}{{ \'crypto.time\' | translate}}
{{user.user}}{{user.time}} s
{{ \'crypto.total.time\' | translate}}: {{ calculate_total_time() }}
{{\'user\' | translate}}{{ \'perm.read\' | translate}}{{ \'perm.write\' | translate}}{{ \'perm.files\' | translate}}{{ \'perm.revisions\' | translate}}
{{user.userId}} {{ \'pending\' | translate}}
'); }]); -angular.module('views/partials/forms/share_credential/link_sharing.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/partials/forms/share_credential/link_sharing.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/partials/forms/share_credential/link_sharing.html', '

{{ \'share.until.date\' | translate}} {{ share_settings.linkSharing.settings.expire_time | date:\'dd-MM-yyyy @ HH:mm:ss\' }}
{{ \'expire.views\' | translate}}
{{ \'show.files\' | translate}}
'); }]); -angular.module('views/partials/password-meter.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/partials/password-meter.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/partials/password-meter.html', '
{{ \'details\' | translate }} {{ \'hide.details\' | translate}}
{{message}}
{{ \'password.score\' | translate}}:
{{score.score}}
{{ \'cracking.times\' | translate}}
{{ \'cracking.time.100h\' | translate}}
{{ \'cracking.time.100h.desc\' | translate}}
{{score.crack_times_display.online_throttling_100_per_hour}}
{{ \'cracking.time.10s\' | translate}}
{{ \'cracking.time.10s.desc\' | translate}}
{{score.crack_times_display.online_no_throttling_10_per_second}}
{{ \'cracking.time.10ks\' | translate}}
{{ \'cracking.time.10ks.desc\' | translate}}
{{score.crack_times_display.offline_slow_hashing_1e4_per_second}}
{{ \'cracking.time.10Bs\' | translate}}
{{ \'cracking.time.10Bs.desc\' | translate}}
{{score.crack_times_display.offline_fast_hashing_1e10_per_second}}
{{ \'match.sequence\' | translate}}:
{{ \'match.sequence.link\' | translate}}
{{sequence.token}}
{{ \'pattern\' | translate}}{{sequence.pattern}}
{{ \'matched.word\' | translate}}{{sequence.matched_word}}
{{ \'dictionary.name\' | translate}}{{sequence.dictionary_name}}
{{ \'rank\' | translate}}{{sequence.rank}}
{{ \'reversed\' | translate}}{{sequence.reversed}}
{{ \'guesses\' | translate}}{{sequence.guesses}}
{{ \'base.guesses\' | translate}}{{sequence.base_guesses}}
{{ \'uppercase.variations\' | translate}}{{sequence.uppercase_variations}}
{{ \'leet.variations\' | translate}}{{sequence.l33t_variations}}
'); }]); -angular.module('views/settings.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/settings.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/settings.html', '
  • {{tab.title}}
'); }]); -angular.module('views/share_credential.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/share_credential.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/share_credential.html', - '
  • {{tab.title}}
'); + '
  • {{tab.title}}
'); }]); -angular.module('views/show_vault.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/show_vault.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/show_vault.html', - '
+
{{ \'use.regex\' | translate }}
{{ ::tag.text}} {{ ::credential.label}}
  • {{ ::credential.label}}
    {{ ::tag.text}}

{{selectedCredential.label}}

{{ \'account\' | translate }}
{{ \'password\' | translate }}
{{\'otp\' | translate}}
{{\'email\' | translate}}
{{ \'url\' | translate}}
{{\'notes\' | translate}}
{{ \'files\' | translate}}
{{field.label}}
{{field.value.filename}} ({{field.value.size | bytes}})
{{ \'expire.time\' | translate }}
{{selectedCredential.expire_time * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{ \'changed\' | translate}}
{{selectedCredential.changed * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{ \'created\' | translate}}
{{selectedCredential.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{tag.text}}
'); + '
+
{{ \'use.regex\' | translate }}
{{ ::tag.text}} {{ ::credential.label}}
  • {{ ::credential.label}}
    {{ ::tag.text}}

{{selectedCredential.label}}

{{ \'account\' | translate }}
{{ \'password\' | translate }}
{{\'otp\' | translate}}
{{\'email\' | translate}}
{{ \'url\' | translate}}
{{\'notes\' | translate}}
{{ \'files\' | translate}}
{{field.label}}
{{field.value.filename}} ({{field.value.size | bytes}})
{{ \'expire.time\' | translate }}
{{selectedCredential.expire_time * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{ \'changed\' | translate}}
{{selectedCredential.changed * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{ \'created\' | translate}}
{{selectedCredential.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}
{{tag.text}}
'); }]); -angular.module('views/vaults.html', []).run(['$templateCache', function($templateCache) { +angular.module('views/vaults.html', []).run(['$templateCache', function ($templateCache) { 'use strict'; $templateCache.put('views/vaults.html', - '
  • + Create a new vault
  • {{vault.name}}
    {{ \'created\' | translate}}: {{vault.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} | {{ \'last.access\' | translate}}: {{vault.last_access * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} {{\'never\' | translate}}
  • {{ \'no.vaults\' | translate}}
  • {{ \'go.back.vaults\' | translate }}
'); + '
  • + Create a new vault
  • {{vault.name}}
    {{ \'created\' | translate}}: {{vault.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} | {{ \'last.access\' | translate}}: {{vault.last_access * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} {{\'never\' | translate}}
  • {{ \'no.vaults\' | translate}}
  • {{ \'go.back.vaults\' | translate }}
'); }]); diff --git a/lib/Activity.php b/lib/Activity.php index 8d6007cff..96c1afafa 100644 --- a/lib/Activity.php +++ b/lib/Activity.php @@ -23,7 +23,11 @@ namespace OCA\Passman; +use OCP\IURLGenerator; + class Activity implements \OCP\Activity\IExtension { + const FILTER_PASSMAN = 'passman'; + const APP_NAME = 'passman'; const TYPE_ITEM_ACTION = 'passman_item_action'; const TYPE_ITEM_EXPIRED = 'passman_item_expired'; const TYPE_ITEM_SHARED = 'passman_item_shared'; @@ -49,6 +53,13 @@ class Activity implements \OCP\Activity\IExtension { const SUBJECT_ITEM_RENAMED_SELF = 'item_renamed_self'; + protected $URLGenerator; + + public function __construct( IURLGenerator $URLGenerator) { + $this->URLGenerator = $URLGenerator; + } + + /** * The extension can return an array of additional notification types. * If no additional types are to be added false is to be returned @@ -57,7 +68,7 @@ class Activity implements \OCP\Activity\IExtension { * @return array|false */ public function getNotificationTypes($languageCode) { - $l = \OC::$server->getL10N('passman', $languageCode); + $l = \OC::$server->getL10N(self::APP_NAME, $languageCode); return array( self::TYPE_ITEM_ACTION => $l->t('A Passman item has been created, modified or deleted'), self::TYPE_ITEM_EXPIRED => $l->t('A Passman item has expired'), @@ -75,7 +86,7 @@ public function getNotificationTypes($languageCode) { * @return array|false */ public function filterNotificationTypes($types, $filter) { - return $types; + return $filter === self::FILTER_PASSMAN ? [self::TYPE_ITEM_ACTION, self::TYPE_ITEM_EXPIRED, self::TYPE_ITEM_SHARED, self::TYPE_ITEM_RENAMED] : $types; } /** @@ -116,8 +127,8 @@ public function getDefaultTypes($method) { * @return string|false */ public function translate($app, $text, $params, $stripPath, $highlightParams, $languageCode) { - $l = \OC::$server->getL10NFactory()->get('passman', $languageCode); - if ($app === 'passman') { + $l = \OC::$server->getL10NFactory()->get(self::APP_NAME, $languageCode); + if ($app === self::APP_NAME) { switch ($text) { case self::SUBJECT_ITEM_CREATED: return $l->t('%1$s has been created by %2$s', $params); @@ -172,7 +183,7 @@ public function translate($app, $text, $params, $stripPath, $highlightParams, $l * @return array|false */ public function getSpecialParameterList($app, $text) { - if ($app === 'passman') { + if ($app === self::APP_NAME) { switch ($text) { case self::SUBJECT_ITEM_CREATED: case self::SUBJECT_ITEM_CREATED_SELF: @@ -247,14 +258,14 @@ public function getGroupParameter($activity) { * @return array|false */ public function getNavigation() { - $l = \OC::$server->getL10N('passman'); + $l = \OC::$server->getL10N(self::APP_NAME); return array( 'top' => array(), - 'apps' => array( + 'apps' => array( self::FILTER_PASSMAN => array( 'id' => 'passman', 'name' => (string) $l->t('Passwords'), - 'url' => '',//FIXME: Currenlty we cannot link directly to links, so this needs to be fixed... this->URLGenerator->linkToRoute('activity.Activities.showList', array('filter' => 'passman')), + 'url' => $this->URLGenerator->linkToRoute('activity.Activities.showList', ['filter' => self::FILTER_PASSMAN]), ), ), ); @@ -267,7 +278,7 @@ public function getNavigation() { * @return boolean */ public function isFilterValid($filterValue) { - return $filterValue === 'passman'; + return $filterValue === self::FILTER_PASSMAN; } /** @@ -280,9 +291,13 @@ public function isFilterValid($filterValue) { * @return array|false */ public function getQueryForFilter($filter) { - if ($filter === 'passman') { - return array('`app` = ?', array('passman')); + if ($filter === self::FILTER_PASSMAN) { + return [ + '(`app` = ?)', + [self::APP_NAME], + ]; } return false; + } } \ No newline at end of file diff --git a/sass/app.scss b/sass/app.scss index 72201d0fa..29832438c 100644 --- a/sass/app.scss +++ b/sass/app.scss @@ -106,4 +106,15 @@ //Fix NC fucking up our style input[type="checkbox"]{ min-height: inherit; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; } \ No newline at end of file diff --git a/sass/credentials.scss b/sass/credentials.scss index 2e2a4377b..afa807271 100644 --- a/sass/credentials.scss +++ b/sass/credentials.scss @@ -375,6 +375,9 @@ .file_tab { } + .otpText{ + padding-right: 10px; + } } .app_sidebar { h2{ diff --git a/sass/settings.scss b/sass/settings.scss index 504619474..6d29e7929 100644 --- a/sass/settings.scss +++ b/sass/settings.scss @@ -40,4 +40,11 @@ } .tab_container.settings{ margin-bottom: 50px; +} +.import-steps{ + padding-left: 16px; + li{ + list-style-type: disc; + } + margin-bottom: 10px; } \ No newline at end of file diff --git a/sass/vaults.scss b/sass/vaults.scss index 6c362d51c..07c64aded 100644 --- a/sass/vaults.scss +++ b/sass/vaults.scss @@ -90,6 +90,9 @@ margin-top: 10px; } } + .login_opts{ + margin-bottom: 10px; + } } @media screen and (max-width: 768px){ diff --git a/templates/main.php b/templates/main.php index f2ee788c3..ec91a71f3 100644 --- a/templates/main.php +++ b/templates/main.php @@ -82,7 +82,10 @@ script('passman', 'importers/importer-dashlanecsv'); script('passman', 'importers/importer-zohocsv'); script('passman', 'importers/importer-passmanjson'); +script('passman', 'importers/importer-ocpasswords'); script('passman', 'importers/importer-clipperz'); +script('passman', 'importers/importer-teampass'); +script('passman', 'importers/importer-enpass'); script('passman', 'importers/importer-passpackcsv'); script('passman', 'importers/importer-randomdata'); script('passman', 'exporters/exporter-main'); @@ -96,7 +99,7 @@ /*build-css-start*/ style('passman', 'vendor/ng-password-meter/ng-password-meter'); style('passman', 'vendor/bootstrap/bootstrap.min'); -style('passman', 'vendor/bootstrap/bootstrap-theme.min'); + style('passman', 'vendor/font-awesome/font-awesome.min'); style('passman', 'vendor/angular-xeditable/xeditable.min'); style('passman', 'vendor/ng-tags-input/ng-tags-input.min'); diff --git a/templates/part.admin.php b/templates/part.admin.php index e2bda70b7..10b7d98d8 100644 --- a/templates/part.admin.php +++ b/templates/part.admin.php @@ -9,17 +9,31 @@ $AppInstance = new App(); $localVersion = $AppInstance->getAppInfo("passman")["version"]; if ($checkVersion) { -// get latest master version - $doc = new DOMDocument(); - $doc->load('https://raw.githubusercontent.com/nextcloud/passman/master/appinfo/info.xml'); - $root = $doc->getElementsByTagName("info"); + // get latest master version $version = false; $githubVersion = $l->t('Unable to get version info'); - foreach ($root as $element) { - $versions = $element->getElementsByTagName("version"); - $version = $versions->item(0)->nodeValue; + + $url = 'https://raw.githubusercontent.com/nextcloud/passman/master/appinfo/info.xml'; + try { + $client = OC::$server->getHTTPClientService()->newClient(); + $response = $client->get($url); + $xml = $response->getBody(); + } catch (\Exception $e) { + $xml = false; } - if ($version) { + + if ($xml) { + $loadEntities = libxml_disable_entity_loader(true); + $data = @simplexml_load_string($xml); + libxml_disable_entity_loader($loadEntities); + if ($data !== false) { + $version = (string)$data->version; + } else { + libxml_clear_errors(); + } + } + + if ($version !== false) { $githubVersion = $version; } } @@ -36,7 +50,7 @@ } ?> Local version:
t('A newer version of passman is available')); } ?> diff --git a/templates/views/partials/forms/edit_credential/otp.html b/templates/views/partials/forms/edit_credential/otp.html index 5c0fc2611..07a4635d7 100644 --- a/templates/views/partials/forms/edit_credential/otp.html +++ b/templates/views/partials/forms/edit_credential/otp.html @@ -1,18 +1,24 @@
-
- {{ 'upload.qr' | translate}} +
+ {{ 'upload.qr' | translate}} +
+ on-read="parseQR(qrdata)" ng-show="otpType === 'qrcode'"/> +
-
{{ 'current.qr' | translate}} +
+ {{ 'current.qr' | translate}}
@@ -22,23 +28,23 @@
- + - + - + - + - + diff --git a/templates/views/partials/forms/settings/export.html b/templates/views/partials/forms/settings/export.html index 2ede0a7d7..f39c22f9f 100644 --- a/templates/views/partials/forms/settings/export.html +++ b/templates/views/partials/forms/settings/export.html @@ -10,13 +10,26 @@
{{selectedExporter.description}}
- + +
+ + +
+
+ {{error}} +
+
+
+ +
+
- +
diff --git a/templates/views/partials/forms/settings/import.html b/templates/views/partials/forms/settings/import.html index d0f69be43..3e66d8d23 100644 --- a/templates/views/partials/forms/settings/import.html +++ b/templates/views/partials/forms/settings/import.html @@ -9,7 +9,12 @@ {{importer.name}} -
{{selectedImporter.description}}
+
+ {{ 'import.steps' | translate }} +
    +
  • {{step}}
  • +
+

diff --git a/templates/views/partials/forms/share_credential/basics.html b/templates/views/partials/forms/share_credential/basics.html index 539bc8d86..f3142d258 100644 --- a/templates/views/partials/forms/share_credential/basics.html +++ b/templates/views/partials/forms/share_credential/basics.html @@ -22,6 +22,11 @@ + + +
{{ 'type' | translate}}:{{ 'type' | translate}}: {{storedCredential.otp.type}}
{{ 'label' | translate}}:{{ 'label' | translate}}: {{storedCredential.otp.label}}
{{ 'issuer' | translate}}:{{ 'issuer' | translate}}: {{storedCredential.otp.issuer}}
{{ 'secret' | translate}}:{{ 'secret' | translate}}: {{storedCredential.otp.secret}}
{{ 'otp' | translate}}:{{ 'otp' | translate}}:
+ {{ 'search.result.missing' | translate}} +
diff --git a/templates/views/share_credential.html b/templates/views/share_credential.html index 84896c96b..45fe8c9d9 100644 --- a/templates/views/share_credential.html +++ b/templates/views/share_credential.html @@ -27,9 +27,9 @@ diff --git a/templates/views/show_vault.html b/templates/views/show_vault.html index 7107722fc..a584d46b2 100644 --- a/templates/views/show_vault.html +++ b/templates/views/show_vault.html @@ -6,7 +6,7 @@
- {{active_vault.name}} + {{active_vault.name}}
diff --git a/templates/views/vaults.html b/templates/views/vaults.html index 17a45e289..6fb12e409 100644 --- a/templates/views/vaults.html +++ b/templates/views/vaults.html @@ -95,7 +95,7 @@ Never
-
+ -
+ +
+
+