-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmyapp.rb
121 lines (103 loc) · 3.95 KB
/
myapp.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
require 'sinatra/activerecord'
require File.expand_path('../lib/utils.rb', __FILE__)
Dir.glob(File.expand_path('../app/helpers/*.rb', __FILE__)).each { |r| require r}
require File.expand_path('../app/models/sim_card.rb', __FILE__)
require File.expand_path('../app/models/requests/mifi_request.rb', __FILE__)
require File.expand_path('../app/models/requests/g3_request.rb', __FILE__)
require File.expand_path('../app/models/requests/auth_request.rb', __FILE__)
require File.expand_path('../app/models/requests/beat_request.rb', __FILE__)
require File.expand_path('../app/models/requests/log_request.rb', __FILE__)
require File.expand_path('../app/models/user.rb', __FILE__)
require File.expand_path('../app/models/flow_log.rb', __FILE__)
require File.expand_path('../app/models/card_binding.rb', __FILE__)
require File.expand_path('../app/models/card_selector/card_selector.rb', __FILE__)
class MyApp < Sinatra::Base
API_VERSION = '1'
require 'logger'
::Logger.class_eval { alias :write :'<<' }
access_log = ::File.join(::File.dirname(::File.expand_path(__FILE__)), 'public', 'log.txt')
logger = ::Logger.new(access_log)
error_logger = ::File.new(::File.join(::File.dirname(::File.expand_path(__FILE__)), 'public', 'error.log'), "a+")
error_logger.sync = true
configure do
use ::Rack::CommonLogger, logger
end
before {
env["rack.errors"] = error_logger
}
configure :development, :test do
require 'pry'
set :show_exceptions, false
end
register Sinatra::ActiveRecordExtension
helpers MyAppHelpers
helpers MifiCrypt
error NoMoreSimCard do
[501, 'no more sim_card!']
end
error Mifi::CardError do
[410, 'card error!']
end
get '/' do
"Hello ieMiFi!"
end
before do
@data = parse_body(request.body)
raw = @data[1]
logger.info "#{request.path} REQUEST : #{raw.unpack('H*')[0]}"
end
after do
@card_binding.touch if @card_binding # touch @card_bindding, keep it lives
logger.info "#{request.path} RESPONSE: #{response.body.join.unpack('H*')[0]}"
end
post '/3g' do
g3_request = G3Request.new(*@data)
halt(400, 'sign error!') unless g3_request.valid?
g3_request.save_pkey_at_first_count!
@pkey = g3_request.pkey
@user = g3_request.user
if @user.card_bindings.empty?
@card_selector = CardSelector.new(@user, g3_request.mcc, g3_request.mnc)
@card = @card_selector.select_and_mark_card
@card_binding = bind_card(@user, @card)
else
@card_binding = @user.card_bindings.first
@card = @card_binding.sim_card
end
res_before_encyrpt = @card_binding.mac_key + @card.g3_data
logger.info "/3g RESPONSE before encrypt: #{res_before_encyrpt.b.unpack('H*')[0]}"
API_VERSION + pk_encrypt(@pkey, res_before_encyrpt)
end
post '/auth' do
auth_request = AuthRequest.new(*@data)
halt(400, 'sign error!') unless auth_request.valid?
@card_binding = auth_request.card_binding
@sim_card = @card_binding.sim_card
auth_res = Mifi::CardReader.auth(@sim_card.card_addr, auth_request.auth_req)
API_VERSION + auth_res.length.chr + auth_res
end
post '/beats' do
beat_request = BeatRequest.new(*@data)
@user = beat_request.user
halt(400, 'sign error!') unless beat_request.valid?
flow_log = FlowLog.new(:user_id => beat_request.user.id, :count => beat_request.count)
flow_log.save!
@card_binding = beat_request.card_binding
@sim_card = @card_binding.sim_card
@sim_card.set_network_enabled!
if beat_request.client_shutdown?
@card_binding.deactivate!
end
halt(API_VERSION + "\x00\x00") if @user.pending_actions.empty?
@user.pending_actions.each {|a| a.mark_delivered!} # TODO
API_VERSION + @user.pending_actions.map(&:cmd).join
end
post '/log' do
log_request = LogRequest.new(*@data)
@card_binding = log_request.card_binding
logger.info "LOG TEXT: #{log_request.text}"
halt(400, 'sign error!') unless log_request.valid?
log_request.save_card_log
API_VERSION + "\x00\x00"
end
end