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

jiacai2050 pushed a commit to branch main
in repository 
https://gitbox.apache.org/repos/asf/incubator-horaedb-client-java.git


The following commit(s) were added to refs/heads/main by this push:
     new e02eb53  feat: add basic auth (#78)
e02eb53 is described below

commit e02eb537c8e0d988947b594467f878218456d36a
Author: CooooolFrog <[email protected]>
AuthorDate: Wed May 22 14:42:34 2024 +0800

    feat: add basic auth (#78)
---
 .../java/org/apache/horaedb/rpc/GrpcClient.java    |  3 ++
 .../interceptors/AuthenticationInterceptor.java    | 44 ++++++++++++++++++++++
 .../org/apache/horaedb/options/HoraeDBOptions.java | 14 +++++++
 .../java/org/apache/horaedb/rpc/RpcOptions.java    | 28 ++++++++++++++
 pom.xml                                            |  7 ++++
 5 files changed, 96 insertions(+)

diff --git a/horaedb-grpc/src/main/java/org/apache/horaedb/rpc/GrpcClient.java 
b/horaedb-grpc/src/main/java/org/apache/horaedb/rpc/GrpcClient.java
index db8331c..cd2f015 100644
--- a/horaedb-grpc/src/main/java/org/apache/horaedb/rpc/GrpcClient.java
+++ b/horaedb-grpc/src/main/java/org/apache/horaedb/rpc/GrpcClient.java
@@ -35,6 +35,7 @@ import io.grpc.protobuf.ProtoUtils;
 import io.grpc.stub.ClientCalls;
 import io.grpc.stub.StreamObserver;
 
+import org.apache.horaedb.rpc.interceptors.AuthenticationInterceptor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -394,6 +395,8 @@ public class GrpcClient implements RpcClient {
     // Interceptors run in the reverse order in which they are added
     private void initInterceptors() {
         // the last one
+        addInterceptor(new AuthenticationInterceptor(opts.getUser(), 
opts.getPassword()));
+
         addInterceptor(new MetricInterceptor());
 
         // the second
diff --git 
a/horaedb-grpc/src/main/java/org/apache/horaedb/rpc/interceptors/AuthenticationInterceptor.java
 
b/horaedb-grpc/src/main/java/org/apache/horaedb/rpc/interceptors/AuthenticationInterceptor.java
new file mode 100644
index 0000000..bf4ac22
--- /dev/null
+++ 
b/horaedb-grpc/src/main/java/org/apache/horaedb/rpc/interceptors/AuthenticationInterceptor.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2023 CeresDB Project Authors. Licensed under Apache-2.0.
+ */
+package org.apache.horaedb.rpc.interceptors;
+
+import io.grpc.*;
+
+import java.util.Base64;
+
+public class AuthenticationInterceptor implements ClientInterceptor {
+    private final String token;
+
+    public AuthenticationInterceptor(String user, String password) {
+        // Build token
+        this.token = Base64.getEncoder().encodeToString((user + ":" + 
password).getBytes());
+    }
+
+    @Override
+    public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(final 
MethodDescriptor<ReqT, RespT> method,
+                                                               final 
CallOptions callOpts, Channel next) {
+
+        return new AuthenticationAttachingClientCall<>(next.newCall(method, 
callOpts), token);
+    }
+
+    private static final class AuthenticationAttachingClientCall<ReqT, RespT>
+            extends ForwardingClientCall.SimpleForwardingClientCall<ReqT, 
RespT> {
+
+        private final String        token;
+        private static final String AUTHORIZATION_HEADER = "authorization";
+        private static final String BASIC_PREFIX         = "Basic ";
+
+        private AuthenticationAttachingClientCall(ClientCall<ReqT, RespT> 
delegate, String token) {
+            super(delegate);
+            this.token = token;
+        }
+
+        @Override
+        public void start(Listener<RespT> responseListener, Metadata headers) {
+            headers.put(Metadata.Key.of(AUTHORIZATION_HEADER, 
Metadata.ASCII_STRING_MARSHALLER), BASIC_PREFIX + token);
+            super.start(responseListener, headers);
+        }
+    }
+
+}
diff --git 
a/horaedb-protocol/src/main/java/org/apache/horaedb/options/HoraeDBOptions.java 
b/horaedb-protocol/src/main/java/org/apache/horaedb/options/HoraeDBOptions.java
index 8bc525c..ae9113c 100644
--- 
a/horaedb-protocol/src/main/java/org/apache/horaedb/options/HoraeDBOptions.java
+++ 
b/horaedb-protocol/src/main/java/org/apache/horaedb/options/HoraeDBOptions.java
@@ -166,6 +166,9 @@ public class HoraeDBOptions implements 
Copiable<HoraeDBOptions> {
         // The routeMode for sdk, only Proxy and Direct support now.
         private RouteMode routeMode;
         private String    database;
+        private String    user;
+        private String    password;
+
         // Asynchronous thread pool, which is used to handle various 
asynchronous tasks in the SDK.
         private Executor asyncWritePool;
         private Executor asyncReadPool;
@@ -201,6 +204,13 @@ public class HoraeDBOptions implements 
Copiable<HoraeDBOptions> {
             this.routeMode = routeMode;
         }
 
+        @SuppressWarnings("PMD")
+        public Builder authentication(final String user, final String 
password) {
+            this.user = user;
+            this.password = password;
+            return this;
+        }
+
         /**
          *
          * @param database the database name
@@ -366,6 +376,10 @@ public class HoraeDBOptions implements 
Copiable<HoraeDBOptions> {
             opts.asyncWritePool = asyncWritePool;
             opts.asyncReadPool = asyncReadPool;
             opts.rpcOptions = this.rpcOptions;
+
+            opts.rpcOptions.setUser(this.user);
+            opts.rpcOptions.setPassword(this.password);
+
             opts.routerOptions = new RouterOptions();
             opts.routerOptions.setClusterAddress(this.clusterAddress);
             opts.routerOptions.setMaxCachedSize(this.routeTableMaxCachedSize);
diff --git a/horaedb-rpc/src/main/java/org/apache/horaedb/rpc/RpcOptions.java 
b/horaedb-rpc/src/main/java/org/apache/horaedb/rpc/RpcOptions.java
index 6014557..6dd4fbf 100644
--- a/horaedb-rpc/src/main/java/org/apache/horaedb/rpc/RpcOptions.java
+++ b/horaedb-rpc/src/main/java/org/apache/horaedb/rpc/RpcOptions.java
@@ -14,6 +14,16 @@ import org.apache.horaedb.common.util.Cpus;
  */
 public class RpcOptions implements Copiable<RpcOptions> {
 
+    /**
+     * Username provided for authentication
+     */
+    private String user;
+
+    /**
+     * Password provided for authentication
+     */
+    private String password;
+
     /**
      * RPC request default timeout in milliseconds
      * Default: 10000(10s)
@@ -96,6 +106,14 @@ public class RpcOptions implements Copiable<RpcOptions> {
      */
     private long connectionMaxAgeMs = 0;
 
+    public String getUser() {
+        return user;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
     public int getDefaultRpcTimeout() {
         return defaultRpcTimeout;
     }
@@ -180,6 +198,14 @@ public class RpcOptions implements Copiable<RpcOptions> {
         return limitKind;
     }
 
+    public void setUser(String user) {
+        this.user = user;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
     public void setLimitKind(LimitKind limitKind) {
         this.limitKind = limitKind;
     }
@@ -235,6 +261,8 @@ public class RpcOptions implements Copiable<RpcOptions> {
     @Override
     public RpcOptions copy() {
         final RpcOptions opts = new RpcOptions();
+        opts.user = this.user;
+        opts.password = this.password;
         opts.defaultRpcTimeout = this.defaultRpcTimeout;
         opts.rpcThreadPoolSize = this.rpcThreadPoolSize;
         opts.rpcThreadPoolQueueSize = this.rpcThreadPoolQueueSize;
diff --git a/pom.xml b/pom.xml
index 932d4a6..d52569a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -400,6 +400,13 @@
                         <exclude>**/sql/TokenMgrException.java</exclude>
                     </excludes>
                 </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.ow2.asm</groupId>
+                        <artifactId>asm</artifactId>
+                        <version>9.2</version>
+                    </dependency>
+                </dependencies>
             </plugin>
             <plugin>
                 <groupId>com.mycila</groupId>


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

Reply via email to