diff --git a/static/hogfather.js b/static/hogfather.js index d8f02fc..b1b8cd4 100644 --- a/static/hogfather.js +++ b/static/hogfather.js @@ -34,6 +34,7 @@ hogfather.PublicChat = function(cosmo, id) { this.owners_ = []; this.writers_ = []; + this.messages_ = []; /** * @type {DocumentFragment} @@ -108,19 +109,50 @@ hogfather.PublicChat.prototype.getID = function() { }; +/** + * @private + * @param {Cosmopolite.typeMessage} message + * @param {Array.} owners + * @param {Array.} writers + */ +hogfather.PublicChat.prototype.checkMessage_ = function( + message, owners, writers) { + + // Bootstrapping for new groups + if (!owners.length) { + owners.push(message.sender); + } + if (!writers.length) { + writers.push(message.sender); + } + + var acl; + + switch (message.message.type) { + case 'message': + acl = writers; + break; + + default: + console.log('Unknown message type:', message); + return false; + }; + + if (acl.indexOf(message.sender) == -1) { + console.log(this.loggingPrefix_(), "message from unauthorized source:", + message, acl); + return false; + } else { + return true; + } +}; + + /** * @return {Array.} */ hogfather.PublicChat.prototype.getMessages = function() { - var messages = this.cosmo_.getMessages(this.subject_); - var ret = []; - messages.forEach(function(message) { - if (message.message.type != 'message') { - return; - } - ret.push(this.cleanMessage_(message)); - }.bind(this)); - return ret; + return this.messages_; }; @@ -142,28 +174,18 @@ hogfather.PublicChat.prototype.sendMessage = function(message) { */ hogfather.PublicChat.prototype.onMessage_ = function(e) { var message = e.detail; - if (!this.owners_.length) { - this.owners_.push(message.sender); - } - if (!this.writers_.length) { - this.writers_.push(message.sender); + if (!this.checkMessage_(message, this.owners_, this.writers_)) { + return; } switch (message.message.type) { case 'message': - if (this.writers_.indexOf(message.sender) == -1) { - console.log(this.loggingPrefix_(), "message from non-writer:", - message, this.writers_); - break; - } + var cleanMessage = this.cleanMessage_(message); + this.messages_.push(cleanMessage); var e2 = new CustomEvent('message', { - 'detail': this.cleanMessage_(message), + 'detail': cleanMessage, }); this.dispatchEvent(e2); break; - - default: - console.log('Unknown message type:', message); - break; } };