Small API changes to move toward subject ACLs.

This commit is contained in:
Ian Gulliver
2014-05-17 19:13:59 +03:00
parent d3f716a081
commit 6389787833
3 changed files with 28 additions and 14 deletions

View File

@@ -91,6 +91,10 @@ class Client(db.Model):
class Subject(db.Model): class Subject(db.Model):
name = db.StringProperty(required=True) name = db.StringProperty(required=True)
readable_only_by = db.ReferenceProperty(
reference_class=Profile, collection_name='readable_subject_set')
writable_only_by = db.ReferenceProperty(
reference_class=Profile, collection_name='writable_subject_set')
@classmethod @classmethod
def FindOrCreate(cls, name): def FindOrCreate(cls, name):
@@ -206,7 +210,9 @@ class Message(db.Model):
'event_type': 'message', 'event_type': 'message',
'id': self.key().id(), 'id': self.key().id(),
'sender': str(Message.sender.get_value_for_datastore(self)), 'sender': str(Message.sender.get_value_for_datastore(self)),
'subject': self.parent().name, 'subject': {
'name': self.parent().name,
},
'created': self.created, 'created': self.created,
'message': self.message, 'message': self.message,
} }

View File

@@ -110,10 +110,15 @@ Cosmopolite.prototype.subscribe = function(subject, messages, keys) {
'keys': keys, 'keys': keys,
}; };
this.sendRPC_('subscribe', args, function() { this.sendRPC_('subscribe', args, function() {
this.subscriptions_[subject] = { if (subject in this.subscriptions_) {
'messages': [], console.log(
'keys': {}, this.loggingPrefix_(), 'duplicate subject subscriptions:', subject);
}; } else {
this.subscriptions_[subject] = {
'messages': [],
'keys': {},
};
}
resolve(); resolve();
}.bind(this)); }.bind(this));
}.bind(this)); }.bind(this));
@@ -516,7 +521,7 @@ Cosmopolite.prototype.onServerEvent_ = function(e) {
} }
break; break;
case 'message': case 'message':
var subscription = this.subscriptions_[e['subject']]; var subscription = this.subscriptions_[e['subject']['name']];
if (!subscription) { if (!subscription) {
console.log( console.log(
this.loggingPrefix_(), this.loggingPrefix_(),

View File

@@ -94,7 +94,7 @@ asyncTest('Message round trip', function() {
var callbacks = { var callbacks = {
'onMessage': function(e) { 'onMessage': function(e) {
equal(e['subject'], subject, 'subject matches'); equal(e['subject']['name'], subject, 'subject matches');
equal(e['message'], message, 'message matches'); equal(e['message'], message, 'message matches');
cosmo.shutdown(); cosmo.shutdown();
start(); start();
@@ -119,7 +119,7 @@ asyncTest('Overwrite key', function() {
var callbacks = { var callbacks = {
'onMessage': function(e) { 'onMessage': function(e) {
messages++; messages++;
equal(e['subject'], subject, 'subject matches'); equal(e['subject']['name'], subject, 'subject matches');
equal(e['key'], key, 'key matches'); equal(e['key'], key, 'key matches');
if (messages == 1) { if (messages == 1) {
equal(e['message'], message1, 'message #1 matches'); equal(e['message'], message1, 'message #1 matches');
@@ -156,7 +156,7 @@ asyncTest('Complex object', function() {
var callbacks = { var callbacks = {
'onMessage': function(e) { 'onMessage': function(e) {
equal(e['subject'], subject, 'subject matches'); equal(e['subject']['name'], subject, 'subject matches');
deepEqual(e['message'], message, 'message matches'); deepEqual(e['message'], message, 'message matches');
cosmo.shutdown(); cosmo.shutdown();
start(); start();
@@ -209,7 +209,7 @@ asyncTest('Duplicate message suppression', function() {
var callbacks = { var callbacks = {
'onMessage': function (msg) { 'onMessage': function (msg) {
equal(msg['subject'], subject, 'subject matches'); equal(msg['subject']['name'], subject, 'subject matches');
equal(msg['key'], key, 'key matches'); equal(msg['key'], key, 'key matches');
equal(msg['message'], message1, 'message matches'); equal(msg['message'], message1, 'message matches');
cosmo.shutdown(); cosmo.shutdown();
@@ -245,7 +245,7 @@ asyncTest('Message persistence', function() {
var callbacks = { var callbacks = {
'onMessage': function(msg) { 'onMessage': function(msg) {
equal(msg['subject'], subject, 'subject matches'); equal(msg['subject']['name'], subject, 'subject matches');
equal(msg['message'], message, 'message matches'); equal(msg['message'], message, 'message matches');
cosmo2.shutdown(); cosmo2.shutdown();
start(); start();
@@ -297,9 +297,12 @@ asyncTest('Profile merge', function() {
var callbacks = { var callbacks = {
'onMessage': function(msg) { 'onMessage': function(msg) {
messages++; messages++;
equal(msg['subject'], subject, 'message #' + messages + ': subject matches'); equal(msg['subject']['name'], subject,
equal(msg['message'], message, 'message #' + messages + ': message matches'); 'message #' + messages + ': subject matches');
equal(msg['sender'], cosmo.profile(), 'message #' + messages + ': profile matches'); equal(msg['message'], message,
'message #' + messages + ': message matches');
equal(msg['sender'], cosmo.profile(),
'message #' + messages + ': profile matches');
if (messages == 1) { if (messages == 1) {
cosmo.unsubscribe(subject); cosmo.unsubscribe(subject);
// Entirely magic URL that sets the login cookie and redirects. // Entirely magic URL that sets the login cookie and redirects.