summaryrefslogtreecommitdiff
path: root/jstests/auth/rename_system_buckets_collection.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/auth/rename_system_buckets_collection.js')
-rw-r--r--jstests/auth/rename_system_buckets_collection.js128
1 files changed, 128 insertions, 0 deletions
diff --git a/jstests/auth/rename_system_buckets_collection.js b/jstests/auth/rename_system_buckets_collection.js
new file mode 100644
index 00000000000..2a6fa9cfe3e
--- /dev/null
+++ b/jstests/auth/rename_system_buckets_collection.js
@@ -0,0 +1,128 @@
+// Tests renaming the system.buckets collection.
+(function() {
+"use strict";
+
+// Set up the test database.
+const dbName = "test";
+const collName = "mongosync.tmp.UUID123";
+const bucketsCollName = `system.buckets.${collName}`;
+const targetBucketsCollName = "system.buckets.manual";
+
+function renameBucketsCollection(adminDB, username, shouldSucceed) {
+ // Create collection under admin user
+ assert.eq(1, adminDB.auth("admin", "admin"));
+
+ const testDB = adminDB.getSiblingDB(dbName);
+
+ testDB[bucketsCollName].drop();
+ testDB[targetBucketsCollName].drop();
+
+ assert.commandWorked(
+ testDB.createCollection(bucketsCollName, {timeseries: {timeField: "time"}}));
+ adminDB.logout();
+
+ // Try rename with test users
+ jsTestLog("Testing system.buckets renaming with username: " + username);
+ assert(adminDB.auth(username, 'password'));
+
+ // No privilege grants the ability to rename a system.buckets collection to a non-bucket
+ // namespace.
+ assert.commandFailed(testDB.adminCommand({
+ renameCollection: `${testDB}.${bucketsCollName}`,
+ to: `${testDB}.${collName}`,
+ dropTarget: false
+ }));
+
+ const res = testDB.adminCommand({
+ renameCollection: `${testDB}.${bucketsCollName}`,
+ to: `${testDB}.${targetBucketsCollName}`,
+ dropTarget: true
+ });
+
+ assert.eq((shouldSucceed) ? 1 : 0,
+ res.ok,
+ "Rename collection failed or succeeded unexpectedly:" + tojson(res));
+
+ adminDB.logout();
+}
+
+function runTest(conn) {
+ const adminDB = conn.getDB("admin");
+
+ // Create the admin user.
+ adminDB.createUser({user: 'admin', pwd: 'admin', roles: ['root']});
+ assert.eq(1, adminDB.auth("admin", "admin"));
+
+ // Create roles with ability to rename system.buckets collections.
+ adminDB.createRole({
+ role: "renameBucketsOnly",
+ privileges: [{
+ resource: {db: '', system_buckets: ''},
+ actions: [
+ "createIndex",
+ "dropCollection",
+ "find",
+ "insert",
+ ]
+ }],
+ roles: []
+ });
+
+ // Create test users.
+ adminDB.createUser(
+ {user: 'userAdmin', pwd: 'password', roles: ['userAdminAnyDatabase', 'renameBucketsOnly']});
+
+ // Create read and write users.
+ adminDB.createUser({
+ user: 'readWriteAdmin',
+ pwd: 'password',
+ roles: ['readWriteAnyDatabase', 'renameBucketsOnly']
+ });
+
+ // Create strong users.
+ adminDB.createUser({user: 'restore', pwd: 'password', roles: ['restore', 'renameBucketsOnly']});
+ adminDB.createUser({user: 'root', pwd: 'password', roles: ['root', 'renameBucketsOnly']});
+ adminDB.createUser(
+ {user: 'rootier', pwd: 'password', roles: ['__system', 'renameBucketsOnly']});
+ adminDB.createUser(
+ {user: 'reader', pwd: 'password', roles: ['readAnyDatabase', 'renameBucketsOnly']});
+
+ adminDB.logout();
+
+ // Expect renaming system.buckets collection to succeed.
+ renameBucketsCollection(adminDB, 'restore', true);
+ renameBucketsCollection(adminDB, 'root', true);
+ renameBucketsCollection(adminDB, 'rootier', true);
+
+ // Second test case should fail for user with inadequate role.
+ renameBucketsCollection(adminDB, 'reader', false);
+ renameBucketsCollection(adminDB, 'readWriteAdmin', false);
+ renameBucketsCollection(adminDB, 'userAdmin', false);
+}
+
+jsTestLog("ReplicaSet: Testing rename timeseries collection");
+{
+ const rst = new ReplSetTest({nodes: 1, auth: "", keyFile: 'jstests/libs/key1'});
+ rst.startSet();
+
+ rst.initiate();
+ rst.awaitReplication();
+ runTest(rst.getPrimary());
+ rst.stopSet();
+}
+
+jsTestLog("Sharding: Testing rename timeseries collection");
+{
+ const st = new ShardingTest({
+ shards: 1,
+ mongos: 1,
+ config: 1,
+ keyFile: "jstests/libs/key1",
+ other: {shardOptions: {auth: ""}}
+ });
+
+ runTest(st.s);
+
+ st.stop();
+}
+})();