Skip to content

Commit 863b102

Browse files
committed
Merge branch 'development'
2 parents 160928d + 02a8701 commit 863b102

File tree

12 files changed

+95
-44
lines changed

12 files changed

+95
-44
lines changed

ModuleConfig.cfc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ component {
1818
this.entryPoint = "cbsecurity";
1919
// Helpers
2020
this.applicationHelper = [ "helpers/mixins.cfm" ];
21-
// Dependencies
22-
this.dependencies = [ "cbauth", "jwtcfml", "cbcsrf" ];
21+
// Dependencies that must be loaded first.
22+
this.dependencies = [];
2323

2424
/**
2525
* Module Config
2626
*/
2727
function configure(){
28-
settings = {
28+
variables.settings = {
2929
/**
3030
* --------------------------------------------------------------------------
3131
* Authentication Services
@@ -114,7 +114,7 @@ component {
114114
};
115115

116116
// Security Interceptions
117-
interceptorSettings = {
117+
variables.interceptorSettings = {
118118
customInterceptionPoints : [
119119
// Validator Events
120120
"cbSecurity_onInvalidAuthentication",

box.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name":"ColdBox Security",
3-
"version":"3.6.0",
3+
"version":"3.7.0",
44
"location":"https://downloads.ortussolutions.com/ortussolutions/coldbox-modules/cbsecurity/@build.version@/[email protected]@.zip",
55
"author":"Ortus Solutions.com <[email protected]>",
66
"slug":"cbsecurity",

changelog.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
## [Unreleased]
1111

12+
### Changed
13+
14+
- Increased VARCHAR field sizes in `DBLogger` table schema to accommodate longer URLs and user agent strings. Fields `host`, `path`, `queryString`, `referer`, and `userAgent` now use VARCHAR(1024) to prevent truncation of data.
15+
- Updated `DBLogger` insert statements to truncate `host`, `path`, `queryString`, `referer`, and `userAgent` values to 1024 characters using `left()` function to prevent database errors.
16+
17+
### Fixed
18+
19+
- Allow for sub-modules to load AFTER cbsecurity loads.
20+
- Make sure the jwt token is not null when doing discovery in the JwtService.
21+
- Fixed `isSafeRedirectUrl()` host comparison for non-default ports by stripping port from host before comparing with URI host.
22+
- ACF Compatibility: Fixed `dateTimeFormat` usage for `logDate` in activity view to prevent conversion errors in Adobe ColdFusion.
23+
24+
### Added
25+
26+
- Added `TokenRejectionException` handling in JWT handler to properly handle token rejection errors.
27+
- Updated JWT handler error message calls to match specification.
28+
- Added test cases for non-default port scenarios in `isSafeRedirectUrl()` validation.
29+
- Added test validation for JWT response messages.
30+
1231
## [3.6.0] - 2025-12-08
1332

1433
### Security

handlers/Jwt.cfc

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,7 @@ component extends="coldbox.system.RestHandler" {
1414
function refreshToken( event, rc, prc ){
1515
// If endpoint not enabled, just 404 it
1616
if ( !variables.jwtService.getSettings().jwt.enableRefreshEndpoint ) {
17-
event
18-
.getResponse()
19-
.setErrorMessage(
20-
"Refresh Token Endpoint Disabled",
21-
404,
22-
"Disabled"
23-
);
17+
event.getResponse().setErrorMessage( "Refresh Token Endpoint Disabled", 404 );
2418
return;
2519
}
2620

@@ -33,31 +27,20 @@ component extends="coldbox.system.RestHandler" {
3327
.setData( prc.newTokens )
3428
.addMessage( "Tokens refreshed! The passed in refresh token has been invalidated" );
3529
} catch ( RefreshTokensNotActive e ) {
36-
event.getResponse().setErrorMessage( "Refresh Tokens Not Active", 404, "Disabled" );
30+
event.getResponse().setErrorMessage( "Refresh Tokens Not Active", 404 );
3731
} catch ( TokenNotFoundException e ) {
3832
event
3933
.getResponse()
4034
.setErrorMessage(
4135
"The refresh token was not passed via the header or the rc. Cannot refresh the unrefreshable!",
42-
400,
43-
"Missing refresh token"
36+
400
4437
);
4538
} catch ( TokenInvalidException e ) {
46-
event
47-
.getResponse()
48-
.setErrorMessage(
49-
"Invalid Token - #e.message#",
50-
401,
51-
"Invalid Token"
52-
);
39+
event.getResponse().setErrorMessage( "Invalid Token", 401 );
5340
} catch ( TokenExpiredException e ) {
54-
event
55-
.getResponse()
56-
.setErrorMessage(
57-
"Token Expired - #e.message#",
58-
400,
59-
"Token Expired"
60-
);
41+
event.getResponse().setErrorMessage( "Token Expired", 400 );
42+
} catch ( TokenRejectionException e ) {
43+
event.getResponse().setErrorMessage( "Invalid Token", 401 );
6144
}
6245
}
6346

interceptors/Security.cfc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -827,7 +827,9 @@ component accessors="true" extends="coldbox.system.Interceptor" {
827827
}
828828

829829
// Get the current request's host for comparison
830-
var currentHost = variables.cbSecurity.getRealHost();
830+
// Normalize host: urlToValidate.getHost() does not include port
831+
// Strip port from .getRealHost() for compare
832+
var currentHost = listFirst( variables.cbSecurity.getRealHost(), ":" );
831833

832834
// Compare hosts (case-insensitive)
833835
return compareNoCase( urlToValidate.getHost(), currentHost ) == 0;

models/CBSecurity.cfc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ component threadsafe singleton accessors="true" {
164164
}
165165

166166
// cbcsrf settings incorporation
167-
variables.moduleSettings.cbcsrf.settings.append( variables.settings.csrf, false );
167+
variables.moduleSettings.cbcsrf.settings.append( variables.settings.csrf, true );
168168
// DBLogger Configuration
169169
variables.dbLogger.configure();
170170
// Log it

models/jwt/JwtService.cfc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -817,7 +817,7 @@ component accessors="true" singleton threadsafe {
817817
);
818818

819819
// If we found it, return it, else try other headers
820-
if ( jwtToken.len() ) {
820+
if ( !isNull( jwtToken ) && jwtToken.len() ) {
821821
return jwtToken;
822822
}
823823

models/util/DBLogger.cfc

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -159,12 +159,12 @@ component accessors="true" singleton threadsafe {
159159
action : { cfsqltype : "varchar", value : arguments.action },
160160
blockType : { cfsqltype : "varchar", value : arguments.blockType },
161161
ip : { cfsqltype : "varchar", value : arguments.ip },
162-
host : { cfsqltype : "varchar", value : arguments.host },
162+
host : { cfsqltype : "varchar", value : left( arguments.host, 1024 ) },
163163
httpMethod : { cfsqltype : "varchar", value : arguments.httpMethod },
164-
path : { cfsqltype : "varchar", value : arguments.path },
165-
queryString : { cfsqltype : "varchar", value : arguments.queryString },
166-
referer : { cfsqltype : "varchar", value : arguments.referer },
167-
userAgent : { cfsqltype : "varchar", value : arguments.userAgent },
164+
path : { cfsqltype : "varchar", value : left( arguments.path, 1024 ) },
165+
queryString : { cfsqltype : "varchar", value : left( arguments.queryString, 1024 ) },
166+
referer : { cfsqltype : "varchar", value : left( arguments.referer, 1024 ) },
167+
userAgent : { cfsqltype : "varchar", value : left( arguments.userAgent, 1024 ) },
168168
userId : { cfsqltype : "varchar", value : arguments.userId },
169169
rule : {
170170
cfsqltype : "longvarchar",
@@ -403,12 +403,12 @@ component accessors="true" singleton threadsafe {
403403
action VARCHAR(20) NOT NULL,
404404
blockType VARCHAR(20) NOT NULL,
405405
ip VARCHAR(100) NOT NULL,
406-
host VARCHAR(255) NOT NULL,
406+
host VARCHAR(1024) NOT NULL,
407407
httpMethod VARCHAR(25) NOT NULL,
408-
path VARCHAR(255) NOT NULL,
409-
queryString VARCHAR(255) NOT NULL,
410-
referer VARCHAR(255),
411-
userAgent VARCHAR(255) NOT NULL,
408+
path VARCHAR(1024) NOT NULL,
409+
queryString VARCHAR(1024) NOT NULL,
410+
referer VARCHAR(1024),
411+
userAgent VARCHAR(1024) NOT NULL,
412412
userId VARCHAR(36),
413413
securityRule #getTextColumnType()#,
414414
PRIMARY KEY (id)

test-harness/box.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,9 @@
1313
"route-visualizer":"*"
1414
},
1515
"installPaths":{
16+
"coldbox":"coldbox/",
17+
"BCrypt":"modules/BCrypt/",
18+
"testbox":"testbox/",
19+
"route-visualizer":"modules/route-visualizer/"
1620
}
1721
}

test-harness/tests/specs/integration/JWTSpec.cfc

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,11 +188,21 @@ component extends="coldbox.system.testing.BaseTestCase" appMapping="/root" {
188188
} );
189189
given( "An activated endpoint and an invalid refresh token", function(){
190190
then( "it should kick me out", function(){
191+
var oUser = variables.userService.retrieveUserByUsername( "test" );
192+
var tokens = variables.jwtService.fromUser( oUser );
191193
variables.jwtService.getSettings().jwt.enableRefreshEndpoint = true;
194+
195+
// Force invalidate the refresh token
196+
variables.jwtService.invalidate( tokens.refresh_token );
197+
192198
var event = this.post(
193199
"/cbsecurity/refreshtoken",
194-
{ "x-refresh-token" : variables.invalid_token }
200+
{ "x-refresh-token" : tokens.refresh_token }
195201
);
202+
203+
var jsonResponse = deserializeJSON( event.getRenderedContent() );
204+
expect( jsonResponse.messages[ 1 ] ).toBe( event.getResponse().getMessagesString() );
205+
196206
expect( event.getResponse().getStatusCode() ).toBe(
197207
401,
198208
event.getResponse().getMessagesString()

0 commit comments

Comments
 (0)