komtet 0.0.1 → 0.0.2
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/Gemfile.lock +19 -19
- data/komtet.gemspec +1 -1
- data/lib/komtet/credentials.rb +65 -0
- data/lib/komtet/transport.rb +30 -16
- data/lib/komtet/version.rb +1 -1
- data/lib/komtet.rb +1 -0
- metadata +11 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4d3b8c9c54841bb163156cefc780422bc1a5eadbc30d89daf3ee330024ee4d60
|
4
|
+
data.tar.gz: 80acc8c6245af37ede5620673f4c36f08654574a3034d9cf829fbb60624a306d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 81b4b1511acf0dec54f4b6f5babe37469984f7df6c91b8928e0a196cb545a002a26acbbf68261c02c2ca498096e91952b5bee5b74d0a20c895d1e0b5a1089e00
|
7
|
+
data.tar.gz: 13b3adfc86e74c4a6bd8c06659efb124bd02c2648390068d372c63ca75967ca306d588dfd631e7241724459e83826ec815046ebe047ea9448f441fe3fd03ebc8
|
data/Gemfile.lock
CHANGED
@@ -1,28 +1,28 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
komtet (0.0.
|
4
|
+
komtet (0.0.2)
|
5
5
|
faraday (>= 0.15)
|
6
6
|
faraday_middleware
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
addressable (2.
|
12
|
-
public_suffix (>= 2.0.2, <
|
13
|
-
crack (0.4.
|
14
|
-
|
11
|
+
addressable (2.8.1)
|
12
|
+
public_suffix (>= 2.0.2, < 6.0)
|
13
|
+
crack (0.4.5)
|
14
|
+
rexml
|
15
15
|
diff-lcs (1.3)
|
16
|
-
docile (1.
|
16
|
+
docile (1.4.0)
|
17
17
|
faraday (0.15.4)
|
18
18
|
multipart-post (>= 1.2, < 3)
|
19
19
|
faraday_middleware (0.13.1)
|
20
20
|
faraday (>= 0.7.4, < 1.0)
|
21
|
-
hashdiff (1.0.
|
22
|
-
json (2.2.0)
|
21
|
+
hashdiff (1.0.1)
|
23
22
|
multipart-post (2.1.1)
|
24
|
-
public_suffix (
|
25
|
-
rake (
|
23
|
+
public_suffix (5.0.0)
|
24
|
+
rake (13.0.6)
|
25
|
+
rexml (3.2.5)
|
26
26
|
rspec (3.8.0)
|
27
27
|
rspec-core (~> 3.8.0)
|
28
28
|
rspec-expectations (~> 3.8.0)
|
@@ -36,14 +36,14 @@ GEM
|
|
36
36
|
diff-lcs (>= 1.2.0, < 2.0)
|
37
37
|
rspec-support (~> 3.8.0)
|
38
38
|
rspec-support (3.8.2)
|
39
|
-
|
40
|
-
simplecov (0.17.0)
|
39
|
+
simplecov (0.21.2)
|
41
40
|
docile (~> 1.1)
|
42
|
-
|
43
|
-
|
44
|
-
simplecov-html (0.
|
45
|
-
|
46
|
-
|
41
|
+
simplecov-html (~> 0.11)
|
42
|
+
simplecov_json_formatter (~> 0.1)
|
43
|
+
simplecov-html (0.12.3)
|
44
|
+
simplecov_json_formatter (0.1.4)
|
45
|
+
webmock (3.18.1)
|
46
|
+
addressable (>= 2.8.0)
|
47
47
|
crack (>= 0.3.2)
|
48
48
|
hashdiff (>= 0.4.0, < 2.0.0)
|
49
49
|
|
@@ -54,10 +54,10 @@ DEPENDENCIES
|
|
54
54
|
bundler (>= 1.17)
|
55
55
|
hashdiff (>= 1.0.0.beta1)
|
56
56
|
komtet!
|
57
|
-
rake (
|
57
|
+
rake (>= 12.3.3)
|
58
58
|
rspec
|
59
59
|
simplecov
|
60
60
|
webmock
|
61
61
|
|
62
62
|
BUNDLED WITH
|
63
|
-
2.
|
63
|
+
2.3.10
|
data/komtet.gemspec
CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_dependency "faraday_middleware"
|
26
26
|
|
27
27
|
spec.add_development_dependency "bundler", ">= 1.17"
|
28
|
-
spec.add_development_dependency "rake", "
|
28
|
+
spec.add_development_dependency "rake", ">= 12.3.3"
|
29
29
|
spec.add_development_dependency "rspec"
|
30
30
|
spec.add_development_dependency "webmock"
|
31
31
|
spec.add_development_dependency "simplecov"
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
require 'base64'
|
3
|
+
|
4
|
+
module Komtet
|
5
|
+
|
6
|
+
# relates to a task queue (a set of registrators)
|
7
|
+
class Credentials
|
8
|
+
|
9
|
+
attr_accessor :shop_id, :signature_key, :queue_id
|
10
|
+
|
11
|
+
def initialize(shop_id:, signature_key:, queue_id:nil)
|
12
|
+
# TODO: also LLC data here
|
13
|
+
@shop_id = shop_id
|
14
|
+
@signature_key = signature_key
|
15
|
+
@queue_id = queue_id
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.from_hash(hash, key_pass:nil)
|
19
|
+
unless (decoded_signature = hash[:signature_key] || hash["signature_key"])
|
20
|
+
cipher = OpenSSL::Cipher.new('aes-256-cbc')
|
21
|
+
cipher.decrypt
|
22
|
+
cipher.key = key_pass
|
23
|
+
cipher.iv = Base64.strict_decode64(hash[:signature_key_iv] || hash["signature_key_iv"])
|
24
|
+
decoded_signature = cipher.update(
|
25
|
+
Base64.strict_decode64(hash[:signature_key_enc] || hash["signature_key_enc"])
|
26
|
+
) + cipher.final
|
27
|
+
unless Digest::MD5.hexdigest(decoded_signature) == (hash[:signature_key_hash] || hash["signature_key_hash"])
|
28
|
+
# actually there's usually OpenSSL::Cipher::CipherError, but not guaranteed
|
29
|
+
raise "Signature md5 does not match, probably wrong key_pass (bad decrypt)"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
new(
|
34
|
+
shop_id: hash[:shop_id] || hash["shop_id"],
|
35
|
+
signature_key: decoded_signature,
|
36
|
+
queue_id: hash[:queue_id] || hash["queue_id"],
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_hash(key_pass:)
|
41
|
+
cipher = OpenSSL::Cipher.new('aes-256-cbc')
|
42
|
+
cipher.encrypt
|
43
|
+
cipher.key = key_pass
|
44
|
+
signature_key_iv = Base64.strict_encode64(cipher.random_iv)
|
45
|
+
|
46
|
+
{
|
47
|
+
shop_id: shop_id,
|
48
|
+
queue_id: queue_id,
|
49
|
+
signature_key_iv: signature_key_iv,
|
50
|
+
signature_key_hash: Digest::MD5.hexdigest(signature_key), # may be unsafe, but we a guarding mostly against production data in development
|
51
|
+
signature_key_enc: Base64.strict_encode64(cipher.update(signature_key) + cipher.final),
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
def signature(http_method, full_url, body=nil)
|
56
|
+
OpenSSL::HMAC.hexdigest(
|
57
|
+
OpenSSL::Digest::MD5.new,
|
58
|
+
@signature_key,
|
59
|
+
"#{http_method.to_s.upcase}#{full_url}#{body}"
|
60
|
+
)
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
data/lib/komtet/transport.rb
CHANGED
@@ -5,28 +5,28 @@ require 'openssl'
|
|
5
5
|
module Komtet
|
6
6
|
|
7
7
|
class Transport
|
8
|
+
|
9
|
+
# See https://kassa.komtet.ru/integration/api
|
10
|
+
|
11
|
+
DEFAULT_API_URL='https://kassa.komtet.ru/api/shop/v1/'
|
12
|
+
|
8
13
|
# middleware for request signatures
|
9
14
|
class RequestSignatureMiddleware < Faraday::Middleware
|
10
|
-
def initialize(app,
|
15
|
+
def initialize(app, credentials)
|
11
16
|
@app = app
|
12
|
-
@
|
13
|
-
@signature_key = signature_key
|
17
|
+
@credentials = credentials
|
14
18
|
end
|
15
19
|
|
16
20
|
def call(env)
|
17
|
-
env.request_headers['Authorization'] = @
|
18
|
-
env.request_headers['X-HMAC-Signature'] =
|
19
|
-
OpenSSL::Digest::MD5.new, @signature_key, "#{env.method.to_s.upcase}#{env.url}#{env.body}"
|
20
|
-
)
|
21
|
+
env.request_headers['Authorization'] = @credentials.shop_id
|
22
|
+
env.request_headers['X-HMAC-Signature'] = @credentials.signature(env.method, env.url, env.body)
|
21
23
|
@app.call(env)
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
25
|
-
def initialize(api_url,
|
27
|
+
def initialize(api_url, credentials)
|
26
28
|
@api_url = api_url
|
27
|
-
@
|
28
|
-
@signature_key = signature_key
|
29
|
-
@queue_id = queue_id
|
29
|
+
@credentials = credentials
|
30
30
|
end
|
31
31
|
|
32
32
|
def transport
|
@@ -34,25 +34,39 @@ module Komtet
|
|
34
34
|
conn.headers['User-Agent'] = "KomtetRuby/#{Komtet::VERSION}"
|
35
35
|
conn.headers['Accept'] = "application/json"
|
36
36
|
conn.request(:json)
|
37
|
-
conn.use(RequestSignatureMiddleware, @
|
37
|
+
conn.use(RequestSignatureMiddleware, @credentials)
|
38
38
|
conn.response :json, content_type: /\bjson$/
|
39
39
|
conn.adapter(Faraday.default_adapter)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
def post_task(content, queue_id=@queue_id)
|
43
|
+
def post_task(content, queue_id=@credentials.queue_id)
|
44
44
|
raise ArgumentError, "queue_id is not integer" unless queue_id.is_a?(Integer)
|
45
|
-
res = transport.post("queues/#{queue_id}/task")
|
46
|
-
raise "non success: #{res.
|
45
|
+
res = transport.post("queues/#{queue_id}/task", content)
|
46
|
+
raise "non success: #{res.status}: #{res.body}" unless res.success?
|
47
47
|
res.body
|
48
48
|
end
|
49
49
|
|
50
50
|
def task_result(task_id)
|
51
51
|
res = transport.get("tasks/#{task_id}")
|
52
|
-
raise "non success: #{res.
|
52
|
+
raise "non success: #{res.status}: #{res.body}" unless res.success?
|
53
53
|
res.body
|
54
54
|
end
|
55
55
|
|
56
|
+
def queue_status(queue_id=@credentials.queue_id)
|
57
|
+
res = transport.get("queues/#{ queue_id }")
|
58
|
+
# {"id"=>6395, "state"=>"active"} (либо passive)
|
59
|
+
# либо 403 {"title"=>"Ошибка авторизации", "description"=>"Проверьте...", "code"=>"AUT00"}
|
60
|
+
|
61
|
+
if res.success?
|
62
|
+
return res.body["state"]
|
63
|
+
elsif res.status == 403
|
64
|
+
return 'access_denied'
|
65
|
+
else
|
66
|
+
raise "non success: #{res.status}: #{res.body}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
56
70
|
end
|
57
71
|
|
58
72
|
end
|
data/lib/komtet/version.rb
CHANGED
data/lib/komtet.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: komtet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vasily Fedoseyev
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-10-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -56,16 +56,16 @@ dependencies:
|
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 12.3.3
|
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: 12.3.3
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -127,13 +127,14 @@ files:
|
|
127
127
|
- bin/setup
|
128
128
|
- komtet.gemspec
|
129
129
|
- lib/komtet.rb
|
130
|
+
- lib/komtet/credentials.rb
|
130
131
|
- lib/komtet/transport.rb
|
131
132
|
- lib/komtet/version.rb
|
132
133
|
homepage: https://github.com/Vasfed/komtet
|
133
134
|
licenses:
|
134
135
|
- MIT
|
135
136
|
metadata: {}
|
136
|
-
post_install_message:
|
137
|
+
post_install_message:
|
137
138
|
rdoc_options: []
|
138
139
|
require_paths:
|
139
140
|
- lib
|
@@ -148,8 +149,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
149
|
- !ruby/object:Gem::Version
|
149
150
|
version: '0'
|
150
151
|
requirements: []
|
151
|
-
rubygems_version: 3.
|
152
|
-
signing_key:
|
152
|
+
rubygems_version: 3.1.6
|
153
|
+
signing_key:
|
153
154
|
specification_version: 4
|
154
155
|
summary: Ruby client for kassa.komtet.ru
|
155
156
|
test_files: []
|