gitlab-license 0.0.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 2a87318ee3ba270b898c8fdd55958d02f219d0ab
4
- data.tar.gz: 6d9394ee078fc45357a4e39a7c79bae098c6d956
2
+ SHA256:
3
+ metadata.gz: 517b48dd59c73e6c06a3141dbbff736b6ac5aec0db0575e81e8eaa9efca214c3
4
+ data.tar.gz: a3ae2f4b90f8ab04f042e420e81b268bd0250ff76234d29424fa22badd127ff9
5
5
  SHA512:
6
- metadata.gz: 19c9de17bb52fcb767e62d1af7c1350ac523ad26073636d57fe6cb2945a29be20374a49ac5d98b83d78e9c393c81f27d801f72ba1da9fb4c79252ef4437fe526
7
- data.tar.gz: 6eab5c49867731fbc886b6e678b910f9501b862f75646c28657301e8c1be00eb65fdffb87a609ed38668c70c0424a68fc93bdd78a419c7b29b69fa51ee907304
6
+ metadata.gz: 7c0b2e7c189d8abad15856eea602aefa67eb772a44609278a7600365389c706aa7b0594a51fed2ea7ade3307162ecbe053d5b17ca3bc7ed0054a104988e1d88d
7
+ data.tar.gz: 4dbaf5ea37ae26de84edd087269b10676879164abc0bee0578c3a6b6af88c832fe0aba70f22ee489de46eeeea2023b33c997ae999b51deeffbb0b05939662d04
data/.rubocop.yml ADDED
@@ -0,0 +1,22 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ require: rubocop-rspec
4
+
5
+ Metrics/BlockLength:
6
+ ExcludedMethods: ['describe', 'context']
7
+
8
+ Style/Alias:
9
+ EnforcedStyle: prefer_alias_method
10
+ Enabled: true
11
+
12
+ Style/HashEachMethods:
13
+ Enabled: true
14
+
15
+ Style/HashTransformKeys:
16
+ Enabled: true
17
+
18
+ Style/HashTransformValues:
19
+ Enabled: true
20
+
21
+ RSpec/MultipleExpectations:
22
+ Enabled: false
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,84 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2020-03-02 14:37:54 -0500 using RuboCop version 0.80.1.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 6
10
+ Metrics/AbcSize:
11
+ Max: 36
12
+
13
+ # Offense count: 1
14
+ # Configuration parameters: CountComments.
15
+ Metrics/ClassLength:
16
+ Max: 129
17
+
18
+ # Offense count: 3
19
+ Metrics/CyclomaticComplexity:
20
+ Max: 16
21
+
22
+ # Offense count: 5
23
+ # Configuration parameters: CountComments, ExcludedMethods.
24
+ Metrics/MethodLength:
25
+ Max: 38
26
+
27
+ # Offense count: 3
28
+ Metrics/PerceivedComplexity:
29
+ Max: 16
30
+
31
+ # Offense count: 3
32
+ Style/Documentation:
33
+ Exclude:
34
+ - 'spec/**/*'
35
+ - 'test/**/*'
36
+ - 'lib/gitlab/license.rb'
37
+ - 'lib/gitlab/license/boundary.rb'
38
+ - 'lib/gitlab/license/encryptor.rb'
39
+
40
+ # Offense count: 12
41
+ # Cop supports --auto-correct.
42
+ # Configuration parameters: EnforcedStyle.
43
+ # SupportedStyles: always, always_true, never
44
+ Style/FrozenStringLiteralComment:
45
+ Exclude:
46
+ - 'Gemfile'
47
+ - 'Rakefile'
48
+ - 'bin/console'
49
+ - 'gitlab-license.gemspec'
50
+ - 'lib/gitlab/license.rb'
51
+ - 'lib/gitlab/license/boundary.rb'
52
+ - 'lib/gitlab/license/encryptor.rb'
53
+ - 'lib/gitlab/license/version.rb'
54
+ - 'spec/gitlab/license/boundary_spec.rb'
55
+ - 'spec/gitlab/license/encryptor_spec.rb'
56
+ - 'spec/gitlab/license_spec.rb'
57
+ - 'spec/spec_helper.rb'
58
+
59
+ # Offense count: 1
60
+ # Configuration parameters: MinBodyLength.
61
+ Style/GuardClause:
62
+ Exclude:
63
+ - 'lib/gitlab/license.rb'
64
+
65
+ # Offense count: 1
66
+ # Cop supports --auto-correct.
67
+ # Configuration parameters: EnforcedStyle.
68
+ # SupportedStyles: short, verbose
69
+ Style/PreferredHashMethods:
70
+ Exclude:
71
+ - 'lib/gitlab/license.rb'
72
+
73
+ # Offense count: 1
74
+ # Cop supports --auto-correct.
75
+ Style/RescueModifier:
76
+ Exclude:
77
+ - 'lib/gitlab/license.rb'
78
+
79
+ # Offense count: 14
80
+ # Cop supports --auto-correct.
81
+ # Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
82
+ # URISchemes: http, https
83
+ Layout/LineLength:
84
+ Max: 104
data/README.md CHANGED
@@ -48,9 +48,9 @@ license.licensee = {
48
48
  "Email" => "douwe@gitlab.com"
49
49
  }
