gitlab-license 1.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.rubocop.yml +22 -0
- data/.rubocop_todo.yml +84 -0
- data/Rakefile +1 -1
- data/bin/console +3 -3
- data/gitlab-license.gemspec +17 -13
- data/lib/gitlab/license/boundary.rb +2 -2
- data/lib/gitlab/license/encryptor.rb +19 -25
- data/lib/gitlab/license/version.rb +1 -1
- data/lib/gitlab/license.rb +141 -65
- metadata +58 -11
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 1f9153bcc9df80fb7bcc879d15ae1e21709cec7a352ffd5c0c4de2ae082473d6
|
|
4
|
+
data.tar.gz: a36810ea464918c2f25bb40ebfe877b8561131bebfbf1e0d9530f1270f5f2816
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b37464c9ce48c030aebf3ca982bc2d4831367e0169e09c76d58e152124d6ed63202dd284e63b13c86f6eb7651cc0692db8685cc29a9bf44409167a45ce3cf722
|
|
7
|
+
data.tar.gz: 935474c12b21840724ae4ed064f6db461777751dae4d7454917b9ada0b93eb80138f4d678ba3b48efb6ed946da38aa11422adf5a4eadef024d3981102ec5b2cf
|
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/Rakefile
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
require
|
|
1
|
+
require 'bundler/gem_tasks'
|
data/bin/console
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
|
|
3
|
-
require
|
|
4
|
-
require
|
|
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
|
|
13
|
+
require 'irb'
|
|
14
14
|
IRB.start
|
data/gitlab-license.gemspec
CHANGED
|
@@ -1,24 +1,28 @@
|
|
|
1
|
-
|
|
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 =
|
|
6
|
+
spec.name = 'gitlab-license'
|
|
8
7
|
spec.version = Gitlab::License::VERSION
|
|
9
|
-
spec.authors = [
|
|
10
|
-
spec.email = [
|
|
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 =
|
|
13
|
-
spec.homepage =
|
|
14
|
-
spec.license =
|
|
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 =
|
|
16
|
+
spec.bindir = 'exe'
|
|
18
17
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
19
|
-
spec.require_paths = [
|
|
18
|
+
spec.require_paths = ['lib']
|
|
20
19
|
|
|
21
|
-
spec.
|
|
22
|
-
|
|
23
|
-
spec.add_development_dependency
|
|
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
|
|
@@ -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 =
|
|
28
|
+
encrypted_key = key.private_encrypt(aes_key)
|
|
33
29
|
|
|
34
30
|
encryption_data = {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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,
|
|
48
|
+
raise DecryptionError, 'Encryption data is invalid JSON.'
|
|
55
49
|
end
|
|
56
50
|
|
|
57
|
-
unless %w
|
|
58
|
-
raise DecryptionError,
|
|
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[
|
|
62
|
-
encrypted_key = Base64.decode64(encryption_data[
|
|
63
|
-
aes_iv = Base64.decode64(encryption_data[
|
|
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,
|
|
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
|
|
71
|
+
cipher.key = aes_key
|
|
78
72
|
rescue OpenSSL::Cipher::CipherError
|
|
79
|
-
raise DecryptionError,
|
|
73
|
+
raise DecryptionError, 'AES encryption key is invalid.'
|
|
80
74
|
end
|
|
81
75
|
|
|
82
76
|
begin
|
|
83
|
-
cipher.iv
|
|
77
|
+
cipher.iv = aes_iv
|
|
84
78
|
rescue OpenSSL::Cipher::CipherError
|
|
85
|
-
raise DecryptionError,
|
|
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,
|
|
85
|
+
raise DecryptionError, 'Data could not be decrypted.'
|
|
92
86
|
end
|
|
93
87
|
|
|
94
88
|
data
|
data/lib/gitlab/license.rb
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
require
|
|
2
|
-
require
|
|
3
|
-
require
|
|
4
|
-
require
|
|
1
|
+
require 'openssl'
|
|
2
|
+
require 'date'
|
|
3
|
+
require 'json'
|
|
4
|
+
require 'base64'
|
|
5
5
|
|
|
6
|
-
require
|
|
7
|
-
require
|
|
8
|
-
require
|
|
6
|
+
require 'gitlab/license/version'
|
|
7
|
+
require 'gitlab/license/encryptor'
|
|
8
|
+
require 'gitlab/license/boundary'
|
|
9
9
|
|
|
10
10
|
module Gitlab
|
|
11
11
|
class License
|
|
@@ -18,35 +18,31 @@ module Gitlab
|
|
|
18
18
|
@encryption_key = nil
|
|
19
19
|
|
|
20
20
|
def encryption_key=(key)
|
|
21
|
-
if key && !key.is_a?(OpenSSL::PKey::RSA)
|
|
22
|
-
raise ArgumentError, "No RSA encryption key provided."
|
|
23
|
-
end
|
|
21
|
+
raise ArgumentError, 'No RSA encryption key provided.' if key && !key.is_a?(OpenSSL::PKey::RSA)
|
|
24
22
|
|
|
25
23
|
@encryption_key = key
|
|
26
24
|
@encryptor = nil
|
|
27
25
|
end
|
|
28
26
|
|
|
29
27
|
def encryptor
|
|
30
|
-
@encryptor ||= Encryptor.new(
|
|
28
|
+
@encryptor ||= Encryptor.new(encryption_key)
|
|
31
29
|
end
|
|
32
30
|
|
|
33
31
|
def import(data)
|
|
34
|
-
if data.nil?
|
|
35
|
-
raise ImportError, "No license data."
|
|
36
|
-
end
|
|
32
|
+
raise ImportError, 'No license data.' if data.nil?
|
|
37
33
|
|
|
38
34
|
data = Boundary.remove_boundary(data)
|
|
39
35
|
|
|
40
36
|
begin
|
|
41
37
|
license_json = encryptor.decrypt(data)
|
|
42
38
|
rescue Encryptor::Error
|
|
43
|
-
raise ImportError,
|
|
39
|
+
raise ImportError, 'License data could not be decrypted.'
|
|
44
40
|
end
|
|
45
41
|
|
|
46
42
|
begin
|
|
47
43
|
attributes = JSON.parse(license_json)
|
|
48
44
|
rescue JSON::ParseError
|
|
49
|
-
raise ImportError,
|
|
45
|
+
raise ImportError, 'License data is invalid JSON.'
|
|
50
46
|
end
|
|
51
47
|
|
|
52
48
|
new(attributes)
|
|
@@ -54,9 +50,11 @@ module Gitlab
|
|
|
54
50
|
end
|
|
55
51
|
|
|
56
52
|
attr_reader :version
|
|
57
|
-
attr_accessor :licensee, :starts_at, :expires_at
|
|
58
|
-
|
|
59
|
-
|
|
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,
|
|
56
|
+
:offline_cloud_licensing_enabled, :auto_renew_enabled, :seat_reconciliation_enabled,
|
|
57
|
+
:operational_metrics_enabled, :generated_from_customers_dot
|
|
60
58
|
|
|
61
59
|
alias_method :issued_at, :starts_at
|
|
62
60
|
alias_method :issued_at=, :starts_at=
|
|
@@ -66,51 +64,99 @@ module Gitlab
|
|
|
66
64
|
end
|
|
67
65
|
|
|
68
66
|
def valid?
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
+
elsif !cloud_licensing? && offline_cloud_licensing?
|
|
88
|
+
false
|
|
89
|
+
else
|
|
90
|
+
true
|
|
91
|
+
end
|
|
78
92
|
end
|
|
79
93
|
|
|
80
94
|
def validate!
|
|
81
|
-
raise ValidationError,
|
|
95
|
+
raise ValidationError, 'License is invalid' unless valid?
|
|
82
96
|
end
|
|
83
97
|
|
|
84
98
|
def will_expire?
|
|
85
|
-
|
|
99
|
+
expires_at
|
|
86
100
|
end
|
|
87
101
|
|
|
88
102
|
def will_notify_admins?
|
|
89
|
-
|
|
103
|
+
notify_admins_at
|
|
90
104
|
end
|
|
91
105
|
|
|
92
106
|
def will_notify_users?
|
|
93
|
-
|
|
107
|
+
notify_users_at
|
|
94
108
|
end
|
|
95
109
|
|
|
96
110
|
def will_block_changes?
|
|
97
|
-
|
|
111
|
+
block_changes_at
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def will_sync?
|
|
115
|
+
next_sync_at
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def activated?
|
|
119
|
+
activated_at
|
|
98
120
|
end
|
|
99
121
|
|
|
100
122
|
def expired?
|
|
101
|
-
will_expire? && Date.today >=
|
|
123
|
+
will_expire? && Date.today >= expires_at
|
|
102
124
|
end
|
|
103
125
|
|
|
104
126
|
def notify_admins?
|
|
105
|
-
will_notify_admins? && Date.today >=
|
|
127
|
+
will_notify_admins? && Date.today >= notify_admins_at
|
|
106
128
|
end
|
|
107
129
|
|
|
108
130
|
def notify_users?
|
|
109
|
-
will_notify_users? && Date.today >=
|
|
131
|
+
will_notify_users? && Date.today >= notify_users_at
|
|
110
132
|
end
|
|
111
133
|
|
|
112
134
|
def block_changes?
|
|
113
|
-
will_block_changes? && Date.today >=
|
|
135
|
+
will_block_changes? && Date.today >= block_changes_at
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def cloud_licensing?
|
|
139
|
+
cloud_licensing_enabled == true
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def offline_cloud_licensing?
|
|
143
|
+
offline_cloud_licensing_enabled == true
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def auto_renew?
|
|
147
|
+
auto_renew_enabled == true
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def seat_reconciliation?
|
|
151
|
+
seat_reconciliation_enabled == true
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def operational_metrics?
|
|
155
|
+
operational_metrics_enabled == true
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def generated_from_customers_dot?
|
|
159
|
+
generated_from_customers_dot == true
|
|
114
160
|
end
|
|
115
161
|
|
|
116
162
|
def restricted?(key = nil)
|
|
@@ -124,35 +170,45 @@ module Gitlab
|
|
|
124
170
|
def attributes
|
|
125
171
|
hash = {}
|
|
126
172
|
|
|
127
|
-
hash[
|
|
128
|
-
hash[
|
|
173
|
+
hash['version'] = version
|
|
174
|
+
hash['licensee'] = licensee
|
|
129
175
|
|
|
130
176
|
# `issued_at` is the legacy name for starts_at.
|
|
131
177
|
# TODO: Move to starts_at in a next version.
|
|
132
|
-
hash[
|
|
133
|
-
hash[
|
|
178
|
+
hash['issued_at'] = starts_at
|
|
179
|
+
hash['expires_at'] = expires_at if will_expire?
|
|
180
|
+
|
|
181
|
+
hash['notify_admins_at'] = notify_admins_at if will_notify_admins?
|
|
182
|
+
hash['notify_users_at'] = notify_users_at if will_notify_users?
|
|
183
|
+
hash['block_changes_at'] = block_changes_at if will_block_changes?
|
|
134
184
|
|
|
135
|
-
hash[
|
|
136
|
-
hash[
|
|
137
|
-
hash[
|
|
185
|
+
hash['next_sync_at'] = next_sync_at if will_sync?
|
|
186
|
+
hash['last_synced_at'] = last_synced_at if will_sync?
|
|
187
|
+
hash['activated_at'] = activated_at if activated?
|
|
138
188
|
|
|
139
|
-
hash[
|
|
189
|
+
hash['cloud_licensing_enabled'] = cloud_licensing?
|
|
190
|
+
hash['offline_cloud_licensing_enabled'] = offline_cloud_licensing?
|
|
191
|
+
hash['auto_renew_enabled'] = auto_renew?
|
|
192
|
+
hash['seat_reconciliation_enabled'] = seat_reconciliation?
|
|
193
|
+
hash['operational_metrics_enabled'] = operational_metrics?
|
|
194
|
+
|
|
195
|
+
hash['generated_from_customers_dot'] = generated_from_customers_dot?
|
|
196
|
+
|
|
197
|
+
hash['restrictions'] = restrictions if restricted?
|
|
140
198
|
|
|
141
199
|
hash
|
|
142
200
|
end
|
|
143
201
|
|
|
144
|
-
def to_json
|
|
145
|
-
JSON.dump(
|
|
202
|
+
def to_json(*_args)
|
|
203
|
+
JSON.dump(attributes)
|
|
146
204
|
end
|
|
147
205
|
|
|
148
206
|
def export(boundary: nil)
|
|
149
207
|
validate!
|
|
150
208
|
|
|
151
|
-
data = self.class.encryptor.encrypt(
|
|
209
|
+
data = self.class.encryptor.encrypt(to_json)
|
|
152
210
|
|
|
153
|
-
if boundary
|
|
154
|
-
data = Boundary.add_boundary(data, boundary)
|
|
155
|
-
end
|
|
211
|
+
data = Boundary.add_boundary(data, boundary) if boundary
|
|
156
212
|
|
|
157
213
|
data
|
|
158
214
|
end
|
|
@@ -160,33 +216,53 @@ module Gitlab
|
|
|
160
216
|
private
|
|
161
217
|
|
|
162
218
|
def load_attributes(attributes)
|
|
163
|
-
attributes =
|
|
219
|
+
attributes = attributes.transform_keys(&:to_s)
|
|
164
220
|
|
|
165
|
-
version = attributes[
|
|
166
|
-
unless version && version == 1
|
|
167
|
-
raise ArgumentError, "Version is too new"
|
|
168
|
-
end
|
|
221
|
+
version = attributes['version'] || 1
|
|
222
|
+
raise ArgumentError, 'Version is too new' unless version && version == 1
|
|
169
223
|
|
|
170
224
|
@version = version
|
|
171
225
|
|
|
172
|
-
@licensee = attributes[
|
|
226
|
+
@licensee = attributes['licensee']
|
|
173
227
|
|
|
174
228
|
# `issued_at` is the legacy name for starts_at.
|
|
175
229
|
# TODO: Move to starts_at in a next version.
|
|
176
|
-
%w
|
|
177
|
-
|
|
178
|
-
|
|
230
|
+
%w[issued_at expires_at notify_admins_at notify_users_at block_changes_at].each do |attr_name|
|
|
231
|
+
set_date_attribute(attr_name, attributes[attr_name])
|
|
232
|
+
end
|
|
179
233
|
|
|
180
|
-
|
|
234
|
+
%w[last_synced_at next_sync_at activated_at].each do |attr_name|
|
|
235
|
+
set_datetime_attribute(attr_name, attributes[attr_name])
|
|
236
|
+
end
|
|
181
237
|
|
|
182
|
-
|
|
238
|
+
%w[
|
|
239
|
+
cloud_licensing_enabled
|
|
240
|
+
offline_cloud_licensing_enabled
|
|
241
|
+
auto_renew_enabled
|
|
242
|
+
seat_reconciliation_enabled
|
|
243
|
+
operational_metrics_enabled
|
|
244
|
+
generated_from_customers_dot
|
|
245
|
+
].each do |attr_name|
|
|
246
|
+
public_send("#{attr_name}=", attributes[attr_name] == true)
|
|
183
247
|
end
|
|
184
248
|
|
|
185
|
-
restrictions = attributes[
|
|
186
|
-
if restrictions
|
|
187
|
-
restrictions =
|
|
249
|
+
restrictions = attributes['restrictions']
|
|
250
|
+
if restrictions&.is_a?(Hash)
|
|
251
|
+
restrictions = restrictions.transform_keys(&:to_sym)
|
|
188
252
|
@restrictions = restrictions
|
|
189
253
|
end
|
|
190
254
|
end
|
|
255
|
+
|
|
256
|
+
def set_date_attribute(attr_name, value, date_class = Date)
|
|
257
|
+
value = date_class.parse(value) rescue nil if value.is_a?(String)
|
|
258
|
+
|
|
259
|
+
return unless value
|
|
260
|
+
|
|
261
|
+
public_send("#{attr_name}=", value)
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
def set_datetime_attribute(attr_name, value)
|
|
265
|
+
set_date_attribute(attr_name, value, DateTime)
|
|
266
|
+
end
|
|
191
267
|
end
|
|
192
268
|
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: 1.0
|
|
4
|
+
version: 2.1.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:
|
|
13
|
+
date: 2022-01-18 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:
|
|
58
|
+
name: rspec
|
|
43
59
|
requirement: !ruby/object:Gem::Requirement
|
|
44
60
|
requirements:
|
|
45
|
-
- - "
|
|
61
|
+
- - "~>"
|
|
46
62
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '
|
|
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: '
|
|
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
|
|
@@ -73,7 +121,7 @@ files:
|
|
|
73
121
|
- lib/gitlab/license/boundary.rb
|
|
74
122
|
- lib/gitlab/license/encryptor.rb
|
|
75
123
|
- lib/gitlab/license/version.rb
|
|
76
|
-
homepage: https://gitlab.
|
|
124
|
+
homepage: https://dev.gitlab.org/gitlab/gitlab-license
|
|
77
125
|
licenses:
|
|
78
126
|
- MIT
|
|
79
127
|
metadata: {}
|
|
@@ -85,15 +133,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
85
133
|
requirements:
|
|
86
134
|
- - ">="
|
|
87
135
|
- !ruby/object:Gem::Version
|
|
88
|
-
version:
|
|
136
|
+
version: 2.3.0
|
|
89
137
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
138
|
requirements:
|
|
91
139
|
- - ">="
|
|
92
140
|
- !ruby/object:Gem::Version
|
|
93
141
|
version: '0'
|
|
94
142
|
requirements: []
|
|
95
|
-
|
|
96
|
-
rubygems_version: 2.4.8
|
|
143
|
+
rubygems_version: 3.0.3
|
|
97
144
|
signing_key:
|
|
98
145
|
specification_version: 4
|
|
99
146
|
summary: gitlab-license helps you generate, verify and enforce software licenses.
|