Factor out ACL code. Keep a manifest copy of hogfather messages.

This commit is contained in:
Ian Gulliver
2015-12-29 11:42:54 -08:00
parent 78b92347a7
commit 976a5bd49f

View File

@@ -34,6 +34,7 @@ hogfather.PublicChat = function(cosmo, id) {
this.owners_ = []; this.owners_ = [];
this.writers_ = []; this.writers_ = [];
this.messages_ = [];
/** /**
* @type {DocumentFragment} * @type {DocumentFragment}
@@ -108,19 +109,50 @@ hogfather.PublicChat.prototype.getID = function() {
}; };
/**
* @private
* @param {Cosmopolite.typeMessage} message
* @param {Array.<string>} owners
* @param {Array.<string>} 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.<Cosmopolite.typeMessage>} * @return {Array.<Cosmopolite.typeMessage>}
*/ */
hogfather.PublicChat.prototype.getMessages = function() { hogfather.PublicChat.prototype.getMessages = function() {
var messages = this.cosmo_.getMessages(this.subject_); return this.messages_;
var ret = [];
messages.forEach(function(message) {
if (message.message.type != 'message') {
return;
}
ret.push(this.cleanMessage_(message));
}.bind(this));
return ret;
}; };
@@ -142,28 +174,18 @@ hogfather.PublicChat.prototype.sendMessage = function(message) {
*/ */
hogfather.PublicChat.prototype.onMessage_ = function(e) { hogfather.PublicChat.prototype.onMessage_ = function(e) {
var message = e.detail; var message = e.detail;
if (!this.owners_.length) { if (!this.checkMessage_(message, this.owners_, this.writers_)) {
this.owners_.push(message.sender); return;
}
if (!this.writers_.length) {
this.writers_.push(message.sender);
} }
switch (message.message.type) { switch (message.message.type) {
case 'message': case 'message':
if (this.writers_.indexOf(message.sender) == -1) { var cleanMessage = this.cleanMessage_(message);
console.log(this.loggingPrefix_(), "message from non-writer:", this.messages_.push(cleanMessage);
message, this.writers_);
break;
}
var e2 = new CustomEvent('message', { var e2 = new CustomEvent('message', {
'detail': this.cleanMessage_(message), 'detail': cleanMessage,
}); });
this.dispatchEvent(e2); this.dispatchEvent(e2);
break; break;
default:
console.log('Unknown message type:', message);
break;
} }
}; };