Author: mreutegg
Date: Mon Mar 11 12:13:33 2019
New Revision: 1855221

URL: http://svn.apache.org/viewvc?rev=1855221&view=rev
Log:
OAK-8122: MongoDocumentStore init may fail with authentication

Modified:
    
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoStatus.java
    
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoStatusTest.java

Modified: 
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoStatus.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoStatus.java?rev=1855221&r1=1855220&r2=1855221&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoStatus.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoStatus.java
 Mon Mar 11 12:13:33 2019
@@ -245,6 +245,11 @@ public class MongoStatus implements Serv
                     // OAK-7485: workaround when running on
                     // MongoDB Atlas shared instances
                     serverStatus = new BasicDBObject();
+                } else if (e.getErrorCode() == 13) {
+                    // "Unauthorized"
+                    // User is not authorized to run the
+                    // serverStatus command (OAK-8122).
+                    serverStatus = new BasicDBObject();
                 } else {
                     throw e;
                 }

Modified: 
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoStatusTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoStatusTest.java?rev=1855221&r1=1855220&r2=1855221&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoStatusTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoStatusTest.java
 Mon Mar 11 12:13:33 2019
@@ -16,9 +16,25 @@
  */
 package org.apache.jackrabbit.oak.plugins.document.mongo;
 
+import java.util.concurrent.atomic.AtomicReference;
+
 import com.mongodb.BasicDBObject;
+import com.mongodb.MongoCommandException;
+import com.mongodb.ReadPreference;
+import com.mongodb.ServerAddress;
+import com.mongodb.client.ClientSession;
+import com.mongodb.client.MongoDatabase;
+
 import org.apache.jackrabbit.oak.plugins.document.MongoConnectionFactory;
+import org.apache.jackrabbit.oak.plugins.document.MongoUtils;
 import org.apache.jackrabbit.oak.plugins.document.util.MongoConnection;
+import org.bson.BsonDocument;
+import org.bson.BsonDouble;
+import org.bson.BsonInt32;
+import org.bson.BsonString;
+import org.bson.Document;
+import org.bson.conversions.Bson;
+import org.jetbrains.annotations.NotNull;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Rule;
@@ -109,4 +125,92 @@ public class MongoStatusTest {
             }
         }
     }
+
+    @Test
+    public void unauthorized() {
+        MongoTestClient testClient = new MongoTestClient(MongoUtils.URL) {
+
+            private final AtomicReference<String> noException = new 
AtomicReference<>();
+
+            @Override
+            public @NotNull MongoDatabase getDatabase(String databaseName) {
+                return new MongoTestDatabase(super.getDatabase(databaseName),
+                        noException, noException, noException) {
+                    @Override
+                    public @NotNull Document runCommand(@NotNull Bson command) 
{
+                        unauthorizedIfServerStatus(command);
+                        return super.runCommand(command);
+                    }
+
+                    @Override
+                    public @NotNull Document runCommand(@NotNull Bson command,
+                                                        @NotNull 
ReadPreference readPreference) {
+                        unauthorizedIfServerStatus(command);
+                        return super.runCommand(command, readPreference);
+                    }
+
+                    @Override
+                    public <TResult> @NotNull TResult runCommand(@NotNull Bson 
command,
+                                                                 @NotNull 
Class<TResult> tResultClass) {
+                        unauthorizedIfServerStatus(command);
+                        return super.runCommand(command, tResultClass);
+                    }
+
+                    @Override
+                    public <TResult> @NotNull TResult runCommand(@NotNull Bson 
command,
+                                                                 @NotNull 
ReadPreference readPreference,
+                                                                 @NotNull 
Class<TResult> tResultClass) {
+                        unauthorizedIfServerStatus(command);
+                        return super.runCommand(command, readPreference, 
tResultClass);
+                    }
+
+                    @Override
+                    public @NotNull Document runCommand(@NotNull ClientSession 
clientSession,
+                                                        @NotNull Bson command) 
{
+                        unauthorizedIfServerStatus(command);
+                        return super.runCommand(clientSession, command);
+                    }
+
+                    @Override
+                    public @NotNull Document runCommand(@NotNull ClientSession 
clientSession,
+                                                        @NotNull Bson command,
+                                                        @NotNull 
ReadPreference readPreference) {
+                        unauthorizedIfServerStatus(command);
+                        return super.runCommand(clientSession, command, 
readPreference);
+                    }
+
+                    @Override
+                    public <TResult> @NotNull TResult runCommand(@NotNull 
ClientSession clientSession,
+                                                                 @NotNull Bson 
command,
+                                                                 @NotNull 
Class<TResult> tResultClass) {
+                        unauthorizedIfServerStatus(command);
+                        return super.runCommand(clientSession, command, 
tResultClass);
+                    }
+
+                    @Override
+                    public <TResult> @NotNull TResult runCommand(@NotNull 
ClientSession clientSession,
+                                                                 @NotNull Bson 
command,
+                                                                 @NotNull 
ReadPreference readPreference,
+                                                                 @NotNull 
Class<TResult> tResultClass) {
+                        unauthorizedIfServerStatus(command);
+                        return super.runCommand(clientSession, command, 
readPreference, tResultClass);
+                    }
+                };
+            }
+
+            private void unauthorizedIfServerStatus(Bson command) {
+                if (command.toBsonDocument(BasicDBObject.class, 
getDefaultCodecRegistry()).containsKey("serverStatus")) {
+                    BsonDocument response = new BsonDocument("ok", new 
BsonDouble(0.0));
+                    response.put("errmsg", new BsonString("command 
serverStatus requires authentication"));
+                    response.put("code", new BsonInt32(13));
+                    response.put("codeName", new BsonString("Unauthorized"));
+                    ServerAddress address = getAddress();
+                    assertNotNull(address);
+                    throw new MongoCommandException(response, address);
+                }
+            }
+        };
+        MongoStatus status = new MongoStatus(testClient, MongoUtils.DB);
+        assertNotNull(status.getVersion());
+    }
 }


Reply via email to