50
50
 
51
- # The date the license was issued.
51
+ # The date the license starts.
52
52
  # Required.
53
- license.issued_at = Date.new(2015, 4, 24)
53
+ license.starts_at = Date.new(2015, 4, 24)
54
54
  # The date the license expires.
55
55
  # Not required, to allow lifetime licenses.
56
56
  license.expires_at = Date.new(2016, 4, 23)
data/Rakefile CHANGED
@@ -1 +1 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler/gem_tasks'
data/bin/console CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "bundler/setup"
4
- require "gitlab/license"
3
+ require 'bundler/setup'
4
+ require 'gitlab/license'
5
5
 
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +10,5 @@ require "gitlab/license"
10
10
  # require "pry"
11
11
  # Pry.start
12
12
 
13
- require "irb"
13
+ require 'irb'
14
14
  IRB.start
@@ -1,24 +1,28 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'gitlab/license/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "gitlab-license"
6
+ spec.name = 'gitlab-license'
8
7
  spec.version = Gitlab::License::VERSION
9
- spec.authors = ["Douwe Maan"]
10
- spec.email = ["douwe@gitlab.com"]
8
+ spec.authors = ['Douwe Maan', 'Stan Hu', 'Tyler Amos']
9
+ spec.email = ['douwe@gitlab.com', 'stanhu@gitlab.com', 'tamos@gitlab.com']
11
10
 
12
- spec.summary = %q{gitlab-license helps you generate, verify and enforce software licenses.}
13
- spec.homepage = "https://gitlab.com/gitlab-org/gitlab-license"
14
- spec.license = "MIT"
11
+ spec.summary = 'gitlab-license helps you generate, verify and enforce software licenses.'
12
+ spec.homepage = 'https://dev.gitlab.org/gitlab/gitlab-license'
13
+ spec.license = 'MIT'
15
14
 
16
15
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
- spec.bindir = "exe"
16
+ spec.bindir = 'exe'
18
17
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
- spec.require_paths = ["lib"]
18
+ spec.require_paths = ['lib']
20
19
 
21
- spec.add_development_dependency "bundler", "~> 1.9"
22
- spec.add_development_dependency "rake", "~> 10.0"
23
- spec.add_development_dependency "byebug"
20
+ spec.required_ruby_version = '>= 2.3.0'
21
+
22
+ spec.add_development_dependency 'bundler', '~> 1.9'
23
+ spec.add_development_dependency 'byebug'
24
+ spec.add_development_dependency 'rake', '~> 10.0'
25
+ spec.add_development_dependency 'rspec', '~> 3.9'
26
+ spec.add_development_dependency 'rubocop', '~> 0.80.1'
27
+ spec.add_development_dependency 'rubocop-rspec', '~> 1.38.1'
24
28
  end
