1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
//SERVER-6591: Localhost authentication exception doesn't work right on sharded cluster
//
//This test is to ensure that localhost authentication works correctly against a replica set
//whether they are hosted with "localhost" or a hostname.
var replSetName = "replsets_server-6591";
var keyfile = "jstests/libs/key1";
var memberCount = 3;
var username = "foo";
var password = "bar";
var addUser = function(mongo) {
print("============ adding a user.");
mongo.getDB("admin").addUser(username, password);
};
var assertCannotRunCommands = function(mongo) {
print("============ ensuring that commands cannot be run.");
var test = mongo.getDB("test");
assert.throws( function() { test.system.users.findOne(); });
test.foo.save({_id:0});
assert(test.getLastError());
assert.throws( function() { test.foo.findOne({_id:0}); });
test.foo.update({_id:0}, {$set:{x:20}});
assert(test.getLastError());
test.foo.remove({_id:0});
assert(test.getLastError());
assert.throws(function() {
test.foo.mapReduce(
function() { emit(1, 1); },
function(id, count) { return Array.sum(count); },
{ out: "other" });
});
};
var assertCanRunCommands = function(mongo) {
print("============ ensuring that commands can be run.");
var test = mongo.getDB("test");
// will throw on failure
test.system.users.findOne();
test.foo.save({_id: 0});
assert(test.getLastError() == null);
test.foo.update({_id: 0}, {$set:{x:20}});
assert(test.getLastError() == null);
test.foo.remove({_id: 0});
assert(test.getLastError() == null);
test.foo.mapReduce(
function() { emit(1, 1); },
function(id, count) { return Array.sum(count); },
{ out: "other" }
);
};
var authenticate = function(mongo) {
print("============ authenticating user.");
mongo.getDB("admin").auth(username, password);
};
var start = function(useHostName) {
var rs = new ReplSetTest({name: replSetName,
nodes : 3,
keyFile : keyfile,
useHostName: useHostName});
rs.startSet();
rs.initiate();
return rs;
};
var shutdown = function(rs) {
print("============ shutting down.");
rs.stopSet(/*signal*/false,
/*forRestart*/false,
{ auth: { user: username, pwd: password}});
};
var runTest = function(useHostName) {
print("=====================");
print("starting replica set: useHostName=" + useHostName);
print("=====================");
var rs = start(useHostName);
var port = rs.getPort(rs.getPrimary());
var host = "localhost:" + port;
var mongo = new Mongo(host);
assertCanRunCommands(mongo);
addUser(mongo);
assertCannotRunCommands(mongo);
authenticate(mongo);
assertCanRunCommands(mongo);
print("===============================");
print("reconnecting with a new client.");
print("===============================");
mongo = new Mongo(host);
assertCannotRunCommands(mongo);
authenticate(mongo);
assertCanRunCommands(mongo);
shutdown(rs);
}
runTest(false);
runTest(true);
|