143 lines
4.5 KiB
Crystal
143 lines
4.5 KiB
Crystal
![]() |
|
||
|
Context.service = IPC::Service.new Context.service_name
|
||
|
|
||
|
Context.service.not_nil!.loop do |event|
|
||
|
case event
|
||
|
when IPC::Event::Timer
|
||
|
puts "#{CORANGE}IPC::Event::Timer#{CRESET}"
|
||
|
|
||
|
when IPC::Event::Connection
|
||
|
puts "#{CBLUE}IPC::Event::Connection: #{event.connection.fd}#{CRESET}"
|
||
|
|
||
|
when IPC::Event::Disconnection
|
||
|
puts "#{CBLUE}IPC::Event::Disconnection: #{event.connection.fd}#{CRESET}"
|
||
|
|
||
|
Context.connected_users.select! do |fd, uid|
|
||
|
fd != event.connection.fd
|
||
|
end
|
||
|
|
||
|
when IPC::Event::ExtraSocket
|
||
|
puts "#{CRED}IPC::Event::ExtraSocket: should not happen in this service#{CRESET}"
|
||
|
|
||
|
when IPC::Event::Switch
|
||
|
puts "#{CRED}IPC::Event::Switch: should not happen in this service#{CRESET}"
|
||
|
|
||
|
# IPC::Event::Message has to be the last entry
|
||
|
# because ExtraSocket and Switch inherit from Message class
|
||
|
when IPC::Event::Message
|
||
|
puts "#{CBLUE}IPC::Event::Message#{CRESET}: #{event.connection.fd}"
|
||
|
|
||
|
# The first message sent to the server has to be the AuthenticationMessage.
|
||
|
# Users sent their token (JWT) to authenticate themselves.
|
||
|
# The token contains the user id, its login and a few other parameters.
|
||
|
# (see the authd documentation).
|
||
|
# TODO: for now, the token is replaced by a hardcoded one, for debugging
|
||
|
|
||
|
mtype = FileStorage::MessageType.new event.message.type.to_i32
|
||
|
|
||
|
# First, the user has to be authenticated unless we are receiving its first message
|
||
|
userid = Context.connected_users[event.connection.fd]?
|
||
|
if ! userid
|
||
|
case mtype
|
||
|
when .authentication?
|
||
|
else
|
||
|
|
||
|
mid = "message id not found"
|
||
|
m = String.new event.message.payload
|
||
|
|
||
|
case mtype
|
||
|
when .authentication?
|
||
|
when .upload_request?
|
||
|
puts "Upload request"
|
||
|
request = FileStorage::Message::UploadRequest.from_json(m)
|
||
|
mid = request.mid
|
||
|
when .download_request?
|
||
|
puts "Download request"
|
||
|
request = FileStorage::Message::DownloadRequest.from_json(m)
|
||
|
mid = request.mid
|
||
|
when .response?
|
||
|
puts "Response message"
|
||
|
request = FileStorage::Message::Response.from_json(m)
|
||
|
mid = request.mid
|
||
|
raise "not implemented yet"
|
||
|
when .responses?
|
||
|
puts "Responses message"
|
||
|
request = FileStorage::Message::Responses.from_json(m)
|
||
|
mid = request.mid
|
||
|
raise "not implemented yet"
|
||
|
when .error?
|
||
|
puts "Error message"
|
||
|
request = FileStorage::Message::Error.from_json(m)
|
||
|
mid = request.mid
|
||
|
raise "not implemented yet"
|
||
|
when .transfer?
|
||
|
request = FileStorage::Message::Transfer.from_json(m)
|
||
|
mid = request.mid
|
||
|
else
|
||
|
raise "Event type not supported, message from a non connected user."
|
||
|
end
|
||
|
|
||
|
response = FileStorage::Message::Response.new mid, "Not OK", "Action on non connected user"
|
||
|
event.connection.send FileStorage::MessageType::Response.to_u8, response.to_json
|
||
|
next
|
||
|
end
|
||
|
end
|
||
|
|
||
|
case mtype
|
||
|
when .authentication?
|
||
|
puts "Receiving an authentication message"
|
||
|
# 1. test if the client is already authenticated
|
||
|
if userid
|
||
|
user = Context.users_status[userid]
|
||
|
raise "Authentication message while the user was already connected: this should not happen"
|
||
|
else
|
||
|
puts "User is not currently connected"
|
||
|
hdl_authentication event
|
||
|
end
|
||
|
when .upload_request?
|
||
|
puts "Upload request"
|
||
|
request = FileStorage::Message::UploadRequest.from_json(
|
||
|
String.new event.message.payload
|
||
|
)
|
||
|
response = hdl_upload request, Context.users_status[userid], event
|
||
|
|
||
|
event.connection.send FileStorage::MessageType::Response.to_u8, response.to_json
|
||
|
raise "not implemented yet"
|
||
|
when .download_request?
|
||
|
puts "Download request"
|
||
|
request = FileStorage::Message::DownloadRequest.from_json(
|
||
|
String.new event.message.payload
|
||
|
)
|
||
|
response = hdl_download request, Context.users_status[userid], event
|
||
|
|
||
|
event.connection.send FileStorage::MessageType::Response.to_u8, response.to_json
|
||
|
raise "not implemented yet"
|
||
|
when .response?
|
||
|
puts "Response message"
|
||
|
raise "not implemented yet"
|
||
|
when .responses?
|
||
|
puts "Responses message"
|
||
|
raise "not implemented yet"
|
||
|
when .error?
|
||
|
puts "Error message"
|
||
|
raise "not implemented yet"
|
||
|
when .transfer?
|
||
|
# throw an error if the user isn't recorded
|
||
|
unless user = Context.users_status[userid]?
|
||
|
raise "The user isn't recorded in the users_status structure"
|
||
|
end
|
||
|
|
||
|
transfer = FileStorage::Message::Transfer.from_json(
|
||
|
String.new event.message.payload
|
||
|
)
|
||
|
response = hdl_transfer transfer, Context.users_status[userid], event
|
||
|
|
||
|
event.connection.send FileStorage::MessageType::Response.to_u8, response.to_json
|
||
|
|
||
|
hdl_transfer transfer, user, event
|
||
|
end
|
||
|
else
|
||
|
raise "Event type not supported."
|
||
|
end
|
||
|
end
|