pass-station 1.2.2 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,7 +29,7 @@ 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
35
  return [] if @search_result.empty?
@@ -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: '2107f3105bcc1a218a646beac6f92e2e8c639fac1f3f3e4a3da76b3d14a40dc8'
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.2'
4
+ VERSION = '1.4.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.2
4
+ version: 1.4.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-07-22 00:00:00.000000000 Z
11
+ date: 2022-09-10 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.1'
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.2.15
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