mixin_bot 0.0.1.2 → 0.0.1.4

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
- SHA1:
3
- metadata.gz: 81bcd3b93c88d6cab327bb165ae79760df655345
4
- data.tar.gz: 4502808eb2e187cedc955534e7936ab26a43d97e
2
+ SHA256:
3
+ metadata.gz: cc2618a1deab474b441b98f81845094b3178d3f5123d73a33aaefd0cc82f6e0d
4
+ data.tar.gz: 0da61f7a15af136541318f8af9fa107a864f5b4cdbc6c45ce17c8bea0ae8ac74
5
5
  SHA512:
6
- metadata.gz: 03d31dffc3024af2937d04a8955121277296d0122f40bba36f23a620b2e972949b339924058f820c0e357deceb14b8633f3f9cb67a8922fb308740979ad41d23
7
- data.tar.gz: 34006e6d1eea8ea8f4cda0f1c829ee74f376e4a4a4433413fe7558f14190671d89a999d85871a1db593e89f3087315258bbb2b91d846958ce397ab92d2b24985
6
+ metadata.gz: a474915b84c4fea0086aba993b5b4e0f43744aaa64808cd0728c966ad5f5d7c1375d6525fcedc203ec6943b1d163a8a56a0dc32e34cff15cdf3f55e0c15b7eaa
7
+ data.tar.gz: fcf9a02b7eb85c63e959bc47ea9054b7901d05bc68950ab8a90c99d976b424178f31db2fef693eb94c191480ebe77e27a5a21d6a8d326cc5a7c12d70f7f3d921
data/lib/mixin_bot/api.rb CHANGED
@@ -1,15 +1,18 @@
1
1
  require_relative './client'
2
2
  require_relative './errors'
3
3
  require_relative './api/auth'
4
+ require_relative './api/conversation'
4
5
  require_relative './api/me'
6
+ require_relative './api/message'
5
7
  require_relative './api/payment'
6
8
  require_relative './api/pin'
9
+ require_relative './api/snapshot'
7
10
  require_relative './api/transfer'
8
11
  require_relative './api/user'
9
12
 
10
13
  module MixinBot
11
14
  class API
12
- attr_reader :client_id, :client_secret, :session_id, :pin_token, :private_key, :scope
15
+ attr_reader :client_id, :client_secret, :session_id, :pin_token, :private_key
13
16
  attr_reader :client
14
17
 
15
18
  def initialize(options={})
@@ -18,14 +21,16 @@ module MixinBot
18
21
  @session_id = options[:session_id] || MixinBot.session_id
19
22
  @pin_token = Base64.decode64 options[:pin_token] || MixinBot.pin_token
20
23
  @private_key = OpenSSL::PKey::RSA.new options[:private_key] || MixinBot.private_key
21
- @scope = options[:scope] || MixinBot.scope || 'PROFILE:READ+PHONE:READ+ASSETS:READ'
22
24
  @client = Client.new
23
25
  end
24
26
 
25
27
  include MixinBot::API::Auth
28
+ include MixinBot::API::Conversation
26
29
  include MixinBot::API::Me
30
+ include MixinBot::API::Message
27
31
  include MixinBot::API::Payment
28
32
  include MixinBot::API::Pin
33
+ include MixinBot::API::Snapshot
29
34
  include MixinBot::API::Transfer
30
35
  include MixinBot::API::User
31
36
  end
@@ -1,18 +1,18 @@
1
1
  module MixinBot
2
2
  class API
3
3
  module Auth
4
- def access_token(method, uri, body)
4
+ def access_token(method, uri, body, exp_in=10.minutes)
5
5
  sig = Digest::SHA256.hexdigest (method + uri + body)
6
6
  iat = Time.now.utc.to_i
7
- exp = (Time.now.utc + 1.day).to_i
7
+ exp = (Time.now.utc + exp_in).to_i
8
8
  jti = SecureRandom.uuid
9
9
  payload = {
10
- 'uid': client_id,
11
- 'sid': session_id,
12
- 'iat': iat,
13
- 'exp': exp,
14
- 'jti': jti,
15
- 'sig': sig
10
+ uid: client_id,
11
+ sid: session_id,
12
+ iat: iat,
13
+ exp: exp,
14
+ jti: jti,
15
+ sig: sig
16
16
  }
17
17
  JWT.encode payload, private_key, 'RS512'
18
18
  end
@@ -31,7 +31,8 @@ module MixinBot
31
31
  return r['data']['access_token']
32
32
  end
33
33
 
