diff options
Diffstat (limited to 'jstests/auth/prepared_transaction.js')
-rw-r--r-- | jstests/auth/prepared_transaction.js | 392 |
1 files changed, 196 insertions, 196 deletions
diff --git a/jstests/auth/prepared_transaction.js b/jstests/auth/prepared_transaction.js index 2864dea5fd5..9605fe32973 100644 --- a/jstests/auth/prepared_transaction.js +++ b/jstests/auth/prepared_transaction.js @@ -6,200 +6,200 @@ * @tags: [uses_transactions, uses_prepare_transaction] */ (function() { - "use strict"; - - const rst = new ReplSetTest({nodes: 2, keyFile: "jstests/libs/key1"}); - rst.startSet(); - rst.initiate(); - - const adminDB = rst.getPrimary().getDB("admin"); - - // Create the admin user. - assert.commandWorked(adminDB.runCommand({createUser: "admin", pwd: "admin", roles: ["root"]})); - assert.eq(1, adminDB.auth("admin", "admin")); - - // Set up the test database. - const dbName = "test"; - const collName = "transactions"; - const testDB = adminDB.getSiblingDB(dbName); - testDB.dropDatabase(); - assert.commandWorked(testDB.runCommand({create: collName, writeConcern: {w: "majority"}})); - - // Create two users. Alice will be given the 'internal' privilege. - assert.commandWorked( - adminDB.runCommand({createUser: "Alice", pwd: "pwd", roles: ["root", "__system"]})); - assert.commandWorked(adminDB.runCommand({createUser: "Mallory", pwd: "pwd", roles: ["root"]})); - adminDB.logout(); - - /** - * Test the prepareTransaction command with Alice who has the 'internal' privilege. - */ - assert.eq(1, adminDB.auth("Alice", "pwd")); - let lsid = assert.commandWorked(testDB.runCommand({startSession: 1})).id; - - // Start the transaction and insert a document. - assert.commandWorked(testDB.runCommand({ - insert: collName, - documents: [{_id: "alice"}], - lsid: lsid, - txnNumber: NumberLong(0), - stmtId: NumberInt(0), - startTransaction: true, - autocommit: false - })); - - // Try to run prepareTransaction against the secondary. - assert.commandFailedWithCode(rst.getSecondary().getDB(dbName).adminCommand({ - prepareTransaction: 1, - lsid: lsid, - txnNumber: NumberLong(0), - stmtId: NumberInt(1), - autocommit: false, - writeConcern: {w: "majority"} - }), - ErrorCodes.Unauthorized); - - // Run prepareTransaction against the primary. - const prepareTimestamp = assert - .commandWorked(testDB.adminCommand({ - prepareTransaction: 1, - lsid: lsid, - txnNumber: NumberLong(0), - stmtId: NumberInt(1), - autocommit: false, - writeConcern: {w: "majority"} - })) - .prepareTimestamp; - const commitTimestamp = Timestamp(prepareTimestamp.getTime(), prepareTimestamp.getInc() + 1); - - // Commit the prepared transaction. - assert.commandWorked(testDB.adminCommand({ - commitTransaction: 1, - commitTimestamp: commitTimestamp, - lsid: lsid, - txnNumber: NumberLong(0), - stmtId: NumberInt(2), - autocommit: false - })); - - assert.eq(1, testDB[collName].find({_id: "alice"}).itcount()); - adminDB.logout(); - - /** - * Test the prepareTransaction command with Mallory who does not have the 'internal' privilege. - */ - assert.eq(1, adminDB.auth("Mallory", "pwd")); - - // Start the transaction and insert a document. - assert.commandWorked(testDB.runCommand({ - insert: collName, - documents: [{_id: "mallory"}], - lsid: lsid, - txnNumber: NumberLong(1), - stmtId: NumberInt(0), - startTransaction: true, - autocommit: false - })); - - // Try to run prepareTransaction against the secondary. - assert.commandFailedWithCode(rst.getSecondary().getDB(dbName).adminCommand({ - prepareTransaction: 1, - lsid: lsid, - txnNumber: NumberLong(1), - stmtId: NumberInt(1), - autocommit: false, - writeConcern: {w: "majority"} - }), - ErrorCodes.Unauthorized); - - // Run prepareTransaction against the primary. - assert.commandFailedWithCode(testDB.adminCommand({ - prepareTransaction: 1, - lsid: lsid, - txnNumber: NumberLong(1), - stmtId: NumberInt(1), - autocommit: false, - writeConcern: {w: "majority"} - }), - ErrorCodes.Unauthorized); - - // Cannot commit the transaction with 'commitTimestamp'. - assert.commandFailedWithCode(testDB.adminCommand({ - commitTransaction: 1, - commitTimestamp: Timestamp(0, 0), - lsid: lsid, - txnNumber: NumberLong(1), - stmtId: NumberInt(1), - autocommit: false - }), - ErrorCodes.InvalidOptions); - - // The transaction should be aborted. - assert.commandFailedWithCode(testDB.adminCommand({ - commitTransaction: 1, - lsid: lsid, - txnNumber: NumberLong(1), - stmtId: NumberInt(1), - autocommit: false - }), - ErrorCodes.NoSuchTransaction); - - assert.eq(0, testDB[collName].find({_id: "mallory"}).itcount()); - adminDB.logout(); - - /** - * Test the prepareTransaction command with an unauthenticated user. - */ - - // Start the transaction and insert a document. - assert.commandFailedWithCode(testDB.runCommand({ - insert: collName, - documents: [{_id: "unauthenticated"}], - lsid: lsid, - txnNumber: NumberLong(2), - stmtId: NumberInt(0), - startTransaction: true, - autocommit: false - }), - ErrorCodes.Unauthorized); - - // Try to run prepareTransaction against the secondary. - assert.commandFailedWithCode(rst.getSecondary().getDB(dbName).adminCommand({ - prepareTransaction: 1, - lsid: lsid, - txnNumber: NumberLong(2), - stmtId: NumberInt(0), - autocommit: false, - writeConcern: {w: "majority"} - }), - ErrorCodes.Unauthorized); - - // Run prepareTransaction against the primary. - assert.commandFailedWithCode(testDB.adminCommand({ - prepareTransaction: 1, - lsid: lsid, - txnNumber: NumberLong(2), - stmtId: NumberInt(0), - autocommit: false, - writeConcern: {w: "majority"} - }), - ErrorCodes.Unauthorized); - - // Cannot commit the transaction. - assert.commandFailedWithCode(testDB.adminCommand({ - commitTransaction: 1, - commitTimestamp: Timestamp(0, 0), - lsid: lsid, - txnNumber: NumberLong(2), - stmtId: NumberInt(0), - autocommit: false - }), - ErrorCodes.Unauthorized); - - assert.eq(1, adminDB.auth("Alice", "pwd")); - assert.eq(0, testDB[collName].find({_id: "unauthenticated"}).itcount()); - assert.commandWorked(testDB.runCommand({endSessions: [lsid]})); - adminDB.logout(); - - rst.stopSet(); +"use strict"; + +const rst = new ReplSetTest({nodes: 2, keyFile: "jstests/libs/key1"}); +rst.startSet(); +rst.initiate(); + +const adminDB = rst.getPrimary().getDB("admin"); + +// Create the admin user. +assert.commandWorked(adminDB.runCommand({createUser: "admin", pwd: "admin", roles: ["root"]})); +assert.eq(1, adminDB.auth("admin", "admin")); + +// Set up the test database. +const dbName = "test"; +const collName = "transactions"; +const testDB = adminDB.getSiblingDB(dbName); +testDB.dropDatabase(); +assert.commandWorked(testDB.runCommand({create: collName, writeConcern: {w: "majority"}})); + +// Create two users. Alice will be given the 'internal' privilege. +assert.commandWorked( + adminDB.runCommand({createUser: "Alice", pwd: "pwd", roles: ["root", "__system"]})); +assert.commandWorked(adminDB.runCommand({createUser: "Mallory", pwd: "pwd", roles: ["root"]})); +adminDB.logout(); + +/** + * Test the prepareTransaction command with Alice who has the 'internal' privilege. + */ +assert.eq(1, adminDB.auth("Alice", "pwd")); +let lsid = assert.commandWorked(testDB.runCommand({startSession: 1})).id; + +// Start the transaction and insert a document. +assert.commandWorked(testDB.runCommand({ + insert: collName, + documents: [{_id: "alice"}], + lsid: lsid, + txnNumber: NumberLong(0), + stmtId: NumberInt(0), + startTransaction: true, + autocommit: false +})); + +// Try to run prepareTransaction against the secondary. +assert.commandFailedWithCode(rst.getSecondary().getDB(dbName).adminCommand({ + prepareTransaction: 1, + lsid: lsid, + txnNumber: NumberLong(0), + stmtId: NumberInt(1), + autocommit: false, + writeConcern: {w: "majority"} +}), + ErrorCodes.Unauthorized); + +// Run prepareTransaction against the primary. +const prepareTimestamp = assert + .commandWorked(testDB.adminCommand({ + prepareTransaction: 1, + lsid: lsid, + txnNumber: NumberLong(0), + stmtId: NumberInt(1), + autocommit: false, + writeConcern: {w: "majority"} + })) + .prepareTimestamp; +const commitTimestamp = Timestamp(prepareTimestamp.getTime(), prepareTimestamp.getInc() + 1); + +// Commit the prepared transaction. +assert.commandWorked(testDB.adminCommand({ + commitTransaction: 1, + commitTimestamp: commitTimestamp, + lsid: lsid, + txnNumber: NumberLong(0), + stmtId: NumberInt(2), + autocommit: false +})); + +assert.eq(1, testDB[collName].find({_id: "alice"}).itcount()); +adminDB.logout(); + +/** + * Test the prepareTransaction command with Mallory who does not have the 'internal' privilege. + */ +assert.eq(1, adminDB.auth("Mallory", "pwd")); + +// Start the transaction and insert a document. +assert.commandWorked(testDB.runCommand({ + insert: collName, + documents: [{_id: "mallory"}], + lsid: lsid, + txnNumber: NumberLong(1), + stmtId: NumberInt(0), + startTransaction: true, + autocommit: false +})); + +// Try to run prepareTransaction against the secondary. +assert.commandFailedWithCode(rst.getSecondary().getDB(dbName).adminCommand({ + prepareTransaction: 1, + lsid: lsid, + txnNumber: NumberLong(1), + stmtId: NumberInt(1), + autocommit: false, + writeConcern: {w: "majority"} +}), + ErrorCodes.Unauthorized); + +// Run prepareTransaction against the primary. +assert.commandFailedWithCode(testDB.adminCommand({ + prepareTransaction: 1, + lsid: lsid, + txnNumber: NumberLong(1), + stmtId: NumberInt(1), + autocommit: false, + writeConcern: {w: "majority"} +}), + ErrorCodes.Unauthorized); + +// Cannot commit the transaction with 'commitTimestamp'. +assert.commandFailedWithCode(testDB.adminCommand({ + commitTransaction: 1, + commitTimestamp: Timestamp(0, 0), + lsid: lsid, + txnNumber: NumberLong(1), + stmtId: NumberInt(1), + autocommit: false +}), + ErrorCodes.InvalidOptions); + +// The transaction should be aborted. +assert.commandFailedWithCode(testDB.adminCommand({ + commitTransaction: 1, + lsid: lsid, + txnNumber: NumberLong(1), + stmtId: NumberInt(1), + autocommit: false +}), + ErrorCodes.NoSuchTransaction); + +assert.eq(0, testDB[collName].find({_id: "mallory"}).itcount()); +adminDB.logout(); + +/** + * Test the prepareTransaction command with an unauthenticated user. + */ + +// Start the transaction and insert a document. +assert.commandFailedWithCode(testDB.runCommand({ + insert: collName, + documents: [{_id: "unauthenticated"}], + lsid: lsid, + txnNumber: NumberLong(2), + stmtId: NumberInt(0), + startTransaction: true, + autocommit: false +}), + ErrorCodes.Unauthorized); + +// Try to run prepareTransaction against the secondary. +assert.commandFailedWithCode(rst.getSecondary().getDB(dbName).adminCommand({ + prepareTransaction: 1, + lsid: lsid, + txnNumber: NumberLong(2), + stmtId: NumberInt(0), + autocommit: false, + writeConcern: {w: "majority"} +}), + ErrorCodes.Unauthorized); + +// Run prepareTransaction against the primary. +assert.commandFailedWithCode(testDB.adminCommand({ + prepareTransaction: 1, + lsid: lsid, + txnNumber: NumberLong(2), + stmtId: NumberInt(0), + autocommit: false, + writeConcern: {w: "majority"} +}), + ErrorCodes.Unauthorized); + +// Cannot commit the transaction. +assert.commandFailedWithCode(testDB.adminCommand({ + commitTransaction: 1, + commitTimestamp: Timestamp(0, 0), + lsid: lsid, + txnNumber: NumberLong(2), + stmtId: NumberInt(0), + autocommit: false +}), + ErrorCodes.Unauthorized); + +assert.eq(1, adminDB.auth("Alice", "pwd")); +assert.eq(0, testDB[collName].find({_id: "unauthenticated"}).itcount()); +assert.commandWorked(testDB.runCommand({endSessions: [lsid]})); +adminDB.logout(); + +rst.stopSet(); }()); |