This is an automated email from the ASF dual-hosted git repository.

mikexue pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/eventmesh.git


The following commit(s) were added to refs/heads/master by this push:
     new a52c312b5 Hessian Serializer add whitelist (#5146)
a52c312b5 is described below

commit a52c312b5f389879e6c60f2d52a2a59bef81e7b9
Author: Karson <[email protected]>
AuthorDate: Tue Dec 17 17:39:32 2024 +0800

    Hessian Serializer add whitelist (#5146)
---
 eventmesh-meta/eventmesh-meta-raft/build.gradle    |   1 +
 .../eventmesh/meta/raft/JraftMetaServiceImpl.java  |   4 +-
 .../eventmesh/meta/raft/MetaStateMachine.java      |   4 +-
 .../raft/serialize/EventMeshHessianSerializer.java |  78 +++++++++++
 .../raft/serialize/EventMeshSerializerFactory.java | 143 +++++++++++++++++++++
 5 files changed, 226 insertions(+), 4 deletions(-)

diff --git a/eventmesh-meta/eventmesh-meta-raft/build.gradle 
b/eventmesh-meta/eventmesh-meta-raft/build.gradle
index 210e348c8..6abc73dd9 100644
--- a/eventmesh-meta/eventmesh-meta-raft/build.gradle
+++ b/eventmesh-meta/eventmesh-meta-raft/build.gradle
@@ -40,6 +40,7 @@ dependencies {
     implementation project(":eventmesh-common")
     implementation "com.alipay.sofa:jraft-core:${jraftVersion}"
     implementation "com.alipay.sofa:rpc-grpc-impl:${jraftVersion}"
+    implementation group: 'com.caucho', name: 'hessian', version: '4.0.63'
     testImplementation 'org.junit.jupiter:junit-jupiter'
 }
 
diff --git 
a/eventmesh-meta/eventmesh-meta-raft/src/main/java/org/apache/eventmesh/meta/raft/JraftMetaServiceImpl.java
 
b/eventmesh-meta/eventmesh-meta-raft/src/main/java/org/apache/eventmesh/meta/raft/JraftMetaServiceImpl.java
index 1af6d5c96..1f655eb93 100644
--- 
a/eventmesh-meta/eventmesh-meta-raft/src/main/java/org/apache/eventmesh/meta/raft/JraftMetaServiceImpl.java
+++ 
b/eventmesh-meta/eventmesh-meta-raft/src/main/java/org/apache/eventmesh/meta/raft/JraftMetaServiceImpl.java
@@ -18,13 +18,13 @@
 package org.apache.eventmesh.meta.raft;
 
 import org.apache.eventmesh.meta.raft.rpc.RequestResponse;
+import org.apache.eventmesh.meta.raft.serialize.EventMeshHessianSerializer;
 
 import org.apache.commons.lang.StringUtils;
 
 import java.nio.ByteBuffer;
 
 import com.alipay.remoting.exception.CodecException;
-import com.alipay.remoting.serialization.SerializerManager;
 import com.alipay.sofa.jraft.Status;
 import com.alipay.sofa.jraft.entity.Task;
 import com.alipay.sofa.jraft.error.RaftError;
@@ -51,7 +51,7 @@ public class JraftMetaServiceImpl implements JraftMetaService 
{
         try {
             closure.setEventOperation(opreation);
             final Task task = new Task();
-            
task.setData(ByteBuffer.wrap(SerializerManager.getSerializer(SerializerManager.Hessian2).serialize(opreation)));
+            
task.setData(ByteBuffer.wrap(EventMeshHessianSerializer.getInstance().serialize(opreation)));
             task.setDone(closure);
             this.server.getNode().apply(task);
         } catch (CodecException e) {
diff --git 
a/eventmesh-meta/eventmesh-meta-raft/src/main/java/org/apache/eventmesh/meta/raft/MetaStateMachine.java
 
b/eventmesh-meta/eventmesh-meta-raft/src/main/java/org/apache/eventmesh/meta/raft/MetaStateMachine.java
index a0607f5ab..0d4690fb1 100644
--- 
a/eventmesh-meta/eventmesh-meta-raft/src/main/java/org/apache/eventmesh/meta/raft/MetaStateMachine.java
+++ 
b/eventmesh-meta/eventmesh-meta-raft/src/main/java/org/apache/eventmesh/meta/raft/MetaStateMachine.java
@@ -21,6 +21,7 @@ import static 
org.apache.eventmesh.meta.raft.EventOperation.DELETE;
 import static org.apache.eventmesh.meta.raft.EventOperation.GET;
 import static org.apache.eventmesh.meta.raft.EventOperation.PUT;
 
+import org.apache.eventmesh.meta.raft.serialize.EventMeshHessianSerializer;
 import org.apache.eventmesh.meta.raft.snapshot.MetaSnapshotFile;
 
 import org.apache.commons.lang.StringUtils;
@@ -37,7 +38,6 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.atomic.AtomicLong;
 
 import com.alipay.remoting.exception.CodecException;
-import com.alipay.remoting.serialization.SerializerManager;
 import com.alipay.sofa.jraft.Closure;
 import com.alipay.sofa.jraft.Iterator;
 import com.alipay.sofa.jraft.Status;
@@ -121,7 +121,7 @@ public class MetaStateMachine extends StateMachineAdapter {
                 // Have to parse FetchAddRequest from this user log.
                 final ByteBuffer data = iter.getData();
                 try {
-                    eventOperation = 
SerializerManager.getSerializer(SerializerManager.Hessian2)
+                    eventOperation = EventMeshHessianSerializer.getInstance()
                         .deserialize(data.array(), 
EventOperation.class.getName());
                 } catch (final CodecException e) {
                     e.printStackTrace(System.err);
diff --git 
a/eventmesh-meta/eventmesh-meta-raft/src/main/java/org/apache/eventmesh/meta/raft/serialize/EventMeshHessianSerializer.java
 
b/eventmesh-meta/eventmesh-meta-raft/src/main/java/org/apache/eventmesh/meta/raft/serialize/EventMeshHessianSerializer.java
new file mode 100644
index 000000000..646d69c0d
--- /dev/null
+++ 
b/eventmesh-meta/eventmesh-meta-raft/src/main/java/org/apache/eventmesh/meta/raft/serialize/EventMeshHessianSerializer.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.meta.raft.serialize;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import com.alipay.remoting.exception.CodecException;
+import com.alipay.remoting.serialization.HessianSerializer;
+import com.caucho.hessian.io.Hessian2Input;
+import com.caucho.hessian.io.Hessian2Output;
+import com.caucho.hessian.io.SerializerFactory;
+
+public class EventMeshHessianSerializer extends HessianSerializer {
+
+    private SerializerFactory customizeSerializerFactory = new 
EventMeshSerializerFactory();
+
+    private static EventMeshHessianSerializer instance;
+
+    private EventMeshHessianSerializer() {
+    }
+
+    public static HessianSerializer getInstance() {
+        if (instance == null) {
+            synchronized (EventMeshHessianSerializer.class) {
+                if (instance == null) {
+                    instance = new EventMeshHessianSerializer();
+                }
+            }
+        }
+        return instance;
+    }
+
+    @Override
+    public byte[] serialize(Object obj) throws CodecException {
+        ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
+        Hessian2Output output = new Hessian2Output(byteArray);
+        output.setSerializerFactory(customizeSerializerFactory);
+        try {
+            output.writeObject(obj);
+            output.close();
+        } catch (IOException e) {
+            throw new CodecException("IOException occurred when Hessian 
serializer encode!", e);
+        }
+
+        return byteArray.toByteArray();
+    }
+
+    @Override
+    public <T> T deserialize(byte[] data, String classOfT) throws 
CodecException {
+        Hessian2Input input = new Hessian2Input(new 
ByteArrayInputStream(data));
+        input.setSerializerFactory(customizeSerializerFactory);
+        Object resultObject;
+        try {
+            resultObject = input.readObject();
+            input.close();
+        } catch (IOException e) {
+            throw new CodecException("IOException occurred when Hessian 
serializer decode!", e);
+        }
+        return (T) resultObject;
+    }
+}
diff --git 
a/eventmesh-meta/eventmesh-meta-raft/src/main/java/org/apache/eventmesh/meta/raft/serialize/EventMeshSerializerFactory.java
 
b/eventmesh-meta/eventmesh-meta-raft/src/main/java/org/apache/eventmesh/meta/raft/serialize/EventMeshSerializerFactory.java
new file mode 100644
index 000000000..d16796219
--- /dev/null
+++ 
b/eventmesh-meta/eventmesh-meta-raft/src/main/java/org/apache/eventmesh/meta/raft/serialize/EventMeshSerializerFactory.java
@@ -0,0 +1,143 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.meta.raft.serialize;
+
+import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ConcurrentSkipListMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
+
+import com.caucho.hessian.io.SerializerFactory;
+
+public class EventMeshSerializerFactory  extends SerializerFactory {
+    EventMeshSerializerFactory() {
+        super();
+        super.getClassFactory().setWhitelist(true);
+        allowBasicType();
+        allowCollections();
+        allowConcurrent();
+        allowTime();
+        super.getClassFactory().allow("org.apache.eventmesh.*");
+    }
+
+    private void allowBasicType() {
+        super.getClassFactory().allow(boolean.class.getCanonicalName());
+        super.getClassFactory().allow(byte.class.getCanonicalName());
+        super.getClassFactory().allow(char.class.getCanonicalName());
+        super.getClassFactory().allow(double.class.getCanonicalName());
+        super.getClassFactory().allow(float.class.getCanonicalName());
+        super.getClassFactory().allow(int.class.getCanonicalName());
+        super.getClassFactory().allow(long.class.getCanonicalName());
+        super.getClassFactory().allow(short.class.getCanonicalName());
+        super.getClassFactory().allow(Boolean.class.getCanonicalName());
+        super.getClassFactory().allow(Byte.class.getCanonicalName());
+        super.getClassFactory().allow(Character.class.getCanonicalName());
+        super.getClassFactory().allow(Double.class.getCanonicalName());
+        super.getClassFactory().allow(Float.class.getCanonicalName());
+        super.getClassFactory().allow(Integer.class.getCanonicalName());
+        super.getClassFactory().allow(Long.class.getCanonicalName());
+        super.getClassFactory().allow(Short.class.getCanonicalName());
+
+        super.getClassFactory().allow(Number.class.getCanonicalName());
+        super.getClassFactory().allow(Class.class.getCanonicalName());
+        super.getClassFactory().allow(String.class.getCanonicalName());
+    }
+
+    private void allowCollections() {
+        super.getClassFactory().allow(List.class.getCanonicalName());
+        super.getClassFactory().allow(ArrayList.class.getCanonicalName());
+        super.getClassFactory().allow(LinkedList.class.getCanonicalName());
+
+        super.getClassFactory().allow(Set.class.getCanonicalName());
+        super.getClassFactory().allow(HashSet.class.getCanonicalName());
+        super.getClassFactory().allow(LinkedHashSet.class.getCanonicalName());
+        super.getClassFactory().allow(TreeSet.class.getCanonicalName());
+
+        super.getClassFactory().allow(Map.class.getCanonicalName());
+        super.getClassFactory().allow(HashMap.class.getCanonicalName());
+        super.getClassFactory().allow(LinkedHashMap.class.getCanonicalName());
+        super.getClassFactory().allow(TreeMap.class.getCanonicalName());
+        super.getClassFactory().allow(WeakHashMap.class.getCanonicalName());
+
+        super.getClassFactory().allow("java.util.Arrays$ArrayList");
+        super.getClassFactory().allow("java.util.Collections$EmptyList");
+        super.getClassFactory().allow("java.util.Collections$EmptyMap");
+        super.getClassFactory().allow("java.util.Collections$SingletonSet");
+        super.getClassFactory().allow("java.util.Collections$SingletonList");
+        
super.getClassFactory().allow("java.util.Collections$UnmodifiableCollection");
+        
super.getClassFactory().allow("java.util.Collections$UnmodifiableList");
+        super.getClassFactory().allow("java.util.Collections$UnmodifiableMap");
+        
super.getClassFactory().allow("java.util.Collections$UnmodifiableNavigableMap");
+        
super.getClassFactory().allow("java.util.Collections$UnmodifiableNavigableSet");
+        
super.getClassFactory().allow("java.util.Collections$UnmodifiableRandomAccessList");
+        super.getClassFactory().allow("java.util.Collections$UnmodifiableSet");
+        
super.getClassFactory().allow("java.util.Collections$UnmodifiableSortedMap");
+        
super.getClassFactory().allow("java.util.Collections$UnmodifiableSortedSet");
+    }
+
+    private void allowConcurrent() {
+        super.getClassFactory().allow(AtomicBoolean.class.getCanonicalName());
+        super.getClassFactory().allow(AtomicInteger.class.getCanonicalName());
+        super.getClassFactory().allow(AtomicLong.class.getCanonicalName());
+        
super.getClassFactory().allow(AtomicReference.class.getCanonicalName());
+
+        super.getClassFactory().allow(ConcurrentMap.class.getCanonicalName());
+        
super.getClassFactory().allow(ConcurrentHashMap.class.getCanonicalName());
+        
super.getClassFactory().allow(ConcurrentSkipListMap.class.getCanonicalName());
+        
super.getClassFactory().allow(CopyOnWriteArrayList.class.getCanonicalName());
+    }
+
+    private void allowTime() {
+        
super.getClassFactory().allow(SimpleDateFormat.class.getCanonicalName());
+        
super.getClassFactory().allow(DateTimeFormatter.class.getCanonicalName());
+        super.getClassFactory().allow(Instant.class.getCanonicalName());
+        super.getClassFactory().allow(LocalDate.class.getCanonicalName());
+        super.getClassFactory().allow(LocalDateTime.class.getCanonicalName());
+        super.getClassFactory().allow(LocalTime.class.getCanonicalName());
+        super.getClassFactory().allow(TimeUnit.class.getCanonicalName());
+        super.getClassFactory().allow(Date.class.getCanonicalName());
+        super.getClassFactory().allow(Calendar.class.getCanonicalName());
+    }
+
+
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to