Skip to content

Commit 77f5f0e

Browse files
fix(rbac): improve error handling in retrieving permission metadata. (janus-idp#1285)
Signed-off-by: Oleksandr Andriienko <[email protected]>
1 parent 1bb20a9 commit 77f5f0e

File tree

3 files changed

+77
-15
lines changed

3 files changed

+77
-15
lines changed

plugins/rbac-backend/src/service/plugin-endpoint.test.ts

Lines changed: 63 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ describe('plugin-endpoint', () => {
6060
const collector = new PluginPermissionMetadataCollector(
6161
mockPluginEndpointDiscovery,
6262
backendPluginIDsProviderMock,
63-
config,
6463
logger,
64+
config,
6565
);
6666
const policiesMetadata = await collector.getPluginPolicies();
6767

@@ -79,8 +79,8 @@ describe('plugin-endpoint', () => {
7979
const collector = new PluginPermissionMetadataCollector(
8080
mockPluginEndpointDiscovery,
8181
backendPluginIDsProviderMock,
82-
config,
8382
logger,
83+
config,
8484
);
8585
const policiesMetadata = await collector.getPluginPolicies();
8686

@@ -109,8 +109,8 @@ describe('plugin-endpoint', () => {
109109
const collector = new PluginPermissionMetadataCollector(
110110
mockPluginEndpointDiscovery,
111111
backendPluginIDsProviderMock,
112-
config,
113112
logger,
113+
config,
114114
);
115115
const policiesMetadata = await collector.getPluginPolicies();
116116

@@ -148,8 +148,8 @@ describe('plugin-endpoint', () => {
148148
const collector = new PluginPermissionMetadataCollector(
149149
mockPluginEndpointDiscovery,
150150
backendPluginIDsProviderMock,
151-
config,
152151
logger,
152+
config,
153153
);
154154
const policiesMetadata = await collector.getPluginPolicies();
155155

@@ -163,7 +163,7 @@ describe('plugin-endpoint', () => {
163163
]);
164164
});
165165

166-
it('should throw error when it is not possible to retrieve permission metadata for known endpoint', async () => {
166+
it('should log error when it is not possible to retrieve permission metadata for known endpoint', async () => {
167167
backendPluginIDsProviderMock.getPluginIds.mockReturnValue([
168168
'permission',
169169
'catalog',
@@ -184,16 +184,69 @@ describe('plugin-endpoint', () => {
184184
'{"permissions":[{"type":"resource","name":"policy.entity.read","attributes":{"action":"read"}}]}',
185185
);
186186

187+
const errorSpy = jest.spyOn(logger, 'error').mockClear();
187188
const collector = new PluginPermissionMetadataCollector(
188189
mockPluginEndpointDiscovery,
189190
backendPluginIDsProviderMock,
190-
config,
191191
logger,
192+
config,
192193
);
193-
await expect(collector.getPluginPolicies()).rejects.toThrow(
194-
'Unexpected error',
194+
195+
const policiesMetadata = await collector.getPluginPolicies();
196+
197+
expect(policiesMetadata.length).toEqual(1);
198+
expect(policiesMetadata[0].pluginId).toEqual('permission');
199+
expect(policiesMetadata[0].policies).toEqual([
200+
{
201+
permission: 'policy.entity.read',
202+
policy: 'read',
203+
},
204+
]);
205+
206+
expect(errorSpy).toHaveBeenCalledWith(
207+
'Failed to retrieve permission metadata for catalog. Error: Unexpected error',
195208
);
196209
});
210+
211+
it('should not log error caused by non json permission metadata for known endpoint', async () => {
212+
backendPluginIDsProviderMock.getPluginIds.mockReturnValue([
213+
'permission',
214+
'catalog',
215+
]);
216+
217+
mockUrlReaderService.readUrl = jest
218+
.fn()
219+
.mockImplementation(async (_wellKnownURL: string) => {
220+
return mockReadUrlResponse;
221+
});
222+
bufferMock.toString
223+
.mockReturnValueOnce(
224+
'{"permissions":[{"type":"resource","name":"policy.entity.read","attributes":{"action":"read"}}]}',
225+
)
226+
.mockReturnValueOnce('non json data');
227+
228+
const errorSpy = jest.spyOn(logger, 'error').mockClear();
229+
230+
const collector = new PluginPermissionMetadataCollector(
231+
mockPluginEndpointDiscovery,
232+
backendPluginIDsProviderMock,
233+
logger,
234+
config,
235+
);
236+
const policiesMetadata = await collector.getPluginPolicies();
237+
238+
expect(policiesMetadata.length).toEqual(1);
239+
expect(policiesMetadata[0].pluginId).toEqual('permission');
240+
expect(policiesMetadata[0].policies).toEqual([
241+
{
242+
permission: 'policy.entity.read',
243+
policy: 'read',
244+
},
245+
]);
246+
247+
// workaround for https://issues.redhat.com/browse/RHIDP-1456
248+
expect(errorSpy).not.toHaveBeenCalled();
249+
});
197250
});
198251

199252
describe('Test list plugin condition rules', () => {
@@ -203,8 +256,8 @@ describe('plugin-endpoint', () => {
203256
const collector = new PluginPermissionMetadataCollector(
204257
mockPluginEndpointDiscovery,
205258
backendPluginIDsProviderMock,
206-
config,
207259
logger,
260+
config,
208261
);
209262
const conditionRulesMetadata = await collector.getPluginConditionRules();
210263

@@ -222,8 +275,8 @@ describe('plugin-endpoint', () => {
222275
const collector = new PluginPermissionMetadataCollector(
223276
mockPluginEndpointDiscovery,
224277
backendPluginIDsProviderMock,
225-
config,
226278
logger,
279+
config,
227280
);
228281
const conditionRulesMetadata = await collector.getPluginConditionRules();
229282

plugins/rbac-backend/src/service/plugin-endpoints.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ export class PluginPermissionMetadataCollector {
4343
constructor(
4444
private readonly discovery: PluginEndpointDiscovery,
4545
private readonly pluginIdProvider: PluginIdProvider,
46+
private readonly logger: Logger,
4647
config: Config,
47-
logger: Logger,
4848
) {
4949
this.pluginIds = this.pluginIdProvider.getPluginIds();
5050
this.urlReader = UrlReaders.default({
@@ -97,7 +97,13 @@ export class PluginPermissionMetadataCollector {
9797
try {
9898
const permResp = await this.urlReader.readUrl(wellKnownURL);
9999
const permMetaDataRaw = (await permResp.buffer()).toString();
100-
const permMetaData = JSON.parse(permMetaDataRaw);
100+
let permMetaData;
101+
try {
102+
permMetaData = JSON.parse(permMetaDataRaw);
103+
} catch (err) {
104+
// workaround for https://issues.redhat.com/browse/RHIDP-1456
105+
continue;
106+
}
101107
if (permMetaData) {
102108
pluginResponses = [
103109
...pluginResponses,
@@ -108,9 +114,12 @@ export class PluginPermissionMetadataCollector {
108114
];
109115
}
110116
} catch (err) {
111-
if (!isError(err) || err.name !== 'NotFoundError') {
112-
throw err;
117+
if (isError(err) && err.name === 'NotFoundError') {
118+
continue;
113119
}
120+
this.logger.error(
121+
`Failed to retrieve permission metadata for ${pluginId}. ${err}`,
122+
);
114123
}
115124
}
116125
return pluginResponses;

plugins/rbac-backend/src/service/policies-rest-api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ export class PolicesServer {
100100
const pluginPermMetaData = new PluginPermissionMetadataCollector(
101101
this.discovery,
102102
this.pluginIdProvider,
103-
this.config,
104103
this.logger,
104+
this.config,
105105
);
106106

107107
router.use(permissionsIntegrationRouter);

0 commit comments

Comments
 (0)