From e59cec0e697e15de7b155dfde74767898058a1b6 Mon Sep 17 00:00:00 2001 From: ajie Date: Fri, 28 Mar 2025 11:00:29 +0800 Subject: [PATCH 01/15] fix: incorrect current role assignment during login (#6581) * fix: incorrect current role assignment during login --- .../src/server/__tests__/union-role.test.ts | 37 +++++++++++++++++-- .../src/server/middlewares/setCurrentRole.ts | 7 ++-- .../desktopRoutes-union-role.test.ts | 6 +++ .../__tests__/union-role-mobileRoutes.test.ts | 6 ++- 4 files changed, 48 insertions(+), 8 deletions(-) diff --git a/packages/plugins/@nocobase/plugin-acl/src/server/__tests__/union-role.test.ts b/packages/plugins/@nocobase/plugin-acl/src/server/__tests__/union-role.test.ts index 36ad2cbf17..53758c0d25 100644 --- a/packages/plugins/@nocobase/plugin-acl/src/server/__tests__/union-role.test.ts +++ b/packages/plugins/@nocobase/plugin-acl/src/server/__tests__/union-role.test.ts @@ -51,7 +51,11 @@ describe('union role: full permissions', async () => { roles: [role1.name, role2.name], }, }); - + await rootAgent.resource('roles').setSystemRoleMode({ + values: { + roleMode: SystemRoleMode.allowUseUnion, + }, + }); agent = await app.agent().login(user, UNION_ROLE_KEY); }); @@ -415,15 +419,15 @@ describe('union role: full permissions', async () => { const rootAgent = await app.agent().login(rootUser); let rolesResponse = await agent.resource('roles').check(); expect(rolesResponse.status).toBe(200); - expect(rolesResponse.body.data.roleMode).toStrictEqual(SystemRoleMode.default); + expect(rolesResponse.body.data.roleMode).toStrictEqual(SystemRoleMode.allowUseUnion); await rootAgent.resource('roles').setSystemRoleMode({ values: { - roleMode: SystemRoleMode.allowUseUnion, + roleMode: SystemRoleMode.default, }, }); rolesResponse = await agent.resource('roles').check(); expect(rolesResponse.status).toBe(200); - expect(rolesResponse.body.data.roleMode).toStrictEqual(SystemRoleMode.allowUseUnion); + expect(rolesResponse.body.data.roleMode).toStrictEqual(SystemRoleMode.default); }); it(`should response no permission when createdById field is missing in data tables`, async () => { @@ -501,4 +505,29 @@ describe('union role: full permissions', async () => { expect(getRolesResponse.statusCode).toBe(200); expect(getRolesResponse.body.meta.allowedActions.update.length).toBe(0); }); + + it('should login successfully when use __union__ role in allowUseUnion mode #1906', async () => { + const rootAgent = await app.agent().login(rootUser); + await rootAgent.resource('roles').setSystemRoleMode({ + values: { + roleMode: SystemRoleMode.allowUseUnion, + }, + }); + agent = await app.agent().login(user); + const createRoleResponse = await agent.resource('roles').check(); + expect(createRoleResponse.statusCode).toBe(200); + }); + + it('should currentRole not be __union__ when default role mode #1907', async () => { + const rootAgent = await app.agent().login(rootUser); + await rootAgent.resource('roles').setSystemRoleMode({ + values: { + roleMode: SystemRoleMode.default, + }, + }); + agent = await app.agent().login(user, UNION_ROLE_KEY); + const createRoleResponse = await agent.resource('roles').check(); + expect(createRoleResponse.statusCode).toBe(200); + expect(createRoleResponse.body.data.role).not.toBe(UNION_ROLE_KEY); + }); }); diff --git a/packages/plugins/@nocobase/plugin-acl/src/server/middlewares/setCurrentRole.ts b/packages/plugins/@nocobase/plugin-acl/src/server/middlewares/setCurrentRole.ts index 49b8acaf14..626a6d5c9c 100644 --- a/packages/plugins/@nocobase/plugin-acl/src/server/middlewares/setCurrentRole.ts +++ b/packages/plugins/@nocobase/plugin-acl/src/server/middlewares/setCurrentRole.ts @@ -14,7 +14,7 @@ import { UNION_ROLE_KEY } from '../constants'; import { SystemRoleMode } from '../enum'; export async function setCurrentRole(ctx: Context, next) { - const currentRole = ctx.get('X-Role'); + let currentRole = ctx.get('X-Role'); if (currentRole === 'anonymous') { ctx.state.currentRole = currentRole; @@ -49,7 +49,8 @@ export async function setCurrentRole(ctx: Context, next) { ctx.state.currentUser.roles = userRoles; const systemSettings = await ctx.db.getRepository('systemSettings').findOne(); const roleMode = systemSettings?.get('roleMode') || SystemRoleMode.default; - if (ctx.state.currentRole === UNION_ROLE_KEY && roleMode === SystemRoleMode.default) { + if ([currentRole, ctx.state.currentRole].includes(UNION_ROLE_KEY) && roleMode === SystemRoleMode.default) { + currentRole = userRoles[0].name; ctx.state.currentRole = userRoles[0].name; ctx.headers['x-role'] = userRoles[0].name; } else if (roleMode === SystemRoleMode.onlyUseUnion) { @@ -85,7 +86,7 @@ export async function setCurrentRole(ctx: Context, next) { // 2. If the X-Role is not set, or the X-Role does not belong to the user, use the default role if (!role) { const defaultRole = userRoles.find((role) => role?.rolesUsers?.default); - role = (defaultRole || userRoles[0])?.name; + role = (defaultRole || userRoles.find((x) => x.name !== UNION_ROLE_KEY))?.name; } ctx.state.currentRole = role; ctx.state.currentRoles = [role]; diff --git a/packages/plugins/@nocobase/plugin-client/src/server/__tests__/desktopRoutes-union-role.test.ts b/packages/plugins/@nocobase/plugin-client/src/server/__tests__/desktopRoutes-union-role.test.ts index 2d57e70cec..cddc03e9db 100644 --- a/packages/plugins/@nocobase/plugin-client/src/server/__tests__/desktopRoutes-union-role.test.ts +++ b/packages/plugins/@nocobase/plugin-client/src/server/__tests__/desktopRoutes-union-role.test.ts @@ -55,6 +55,12 @@ describe('Web client desktopRoutes', async () => { }, }); + await rootAgent.resource('roles').setSystemRoleMode({ + values: { + roleMode: SystemRoleMode.allowUseUnion, + }, + }); + agent = await app.agent().login(user, UNION_ROLE_KEY); }); diff --git a/packages/plugins/@nocobase/plugin-mobile/src/server/__tests__/union-role-mobileRoutes.test.ts b/packages/plugins/@nocobase/plugin-mobile/src/server/__tests__/union-role-mobileRoutes.test.ts index b1930b8629..a66cbc73a4 100644 --- a/packages/plugins/@nocobase/plugin-mobile/src/server/__tests__/union-role-mobileRoutes.test.ts +++ b/packages/plugins/@nocobase/plugin-mobile/src/server/__tests__/union-role-mobileRoutes.test.ts @@ -54,7 +54,11 @@ describe('union role mobileRoutes', async () => { roles: [role1.name, role2.name], }, }); - + await rootAgent.resource('roles').setSystemRoleMode({ + values: { + roleMode: SystemRoleMode.allowUseUnion, + }, + }); agent = await app.agent().login(user, UNION_ROLE_KEY); }); From 1b782c4f952fba2e45a05c63f67d8576c16da590 Mon Sep 17 00:00:00 2001 From: chenos Date: Fri, 28 Mar 2025 11:01:20 +0800 Subject: [PATCH 02/15] refactor: async tasks (#6531) * refactor: async tasks * refactor: selectWithTitle support optionRender * refactor: adjust export filename * fix: build error * fix: export file name --------- Co-authored-by: katherinehhh --- .../client/src/common/SelectWithTitle.tsx | 10 +- .../src/schema-settings/SchemaSettings.tsx | 5 +- .../src/client/AsyncTaskManagerProvider.tsx | 188 ++----------- .../src/client/components/AsyncTasks.tsx | 249 ++++++++++-------- .../src/server/plugin.ts | 19 +- .../src/server/resourcers/async-tasks.ts | 47 +++- 6 files changed, 220 insertions(+), 298 deletions(-) diff --git a/packages/core/client/src/common/SelectWithTitle.tsx b/packages/core/client/src/common/SelectWithTitle.tsx index 4bd43648a3..b3e0be59a8 100644 --- a/packages/core/client/src/common/SelectWithTitle.tsx +++ b/packages/core/client/src/common/SelectWithTitle.tsx @@ -18,7 +18,14 @@ export interface SelectWithTitleProps { onChange?: (...args: any[]) => void; } -export function SelectWithTitle({ title, defaultValue, onChange, options, fieldNames }: SelectWithTitleProps) { +export function SelectWithTitle({ + title, + defaultValue, + onChange, + options, + fieldNames, + ...others +}: SelectWithTitleProps) { const [open, setOpen] = useState(false); const timerRef = useRef(null); return ( @@ -36,6 +43,7 @@ export function SelectWithTitle({ title, defaultValue, onChange, options, fieldN > {title}