@@ -0,0 +1,40 @@
1
+ module Gitlab
2
+ class License
3
+ module Boundary
4
+ BOUNDARY_START = /(\A|\r?\n)-*BEGIN .+? LICENSE-*\r?\n/.freeze
5
+ BOUNDARY_END = /\r?\n-*END .+? LICENSE-*(\r?\n|\z)/.freeze
6
+
7
+ class << self
8
+ def add_boundary(data, product_name)
9
+ data = remove_boundary(data)
10
+
11
+ product_name.upcase!
12
+
13
+ pad = lambda do |message, width|
14
+ total_padding = [width - message.length, 0].max
15
+
16
+ padding = total_padding / 2.0
17
+ [
18
+ '-' * padding.ceil,
19
+ message,
20
+ '-' * padding.floor
21
+ ].join
22
+ end
23
+
24
+ [
25
+ pad.call("BEGIN #{product_name} LICENSE", 60),
26
+ data.strip,
27
+ pad.call("END #{product_name} LICENSE", 60)
28
+ ].join("\n")
29
+ end
30
+
31
+ def remove_boundary(data)
32
+ after_boundary = data.split(BOUNDARY_START).last
33
+ in_boundary = after_boundary.split(BOUNDARY_END).first
34
+
35
+ in_boundary
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -8,17 +8,13 @@ module Gitlab
8
8
  attr_accessor :key
9
9
 
10
10
  def initialize(key)
11
- if key && !key.is_a?(OpenSSL::PKey::RSA)
12
- raise KeyError, "No RSA encryption key provided."
13
- end
11
+ raise KeyError, 'No RSA encryption key provided.' if key && !key.is_a?(OpenSSL::PKey::RSA)
14
12
 
15
13
  @key = key
16
14
  end
17
15
 
18
16
  def encrypt(data)
19
- unless key.private?
20
- raise KeyError, "Provided key is not a private key."
21
- end
17
+ raise KeyError, 'Provided key is not a private key.' unless key.private?
22
18
 
23
19
  # Encrypt the data using symmetric AES encryption.
24
20
  cipher = OpenSSL::Cipher::AES128.new(:CBC)
@@ -29,12 +25,12 @@ module Gitlab
29
25
  encrypted_data = cipher.update(data) + cipher.final
30
26
 
31
27
  # Encrypt the AES key using asymmetric RSA encryption.
32
- encrypted_key = self.key.private_encrypt(aes_key)
28
+ encrypted_key = key.private_encrypt(aes_key)
33
29
 
34
30
  encryption_data = {
35
- "data" => Base64.encode64(encrypted_data),
36
- "key" => Base64.encode64(encrypted_key),
37
- "iv" => Base64.encode64(aes_iv)
31
+ 'data' => Base64.encode64(encrypted_data),
32
+ 'key' => Base64.encode64(encrypted_key),
33
+ 'iv' => Base64.encode64(aes_iv)
38
34
  }
39
35
 
40
36
  json_data = JSON.dump(encryption_data)
@@ -42,31 +38,29 @@ module Gitlab
42
38
  end
43
39
 
44
40
  def decrypt(data)
45
- unless key.public?
46
- raise KeyError, "Provided key is not a public key."
47
- end
41
+ raise KeyError, 'Provided key is not a public key.' unless key.public?
48
42
 
49
43
  json_data = Base64.decode64(data.chomp)
50
44
 
51
45
  begin
52
46
  encryption_data = JSON.parse(json_data)
53
47
  rescue JSON::ParserError
54
- raise DecryptionError, "Encryption data is invalid JSON."
48
+ raise DecryptionError, 'Encryption data is invalid JSON.'
55
49
  end
56
50
 
57
- unless %w(data key iv).all? { |key| encryption_data[key] }
58
- raise DecryptionError, "Required field missing from encryption data."
51
+ unless %w[data key iv].all? { |key| encryption_data[key] }
52
+ raise DecryptionError, 'Required field missing from encryption data.'
59
53
  end
60
54
 
61
- encrypted_data = Base64.decode64(encryption_data["data"])
62
- encrypted_key = Base64.decode64(encryption_data["key"])
63
- aes_iv = Base64.decode64(encryption_data["iv"])
55
+ encrypted_data = Base64.decode64(encryption_data['data'])
56
+ encrypted_key = Base64.decode64(encryption_data['key'])
57
+ aes_iv = Base64.decode64(encryption_data['iv'])
64
58
 
65
59
  begin
66
60
  # Decrypt the AES key using asymmetric RSA encryption.
67
61
  aes_key = self.key.public_decrypt(encrypted_key)
68
62
  rescue OpenSSL::PKey::RSAError
69
- raise DecryptionError, "AES encryption key could not be decrypted."
63
+ raise DecryptionError, 'AES encryption key could not be decrypted.'
70
64
  end
