summaryrefslogtreecommitdiff
path: root/jstests/multiVersion/libs/auth_support.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/multiVersion/libs/auth_support.js')
-rw-r--r--jstests/multiVersion/libs/auth_support.js114
1 files changed, 114 insertions, 0 deletions
diff --git a/jstests/multiVersion/libs/auth_support.js b/jstests/multiVersion/libs/auth_support.js
new file mode 100644
index 00000000000..1554c4abf49
--- /dev/null
+++ b/jstests/multiVersion/libs/auth_support.js
@@ -0,0 +1,114 @@
+var AuthSupport;
+
+(function () {
+
+ assert(!AuthSupport, "Double-load of auth_support.js detected!");
+ AuthSupport = {};
+
+ /**
+ * Logs out all connections "conn" from database "dbname".
+ */
+ var logout = function AuthSupport_logout(conn, dbname) {
+ var i;
+ if (null == conn.length) {
+ conn = [ conn ];
+ }
+ for (i = 0; i < conn.length; ++i) {
+ conn[i].getDB(dbname).logout();
+ }
+ };
+ AuthSupport.logout = logout;
+
+ /**
+ * Authenticates all connections in "conns" using "authParams" on database "dbName".
+ *
+ * Raises an exception if any authentication fails, and tries to leave all connnections
+ * in "conns" in the logged-out-of-dbName state.
+ */
+ var assertAuthenticate = function AuthSupport_assertAuthenticate(conns, dbName, authParams) {
+
+ var conn, i, ex, ex2;
+ if (conns.length == null)
+ conns = [ conns ];
+
+ try {
+ for (i = 0; i < conns.length; ++i) {
+ conn = conns[i];
+ assert(conn.getDB(dbName).auth(authParams),
+ "Failed to authenticate " + conn + " to " + dbName + " using parameters " +
+ tojson(authParams));
+ }
+ }
+ catch (ex) {
+ try {
+ logout(conns, dbName);
+ }
+ catch (ex2) {
+ }
+ throw ex;
+ }
+ };
+ AuthSupport.assertAuthenticate = assertAuthenticate;
+
+ /**
+ * Authenticates all connections in "conns" using "authParams" on database "dbName".
+ * Raises in exception if any of the authentications succeed.
+ */
+ var assertAuthenticateFails = function AuthSupport_assertAuthenticateFails(
+ conns, dbName, authParams) {
+
+ var conn, i;
+ if (conns.length == null)
+ conns = [ conns ];
+
+ for (i = 0; i < conns.length; ++i) {
+ conn = conns[i];
+ assert(!conn.getDB(dbName).auth(authParams),
+ "Unexpectedly authenticated " + conn + " to " + dbName + " using parameters " +
+ tojson(authParams));
+ }
+ };
+ AuthSupport.assertAuthenticateFails = assertAuthenticateFails;
+
+ /**
+ * Executes action() after authenticating the keyfile user on "conn", then logs out the keyfile
+ * user.
+ */
+ var asCluster = function AuthSupport_asCluster(conn, keyfile, action) {
+ var ex;
+ assertAuthenticate(conn, 'local', {
+ user: '__system',
+ mechanism: 'MONGODB-CR',
+ pwd: cat(keyfile).replace(/[ \n]/g, '')
+ });
+
+ try {
+ action();
+ }
+ finally {
+ try {
+ logout(conn, 'local');
+ }
+ catch (ex) {
+ }
+ }
+ };
+ AuthSupport.asCluster = asCluster;
+
+ // Update ReplSetTest.prototype.waitForIndicator to authenticate connections to the
+ // replica set members using the keyfile, before attempting to perform operations.
+ (function updateReplsetTestPrototypes() {
+ var originalWaitForIndicator = ReplSetTest.prototype.waitForIndicator;
+ ReplSetTest.prototype.waitForIndicator = function newRSTestWaitForIndicator(
+ node, states, ind, timeout) {
+
+ var self = this;
+ if (node.length)
+ return originalWaitForIndicator.apply(self, [node, states, ind, timeout]);
+ asCluster(self.getMaster(), self.keyFile, function () {
+ originalWaitForIndicator.apply(self, [node, states, ind, timeout]);
+ });
+ };
+ }());
+
+}());