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

hsluoyz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/casbin-server.git


The following commit(s) were added to refs/heads/master by this push:
     new b877b82  fix: return error instead of panic on invalid ABAC param
b877b82 is described below

commit b877b8283d030403fb9b0d1c487fa3769f34a1b6
Author: Yang Luo <[email protected]>
AuthorDate: Fri Oct 9 23:14:21 2026 +0800

    fix: return error instead of panic on invalid ABAC param
---
 main.go            | 15 ++++++++++++++-
 server/enforcer.go | 14 +++++++++-----
 2 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/main.go b/main.go
index e13a669..041495d 100644
--- a/main.go
+++ b/main.go
@@ -17,6 +17,7 @@
 package main
 
 import (
+       "context"
        "flag"
        "fmt"
        "log"
@@ -25,9 +26,21 @@ import (
        pb "github.com/casbin/casbin-server/proto"
        "github.com/casbin/casbin-server/server"
        "google.golang.org/grpc"
+       "google.golang.org/grpc/codes"
        "google.golang.org/grpc/reflection"
+       "google.golang.org/grpc/status"
 )
 
+func recoverInterceptor(ctx context.Context, req interface{}, info 
*grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) 
{
+       defer func() {
+               if r := recover(); r != nil {
+                       log.Printf("panic in %s: %v", info.FullMethod, r)
+                       err = status.Errorf(codes.Internal, "internal error: 
%v", r)
+               }
+       }()
+       return handler(ctx, req)
+}
+
 func main() {
        var port int
        flag.IntVar(&port, "port", 50051, "listening port")
@@ -41,7 +54,7 @@ func main() {
        if err != nil {
                log.Fatalf("failed to listen: %v", err)
        }
-       s := grpc.NewServer()
+       s := grpc.NewServer(grpc.UnaryInterceptor(recoverInterceptor))
        pb.RegisterCasbinServer(s, server.NewServer())
        // Register reflection service on gRPC server.
        reflection.Register(s)
diff --git a/server/enforcer.go b/server/enforcer.go
index 1cff787..996b7dc 100644
--- a/server/enforcer.go
+++ b/server/enforcer.go
@@ -17,6 +17,7 @@ package server
 import (
        "context"
        "errors"
+       "fmt"
        "os"
        "strings"
        "sync"
@@ -145,11 +146,11 @@ func (s *Server) NewAdapter(ctx context.Context, in 
*pb.NewAdapterRequest) (*pb.
        return &pb.NewAdapterReply{Handler: int32(h)}, nil
 }
 
-func (s *Server) parseParam(param, matcher string) (interface{}, string) {
+func (s *Server) parseParam(param, matcher string) (interface{}, string, 
error) {
        if strings.HasPrefix(param, "ABAC::") {
                attrList, err := resolveABAC(param)
                if err != nil {
-                       panic(err)
+                       return nil, matcher, fmt.Errorf("invalid ABAC 
parameter: %w", err)
                }
                for k, v := range attrList.nameMap {
                        old := "." + k
@@ -157,9 +158,9 @@ func (s *Server) parseParam(param, matcher string) 
(interface{}, string) {
                                matcher = strings.Replace(matcher, old, "."+v, 
-1)
                        }
                }
-               return attrList, matcher
+               return attrList, matcher, nil
        } else {
-               return param, matcher
+               return param, matcher, nil
        }
 }
 
@@ -173,7 +174,10 @@ func (s *Server) Enforce(ctx context.Context, in 
*pb.EnforceRequest) (*pb.BoolRe
        m := e.GetModel()["m"]["m"].Value
 
        for index := range in.Params {
-               param, m = s.parseParam(in.Params[index], m)
+               param, m, err = s.parseParam(in.Params[index], m)
+               if err != nil {
+                       return &pb.BoolReply{Res: false}, err
+               }
                params = append(params, param)
        }
 


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

Reply via email to