diff --git a/resources/celerity/map.php b/resources/celerity/map.php index 4d4f942332..9a30568d5d 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -476,7 +476,7 @@ return array( 'rsrc/js/phuix/PHUIXActionListView.js' => 'b5c256b8', 'rsrc/js/phuix/PHUIXActionView.js' => '6e8cefa4', 'rsrc/js/phuix/PHUIXDropdownMenu.js' => 'bd4c8dca', - 'rsrc/swf/aphlict.swf' => 'b7c2d7aa', + 'rsrc/swf/aphlict.swf' => 'f45c3edc', ), 'symbols' => array( diff --git a/src/applications/feed/PhabricatorFeedStoryPublisher.php b/src/applications/feed/PhabricatorFeedStoryPublisher.php index 3c0dc0b808..274f0d8df6 100644 --- a/src/applications/feed/PhabricatorFeedStoryPublisher.php +++ b/src/applications/feed/PhabricatorFeedStoryPublisher.php @@ -176,10 +176,8 @@ final class PhabricatorFeedStoryPublisher { private function sendNotification($chrono_key) { $data = array( - 'data' => array( - 'key' => (string)$chrono_key, - 'type' => 'notification', - ), + 'key' => (string)$chrono_key, + 'type' => 'notification', 'subscribers' => $this->subscribedPHIDs, ); diff --git a/src/applications/notification/client/PhabricatorNotificationClient.php b/src/applications/notification/client/PhabricatorNotificationClient.php index ab7ee1c6d0..4c433c9b4f 100644 --- a/src/applications/notification/client/PhabricatorNotificationClient.php +++ b/src/applications/notification/client/PhabricatorNotificationClient.php @@ -2,7 +2,7 @@ final class PhabricatorNotificationClient { - const EXPECT_VERSION = 5; + const EXPECT_VERSION = 6; public static function getServerStatus() { $uri = PhabricatorEnv::getEnvConfig('notification.server-uri'); diff --git a/support/aphlict/server/aphlict_server.js b/support/aphlict/server/aphlict_server.js index d2212fcfa1..74374ea132 100644 --- a/support/aphlict/server/aphlict_server.js +++ b/support/aphlict/server/aphlict_server.js @@ -25,10 +25,10 @@ if (config.logfile) { function parse_command_line_arguments(argv) { var config = { - port : 22280, - admin : 22281, - host : '127.0.0.1', - user : null, + port: 22280, + admin: 22281, + host: '127.0.0.1', + user: null, log: '/var/log/aphlict.log' }; @@ -36,10 +36,10 @@ function parse_command_line_arguments(argv) { var arg = argv[ii]; var matches = arg.match(/^--([^=]+)=(.*)$/); if (!matches) { - throw new Error("Unknown argument '"+arg+"'!"); + throw new Error("Unknown argument '" + arg + "'!"); } if (!(matches[1] in config)) { - throw new Error("Unknown argument '"+matches[1]+"'!"); + throw new Error("Unknown argument '" + matches[1] + "'!"); } config[matches[1]] = matches[2]; } @@ -52,19 +52,19 @@ function parse_command_line_arguments(argv) { if (process.getuid() !== 0) { console.log( - "ERROR: "+ - "This server must be run as root because it needs to bind to privileged "+ - "port 843 to start a Flash policy server. It will downgrade to run as a "+ - "less-privileged user after binding if you pass a user in the command "+ + "ERROR: " + + "This server must be run as root because it needs to bind to privileged " + + "port 843 to start a Flash policy server. It will downgrade to run as a " + + "less-privileged user after binding if you pass a user in the command " + "line arguments with '--user=alincoln'."); process.exit(1); } var net = require('net'); -var http = require('http'); +var http = require('http'); var url = require('url'); -process.on('uncaughtException', function (err) { +process.on('uncaughtException', function(err) { debug.log("\n<<< UNCAUGHT EXCEPTION! >>>\n\n" + err); process.exit(1); }); @@ -95,7 +95,7 @@ var send_server = net.createServer(function(socket) { debug.log('<%s> Ended Connection', listener.getDescription()); }); - socket.on('error', function (e) { + socket.on('error', function(e) { debug.log('<%s> Error: %s', listener.getDescription(), e); }); @@ -107,23 +107,29 @@ var messages_in = 0; var start_time = new Date().getTime(); var receive_server = http.createServer(function(request, response) { - response.writeHead(200, {'Content-Type' : 'text/plain'}); - // Publishing a notification. if (request.method == 'POST') { var body = ''; - request.on('data', function (data) { + request.on('data', function(data) { body += data; }); - request.on('end', function () { - ++messages_in; - - var msg = JSON.parse(body); - debug.log('notification: ' + JSON.stringify(msg)); - broadcast(msg.data); - response.end(); + request.on('end', function() { + try { + var msg = JSON.parse(body); + + debug.log('notification: ' + JSON.stringify(msg)); + ++messages_in; + broadcast(msg); + + response.writeHead(200, {'Content-Type': 'text/plain'}); + } catch (err) { + response.statusCode = 400; + response.write('400 Bad Request'); + } finally { + response.end(); + } }); } else if (request.url == '/status/') { request.on('data', function(data) { @@ -139,9 +145,10 @@ var receive_server = http.createServer(function(request, response) { 'messages.in': messages_in, 'messages.out': messages_out, 'log': config.log, - 'version': 5 + 'version': 6 }; + response.writeHead(200, {'Content-Type': 'text/plain'}); response.write(JSON.stringify(status)); response.end(); }); diff --git a/support/aphlict/server/lib/AphlictFlashPolicyServer.js b/support/aphlict/server/lib/AphlictFlashPolicyServer.js index 77cb6311f8..8651d643a8 100644 --- a/support/aphlict/server/lib/AphlictFlashPolicyServer.js +++ b/support/aphlict/server/lib/AphlictFlashPolicyServer.js @@ -17,12 +17,12 @@ JX.install('AphlictFlashPolicyServer', { _accessPort: null, _debug: null, - setDebugLog : function(log) { + setDebugLog: function(log) { this._debug = log; return this; }, - setAccessPort : function(port) { + setAccessPort: function(port) { this._accessPort = port; return this; }, diff --git a/support/aphlict/server/lib/AphlictListener.js b/support/aphlict/server/lib/AphlictListener.js index 119ca18c2b..c148f437b7 100644 --- a/support/aphlict/server/lib/AphlictListener.js +++ b/support/aphlict/server/lib/AphlictListener.js @@ -1,28 +1,28 @@ var JX = require('javelin').JX; JX.install('AphlictListener', { - construct : function(id, socket) { + construct: function(id, socket) { this._id = id; this._socket = socket; }, - members : { - _id : null, - _socket : null, + members: { + _id: null, + _socket: null, - getID : function() { + getID: function() { return this._id; }, - getSocket : function() { + getSocket: function() { return this._socket; }, - getDescription : function() { + getDescription: function() { return 'Listener/' + this.getID(); }, - writeMessage : function(message) { + writeMessage: function(message) { var serial = JSON.stringify(message); var length = Buffer.byteLength(serial, 'utf8'); diff --git a/support/aphlict/server/lib/AphlictListenerList.js b/support/aphlict/server/lib/AphlictListenerList.js index 1520e49fce..9ffe64ff55 100644 --- a/support/aphlict/server/lib/AphlictListenerList.js +++ b/support/aphlict/server/lib/AphlictListenerList.js @@ -2,20 +2,18 @@ var JX = require('javelin').JX; JX.require('AphlictListener', __dirname); JX.install('AphlictListenerList', { - construct : function() { + construct: function() { this._listeners = {}; }, - members : { - _listeners : null, - _nextID : 0, - _activeListenerCount : 0, - _totalListenerCount : 0, + members: { + _listeners: null, + _nextID: 0, + _activeListenerCount: 0, + _totalListenerCount: 0, - addListener : function(socket) { - var listener = new JX.AphlictListener( - this._generateNextID(), - socket); + addListener: function(socket) { + var listener = new JX.AphlictListener(this._generateNextID(), socket); this._listeners[listener.getID()] = listener; this._activeListenerCount++; @@ -24,7 +22,7 @@ JX.install('AphlictListenerList', { return listener; }, - removeListener : function(listener) { + removeListener: function(listener) { var id = listener.getID(); if (id in this._listeners) { delete this._listeners[id]; @@ -32,19 +30,19 @@ JX.install('AphlictListenerList', { } }, - getListeners : function() { + getListeners: function() { return this._listeners; }, - getActiveListenerCount : function() { + getActiveListenerCount: function() { return this._activeListenerCount; }, - getTotalListenerCount : function() { + getTotalListenerCount: function() { return this._totalListenerCount; }, - _generateNextID : function() { + _generateNextID: function() { do { this._nextID = ((this._nextID + 1) % 1000000000000); } while (this._nextID in this._listeners); diff --git a/support/aphlict/server/lib/AphlictLog.js b/support/aphlict/server/lib/AphlictLog.js index d773b9ad63..259c03fada 100644 --- a/support/aphlict/server/lib/AphlictLog.js +++ b/support/aphlict/server/lib/AphlictLog.js @@ -4,16 +4,16 @@ var fs = require('fs'); var util = require('util'); JX.install('AphlictLog', { - construct : function() { + construct: function() { this._writeToLogs = []; this._writeToConsoles = []; }, - members : { - _writeToConsoles : null, - _writeToLogs : null, + members: { + _writeToConsoles: null, + _writeToLogs: null, - addLogfile : function(path) { + addLogfile: function(path) { var options = { flags: 'a', encoding: 'utf8', @@ -27,12 +27,12 @@ JX.install('AphlictLog', { return this; }, - addConsole : function(console) { + addConsole: function(console) { this._writeToConsoles.push(console); return this; }, - log : function(pattern) { + log: function(pattern) { var str = util.format.apply(null, arguments); var date = new Date().toLocaleString(); str = '[' + date + '] ' + str; diff --git a/support/aphlict/server/lib/javelin.js b/support/aphlict/server/lib/javelin.js index e90986a56c..9a4636f9cc 100644 --- a/support/aphlict/server/lib/javelin.js +++ b/support/aphlict/server/lib/javelin.js @@ -6,7 +6,7 @@ JX.require('core/install'); // NOTE: This is faking out a piece of code in JX.install which waits for // Stratcom before running static initializers. -JX.Stratcom = {ready : true}; +JX.Stratcom = {ready: true}; JX.require('core/Event'); JX.require('core/Stratcom'); diff --git a/webroot/rsrc/swf/aphlict.swf b/webroot/rsrc/swf/aphlict.swf index 589e046c3c6d384478ebb268fc98742f0e18f8fe..37b5d23776e3a925a8d277c65a5a8eaf213506f4 100644 GIT binary patch delta 5398 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 b{hRNf{`zLWWZs|sss`at{xe+eFP{nksE>A7 delta 5395 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