@backstage-community/plugin-blackduck-backend 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +16 -6
- package/dist/index.cjs.js +87 -11
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +23 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -38,7 +38,10 @@ Create a file called blackduck.ts inside `packages/backend/src/plugins/` and add
|
|
|
38
38
|
### blackduck.ts
|
|
39
39
|
|
|
40
40
|
```typescript
|
|
41
|
-
import {
|
|
41
|
+
import {
|
|
42
|
+
createRouter,
|
|
43
|
+
BlackDuckConfig,
|
|
44
|
+
} from '@backstage-community/plugin-blackduck-backend';
|
|
42
45
|
import { Router } from 'express';
|
|
43
46
|
import { PluginEnvironment } from '../types';
|
|
44
47
|
|
|
@@ -50,6 +53,7 @@ export default async function createPlugin(
|
|
|
50
53
|
config: env.config,
|
|
51
54
|
permissions: env.permissions,
|
|
52
55
|
discovery: env.discovery,
|
|
56
|
+
blackDuckConfig: BlackDuckConfig.fromConfig(env.config),
|
|
53
57
|
});
|
|
54
58
|
}
|
|
55
59
|
```
|
|
@@ -147,17 +151,23 @@ Follow the Docs from [README.md](https://github.com/backstage/community-plugins/
|
|
|
147
151
|
|
|
148
152
|
### Global Config
|
|
149
153
|
|
|
150
|
-
Add the following into your `app-config.yaml
|
|
154
|
+
Add the following into your `app-config.yaml`. The default host is mandatory - if no host specified in annotation, this host will be used. Other hosts are optional.
|
|
151
155
|
|
|
152
156
|
```yaml
|
|
153
157
|
blackduck:
|
|
154
|
-
|
|
155
|
-
|
|
158
|
+
default: one
|
|
159
|
+
hosts:
|
|
160
|
+
- name: one
|
|
161
|
+
host: https://blackduck.yourcompany.one.com/api
|
|
162
|
+
token: YOUR_API_TOKEN_ONE
|
|
163
|
+
- name: two
|
|
164
|
+
host: https://blackduck.yourcompany.two.com/api
|
|
165
|
+
token: YOUR_API_TOKEN_TWO
|
|
156
166
|
```
|
|
157
167
|
|
|
158
168
|
### Catalog
|
|
159
169
|
|
|
160
|
-
Add the following into your catalog
|
|
170
|
+
Add the following into your catalog. The host part is optional - if no host specified in annotation, the default one will be used.
|
|
161
171
|
|
|
162
172
|
```yaml
|
|
163
173
|
apiVersion: backstage.io/v1alpha1
|
|
@@ -165,5 +175,5 @@ kind: Component
|
|
|
165
175
|
metadata:
|
|
166
176
|
name: backstage
|
|
167
177
|
annotations:
|
|
168
|
-
blackduck/project: YOUR_PROJECT_NAME/YOUR_PROJECT_VERSION
|
|
178
|
+
blackduck/project: YOUR_PROJECT_HOST_NAME/YOUR_PROJECT_NAME/YOUR_PROJECT_VERSION
|
|
169
179
|
```
|
package/dist/index.cjs.js
CHANGED
|
@@ -148,14 +148,11 @@ class BlackDuckRestApi {
|
|
|
148
148
|
}
|
|
149
149
|
|
|
150
150
|
async function createRouter(options) {
|
|
151
|
-
const { logger, config,
|
|
151
|
+
const { logger, permissions, config, blackDuckConfig } = options;
|
|
152
152
|
const { httpAuth } = backendCommon.createLegacyAuthAdapters(options);
|
|
153
153
|
const permissionIntegrationRouter = pluginPermissionNode.createPermissionIntegrationRouter({
|
|
154
154
|
permissions: pluginBlackduckCommon.blackduckPermissions
|
|
155
155
|
});
|
|
156
|
-
const bdConfig = config.getConfig("blackduck");
|
|
157
|
-
const bdHost = bdConfig.getString("host");
|
|
158
|
-
const bdToken = bdConfig.getString("token");
|
|
159
156
|
const router = Router__default.default();
|
|
160
157
|
router.use(express__default.default.json());
|
|
161
158
|
router.use(permissionIntegrationRouter);
|
|
@@ -165,11 +162,28 @@ async function createRouter(options) {
|
|
|
165
162
|
});
|
|
166
163
|
const middleware = rootHttpRouter.MiddlewareFactory.create({ logger, config });
|
|
167
164
|
router.post(
|
|
168
|
-
"/risk-profile/:projectName/:projectVersion",
|
|
165
|
+
"/risk-profile/:hostKey/:projectName/:projectVersion",
|
|
169
166
|
async (_request, response) => {
|
|
170
167
|
logger.debug("getting vulnarabilities..");
|
|
171
|
-
const { projectName, projectVersion } = _request.params;
|
|
172
|
-
|
|
168
|
+
const { hostKey, projectName, projectVersion } = _request.params;
|
|
169
|
+
if (!hostKey || !projectName || !projectVersion) {
|
|
170
|
+
response.status(400).json({
|
|
171
|
+
message: "The hostKey, projectName and projectVersion are required"
|
|
172
|
+
});
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
let host;
|
|
176
|
+
let token;
|
|
177
|
+
try {
|
|
178
|
+
const hostConfig = blackDuckConfig.getHostConfigByName(hostKey);
|
|
179
|
+
host = hostConfig.host;
|
|
180
|
+
token = hostConfig.token;
|
|
181
|
+
} catch (error) {
|
|
182
|
+
response.status(400).json({
|
|
183
|
+
message: "The hostKey is not valid."
|
|
184
|
+
});
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
173
187
|
const credentials = await httpAuth.credentials(_request);
|
|
174
188
|
const entityRef = _request.body.entityRef;
|
|
175
189
|
logger.info("getting risk profile for project: ", entityRef);
|
|
@@ -190,6 +204,7 @@ async function createRouter(options) {
|
|
|
190
204
|
if (decision.result !== pluginPermissionCommon.AuthorizeResult.ALLOW) {
|
|
191
205
|
throw new errors.NotAllowedError("Unauthorized");
|
|
192
206
|
}
|
|
207
|
+
const blackDuck = new BlackDuckRestApi(logger, host, token);
|
|
193
208
|
await blackDuck.auth();
|
|
194
209
|
const risk_profile = await blackDuck.getRiskProfile(
|
|
195
210
|
projectName,
|
|
@@ -199,16 +214,33 @@ async function createRouter(options) {
|
|
|
199
214
|
}
|
|
200
215
|
);
|
|
201
216
|
router.post(
|
|
202
|
-
"/vulns/:projectName/:projectVersion",
|
|
217
|
+
"/vulns/:hostKey/:projectName/:projectVersion",
|
|
203
218
|
async (_request, response) => {
|
|
204
|
-
const { projectName, projectVersion } = _request.params;
|
|
205
|
-
const blackDuck = new BlackDuckRestApi(logger, bdHost, bdToken);
|
|
219
|
+
const { hostKey, projectName, projectVersion } = _request.params;
|
|
206
220
|
const credentials = await httpAuth.credentials(_request);
|
|
207
221
|
const entityRef = _request.body.entityRef;
|
|
208
222
|
logger.info("getting vulnarabilities for project: ", entityRef);
|
|
209
223
|
if (typeof entityRef !== "string") {
|
|
210
224
|
throw new errors.InputError("Invalid entityRef, not a string");
|
|
211
225
|
}
|
|
226
|
+
if (!hostKey || !projectName || !projectVersion) {
|
|
227
|
+
response.status(400).json({
|
|
228
|
+
message: "The hostKey, projectName and projectVersion are required"
|
|
229
|
+
});
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
let host;
|
|
233
|
+
let token;
|
|
234
|
+
try {
|
|
235
|
+
const hostConfig = blackDuckConfig.getHostConfigByName(hostKey);
|
|
236
|
+
host = hostConfig.host;
|
|
237
|
+
token = hostConfig.token;
|
|
238
|
+
} catch (error) {
|
|
239
|
+
response.status(400).json({
|
|
240
|
+
message: "The hostKey is not valid."
|
|
241
|
+
});
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
212
244
|
const decision = (await permissions.authorize(
|
|
213
245
|
[
|
|
214
246
|
{
|
|
@@ -224,6 +256,7 @@ async function createRouter(options) {
|
|
|
224
256
|
if (decision.result !== pluginPermissionCommon.AuthorizeResult.ALLOW) {
|
|
225
257
|
throw new errors.NotAllowedError("Unauthorized");
|
|
226
258
|
}
|
|
259
|
+
const blackDuck = new BlackDuckRestApi(logger, host, token);
|
|
227
260
|
await blackDuck.auth();
|
|
228
261
|
const vulns = await blackDuck.getVulnerableComponents(
|
|
229
262
|
projectName,
|
|
@@ -236,6 +269,47 @@ async function createRouter(options) {
|
|
|
236
269
|
return router;
|
|
237
270
|
}
|
|
238
271
|
|
|
272
|
+
const DEFAULT_HOST_NAME = "default";
|
|
273
|
+
class BlackDuckConfig {
|
|
274
|
+
constructor(hosts, defaultHost) {
|
|
275
|
+
this.hosts = hosts;
|
|
276
|
+
this.defaultHost = defaultHost;
|
|
277
|
+
}
|
|
278
|
+
static fromConfig(config) {
|
|
279
|
+
let hosts = [];
|
|
280
|
+
let defaultHost = DEFAULT_HOST_NAME;
|
|
281
|
+
if (config.has("blackduck.host") && config.has("blackduck.hosts")) {
|
|
282
|
+
throw new Error("Cannot have both blackduck.host and blackduck.hosts");
|
|
283
|
+
}
|
|
284
|
+
if (config.has("blackduck.host") && config.has("blackduck.token")) {
|
|
285
|
+
const singleHost = {
|
|
286
|
+
name: "default",
|
|
287
|
+
host: config.getString("blackduck.host"),
|
|
288
|
+
token: config.getString("blackduck.token")
|
|
289
|
+
};
|
|
290
|
+
hosts = [singleHost];
|
|
291
|
+
} else if (config.has("blackduck.hosts") && config.has("blackduck.default")) {
|
|
292
|
+
hosts = config.getConfigArray("blackduck.hosts").map((hostConfig) => ({
|
|
293
|
+
name: hostConfig.getString("name"),
|
|
294
|
+
host: hostConfig.getString("host"),
|
|
295
|
+
token: hostConfig.getString("token")
|
|
296
|
+
}));
|
|
297
|
+
defaultHost = config.getString("blackduck.default");
|
|
298
|
+
} else {
|
|
299
|
+
throw new Error("Invalid BlackDuck config found");
|
|
300
|
+
}
|
|
301
|
+
return new BlackDuckConfig(hosts, defaultHost);
|
|
302
|
+
}
|
|
303
|
+
getHostConfigByName(name) {
|
|
304
|
+
const hostName = name === DEFAULT_HOST_NAME ? this.defaultHost : name;
|
|
305
|
+
const hostConfig = this.hosts.find((host) => host.name === hostName);
|
|
306
|
+
if (!hostConfig) {
|
|
307
|
+
throw new Error(`No host found with name: ${name}`);
|
|
308
|
+
}
|
|
309
|
+
return hostConfig;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
239
313
|
const blackduckPlugin = backendPluginApi.createBackendPlugin({
|
|
240
314
|
pluginId: "blackduck",
|
|
241
315
|
register(env) {
|
|
@@ -262,7 +336,8 @@ const blackduckPlugin = backendPluginApi.createBackendPlugin({
|
|
|
262
336
|
config,
|
|
263
337
|
permissions,
|
|
264
338
|
discovery,
|
|
265
|
-
httpAuth
|
|
339
|
+
httpAuth,
|
|
340
|
+
blackDuckConfig: BlackDuckConfig.fromConfig(config)
|
|
266
341
|
})
|
|
267
342
|
);
|
|
268
343
|
httpRouter.addAuthPolicy({
|
|
@@ -274,6 +349,7 @@ const blackduckPlugin = backendPluginApi.createBackendPlugin({
|
|
|
274
349
|
}
|
|
275
350
|
});
|
|
276
351
|
|
|
352
|
+
exports.BlackDuckConfig = BlackDuckConfig;
|
|
277
353
|
exports.createRouter = createRouter;
|
|
278
354
|
exports.default = blackduckPlugin;
|
|
279
355
|
//# sourceMappingURL=index.cjs.js.map
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/api/BlackDuckRestApi.ts","../src/service/router.ts","../src/plugin.ts"],"sourcesContent":["import { LoggerService } from '@backstage/backend-plugin-api';\nimport {\n BD_REST_API_RESPONSE,\n BD_PROJECT_DETAIL,\n BD_VERISON_DETAIL,\n BD_VERSIONS_API_RESPONSE,\n BD_PROJECTS_API_RESPONSE,\n} from '@backstage-community/plugin-blackduck-common';\n\nexport class BlackDuckRestApi {\n private _bearer: string;\n private _limit: number;\n public constructor(\n private readonly logger: LoggerService,\n private readonly host: string,\n private readonly token: string,\n ) {\n this._bearer = '';\n this._limit = 1000;\n }\n\n public async auth() {\n try {\n const auth = await fetch(`${this.host}/tokens/authenticate`, {\n method: 'POST',\n headers: {\n Authorization: `token ${this.token}`,\n Accept: 'application/vnd.blackducksoftware.user-4+json',\n 'Content-Type': 'application/json',\n },\n });\n const token = await auth.json();\n this.logger.info('Auth Successfull');\n this._bearer = token.bearerToken;\n return token.bearerToken;\n } catch (error) {\n throw error;\n }\n }\n public async getProjects(name: string): Promise<BD_REST_API_RESPONSE> {\n const projects = await fetch(\n `${this.host}/projects?limit=999&q=name:${name}`,\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${this._bearer}`,\n Accept: 'application/vnd.blackducksoftware.project-detail-4+json',\n 'Content-Type': 'application/json',\n },\n },\n );\n this.logger.debug('Retrived Projects!!');\n return projects.json();\n }\n\n public async getVersions(\n projectUrl: string,\n versionName: string,\n ): Promise<BD_VERSIONS_API_RESPONSE> {\n const versions = await fetch(\n `${projectUrl}/versions?limit=999&q=versionName:${versionName}`,\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${this._bearer}`,\n Accept: 'application/vnd.blackducksoftware.project-detail-5+json',\n 'Content-Type': 'application/json',\n },\n },\n );\n this.logger.debug('Retrived Versions!!');\n return versions.json();\n }\n\n public async getProjectVersionDetails(\n projectName: string,\n projectVersion: string,\n ) {\n let projectDetail: BD_PROJECT_DETAIL | any;\n let versionDetail: BD_VERISON_DETAIL | any;\n const projects: BD_PROJECTS_API_RESPONSE = await this.getProjects(\n projectName,\n );\n projects.items.forEach((item: any) => {\n if (item.name === projectName) {\n projectDetail = item;\n }\n });\n if (projectDetail === undefined) {\n this.logger.error('Provide full project name');\n }\n this.logger.debug(`Fetched Project : ${projectName} details`);\n const versions: BD_VERSIONS_API_RESPONSE = await this.getVersions(\n projectDetail._meta.href,\n projectVersion,\n );\n versions.items.forEach((item: any) => {\n if (item.versionName === projectVersion) {\n versionDetail = item;\n }\n });\n if (versionDetail === undefined) {\n this.logger.error('Provide full version name');\n }\n this.logger.debug(\n `Fetched Project : ${projectName}, Version: ${projectVersion} details`,\n );\n\n return versionDetail;\n }\n\n public async getVulnerableComponents(\n projectName: string,\n projectVersion: string,\n ) {\n const versionDetail = await this.getProjectVersionDetails(\n projectName,\n projectVersion,\n );\n const vuln_url = `${versionDetail._meta.href}/vulnerable-bom-components?limit=${this._limit}`;\n const vulns: any = await fetch(vuln_url, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${this._bearer}`,\n Accept: 'application/vnd.blackducksoftware.bill-of-materials-6+json',\n 'Content-Type': 'application/json',\n },\n });\n this.logger.debug(\n `Fetched Project : ${projectName}, Version: ${projectVersion} Vulnerable Components`,\n );\n return vulns.json();\n }\n\n public async getRiskProfile(projectName: string, projectVersion: string) {\n const versionDetail = await this.getProjectVersionDetails(\n projectName,\n projectVersion,\n );\n const risk_profile_url = `${versionDetail._meta.href}/risk-profile`;\n const risk_profile: any = await fetch(risk_profile_url, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${this._bearer}`,\n // Accept: 'application/vnd.blackducksoftware.component-detail-5+json',\n 'Content-Type': 'application/json',\n },\n });\n this.logger.debug(\n `Fetched Project : ${projectName}, Version: ${projectVersion} risk profile`,\n );\n return risk_profile.json();\n }\n}\n","import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport {\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n} from '@backstage/backend-plugin-api';\nimport { Config } from '@backstage/config';\nimport express from 'express';\nimport Router from 'express-promise-router';\nimport { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';\nimport { InputError, NotAllowedError } from '@backstage/errors';\nimport { AuthorizeResult } from '@backstage/plugin-permission-common';\nimport { createLegacyAuthAdapters } from '@backstage/backend-common';\nimport {\n blackduckPermissions,\n blackduckRiskProfileReadPermission,\n blackduckVulnerabilitiesReadPermission,\n} from '@backstage-community/plugin-blackduck-common';\nimport { BlackDuckRestApi } from '../api/BlackDuckRestApi';\n\n/** @public */\nexport interface RouterOptions {\n logger: LoggerService;\n config: Config;\n permissions: PermissionsService;\n discovery: DiscoveryService;\n httpAuth?: HttpAuthService;\n}\n\n/** @public */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const { logger, config, permissions } = options;\n const { httpAuth } = createLegacyAuthAdapters(options);\n const permissionIntegrationRouter = createPermissionIntegrationRouter({\n permissions: blackduckPermissions,\n });\n\n const bdConfig = config.getConfig('blackduck');\n const bdHost = bdConfig.getString('host');\n const bdToken = bdConfig.getString('token');\n\n const router = Router();\n router.use(express.json());\n router.use(permissionIntegrationRouter);\n\n router.get('/health', (_, response) => {\n logger.info('PONG!');\n response.json({ status: 'ok' });\n });\n\n const middleware = MiddlewareFactory.create({ logger, config });\n\n router.post(\n '/risk-profile/:projectName/:projectVersion',\n async (_request, response) => {\n logger.debug('getting vulnarabilities..');\n const { projectName, projectVersion } = _request.params;\n const blackDuck = new BlackDuckRestApi(logger, bdHost, bdToken);\n const credentials = await httpAuth.credentials(_request);\n const entityRef = _request.body.entityRef;\n logger.info('getting risk profile for project: ', entityRef);\n if (typeof entityRef !== 'string') {\n throw new InputError('Invalid entityRef, not a string');\n }\n\n const decision = (\n await permissions.authorize(\n [\n {\n permission: blackduckRiskProfileReadPermission,\n resourceRef: entityRef,\n },\n ],\n {\n credentials,\n },\n )\n )[0];\n\n if (decision.result !== AuthorizeResult.ALLOW) {\n throw new NotAllowedError('Unauthorized');\n }\n\n await blackDuck.auth();\n const risk_profile = await blackDuck.getRiskProfile(\n projectName,\n projectVersion,\n );\n response.json(risk_profile);\n },\n );\n\n router.post(\n '/vulns/:projectName/:projectVersion',\n async (_request, response) => {\n const { projectName, projectVersion } = _request.params;\n const blackDuck = new BlackDuckRestApi(logger, bdHost, bdToken);\n const credentials = await httpAuth.credentials(_request);\n const entityRef = _request.body.entityRef;\n logger.info('getting vulnarabilities for project: ', entityRef);\n if (typeof entityRef !== 'string') {\n throw new InputError('Invalid entityRef, not a string');\n }\n\n const decision = (\n await permissions.authorize(\n [\n {\n permission: blackduckVulnerabilitiesReadPermission,\n resourceRef: entityRef,\n },\n ],\n {\n credentials,\n },\n )\n )[0];\n logger.info('decision', decision);\n if (decision.result !== AuthorizeResult.ALLOW) {\n throw new NotAllowedError('Unauthorized');\n }\n\n await blackDuck.auth();\n const vulns = await blackDuck.getVulnerableComponents(\n projectName,\n projectVersion,\n );\n response.json(vulns);\n },\n );\n\n router.use(middleware.error());\n return router;\n}\n","import {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\n\n/**\n * blackduckPlugin backend plugin\n *\n * @public\n */\nexport const blackduckPlugin = createBackendPlugin({\n pluginId: 'blackduck',\n register(env) {\n env.registerInit({\n deps: {\n httpRouter: coreServices.httpRouter,\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n permissions: coreServices.permissions,\n discovery: coreServices.discovery,\n httpAuth: coreServices.httpAuth,\n },\n async init({\n httpRouter,\n logger,\n config,\n permissions,\n discovery,\n httpAuth,\n }) {\n httpRouter.use(\n await createRouter({\n logger,\n config,\n permissions,\n discovery,\n httpAuth,\n }),\n );\n httpRouter.addAuthPolicy({\n path: '/health',\n allow: 'unauthenticated',\n });\n },\n });\n },\n});\n"],"names":["createLegacyAuthAdapters","createPermissionIntegrationRouter","blackduckPermissions","Router","express","MiddlewareFactory","InputError","blackduckRiskProfileReadPermission","AuthorizeResult","NotAllowedError","blackduckVulnerabilitiesReadPermission","createBackendPlugin","coreServices"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/api/BlackDuckRestApi.ts","../src/service/router.ts","../src/service/BlackDuckConfig.ts","../src/plugin.ts"],"sourcesContent":["import { LoggerService } from '@backstage/backend-plugin-api';\nimport {\n BD_REST_API_RESPONSE,\n BD_PROJECT_DETAIL,\n BD_VERISON_DETAIL,\n BD_VERSIONS_API_RESPONSE,\n BD_PROJECTS_API_RESPONSE,\n} from '@backstage-community/plugin-blackduck-common';\n\nexport class BlackDuckRestApi {\n private _bearer: string;\n private _limit: number;\n public constructor(\n private readonly logger: LoggerService,\n private readonly host: string,\n private readonly token: string,\n ) {\n this._bearer = '';\n this._limit = 1000;\n }\n\n public async auth() {\n try {\n const auth = await fetch(`${this.host}/tokens/authenticate`, {\n method: 'POST',\n headers: {\n Authorization: `token ${this.token}`,\n Accept: 'application/vnd.blackducksoftware.user-4+json',\n 'Content-Type': 'application/json',\n },\n });\n const token = await auth.json();\n this.logger.info('Auth Successfull');\n this._bearer = token.bearerToken;\n return token.bearerToken;\n } catch (error) {\n throw error;\n }\n }\n public async getProjects(name: string): Promise<BD_REST_API_RESPONSE> {\n const projects = await fetch(\n `${this.host}/projects?limit=999&q=name:${name}`,\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${this._bearer}`,\n Accept: 'application/vnd.blackducksoftware.project-detail-4+json',\n 'Content-Type': 'application/json',\n },\n },\n );\n this.logger.debug('Retrived Projects!!');\n return projects.json();\n }\n\n public async getVersions(\n projectUrl: string,\n versionName: string,\n ): Promise<BD_VERSIONS_API_RESPONSE> {\n const versions = await fetch(\n `${projectUrl}/versions?limit=999&q=versionName:${versionName}`,\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${this._bearer}`,\n Accept: 'application/vnd.blackducksoftware.project-detail-5+json',\n 'Content-Type': 'application/json',\n },\n },\n );\n this.logger.debug('Retrived Versions!!');\n return versions.json();\n }\n\n public async getProjectVersionDetails(\n projectName: string,\n projectVersion: string,\n ) {\n let projectDetail: BD_PROJECT_DETAIL | any;\n let versionDetail: BD_VERISON_DETAIL | any;\n const projects: BD_PROJECTS_API_RESPONSE = await this.getProjects(\n projectName,\n );\n projects.items.forEach((item: any) => {\n if (item.name === projectName) {\n projectDetail = item;\n }\n });\n if (projectDetail === undefined) {\n this.logger.error('Provide full project name');\n }\n this.logger.debug(`Fetched Project : ${projectName} details`);\n const versions: BD_VERSIONS_API_RESPONSE = await this.getVersions(\n projectDetail._meta.href,\n projectVersion,\n );\n versions.items.forEach((item: any) => {\n if (item.versionName === projectVersion) {\n versionDetail = item;\n }\n });\n if (versionDetail === undefined) {\n this.logger.error('Provide full version name');\n }\n this.logger.debug(\n `Fetched Project : ${projectName}, Version: ${projectVersion} details`,\n );\n\n return versionDetail;\n }\n\n public async getVulnerableComponents(\n projectName: string,\n projectVersion: string,\n ) {\n const versionDetail = await this.getProjectVersionDetails(\n projectName,\n projectVersion,\n );\n const vuln_url = `${versionDetail._meta.href}/vulnerable-bom-components?limit=${this._limit}`;\n const vulns: any = await fetch(vuln_url, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${this._bearer}`,\n Accept: 'application/vnd.blackducksoftware.bill-of-materials-6+json',\n 'Content-Type': 'application/json',\n },\n });\n this.logger.debug(\n `Fetched Project : ${projectName}, Version: ${projectVersion} Vulnerable Components`,\n );\n return vulns.json();\n }\n\n public async getRiskProfile(projectName: string, projectVersion: string) {\n const versionDetail = await this.getProjectVersionDetails(\n projectName,\n projectVersion,\n );\n const risk_profile_url = `${versionDetail._meta.href}/risk-profile`;\n const risk_profile: any = await fetch(risk_profile_url, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${this._bearer}`,\n // Accept: 'application/vnd.blackducksoftware.component-detail-5+json',\n 'Content-Type': 'application/json',\n },\n });\n this.logger.debug(\n `Fetched Project : ${projectName}, Version: ${projectVersion} risk profile`,\n );\n return risk_profile.json();\n }\n}\n","import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport {\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n} from '@backstage/backend-plugin-api';\nimport { Config } from '@backstage/config';\nimport express from 'express';\nimport Router from 'express-promise-router';\nimport { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';\nimport { InputError, NotAllowedError } from '@backstage/errors';\nimport { AuthorizeResult } from '@backstage/plugin-permission-common';\nimport { createLegacyAuthAdapters } from '@backstage/backend-common';\nimport {\n blackduckPermissions,\n blackduckRiskProfileReadPermission,\n blackduckVulnerabilitiesReadPermission,\n} from '@backstage-community/plugin-blackduck-common';\nimport { BlackDuckRestApi } from '../api/BlackDuckRestApi';\nimport { BlackDuckConfig } from './BlackDuckConfig';\n\n/** @public */\nexport interface RouterOptions {\n logger: LoggerService;\n config: Config;\n permissions: PermissionsService;\n discovery: DiscoveryService;\n httpAuth?: HttpAuthService;\n blackDuckConfig: BlackDuckConfig;\n}\n\n/** @public */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const { logger, permissions, config, blackDuckConfig } = options;\n const { httpAuth } = createLegacyAuthAdapters(options);\n const permissionIntegrationRouter = createPermissionIntegrationRouter({\n permissions: blackduckPermissions,\n });\n\n const router = Router();\n router.use(express.json());\n router.use(permissionIntegrationRouter);\n\n router.get('/health', (_, response) => {\n logger.info('PONG!');\n response.json({ status: 'ok' });\n });\n\n const middleware = MiddlewareFactory.create({ logger, config });\n\n router.post(\n '/risk-profile/:hostKey/:projectName/:projectVersion',\n async (_request, response) => {\n logger.debug('getting vulnarabilities..');\n const { hostKey, projectName, projectVersion } = _request.params;\n\n if (!hostKey || !projectName || !projectVersion) {\n response.status(400).json({\n message: 'The hostKey, projectName and projectVersion are required',\n });\n return;\n }\n\n let host: string;\n let token: string;\n\n try {\n const hostConfig = blackDuckConfig.getHostConfigByName(hostKey);\n host = hostConfig.host;\n token = hostConfig.token;\n } catch (error) {\n response.status(400).json({\n message: 'The hostKey is not valid.',\n });\n return;\n }\n\n const credentials = await httpAuth.credentials(_request);\n const entityRef = _request.body.entityRef;\n logger.info('getting risk profile for project: ', entityRef);\n if (typeof entityRef !== 'string') {\n throw new InputError('Invalid entityRef, not a string');\n }\n\n const decision = (\n await permissions.authorize(\n [\n {\n permission: blackduckRiskProfileReadPermission,\n resourceRef: entityRef,\n },\n ],\n {\n credentials,\n },\n )\n )[0];\n\n if (decision.result !== AuthorizeResult.ALLOW) {\n throw new NotAllowedError('Unauthorized');\n }\n\n const blackDuck = new BlackDuckRestApi(logger, host, token);\n\n await blackDuck.auth();\n const risk_profile = await blackDuck.getRiskProfile(\n projectName,\n projectVersion,\n );\n response.json(risk_profile);\n },\n );\n\n router.post(\n '/vulns/:hostKey/:projectName/:projectVersion',\n async (_request, response) => {\n const { hostKey, projectName, projectVersion } = _request.params;\n const credentials = await httpAuth.credentials(_request);\n const entityRef = _request.body.entityRef;\n logger.info('getting vulnarabilities for project: ', entityRef);\n if (typeof entityRef !== 'string') {\n throw new InputError('Invalid entityRef, not a string');\n }\n\n if (!hostKey || !projectName || !projectVersion) {\n response.status(400).json({\n message: 'The hostKey, projectName and projectVersion are required',\n });\n return;\n }\n\n let host: string;\n let token: string;\n\n try {\n const hostConfig = blackDuckConfig.getHostConfigByName(hostKey);\n host = hostConfig.host;\n token = hostConfig.token;\n } catch (error) {\n response.status(400).json({\n message: 'The hostKey is not valid.',\n });\n return;\n }\n\n const decision = (\n await permissions.authorize(\n [\n {\n permission: blackduckVulnerabilitiesReadPermission,\n resourceRef: entityRef,\n },\n ],\n {\n credentials,\n },\n )\n )[0];\n logger.info('decision', decision);\n if (decision.result !== AuthorizeResult.ALLOW) {\n throw new NotAllowedError('Unauthorized');\n }\n\n const blackDuck = new BlackDuckRestApi(logger, host, token);\n\n await blackDuck.auth();\n const vulns = await blackDuck.getVulnerableComponents(\n projectName,\n projectVersion,\n );\n response.json(vulns);\n },\n );\n\n router.use(middleware.error());\n return router;\n}\n","import { Config } from '@backstage/config';\n\n/**\n * @public\n */\nexport interface BlackDuckHostConfig {\n name: string;\n host: string;\n token: string;\n}\n\nconst DEFAULT_HOST_NAME = 'default';\n\n/**\n * blackduckPlugin config\n *\n * @public\n */\nexport class BlackDuckConfig {\n constructor(\n private readonly hosts: BlackDuckHostConfig[],\n private readonly defaultHost: string,\n ) {}\n\n static fromConfig(config: Config): BlackDuckConfig {\n let hosts: BlackDuckHostConfig[] = [];\n let defaultHost: string = DEFAULT_HOST_NAME;\n\n if (config.has('blackduck.host') && config.has('blackduck.hosts')) {\n throw new Error('Cannot have both blackduck.host and blackduck.hosts');\n }\n\n if (config.has('blackduck.host') && config.has('blackduck.token')) {\n const singleHost = {\n name: 'default',\n host: config.getString('blackduck.host'),\n token: config.getString('blackduck.token'),\n };\n hosts = [singleHost];\n } else if (\n config.has('blackduck.hosts') &&\n config.has('blackduck.default')\n ) {\n hosts = config.getConfigArray('blackduck.hosts').map(hostConfig => ({\n name: hostConfig.getString('name'),\n host: hostConfig.getString('host'),\n token: hostConfig.getString('token'),\n }));\n defaultHost = config.getString('blackduck.default');\n } else {\n throw new Error('Invalid BlackDuck config found');\n }\n\n return new BlackDuckConfig(hosts, defaultHost);\n }\n\n getHostConfigByName(name: string): BlackDuckHostConfig {\n const hostName = name === DEFAULT_HOST_NAME ? this.defaultHost : name;\n\n const hostConfig = this.hosts.find(host => host.name === hostName);\n\n if (!hostConfig) {\n throw new Error(`No host found with name: ${name}`);\n }\n\n return hostConfig;\n }\n}\n","import {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { BlackDuckConfig } from './service/BlackDuckConfig';\nimport { createRouter } from './service/router';\n\n/**\n * blackduckPlugin backend plugin\n *\n * @public\n */\nexport const blackduckPlugin = createBackendPlugin({\n pluginId: 'blackduck',\n register(env) {\n env.registerInit({\n deps: {\n httpRouter: coreServices.httpRouter,\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n permissions: coreServices.permissions,\n discovery: coreServices.discovery,\n httpAuth: coreServices.httpAuth,\n },\n async init({\n httpRouter,\n logger,\n config,\n permissions,\n discovery,\n httpAuth,\n }) {\n httpRouter.use(\n await createRouter({\n logger,\n config,\n permissions,\n discovery,\n httpAuth,\n blackDuckConfig: BlackDuckConfig.fromConfig(config),\n }),\n );\n httpRouter.addAuthPolicy({\n path: '/health',\n allow: 'unauthenticated',\n });\n },\n });\n },\n});\n"],"names":["createLegacyAuthAdapters","createPermissionIntegrationRouter","blackduckPermissions","Router","express","MiddlewareFactory","InputError","blackduckRiskProfileReadPermission","AuthorizeResult","NotAllowedError","blackduckVulnerabilitiesReadPermission","createBackendPlugin","coreServices"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,27 @@ import { LoggerService, PermissionsService, DiscoveryService, HttpAuthService }
|
|
|
3
3
|
import { Config } from '@backstage/config';
|
|
4
4
|
import express from 'express';
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
interface BlackDuckHostConfig {
|
|
10
|
+
name: string;
|
|
11
|
+
host: string;
|
|
12
|
+
token: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* blackduckPlugin config
|
|
16
|
+
*
|
|
17
|
+
* @public
|
|
18
|
+
*/
|
|
19
|
+
declare class BlackDuckConfig {
|
|
20
|
+
private readonly hosts;
|
|
21
|
+
private readonly defaultHost;
|
|
22
|
+
constructor(hosts: BlackDuckHostConfig[], defaultHost: string);
|
|
23
|
+
static fromConfig(config: Config): BlackDuckConfig;
|
|
24
|
+
getHostConfigByName(name: string): BlackDuckHostConfig;
|
|
25
|
+
}
|
|
26
|
+
|
|
6
27
|
/** @public */
|
|
7
28
|
interface RouterOptions {
|
|
8
29
|
logger: LoggerService;
|
|
@@ -10,6 +31,7 @@ interface RouterOptions {
|
|
|
10
31
|
permissions: PermissionsService;
|
|
11
32
|
discovery: DiscoveryService;
|
|
12
33
|
httpAuth?: HttpAuthService;
|
|
34
|
+
blackDuckConfig: BlackDuckConfig;
|
|
13
35
|
}
|
|
14
36
|
/** @public */
|
|
15
37
|
declare function createRouter(options: RouterOptions): Promise<express.Router>;
|
|
@@ -21,4 +43,4 @@ declare function createRouter(options: RouterOptions): Promise<express.Router>;
|
|
|
21
43
|
*/
|
|
22
44
|
declare const blackduckPlugin: _backstage_backend_plugin_api.BackendFeatureCompat;
|
|
23
45
|
|
|
24
|
-
export { type RouterOptions, createRouter, blackduckPlugin as default };
|
|
46
|
+
export { BlackDuckConfig, type BlackDuckHostConfig, type RouterOptions, createRouter, blackduckPlugin as default };
|