71
65
 
72
66
  # Decrypt the data using symmetric AES encryption.
@@ -74,21 +68,21 @@ module Gitlab
74
68
  cipher.decrypt
75
69
 
76
70
  begin
77
- cipher.key = aes_key
71
+ cipher.key = aes_key
78
72
  rescue OpenSSL::Cipher::CipherError
79
- raise DecryptionError, "AES encryption key is invalid."
73
+ raise DecryptionError, 'AES encryption key is invalid.'
80
74
  end
81
75
 
82
76
  begin
83
- cipher.iv = aes_iv
77
+ cipher.iv = aes_iv
84
78
  rescue OpenSSL::Cipher::CipherError
85
- raise DecryptionError, "AES IV is invalid."
79
+ raise DecryptionError, 'AES IV is invalid.'
86
80
  end
87
81
 
88
82
  begin
89
83
  data = cipher.update(encrypted_data) + cipher.final
90
84
  rescue OpenSSL::Cipher::CipherError
91
- raise DecryptionError, "Data could not be decrypted."
85
+ raise DecryptionError, 'Data could not be decrypted.'
92
86
  end
93
87
 
94
88
  data
@@ -1,5 +1,5 @@
1
1
  module Gitlab
2
2
  class License
3
- VERSION = "0.0.2"
3
+ VERSION = '2.0.0'.freeze
4
4
  end
5
5
  end
@@ -1,10 +1,11 @@
1
- require "openssl"
2
- require "date"
3
- require "json"
4
- require "base64"
1
+ require 'openssl'
2
+ require 'date'
3
+ require 'json'
4
+ require 'base64'
5
5
 
6
- require "gitlab/license/version"
7
- require "gitlab/license/encryptor"
6
+ require 'gitlab/license/version'
7
+ require 'gitlab/license/encryptor'
8
+ require 'gitlab/license/boundary'
8
9
 
9
10
  module Gitlab
10
11
  class License
@@ -17,89 +18,139 @@ module Gitlab
17
18
  @encryption_key = nil
18
19
 
19
20
  def encryption_key=(key)
20
- if key && !key.is_a?(OpenSSL::PKey::RSA)
21
- raise ArgumentError, "No RSA encryption key provided."
22
- end
21
+ raise ArgumentError, 'No RSA encryption key provided.' if key && !key.is_a?(OpenSSL::PKey::RSA)
23
22
 
24
23
  @encryption_key = key
24
+ @encryptor = nil
25
25
  end
26
26
 
27
27
  def encryptor
28
- @encryptor ||= Encryptor.new(self.encryption_key)
28
+ @encryptor ||= Encryptor.new(encryption_key)
29
29
  end
30
30
 
31
31
  def import(data)
32
+ raise ImportError, 'No license data.' if data.nil?
33
+
34
+ data = Boundary.remove_boundary(data)
35
+
32
36
  begin
33
37
  license_json = encryptor.decrypt(data)
34
38
  rescue Encryptor::Error
35
- raise ImportError, "License data could not be decrypted."
39
+ raise ImportError, 'License data could not be decrypted.'
36
40
  end
37
41
 
38
42
  begin
39
43
  attributes = JSON.parse(license_json)
40
44
  rescue JSON::ParseError
41
- raise ImportError, "License data is invalid JSON."
45
+ raise ImportError, 'License data is invalid JSON.'
42
46
  end
43
-
47
+
44
48
  new(attributes)
45
49
  end
46
50
  end
47
51
 
48
52
  attr_reader :version
49
- attr_accessor :licensee, :issued_at, :expires_at
50
- attr_accessor :notify_admins_at, :notify_users_at, :block_changes_at
51
- attr_accessor :restrictions
53
+ attr_accessor :licensee, :starts_at, :expires_at, :notify_admins_at,
54
+ :notify_users_at, :block_changes_at, :last_synced_at, :next_sync_at,
55
+ :activated_at, :restrictions, :cloud_licensing_enabled, :auto_renew_enabled,
56
+ :seat_reconciliation_enabled, :operational_metrics_enabled,
57
+ :generated_from_customers_dot
58
+
59
+ alias_method :issued_at, :starts_at
60
+ alias_method :issued_at=, :starts_at=
52
61
 
