Add defensive nil check for RoleManager in Check method Co-authored-by: hsluoyz <3787410+hsluoyz@users.noreply.github.com>
diff --git a/detector/default_detector.go b/detector/default_detector.go index 7afc7be..cd24232 100644 --- a/detector/default_detector.go +++ b/detector/default_detector.go
@@ -40,6 +40,11 @@ // It uses DFS to traverse the role graph and detect cycles. // Returns nil if no cycle is found, otherwise returns an error with a description of the cycle. func (d *DefaultDetector) Check(rm rbac.RoleManager) error { + // Defensive nil check to prevent runtime panics + if rm == nil { + return fmt.Errorf("role manager cannot be nil") + } + // Build the adjacency graph by exploring all roles graph, err := d.buildGraph(rm) if err != nil {
diff --git a/detector/default_detector_test.go b/detector/default_detector_test.go index e7816d5..8f4ce55 100644 --- a/detector/default_detector_test.go +++ b/detector/default_detector_test.go
@@ -22,6 +22,20 @@ defaultrolemanager "github.com/casbin/casbin/v3/rbac/default-role-manager" ) +func TestDefaultDetector_NilRoleManager(t *testing.T) { + detector := NewDefaultDetector() + err := detector.Check(nil) + + if err == nil { + t.Error("Expected error for nil role manager, but got nil") + } else { + errMsg := err.Error() + if !strings.Contains(errMsg, "role manager cannot be nil") { + t.Errorf("Expected error message to contain 'role manager cannot be nil', got: %s", errMsg) + } + } +} + func TestDefaultDetector_NoCycle(t *testing.T) { rm := defaultrolemanager.NewRoleManagerImpl(10) _ = rm.AddLink("alice", "admin")