From b117ed336a8744e6b2b7a8a531743ba58178d8a0 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Wed, 27 Nov 2013 10:50:45 +0000
Subject: [PATCH] Factor out duplicate code and fix cut n paste bug in LocalBackendModifyOperation which was preventing sync operations from bypassing backend INTERNAL_ONLY mode.

---
 opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendWorkflowElement.java |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 60 insertions(+), 0 deletions(-)

diff --git a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendWorkflowElement.java b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendWorkflowElement.java
index d71b152..efa37f3 100644
--- a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendWorkflowElement.java
+++ b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendWorkflowElement.java
@@ -33,6 +33,7 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.opends.messages.Message;
+import org.opends.messages.MessageDescriptor;
 import org.opends.server.admin.server.ConfigurationChangeListener;
 import org.opends.server.admin.server.ServerManagementContext;
 import org.opends.server.admin.std.server.BackendCfg;
@@ -801,5 +802,64 @@
   {
     return persistentSearches;
   }
+
+
+
+  /**
+   * Checks if an update operation can be performed against a backend. The
+   * operation will be rejected based on the server and backend writability
+   * modes.
+   *
+   * @param backend
+   *          The backend handling the update.
+   * @param op
+   *          The update operation.
+   * @param entryDN
+   *          The name of the entry being updated.
+   * @param serverMsg
+   *          The message to log if the update was rejected because the server
+   *          is read-only.
+   * @param backendMsg
+   *          The message to log if the update was rejected because the backend
+   *          is read-only.
+   * @throws DirectoryException
+   *           If the update operation has been rejected.
+   */
+  static void checkIfBackendIsWritable(Backend backend, Operation op,
+      DN entryDN, MessageDescriptor.Arg1<CharSequence> serverMsg,
+      MessageDescriptor.Arg1<CharSequence> backendMsg)
+      throws DirectoryException
+  {
+    if (!backend.isPrivateBackend())
+    {
+      switch (DirectoryServer.getWritabilityMode())
+      {
+      case DISABLED:
+        throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM,
+            serverMsg.get(String.valueOf(entryDN)));
+
+      case INTERNAL_ONLY:
+        if (!(op.isInternalOperation() || op.isSynchronizationOperation()))
+        {
+          throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM,
+              serverMsg.get(String.valueOf(entryDN)));
+        }
+      }
+
+      switch (backend.getWritabilityMode())
+      {
+      case DISABLED:
+        throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM,
+            backendMsg.get(String.valueOf(entryDN)));
+
+      case INTERNAL_ONLY:
+        if (!(op.isInternalOperation() || op.isSynchronizationOperation()))
+        {
+          throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM,
+              backendMsg.get(String.valueOf(entryDN)));
+        }
+      }
+    }
+  }
 }
 

--
Gitblit v1.10.0