fix: Server internal error details leaking in error messages returned to clients (#9937)

This commit is contained in:
Lucas Coratger
2025-11-23 13:51:42 +01:00
committed by GitHub
parent 38c9d2e359
commit 50edb5ab4b
35 changed files with 390 additions and 125 deletions

View File

@@ -20,8 +20,12 @@ const hasAllPODobject = () => {
};
describe('SchemaController', () => {
let loggerErrorSpy;
beforeEach(() => {
config = Config.get('test');
const logger = require('../lib/logger').default;
loggerErrorSpy = spyOn(logger, 'error').and.callThrough();
});
it('can validate one object', done => {
@@ -275,6 +279,7 @@ describe('SchemaController', () => {
})
.then(results => {
expect(results.length).toBe(1);
loggerErrorSpy.calls.reset();
const query = new Parse.Query('Stuff');
return query.count();
})
@@ -283,7 +288,9 @@ describe('SchemaController', () => {
fail('Class permissions should have rejected this query.');
},
err => {
expect(err.message).toEqual('Permission denied for action count on class Stuff.');
expect(err.message).toEqual('Permission denied');
expect(err.code).toEqual(Parse.Error.OPERATION_FORBIDDEN);
expect(loggerErrorSpy).toHaveBeenCalledWith('Sanitized error:', jasmine.stringContaining('Permission denied for action count on class Stuff'));
done();
}
)
@@ -1427,8 +1434,12 @@ describe('SchemaController', () => {
});
describe('Class Level Permissions for requiredAuth', () => {
let loggerErrorSpy;
beforeEach(() => {
config = Config.get('test');
const logger = require('../lib/logger').default;
loggerErrorSpy = spyOn(logger, 'error').and.callThrough();
});
function createUser() {
@@ -1453,6 +1464,7 @@ describe('Class Level Permissions for requiredAuth', () => {
});
})
.then(() => {
loggerErrorSpy.calls.reset();
const query = new Parse.Query('Stuff');
return query.find();
})
@@ -1462,7 +1474,8 @@ describe('Class Level Permissions for requiredAuth', () => {
done();
},
e => {
expect(e.message).toEqual('Permission denied, user needs to be authenticated.');
expect(e.message).toEqual('Permission denied');
expect(loggerErrorSpy).toHaveBeenCalledWith('Sanitized error:', jasmine.stringContaining('Permission denied, user needs to be authenticated.'));
done();
}
);
@@ -1551,6 +1564,7 @@ describe('Class Level Permissions for requiredAuth', () => {
});
})
.then(() => {
loggerErrorSpy.calls.reset();
const stuff = new Parse.Object('Stuff');
stuff.set('foo', 'bar');
return stuff.save();
@@ -1561,7 +1575,8 @@ describe('Class Level Permissions for requiredAuth', () => {
done();
},
e => {
expect(e.message).toEqual('Permission denied, user needs to be authenticated.');
expect(e.message).toEqual('Permission denied');
expect(loggerErrorSpy).toHaveBeenCalledWith('Sanitized error:', jasmine.stringContaining('Permission denied, user needs to be authenticated.'));
done();
}
);
@@ -1639,6 +1654,7 @@ describe('Class Level Permissions for requiredAuth', () => {
const stuff = new Parse.Object('Stuff');
stuff.set('foo', 'bar');
return stuff.save().then(() => {
loggerErrorSpy.calls.reset();
const query = new Parse.Query('Stuff');
return query.get(stuff.id);
});
@@ -1649,7 +1665,8 @@ describe('Class Level Permissions for requiredAuth', () => {
done();
},
e => {
expect(e.message).toEqual('Permission denied, user needs to be authenticated.');
expect(e.message).toEqual('Permission denied');
expect(loggerErrorSpy).toHaveBeenCalledWith('Sanitized error:', jasmine.stringContaining('Permission denied, user needs to be authenticated.'));
done();
}
);
@@ -1685,6 +1702,7 @@ describe('Class Level Permissions for requiredAuth', () => {
})
.then(result => {
expect(result.get('foo')).toEqual('bar');
loggerErrorSpy.calls.reset();
const query = new Parse.Query('Stuff');
return query.find();
})
@@ -1694,7 +1712,8 @@ describe('Class Level Permissions for requiredAuth', () => {
done();
},
e => {
expect(e.message).toEqual('Permission denied, user needs to be authenticated.');
expect(e.message).toEqual('Permission denied');
expect(loggerErrorSpy).toHaveBeenCalledWith('Sanitized error:', jasmine.stringContaining('Permission denied, user needs to be authenticated.'));
done();
}
);