pass-station 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|