53
62
  def initialize(attributes = {})
54
63
  load_attributes(attributes)
55
64
  end
56
65
 
57
66
  def valid?
58
- return false if !licensee || !licensee.is_a?(Hash) || licensee.length == 0
59
- return false if !issued_at || !issued_at.is_a?(Date)
60
- return false if expires_at && !expires_at.is_a?(Date)
61
- return false if notify_admins_at && !notify_admins_at.is_a?(Date)
62
- return false if notify_users_at && !notify_users_at.is_a?(Date)
63
- return false if block_changes_at && !block_changes_at.is_a?(Date)
64
- return false if restrictions && !restrictions.is_a?(Hash)
65
-
66
- true
67
+ if !licensee || !licensee.is_a?(Hash) || licensee.empty?
68
+ false
69
+ elsif !starts_at || !starts_at.is_a?(Date)
70
+ false
71
+ elsif expires_at && !expires_at.is_a?(Date)
72
+ false
73
+ elsif notify_admins_at && !notify_admins_at.is_a?(Date)
74
+ false
75
+ elsif notify_users_at && !notify_users_at.is_a?(Date)
76
+ false
77
+ elsif block_changes_at && !block_changes_at.is_a?(Date)
78
+ false
79
+ elsif last_synced_at && !last_synced_at.is_a?(DateTime)
80
+ false
81
+ elsif next_sync_at && !next_sync_at.is_a?(DateTime)
82
+ false
83
+ elsif activated_at && !activated_at.is_a?(DateTime)
84
+ false
85
+ elsif restrictions && !restrictions.is_a?(Hash)
86
+ false
87
+ else
88
+ true
89
+ end
67
90
  end
68
91
 
69
92
  def validate!
70
- raise ValidationError, "License is invalid" unless valid?
93
+ raise ValidationError, 'License is invalid' unless valid?
71
94
  end
72
95
 
73
96
  def will_expire?
74
- self.expires_at
97
+ expires_at
75
98
  end
76
99
 
77
100
  def will_notify_admins?
78
- self.notify_admins_at
101
+ notify_admins_at
79
102
  end
80
103
 
81
104
  def will_notify_users?
82
- self.notify_users_at
105
+ notify_users_at
83
106
  end
84
107
 
85
108
  def will_block_changes?
86
- self.block_changes_at
109
+ block_changes_at
110
+ end
111
+
112
+ def will_sync?
113
+ next_sync_at
114
+ end
115
+
116
+ def activated?
117
+ activated_at
87
118
  end
88
119
 
89
120
  def expired?
90
- will_expire? && Date.today >= self.expires_at
121
+ will_expire? && Date.today >= expires_at
91
122
  end
92
123
 
93
124
  def notify_admins?
94
- will_notify_admins? && Date.today >= self.notify_admins_at
125
+ will_notify_admins? && Date.today >= notify_admins_at
95
126
  end
96
127
 
97
128
  def notify_users?
98
- will_notify_users? && Date.today >= self.notify_users_at
129
+ will_notify_users? && Date.today >= notify_users_at
99
130
  end
100
131
 
101
132
  def block_changes?
102
- will_block_changes? && Date.today >= self.block_changes_at
133
+ will_block_changes? && Date.today >= block_changes_at
134
+ end
135
+
136
+ def cloud_licensing?
137
+ cloud_licensing_enabled == true
138
+ end
139
+
140
+ def auto_renew?
141
+ auto_renew_enabled == true
142
+ end
143
+
144
+ def seat_reconciliation?
145
+ seat_reconciliation_enabled == true
146
+ end
147
+
148
+ def operational_metrics?
149
+ operational_metrics_enabled == true
150
+ end
151
+
152
+ def generated_from_customers_dot?
153
+ generated_from_customers_dot == true
103
154
  end
104
155
 
105
156
  def restricted?(key = nil)
@@ -110,32 +161,49 @@ module Gitlab
110
161
  end
111
162
  end
112
163
 
113
- def attributes
164
+ def attributes
114
165
  hash = {}
115
166
 
