meshchat 0.8.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +39 -11
- data/lib/meshchat.rb +48 -42
- data/lib/meshchat/configuration.rb +14 -0
- data/lib/meshchat/configuration/app_config.rb +63 -0
- data/lib/meshchat/configuration/database.rb +41 -0
- data/lib/meshchat/{config → configuration}/hash_file.rb +7 -6
- data/lib/meshchat/configuration/identity.rb +79 -0
- data/lib/meshchat/{config → configuration}/settings.rb +22 -26
- data/lib/meshchat/debug.rb +69 -0
- data/lib/meshchat/encryption.rb +7 -2
- data/lib/meshchat/encryption/aes_rsa.rb +2 -1
- data/lib/meshchat/encryption/passthrough.rb +5 -3
- data/lib/meshchat/locale/en.yml +14 -0
- data/lib/meshchat/models/node.rb +140 -0
- data/lib/meshchat/network.rb +19 -0
- data/lib/meshchat/network/dispatcher.rb +83 -0
- data/lib/meshchat/network/errors.rb +11 -0
- data/lib/meshchat/network/incoming.rb +13 -0
- data/lib/meshchat/network/incoming/message_decryptor.rb +51 -0
- data/lib/meshchat/network/incoming/message_processor.rb +75 -0
- data/lib/meshchat/network/incoming/request_processor.rb +30 -0
- data/lib/meshchat/network/local.rb +12 -0
- data/lib/meshchat/network/local/connection.rb +58 -0
- data/lib/meshchat/network/local/server.rb +69 -0
- data/lib/meshchat/network/message.rb +34 -0
- data/lib/meshchat/network/message/base.rb +139 -0
- data/lib/meshchat/network/message/chat.rb +9 -0
- data/lib/meshchat/network/message/disconnect.rb +21 -0
- data/lib/meshchat/network/message/emote.rb +9 -0
- data/lib/meshchat/network/message/factory.rb +80 -0
- data/lib/meshchat/network/message/node_list.rb +75 -0
- data/lib/meshchat/network/message/node_list_diff.rb +18 -0
- data/lib/meshchat/network/message/node_list_hash.rb +32 -0
- data/lib/meshchat/network/message/ping.rb +31 -0
- data/lib/meshchat/network/message/ping_reply.rb +12 -0
- data/lib/meshchat/network/message/whisper.rb +28 -0
- data/lib/meshchat/network/remote.rb +13 -0
- data/lib/meshchat/network/remote/connection.rb +28 -0
- data/lib/meshchat/network/remote/relay.rb +109 -0
- data/lib/meshchat/network/remote/relay_pool.rb +52 -0
- data/lib/meshchat/ui.rb +13 -0
- data/lib/meshchat/ui/cli.rb +48 -0
- data/lib/meshchat/ui/cli/base.rb +39 -0
- data/lib/meshchat/ui/cli/input_factory.rb +50 -0
- data/lib/meshchat/ui/cli/keyboard_line_input.rb +14 -0
- data/lib/meshchat/ui/command.rb +51 -0
- data/lib/meshchat/ui/command/base.rb +77 -0
- data/lib/meshchat/ui/command/bind.rb +47 -0
- data/lib/meshchat/ui/command/chat.rb +31 -0
- data/lib/meshchat/ui/command/config.rb +37 -0
- data/lib/meshchat/ui/command/emote.rb +23 -0
- data/lib/meshchat/ui/command/exit.rb +16 -0
- data/lib/meshchat/ui/command/help.rb +20 -0
- data/lib/meshchat/ui/command/identity.rb +16 -0
- data/lib/meshchat/ui/command/import.rb +42 -0
- data/lib/meshchat/ui/command/irb.rb +22 -0
- data/lib/meshchat/ui/command/offline.rb +23 -0
- data/lib/meshchat/ui/command/online.rb +18 -0
- data/lib/meshchat/ui/command/ping.rb +65 -0
- data/lib/meshchat/ui/command/ping_all.rb +19 -0
- data/lib/meshchat/ui/command/send_disconnect.rb +20 -0
- data/lib/meshchat/ui/command/server.rb +22 -0
- data/lib/meshchat/ui/command/share.rb +16 -0
- data/lib/meshchat/ui/command/whisper.rb +40 -0
- data/lib/meshchat/ui/display.rb +78 -0
- data/lib/meshchat/ui/display/base.rb +58 -0
- data/lib/meshchat/ui/display/manager.rb +59 -0
- data/lib/meshchat/ui/notifier.rb +9 -0
- data/lib/meshchat/ui/notifier/base.rb +33 -0
- data/lib/meshchat/version.rb +3 -2
- metadata +150 -80
- data/lib/meshchat/cli.rb +0 -188
- data/lib/meshchat/cli/base.rb +0 -13
- data/lib/meshchat/cli/input.rb +0 -37
- data/lib/meshchat/command/base.rb +0 -80
- data/lib/meshchat/command/bind.rb +0 -44
- data/lib/meshchat/command/chat.rb +0 -30
- data/lib/meshchat/command/config.rb +0 -34
- data/lib/meshchat/command/emote.rb +0 -20
- data/lib/meshchat/command/exit.rb +0 -13
- data/lib/meshchat/command/help.rb +0 -17
- data/lib/meshchat/command/identity.rb +0 -13
- data/lib/meshchat/command/import.rb +0 -41
- data/lib/meshchat/command/init.rb +0 -34
- data/lib/meshchat/command/irb.rb +0 -23
- data/lib/meshchat/command/listen.rb +0 -13
- data/lib/meshchat/command/offline.rb +0 -20
- data/lib/meshchat/command/online.rb +0 -15
- data/lib/meshchat/command/ping.rb +0 -65
- data/lib/meshchat/command/ping_all.rb +0 -15
- data/lib/meshchat/command/send_disconnect.rb +0 -15
- data/lib/meshchat/command/server.rb +0 -20
- data/lib/meshchat/command/share.rb +0 -13
- data/lib/meshchat/command/stop_listening.rb +0 -13
- data/lib/meshchat/command/whisper.rb +0 -38
- data/lib/meshchat/database.rb +0 -30
- data/lib/meshchat/display.rb +0 -33
- data/lib/meshchat/display/base.rb +0 -60
- data/lib/meshchat/display/manager.rb +0 -55
- data/lib/meshchat/instance.rb +0 -40
- data/lib/meshchat/message.rb +0 -41
- data/lib/meshchat/message/base.rb +0 -97
- data/lib/meshchat/message/chat.rb +0 -19
- data/lib/meshchat/message/disconnect.rb +0 -13
- data/lib/meshchat/message/emote.rb +0 -9
- data/lib/meshchat/message/node_list.rb +0 -63
- data/lib/meshchat/message/node_list_diff.rb +0 -15
- data/lib/meshchat/message/node_list_hash.rb +0 -33
- data/lib/meshchat/message/ping.rb +0 -32
- data/lib/meshchat/message/ping_reply.rb +0 -9
- data/lib/meshchat/message/relay.rb +0 -43
- data/lib/meshchat/message/whisper.rb +0 -36
- data/lib/meshchat/models/entry.rb +0 -104
- data/lib/meshchat/net/client.rb +0 -83
- data/lib/meshchat/net/listener/errors.rb +0 -11
- data/lib/meshchat/net/listener/request.rb +0 -48
- data/lib/meshchat/net/listener/request_processor.rb +0 -50
- data/lib/meshchat/net/listener/server.rb +0 -114
- data/lib/meshchat/net/request.rb +0 -29
- data/lib/meshchat/notifier/base.rb +0 -31
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Meshchat
|
3
|
+
# This file is stupid.
|
4
|
+
# But very helpful when debugging problems...
|
5
|
+
module Debug
|
6
|
+
module_function
|
7
|
+
|
8
|
+
# TODO: extract this idea to a gem
|
9
|
+
# - automatic logging of method calls
|
10
|
+
def log(method_list)
|
11
|
+
method_list = Array[method_list]
|
12
|
+
method_list.each do |method|
|
13
|
+
backup_name = "#{method}_bak".to_sym
|
14
|
+
alias_method :backup_name, :method
|
15
|
+
define_method(method) do |*args|
|
16
|
+
Display.debug("##{method}: ")
|
17
|
+
Display.debug(args.inspect)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def message_type_not_found(type)
|
23
|
+
Display.debug('Type not found: ' + type.to_s)
|
24
|
+
end
|
25
|
+
|
26
|
+
def not_on_local_network(node)
|
27
|
+
Display.debug('SENDING: ' + node.alias_name + ' is not on the local network')
|
28
|
+
end
|
29
|
+
|
30
|
+
def received_message_from_relay(message, relay_url)
|
31
|
+
Display.debug('RECEIVING on RELAY: ' + relay_url)
|
32
|
+
Display.debug('RECEIVING on RELAY: ')
|
33
|
+
Display.debug(message)
|
34
|
+
end
|
35
|
+
|
36
|
+
def sending_message_over_relay(node, message, relay_url)
|
37
|
+
Display.debug('SENDING on RELAY: ' + relay_url)
|
38
|
+
Display.debug('SENDING on RELAY: ' + node.as_json.to_json)
|
39
|
+
Display.debug('SENDING on RELAY: ' + message.class.name)
|
40
|
+
Display.debug('SENDING on RELAY: ' + message.inspect)
|
41
|
+
end
|
42
|
+
|
43
|
+
def receiving_message(message)
|
44
|
+
Display.debug('RECEIVING: ' + message.type)
|
45
|
+
Display.debug('RECEIVING: ' + message.sender.to_s)
|
46
|
+
Display.debug('RECEIVING: ' + message.message.to_s)
|
47
|
+
end
|
48
|
+
|
49
|
+
def sending_message(message)
|
50
|
+
Display.debug('SENDING: ' + message.type)
|
51
|
+
Display.debug('SENDING: ' + message.sender.to_s)
|
52
|
+
Display.debug('SENDING: ' + message.message.to_s)
|
53
|
+
end
|
54
|
+
|
55
|
+
def person_not_online(node, message, e)
|
56
|
+
Display.debug("#{message.class.name}: Issue connectiong to #{node.alias_name}@#{node.location}")
|
57
|
+
Display.debug(e.message)
|
58
|
+
end
|
59
|
+
|
60
|
+
def encryption_failed(node)
|
61
|
+
Display.info "Public key encryption for #{node.try(:alias_name) || 'unknown'} failed"
|
62
|
+
end
|
63
|
+
|
64
|
+
def creating_input_failed(e)
|
65
|
+
Display.error e.message
|
66
|
+
Display.error e.backtrace.join("\n").colorize(:red)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/lib/meshchat/encryption.rb
CHANGED
@@ -1,8 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'meshchat/encryption/aes_rsa'
|
2
3
|
require 'meshchat/encryption/passthrough'
|
3
4
|
|
4
|
-
module
|
5
|
+
module Meshchat
|
5
6
|
module Encryption
|
7
|
+
extend ActiveSupport::Autoload
|
8
|
+
|
9
|
+
autoload :AES_RSA
|
10
|
+
autoload :Passthrough
|
11
|
+
|
6
12
|
module_function
|
7
13
|
|
8
14
|
DEFAULT_ENCRYPTOR = AES_RSA
|
@@ -22,6 +28,5 @@ module MeshChat
|
|
22
28
|
def encrypt(*args)
|
23
29
|
current_encryptor.encrypt(*args)
|
24
30
|
end
|
25
|
-
|
26
31
|
end
|
27
32
|
end
|
@@ -1,15 +1,17 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Meshchat
|
2
3
|
module Encryption
|
3
4
|
# This should normally be for testing
|
4
5
|
#
|
5
6
|
# It just retuns the message that is asked to be encrypted
|
6
7
|
module Passthrough
|
7
8
|
module_function
|
8
|
-
|
9
|
+
|
10
|
+
def encrypt(msg, *_args)
|
9
11
|
msg
|
10
12
|
end
|
11
13
|
|
12
|
-
def decrypt(msg, *
|
14
|
+
def decrypt(msg, *_args)
|
13
15
|
msg
|
14
16
|
end
|
15
17
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
confirm_options: ' (Y/N)'
|
2
|
+
confirm_yes: yes
|
3
|
+
confirm_y: y
|
4
|
+
identity:
|
5
|
+
settings_not_detected: a settings file was not detected or incomplete, would you like to generate one?
|
6
|
+
unknown_error_try_again: something went wrong with identity creation. try again?
|
7
|
+
settings_are_invalid: settings are invalid
|
8
|
+
confirm_uid_replace: uid exists, are you sure you want a new identity?
|
9
|
+
confirm_alias_replace: alias exists, would you like to overwrite it?
|
10
|
+
confirm_key_replace: keys exist, overwrite?
|
11
|
+
ask_for_alias: 'Type the name/alias you would like to go by in meshchat:'
|
12
|
+
current_alias: 'Your current name/alias is: %{name}'
|
13
|
+
node:
|
14
|
+
not_found: "Node not found, or does not have a location. Have you imported %{name}?"
|
@@ -0,0 +1,140 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Meshchat
|
3
|
+
class Node < ActiveRecord::Base
|
4
|
+
IPV4_WITH_PORT = /((?:(?:^|\.)(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){4})(:\d*)?/
|
5
|
+
# http://rubular.com/r/WYT09ptct3
|
6
|
+
DOMAIN_WITH_PORT = /(https?:\/\/)?([\da-z\.-]+)\.?([a-z\.]{2,6})([\/\w \.-]*)*[^\/](:\d*)?/
|
7
|
+
|
8
|
+
validates :alias_name,
|
9
|
+
:location,
|
10
|
+
:public_key, presence: true
|
11
|
+
|
12
|
+
validates :uid, presence: true, uniqueness: true
|
13
|
+
|
14
|
+
# ipv4 with port
|
15
|
+
validates_format_of :location_on_network, with: lambda { |e|
|
16
|
+
location_on_network = e.location_on_network || ''
|
17
|
+
is_domain = location_on_network.include?('//') ||
|
18
|
+
location_on_network.include?('localhost')
|
19
|
+
|
20
|
+
is_domain ? DOMAIN_WITH_PORT : IPV4_WITH_PORT
|
21
|
+
}
|
22
|
+
|
23
|
+
scope :on_local_network, -> { where(on_local_network: true) }
|
24
|
+
scope :on_relay, -> { where(on_relay: true) }
|
25
|
+
scope :online, -> { on_local_network.or(on_relay) }
|
26
|
+
|
27
|
+
class << self
|
28
|
+
def sha_preimage
|
29
|
+
all.map(&:public_key).sort.join(',')
|
30
|
+
end
|
31
|
+
|
32
|
+
def as_sha512
|
33
|
+
digest = Digest::SHA512.new
|
34
|
+
digest.hexdigest sha_preimage
|
35
|
+
end
|
36
|
+
|
37
|
+
def as_json
|
38
|
+
# must also include ourselves
|
39
|
+
# so that we can pass our own public key
|
40
|
+
# to those who don't have it
|
41
|
+
others = all.map(&:as_json)
|
42
|
+
me = APP_CONFIG.user.identity_as_json
|
43
|
+
others << me
|
44
|
+
end
|
45
|
+
|
46
|
+
def from_json(json)
|
47
|
+
new(
|
48
|
+
alias_name: json['alias'],
|
49
|
+
location_on_network: json['location'],
|
50
|
+
uid: json['uid'],
|
51
|
+
public_key: json['publickey']
|
52
|
+
)
|
53
|
+
end
|
54
|
+
|
55
|
+
def public_key_from_uid(uid)
|
56
|
+
find_by_uid(uid).try(:public_key)
|
57
|
+
end
|
58
|
+
|
59
|
+
# @param [Array] theirs array of hashes representing node entries
|
60
|
+
# @return [Array<-,+>] nodes only we have, and nodes only they have
|
61
|
+
def diff(theirs)
|
62
|
+
ours = as_json
|
63
|
+
we_only_have = ours - theirs
|
64
|
+
they_only_have = theirs - ours
|
65
|
+
|
66
|
+
[we_only_have, they_only_have]
|
67
|
+
end
|
68
|
+
|
69
|
+
def import_from_file(filename)
|
70
|
+
f = File.read(filename)
|
71
|
+
hash = JSON.parse(f)
|
72
|
+
n = from_json(hash)
|
73
|
+
n.save
|
74
|
+
n
|
75
|
+
rescue => e
|
76
|
+
Display.alert e.message
|
77
|
+
end
|
78
|
+
|
79
|
+
# Try to find the node, given a location, or uid
|
80
|
+
#
|
81
|
+
# TODO: do we want to also be able to find by relay address?
|
82
|
+
# - this would be non-unique
|
83
|
+
# - maybe finding should only happen via UID
|
84
|
+
# @param [String] location - the local network address
|
85
|
+
# @param [String] uid - the node's UID
|
86
|
+
# @param [Node] node - the node
|
87
|
+
# @return [Node]
|
88
|
+
def for(location: nil, uid: nil, node: nil)
|
89
|
+
unless node
|
90
|
+
node = Node.find_by_location_on_network(location) if location
|
91
|
+
node = Node.find_by_uid(uid) if uid && !node
|
92
|
+
end
|
93
|
+
|
94
|
+
unless node && node.valid?
|
95
|
+
msg = I18n.t('node.not_found', name: location || uid || '')
|
96
|
+
return Display.alert msg
|
97
|
+
end
|
98
|
+
|
99
|
+
node
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def ==(other)
|
104
|
+
result = false
|
105
|
+
|
106
|
+
if other.is_a?(Hash)
|
107
|
+
result = as_json.values_at(*other.keys) == other.values
|
108
|
+
end
|
109
|
+
|
110
|
+
result || super
|
111
|
+
end
|
112
|
+
|
113
|
+
def online
|
114
|
+
on_relay? || on_local_network?
|
115
|
+
end
|
116
|
+
alias_method :online?, :online
|
117
|
+
|
118
|
+
def location
|
119
|
+
return location_of_relay if on_relay?
|
120
|
+
location_on_network
|
121
|
+
end
|
122
|
+
|
123
|
+
def location_is_web_socket?
|
124
|
+
location.match(/wss?/).present?
|
125
|
+
end
|
126
|
+
|
127
|
+
def as_json
|
128
|
+
{
|
129
|
+
'alias' => alias_name,
|
130
|
+
'location' => location_on_network,
|
131
|
+
'uid' => uid,
|
132
|
+
'publickey' => public_key
|
133
|
+
}
|
134
|
+
end
|
135
|
+
|
136
|
+
def as_info
|
137
|
+
"#{alias_name}@#{location}"
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Meshchat
|
3
|
+
module Network
|
4
|
+
extend ActiveSupport::Autoload
|
5
|
+
NETWORK_LOCAL = :local
|
6
|
+
NETWORK_RELAY = :relay
|
7
|
+
|
8
|
+
eager_autoload do
|
9
|
+
autoload :Errors
|
10
|
+
autoload :Message
|
11
|
+
autoload :Dispatcher
|
12
|
+
autoload :Incoming
|
13
|
+
autoload :Local
|
14
|
+
autoload :Remote
|
15
|
+
autoload :MessageProcessor
|
16
|
+
autoload :RequestProcessor
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Meshchat
|
3
|
+
module Network
|
4
|
+
class Dispatcher
|
5
|
+
# creates messages
|
6
|
+
attr_reader :_message_factory
|
7
|
+
|
8
|
+
# standard peer-to-peer message sending
|
9
|
+
attr_reader :_local_client
|
10
|
+
|
11
|
+
# the action cable client ( web socket / connection beyond the firewall)
|
12
|
+
# - responsible for the relay server if the http client can't find the recipient
|
13
|
+
attr_reader :_relay_client
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@_message_factory = Message::Factory.new(self)
|
17
|
+
@_local_client = Local::Connection.new(self, @_message_factory)
|
18
|
+
@_relay_client = Remote::Connection.new(self, @_message_factory)
|
19
|
+
end
|
20
|
+
|
21
|
+
# @note Either the location, node, or uid should be present
|
22
|
+
#
|
23
|
+
# @param [String] location (Optional) location of target
|
24
|
+
# @param [String] uid (Optional) uid of target
|
25
|
+
# @param [Node] node (Optional) target
|
26
|
+
# @param [Message] message (Required) what to send to the target
|
27
|
+
def send_message(location: nil, uid: nil, node: nil, message: nil)
|
28
|
+
# verify node is valid
|
29
|
+
node = Node.for(location: location, uid: uid, node: node)
|
30
|
+
# don't proceed if we don't have a node
|
31
|
+
return unless node
|
32
|
+
# don't send to ourselves
|
33
|
+
return if APP_CONFIG.user['uid'] == node.uid
|
34
|
+
|
35
|
+
# everything is valid so far... DISPATCH!
|
36
|
+
dispatch!(node, message)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def dispatch!(node, message)
|
42
|
+
Debug.sending_message(message)
|
43
|
+
|
44
|
+
message = encrypted_message(node, message)
|
45
|
+
|
46
|
+
# determine last known sending method
|
47
|
+
if node.on_local_network?
|
48
|
+
try_dispatching_over_local_network_first(node, message)
|
49
|
+
else
|
50
|
+
try_dispatching_over_the_relay_first(node, message)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# this attempts to send over http to the local network,
|
55
|
+
# if that fails, the passed block will be invoked
|
56
|
+
def try_dispatching_over_local_network_first(node, message)
|
57
|
+
_local_client.send_message(node, message) do
|
58
|
+
Debug.not_on_local_network(node)
|
59
|
+
node.update(on_local_network: false)
|
60
|
+
_relay_client.send_message(node, message)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# this attempts to send over the relay first
|
65
|
+
# if that fails, the passed block will be invked
|
66
|
+
def try_dispatching_over_the_relay_first(node, message)
|
67
|
+
# Due to the constant-connection nature of web-sockets,
|
68
|
+
# The sending via http client will happen if the node's-
|
69
|
+
# on_local_network property is true.
|
70
|
+
# node.update(on_local_network: true)
|
71
|
+
_relay_client.send_message(node, message)
|
72
|
+
end
|
73
|
+
|
74
|
+
def encrypted_message(node, message)
|
75
|
+
message.encrypt_for(node)
|
76
|
+
rescue => e
|
77
|
+
Display.debug e.message
|
78
|
+
Display.debug e.backtrace
|
79
|
+
Debug.encryption_failed(node)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Meshchat
|
3
|
+
module Network
|
4
|
+
module Errors
|
5
|
+
class NotAuthorized < StandardError; end
|
6
|
+
class Forbidden < StandardError; end
|
7
|
+
class BadRequest < StandardError; end
|
8
|
+
class MessageTypeNotRecognized < StandardError; end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Meshchat
|
3
|
+
module Network
|
4
|
+
module Incoming
|
5
|
+
class MessageDecryptor
|
6
|
+
attr_reader :_json, :_message, :_input
|
7
|
+
attr_reader :_message_factory
|
8
|
+
|
9
|
+
def initialize(encoded_message, message_factory)
|
10
|
+
@_message_factory = message_factory
|
11
|
+
@_input = try_decrypt(encoded_message)
|
12
|
+
@_json = parse_json(@_input)
|
13
|
+
@_message = process_json
|
14
|
+
end
|
15
|
+
|
16
|
+
def message
|
17
|
+
_message
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def parse_json(input)
|
23
|
+
return JSON.parse(input)
|
24
|
+
rescue => e
|
25
|
+
Display.debug e.message
|
26
|
+
Display.debug e.backtrace.join("\n")
|
27
|
+
raise Errors::BadRequest, 'could not parse json'
|
28
|
+
end
|
29
|
+
|
30
|
+
def try_decrypt(input)
|
31
|
+
begin
|
32
|
+
decoded = Base64.decode64(input)
|
33
|
+
input = Encryption.decrypt(decoded, APP_CONFIG.user[:privatekey])
|
34
|
+
rescue => e
|
35
|
+
Display.debug e.message
|
36
|
+
Display.debug e.backtrace.join("\n")
|
37
|
+
Display.debug input
|
38
|
+
raise Errors::NotAuthorized, e.message
|
39
|
+
end
|
40
|
+
|
41
|
+
input
|
42
|
+
end
|
43
|
+
|
44
|
+
def process_json
|
45
|
+
type = _json['type']
|
46
|
+
_message_factory.create(type, data: { payload: _json })
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|