// test read/write permissions // skip this test on 32-bit platforms function setupTest() { print("START auth1.js"); baseName = "jstests_auth_auth1"; m = MongoRunner.runMongod({auth: "", nohttpinterface: "", bind_ip: "127.0.0.1", useHostname: false}); return m; } function runTest(m) { // these are used by read-only user db = m.getDB( "test" ); mro = new Mongo(m.host); dbRO = mro.getDB( "test" ); tRO = dbRO[ baseName ]; db.getSisterDB("admin").createUser({user: "root", pwd: "root", roles: ["root"]}); db.getSisterDB("admin").auth("root", "root"); t = db[ baseName ]; t.drop(); db.dropAllUsers(); db.logout(); db.getSisterDB( "admin" ).createUser({user: "super", pwd: "super", roles: ["__system"] }); db.getSisterDB("admin").auth("super", "super"); db.createUser({user: "eliot" , pwd: "eliot", roles: jsTest.basicUserRoles }); db.createUser({user: "guest" , pwd: "guest", roles: jsTest.readOnlyUserRoles}); db.getSisterDB("admin").logout(); assert.throws( function() { t.findOne() }, [], "read without login" ); print("make sure we can't run certain commands w/out auth"); var codeUnauthorized = 13; var rslt = db.runCommand({eval : "function() { return 1; }"}); assert.eq(rslt.code, codeUnauthorized, tojson(rslt)); var rslt = db.runCommand({getLog : "global"}); assert.eq(rslt.code, codeUnauthorized, tojson(rslt)); assert(!db.auth("eliot", "eliot2"), "auth succeeded with wrong password"); assert(db.auth("eliot", "eliot"), "auth failed"); // Change password db.changeUserPassword("eliot", "eliot2"); assert(!db.auth("eliot", "eliot"), "auth succeeded with wrong password"); assert(db.auth("eliot", "eliot2"), "auth failed"); for( i = 0; i < 1000; ++i ) { t.save( {i:i} ); } assert.eq( 1000, t.count() , "A1" ); assert.eq( 1000, t.find().toArray().length , "A2" ); db.setProfilingLevel( 2 ); t.count(); db.setProfilingLevel( 0 ); assert.lt( 0 , db.system.profile.find( { user : "eliot@test" } ).count() , "AP1" ) var p = { key : { i : true } , reduce : function(obj,prev) { prev.count++; }, initial: { count: 0 } }; assert.eq( 1000, t.group( p ).length , "A5" ); assert( dbRO.auth( "guest", "guest" ), "auth failed 2" ); assert.eq( 1000, tRO.count() , "B1" ); assert.eq( 1000, tRO.find().toArray().length , "B2" ); // make sure we have a getMore in play assert.commandWorked( dbRO.runCommand( {ismaster:1} ) , "B3" ); assert.writeError(tRO.save({})); assert.eq( 1000, tRO.count() , "B6" ); assert.eq( 1000, tRO.group( p ).length , "C1" ); var p = { key : { i : true } , reduce : function(obj,prev) { db.jstests_auth_auth1.save( {i:10000} ); prev.count++; }, initial: { count: 0 } }; assert.throws( function() { return t.group( p ) }, null , "write reduce didn't fail" ); assert.eq( 1000, dbRO.jstests_auth_auth1.count() , "C3" ); db.getSiblingDB('admin').auth('super', 'super'); assert.eq( 1000, db.eval( function() { return db[ "jstests_auth_auth1" ].count(); } ) , "D1" ); db.eval( function() { db[ "jstests_auth_auth1" ].save( {i:1000} ) } ); assert.eq( 1001, db.eval( function() { return db[ "jstests_auth_auth1" ].count(); } ) , "D2" ); print("SUCCESS auth1.js"); } var m = setupTest(); runTest(m);