// Standalone test of authSchemaUpgrade load('./jstests/multiVersion/libs/auth_helpers.js'); var setupCRUsers = function(conn) { jsTest.log("setting up legacy users"); var adminDB = conn.getDB('admin'); adminDB.system.version.update({_id: "authSchema"}, {"currentVersion": 3}, {upsert: true}); adminDB.createUser({user: 'user1', pwd: 'pass', roles: jsTest.adminUserRoles}); assert(adminDB.auth({mechanism: 'MONGODB-CR', user: 'user1', pwd: 'pass'})); adminDB.createUser({user: 'user2', pwd: 'pass', roles: jsTest.adminUserRoles}); assert(adminDB.auth({mechanism: 'MONGODB-CR', user: 'user2', pwd: 'pass'})); // Add $external no-op user to verify that it does not affect // authSchemaUpgrade SERVER-18475 adminDB.getSiblingDB('$external').createUser({user: "evil", roles: []}); jsTest.log("Verifying user documents before upgrading"); // We haven't run authSchemaUpgrade so there shouldn't be // any stored SCRAM-SHA-1 credentials. verifyUserDoc(adminDB, 'user1', true, false); verifyUserDoc(adminDB, 'user2', true, false); verifyUserDoc(adminDB.getSiblingDB('$external'), "evil", false, false, true); adminDB.updateUser('user1', {pwd: 'newpass', roles: jsTest.adminUserRoles}); verifyAuth(adminDB, 'user1', 'newpass', true, true); verifyUserDoc(adminDB, 'user1', true, false); }; var verifySchemaUpgrade = function(adminDB) { // All users should only have SCRAM credentials. verifyUserDoc(adminDB, 'user1', false, true); verifyUserDoc(adminDB, 'user2', false, true); verifyUserDoc(adminDB.getSiblingDB('$external'), "evil", false, false, true); // After authSchemaUpgrade MONGODB-CR no longer works. verifyAuth(adminDB, 'user1', 'newpass', false, true); verifyAuth(adminDB, 'user2', 'pass', false, true); }; var runAndVerifySchemaUpgrade = function(conn) { jsTest.log("run authSchemaUpgrade"); var adminDB = conn.getDB('admin'); assert.commandWorked(adminDB.runCommand('authSchemaUpgrade')); verifySchemaUpgrade(adminDB); }; var testAuthSchemaUpgrade = function(conn) { setupCRUsers(conn); runAndVerifySchemaUpgrade(conn); }; // Test authSchemaUpgrade and upgrade shards var testUpgradeShards = function(mongos, shard) { setupCRUsers(shard); assert.commandWorked(mongos.adminCommand({"authSchemaUpgrade": 1, "upgradeShards": 1})); verifySchemaUpgrade(shard.getDB('admin')); }; jsTest.log('Test authSchemUpgrade standalone'); var conn = MongoRunner.runMongod(); testAuthSchemaUpgrade(conn); MongoRunner.stopMongod(conn); jsTest.log('Test authSchemUpgrade sharded'); var dopts = {smallfiles: "", nopreallocj: ""}; var st = new ShardingTest({ shards: 1, mongos: 1, config: 1, useHostname: false, // Needed when relying on the localhost exception other: {shardOptions: dopts, configOptions: dopts, mongosOptions: {verbose: 1}} }); testAuthSchemaUpgrade(st.s); testUpgradeShards(st.s, st.shard0); st.stop();