pws 1.0.7 → 1.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/MIT-LICENSE.txt +1 -1
- data/README.md +16 -3
- data/features/add.feature +3 -3
- data/features/create.feature +1 -1
- data/features/generate.feature +18 -11
- data/features/get.feature +2 -2
- data/features/in-out.feature +1 -1
- data/features/master.feature +2 -2
- data/features/namespaces.feature +1 -1
- data/features/print-screen.feature +62 -0
- data/features/remove.feature +1 -1
- data/features/rename.feature +1 -1
- data/features/resave.feature +2 -2
- data/features/support/env.rb +0 -14
- data/features/update-generate.feature +21 -12
- data/features/update.feature +3 -3
- data/lib/pws.rb +34 -5
- data/lib/pws/runner.rb +9 -1
- data/lib/pws/version.rb +3 -1
- data/pws.gemspec +4 -4
- metadata +33 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6be1a0e41b9218f6e0ef2f3570e945bf7b08a52a
|
4
|
+
data.tar.gz: 22a90601c2ecb6d7e0e3cccd6e5481db781384c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e5f4179c8dc2cf2e7be483d42dd442279e9c61857288595a0c1c575fcad5a6f73b79eb283c34f5a249b227d6e2ee5403a245207025af2c930ffbd1551eef1b0
|
7
|
+
data.tar.gz: feeb683b32b10c345e10e5a94a18f573cf0a01c5bbb1609537b2881e6a1b997fce1d92f6a5e6277b4019891db5e9f835e7c6478626086f00281d77236e140593
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
== 1.0.8
|
2
|
+
* New command to print password to screen, patch by @terabyte
|
3
|
+
* New option to exclude specific characters when generating new passwords, patch by @alex0112
|
4
|
+
* Update (and loosen up) clipboard dependency
|
5
|
+
|
1
6
|
== 1.0.7
|
2
7
|
* Ruby 2.4 compat (explicitely only pass 32 bytes of the encryption key)
|
3
8
|
* Update clipboard dependency to 1.1.1
|
data/MIT-LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -5,7 +5,7 @@ pws is a command-line password safe/manager written in Ruby using [aes-256-cbc](
|
|
5
5
|
|
6
6
|
Usage
|
7
7
|
---
|
8
|
-
[![Screenshot](
|
8
|
+
[![Screenshot](https://ruby.janlelis.de/pws-example.png)](https://ruby.janlelis.de/60-pws-the-ruby-powered-command-line-password-manager)
|
9
9
|
|
10
10
|
|
11
11
|
Setup
|
@@ -33,7 +33,20 @@ Besides using the `--filename path/to/safe` option, you can shortly call `pws --
|
|
33
33
|
|
34
34
|
|
35
35
|
### Reading the source
|
36
|
-
Trust the code by reading the source! It's originally based on [this tutorial](
|
36
|
+
Trust the code by reading the source! It's originally based on [this tutorial](https://ruby.janlelis.de/41-tutorial-build-your-own-password-safe-with-ruby). You might want to start reading in the [0.9.2 tag](https://github.com/janlelis/pws/tree/0.9.2), because it's got less features and therefore is less code.
|
37
|
+
|
38
|
+
|
39
|
+
Projects built on top of PWS
|
40
|
+
---
|
41
|
+
* [pws-otp](https://github.com/janlelis/pws-otp) Experimental OTP support for 2FA
|
42
|
+
* [pwsqr](https://github.com/smileart/pwsqr) Simple QR interface to pws gem. Helps to use your passwords on a smartphone.
|
43
|
+
* [aws-pws](https://github.com/fancyremarker/aws-pws) A password-protected CredentialProvider for AWS
|
44
|
+
* [omnivault](https://github.com/aptible/omnivault) Multi-platform keychain functionality
|
45
|
+
|
46
|
+
|
47
|
+
Blog articles
|
48
|
+
---
|
49
|
+
* [Packaging ruby programs in NixOS](http://blog.arkency.com/2016/04/packaging-ruby-programs-in-nixos/) using PWS as example
|
37
50
|
|
38
51
|
|
39
52
|
Contributors
|
@@ -47,4 +60,4 @@ Contributors
|
|
47
60
|
|
48
61
|
J-\_-L
|
49
62
|
---
|
50
|
-
© 2010-
|
63
|
+
© 2010-2019 Jan Lelis, MIT license
|
data/features/add.feature
CHANGED
@@ -3,7 +3,7 @@ Feature: Add
|
|
3
3
|
As a user
|
4
4
|
I want to add new passwords to my password safe
|
5
5
|
|
6
|
-
|
6
|
+
|
7
7
|
Scenario: Add a new password for "github"
|
8
8
|
Given A safe exists with master password "my_master_password"
|
9
9
|
When I run `pws add github` interactively
|
@@ -13,7 +13,7 @@ Feature: Add
|
|
13
13
|
And the output should contain "Please enter a password for github:"
|
14
14
|
And the output should contain "The password for github has been added"
|
15
15
|
|
16
|
-
|
16
|
+
|
17
17
|
Scenario: Add a new password for "github", already passing it as command line paramenter (not recommended)
|
18
18
|
Given A safe exists with master password "my_master_password"
|
19
19
|
When I run `pws add github github_password` interactively
|
@@ -44,7 +44,7 @@ Feature: Add
|
|
44
44
|
Then the output should contain "Master password:"
|
45
45
|
And the output should contain "NO ACCESS"
|
46
46
|
|
47
|
-
|
47
|
+
|
48
48
|
Scenario: Set a new password for "github", this also sets the timestamp
|
49
49
|
Given A safe exists with master password "my_master_password" and a key "some" with password "entry"
|
50
50
|
When I run `pws add github github_password` interactively
|
data/features/create.feature
CHANGED
data/features/generate.feature
CHANGED
@@ -3,8 +3,8 @@ Feature: Generate
|
|
3
3
|
As a user
|
4
4
|
I want to generate passwords and add them to my password safe
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
|
7
|
+
|
8
8
|
Scenario: Generate a new password for "github" and gets it
|
9
9
|
Given A safe exists with master password "my_master_password"
|
10
10
|
When I run `pws generate github` interactively
|
@@ -13,7 +13,7 @@ Feature: Generate
|
|
13
13
|
And the output should contain "The password for github has been added"
|
14
14
|
And the output should contain "The password for github is now available in your clipboard for 10 seconds"
|
15
15
|
|
16
|
-
|
16
|
+
|
17
17
|
Scenario: Generate a new password for "github", second parameter gets passed to the get as keep-in-clipboard time
|
18
18
|
Given A safe exists with master password "my_master_password"
|
19
19
|
When I run `pws generate github 1` interactively
|
@@ -22,7 +22,7 @@ Feature: Generate
|
|
22
22
|
And the output should contain "The password for github has been added"
|
23
23
|
And the output should contain "The password for github is now available in your clipboard for 1 second"
|
24
24
|
|
25
|
-
|
25
|
+
|
26
26
|
Scenario: Generate a new password for "github", PWS_SECONDS set to 5, gets passed to the get as keep-in-clipboard time
|
27
27
|
Given A safe exists with master password "my_master_password"
|
28
28
|
When I set env variable "PWS_SECONDS" to "5"
|
@@ -32,7 +32,7 @@ Feature: Generate
|
|
32
32
|
And the output should contain "The password for github has been added"
|
33
33
|
And the output should contain "The password for github is now available in your clipboard for 5 seconds"
|
34
34
|
|
35
|
-
|
35
|
+
|
36
36
|
Scenario: Generate a new password for "github", third parameter defines password length
|
37
37
|
Given A safe exists with master password "my_master_password"
|
38
38
|
When I run `pws generate github 0 10` interactively
|
@@ -42,7 +42,7 @@ Feature: Generate
|
|
42
42
|
And the output should contain "The password for github has been copied to your clipboard"
|
43
43
|
And the clipboard should match /^.{10}$/
|
44
44
|
|
45
|
-
|
45
|
+
|
46
46
|
Scenario: Generate a new password for "github", default length is 64
|
47
47
|
Given A safe exists with master password "my_master_password"
|
48
48
|
When I run `pws generate github 0` interactively
|
@@ -52,7 +52,7 @@ Feature: Generate
|
|
52
52
|
And the output should contain "The password for github has been copied to your clipboard"
|
53
53
|
And the clipboard should match /^.{64}$/
|
54
54
|
|
55
|
-
|
55
|
+
|
56
56
|
Scenario: Generate a new password for "github", default length of PWS_LENGTH
|
57
57
|
Given A safe exists with master password "my_master_password"
|
58
58
|
When I set env variable "PWS_LENGTH" to "15"
|
@@ -63,7 +63,7 @@ Feature: Generate
|
|
63
63
|
And the output should contain "The password for github has been copied to your clipboard"
|
64
64
|
And the clipboard should match /^.{15}$/
|
65
65
|
|
66
|
-
|
66
|
+
|
67
67
|
Scenario: Generate a new password for "github", fourth parameter defines a char pool used for generation
|
68
68
|
Given A safe exists with master password "my_master_password"
|
69
69
|
When I run `pws generate github 0 10 a` interactively
|
@@ -73,7 +73,7 @@ Feature: Generate
|
|
73
73
|
And the output should contain "The password for github has been copied to your clipboard"
|
74
74
|
And the clipboard should match /^a{10}$/
|
75
75
|
|
76
|
-
|
76
|
+
|
77
77
|
Scenario: Generate a new password for "github", the default char pool is !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~
|
78
78
|
Given A safe exists with master password "my_master_password"
|
79
79
|
When I run `pws generate github 0` interactively
|
@@ -83,7 +83,7 @@ Feature: Generate
|
|
83
83
|
And the output should contain "The password for github has been copied to your clipboard"
|
84
84
|
And the clipboard should match ^[!\"\#$%&'()*+,\-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~]+$
|
85
85
|
|
86
|
-
|
86
|
+
|
87
87
|
Scenario: Generate a new password for "github", the default char pool PWS_CHARPOOL
|
88
88
|
Given A safe exists with master password "my_master_password"
|
89
89
|
When I set env variable "PWS_CHARPOOL" to "a"
|
@@ -94,4 +94,11 @@ Feature: Generate
|
|
94
94
|
And the output should contain "The password for github has been copied to your clipboard"
|
95
95
|
And the clipboard should match ^a{64}$
|
96
96
|
|
97
|
-
|
97
|
+
Scenario: Generate a new password for "github", exclude the characters "ABC123" from the charpool
|
98
|
+
Given A safe exists with master password "my_master_password"
|
99
|
+
When I run `pws generate github 0 --exclude ABC123` interactively
|
100
|
+
And I type "my_master_password"
|
101
|
+
Then the output should contain "Master password:"
|
102
|
+
And the output should contain "The password for github has been added"
|
103
|
+
And the output should contain "The password for github has been copied to your clipboard"
|
104
|
+
And the clipboard should match [^ABC123]{64}
|
data/features/get.feature
CHANGED
@@ -11,7 +11,7 @@ Feature: Get
|
|
11
11
|
And the output should contain "The password for github has been copied to your clipboard"
|
12
12
|
And the clipboard should contain "github_password"
|
13
13
|
|
14
|
-
|
14
|
+
|
15
15
|
Scenario: Get the password for "github" (which exists) and keep it in the clipboard for 10 seconds
|
16
16
|
Given A safe exists with master password "my_master_password" and a key "github" with password "github_password"
|
17
17
|
When I run `pws get github` interactively
|
@@ -26,7 +26,7 @@ Feature: Get
|
|
26
26
|
Then the output should contain "Master password:"
|
27
27
|
And the output should contain "The password for github is now available in your clipboard for 1 second"
|
28
28
|
|
29
|
-
|
29
|
+
|
30
30
|
Scenario: Get the password for "github" (which exists) and keep it in the clipboard for 5 seconds when PWS_SECONDS is set to 5
|
31
31
|
Given A safe exists with master password "my_master_password" and a key "github" with password "github_password"
|
32
32
|
When I set env variable "PWS_SECONDS" to "5"
|
data/features/in-out.feature
CHANGED
@@ -32,7 +32,7 @@ Feature: --in and --out options
|
|
32
32
|
Then the output should contain "Master password:"
|
33
33
|
Then the output should contain "NO ACCESS"
|
34
34
|
|
35
|
-
|
35
|
+
|
36
36
|
Scenario: Succesfully converts from 0.9 to 1.0 with --in 0.9 and out --1.0 options
|
37
37
|
Given A "0.9" safe exists with master password "password" and a key "github" with password "123456"
|
38
38
|
When I run `pws resave --in 0.9 --out 1.0` interactively
|
data/features/master.feature
CHANGED
@@ -3,7 +3,7 @@ Feature: Master
|
|
3
3
|
As a user
|
4
4
|
I want to change the master password
|
5
5
|
|
6
|
-
|
6
|
+
|
7
7
|
Scenario: Change the master password and check that it has changed
|
8
8
|
Given A safe exists with master password "my_master_password"
|
9
9
|
When I run `pws master` interactively
|
@@ -37,7 +37,7 @@ Feature: Master
|
|
37
37
|
Then the output should contain "Master password:"
|
38
38
|
And the output should contain "The master password has been changed"
|
39
39
|
|
40
|
-
|
40
|
+
|
41
41
|
Scenario: I can have an empty master password (not recommended)
|
42
42
|
Given A safe exists with master password "my_master_password"
|
43
43
|
When I run `pws master` interactively
|
data/features/namespaces.feature
CHANGED
@@ -0,0 +1,62 @@
|
|
1
|
+
Feature: PrintScreen
|
2
|
+
In order to have a helpful password safe when I have no clipboard
|
3
|
+
As a user
|
4
|
+
I want to disply passwords from my password safe
|
5
|
+
|
6
|
+
Scenario: Get the password for "github" (which exists) and print it to the screen
|
7
|
+
Given A safe exists with master password "my_master_password" and a key "github" with password "github_password"
|
8
|
+
When I run `pws ps github 0` interactively
|
9
|
+
And I type "my_master_password"
|
10
|
+
Then the output should contain "Master password:"
|
11
|
+
And the output should contain "The password for github is:\ngithub_password"
|
12
|
+
|
13
|
+
|
14
|
+
Scenario: Get the password for "github" (which exists) and print it to the screen for 10 seconds
|
15
|
+
Given A safe exists with master password "my_master_password" and a key "github" with password "github_password"
|
16
|
+
When I run `pws ps github` interactively
|
17
|
+
And I type "my_master_password"
|
18
|
+
Then the output should contain "Master password:"
|
19
|
+
And the output should contain "The password for github will be displayed for 10 seconds:\ngithub"
|
20
|
+
|
21
|
+
Scenario: Get the password for "github" (which exists) and print it to the screen for 1 second
|
22
|
+
Given A safe exists with master password "my_master_password" and a key "github" with password "github_password"
|
23
|
+
When I run `pws ps github 1` interactively
|
24
|
+
And I type "my_master_password"
|
25
|
+
Then the output should contain "Master password:"
|
26
|
+
And the output should contain "The password for github will be displayed for 1 second:\ngithub"
|
27
|
+
|
28
|
+
|
29
|
+
Scenario: Get the password for "github" (which exists) and print it to the screen for 5 seconds when PWS_SECONDS is set to 5
|
30
|
+
Given A safe exists with master password "my_master_password" and a key "github" with password "github_password"
|
31
|
+
When I set env variable "PWS_SECONDS" to "5"
|
32
|
+
And I run `pws ps github` interactively
|
33
|
+
And I type "my_master_password"
|
34
|
+
Then the output should contain "Master password:"
|
35
|
+
And the output should contain "The password for github will be displayed for 5 seconds:\ngithub"
|
36
|
+
|
37
|
+
Scenario: Try to get the password for "google" (which does not exist)
|
38
|
+
Given A safe exists with master password "my_master_password" and a key "github" with password "github_password"
|
39
|
+
When I run `pws ps google` interactively
|
40
|
+
And I type "my_master_password"
|
41
|
+
Then the output should contain "Master password:"
|
42
|
+
And the output should contain "No password found for google!"
|
43
|
+
|
44
|
+
Scenario: Try to get the password for "github" (but the master password is wrong)
|
45
|
+
Given A safe exists with master password "my_master_password" and a key "github" with password "github_password"
|
46
|
+
When I run `pws ps github` interactively
|
47
|
+
And I type "my_master_password_wrong"
|
48
|
+
Then the output should contain "Master password:"
|
49
|
+
And the output should contain "NO ACCESS"
|
50
|
+
|
51
|
+
Scenario: Get the password for "gihub" using an abbrev shortcut
|
52
|
+
Given A safe exists with master password "my_master_password" and keys
|
53
|
+
| github | 123 |
|
54
|
+
| google | 345 |
|
55
|
+
| gitorious | 678 |
|
56
|
+
When I run `pws ps gith 0` interactively
|
57
|
+
And I type "my_master_password"
|
58
|
+
Then the output should contain "Master password:"
|
59
|
+
And the output should contain "The password for github is:\n123"
|
60
|
+
|
61
|
+
|
62
|
+
|
data/features/remove.feature
CHANGED
@@ -3,7 +3,7 @@ Feature: Remove
|
|
3
3
|
As a user
|
4
4
|
I want to remove passwords from my password safe
|
5
5
|
|
6
|
-
|
6
|
+
|
7
7
|
Scenario: Remove password entry "github"
|
8
8
|
Given A safe exists with master password "my_master_password" and a key "github" with password "github_password"
|
9
9
|
When I run `pws remove github` interactively
|
data/features/rename.feature
CHANGED
@@ -3,7 +3,7 @@ Feature: Rename
|
|
3
3
|
As a user
|
4
4
|
I want to rename passwords in my password safe
|
5
5
|
|
6
|
-
|
6
|
+
|
7
7
|
Scenario: Rename the password entry "github" to "gh"
|
8
8
|
Given A safe exists with master password "my_master_password" and a key "github" with password "github_password"
|
9
9
|
When I run `pws rename github gh` interactively
|
data/features/resave.feature
CHANGED
@@ -3,7 +3,7 @@ Feature: Resave
|
|
3
3
|
As a user
|
4
4
|
I want resave the save
|
5
5
|
|
6
|
-
|
6
|
+
|
7
7
|
Scenario: Usual resave
|
8
8
|
Given A safe exists with master password "my_master_password" and keys
|
9
9
|
| some | 123 |
|
@@ -18,7 +18,7 @@ Feature: Resave
|
|
18
18
|
And the output should contain "password"
|
19
19
|
And the output should contain "entries"
|
20
20
|
|
21
|
-
|
21
|
+
|
22
22
|
Scenario: Useful for converting when used together with --in and --out options
|
23
23
|
Given A "0.9" safe exists with master password "password" and a key "github" with password "123456"
|
24
24
|
When I run `pws show` interactively
|
data/features/support/env.rb
CHANGED
@@ -33,17 +33,3 @@ Around do |_, block|
|
|
33
33
|
|
34
34
|
FileUtils.rm ENV["PWS"] if File.exist? ENV["PWS"]
|
35
35
|
end
|
36
|
-
|
37
|
-
# Hacks
|
38
|
-
|
39
|
-
Before('@slow-hack') do
|
40
|
-
@aruba_io_wait_seconds = 3
|
41
|
-
end
|
42
|
-
|
43
|
-
Before('@very-slow-hack') do
|
44
|
-
@aruba_io_wait_seconds = 7
|
45
|
-
end
|
46
|
-
|
47
|
-
Before('@wait-11s') do
|
48
|
-
@aruba_timeout_seconds = 15
|
49
|
-
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
Feature:
|
1
|
+
Feature: UpdateGenerate
|
2
2
|
In order to keep my privacy
|
3
3
|
As a user
|
4
4
|
I want to update a password entry and generate the new password
|
5
5
|
|
6
|
-
|
6
|
+
|
7
7
|
Scenario: Generate a new password for "github" and get it
|
8
8
|
Given A safe exists with master password "my_master_password" and a key "github" with password "old_password"
|
9
9
|
When I run `pws update-gen github` interactively
|
@@ -26,7 +26,7 @@ Feature: Update
|
|
26
26
|
Then the output should contain "Master password:"
|
27
27
|
And the output should contain "NO ACCESS"
|
28
28
|
|
29
|
-
|
29
|
+
|
30
30
|
Scenario: Generate a new password for "github" and get it
|
31
31
|
Given A safe exists with master password "my_master_password" and a key "github" with password "old_password"
|
32
32
|
When I run `pws update-gen github` interactively
|
@@ -35,7 +35,7 @@ Feature: Update
|
|
35
35
|
And the output should contain "The password for github has been updated"
|
36
36
|
And the output should contain "The password for github is now available in your clipboard for 10 seconds"
|
37
37
|
|
38
|
-
|
38
|
+
|
39
39
|
Scenario: Generate a new password for "github", second parameter gets passed to the get as keep-in-clipboard time
|
40
40
|
Given A safe exists with master password "my_master_password" and a key "github" with password "old_password"
|
41
41
|
When I run `pws update-gen github 1` interactively
|
@@ -44,8 +44,8 @@ Feature: Update
|
|
44
44
|
And the output should contain "The password for github has been updated"
|
45
45
|
And the output should contain "The password for github is now available in your clipboard for 1 second"
|
46
46
|
|
47
|
-
|
48
|
-
|
47
|
+
|
48
|
+
|
49
49
|
Scenario: Generate a new password for "github", PWS_SECONDS set to 5, gets passed to the get as keep-in-clipboard time
|
50
50
|
Given A safe exists with master password "my_master_password" and a key "github" with password "old_password"
|
51
51
|
When I set env variable "PWS_SECONDS" to "5"
|
@@ -55,7 +55,7 @@ Feature: Update
|
|
55
55
|
And the output should contain "The password for github has been updated"
|
56
56
|
And the output should contain "The password for github is now available in your clipboard for 5 seconds"
|
57
57
|
|
58
|
-
|
58
|
+
|
59
59
|
Scenario: Generate a new password for "github", third parameter defines password length
|
60
60
|
Given A safe exists with master password "my_master_password" and a key "github" with password "old_password"
|
61
61
|
When I run `pws update-gen github 0 10` interactively
|
@@ -65,7 +65,7 @@ Feature: Update
|
|
65
65
|
And the output should contain "The password for github has been copied to your clipboard"
|
66
66
|
And the clipboard should match /^.{10}$/
|
67
67
|
|
68
|
-
|
68
|
+
|
69
69
|
Scenario: Generate a new password for "github", default length is 64
|
70
70
|
Given A safe exists with master password "my_master_password" and a key "github" with password "old_password"
|
71
71
|
When I run `pws update-gen github 0` interactively
|
@@ -75,7 +75,7 @@ Feature: Update
|
|
75
75
|
And the output should contain "The password for github has been copied to your clipboard"
|
76
76
|
And the clipboard should match /^.{64}$/
|
77
77
|
|
78
|
-
|
78
|
+
|
79
79
|
Scenario: Generate a new password for "github", default length of PWS_LENGTH
|
80
80
|
Given A safe exists with master password "my_master_password" and a key "github" with password "old_password"
|
81
81
|
When I set env variable "PWS_LENGTH" to "15"
|
@@ -86,7 +86,7 @@ Feature: Update
|
|
86
86
|
And the output should contain "The password for github has been copied to your clipboard"
|
87
87
|
And the clipboard should match /^.{15}$/
|
88
88
|
|
89
|
-
|
89
|
+
|
90
90
|
Scenario: Generate a new password for "github", fourth parameter defines a char pool used for generation
|
91
91
|
Given A safe exists with master password "my_master_password" and a key "github" with password "old_password"
|
92
92
|
When I run `pws update-gen github 0 10 a` interactively
|
@@ -96,7 +96,7 @@ Feature: Update
|
|
96
96
|
And the output should contain "The password for github has been copied to your clipboard"
|
97
97
|
And the clipboard should match /^a{10}$/
|
98
98
|
|
99
|
-
|
99
|
+
|
100
100
|
Scenario: Generate a new password for "github", the default char pool is !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~
|
101
101
|
Given A safe exists with master password "my_master_password" and a key "github" with password "old_password"
|
102
102
|
When I run `pws update-gen github 0` interactively
|
@@ -106,7 +106,7 @@ Feature: Update
|
|
106
106
|
And the output should contain "The password for github has been copied to your clipboard"
|
107
107
|
And the clipboard should match ^[!\"\#$%&'()*+,\-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~]+$
|
108
108
|
|
109
|
-
|
109
|
+
|
110
110
|
Scenario: Generate a new password for "github", the default char pool PWS_CHARPOOL
|
111
111
|
Given A safe exists with master password "my_master_password" and a key "github" with password "old_password"
|
112
112
|
When I set env variable "PWS_CHARPOOL" to "a"
|
@@ -116,3 +116,12 @@ Feature: Update
|
|
116
116
|
And the output should contain "The password for github has been updated"
|
117
117
|
And the output should contain "The password for github has been copied to your clipboard"
|
118
118
|
And the clipboard should match ^a{64}$
|
119
|
+
|
120
|
+
Scenario: Generate a new password for "github", exclude the characters "ABC123" from the charpool
|
121
|
+
Given A safe exists with master password "my_master_password" and a key "github" with password "old_password"
|
122
|
+
When I run `pws update-gen github 0 --exclude ABC123` interactively
|
123
|
+
And I type "my_master_password"
|
124
|
+
Then the output should contain "Master password:"
|
125
|
+
And the output should contain "The password for github has been updated"
|
126
|
+
And the output should contain "The password for github has been copied to your clipboard"
|
127
|
+
And the clipboard should match [^ABC123]{64}
|
data/features/update.feature
CHANGED
@@ -12,7 +12,7 @@ Feature: Update
|
|
12
12
|
And the output should contain "Please enter a new password for github:"
|
13
13
|
And the output should contain "The password for github has been updated"
|
14
14
|
|
15
|
-
|
15
|
+
|
16
16
|
Scenario: Set a new password for "github", already passing it as command line paramenter (not recommended)
|
17
17
|
Given A safe exists with master password "my_master_password" and a key "github" with password "old_password"
|
18
18
|
When I run `pws update github new_password` interactively
|
@@ -27,7 +27,7 @@ Feature: Update
|
|
27
27
|
Then the output should contain "Master password:"
|
28
28
|
And the output should contain "There is no password stored for github, so you cannot update it!"
|
29
29
|
|
30
|
-
|
30
|
+
|
31
31
|
Scenario: Try to update the password for "github" (but it's empty)
|
32
32
|
Given A safe exists with master password "my_master_password" and a key "github" with password "old_password"
|
33
33
|
When I run `pws update github` interactively
|
@@ -44,7 +44,7 @@ Feature: Update
|
|
44
44
|
Then the output should contain "Master password:"
|
45
45
|
And the output should contain "NO ACCESS"
|
46
46
|
|
47
|
-
|
47
|
+
|
48
48
|
Scenario: Set a new password for "github", this also sets the timestamp
|
49
49
|
Given A safe exists with master password "my_master_password" and a key "github" with password "old_password"
|
50
50
|
When I run `pws update github github_password` interactively
|
data/lib/pws.rb
CHANGED
@@ -127,15 +127,42 @@ class PWS
|
|
127
127
|
end
|
128
128
|
end
|
129
129
|
aliases_for :get, :entry, :copy, :password, :for, :[]
|
130
|
+
|
131
|
+
# Print a password entry to the screen
|
132
|
+
def print_screen(key, seconds = @options[:seconds])
|
133
|
+
if real_key = @abbrevs[key]
|
134
|
+
password = @data[real_key][:password]
|
135
|
+
if seconds && seconds.to_i > 0
|
136
|
+
print Paint[%[The password for #{real_key} will be displayed for #{seconds.to_i} second#{?s if seconds.to_i > 1}:\n#{password}], :green]
|
137
|
+
begin
|
138
|
+
sleep seconds.to_i
|
139
|
+
rescue Interrupt
|
140
|
+
puts "\e[999D\e[K\e[1A"*2 if $stdin.tty? # clear the pw from the screen
|
141
|
+
raise
|
142
|
+
end
|
143
|
+
puts "\e[999D\e[K\e[1A"*2 if $stdin.tty? # clear the pw from the screen
|
144
|
+
return true
|
145
|
+
else
|
146
|
+
pa %[The password for #{real_key} is:\n#{password}], :green
|
147
|
+
return true
|
148
|
+
end
|
149
|
+
else
|
150
|
+
pa %[No password found for #{key}!], :red
|
151
|
+
return false
|
152
|
+
end
|
153
|
+
end
|
154
|
+
alias :'print-screen' :print_screen
|
155
|
+
alias :ps :print_screen
|
130
156
|
|
131
157
|
# Adds a password entry with a freshly generated random password
|
132
158
|
def generate(
|
133
159
|
key,
|
134
160
|
seconds = @options[:seconds],
|
135
161
|
length = @options[:length],
|
136
|
-
charpool = @options[:charpool]
|
162
|
+
charpool = @options[:charpool],
|
163
|
+
excluded = @options[:exclude]
|
137
164
|
)
|
138
|
-
get(key, seconds) if add(key, generator(length, charpool))
|
165
|
+
get(key, seconds) if add(key, generator(length, charpool, excluded))
|
139
166
|
end
|
140
167
|
alias_for :generate, :gen
|
141
168
|
|
@@ -144,9 +171,10 @@ class PWS
|
|
144
171
|
key,
|
145
172
|
seconds = @options[:seconds],
|
146
173
|
length = @options[:length],
|
147
|
-
charpool = @options[:charpool]
|
174
|
+
charpool = @options[:charpool],
|
175
|
+
excluded = @options[:exclude]
|
148
176
|
)
|
149
|
-
get(key, seconds) if update(key, generator(length, charpool))
|
177
|
+
get(key, seconds) if update(key, generator(length, charpool, excluded))
|
150
178
|
end
|
151
179
|
alias :'update-generate' :update_generate
|
152
180
|
alias :'update_gen' :update_generate
|
@@ -285,7 +313,8 @@ class PWS
|
|
285
313
|
end
|
286
314
|
|
287
315
|
# Generate a random password, maybe put in its own class sometime
|
288
|
-
def generator(length, charpool)
|
316
|
+
def generator(length, charpool, exclude)
|
317
|
+
charpool = charpool.tr(exclude, '') if exclude
|
289
318
|
charpool_size = charpool.size
|
290
319
|
(1..length.to_i).map{
|
291
320
|
charpool[SecureRandom.random_number(charpool_size)]
|
data/lib/pws/runner.rb
CHANGED
@@ -68,6 +68,14 @@ module PWS::Runner
|
|
68
68
|
#{Paint['get', :bold]} / entry / copy / password / for ( name, seconds = 10 )
|
69
69
|
Copies the password for <name> to the clipboard. The second argument specifies,
|
70
70
|
how long the password is kept in the clipboard (0 = no deletion).
|
71
|
+
Please keep in mind that other programs can access (and log) the contents
|
72
|
+
of your clipboard.
|
73
|
+
|
74
|
+
#{Paint['ps', :bold]} / print-screen ( name, seconds = 10 )
|
75
|
+
Displays the password on stdout. The second argument specifies,
|
76
|
+
how long the password is shown (0 = no deletion).
|
77
|
+
Please keep in mind that the password will appear in your shell's logfile,
|
78
|
+
for example, in "~/.bash_history"
|
71
79
|
|
72
80
|
#{Paint['add', :bold]} / set / store / create ( name, password = nil )
|
73
81
|
Stores a new password entry. The second argument can be the password, but
|
@@ -126,7 +134,7 @@ module PWS::Runner
|
|
126
134
|
encryption key (pbkdf2). A higher number takes longer to compute, but makes
|
127
135
|
it harder for attacker to bruteforce your password.
|
128
136
|
|
129
|
-
#{Paint['--seconds', :bold]}, #{Paint['--length', :bold]}, #{Paint['--charpool', :bold]}
|
137
|
+
#{Paint['--seconds', :bold]}, #{Paint['--length', :bold]}, #{Paint['--charpool', :bold]}, #{Paint['--exclude', :bold]}
|
130
138
|
Preset options for specific actions.
|
131
139
|
|
132
140
|
#{Paint["ENV Variables", :underline]}
|
data/lib/pws/version.rb
CHANGED
data/pws.gemspec
CHANGED
@@ -16,13 +16,13 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.extra_rdoc_files = ["README.md", "MIT-LICENSE.txt", "CHANGELOG.md"]
|
17
17
|
s.license = 'MIT'
|
18
18
|
s.executables = ['pws']
|
19
|
-
s.add_dependency 'clipboard', '~> 1.
|
19
|
+
s.add_dependency 'clipboard', '~> 1.3'
|
20
20
|
s.add_dependency 'paint', '>= 0.8.7'
|
21
21
|
s.add_dependency 'pbkdf2-ruby'
|
22
22
|
s.add_development_dependency 'rake', '< 13'
|
23
|
-
s.add_development_dependency 'aruba', '
|
24
|
-
s.add_development_dependency 'cucumber', '~>
|
25
|
-
s.add_development_dependency 'rspec', '~>
|
23
|
+
s.add_development_dependency 'aruba', '~> 0.14'
|
24
|
+
s.add_development_dependency 'cucumber', '~> 3.1'
|
25
|
+
s.add_development_dependency 'rspec', '~> 3.8'
|
26
26
|
|
27
27
|
len = s.homepage.size
|
28
28
|
s.post_install_message = \
|
metadata
CHANGED
@@ -1,114 +1,115 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pws
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Lelis
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
+
name: clipboard
|
14
15
|
requirement: !ruby/object:Gem::Requirement
|
15
16
|
requirements:
|
16
17
|
- - "~>"
|
17
18
|
- !ruby/object:Gem::Version
|
18
|
-
version: 1.
|
19
|
-
name: clipboard
|
20
|
-
prerelease: false
|
19
|
+
version: '1.3'
|
21
20
|
type: :runtime
|
21
|
+
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: '1.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
+
name: paint
|
28
29
|
requirement: !ruby/object:Gem::Requirement
|
29
30
|
requirements:
|
30
31
|
- - ">="
|
31
32
|
- !ruby/object:Gem::Version
|
32
33
|
version: 0.8.7
|
33
|
-
name: paint
|
34
|
-
prerelease: false
|
35
34
|
type: :runtime
|
35
|
+
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.8.7
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
+
name: pbkdf2-ruby
|
42
43
|
requirement: !ruby/object:Gem::Requirement
|
43
44
|
requirements:
|
44
45
|
- - ">="
|
45
46
|
- !ruby/object:Gem::Version
|
46
47
|
version: '0'
|
47
|
-
name: pbkdf2-ruby
|
48
|
-
prerelease: false
|
49
48
|
type: :runtime
|
49
|
+
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
56
57
|
requirement: !ruby/object:Gem::Requirement
|
57
58
|
requirements:
|
58
59
|
- - "<"
|
59
60
|
- !ruby/object:Gem::Version
|
60
61
|
version: '13'
|
61
|
-
name: rake
|
62
|
-
prerelease: false
|
63
62
|
type: :development
|
63
|
+
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "<"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '13'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
+
name: aruba
|
70
71
|
requirement: !ruby/object:Gem::Requirement
|
71
72
|
requirements:
|
72
|
-
- -
|
73
|
+
- - "~>"
|
73
74
|
- !ruby/object:Gem::Version
|
74
|
-
version: 0.
|
75
|
-
name: aruba
|
76
|
-
prerelease: false
|
75
|
+
version: '0.14'
|
77
76
|
type: :development
|
77
|
+
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0.
|
82
|
+
version: '0.14'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
+
name: cucumber
|
84
85
|
requirement: !ruby/object:Gem::Requirement
|
85
86
|
requirements:
|
86
87
|
- - "~>"
|
87
88
|
- !ruby/object:Gem::Version
|
88
|
-
version:
|
89
|
-
name: cucumber
|
90
|
-
prerelease: false
|
89
|
+
version: '3.1'
|
91
90
|
type: :development
|
91
|
+
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
96
|
+
version: '3.1'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec
|
98
99
|
requirement: !ruby/object:Gem::Requirement
|
99
100
|
requirements:
|
100
101
|
- - "~>"
|
101
102
|
- !ruby/object:Gem::Version
|
102
|
-
version: '
|
103
|
-
name: rspec
|
104
|
-
prerelease: false
|
103
|
+
version: '3.8'
|
105
104
|
type: :development
|
105
|
+
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
111
|
-
description: pws is a command-line password safe. Please run `pws --help` for usage
|
110
|
+
version: '3.8'
|
111
|
+
description: pws is a command-line password safe. Please run `pws --help` for usage
|
112
|
+
information.
|
112
113
|
email: mail@janlelis.de
|
113
114
|
executables:
|
114
115
|
- pws
|
@@ -131,6 +132,7 @@ files:
|
|
131
132
|
- features/master.feature
|
132
133
|
- features/misc.feature
|
133
134
|
- features/namespaces.feature
|
135
|
+
- features/print-screen.feature
|
134
136
|
- features/remove.feature
|
135
137
|
- features/rename.feature
|
136
138
|
- features/resave.feature
|
@@ -172,9 +174,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
172
174
|
- !ruby/object:Gem::Version
|
173
175
|
version: '0'
|
174
176
|
requirements: []
|
175
|
-
rubyforge_project:
|
176
|
-
rubygems_version: 2.
|
177
|
-
signing_key:
|
177
|
+
rubyforge_project:
|
178
|
+
rubygems_version: 2.5.1
|
179
|
+
signing_key:
|
178
180
|
specification_version: 4
|
179
181
|
summary: pws is a CLI password safe.
|
180
182
|
test_files: []
|