Factor out ACL code. Keep a manifest copy of hogfather messages.
This commit is contained in:
@@ -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;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user