pass-station 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +2 -1
- data/bin/pass-station +31 -23
- data/data/DefaultCreds-Cheat-Sheet.csv +17 -8
- data/data/many-passwords.csv +2561 -0
- data/lib/pass_station/output.rb +24 -25
- data/lib/pass_station/parse.rb +5 -4
- data/lib/pass_station/search.rb +10 -8
- data/lib/pass_station/source.rb +52 -17
- data/lib/pass_station/version.rb +1 -1
- data/lib/pass_station.rb +10 -7
- metadata +12 -128
data/lib/pass_station/output.rb
CHANGED
@@ -12,7 +12,7 @@ module PassStation
|
|
12
12
|
# Password database handling
|
13
13
|
class DB
|
14
14
|
# Output the data in the chosen format
|
15
|
-
# @param formatter [String] Engine to use to format the data:
|
15
|
+
# @param formatter [String] Engine to use to format the data: `table`, `'pretty-table'`, `JSON`, `CSV`, `YAML`
|
16
16
|
# @param data [Array<CSV::Row>]
|
17
17
|
# @return [Array<String>] formatted output
|
18
18
|
def output(formatter, data)
|
@@ -21,7 +21,7 @@ module PassStation
|
|
21
21
|
end
|
22
22
|
|
23
23
|
# Output the data in the chosen format (list command)
|
24
|
-
# @param formatter [String] Engine to use to format the data:
|
24
|
+
# @param formatter [String] Engine to use to format the data: `table`, `'pretty-table'`, `JSON`, `CSV`, `YAML`
|
25
25
|
# @return [Array<String>] formatted output
|
26
26
|
def output_list(formatter)
|
27
27
|
data_nil?
|
@@ -29,10 +29,10 @@ module PassStation
|
|
29
29
|
end
|
30
30
|
|
31
31
|
# Output the data in the chosen format (search command)
|
32
|
-
# @param formatter [String] Engine to use to format the data:
|
32
|
+
# @param formatter [String] Engine to use to format the data: `table`, `'pretty-table'`, `JSON`, `CSV`, `YAML`
|
33
33
|
# @return [Array<String>] formatted output
|
34
34
|
def output_search(formatter)
|
35
|
-
return
|
35
|
+
return [] if @search_result.empty?
|
36
36
|
|
37
37
|
output(formatter, @search_result)
|
38
38
|
end
|
@@ -52,7 +52,7 @@ module PassStation
|
|
52
52
|
end
|
53
53
|
|
54
54
|
# Normalize string to be class name compatible
|
55
|
-
# Join
|
55
|
+
# Join split words and capitalize
|
56
56
|
# @param formatter [String] formatter name
|
57
57
|
# @return [String] normalized name (class compatible)
|
58
58
|
def normalize(formatter)
|
@@ -68,8 +68,8 @@ module PassStation
|
|
68
68
|
# Simple table formatter
|
69
69
|
class Table
|
70
70
|
class << self
|
71
|
-
# Format the
|
72
|
-
# @param table [Array<CSV::Row>] an
|
71
|
+
# Format the `Array<CSV::Row>` into a simple table with justified columns
|
72
|
+
# @param table [Array<CSV::Row>] an `Array<CSV::Row>`
|
73
73
|
# @return [Array<String>] the formatted table ready to be printed
|
74
74
|
def format(table)
|
75
75
|
out = []
|
@@ -105,15 +105,14 @@ module PassStation
|
|
105
105
|
# @return [Hash] fixed colsizes, keys are columns name, values are columns size
|
106
106
|
def correct_min_colsizes(colsizes)
|
107
107
|
min_colsizes = {
|
108
|
-
productvendor: 14,
|
109
|
-
|
110
|
-
password: 9
|
108
|
+
productvendor: 14, username: 9, password: 9, modelsoftware_name: 19,
|
109
|
+
version: 8, access_type: 12, privileges: 11, notes: 6, vendor: 7
|
111
110
|
}
|
112
|
-
|
111
|
+
colsizes.each_with_object({}) { |(k, v), h| h[k] = [v, min_colsizes[k]].max }
|
113
112
|
end
|
114
113
|
|
115
114
|
# Left justify an element of the column
|
116
|
-
# @param row [CSV::Row]
|
115
|
+
# @param row [CSV::Row] `CSV::Row`
|
117
116
|
# @param column [Symbol] the symbol of the column
|
118
117
|
# @param colsizes [Hash] hash containing the column size for each column as returned by {colsizes_count}
|
119
118
|
# @return [String] the justified element
|
@@ -122,7 +121,7 @@ module PassStation
|
|
122
121
|
end
|
123
122
|
|
124
123
|
# Left justify all elements of the column
|
125
|
-
# @param row [CSV::Row]
|
124
|
+
# @param row [CSV::Row] `CSV::Row`
|
126
125
|
# @param colsizes [Hash] hash containing the column size for each column as returned by {colsizes_count}
|
127
126
|
# @return [String] the justified row
|
128
127
|
def justify_row(row, colsizes)
|
@@ -147,8 +146,8 @@ module PassStation
|
|
147
146
|
# Pretty table with ASCII borders formatter
|
148
147
|
class PrettyTable < Table
|
149
148
|
class << self
|
150
|
-
# Format the
|
151
|
-
# @param table [Array<CSV::Row>] an
|
149
|
+
# Format the `Array<CSV::Row>` into a simple table with justified columns
|
150
|
+
# @param table [Array<CSV::Row>] an `Array<CSV::Row>`
|
152
151
|
# @return [Array<String>] the formatted table ready to be printed
|
153
152
|
def format(table)
|
154
153
|
out = []
|
@@ -163,7 +162,7 @@ module PassStation
|
|
163
162
|
end
|
164
163
|
|
165
164
|
# Left justify an element of the column
|
166
|
-
# @param row [CSV::Row]
|
165
|
+
# @param row [CSV::Row] `CSV::Row`
|
167
166
|
# @param column [Symbol] the symbol of the column
|
168
167
|
# @param colsizes [Hash] hash containing the column size for each column as returned by {colsizes_count}
|
169
168
|
# @return [String] the justified element
|
@@ -172,7 +171,7 @@ module PassStation
|
|
172
171
|
end
|
173
172
|
|
174
173
|
# Left justify all elements of the column
|
175
|
-
# @param row [CSV::Row]
|
174
|
+
# @param row [CSV::Row] `CSV::Row`
|
176
175
|
# @param colsizes [Hash] hash containing the column size for each column as returned by {colsizes_count}
|
177
176
|
# @return [String] the justified row
|
178
177
|
def justify_row(row, colsizes)
|
@@ -204,8 +203,8 @@ module PassStation
|
|
204
203
|
# CSV formatter
|
205
204
|
class Csv
|
206
205
|
class << self
|
207
|
-
# Format the
|
208
|
-
# @param table [Array<CSV::Row>] an
|
206
|
+
# Format the `Array<CSV::Row>` into a CSV
|
207
|
+
# @param table [Array<CSV::Row>] an `Array<CSV::Row>`
|
209
208
|
# @return [Array<String>] the formatted CSV ready to be printed
|
210
209
|
def format(table)
|
211
210
|
CSV::Table.new(table).to_csv.split("\n")
|
@@ -216,11 +215,11 @@ module PassStation
|
|
216
215
|
# JSON formatter
|
217
216
|
class Json
|
218
217
|
class << self
|
219
|
-
# Format the
|
220
|
-
# @param table [Array<CSV::Row>] an
|
218
|
+
# Format the `Array<CSV::Row>` into JSON
|
219
|
+
# @param table [Array<CSV::Row>] an `Array<CSV::Row>`
|
221
220
|
# @return [Array<String>] the formatted JSON ready to be printed (only
|
222
221
|
# one element on the array, keep an array for compatibility with
|
223
|
-
# {highlight_found} and homogeneity with other formatters)
|
222
|
+
# {DB.highlight_found} and homogeneity with other formatters)
|
224
223
|
def format(table)
|
225
224
|
[table.map(&:to_h).to_json]
|
226
225
|
end
|
@@ -230,11 +229,11 @@ module PassStation
|
|
230
229
|
# YAML formatter
|
231
230
|
class Yaml
|
232
231
|
class << self
|
233
|
-
# Format the
|
234
|
-
# @param table [Array<CSV::Row>] an
|
232
|
+
# Format the `Array<CSV::Row>` into YAML
|
233
|
+
# @param table [Array<CSV::Row>] an `Array<CSV::Row>`
|
235
234
|
# @return [Array<String>] the formatted YAML ready to be printed (only
|
236
235
|
# one element on the array, keep an array for compatibility with
|
237
|
-
# {highlight_found} and homogeneity with other formatters)
|
236
|
+
# {DB.highlight_found} and homogeneity with other formatters)
|
238
237
|
def format(table)
|
239
238
|
[table.map(&:to_h).to_yaml]
|
240
239
|
end
|
data/lib/pass_station/parse.rb
CHANGED
@@ -22,10 +22,11 @@ module PassStation
|
|
22
22
|
end
|
23
23
|
|
24
24
|
# Parse, sort and sanitize the password database
|
25
|
-
# @param sort [Symbol] column name to sort by
|
26
|
-
# @return [Array<CSV::Row>] table of
|
27
|
-
# attributes
|
28
|
-
def parse(sort =
|
25
|
+
# @param sort [Symbol] column name to sort by (columns depends on the database source, see {UPSTREAM_DATABASE})
|
26
|
+
# @return [Array<CSV::Row>] table of `CSV::Row`, each row contains multiple
|
27
|
+
# attributes (columns depends on the database source, see {UPSTREAM_DATABASE})
|
28
|
+
def parse(sort = nil)
|
29
|
+
sort ||= UPSTREAM_DATABASE[@database_type][:COLUMNS].first[0]
|
29
30
|
@data = CSV.table(@database_path, **@config).sort_by do |s|
|
30
31
|
s[sort].downcase
|
31
32
|
end
|
data/lib/pass_station/search.rb
CHANGED
@@ -6,11 +6,13 @@ module PassStation
|
|
6
6
|
class DB
|
7
7
|
# Search term in the data table
|
8
8
|
# @param term [String] the searched term
|
9
|
-
# @param col [Symbol] the column to search in:
|
10
|
-
#
|
11
|
-
# @
|
12
|
-
#
|
9
|
+
# @param col [Symbol] the column to search in: column name (columns depends on the database source, see
|
10
|
+
# {UPSTREAM_DATABASE}) or :all (all columns)
|
11
|
+
# @see build_regexp for `opts` param description
|
12
|
+
# @return [Array<CSV::Row>] table of `CSV::Row`, each row contains multiple
|
13
|
+
# attributes (columns depends on the database source, see {UPSTREAM_DATABASE})
|
13
14
|
def search(term, col, opts = {})
|
15
|
+
col ||= UPSTREAM_DATABASE[@database_type][:COLUMNS].first[0]
|
14
16
|
r1 = prepare_search(term, opts)
|
15
17
|
condition = column_selector(col, r1)
|
16
18
|
@data.each do |row|
|
@@ -21,14 +23,14 @@ module PassStation
|
|
21
23
|
|
22
24
|
# Choose in which column the search will be performed and build the
|
23
25
|
# condition to use
|
24
|
-
# @param col [Symbol] the column to search in:
|
26
|
+
# @param col [Symbol] the column to search in: column name (columns depends on the database source, see
|
27
|
+
# {UPSTREAM_DATABASE}) or :all (all columns)
|
25
28
|
# @param rgxp [Regexp] the search regexp (generated by {build_regexp})
|
26
29
|
# @return [Proc] the proc condition to use for searching
|
27
30
|
def column_selector(col, rgxp)
|
28
31
|
proc { |row|
|
29
32
|
if col == :all
|
30
|
-
|
31
|
-
row[:password].match?(rgxp)
|
33
|
+
UPSTREAM_DATABASE[@database_type][:COLUMNS].keys.map { |x| row[x].match?(rgxp) }.inject(:|)
|
32
34
|
else
|
33
35
|
row[col].match?(rgxp)
|
34
36
|
end
|
@@ -62,7 +64,7 @@ module PassStation
|
|
62
64
|
|
63
65
|
# Raise an error is data attribute is nil
|
64
66
|
def data_nil?
|
65
|
-
raise 'You must use the parse method to
|
67
|
+
raise 'You must use the parse method to populate the data attribute first' if @data.nil?
|
66
68
|
end
|
67
69
|
|
68
70
|
protected :build_regexp, :prepare_search, :column_selector, :data_nil?
|
data/lib/pass_station/source.rb
CHANGED
@@ -9,45 +9,82 @@ module PassStation
|
|
9
9
|
# Password database handling
|
10
10
|
class DB
|
11
11
|
UPSTREAM_DATABASE = {
|
12
|
-
|
13
|
-
|
12
|
+
MAPPING: {
|
13
|
+
1 => :DEFAULT_CREDENTIALS_CHEAT_SHEET,
|
14
|
+
2 => :MANY_PASSWORDS
|
15
|
+
},
|
16
|
+
DEFAULT_CREDENTIALS_CHEAT_SHEET: {
|
17
|
+
URL: 'https://raw.githubusercontent.com/ihebski/DefaultCreds-cheat-sheet/main/DefaultCreds-Cheat-Sheet.csv',
|
18
|
+
HASH: 'f03f3ed77a8a932b1b2891fbec705d42b1eec4911fb76ccf36cde9e79a385556',
|
19
|
+
FILENAME: 'DefaultCreds-Cheat-Sheet.csv',
|
20
|
+
COLUMNS: {
|
21
|
+
productvendor: 'Product/Vendor',
|
22
|
+
username: 'Username',
|
23
|
+
password: 'Password'
|
24
|
+
}
|
25
|
+
},
|
26
|
+
MANY_PASSWORDS: {
|
27
|
+
URL: 'https://raw.githubusercontent.com/many-passwords/many-passwords/main/passwords.csv',
|
28
|
+
HASH: '293ce4411446c702aeda977b9a446ff42d045d980be0b5287a848b5bd7d39402',
|
29
|
+
FILENAME: 'many-passwords.csv',
|
30
|
+
COLUMNS: {
|
31
|
+
vendor: 'Vendor',
|
32
|
+
modelsoftware_name: 'Model/Software name',
|
33
|
+
version: 'Version',
|
34
|
+
access_type: 'Access Type',
|
35
|
+
username: 'Username',
|
36
|
+
password: 'Password',
|
37
|
+
privileges: 'Privileges',
|
38
|
+
notes: 'Notes'
|
39
|
+
}
|
40
|
+
}
|
14
41
|
}.freeze
|
15
42
|
|
16
43
|
class << self
|
17
44
|
# Download upstream password database
|
18
45
|
# @param destination_path [String] the destination path (may
|
19
46
|
# overwrite existing file).
|
20
|
-
# @param opts [Hash] the optional
|
47
|
+
# @param opts [Hash] the optional download parameters.
|
21
48
|
# @option opts [String] :sha256 the SHA256 hash to check, if the file
|
22
49
|
# already exist and the hash matches then the download will be skipped.
|
50
|
+
# @option opts [String] :source_db id of the source database (see. MAPPING in {UPSTREAM_DATABASE}). Default is 1.
|
23
51
|
# @return [String|nil] the saved file path.
|
24
52
|
def download_upstream(destination_path, opts = {})
|
25
|
-
|
53
|
+
opts[:source_db] ||= 1
|
54
|
+
source_db = UPSTREAM_DATABASE[:MAPPING][opts[:source_db]]
|
55
|
+
opts[:filename] = UPSTREAM_DATABASE[source_db][:FILENAME]
|
56
|
+
source_url = UPSTREAM_DATABASE[source_db][:URL]
|
57
|
+
download_file(source_url, destination_path, opts)
|
26
58
|
end
|
27
59
|
|
28
|
-
#
|
29
|
-
# @return [Boolean]
|
60
|
+
# Check if an update is available
|
61
|
+
# @return [Boolean] `true` if there is, `false` else.
|
30
62
|
def check_for_update
|
31
|
-
|
32
|
-
|
33
|
-
|
63
|
+
ret_vals = []
|
64
|
+
UPSTREAM_DATABASE[:MAPPING].each do |_k, v|
|
65
|
+
file = download_file(UPSTREAM_DATABASE[v][:URL], Dir.mktmpdir)
|
66
|
+
# Same hash = no update
|
67
|
+
ret_vals << !check_hash(file, UPSTREAM_DATABASE[v][:HASH])
|
68
|
+
end
|
69
|
+
ret_vals.inject(:|) # logical OR, there is an update if at least one entry needs one
|
34
70
|
end
|
35
71
|
|
36
72
|
# Download a file.
|
37
73
|
# @param file_url [String] the URL of the file.
|
38
74
|
# @param destination_path [String] the destination path (may
|
39
75
|
# overwrite existing file).
|
40
|
-
# @param opts [Hash] the optional
|
76
|
+
# @param opts [Hash] the optional download parameters.
|
41
77
|
# @option opts [String] :sha256 the SHA256 hash to check, if the file
|
42
78
|
# already exist and the hash matches then the download will be skipped.
|
79
|
+
# @option opts [String] :filename override upstream filename
|
43
80
|
# @return [String|nil] the saved file path.
|
44
81
|
def download_file(file_url, destination_path, opts = {})
|
45
82
|
opts[:sha256] ||= nil
|
46
83
|
|
47
84
|
destination_path += '/' unless destination_path[-1] == '/'
|
48
85
|
uri = URI(file_url)
|
49
|
-
filename
|
50
|
-
destination_file = destination_path + filename
|
86
|
+
opts[:filename] ||= uri.path.split('/').last
|
87
|
+
destination_file = destination_path + opts[:filename]
|
51
88
|
# Verify hash to see if it is the latest
|
52
89
|
skip_download = check_hash(destination_file, opts[:sha256])
|
53
90
|
write_file(destination_file, fetch_file(uri)) unless skip_download
|
@@ -56,8 +93,8 @@ module PassStation
|
|
56
93
|
# Check if a file match a SHA256 hash
|
57
94
|
# @param file [String] the path of the file.
|
58
95
|
# @param hash [String] tha SHA256 hash to check against.
|
59
|
-
# @return [Boolean] if the hash of the file matched the one provided (
|
60
|
-
# or not (
|
96
|
+
# @return [Boolean] if the hash of the file matched the one provided (`true`)
|
97
|
+
# or not (`false`).
|
61
98
|
def check_hash(file, hash)
|
62
99
|
if !hash.nil? && File.file?(file)
|
63
100
|
computed_h = Digest::SHA256.file(file)
|
@@ -83,9 +120,7 @@ module PassStation
|
|
83
120
|
# @param file_content [String] the content to write in the file
|
84
121
|
# @return [String] destination file path
|
85
122
|
def write_file(destination_file, file_content)
|
86
|
-
File.
|
87
|
-
file.write(file_content)
|
88
|
-
end
|
123
|
+
File.binwrite(destination_file, file_content)
|
89
124
|
destination_file
|
90
125
|
end
|
91
126
|
|
data/lib/pass_station/version.rb
CHANGED
data/lib/pass_station.rb
CHANGED
@@ -16,22 +16,25 @@ module PassStation
|
|
16
16
|
# Password database handling
|
17
17
|
class DB
|
18
18
|
# Get / set storage location, where will be stored the password database.
|
19
|
-
# @return [String] database storage location. Default to
|
19
|
+
# @return [String] database storage location. Default to `data/`.
|
20
20
|
attr_accessor :storage_location
|
21
21
|
|
22
22
|
# Get / set the password database name
|
23
23
|
# @return [String] password database filename. Default to
|
24
|
-
#
|
24
|
+
# `DefaultCreds-Cheat-Sheet.csv`.
|
25
25
|
attr_accessor :database_name
|
26
26
|
|
27
|
-
# Get the password database in
|
28
|
-
# @return [Array<CSV::Row>]
|
27
|
+
# Get the password database in `Array<CSV::Row>` format
|
28
|
+
# @return [Array<CSV::Row>] password database
|
29
29
|
attr_reader :data
|
30
30
|
|
31
31
|
# A new instance of Pass Station
|
32
|
-
|
32
|
+
# @param db [Integer] the credentials source database id (see {UPSTREAM_DATABASE})
|
33
|
+
def initialize(db = nil)
|
34
|
+
db ||= 1
|
33
35
|
@storage_location = 'data/'
|
34
|
-
@
|
36
|
+
@database_type = UPSTREAM_DATABASE[:MAPPING][db]
|
37
|
+
@database_name = UPSTREAM_DATABASE[@database_type][:FILENAME]
|
35
38
|
@database_path = absolute_db_path
|
36
39
|
database_exists?
|
37
40
|
@config = {}
|
@@ -49,7 +52,7 @@ module PassStation
|
|
49
52
|
end
|
50
53
|
|
51
54
|
# Check if the password database exists
|
52
|
-
# @return [Boolean]
|
55
|
+
# @return [Boolean] `true` if the file exists
|
53
56
|
def database_exists?
|
54
57
|
exists = File.file?(@database_path)
|
55
58
|
raise "Database does not exist: #{@database_path}" unless exists
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pass-station
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexandre ZANNI
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: docopt
|
@@ -38,124 +38,6 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '2.2'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: bundler
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 2.1.0
|
48
|
-
- - "<"
|
49
|
-
- !ruby/object:Gem::Version
|
50
|
-
version: '2.3'
|
51
|
-
type: :development
|
52
|
-
prerelease: false
|
53
|
-
version_requirements: !ruby/object:Gem::Requirement
|
54
|
-
requirements:
|
55
|
-
- - ">="
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
version: 2.1.0
|
58
|
-
- - "<"
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
version: '2.3'
|
61
|
-
- !ruby/object:Gem::Dependency
|
62
|
-
name: commonmarker
|
63
|
-
requirement: !ruby/object:Gem::Requirement
|
64
|
-
requirements:
|
65
|
-
- - "~>"
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
version: '0.21'
|
68
|
-
type: :development
|
69
|
-
prerelease: false
|
70
|
-
version_requirements: !ruby/object:Gem::Requirement
|
71
|
-
requirements:
|
72
|
-
- - "~>"
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
version: '0.21'
|
75
|
-
- !ruby/object:Gem::Dependency
|
76
|
-
name: github-markup
|
77
|
-
requirement: !ruby/object:Gem::Requirement
|
78
|
-
requirements:
|
79
|
-
- - "~>"
|
80
|
-
- !ruby/object:Gem::Version
|
81
|
-
version: '3.0'
|
82
|
-
type: :development
|
83
|
-
prerelease: false
|
84
|
-
version_requirements: !ruby/object:Gem::Requirement
|
85
|
-
requirements:
|
86
|
-
- - "~>"
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
version: '3.0'
|
89
|
-
- !ruby/object:Gem::Dependency
|
90
|
-
name: minitest
|
91
|
-
requirement: !ruby/object:Gem::Requirement
|
92
|
-
requirements:
|
93
|
-
- - "~>"
|
94
|
-
- !ruby/object:Gem::Version
|
95
|
-
version: '5.12'
|
96
|
-
type: :development
|
97
|
-
prerelease: false
|
98
|
-
version_requirements: !ruby/object:Gem::Requirement
|
99
|
-
requirements:
|
100
|
-
- - "~>"
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version: '5.12'
|
103
|
-
- !ruby/object:Gem::Dependency
|
104
|
-
name: rake
|
105
|
-
requirement: !ruby/object:Gem::Requirement
|
106
|
-
requirements:
|
107
|
-
- - "~>"
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '13.0'
|
110
|
-
type: :development
|
111
|
-
prerelease: false
|
112
|
-
version_requirements: !ruby/object:Gem::Requirement
|
113
|
-
requirements:
|
114
|
-
- - "~>"
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
version: '13.0'
|
117
|
-
- !ruby/object:Gem::Dependency
|
118
|
-
name: redcarpet
|
119
|
-
requirement: !ruby/object:Gem::Requirement
|
120
|
-
requirements:
|
121
|
-
- - "~>"
|
122
|
-
- !ruby/object:Gem::Version
|
123
|
-
version: '3.5'
|
124
|
-
type: :development
|
125
|
-
prerelease: false
|
126
|
-
version_requirements: !ruby/object:Gem::Requirement
|
127
|
-
requirements:
|
128
|
-
- - "~>"
|
129
|
-
- !ruby/object:Gem::Version
|
130
|
-
version: '3.5'
|
131
|
-
- !ruby/object:Gem::Dependency
|
132
|
-
name: rubocop
|
133
|
-
requirement: !ruby/object:Gem::Requirement
|
134
|
-
requirements:
|
135
|
-
- - "~>"
|
136
|
-
- !ruby/object:Gem::Version
|
137
|
-
version: '1.10'
|
138
|
-
type: :development
|
139
|
-
prerelease: false
|
140
|
-
version_requirements: !ruby/object:Gem::Requirement
|
141
|
-
requirements:
|
142
|
-
- - "~>"
|
143
|
-
- !ruby/object:Gem::Version
|
144
|
-
version: '1.10'
|
145
|
-
- !ruby/object:Gem::Dependency
|
146
|
-
name: yard
|
147
|
-
requirement: !ruby/object:Gem::Requirement
|
148
|
-
requirements:
|
149
|
-
- - "~>"
|
150
|
-
- !ruby/object:Gem::Version
|
151
|
-
version: '0.9'
|
152
|
-
type: :development
|
153
|
-
prerelease: false
|
154
|
-
version_requirements: !ruby/object:Gem::Requirement
|
155
|
-
requirements:
|
156
|
-
- - "~>"
|
157
|
-
- !ruby/object:Gem::Version
|
158
|
-
version: '0.9'
|
159
41
|
description: CLI & library to search for default credentials among thousands of Products
|
160
42
|
/ Vendors
|
161
43
|
email: alexandre.zanni@engineer.com
|
@@ -169,22 +51,24 @@ files:
|
|
169
51
|
- bin/pass-station
|
170
52
|
- bin/pass-station_console
|
171
53
|
- data/DefaultCreds-Cheat-Sheet.csv
|
54
|
+
- data/many-passwords.csv
|
172
55
|
- lib/pass_station.rb
|
173
56
|
- lib/pass_station/output.rb
|
174
57
|
- lib/pass_station/parse.rb
|
175
58
|
- lib/pass_station/search.rb
|
176
59
|
- lib/pass_station/source.rb
|
177
60
|
- lib/pass_station/version.rb
|
178
|
-
homepage: https://
|
61
|
+
homepage: https://noraj.github.io/pass-station/
|
179
62
|
licenses:
|
180
63
|
- MIT
|
181
64
|
metadata:
|
182
65
|
yard.run: yard
|
183
|
-
bug_tracker_uri: https://github.com/
|
184
|
-
changelog_uri: https://github.com/
|
185
|
-
documentation_uri: https://
|
186
|
-
homepage_uri: https://
|
187
|
-
source_code_uri: https://github.com/
|
66
|
+
bug_tracker_uri: https://github.com/noraj/pass-station/issues
|
67
|
+
changelog_uri: https://github.com/noraj/pass-station/blob/master/docs/CHANGELOG.md
|
68
|
+
documentation_uri: https://noraj.github.io/pass-station/yard/
|
69
|
+
homepage_uri: https://noraj.github.io/pass-station/
|
70
|
+
source_code_uri: https://github.com/noraj/pass-station/
|
71
|
+
rubygems_mfa_required: 'true'
|
188
72
|
post_install_message:
|
189
73
|
rdoc_options: []
|
190
74
|
require_paths:
|
@@ -196,14 +80,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
196
80
|
version: 2.6.0
|
197
81
|
- - "<"
|
198
82
|
- !ruby/object:Gem::Version
|
199
|
-
version: '3.
|
83
|
+
version: '3.2'
|
200
84
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
201
85
|
requirements:
|
202
86
|
- - ">="
|
203
87
|
- !ruby/object:Gem::Version
|
204
88
|
version: '0'
|
205
89
|
requirements: []
|
206
|
-
rubygems_version: 3.
|
90
|
+
rubygems_version: 3.3.3
|
207
91
|
signing_key:
|
208
92
|
specification_version: 4
|
209
93
|
summary: CLI & library to search for default credentials among thousands of Products
|