Skip to content
This repository has been archived by the owner on Sep 29, 2021. It is now read-only.

Commit

Permalink
fix(adapter): escape reply message, reconnect datafeed on error
Browse files Browse the repository at this point in the history
xml characters in a reply are escaped to avoid creating invalid messageML
if an error is encountered polling a datafeed a new one will be created
  • Loading branch information
jonfreedman committed Aug 9, 2016
1 parent b4748a6 commit 79fc121
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 3 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
"homepage": "https://github.com/symphonyoss/hubot-symphony",
"dependencies": {
"fs": "0.0.2",
"html-entities": "^1.2.0",
"log": "^1.4.0",
"memoizee": "^0.4.1",
"q": "^1.4.1",
Expand Down
5 changes: 4 additions & 1 deletion src/adapter.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
Symphony = require './symphony'
{V2Message} = require './message'
memoize = require 'memoizee'
Entities = require('html-entities').XmlEntities
entities = new Entities()

class SymphonyAdapter extends Adapter

Expand All @@ -39,7 +41,7 @@ class SymphonyAdapter extends Adapter
reply: (envelope, messages...) ->
@robot.logger.debug "Reply"
for message in messages
@symphony.sendMessage(envelope.room, "<messageML><mention email=\"#{envelope.user.emailAddress}\"/> #{message}</messageML>", 'MESSAGEML')
@symphony.sendMessage(envelope.room, "<messageML><mention email=\"#{envelope.user.emailAddress}\"/> #{entities.encode(message)}</messageML>", 'MESSAGEML')

run: =>
@robot.logger.info "Initialising..."
Expand Down Expand Up @@ -91,6 +93,7 @@ class SymphonyAdapter extends Adapter
@emit 'poll', id
.fail (err) =>
@robot.emit 'error', new Error("Unable to read datafeed #{id}: #{err}")
@_createDatafeed()

_receiveMessage: (message) =>
if message.fromUserId != @robot.userId
Expand Down
4 changes: 2 additions & 2 deletions src/symphony.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -104,10 +104,10 @@ class Symphony

request(options, (err, res, data) =>
if err?
logger.warning "received error response from #{path}: #{err}"
logger.warning "received #{res?.statusCode} error response from #{path}: #{err}"
deferred.reject(new Error(err))
else
logger.debug "received #{res.statusCode} response from #{path}: #{JSON.stringify(data)}"
logger.debug "received #{res?.statusCode} response from #{path}: #{JSON.stringify(data)}"
deferred.resolve data
)
deferred.promise
Expand Down
18 changes: 18 additions & 0 deletions test/adapter-test.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -101,3 +101,21 @@ describe 'Adapter test suite', () ->
assert.isAtLeast((m for m in nock.messages when m.message is "<messageML><mention email=\"[email protected]\"/> foo bar baz</messageML>").length, 1)
done()
adapter.run()

it 'should escape xml chars in reply', (done) ->
robot = new FakeRobot
adapter = SymphonyAdapter.use(robot)
adapter.on 'connected', () ->
assert.isDefined(adapter.symphony)
envelope = {
room: nock.streamId
user: {
emailAddress: '[email protected]'
}
}
adapter.reply(envelope, '<&>')
adapter.close()
nock.on 'received', () ->
assert.isAtLeast((m for m in nock.messages when m.message is "<messageML><mention email=\"[email protected]\"/> &lt;&amp;&gt;</messageML>").length, 1)
done()
adapter.run()

0 comments on commit 79fc121

Please sign in to comment.