34
- def request_oauth
34
+ def request_oauth(scope=nil)
35
+ scope ||= (MixinBot.scope || 'PROFILE:READ+PHONE:READ')
35
36
  format('https://mixin.one/oauth/authorize?client_id=%s&scope=%s', client_id, scope)
36
37
  end
37
38
  end
@@ -1,12 +1,23 @@
1
1
  module MixinBot
2
2
  class API
3
3
  module Conversation
4
- def create_conversation
4
+ def read_conversation(conversation_id)
5
+ path = format('/conversations/%s', conversation_id)
6
+ _access_token ||= self.access_token('GET', path, '')
7
+ authorization = format('Bearer %s', _access_token)
8
+ client.get(path, headers: { 'Authorization': authorization })
9
+ end
10
+
11
+ def read_conversation_by_user_id(user_id)
12
+ conversation_id = unique_conversation_id(user_id)
13
+ return self.read_conversation(conversation_id)
14
+ end
15
+
16
+ def create_contact_conversation(user_id)
5
17
  path = '/conversations'
6
- access_token ||= self.access_token('GET', path, '')
7
- params = {
8
- category: category,
9
- conversation_id: conversation_id,
18
+ payload = {
19
+ category: 'CONTACT',
20
+ conversation_id: unique_conversation_id(user_id),
10
21
  participants: [
11
22
  {
12
23
  action: 'ADD',
@@ -15,13 +26,15 @@ module MixinBot
15
26
  }
16
27
  ]
17
28
  }
18
- # TODO: not finished yet.
29
+ _access_token ||= self.access_token('POST', path, payload.to_json)
30
+ authorization = format('Bearer %s', _access_token)
31
+ client.post(path, headers: { 'Authorization': authorization }, json: payload)
19
32
  end
20
33
 
21
34
  def unique_conversation_id(user_id)
22
35
  md5 = Digest::MD5.new
23
- md5 << user_id
24
- md5 << client_id
36
+ md5 << [user_id, client_id].min
37
+ md5 << [user_id, client_id].max
25
38
  digest = md5.digest
26
39
  digest_6 = (digest[6].ord & 0x0f | 0x30).chr
27
40
  digest_8 = (digest[8].ord & 0x3f | 0x80).chr
@@ -11,8 +11,8 @@ module MixinBot
11
11
  def update_me(full_name, avatar_base64, access_token=nil)
12
12
  path = '/me'
13
13
  payload = {
14
- "full_name": full_name,
15
- "avatar_base64": avatar_base64
14
+ full_name: full_name,
15
+ avatar_base64: avatar_base64
16
16
  }
17
17
  access_token ||= self.access_token('POST', path, payload.to_json)
18
18
  authorization = format('Bearer %s', access_token)
@@ -1,6 +1,57 @@
1
1
  module MixinBot
2
2
  class API
3
3
  module Message
4
+ def list_pending_message
5
+ write_message('LIST_PENDING_MESSAGES', {})
6
+ end
7
+
8
+ def acknowledge_message_receipt(message_id)
9
+ params = {
10
+ message_id: message_id,
11
+ status: 'READ'
12
+ }
13
+ write_message('ACKNOWLEDGE_MESSAGE_RECEIPT', params)
14
+ end
15
+
16
+ def plain_text_message(conversation_id, text)
17
+ encoded_text = Base64.encode64 text
18
+
19
+ params = {
20
+ conversation_id: conversation_id,
21
+ category: 'PLAIN_TEXT',
22
+ status: 'SENT',
23
+ message_id: SecureRandom.uuid,
24
+ data: encoded_text
25
+ }
26
+
27
+ write_message('CREATE_MESSAGE', params)
28
+ end
29
+
30
+ def app_card_message
31
+ # TODO:
32
+ end
33
+
34
+ def app_button_group_message(conversation_id, recipient_id, options={})
35
+ options = options.with_indifferent_access
36
+ label = options[:label] || ''
37
+ color = options[:color] || '#467fcf'
38
+ action = options[:action] || ''
39
+
40
+ data = [{ label: label, color: color, action: action }]
41
+ encoded_data = Base64.encode64 data.to_json
42
+
43
+ params = {
44
+ conversation_id: conversation_id,
45
+ recipient_id: recipient_id,
46
+ category: 'APP_BUTTON_GROUP',
47
+ status: 'SENT',
48
+ message_id: SecureRandom.uuid,
49
+ data: encoded_data
50
+ }
51
+
52
+ write_message('CREATE_MESSAGE', params)
53
+ end
54
+
4
55
  def read_message(data)
5
56
  io = StringIO.new(data.pack('c*'), 'rb')
6
57
  gzip = Zlib::GzipReader.new io
@@ -11,9 +62,9 @@ module MixinBot
11
62
 
12
63
  def write_message(action, params)
13
64
  msg = {
14
- "id": SecureRandom.uuid,
15
- "action": action,
16
- "params": params
65
+ id: SecureRandom.uuid,
66
+ action: action,
67
+ params: params
17
68
  }.to_json
18
69
 
19
70
  io = StringIO.new 'wb'
@@ -17,7 +17,7 @@ module MixinBot
17
17
  iv = msg[0..15]
18
18
  cipher = msg[16..47]
19
19
  aes_key = JOSE::JWA::PKCS1::rsaes_oaep_decrypt('SHA256', pin_token, private_key, session_id)
20
- alg = "AES-256-CBC"
20
+ alg = 'AES-256-CBC'
21
21
  decode_cipher = OpenSSL::Cipher.new(alg)
22
22
  decode_cipher.decrypt
23
23
  decode_cipher.iv = iv
@@ -42,7 +42,7 @@ module MixinBot
42
42
  padded_content = encrypt_content
43
43
  end
44
44
 
45
- alg = "AES-256-CBC"
45
+ alg = 'AES-256-CBC'
46
46
  aes = OpenSSL::Cipher.new(alg)
47
47
  iv = OpenSSL::Cipher.new(alg).random_iv
48
48
  aes.encrypt
@@ -0,0 +1,27 @@
1
+ module MixinBot
2
+ class API
3
+ module Snapshot
4
+ def read_snapshots(options)
5
+ options = options.with_indifferent_access
6
+ limit = options['limit']
7
+ offset = options['offset']
8
+ asset = options['asset']
9
+ order = options['order']
10
+
11
+ path = 'network/snapshots'
12
+ payload = {
13
+ limit: limit,
14
+ offset: offset,
15
+ asset: asset,
16
+ order: order
17
+ }
18
+ client.get(path, params: payload)
19
+ end
20
+
21
+ def read_snapshot(snapshot_id)
22
+ path = format('network/snapshots/%s', snapshot_id)
23
+ client.get(path)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -2,13 +2,6 @@ module MixinBot
2
2
  class API
3
3
  module Transfer
4
4
  def create_transfer(pin, options)
5
- # data for test:
6
- # asset_id = '965e5c6e-434c-3fa9-b780-c50f43cd955c'
7
- # opponent_id = '7ed9292d-7c95-4333-aa48-a8c640064186'
8
- # amount = '1'
9
- # encrypted_pin = MixinBot.api_pin.encrypted_pin
10
- # memo = 'test'
11
-
12
5
  options = options.with_indifferent_access
13
6
 
14
7
  asset_id = options.fetch('asset_id')
@@ -23,7 +23,7 @@ module MixinBot
23
23
  end
24
24
 
25
25
  begin
26
- response = HTTP.timeout(:global, connect: 5, write: 5, read: 5).request(verb, uri, options)
26
+ response = HTTP.timeout(connect: 5, write: 5, read: 5).request(verb, uri, options)
27
27
  rescue HTTP::Error => ex
28
28
  Rails.logger.error format('%s (%s):', ex.class.name, ex.message)
29
29
  Rails.logger.error ex.backtrace.join("\n")
@@ -1,3 +1,3 @@
1
1
  module MixinBot
2
- VERSION = '0.0.1.2'.freeze
2
+ VERSION = '0.0.1.4'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mixin_bot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.2
4
+ version: 0.0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - an-lee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-22 00:00:00.000000000 Z
11
+ date: 2019-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http
@@ -96,6 +96,7 @@ files:
96
96
  - lib/mixin_bot/api/message.rb
97
97
  - lib/mixin_bot/api/payment.rb
98
98
  - lib/mixin_bot/api/pin.rb
99
+ - lib/mixin_bot/api/snapshot.rb
99
100
  - lib/mixin_bot/api/transfer.rb
100
101
  - lib/mixin_bot/api/user.rb
101
102
  - lib/mixin_bot/client.rb
@@ -120,8 +121,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
121
  - !ruby/object:Gem::Version
121
122
  version: '0'
122
123
  requirements: []
123
- rubyforge_project:
124
- rubygems_version: 2.6.14
124
+ rubygems_version: 3.0.2
125
125
  signing_key:
126
126
  specification_version: 4
127
127
  summary: An API wrapper for Mixin Nexwork