116
- hash["version"] = self.version
117
- hash["licensee"] = self.licensee
167
+ hash['version'] = version
168
+ hash['licensee'] = licensee
169
+
170
+ # `issued_at` is the legacy name for starts_at.
171
+ # TODO: Move to starts_at in a next version.
172
+ hash['issued_at'] = starts_at
173
+ hash['expires_at'] = expires_at if will_expire?
174
+
175
+ hash['notify_admins_at'] = notify_admins_at if will_notify_admins?
176
+ hash['notify_users_at'] = notify_users_at if will_notify_users?
177
+ hash['block_changes_at'] = block_changes_at if will_block_changes?
118
178
 
119
- hash["issued_at"] = self.issued_at
120
- hash["expires_at"] = self.expires_at if self.will_expire?
179
+ hash['next_sync_at'] = next_sync_at if will_sync?
180
+ hash['last_synced_at'] = last_synced_at if will_sync?
181
+ hash['activated_at'] = activated_at if activated?
121
182
 
122
- hash["notify_admins_at"] = self.notify_admins_at if self.will_notify_admins?
123
- hash["notify_users_at"] = self.notify_users_at if self.will_notify_users?
124
- hash["block_changes_at"] = self.block_changes_at if self.will_block_changes?
183
+ hash['cloud_licensing_enabled'] = cloud_licensing?
184
+ hash['auto_renew_enabled'] = auto_renew?
185
+ hash['seat_reconciliation_enabled'] = seat_reconciliation?
186
+ hash['operational_metrics_enabled'] = operational_metrics?
125
187
 
126
- hash["restrictions"] = self.restrictions if self.restricted?
188
+ hash['generated_from_customers_dot'] = generated_from_customers_dot?
189
+
190
+ hash['restrictions'] = restrictions if restricted?
127
191
 
128
192
  hash
129
193
  end
130
194
 
131
- def to_json
132
- JSON.dump(self.attributes)
195
+ def to_json(*_args)
196
+ JSON.dump(attributes)
133
197
  end
134
198
 
135
- def export
199
+ def export(boundary: nil)
136
200
  validate!
137
201
 
138
- self.class.encryptor.encrypt(self.to_json)
202
+ data = self.class.encryptor.encrypt(to_json)
203
+
204
+ data = Boundary.add_boundary(data, boundary) if boundary
205
+
206
+ data
139
207
  end
140
208
 
141
209
  private
@@ -143,29 +211,50 @@ module Gitlab
143
211
  def load_attributes(attributes)
144
212
  attributes = Hash[attributes.map { |k, v| [k.to_s, v] }]
145
213
 
146
- version = attributes["version"] || 1
147
- unless version && version == 1
148
- raise ArgumentError, "Version is too new"
149
- end
214
+ version = attributes['version'] || 1
215
+ raise ArgumentError, 'Version is too new' unless version && version == 1
150
216
 
151
217
  @version = version
152
218
 
153
- @licensee = attributes["licensee"]
219
+ @licensee = attributes['licensee']
154
220
 
155
- %w(issued_at expires_at notify_admins_at notify_users_at block_changes_at).each do |attr|
156
- value = attributes[attr]
157
- value = Date.parse(value) rescue nil if value.is_a?(String)
158
-
159
- next unless value
221
+ # `issued_at` is the legacy name for starts_at.
222
+ # TODO: Move to starts_at in a next version.
223
+ %w[issued_at expires_at notify_admins_at notify_users_at block_changes_at].each do |attr_name|
224
+ set_date_attribute(attr_name, attributes[attr_name])
225
+ end
226
+
227
+ %w[last_synced_at next_sync_at activated_at].each do |attr_name|
228
+ set_datetime_attribute(attr_name, attributes[attr_name])
229
+ end
160
230
 
161
- send("#{attr}=", value)
231
+ %w[
232
+ cloud_licensing_enabled
233
+ auto_renew_enabled
234
+ seat_reconciliation_enabled
235
+ operational_metrics_enabled
236
+ generated_from_customers_dot
237
+ ].each do |attr_name|
238
+ public_send("#{attr_name}=", attributes[attr_name] == true)
162
239
  end
163
240
 
164
- restrictions = attributes["restrictions"]
165
- if restrictions && restrictions.is_a?(Hash)
241
+ restrictions = attributes['restrictions']
242
+ if restrictions&.is_a?(Hash)
166
243
  restrictions = Hash[restrictions.map { |k, v| [k.to_sym, v] }]
167
244
  @restrictions = restrictions
168
245
  end
