lmc 0.14.0 → 0.15.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 +4 -4
- data/.rubocop.yml +61 -1
- data/Rakefile +9 -4
- data/coverage/.last_run.json +1 -1
- data/lib/lmc/Cloud.rb +39 -25
- data/lib/lmc/Response.rb +1 -1
- data/lib/lmc/Site.rb +0 -1
- data/lib/lmc/User.rb +1 -6
- data/lib/lmc/config/device_config.rb +7 -5
- data/lib/lmc/config/device_dsc_ui.rb +0 -2
- data/lib/lmc/entity.rb +1 -1
- data/lib/lmc/exceptions/lmc_outdated_terms_of_use_exception.rb +1 -5
- data/lib/lmc/exceptions/lmc_two_factor_required_exception.rb +8 -0
- data/lib/lmc/exceptions/response_exception.rb +22 -0
- data/lib/lmc/version.rb +1 -1
- data/lmc.gemspec +3 -3
- metadata +22 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 96d4cb0e5c48a388b0fcaed6aa9bbbfe43275dfa4e5f8de31ed9f22973cd002d
|
4
|
+
data.tar.gz: fcb70677fc2ef666fc28d5e1dd6ca69d6de053fbe9f1a8fbd825d973d32643c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f94290c326379b14fb128e595a27713af19d14cbcb5eeb9cc59abd193ad6cd5894a85debcf7b22812b6c1ca570a6af0e49bbd0745c5708805b202ca47836c324
|
7
|
+
data.tar.gz: 79751ea5bdbd51b6d1cf9fa76ad0fdadd1c8b070fda7a68b3a7b683b82ddd18f49b006ef0c862526e09ef60286169df6459be55eaedc40bf45728027481e0beb
|
data/.rubocop.yml
CHANGED
@@ -5,4 +5,64 @@ Layout/FirstHashElementIndentation:
|
|
5
5
|
Layout/LineLength:
|
6
6
|
Max: 110
|
7
7
|
Style/IfUnlessModifier:
|
8
|
-
Enabled: false
|
8
|
+
Enabled: false
|
9
|
+
Gemspec/DateAssignment: # (new in 1.10)
|
10
|
+
Enabled: true
|
11
|
+
Layout/SpaceBeforeBrackets: # (new in 1.7)
|
12
|
+
Enabled: true
|
13
|
+
Lint/AmbiguousAssignment: # (new in 1.7)
|
14
|
+
Enabled: true
|
15
|
+
Lint/DeprecatedConstants: # (new in 1.8)
|
16
|
+
Enabled: true
|
17
|
+
Lint/DuplicateBranch: # (new in 1.3)
|
18
|
+
Enabled: true
|
19
|
+
Lint/DuplicateRegexpCharacterClassElement: # (new in 1.1)
|
20
|
+
Enabled: true
|
21
|
+
Lint/EmptyBlock: # (new in 1.1)
|
22
|
+
Enabled: true
|
23
|
+
Lint/EmptyClass: # (new in 1.3)
|
24
|
+
Enabled: true
|
25
|
+
Lint/LambdaWithoutLiteralBlock: # (new in 1.8)
|
26
|
+
Enabled: true
|
27
|
+
Lint/NoReturnInBeginEndBlocks: # (new in 1.2)
|
28
|
+
Enabled: true
|
29
|
+
Lint/NumberedParameterAssignment: # (new in 1.9)
|
30
|
+
Enabled: true
|
31
|
+
Lint/OrAssignmentToConstant: # (new in 1.9)
|
32
|
+
Enabled: true
|
33
|
+
Lint/RedundantDirGlobSort: # (new in 1.8)
|
34
|
+
Enabled: true
|
35
|
+
Lint/SymbolConversion: # (new in 1.9)
|
36
|
+
Enabled: true
|
37
|
+
Lint/ToEnumArguments: # (new in 1.1)
|
38
|
+
Enabled: true
|
39
|
+
Lint/TripleQuotes: # (new in 1.9)
|
40
|
+
Enabled: true
|
41
|
+
Lint/UnexpectedBlockArity: # (new in 1.5)
|
42
|
+
Enabled: true
|
43
|
+
Lint/UnmodifiedReduceAccumulator: # (new in 1.1)
|
44
|
+
Enabled: true
|
45
|
+
Style/ArgumentsForwarding: # (new in 1.1)
|
46
|
+
Enabled: true
|
47
|
+
Style/CollectionCompact: # (new in 1.2)
|
48
|
+
Enabled: true
|
49
|
+
Style/DocumentDynamicEvalDefinition: # (new in 1.1)
|
50
|
+
Enabled: true
|
51
|
+
Style/EndlessMethod: # (new in 1.8)
|
52
|
+
Enabled: true
|
53
|
+
Style/HashConversion: # (new in 1.10)
|
54
|
+
Enabled: true
|
55
|
+
Style/HashExcept: # (new in 1.7)
|
56
|
+
Enabled: true
|
57
|
+
Style/IfWithBooleanLiteralBranches: # (new in 1.9)
|
58
|
+
Enabled: true
|
59
|
+
Style/NegatedIfElseCondition: # (new in 1.2)
|
60
|
+
Enabled: true
|
61
|
+
Style/NilLambda: # (new in 1.3)
|
62
|
+
Enabled: true
|
63
|
+
Style/RedundantArgument: # (new in 1.4)
|
64
|
+
Enabled: true
|
65
|
+
Style/StringChars: # (new in 1.12)
|
66
|
+
Enabled: true
|
67
|
+
Style/SwapValues: # (new in 1.1)
|
68
|
+
Enabled: true
|
data/Rakefile
CHANGED
@@ -13,23 +13,28 @@ end
|
|
13
13
|
|
14
14
|
RuboCop::RakeTask.new(:autocop) do |t|
|
15
15
|
autofix = [
|
16
|
+
'Gemspec/OrderedDependencies',
|
17
|
+
'Layout/EmptyLineBetweenDefs',
|
16
18
|
'Layout/EmptyLines',
|
17
19
|
'Layout/EmptyLinesAroundClassBody',
|
20
|
+
'Layout/EmptyLinesAroundMethodBody',
|
18
21
|
'Layout/EmptyLinesAroundModuleBody',
|
19
|
-
'Layout/EmptyLineBetweenDefs',
|
20
22
|
'Layout/LeadingCommentSpace',
|
23
|
+
'Layout/SpaceAfterComma',
|
21
24
|
'Layout/SpaceAroundOperators',
|
22
25
|
'Layout/SpaceInsideBlockBraces',
|
23
26
|
'Layout/SpaceInsideHashLiteralBraces',
|
24
27
|
'Layout/TrailingEmptyLines',
|
28
|
+
'Lint/RedundantStringCoercion',
|
29
|
+
'Lint/UnusedBlockArgument',
|
25
30
|
'Style/CommentAnnotation',
|
26
31
|
'Style/FrozenStringLiteralComment',
|
27
32
|
'Style/MethodDefParentheses',
|
28
|
-
'Style/RedundantSelf',
|
29
33
|
'Style/RedundantReturn',
|
30
|
-
'Style/
|
31
|
-
'Style/StringLiteralsInInterpolation',
|
34
|
+
'Style/RedundantSelf',
|
32
35
|
'Style/StabbyLambdaParentheses',
|
36
|
+
'Style/StringLiterals',
|
37
|
+
'Style/StringLiteralsInInterpolation'
|
33
38
|
]
|
34
39
|
t.options = ['--only', autofix.join(','), '--auto-correct', 'lib', 'test', 'Rakefile', 'lmc.gemspec']
|
35
40
|
end
|
data/coverage/.last_run.json
CHANGED
data/lib/lmc/Cloud.rb
CHANGED
@@ -30,7 +30,7 @@ module LMC
|
|
30
30
|
@logger ||= ::LMC::Logger.new(STDOUT) if Cloud.debug
|
31
31
|
@logger.cloud = self if Cloud.debug
|
32
32
|
RestClient.log = @logger if Cloud.debug
|
33
|
-
|
33
|
+
login if auth
|
34
34
|
end
|
35
35
|
|
36
36
|
# hide secret fields from being displayed in dumps
|
@@ -74,9 +74,9 @@ module LMC
|
|
74
74
|
prepared_headers = headers
|
75
75
|
prepared_headers[:params] = params
|
76
76
|
args = {
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
:method => :get,
|
78
|
+
:url => build_url(path),
|
79
|
+
:headers => prepared_headers
|
80
80
|
}
|
81
81
|
execute_request args
|
82
82
|
end
|
@@ -85,22 +85,22 @@ module LMC
|
|
85
85
|
prepared_headers = headers
|
86
86
|
prepared_headers[:params] = params
|
87
87
|
args = {
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
88
|
+
:method => :put,
|
89
|
+
:url => build_url(path),
|
90
|
+
:payload => body_object.to_json,
|
91
|
+
:headers => prepared_headers
|
92
92
|
}
|
93
93
|
execute_request args
|
94
94
|
end
|
95
95
|
|
96
|
-
def post(path, body_object, params=nil
|
96
|
+
def post(path, body_object, params = nil)
|
97
97
|
prepared_headers = headers
|
98
98
|
prepared_headers[:params] = params
|
99
99
|
args = {
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
100
|
+
:method => :post,
|
101
|
+
:url => build_url(path),
|
102
|
+
:payload => body_object.to_json,
|
103
|
+
:headers => prepared_headers
|
104
104
|
}
|
105
105
|
execute_request args
|
106
106
|
end
|
@@ -109,9 +109,9 @@ module LMC
|
|
109
109
|
prepared_headers = headers
|
110
110
|
prepared_headers[:params] = params
|
111
111
|
args = {
|
112
|
-
|
113
|
-
|
114
|
-
|
112
|
+
:method => :delete,
|
113
|
+
:url => build_url(path),
|
114
|
+
:headers => prepared_headers
|
115
115
|
}
|
116
116
|
execute_request args
|
117
117
|
end
|
@@ -145,7 +145,7 @@ module LMC
|
|
145
145
|
|
146
146
|
private
|
147
147
|
|
148
|
-
def authorize(accounts = []
|
148
|
+
def authorize(accounts = [])
|
149
149
|
account_ids = accounts.map { |a|
|
150
150
|
if a.respond_to? :id
|
151
151
|
a.id
|
@@ -160,20 +160,34 @@ module LMC
|
|
160
160
|
password: @password,
|
161
161
|
code: @code,
|
162
162
|
accountIds: account_ids,
|
163
|
-
|
163
|
+
)
|
164
164
|
@last_authorized_account_ids = account_ids
|
165
165
|
@auth_token = reply
|
166
166
|
@auth_ok = true
|
167
|
-
rescue ::RestClient::ExceptionWithResponse => e
|
168
|
-
response = JSON.parse(e.response.body)
|
169
|
-
if response['code'] == 100
|
170
|
-
raise LMC::OutdatedTermsOfUseException.new(response)
|
171
|
-
end
|
172
|
-
raise e
|
173
167
|
end
|
174
168
|
end
|
175
169
|
end
|
176
170
|
|
171
|
+
def login(tos = [])
|
172
|
+
begin
|
173
|
+
reply = post(['cloud-service-auth', 'userlogin'],
|
174
|
+
name: @user,
|
175
|
+
password: @password,
|
176
|
+
code: @code,
|
177
|
+
termsOfUse: tos)
|
178
|
+
@auth_token = reply
|
179
|
+
@auth_ok = true
|
180
|
+
rescue ResponseException => e
|
181
|
+
if e.response['code'] == 104
|
182
|
+
raise LMC::MissingCodeException.new e.response
|
183
|
+
end
|
184
|
+
if e.response['code'] == 100
|
185
|
+
raise LMC::OutdatedTermsOfUseException.new e.response
|
186
|
+
end
|
187
|
+
raise e
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
177
191
|
def auth_bearer
|
178
192
|
"Bearer #{session_token}"
|
179
193
|
end
|
@@ -206,7 +220,7 @@ module LMC
|
|
206
220
|
puts 'EX.response: ' + e.response.to_s
|
207
221
|
puts JSON.parse(e.response)['message']
|
208
222
|
end
|
209
|
-
raise e
|
223
|
+
raise ResponseException.new e.response
|
210
224
|
end
|
211
225
|
end
|
212
226
|
end
|
data/lib/lmc/Response.rb
CHANGED
data/lib/lmc/Site.rb
CHANGED
data/lib/lmc/User.rb
CHANGED
@@ -22,12 +22,7 @@ module LMC
|
|
22
22
|
|
23
23
|
def update(old_pw)
|
24
24
|
cloud = Cloud.instance
|
25
|
-
|
26
|
-
cloud.post ['cloud-service-auth', 'users', 'self', 'password'], 'password' => @password, 'verification' => old_pw
|
27
|
-
rescue RestClient::BadRequest => e
|
28
|
-
response_body = JSON.parse(e.response)
|
29
|
-
raise "#{e.message} - #{response_body['message']}"
|
30
|
-
end
|
25
|
+
cloud.post ['cloud-service-auth', 'users', 'self', 'password'], 'password' => @password, 'verification' => old_pw
|
31
26
|
end
|
32
27
|
|
33
28
|
def request_pw_reset
|
@@ -75,12 +75,12 @@ module LMC
|
|
75
75
|
|
76
76
|
result = ''
|
77
77
|
result += lcf_header
|
78
|
-
items.each do |key, value|
|
78
|
+
items.to_h.each do |key, value|
|
79
79
|
if value.instance_of? String
|
80
80
|
result += "#{key} = #{value}\n"
|
81
81
|
elsif value.instance_of? Hash
|
82
|
-
rows = value[
|
83
|
-
col_ids = value[
|
82
|
+
rows = value[:rows]
|
83
|
+
col_ids = value[:colIds]
|
84
84
|
if rows.length > 0
|
85
85
|
result += "<#{key}>\n"
|
86
86
|
rows.each_with_index { |row, index|
|
@@ -92,7 +92,7 @@ module LMC
|
|
92
92
|
raise 'Unexpected value in config items: ' + value.class.to_s
|
93
93
|
end
|
94
94
|
end
|
95
|
-
result
|
95
|
+
result + lcf_footer
|
96
96
|
end
|
97
97
|
|
98
98
|
def current_device_type
|
@@ -127,6 +127,7 @@ module LMC
|
|
127
127
|
# @return [String]
|
128
128
|
def lcf_feature_id_string
|
129
129
|
hex_features = current_device_type.features.map { |feature| feature.to_s 16 }
|
130
|
+
hex_features << '80000800' # Magic feature to cause lanconfig to show the password
|
130
131
|
"IDs:#{hex_features.join(',')}"
|
131
132
|
end
|
132
133
|
|
@@ -161,7 +162,8 @@ module LMC
|
|
161
162
|
end
|
162
163
|
|
163
164
|
def fetch_result
|
164
|
-
|
165
|
+
# TODO: Make parameters settable
|
166
|
+
response_or_ticket = @cloud.get(url_configbuilder, { includePasswords: 'TRUE', includeSmartApps: 'FALSE' }).body
|
165
167
|
if response_or_ticket.respond_to? 'ticketId'
|
166
168
|
@ticket_id = response_or_ticket.ticketId
|
167
169
|
redeem_ticket 5
|
@@ -32,7 +32,6 @@ module LMC
|
|
32
32
|
raise('More than one version key contained in dscui.') if keys.length > 1
|
33
33
|
@version_string = keys.first
|
34
34
|
@sections = v_hash[@version_string].map { |section_wrapper| Section.new section_wrapper }
|
35
|
-
|
36
35
|
end
|
37
36
|
|
38
37
|
def items
|
@@ -54,7 +53,6 @@ module LMC
|
|
54
53
|
@groups = members.map { |group_wrapper|
|
55
54
|
Group.new group_wrapper unless group_wrapper['group'].nil?
|
56
55
|
}.compact
|
57
|
-
|
58
56
|
end
|
59
57
|
end
|
60
58
|
|
data/lib/lmc/entity.rb
CHANGED
@@ -1,11 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module LMC
|
4
|
-
class OutdatedTermsOfUseException <
|
5
|
-
def initialize(response = {})
|
6
|
-
@response = response
|
7
|
-
end
|
8
|
-
|
4
|
+
class OutdatedTermsOfUseException < ResponseException
|
9
5
|
def response
|
10
6
|
r = "Terms of use must be accepted before using this LMC instance:\n"
|
11
7
|
missing.each do |tos|
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module LMC
|
3
|
+
class ResponseException < RuntimeError
|
4
|
+
attr_reader :response
|
5
|
+
|
6
|
+
# Initialize a ResponseException.
|
7
|
+
#
|
8
|
+
# @param [Object] response restclient Response
|
9
|
+
def initialize(response)
|
10
|
+
if response.is_a? LMCResponse
|
11
|
+
@response = response
|
12
|
+
else
|
13
|
+
@response = LMCResponse.new response
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def message
|
18
|
+
cause.message
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
data/lib/lmc/version.rb
CHANGED
data/lmc.gemspec
CHANGED
@@ -33,13 +33,13 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
34
34
|
spec.add_development_dependency 'minitest', '~> 5.11'
|
35
35
|
spec.add_development_dependency 'minitest-reporters', '~> 1'
|
36
|
+
spec.add_development_dependency 'pry-nav', '~> 0.2.4'
|
36
37
|
spec.add_development_dependency 'rake', '~> 12.0'
|
38
|
+
spec.add_development_dependency 'rubocop', '~> 1.14'
|
37
39
|
spec.add_development_dependency 'simplecov', '~> 0.15'
|
38
|
-
spec.add_development_dependency 'pry-nav', '~> 0.2.4'
|
39
|
-
spec.add_development_dependency 'rubocop', '~> 0.58.1'
|
40
40
|
|
41
41
|
spec.add_runtime_dependency 'json', '~> 2.3'
|
42
|
-
spec.add_runtime_dependency 'rest-client', '~> 2.0'
|
43
42
|
spec.add_runtime_dependency 'recursive-open-struct', '~> 1.1'
|
43
|
+
spec.add_runtime_dependency 'rest-client', '~> 2.0'
|
44
44
|
end
|
45
45
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lmc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- erpel
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-08-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -53,61 +53,61 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: pry-nav
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 0.2.4
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 0.2.4
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0
|
75
|
+
version: '12.0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0
|
82
|
+
version: '12.0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: rubocop
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
89
|
+
version: '1.14'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
96
|
+
version: '1.14'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: simplecov
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0.
|
103
|
+
version: '0.15'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0.
|
110
|
+
version: '0.15'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: json
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -123,33 +123,33 @@ dependencies:
|
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '2.3'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
126
|
+
name: recursive-open-struct
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
129
|
- - "~>"
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: '
|
131
|
+
version: '1.1'
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: '
|
138
|
+
version: '1.1'
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
140
|
+
name: rest-client
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
143
|
- - "~>"
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: '
|
145
|
+
version: '2.0'
|
146
146
|
type: :runtime
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
150
|
- - "~>"
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version: '
|
152
|
+
version: '2.0'
|
153
153
|
description:
|
154
154
|
email:
|
155
155
|
- philipp@copythat.de
|
@@ -190,6 +190,8 @@ files:
|
|
190
190
|
- lib/lmc/device_config_state.rb
|
191
191
|
- lib/lmc/entity.rb
|
192
192
|
- lib/lmc/exceptions/lmc_outdated_terms_of_use_exception.rb
|
193
|
+
- lib/lmc/exceptions/lmc_two_factor_required_exception.rb
|
194
|
+
- lib/lmc/exceptions/response_exception.rb
|
193
195
|
- lib/lmc/logger.rb
|
194
196
|
- lib/lmc/membership.rb
|
195
197
|
- lib/lmc/mixins/json_able.rb
|