From 411f30e5407cba4c5a045c5a5613966e01fe0a63 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Fri, 29 Aug 2014 08:20:20 +0000
Subject: [PATCH] Checkpoint commit for OPENDJ-1206 : Create a new ReplicationBackend/ChangelogBackend   to support cn=changelog

---
 opendj-sdk/opends/src/server/org/opends/server/backends/ChangelogBackend.java |   45 +++++++++++++++++++++++++++++++--------------
 1 files changed, 31 insertions(+), 14 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/ChangelogBackend.java b/opendj-sdk/opends/src/server/org/opends/server/backends/ChangelogBackend.java
index 1a1ec5c..0f0da2a 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/ChangelogBackend.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/ChangelogBackend.java
@@ -389,20 +389,9 @@
   @Override
   public void search(final SearchOperation searchOperation) throws DirectoryException
   {
-    final Set<String> excludedDomains = MultimasterReplication.getECLDisabledDomains();
-    excludedDomains.add(DN_EXTERNAL_CHANGELOG_ROOT);
-    SearchParams params = new SearchParams(searchOperation.toString(), excludedDomains);
-    final ExternalChangelogRequestControl eclRequestControl =
-        searchOperation.getRequestControl(ExternalChangelogRequestControl.DECODER);
-    if (eclRequestControl == null)
-    {
-      params.requestType = REQUEST_TYPE_FROM_CHANGE_NUMBER;
-    }
-    else
-    {
-      params.requestType = REQUEST_TYPE_FROM_COOKIE;
-      params.multiDomainServerState = eclRequestControl.getCookie();
-    }
+    checkChangelogReadPrivilege(searchOperation);
+
+    final SearchParams params = buildSearchParameters(searchOperation);
 
     optimizeSearchParameters(params, searchOperation.getBaseDN(), searchOperation.getFilter());
     try
@@ -418,6 +407,25 @@
     }
   }
 
+  private SearchParams buildSearchParameters(final SearchOperation searchOperation) throws DirectoryException
+  {
+    final Set<String> excludedDomains = MultimasterReplication.getECLDisabledDomains();
+    excludedDomains.add(DN_EXTERNAL_CHANGELOG_ROOT);
+    final SearchParams params = new SearchParams(searchOperation.toString(), excludedDomains);
+    final ExternalChangelogRequestControl eclRequestControl =
+        searchOperation.getRequestControl(ExternalChangelogRequestControl.DECODER);
+    if (eclRequestControl == null)
+    {
+      params.requestType = REQUEST_TYPE_FROM_CHANGE_NUMBER;
+    }
+    else
+    {
+      params.requestType = REQUEST_TYPE_FROM_COOKIE;
+      params.multiDomainServerState = eclRequestControl.getCookie();
+    }
+    return params;
+  }
+
   /** {@inheritDoc} */
   @Override
   public Set<String> getSupportedControls()
@@ -1198,6 +1206,15 @@
         + entryDN + "\" into an External Change Log entry: " + exception.getMessage()));
   }
 
+  private void checkChangelogReadPrivilege(SearchOperation searchOp) throws DirectoryException
+  {
+    if (!searchOp.getClientConnection().hasPrivilege(Privilege.CHANGELOG_READ, searchOp))
+    {
+      throw new DirectoryException(ResultCode.INSUFFICIENT_ACCESS_RIGHTS,
+          NOTE_SEARCH_CHANGELOG_INSUFFICIENT_PRIVILEGES.get());
+    }
+  }
+
   /**
    * Create a changelog entry from a set of provided information. This is the part of
    * entry creation common to all types of msgs (ADD, DEL, MOD, MODDN).

--
Gitblit v1.10.0