diff --git a/sgx-catapult.rb b/sgx-catapult.rb index 7d1e08f4762859287a2d4cc6a2d5c98de6e51dea..20dd2e2431fefdec4f6e2f1e35a6e24b5eb4da5c 100755 --- a/sgx-catapult.rb +++ b/sgx-catapult.rb @@ -25,12 +25,13 @@ require 'redis/connection/hiredis' require 'time' require 'uri' require 'uuid' +require 'webrick' require 'goliath/api' require 'goliath/server' require 'log4r' -puts "Soprani.ca/SMS Gateway for XMPP - Catapult v0.021\n\n" +puts "Soprani.ca/SMS Gateway for XMPP - Catapult v0.022\n\n" if ARGV.size != 9 then puts "Usage: sgx-catapult.rb " + @@ -167,7 +168,11 @@ module SGXcatapult 'from' => users_num, 'to' => num_dest, 'text' => m.body, - 'tag' => m.id, # TODO: message has it? + 'tag' => + # callbacks need both the id and resourcepart + WEBrick::HTTPUtils.escape(m.id) + ' ' + + WEBrick::HTTPUtils.escape( + m.from.to_s.split('/', 2)[1] ), 'receiptRequested' => 'all', 'callbackUrl' => ARGV[6] }) @@ -424,7 +429,11 @@ module SGXcatapult 'media' => [ 'https://api.catapult.inetwork.com/v1/users/' + user_id + '/media/' + media_name], - 'tag' => i.id # TODO: message has it? + 'tag' => + # callbacks need both the id and resourcepart + WEBrick::HTTPUtils.escape(i.id) + ' ' + + WEBrick::HTTPUtils.escape( + i.from.to_s.split('/', 2)[1] ) # TODO: add back when Bandwidth AP supports it (?); now: # "The ''messages'' resource property # ''receiptRequested'' is not supported for MMS" @@ -863,32 +872,41 @@ class WebhookHandler < Goliath::API msg = Blather::Stanza::Message.new(bare_jid, text) else # per prior switch, this is: params['direction'] == 'out' - msg = ReceiptMessage.new(bare_jid) - - # TODO: put in member/instance variable - uuid_gen = UUID.new - msg['id'] = uuid_gen.generate + tag_parts = params['tag'].split(' ', 2) + id = WEBrick::HTTPUtils.unescape(tag_parts[0]) + resourcepart = WEBrick::HTTPUtils.unescape(tag_parts[1]) case params['deliveryState'] when 'not-delivered' - # TODO: add text re deliveryDescription reason - msg = SGXcatapult.error_msg(msg, nil, :cancel, - 'service-unavailable') - return [200, {}, "OK"] + # create a bare message like the one user sent + msg = Blather::Stanza::Message.new( + others_num + '@' + ARGV[0]) + msg.from = bare_jid + '/' + resourcepart + msg['id'] = id + + # create an error reply to the bare message + msg = Blather::StanzaError.new(msg, + 'recipient-unavailable', :wait).to_node when 'delivered' + msg = ReceiptMessage.new(bare_jid) + + # TODO: put in member/instance variable + uuid_gen = UUID.new + msg['id'] = uuid_gen.generate + # TODO: send only when requested per XEP-0184 rcvd = Nokogiri::XML::Node.new 'received', msg.document rcvd['xmlns'] = 'urn:xmpp:receipts' - rcvd['id'] = params['tag'] + rcvd['id'] = id msg.add_child(rcvd) when 'waiting' # can't really do anything with it; nice to know - puts "message with id #{params['tag']} waiting" + puts "message with id #{id} waiting" return [200, {}, "OK"] else # TODO: notify somehow of unknown state receivd? - puts "message with id #{params['tag']} has " + + puts "message with id #{id} has " + "other state #{params['deliveryState']}" return [200, {}, "OK"] end