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]