@@ -12,6 +12,7 @@ component accessors="true" extends="coldbox.system.Interceptor" {
12
12
property name = " rulesLoader" inject = " rulesLoader@cbSecurity" ;
13
13
property name = " handlerService" inject = " coldbox:handlerService" ;
14
14
property name = " cbSecurity" inject = " @cbSecurity" ;
15
+ property name = " invalidEventHandler" inject = " coldbox:setting:invalidEventHandler" ;
15
16
16
17
/**
17
18
* The reference to the security validator for this interceptor
@@ -27,6 +28,11 @@ component accessors="true" extends="coldbox.system.Interceptor" {
27
28
* Configure the security firewall
28
29
*/
29
30
function configure (){
31
+ variables .onInvalidEventHandlerBean = javacast ( " null" , " " );
32
+ if ( len ( variables .invalidEventHandler ) ) {
33
+ variables .onInvalidEventHandlerBean = handlerService .getHandlerBean ( variables .invalidEventHandler );
34
+ }
35
+
30
36
// init the security modules dictionary
31
37
variables .securityModules = {};
32
38
@@ -222,6 +228,19 @@ component accessors="true" extends="coldbox.system.Interceptor" {
222
228
){
223
229
// Get handler bean for the current event
224
230
var handlerBean = variables .handlerService .getHandlerBean ( arguments .event .getCurrentEvent () );
231
+
232
+ if ( isInvalidEventHandlerBean ( handlerBean ) ) {
233
+ // ColdBox tries to detect invalid event handler loops by keeping
234
+ // track of the last invalid event to fire. If that invalid event
235
+ // fires twice, it throws a hard exception to prevent infinite loops.
236
+ // Unfortunately for us, just attempting to get a handler bean
237
+ // starts the invalid event handling. Here, if we got the invalid
238
+ // event handler bean back, we reset the `_lastInvalidEvent` so
239
+ // ColdBox can handle the invalid event properly.
240
+ request ._lastInvalidEvent = variables .invalidEventHandler ;
241
+ return ;
242
+ }
243
+
225
244
if ( handlerBean .getHandler () == " " ) {
226
245
return ;
227
246
}
@@ -702,5 +721,18 @@ component accessors="true" extends="coldbox.system.Interceptor" {
702
721
703
722
return len ( CGI .REMOTE_ADDR ) ? CGI .REMOTE_ADDR : " 127.0.0.1" ;
704
723
}
724
+
725
+ private boolean function isInvalidEventHandlerBean ( required handlerBean ) {
726
+ if ( isNull ( variables .onInvalidEventHandlerBean ) ) {
727
+ return false ;
728
+ }
729
+
730
+ return (
731
+ variables .onInvalidEventHandlerBean .getInvocationPath () == arguments .handlerBean .getInvocationPath () &&
732
+ variables .onInvalidEventHandlerBean .getHandler () == arguments .handlerBean .getHandler () &&
733
+ variables .onInvalidEventHandlerBean .getMethod () == arguments .handlerBean .getMethod () &&
734
+ variables .onInvalidEventHandlerBean .getModule () == arguments .handlerBean .getModule ()
735
+ );
736
+ }
705
737
706
738
}
0 commit comments