@@ -45,6 +45,13 @@ public class SpringRequestMappingMethodCheck extends IssuableSubscriptionVisitor
4545 private static final String REQUEST_METHOD = "method" ;
4646 public static final String MESSAGE = "Make sure allowing safe and unsafe HTTP methods is safe here." ;
4747
48+ private boolean classHasSafeMethods = false ;
49+ private boolean classHasUnsafeMethods = false ;
50+ private boolean methodHasSafeMethods = false ;
51+ private boolean methodHasUnsafeMethods = false ;
52+
53+ private boolean isClassVisited = false ;
54+
4855 @ Override
4956 public List <Tree .Kind > nodesToVisit () {
5057 return Collections .singletonList (Tree .Kind .CLASS );
@@ -53,11 +60,12 @@ public List<Tree.Kind> nodesToVisit() {
5360 @ Override
5461 public void visitNode (Tree tree ) {
5562 ClassTree classTree = (ClassTree ) tree ;
63+ isClassVisited = true ;
5664 findRequestMappingAnnotation (classTree .modifiers ())
5765 .flatMap (SpringRequestMappingMethodCheck ::findRequestMethods )
58- .filter (SpringRequestMappingMethodCheck ::mixSafeAndUnsafeMethods )
66+ .filter (this ::mixSafeAndUnsafeMethods )
5967 .ifPresent (methods -> reportIssue (methods , MESSAGE ));
60-
68+ isClassVisited = false ;
6169 classTree .members ().stream ()
6270 .filter (member -> member .is (Tree .Kind .METHOD ))
6371 .forEach (member -> checkMethod ((MethodTree ) member , classTree .symbol ()));
@@ -69,9 +77,15 @@ private void checkMethod(MethodTree method, Symbol.TypeSymbol classSymbol) {
6977 .flatMap (SpringRequestMappingMethodCheck ::findRequestMethods );
7078
7179 if (requestMethods .isPresent ()) {
72- requestMethods
73- .filter (SpringRequestMappingMethodCheck ::mixSafeAndUnsafeMethods )
74- .ifPresent (methods -> reportIssue (methods , MESSAGE ));
80+ Optional <ExpressionTree > expressionTree = requestMethods
81+ .filter (this ::mixSafeAndUnsafeMethods );
82+ if (expressionTree .isPresent ()) {
83+ reportIssue (expressionTree .get (), MESSAGE );
84+ } else {
85+ if ((classHasSafeMethods && methodHasUnsafeMethods ) || (classHasUnsafeMethods && methodHasSafeMethods )) {
86+ reportIssue (requestMethods .get (), MESSAGE );
87+ }
88+ }
7589 } else if (requestMappingAnnotation .isPresent () && !inheritRequestMethod (classSymbol )) {
7690 reportIssue (requestMappingAnnotation .get ().annotationType (), MESSAGE );
7791 }
@@ -109,9 +123,16 @@ private static boolean inheritRequestMethod(Symbol.TypeSymbol symbol) {
109123 return false ;
110124 }
111125
112- private static boolean mixSafeAndUnsafeMethods (ExpressionTree requestMethodsAssignment ) {
126+ private boolean mixSafeAndUnsafeMethods (ExpressionTree requestMethodsAssignment ) {
113127 HttpMethodVisitor visitor = new HttpMethodVisitor ();
114128 requestMethodsAssignment .accept (visitor );
129+ if (isClassVisited ) {
130+ classHasSafeMethods = visitor .hasSafeMethods ;
131+ classHasUnsafeMethods = visitor .hasUnsafeMethods ;
132+ } else {
133+ methodHasSafeMethods = visitor .hasSafeMethods ;
134+ methodHasUnsafeMethods = visitor .hasUnsafeMethods ;
135+ }
115136 return visitor .hasSafeMethods && visitor .hasUnsafeMethods ;
116137 }
117138
0 commit comments