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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c4ebe2578d70a1a07fa7250eef3cbeb55a54387d71abe970e5905e176cc0bd87
4
- data.tar.gz: 906e957a0bc9c2231eec821d65d6e3358c74d34daebb6aa65f2a431145462425
3
+ metadata.gz: 4d3b8c9c54841bb163156cefc780422bc1a5eadbc30d89daf3ee330024ee4d60
4
+ data.tar.gz: 80acc8c6245af37ede5620673f4c36f08654574a3034d9cf829fbb60624a306d
5
5
  SHA512:
6
- metadata.gz: aa4df6ba90e9187e0c0006e8a1f0a71041f91e908b2bb97dae6b81ec30bc6f2f59710e7713e672f82ed2b61f08be9ad68caede8cb8df98514009f3dcd10ecfd8
7
- data.tar.gz: 4ac80a3ddaf62b010d98c889ff20b102f828977a9a7a326a861b52167343eed0c68514ebad953f34e057e2cd925350defe408af6254c2a1ebd7b3b9be83cc648
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.1)
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.6.0)
12
- public_suffix (>= 2.0.2, < 4.0)
13
- crack (0.4.3)
14
- safe_yaml (~> 1.0.0)
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.3.2)
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.0.beta1)
22
- json (2.2.0)
21
+ hashdiff (1.0.1)
23
22
  multipart-post (2.1.1)
24
- public_suffix (3.1.1)
25
- rake (10.5.0)
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
- safe_yaml (1.0.5)
40
- simplecov (0.17.0)
39
+ simplecov (0.21.2)
41
40
  docile (~> 1.1)
42
- json (>= 1.8, < 3)
43
- simplecov-html (~> 0.10.0)
44
- simplecov-html (0.10.2)
45
- webmock (3.6.0)
46
- addressable (>= 2.3.6)
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 (~> 10.0)
57
+ rake (>= 12.3.3)
58
58
  rspec
59
59
  simplecov
60
60
  webmock
61
61
 
62
62
  BUNDLED WITH
63
- 2.0.1
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", "~> 10.0"
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
@@ -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, shop_id, signature_key)
15
+ def initialize(app, credentials)
11
16
  @app = app
12
- @authorization = shop_id
13
- @signature_key = signature_key
17
+ @credentials = credentials
14
18
  end
15
19
 
16
20
  def call(env)
17
- env.request_headers['Authorization'] = @authorization
18
- env.request_headers['X-HMAC-Signature'] = OpenSSL::HMAC.hexdigest(
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, shop_id, signature_key, queue_id=nil)
27
+ def initialize(api_url, credentials)
26
28
  @api_url = api_url
27
- @authorization = shop_id
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, @authorization, @signature_key)
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.code}" unless res.success?
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.code}" unless res.success?
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
@@ -1,3 +1,3 @@
1
1
  module Komtet
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/komtet.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "komtet/version"
2
+ require "komtet/credentials"
2
3
  require "komtet/transport"
3
4
 
4
5
  module Komtet
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.1
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: 2019-07-10 00:00:00.000000000 Z
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: '10.0'
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: '10.0'
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.0.2
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: []