komtet 0.0.1 → 0.0.2

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
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: []