Skip to content

Commit 2796f50

Browse files
committed
Handles security disabled
1 parent 95668db commit 2796f50

2 files changed

Lines changed: 97 additions & 0 deletions

File tree

x-pack/platform/plugins/shared/security/server/user_profile/user_profile_service.test.ts

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -752,6 +752,96 @@ describe('UserProfileService', () => {
752752
).toHaveBeenCalledTimes(1);
753753
});
754754
});
755+
756+
describe(`when security is disabled`, () => {
757+
beforeEach(() => {
758+
userProfileService = new UserProfileService(logger);
759+
const license = licenseMock.create({ allowUserProfileCollaboration: true });
760+
license.isEnabled.mockReturnValue(false);
761+
userProfileService.setup({ authz: mockAuthz, license });
762+
});
763+
764+
it('returns `null` for basic auth requests without calling any ES APIs or recording telemetry', async () => {
765+
(securityTelemetry.recordGetCurrentProfileInvocation as jest.Mock).mockClear();
766+
767+
const request = httpServerMock.createKibanaRequest({
768+
headers: {
769+
authorization: `basic ${Buffer.from('user:pass').toString('base64')}`,
770+
},
771+
});
772+
773+
const startContract = userProfileService.start(mockStartParams);
774+
await expect(startContract.getCurrent({ request })).resolves.toBeNull();
775+
776+
expect(
777+
mockStartParams.clusterClient.asInternalUser.security.activateUserProfile
778+
).not.toHaveBeenCalled();
779+
expect(
780+
mockStartParams.clusterClient.asInternalUser.security.getUserProfile
781+
).not.toHaveBeenCalled();
782+
expect(securityTelemetry.recordGetCurrentProfileInvocation).not.toHaveBeenCalled();
783+
});
784+
785+
it('returns `null` for API key requests without calling any ES APIs or recording telemetry', async () => {
786+
(securityTelemetry.recordGetCurrentProfileInvocation as jest.Mock).mockClear();
787+
788+
const testApiKeyId = 'some-api-key-id';
789+
const testApiKeyValue = 'some-api-key-value';
790+
const request = httpServerMock.createKibanaRequest({
791+
headers: {
792+
authorization: `apikey ${Buffer.from(`${testApiKeyId}:${testApiKeyValue}`).toString(
793+
'base64'
794+
)}`,
795+
},
796+
});
797+
798+
const startContract = userProfileService.start(mockStartParams);
799+
await expect(startContract.getCurrent({ request })).resolves.toBeNull();
800+
801+
expect(
802+
mockStartParams.clusterClient.asScoped().asCurrentUser.security.getApiKey
803+
).not.toHaveBeenCalled();
804+
expect(
805+
mockStartParams.clusterClient.asInternalUser.security.getUserProfile
806+
).not.toHaveBeenCalled();
807+
expect(securityTelemetry.recordGetCurrentProfileInvocation).not.toHaveBeenCalled();
808+
});
809+
810+
it('returns `null` for session-authenticated requests without calling any ES APIs or recording telemetry', async () => {
811+
(securityTelemetry.recordGetCurrentProfileInvocation as jest.Mock).mockClear();
812+
mockStartParams.session.getSID.mockResolvedValue('some-session-id');
813+
814+
const startContract = userProfileService.start(mockStartParams);
815+
await expect(startContract.getCurrent({ request: mockRequest })).resolves.toBeNull();
816+
817+
expect(mockStartParams.session.getSID).not.toHaveBeenCalled();
818+
expect(mockStartParams.session.get).not.toHaveBeenCalled();
819+
expect(
820+
mockStartParams.clusterClient.asInternalUser.security.getUserProfile
821+
).not.toHaveBeenCalled();
822+
expect(securityTelemetry.recordGetCurrentProfileInvocation).not.toHaveBeenCalled();
823+
});
824+
825+
it('returns `null` for requests with runas header without calling any ES APIs or recording telemetry', async () => {
826+
(securityTelemetry.recordGetCurrentProfileInvocation as jest.Mock).mockClear();
827+
828+
const request = httpServerMock.createKibanaRequest({
829+
headers: { 'es-security-runas-user': 'some-user' },
830+
});
831+
832+
const startContract = userProfileService.start(mockStartParams);
833+
await expect(startContract.getCurrent({ request })).resolves.toBeNull();
834+
835+
expect(mockStartParams.session.getSID).not.toHaveBeenCalled();
836+
expect(
837+
mockStartParams.clusterClient.asInternalUser.security.activateUserProfile
838+
).not.toHaveBeenCalled();
839+
expect(
840+
mockStartParams.clusterClient.asInternalUser.security.getUserProfile
841+
).not.toHaveBeenCalled();
842+
expect(securityTelemetry.recordGetCurrentProfileInvocation).not.toHaveBeenCalled();
843+
});
844+
});
755845
});
756846

757847
describe('#update', () => {

x-pack/platform/plugins/shared/security/server/user_profile/user_profile_service.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,13 @@ export class UserProfileService {
356356
sessionlessUserProfileRetrievalEnabled: boolean,
357357
{ request, dataPath }: UserProfileGetCurrentParams
358358
) {
359+
if (!this.license?.isEnabled()) {
360+
this.logger.debug(
361+
'Skipping user profile retrieval: security features are disabled in Elasticsearch.'
362+
);
363+
return null;
364+
}
365+
359366
if (request.auth.isAuthenticated === false) {
360367
throw new Error('Request to get current user profile is not authenticated.');
361368
}

0 commit comments

Comments
 (0)