1
- /**
1
+ /**
2
2
* Copyright since 2016 by Ortus Solutions, Corp
3
3
* www.ortussolutions.com
4
4
* ---
@@ -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
@@ -45,6 +51,9 @@ component accessors="true" extends="coldbox.system.Interceptor" {
45
51
46
52
// Load up the validator
47
53
registerValidator ( getInstance ( getProperty ( " validator" ) ) );
54
+
55
+ // Coldbox version 5 (and lower) needs a little extra invalid event handler checking.
56
+ variables .enableInvalidHandlerCheck = ( listGetAt ( controller .getColdboxSettings ().version , 1 , " ." ) <= 5 );
48
57
}
49
58
50
59
/**
@@ -223,7 +232,27 @@ component accessors="true" extends="coldbox.system.Interceptor" {
223
232
required currentEvent
224
233
){
225
234
// Get handler bean for the current event
226
- var handlerBean = variables .handlerService .getHandlerBean ( arguments .event .getCurrentEvent () );
235
+ var handlerBean = variables .handlerService .getHandlerBean ( arguments .event .getCurrentEvent () );
236
+
237
+ // Are we running Coldbox 5 or older?
238
+ // is an onInvalidHandlerBean configured?
239
+ // is the current handlerBean the configured onInvalidEventHandlerBean?
240
+ if (
241
+ variables .enableInvalidHandlerCheck &&
242
+ ! isNull ( variables .onInvalidEventHandlerBean ) &&
243
+ isInvalidEventHandlerBean ( handlerBean )
244
+ ) {
245
+ // ColdBox tries to detect invalid event handler loops by keeping
246
+ // track of the last invalid event to fire. If that invalid event
247
+ // fires twice, it throws a hard exception to prevent infinite loops.
248
+ // Unfortunately for us, just attempting to get a handler bean
249
+ // starts the invalid event handling. Here, if we got the invalid
250
+ // event handler bean back, we reset the `_lastInvalidEvent` so
251
+ // ColdBox can handle the invalid event properly.
252
+ request ._lastInvalidEvent = variables .invalidEventHandler ;
253
+ return ;
254
+ }
255
+
227
256
if ( handlerBean .getHandler () == " " ) {
228
257
return ;
229
258
}
@@ -704,5 +733,19 @@ component accessors="true" extends="coldbox.system.Interceptor" {
704
733
705
734
return len ( CGI .REMOTE_ADDR ) ? CGI .REMOTE_ADDR : " 127.0.0.1" ;
706
735
}
736
+
737
+ /**
738
+ * Returns true of the passed handlerBean matches Coldbox's configured invalid event handler.
739
+ *
740
+ * @handlerBean the current handler bean to check against
741
+ */
742
+ private boolean function isInvalidEventHandlerBean ( required handlerBean ) {
743
+ return (
744
+ variables .onInvalidEventHandlerBean .getInvocationPath () == arguments .handlerBean .getInvocationPath () &&
745
+ variables .onInvalidEventHandlerBean .getHandler () == arguments .handlerBean .getHandler () &&
746
+ variables .onInvalidEventHandlerBean .getMethod () == arguments .handlerBean .getMethod () &&
747
+ variables .onInvalidEventHandlerBean .getModule () == arguments .handlerBean .getModule ()
748
+ );
749
+ }
707
750
708
751
}
0 commit comments