Skip to content

Commit 87066a5

Browse files
ARC-101 - permission related fixes (#246)
## Description Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. Fixes # (issue) ## Type of change Please delete options that are not relevant. - [ ] Bug fix (non-breaking change which fixes an issue) - [X] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) - [ ] Intermediate change (work in progress) ## How Has This Been Tested? Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration - [ ] Test A - [ ] Test B ## Checklist: - [ ] Performed a self-review of my own code - [ ] npm test passes on your machine - [ ] New tests added or existing tests modified to cover all changes - [ ] Code conforms with the style guide - [ ] API Documentation in code was updated - [ ] Any dependent changes have been merged and published in downstream modules
1 parent 63d02a8 commit 87066a5

10 files changed

Lines changed: 1247 additions & 50 deletions

app-config.yaml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,3 @@ catalog:
311311
# kubernetes:
312312
# see https://backstage.io/docs/features/kubernetes/configuration for kubernetes configuration options
313313
# see https://backstage.io/docs/permissions/getting-started for more on the permission framework
314-
315-
## setting this to `false` will disable permissions
316-
permission:
317-
enabled: true

packages/backend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"@backstage/plugin-auth-node": "^0.5.2",
3737
"@backstage/plugin-catalog-backend": "^1.26.0",
3838
"@backstage/plugin-catalog-backend-module-github": "^0.7.3",
39+
"@backstage/plugin-catalog-backend-module-github-org": "^0.3.10",
3940
"@backstage/plugin-catalog-backend-module-logs": "^0.1.0",
4041
"@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "^0.2.0",
4142
"@backstage/plugin-kubernetes-backend": "^0.18.6",

packages/backend/src/index.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import { createBackendModule } from '@backstage/backend-plugin-api';
44

55
import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha';
66
import { createMicroserviceAction } from './plugins/sourceloop-ms';
7+
import { createExtensionAction } from './plugins/sourceloop-extension';
78
import { createScaffoldAction } from './plugins/sourceloop-scaffold';
89
import { modifyIaCModules } from './plugins/iac-scaffold';
910
import { deleteDirectory } from './plugins/iac-scaffold';
1011

11-
1212
const scaffolderModuleCustomExtensions = createBackendModule({
1313
pluginId: 'scaffolder', // name of the plugin that the module is targeting
1414
moduleId: 'arc-microservice',
@@ -21,6 +21,7 @@ const scaffolderModuleCustomExtensions = createBackendModule({
2121
scaffolder.addActions(
2222
createMicroserviceAction(),
2323
createScaffoldAction(),
24+
createExtensionAction(),
2425
modifyIaCModules(),
2526
deleteDirectory()
2627
);
@@ -30,6 +31,7 @@ const scaffolderModuleCustomExtensions = createBackendModule({
3031
});
3132

3233

34+
3335
const backend = createBackend();
3436

3537
backend.add(import('@backstage/plugin-app-backend/alpha'));
@@ -48,10 +50,6 @@ backend.add(import('./extensions/catalogPermissionRules'));
4850
// See https://backstage.io/docs/features/software-catalog/configuration#subscribing-to-catalog-errors
4951
backend.add(import('@backstage/plugin-catalog-backend-module-logs'));
5052

51-
// permission plugin
52-
backend.add(import('@backstage/plugin-permission-backend/alpha'));
53-
backend.add(import('./plugins/permission'));
54-
5553
// search plugin
5654
backend.add(import('@backstage/plugin-search-backend/alpha'));
5755
// search engine
@@ -72,4 +70,5 @@ backend.add(import('@backstage-community/plugin-jenkins-backend'));
7270
backend.add(
7371
import('@internal/backstage-plugin-jenkins-with-reporting-backend-backend'),
7472
);
73+
7574
backend.start();

packages/backend/src/plugins/sourceloop-extension.ts

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,27 @@ import { createTemplateAction } from '@backstage/plugin-scaffolder-node';
44
import * as utils from '../utility';
55

66
export function createExtensionAction() {
7-
return createTemplateAction({
8-
id: 'run:extension',
9-
description: 'Create all the provided extension',
10-
schema: {
11-
input: {
12-
type: 'object',
13-
required: ['extensions'],
14-
properties: {
15-
extensions: {
16-
title: 'Extension List',
17-
description: 'List of the extensions to generate',
18-
type: 'array',
7+
8+
return createTemplateAction<{
9+
command: string;
10+
}>({
11+
id: 'run:extension',
12+
description: 'Create all the provided extension',
13+
schema: {
14+
input: {
15+
type: 'object',
16+
required: ['extensions'],
17+
properties: {
18+
extensions: {
19+
title: 'Extension List',
20+
description: 'List of the extensions to generate',
21+
type: 'array',
22+
},
23+
},
1924
},
20-
},
21-
},
2225
},
2326
async handler(ctx: any) { // NOSONAR
24-
27+
ctx.logger.info('Running extension command', ctx.input, ctx.input.command);
2528
const extensions = ctx.input.extensions;
2629
const cwd=ctx.workspacePath;
2730
if (extensions) {

packages/backend/src/plugins/sourceloop-ms.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ export function createMicroserviceAction() {
6262
process.chdir(cwd);
6363
if (sourceloop) {
6464
ctx.logger.info(`Generating service based on ${service}`);
65+
try{
6566
await utils.runWithEnv(env, 'microservice', [service, '-y'], {
6667
uniquePrefix: prefix,
6768
baseService: service,
@@ -75,10 +76,16 @@ export function createMicroserviceAction() {
7576
...utils.buildOptions,
7677
}),
7778
});
79+
} catch (e) {
80+
ctx.logger.error(`Error generating service based on ${service}`, e);
81+
ctx.logger.error(`Error: ${e}`);
82+
process.chdir(originalCwd);
83+
}
7884
ctx.logger.info('Done');
7985
} else {
8086
if(facade) {
8187
ctx.logger.info(`Generating facade: ${service}`);
88+
try{
8289
await utils.runWithEnv(env, 'microservice', [service.name, '-y'], {
8390
uniquePrefix: prefix,
8491
facade: true,
@@ -88,9 +95,15 @@ export function createMicroserviceAction() {
8895
...utils.buildOptions,
8996
}),
9097
});
98+
} catch (e) {
99+
ctx.logger.error(`Error generating facade: ${service}`, e);
100+
ctx.logger.error(`Error: ${e}`);
101+
process.chdir(originalCwd);
102+
}
91103
ctx.logger.info(`Done generating facade: ${service}`);
92104
} else {
93105
ctx.logger.info(`Generating microservice: ${service.name}`);
106+
try{
94107
await utils.runWithEnv(env, 'microservice', [service.name, '-y'], {
95108
uniquePrefix: prefix,
96109
datasourceType: databaseType,
@@ -102,6 +115,12 @@ export function createMicroserviceAction() {
102115
...utils.buildOptions,
103116
}),
104117
});
118+
}
119+
catch (e) {
120+
ctx.logger.error(`Error generating microservice: ${service.name}`, e);
121+
ctx.logger.error(`Error: ${e}`);
122+
process.chdir(originalCwd);
123+
}
105124
ctx.logger.info(`Done generating microservice: ${service.name}`);
106125
}
107126
}

packages/backend/src/plugins/sourceloop-scaffold.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export function createScaffoldAction() {
3636
},
3737
},
3838
async handler(ctx: any) { // NOSONAR
39+
3940
const { signal } = ctx;
4041
ctx.logger.info(`Templating using Yeoman generator: ${ctx.input.name}`);
4142

@@ -47,6 +48,7 @@ export function createScaffoldAction() {
4748
const description=ctx.input.description;
4849
const env = utils.getEnv(cwd, 'scaffold');
4950
const originalCwd = process.cwd();
51+
try {
5052
console.log("originalCwd -------",originalCwd);
5153
process.chdir(cwd);
5254
console.log("new workspacepath cwd -------",cwd);
@@ -58,15 +60,24 @@ export function createScaffoldAction() {
5860
description,
5961
integrateWithBackstage: true,
6062
});
63+
64+
} catch (e) {
65+
console.log("error in scaffold action -------",e);
66+
ctx.logger.error(`Error: ${e}`);
6167
process.chdir(originalCwd);
62-
console.log("again updated to originalCwd-------",originalCwd);
68+
}
69+
process.chdir(originalCwd);
70+
console.log("updated to originalCwd-------",originalCwd);
6371
await mkdir(`${ctx.workspacePath}/.github/workflows`,()=>{});
6472
await writeFile(
6573
`${ctx.workspacePath}/.github/workflows/build-image.yaml`,
6674
GITHUB_DOCKER_BUILD_ACTION,
6775
{ signal },
6876
_ => {},
6977
);
78+
79+
7080
},
81+
7182
});
7283
}
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
diff --git a/node_modules/@backstage/plugin-auth-node/dist/index.cjs.js b/node_modules/@backstage/plugin-auth-node/dist/index.cjs.js
2+
index d19613e..3a4bfa1 100644
3+
--- a/node_modules/@backstage/plugin-auth-node/dist/index.cjs.js
4+
+++ b/node_modules/@backstage/plugin-auth-node/dist/index.cjs.js
5+
@@ -7,6 +7,7 @@ var jose = require('jose');
6+
var url = require('url');
7+
var pickBy = require('lodash/pickBy');
8+
var zodToJsonSchema = require('zod-to-json-schema');
9+
+var {stringifyEntityRef} = require('@backstage/catalog-model');
10+
11+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
12+
13+
@@ -857,39 +858,93 @@ function createSignInResolverFactory(options) {
14+
return factory;
15+
}
16+
17+
-function readDeclarativeSignInResolver(options) {
18+
- const resolvers = options.config.getOptionalConfigArray("signIn.resolvers")?.map((resolverConfig) => {
19+
- const resolverName = resolverConfig.getString("resolver");
20+
- if (!Object.hasOwn(options.signInResolverFactories, resolverName)) {
21+
- throw new Error(
22+
- `Sign-in resolver '${resolverName}' is not available`
23+
+const getUserEntity = async (info, ctx) => {
24+
+ const { fullProfile } = info.result;
25+
+ const userId = fullProfile.username;
26+
+ if (!userId) {
27+
+ throw new Error(`GitHub user profile does not contain a username`);
28+
+ }
29+
+
30+
+ const userEntity = stringifyEntityRef({
31+
+ kind: "User",
32+
+ name: userId,
33+
+ namespace:"default"
34+
+
35+
+ });
36+
+ return ctx.issueToken({
37+
+ claims: {
38+
+ sub: userEntity,
39+
+ ent: [userEntity],
40+
+ }
41+
+ });
42+
+ };
43+
+
44+
+ function readDeclarativeSignInResolver(options) {
45+
+ const resolvers = options.config.getOptionalConfigArray("signIn.resolvers")?.map((resolverConfig) => {
46+
+ const resolverName = resolverConfig.getString("resolver");
47+
+ if (!Object.hasOwn(options.signInResolverFactories, resolverName)) {
48+
+ throw new Error(
49+
+ `Sign-in resolver '${resolverName}' is not available`
50+
+ );
51+
+ }
52+
+ const resolver = options.signInResolverFactories[resolverName];
53+
+ const { resolver: _ignored, ...resolverOptions } = resolverConfig.get();
54+
+ return resolver(
55+
+ Object.keys(resolverOptions).length > 0 ? resolverOptions : void 0
56+
);
57+
+ }) ?? [];
58+
+ if (resolvers.length === 0) {
59+
+ return void 0;
60+
}
61+
- const resolver = options.signInResolverFactories[resolverName];
62+
- const { resolver: _ignored, ...resolverOptions } = resolverConfig.get();
63+
- return resolver(
64+
- Object.keys(resolverOptions).length > 0 ? resolverOptions : void 0
65+
- );
66+
- }) ?? [];
67+
- if (resolvers.length === 0) {
68+
- return void 0;
69+
- }
70+
- return async (profile, context) => {
71+
- for (const resolver of resolvers) {
72+
- try {
73+
- return await resolver(profile, context);
74+
- } catch (error) {
75+
- if (error?.name === "NotFoundError") {
76+
- continue;
77+
+ return async (profile, context) => {
78+
+ for (const resolver of resolvers) {
79+
+ try {
80+
+ return await getUserEntity(profile, context);
81+
+ } catch (error) {
82+
+ if (error?.name === "NotFoundError") {
83+
+ console.log ('resolver error---------------',error, error?.name);
84+
+ continue;
85+
+ }
86+
+ throw error;
87+
}
88+
- throw error;
89+
}
90+
- }
91+
- throw new Error(
92+
- "Failed to sign-in, unable to resolve user identity. Please verify that your catalog contains the expected User entities that would match your configured sign-in resolver."
93+
- );
94+
- };
95+
-}
96+
+ throw new Error("Failed to sign-in, unable to resolve user identity");
97+
+ };
98+
+ }
99+
+
100+
+// function readDeclarativeSignInResolver(options) {
101+
+// const resolvers = options.config.getOptionalConfigArray("signIn.resolvers")?.map((resolverConfig) => {
102+
+// const resolverName = resolverConfig.getString("resolver");
103+
+// if (!Object.hasOwn(options.signInResolverFactories, resolverName)) {
104+
+// throw new Error(
105+
+// `Sign-in resolver '${resolverName}' is not available`
106+
+// );
107+
+// }
108+
+// const resolver = options.signInResolverFactories[resolverName];
109+
+// const { resolver: _ignored, ...resolverOptions } = resolverConfig.get();
110+
+// return resolver(
111+
+// Object.keys(resolverOptions).length > 0 ? resolverOptions : void 0
112+
+// );
113+
+// }) ?? [];
114+
+// if (resolvers.length === 0) {
115+
+// return void 0;
116+
+// }
117+
+// return async (profile, context) => {
118+
+// for (const resolver of resolvers) {
119+
+// try {
120+
+// return await resolver(profile, context);
121+
+// } catch (error) {
122+
+// if (error?.name === "NotFoundError") {
123+
+// continue;
124+
+// }
125+
+// throw error;
126+
+// }
127+
+// }
128+
+// throw new Error(
129+
+// "Failed to sign-in, unable to resolve user identity. Please verify that your catalog contains the expected User entities that would match your configured sign-in resolver."
130+
+// );
131+
+// };
132+
+// }
133+
134+
const reEmail = /^([^@+]+)(\+[^@]+)?(@.*)$/;
135+
exports.commonSignInResolvers = void 0;

0 commit comments

Comments
 (0)