169
246
  end
247
+
248
+ def set_date_attribute(attr_name, value, date_class = Date)
249
+ value = date_class.parse(value) rescue nil if value.is_a?(String)
250
+
251
+ return unless value
252
+
253
+ public_send("#{attr_name}=", value)
254
+ end
255
+
256
+ def set_datetime_attribute(attr_name, value)
257
+ set_date_attribute(attr_name, value, DateTime)
258
+ end
170
259
  end
171
260
  end
metadata CHANGED
@@ -1,14 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-license
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Douwe Maan
8
+ - Stan Hu
9
+ - Tyler Amos
8
10
  autorequire:
9
11
  bindir: exe
10
12
  cert_chain: []
11
- date: 2015-05-05 00:00:00.000000000 Z
13
+ date: 2021-06-23 00:00:00.000000000 Z
12
14
  dependencies:
13
15
  - !ruby/object:Gem::Dependency
14
16
  name: bundler
@@ -24,6 +26,20 @@ dependencies:
24
26
  - - "~>"
25
27
  - !ruby/object:Gem::Version
26
28
  version: '1.9'
29
+ - !ruby/object:Gem::Dependency
30
+ name: byebug
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ type: :development
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
27
43
  - !ruby/object:Gem::Dependency
28
44
  name: rake
29
45
  requirement: !ruby/object:Gem::Requirement
@@ -39,28 +55,60 @@ dependencies:
39
55
  - !ruby/object:Gem::Version
40
56
  version: '10.0'
41
57
  - !ruby/object:Gem::Dependency
42
- name: byebug
58
+ name: rspec
43
59
  requirement: !ruby/object:Gem::Requirement
44
60
  requirements:
45
- - - ">="
61
+ - - "~>"
46
62
  - !ruby/object:Gem::Version
47
- version: '0'
63
+ version: '3.9'
48
64
  type: :development
49
65
  prerelease: false
50
66
  version_requirements: !ruby/object:Gem::Requirement
51
67
  requirements:
52
- - - ">="
68
+ - - "~>"
53
69
  - !ruby/object:Gem::Version
54
- version: '0'
70
+ version: '3.9'
71
+ - !ruby/object:Gem::Dependency
72
+ name: rubocop
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: 0.80.1
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: 0.80.1
85
+ - !ruby/object:Gem::Dependency
86
+ name: rubocop-rspec
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: 1.38.1
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - "~>"
97
+ - !ruby/object:Gem::Version
98
+ version: 1.38.1
55
99
  description:
56
100
  email:
57
101
  - douwe@gitlab.com
102
+ - stanhu@gitlab.com
103
+ - tamos@gitlab.com
58
104
  executables: []
59
105
  extensions: []
60
106
  extra_rdoc_files: []
61
107
  files:
62
108
  - ".gitignore"
63
109
  - ".rspec"
110
+ - ".rubocop.yml"
111
+ - ".rubocop_todo.yml"
64
112
  - ".travis.yml"
65
113
  - Gemfile
66
114
  - LICENSE.txt
@@ -70,9 +118,10 @@ files:
70
118
  - bin/setup
71
119
  - gitlab-license.gemspec
72
120
  - lib/gitlab/license.rb
121
+ - lib/gitlab/license/boundary.rb
73
122
  - lib/gitlab/license/encryptor.rb
74
123
  - lib/gitlab/license/version.rb
75
- homepage: https://gitlab.com/gitlab-org/gitlab-license
124
+ homepage: https://dev.gitlab.org/gitlab/gitlab-license
76
125
  licenses:
77
126
  - MIT
78
127
  metadata: {}
@@ -84,15 +133,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
84
133
  requirements:
85
134
  - - ">="
86
135
  - !ruby/object:Gem::Version
87
- version: '0'
136
+ version: 2.3.0
88
137
  required_rubygems_version: !ruby/object:Gem::Requirement
89
138
  requirements:
90
139
  - - ">="
91
140
  - !ruby/object:Gem::Version
92
141
  version: '0'
93
142
  requirements: []
94
- rubyforge_project:
95
- rubygems_version: 2.2.2
143
+ rubygems_version: 3.0.3
96
144
  signing_key:
97
145
  specification_version: 4
98
146
  summary: gitlab-license helps you generate, verify and enforce software licenses.