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.
@@ -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: +table+, +'pretty-table'+, +JSON+, +CSV+, +YAML+
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: +table+, +'pretty-table'+, +JSON+, +CSV+, +YAML+
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: +table+, +'pretty-table'+, +JSON+, +CSV+, +YAML+
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 '[-] No result' if @search_result.empty?
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 splitted words and capitalize
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 +Array<CSV::Row>+ into a simple table with justified columns
72
- # @param table [Array<CSV::Row>] an +Array<CSV::Row>+
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
- username: 9,
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
- min_colsizes.each_with_object({}) { |(k, v), h| h[k] = [v, colsizes[k]].max }
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] +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] +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 +Array<CSV::Row>+ into a simple table with justified columns
151
- # @param table [Array<CSV::Row>] an +Array<CSV::Row>+
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] +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] +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 +Array<CSV::Row>+ into a CSV
208
- # @param table [Array<CSV::Row>] an +Array<CSV::Row>+
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 +Array<CSV::Row>+ into JSON
220
- # @param table [Array<CSV::Row>] an +Array<CSV::Row>+
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 +Array<CSV::Row>+ into YAML
234
- # @param table [Array<CSV::Row>] an +Array<CSV::Row>+
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
@@ -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: +:productvendor+, +:username+, +:password+
26
- # @return [Array<CSV::Row>] table of +CSV::Row+, each row contains three
27
- # attributes: :productvendor, :username, :password
28
- def parse(sort = :productvendor)
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
@@ -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: :productvendor | :username | :password | :all (all columns)
10
- # @see build_regexp for +opts+ param description
11
- # @return [Array<CSV::Row>] table of +CSV::Row+, each row contains three
12
- # attributes: :productvendor, :username, :password
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: :productvendor | :username | :password | :all (all columns)
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
- row[:productvendor].match?(rgxp) || row[:username].match?(rgxp) ||
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 polutate the data attribute first' if @data.nil?
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?
@@ -9,45 +9,82 @@ module PassStation
9
9
  # Password database handling
10
10
  class DB
11
11
  UPSTREAM_DATABASE = {
12
- URL: 'https://raw.githubusercontent.com/ihebski/DefaultCreds-cheat-sheet/main/DefaultCreds-Cheat-Sheet.csv',
13
- HASH: 'de6a9f7e7ac94fbcd142ec5817efb71d3a0027076266c87ead5158a4960ec708'
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 downlaod parameters.
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
- download_file(UPSTREAM_DATABASE[:URL], destination_path, opts)
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
- # Chek if an update is available
29
- # @return [Boolean] +true+ if there is, +false+ else.
60
+ # Check if an update is available
61
+ # @return [Boolean] `true` if there is, `false` else.
30
62
  def check_for_update
31
- file = download_file(UPSTREAM_DATABASE[:URL], Dir.mktmpdir)
32
- # Same hash = no update
33
- !check_hash(file, UPSTREAM_DATABASE[:HASH])
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 downlaod parameters.
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 = uri.path.split('/').last
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 (+true+)
60
- # or not (+false+).
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.open(destination_file, 'wb') do |file|
87
- file.write(file_content)
88
- end
123
+ File.binwrite(destination_file, file_content)
89
124
  destination_file
90
125
  end
91
126
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Version
4
- VERSION = '1.2.0'
4
+ VERSION = '1.3.0'
5
5
  end
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 +data/+.
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
- # +DefaultCreds-Cheat-Sheet.csv+.
24
+ # `DefaultCreds-Cheat-Sheet.csv`.
25
25
  attr_accessor :database_name
26
26
 
27
- # Get the password database in +Array<CSV::Row>+ format
28
- # @return [Array<CSV::Row>] pasword database
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
- def initialize
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
- @database_name = 'DefaultCreds-Cheat-Sheet.csv'
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] +true+ if the file exists
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.2.0
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: 2021-03-17 00:00:00.000000000 Z
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://sec-it.github.io/pass-station/
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/sec-it/pass-station/issues
184
- changelog_uri: https://github.com/sec-it/pass-station/blob/master/docs/CHANGELOG.md
185
- documentation_uri: https://sec-it.github.io/pass-station/yard/
186
- homepage_uri: https://sec-it.github.io/pass-station/
187
- source_code_uri: https://github.com/sec-it/pass-station/
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.0'
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.1.4
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