firebase-bolt
Version:
Firebase Bolt Security and Modeling Language Compiler
141 lines (139 loc) • 15.7 kB
JavaScript
"use strict";
exports.__esModule = true;
/*
* Copyright 2015 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var simulator_1 = require("../simulator");
var secrets = require('../../auth-secrets');
simulator_1.rulesSuite("Mail", function (test) {
var uid = test.uid;
test.database(secrets.APP, secrets.SECRET);
test.rules('samples/mail');
test("Inbox tests.", function (rules) {
rules
.as('tom')
.at('/users/' + uid('bill') + '/inbox/1')
.write({
from: uid('tom'),
to: uid('bill'),
message: 'Hi, Bill!'
})
.succeeds("Normal write.")
.write(null)
.fails("Sender cannot delete sent message.")
.write({
from: uid('tom'),
to: uid('bill'),
message: 'Hello, again!'
})
.fails("Sender cannot overwrite.")
.at('/users/' + uid('bill') + '/inbox/2')
.write({
from: uid('tom'),
to: uid('bill'),
message: 'Hi, Bill!',
spurious: 'supurious data'
})
.fails("No undefined fields.")
.write({
from: uid('george'),
to: uid('bill'),
message: 'Hi, Bill!'
})
.fails("From field should be correct.")
.at('/users/' + uid('bill') + '/inbox/1/message')
.write("Bill gets my inheritance")
.fails("Cannnot tamper with message.")
.at('/users/' + uid('bill') + '/inbox/1/from')
.write(uid('bill'))
.fails("Cannot tamper with from field.")
.as('bill')
.at('/users/' + uid('bill') + '/inbox/1')
.write(null)
.succeeds("Receiver can delete received mail.");
});
test("Outbox tests.", function (rules) {
rules
.as('bill')
.at('/users/' + uid('bill') + '/outbox/1')
.write({
from: uid('bill'),
to: uid('tom'),
message: "Hi, Tom!"
})
.succeeds("Normal write.")
.as('tom')
.write(null)
.fails("Receiver cannot delete outbox message.")
.as('bill')
.at('/users/' + uid('bill') + '/outbox/1/message')
.write("Bill gets my inheritance.")
.fails("Sender cannot tamper with outbox message.")
.at('/users/' + uid('bill') + '/outbox/1/from')
.write('bill')
.fails("Can't do a partial overwrite - even if same data.")
.as('bill')
.at('/users/' + uid('bill') + '/outbox/2')
.write({
from: 'joe',
to: 'tom',
message: "Hi, Tom!"
})
.fails("From field must be correct.")
.write({
from: 'bill',
to: 'tom',
message: "Hi, Tom!",
spurious: "spurious"
})
.fails("No undefined fields.")
.at('/users/' + uid('bill') + '/outbox/1')
.write(null)
.succeeds("Sender can delete sent mail in outbox.");
});
test("Read permissions.", function (rules) {
rules
.as('bill')
.at('/users/' + uid('bill') + '/outbox/1')
.write({
from: uid('bill'),
to: uid('tom'),
message: 'Hi, Tom!'
})
.succeeds("Normal write.")
.as('tom')
.at('/users/' + uid('bill') + '/inbox/1')
.write({
from: uid('tom'),
to: uid('bill'),
message: 'Hi, Bill!'
})
.as('bill')
.at('/users/' + uid('bill') + '/inbox/1')
.read()
.succeeds("Can read own inbox.")
.at('/users/' + uid('bill') + '/outbox/1')
.read()
.succeeds("Can read own outbox.")
.as('tom')
.at('/users/' + uid('bill') + '/inbox/1')
.read()
.fails("Can't read Bill's inbox.")
.at('/users/' + uid('bill') + '/outbox/1')
.read()
.fails("Can't read Bills outbox.");
});
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFJLEVBQUU7YUFDTixLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUN2QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwiZmlsZSI6InRlc3QvbWFpbC10ZXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge3J1bGVzU3VpdGV9IGZyb20gJy4uL3NpbXVsYXRvcic7XG52YXIgc2VjcmV0cyA9IHJlcXVpcmUoJy4uLy4uL2F1dGgtc2VjcmV0cycpO1xuXG5ydWxlc1N1aXRlKFwiTWFpbFwiLCBmdW5jdGlvbih0ZXN0KSB7XG4gIHZhciB1aWQgPSB0ZXN0LnVpZDtcblxuICB0ZXN0LmRhdGFiYXNlKHNlY3JldHMuQVBQLCBzZWNyZXRzLlNFQ1JFVCk7XG4gIHRlc3QucnVsZXMoJ3NhbXBsZXMvbWFpbCcpO1xuXG4gIHRlc3QoXCJJbmJveCB0ZXN0cy5cIiwgZnVuY3Rpb24ocnVsZXMpIHtcbiAgICBydWxlc1xuICAgICAgLmFzKCd0b20nKVxuICAgICAgLmF0KCcvdXNlcnMvJyArIHVpZCgnYmlsbCcpICsgJy9pbmJveC8xJylcbiAgICAgIC53cml0ZSh7XG4gICAgICAgIGZyb206IHVpZCgndG9tJyksXG4gICAgICAgIHRvOiB1aWQoJ2JpbGwnKSxcbiAgICAgICAgbWVzc2FnZTogJ0hpLCBCaWxsISdcbiAgICAgIH0pXG4gICAgICAuc3VjY2VlZHMoXCJOb3JtYWwgd3JpdGUuXCIpXG5cbiAgICAgIC53cml0ZShudWxsKVxuICAgICAgLmZhaWxzKFwiU2VuZGVyIGNhbm5vdCBkZWxldGUgc2VudCBtZXNzYWdlLlwiKVxuXG4gICAgICAud3JpdGUoe1xuICAgICAgICBmcm9tOiB1aWQoJ3RvbScpLFxuICAgICAgICB0bzogdWlkKCdiaWxsJyksXG4gICAgICAgIG1lc3NhZ2U6ICdIZWxsbywgYWdhaW4hJ1xuICAgICAgfSlcbiAgICAgIC5mYWlscyhcIlNlbmRlciBjYW5ub3Qgb3ZlcndyaXRlLlwiKVxuXG4gICAgICAuYXQoJy91c2Vycy8nICsgdWlkKCdiaWxsJykgKyAnL2luYm94LzInKVxuICAgICAgLndyaXRlKHtcbiAgICAgICAgZnJvbTogdWlkKCd0b20nKSxcbiAgICAgICAgdG86IHVpZCgnYmlsbCcpLFxuICAgICAgICBtZXNzYWdlOiAnSGksIEJpbGwhJyxcbiAgICAgICAgc3B1cmlvdXM6ICdzdXB1cmlvdXMgZGF0YSdcbiAgICAgIH0pXG4gICAgICAuZmFpbHMoXCJObyB1bmRlZmluZWQgZmllbGRzLlwiKVxuXG4gICAgICAud3JpdGUoe1xuICAgICAgICBmcm9tOiB1aWQoJ2dlb3JnZScpLFxuICAgICAgICB0bzogdWlkKCdiaWxsJyksXG4gICAgICAgIG1lc3NhZ2U6ICdIaSwgQmlsbCEnXG4gICAgICB9KVxuICAgICAgLmZhaWxzKFwiRnJvbSBmaWVsZCBzaG91bGQgYmUgY29ycmVjdC5cIilcblxuICAgICAgLmF0KCcvdXNlcnMvJyArIHVpZCgnYmlsbCcpICsgJy9pbmJveC8xL21lc3NhZ2UnKVxuICAgICAgLndyaXRlKFwiQmlsbCBnZXRzIG15IGluaGVyaXRhbmNlXCIpXG4gICAgICAuZmFpbHMoXCJDYW5ubm90IHRhbXBlciB3aXRoIG1lc3NhZ2UuXCIpXG5cbiAgICAgIC5hdCgnL3VzZXJzLycgKyB1aWQoJ2JpbGwnKSArICcvaW5ib3gvMS9mcm9tJylcbiAgICAgIC53cml0ZSh1aWQoJ2JpbGwnKSlcbiAgICAgIC5mYWlscyhcIkNhbm5vdCB0YW1wZXIgd2l0aCBmcm9tIGZpZWxkLlwiKVxuXG4gICAgICAuYXMoJ2JpbGwnKVxuICAgICAgLmF0KCcvdXNlcnMvJyArIHVpZCgnYmlsbCcpICsgJy9pbmJveC8xJylcbiAgICAgIC53cml0ZShudWxsKVxuICAgICAgLnN1Y2NlZWRzKFwiUmVjZWl2ZXIgY2FuIGRlbGV0ZSByZWNlaXZlZCBtYWlsLlwiKTtcbiAgfSk7XG5cblxuICB0ZXN0KFwiT3V0Ym94IHRlc3RzLlwiLCBmdW5jdGlvbihydWxlcykge1xuICAgIHJ1bGVzXG4gICAgICAuYXMoJ2JpbGwnKVxuICAgICAgLmF0KCcvdXNlcnMvJyArIHVpZCgnYmlsbCcpICsgJy9vdXRib3gvMScpXG4gICAgICAud3JpdGUoe1xuICAgICAgICBmcm9tOiB1aWQoJ2JpbGwnKSxcbiAgICAgICAgdG86IHVpZCgndG9tJyksXG4gICAgICAgIG1lc3NhZ2U6IFwiSGksIFRvbSFcIlxuICAgICAgfSlcbiAgICAgIC5zdWNjZWVkcyhcIk5vcm1hbCB3cml0ZS5cIilcblxuICAgICAgLmFzKCd0b20nKVxuICAgICAgLndyaXRlKG51bGwpXG4gICAgICAuZmFpbHMoXCJSZWNlaXZlciBjYW5ub3QgZGVsZXRlIG91dGJveCBtZXNzYWdlLlwiKVxuXG4gICAgICAuYXMoJ2JpbGwnKVxuXG4gICAgICAuYXQoJy91c2Vycy8nICsgdWlkKCdiaWxsJykgKyAnL291dGJveC8xL21lc3NhZ2UnKVxuICAgICAgLndyaXRlKFwiQmlsbCBnZXRzIG15IGluaGVyaXRhbmNlLlwiKVxuICAgICAgLmZhaWxzKFwiU2VuZGVyIGNhbm5vdCB0YW1wZXIgd2l0aCBvdXRib3ggbWVzc2FnZS5cIilcblxuICAgICAgLmF0KCcvdXNlcnMvJyArIHVpZCgnYmlsbCcpICsgJy9vdXRib3gvMS9mcm9tJylcbiAgICAgIC53cml0ZSgnYmlsbCcpXG4gICAgICAuZmFpbHMoXCJDYW4ndCBkbyBhIHBhcnRpYWwgb3ZlcndyaXRlIC0gZXZlbiBpZiBzYW1lIGRhdGEuXCIpXG5cbiAgICAgIC5hcygnYmlsbCcpXG4gICAgICAuYXQoJy91c2Vycy8nICsgdWlkKCdiaWxsJykgKyAnL291dGJveC8yJylcbiAgICAgIC53cml0ZSh7XG4gICAgICAgIGZyb206ICdqb2UnLFxuICAgICAgICB0bzogJ3RvbScsXG4gICAgICAgIG1lc3NhZ2U6IFwiSGksIFRvbSFcIlxuICAgICAgfSlcbiAgICAgIC5mYWlscyhcIkZyb20gZmllbGQgbXVzdCBiZSBjb3JyZWN0LlwiKVxuXG4gICAgICAud3JpdGUoe1xuICAgICAgICBmcm9tOiAnYmlsbCcsXG4gICAgICAgIHRvOiAndG9tJyxcbiAgICAgICAgbWVzc2FnZTogXCJIaSwgVG9tIVwiLFxuICAgICAgICBzcHVyaW91czogXCJzcHVyaW91c1wiXG4gICAgICB9KVxuICAgICAgLmZhaWxzKFwiTm8gdW5kZWZpbmVkIGZpZWxkcy5cIilcblxuICAgICAgLmF0KCcvdXNlcnMvJyArIHVpZCgnYmlsbCcpICsgJy9vdXRib3gvMScpXG4gICAgICAud3JpdGUobnVsbClcbiAgICAgIC5zdWNjZWVkcyhcIlNlbmRlciBjYW4gZGVsZXRlIHNlbnQgbWFpbCBpbiBvdXRib3guXCIpO1xuICB9KTtcblxuICB0ZXN0KFwiUmVhZCBwZXJtaXNzaW9ucy5cIiwgZnVuY3Rpb24ocnVsZXMpIHtcbiAgICBydWxlc1xuICAgICAgLmFzKCdiaWxsJylcbiAgICAgIC5hdCgnL3VzZXJzLycgKyB1aWQoJ2JpbGwnKSArICcvb3V0Ym94LzEnKVxuICAgICAgLndyaXRlKHtcbiAgICAgICAgZnJvbTogdWlkKCdiaWxsJyksXG4gICAgICAgIHRvOiB1aWQoJ3RvbScpLFxuICAgICAgICBtZXNzYWdlOiAnSGksIFRvbSEnXG4gICAgICB9KVxuICAgICAgLnN1Y2NlZWRzKFwiTm9ybWFsIHdyaXRlLlwiKVxuXG4gICAgICAuYXMoJ3RvbScpXG4gICAgICAuYXQoJy91c2Vycy8nICsgdWlkKCdiaWxsJykgKyAnL2luYm94LzEnKVxuICAgICAgLndyaXRlKHtcbiAgICAgICAgZnJvbTogdWlkKCd0b20nKSxcbiAgICAgICAgdG86IHVpZCgnYmlsbCcpLFxuICAgICAgICBtZXNzYWdlOiAnSGksIEJpbGwhJ1xuICAgICAgfSlcblxuICAgICAgLmFzKCdiaWxsJylcbiAgICAgIC5hdCgnL3VzZXJzLycgKyB1aWQoJ2JpbGwnKSArICcvaW5ib3gvMScpXG4gICAgICAucmVhZCgpXG4gICAgICAuc3VjY2VlZHMoXCJDYW4gcmVhZCBvd24gaW5ib3guXCIpXG5cbiAgICAgIC5hdCgnL3VzZXJzLycgKyB1aWQoJ2JpbGwnKSArICcvb3V0Ym94LzEnKVxuICAgICAgLnJlYWQoKVxuICAgICAgLnN1Y2NlZWRzKFwiQ2FuIHJlYWQgb3duIG91dGJveC5cIilcblxuICAgICAgLmFzKCd0b20nKVxuICAgICAgLmF0KCcvdXNlcnMvJyArIHVpZCgnYmlsbCcpICsgJy9pbmJveC8xJylcbiAgICAgIC5yZWFkKClcbiAgICAgIC5mYWlscyhcIkNhbid0IHJlYWQgQmlsbCdzIGluYm94LlwiKVxuXG4gICAgICAuYXQoJy91c2Vycy8nICsgdWlkKCdiaWxsJykgKyAnL291dGJveC8xJylcbiAgICAgIC5yZWFkKClcbiAgICAgIC5mYWlscyhcIkNhbid0IHJlYWQgQmlsbHMgb3V0Ym94LlwiKTtcbiAgfSk7XG59KTtcbiJdfQ==