This is an automated email from the ASF dual-hosted git repository.
sijie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
The following commit(s) were added to refs/heads/master by this push:
new 7ec5ff3 Issue #1310: Filter out body and masterKey from ProcessorV3s
7ec5ff3 is described below
commit 7ec5ff3372cde048fa4be464c14ba66bdf6622c7
Author: cguttapalem <[email protected]>
AuthorDate: Thu Apr 5 00:01:23 2018 -0700
Issue #1310: Filter out body and masterKey from ProcessorV3s
Descriptions of the changes in this PR:
In certain logs instances of ProcessorV3 (for eg WriteEntryProcessorV3) are
logged.
Logging entry data and credentials details is not appropriate. Filter out
those details
(have to consider other ProcessorV3s as well and testcases to validate this
change)
Master Issue: #1310
Author: cguttapalem <[email protected]>
Reviewers: Enrico Olivelli <[email protected]>, Sijie Guo
<[email protected]>, Venkateswararao Jujjuri (JV) <None>
This closes #1311 from reddycharan/filterlogs, closes #1310
---
.../bookkeeper/proto/ReadEntryProcessorV3.java | 12 +++
.../org/apache/bookkeeper/proto/RequestUtils.java | 57 +++++++++++++++
.../bookkeeper/proto/WriteEntryProcessorV3.java | 10 +++
.../bookkeeper/proto/WriteLacProcessorV3.java | 11 +++
.../proto/TestBookieRequestProcessor.java | 85 ++++++++++++++++++++++
5 files changed, 175 insertions(+)
diff --git
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessorV3.java
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessorV3.java
index eef1847..3d2a1ea 100644
---
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessorV3.java
+++
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessorV3.java
@@ -22,12 +22,15 @@ import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.SettableFuture;
import com.google.protobuf.ByteString;
+
import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import io.netty.util.ReferenceCountUtil;
+
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
+
import org.apache.bookkeeper.bookie.Bookie;
import org.apache.bookkeeper.bookie.BookieException;
import org.apache.bookkeeper.proto.BookkeeperProtocol.ReadRequest;
@@ -331,5 +334,14 @@ class ReadEntryProcessorV3 extends PacketProcessorBaseV3 {
statsLogger.registerSuccessfulEvent(startTime.elapsed(TimeUnit.NANOSECONDS),
TimeUnit.NANOSECONDS);
}
}
+
+ /**
+ * this toString method filters out masterKey from the output. masterKey
+ * contains the password of the ledger.
+ */
+ @Override
+ public String toString() {
+ return RequestUtils.toSafeString(request);
+ }
}
diff --git
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/RequestUtils.java
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/RequestUtils.java
index 87d40c7..fb61165 100644
---
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/RequestUtils.java
+++
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/RequestUtils.java
@@ -17,6 +17,8 @@
*/
package org.apache.bookkeeper.proto;
+import com.google.common.base.MoreObjects;
+
/**
* Utilities for requests.
*/
@@ -46,4 +48,59 @@ class RequestUtils {
return request.hasFlag() && request.getFlag() == flag;
}
+ /**
+ * this toSafeString method filters out body and masterKey from the output.
+ * masterKey contains the password of the ledger and body is customer data,
+ * so it is not appropriate to have these in logs or system output.
+ */
+ public static String toSafeString(BookkeeperProtocol.Request request) {
+ MoreObjects.ToStringHelper stringHelper =
MoreObjects.toStringHelper(request);
+ BookkeeperProtocol.BKPacketHeader header = request.getHeader();
+ if (request.hasAddRequest()) {
+ BookkeeperProtocol.AddRequest addRequest = request.getAddRequest();
+ includeHeaderFields(stringHelper, header);
+ stringHelper.add("ledgerId", addRequest.getLedgerId());
+ stringHelper.add("entryId", addRequest.getEntryId());
+ if (addRequest.hasFlag()) {
+ stringHelper.add("flag", addRequest.getFlag());
+ }
+ if (addRequest.hasWriteFlags()) {
+ stringHelper.add("writeFlags", addRequest.getWriteFlags());
+ }
+ return stringHelper.toString();
+ } else if (request.hasReadRequest()) {
+ BookkeeperProtocol.ReadRequest readRequest =
request.getReadRequest();
+ includeHeaderFields(stringHelper, header);
+ stringHelper.add("ledgerId", readRequest.getLedgerId());
+ stringHelper.add("entryId", readRequest.getEntryId());
+ if (readRequest.hasFlag()) {
+ stringHelper.add("flag", readRequest.getFlag());
+ }
+ if (readRequest.hasPreviousLAC()) {
+ stringHelper.add("previousLAC", readRequest.getPreviousLAC());
+ }
+ if (readRequest.hasTimeOut()) {
+ stringHelper.add("timeOut", readRequest.getTimeOut());
+ }
+ return stringHelper.toString();
+ } else if (request.hasWriteLacRequest()) {
+ BookkeeperProtocol.WriteLacRequest writeLacRequest =
request.getWriteLacRequest();
+ includeHeaderFields(stringHelper, header);
+ stringHelper.add("ledgerId", writeLacRequest.getLedgerId());
+ stringHelper.add("lac", writeLacRequest.getLac());
+ return stringHelper.toString();
+ } else {
+ return request.toString();
+ }
+ }
+
+ private static void includeHeaderFields(MoreObjects.ToStringHelper
stringHelper,
+ BookkeeperProtocol.BKPacketHeader header) {
+ stringHelper.add("version", header.getVersion());
+ stringHelper.add("operation", header.getOperation());
+ stringHelper.add("txnId", header.getTxnId());
+ if (header.hasPriority()) {
+ stringHelper.add("priority", header.getPriority());
+ }
+ }
}
diff --git
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteEntryProcessorV3.java
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteEntryProcessorV3.java
index 0854bf5..c0e097a 100644
---
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteEntryProcessorV3.java
+++
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteEntryProcessorV3.java
@@ -170,4 +170,14 @@ class WriteEntryProcessorV3 extends PacketProcessorBaseV3 {
requestProcessor.addRequestStats);
}
}
+
+ /**
+ * this toString method filters out body and masterKey from the output.
+ * masterKey contains the password of the ledger and body is customer data,
+ * so it is not appropriate to have these in logs or system output.
+ */
+ @Override
+ public String toString() {
+ return RequestUtils.toSafeString(request);
+ }
}
diff --git
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteLacProcessorV3.java
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteLacProcessorV3.java
index dd4dc3c..c0866f3 100644
---
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteLacProcessorV3.java
+++
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteLacProcessorV3.java
@@ -37,6 +37,7 @@ import org.apache.bookkeeper.util.MathUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
class WriteLacProcessorV3 extends PacketProcessorBaseV3 implements Runnable {
private static final Logger logger =
LoggerFactory.getLogger(WriteLacProcessorV3.class);
@@ -112,6 +113,16 @@ class WriteLacProcessorV3 extends PacketProcessorBaseV3
implements Runnable {
sendResponse(writeLacResponse.getStatus(), resp,
requestProcessor.writeLacRequestStats);
}
}
+
+ /**
+ * this toString method filters out body and masterKey from the output.
+ * masterKey contains the password of the ledger and body is customer data,
+ * so it is not appropriate to have these in logs or system output.
+ */
+ @Override
+ public String toString() {
+ return RequestUtils.toSafeString(request);
+ }
}
diff --git
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/proto/TestBookieRequestProcessor.java
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/proto/TestBookieRequestProcessor.java
index b212e49..354fcaf 100644
---
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/proto/TestBookieRequestProcessor.java
+++
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/proto/TestBookieRequestProcessor.java
@@ -32,7 +32,13 @@ import com.google.protobuf.ByteString;
import org.apache.bookkeeper.bookie.Bookie;
import org.apache.bookkeeper.conf.ServerConfiguration;
import org.apache.bookkeeper.proto.BookkeeperProtocol.AddRequest;
+import org.apache.bookkeeper.proto.BookkeeperProtocol.AddRequest.Flag;
+import org.apache.bookkeeper.proto.BookkeeperProtocol.BKPacketHeader;
+import org.apache.bookkeeper.proto.BookkeeperProtocol.OperationType;
+import org.apache.bookkeeper.proto.BookkeeperProtocol.ProtocolVersion;
import org.apache.bookkeeper.proto.BookkeeperProtocol.ReadRequest;
+import org.apache.bookkeeper.proto.BookkeeperProtocol.Request;
+import org.apache.bookkeeper.proto.BookkeeperProtocol.WriteLacRequest;
import org.apache.bookkeeper.stats.NullStatsLogger;
import org.junit.Test;
@@ -114,4 +120,83 @@ public class TestBookieRequestProcessor {
.build();
assertTrue(RequestUtils.hasFlag(add, AddRequest.Flag.RECOVERY_ADD));
}
+
+ @Test
+ public void testToString() {
+ BKPacketHeader.Builder headerBuilder = BKPacketHeader.newBuilder();
+ headerBuilder.setVersion(ProtocolVersion.VERSION_THREE);
+ headerBuilder.setOperation(OperationType.ADD_ENTRY);
+ headerBuilder.setTxnId(5L);
+ BKPacketHeader header = headerBuilder.build();
+
+ AddRequest addRequest =
AddRequest.newBuilder().setLedgerId(10).setEntryId(1)
+ .setMasterKey(ByteString.copyFrom("masterKey".getBytes()))
+ .setBody(ByteString.copyFrom("entrydata".getBytes())).build();
+ Request request =
Request.newBuilder().setHeader(header).setAddRequest(addRequest).build();
+
+ WriteEntryProcessorV3 writeEntryProcessorV3 = new
WriteEntryProcessorV3(request, null, null);
+ String toString = writeEntryProcessorV3.toString();
+ assertFalse("writeEntryProcessorV3's toString should have filtered out
body", toString.contains("body"));
+ assertFalse("writeEntryProcessorV3's toString should have filtered out
masterKey",
+ toString.contains("masterKey"));
+ assertTrue("writeEntryProcessorV3's toString should contain ledgerId",
toString.contains("ledgerId"));
+ assertTrue("writeEntryProcessorV3's toString should contain entryId",
toString.contains("entryId"));
+ assertTrue("writeEntryProcessorV3's toString should contain version",
toString.contains("version"));
+ assertTrue("writeEntryProcessorV3's toString should contain
operation", toString.contains("operation"));
+ assertTrue("writeEntryProcessorV3's toString should contain txnId",
toString.contains("txnId"));
+ assertFalse("writeEntryProcessorV3's toString shouldn't contain flag",
toString.contains("flag"));
+ assertFalse("writeEntryProcessorV3's toString shouldn't contain
writeFlags", toString.contains("writeFlags"));
+
+ addRequest = AddRequest.newBuilder().setLedgerId(10).setEntryId(1)
+ .setMasterKey(ByteString.copyFrom("masterKey".getBytes()))
+
.setBody(ByteString.copyFrom("entrydata".getBytes())).setFlag(Flag.RECOVERY_ADD).setWriteFlags(0)
+ .build();
+ request =
Request.newBuilder().setHeader(header).setAddRequest(addRequest).build();
+ writeEntryProcessorV3 = new WriteEntryProcessorV3(request, null, null);
+ toString = writeEntryProcessorV3.toString();
+ assertFalse("writeEntryProcessorV3's toString should have filtered out
body", toString.contains("body"));
+ assertFalse("writeEntryProcessorV3's toString should have filtered out
masterKey",
+ toString.contains("masterKey"));
+ assertTrue("writeEntryProcessorV3's toString should contain flag",
toString.contains("flag"));
+ assertTrue("writeEntryProcessorV3's toString should contain
writeFlags", toString.contains("writeFlags"));
+
+ ReadRequest readRequest =
ReadRequest.newBuilder().setLedgerId(10).setEntryId(23)
+
.setMasterKey(ByteString.copyFrom("masterKey".getBytes())).build();
+ request =
Request.newBuilder().setHeader(header).setReadRequest(readRequest).build();
+ toString = RequestUtils.toSafeString(request);
+ assertFalse("ReadRequest's safeString should have filtered out
masterKey", toString.contains("masterKey"));
+ assertTrue("ReadRequest's safeString should contain ledgerId",
toString.contains("ledgerId"));
+ assertTrue("ReadRequest's safeString should contain entryId",
toString.contains("entryId"));
+ assertTrue("ReadRequest's safeString should contain version",
toString.contains("version"));
+ assertTrue("ReadRequest's safeString should contain operation",
toString.contains("operation"));
+ assertTrue("ReadRequest's safeString should contain txnId",
toString.contains("txnId"));
+ assertFalse("ReadRequest's safeString shouldn't contain flag",
toString.contains("flag"));
+ assertFalse("ReadRequest's safeString shouldn't contain previousLAC",
toString.contains("previousLAC"));
+ assertFalse("ReadRequest's safeString shouldn't contain timeOut",
toString.contains("timeOut"));
+
+ readRequest =
ReadRequest.newBuilder().setLedgerId(10).setEntryId(23).setPreviousLAC(2).setTimeOut(100)
+
.setMasterKey(ByteString.copyFrom("masterKey".getBytes())).setFlag(ReadRequest.Flag.ENTRY_PIGGYBACK)
+ .build();
+ request =
Request.newBuilder().setHeader(header).setReadRequest(readRequest).build();
+ toString = RequestUtils.toSafeString(request);
+ assertFalse("ReadRequest's safeString should have filtered out
masterKey", toString.contains("masterKey"));
+ assertTrue("ReadRequest's safeString shouldn contain flag",
toString.contains("flag"));
+ assertTrue("ReadRequest's safeString shouldn contain previousLAC",
toString.contains("previousLAC"));
+ assertTrue("ReadRequest's safeString shouldn contain timeOut",
toString.contains("timeOut"));
+
+ WriteLacRequest writeLacRequest =
WriteLacRequest.newBuilder().setLedgerId(10).setLac(23)
+ .setMasterKey(ByteString.copyFrom("masterKey".getBytes()))
+ .setBody(ByteString.copyFrom("entrydata".getBytes())).build();
+ request =
Request.newBuilder().setHeader(header).setWriteLacRequest(writeLacRequest).build();
+ WriteLacProcessorV3 writeLacProcessorV3 = new
WriteLacProcessorV3(request, null, null);
+ toString = writeLacProcessorV3.toString();
+ assertFalse("writeLacProcessorV3's toString should have filtered out
body", toString.contains("body"));
+ assertFalse("writeLacProcessorV3's toString should have filtered out
masterKey",
+ toString.contains("masterKey"));
+ assertTrue("writeLacProcessorV3's toString should contain ledgerId",
toString.contains("ledgerId"));
+ assertTrue("writeLacProcessorV3's toString should contain lac",
toString.contains("lac"));
+ assertTrue("writeLacProcessorV3's toString should contain version",
toString.contains("version"));
+ assertTrue("writeLacProcessorV3's toString should contain operation",
toString.contains("operation"));
+ assertTrue("writeLacProcessorV3's toString should contain txnId",
toString.contains("txnId"));
+ }
}
--
To stop receiving notification emails like this one, please contact
[email protected].