diff --git a/apps/meteor/app/integrations/server/methods/incoming/addIncomingIntegration.ts b/apps/meteor/app/integrations/server/methods/incoming/addIncomingIntegration.ts index b755317c06945..869a2fc4c9121 100644 --- a/apps/meteor/app/integrations/server/methods/incoming/addIncomingIntegration.ts +++ b/apps/meteor/app/integrations/server/methods/incoming/addIncomingIntegration.ts @@ -84,12 +84,22 @@ export const addIncomingIntegration = async (userId: string, integration: INewIn const user = await Users.findOneByUsername(integration.username, { projection: { _id: 1 } }); - if (!user || !(await hasPermissionAsync(user._id, 'message-impersonate'))) { + if (!user) { throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'addIncomingIntegration', }); } + if (!(await hasPermissionAsync(user._id, 'message-impersonate'))) { + throw new Meteor.Error( + 'error-user-lacks-message-impersonate-permission', + "User selected for the incoming integration lacks the 'message-impersonate' permission.", + { + method: 'addIncomingIntegration', + }, + ); + } + // Default to transpiling with Babel for backwards compatibility; integrations // can opt-out per-record by setting `skipTranspile: true` (removed in 9.0.0). const skipTranspile = integration.skipTranspile === true; diff --git a/apps/meteor/app/integrations/server/methods/incoming/updateIncomingIntegration.ts b/apps/meteor/app/integrations/server/methods/incoming/updateIncomingIntegration.ts index eabc9e56a8372..ba5155e64fc4c 100644 --- a/apps/meteor/app/integrations/server/methods/incoming/updateIncomingIntegration.ts +++ b/apps/meteor/app/integrations/server/methods/incoming/updateIncomingIntegration.ts @@ -145,12 +145,22 @@ export const updateIncomingIntegration = async ( const username = 'username' in integration ? integration.username : currentIntegration.username; const user = await Users.findOneByUsername(username, { projection: { _id: 1, username: 1 } }); - if (!user || !(await hasPermissionAsync(user._id, 'message-impersonate'))) { + if (!user) { throw new Meteor.Error('error-invalid-post-as-user', 'Invalid Post As User', { method: 'updateIncomingIntegration', }); } + if (!(await hasPermissionAsync(user._id, 'message-impersonate'))) { + throw new Meteor.Error( + 'error-user-lacks-message-impersonate-permission', + "User selected for the incoming integration lacks the 'message-impersonate' permission.", + { + method: 'updateIncomingIntegration', + }, + ); + } + const updatedIntegration = await Integrations.findOneAndUpdate( { _id: integrationId }, { diff --git a/apps/meteor/tests/end-to-end/api/incoming-integrations.ts b/apps/meteor/tests/end-to-end/api/incoming-integrations.ts index 151ffe79f6f35..faa157bfd041b 100644 --- a/apps/meteor/tests/end-to-end/api/incoming-integrations.ts +++ b/apps/meteor/tests/end-to-end/api/incoming-integrations.ts @@ -227,7 +227,10 @@ describe('[Incoming Integrations]', () => { .expect(400) .expect((res) => { expect(res.body).to.have.property('success', false); - expect(res.body).to.have.property('error', 'Invalid user [error-invalid-user]'); + expect(res.body).to.have.property( + 'error', + "User selected for the incoming integration lacks the 'message-impersonate' permission. [error-user-lacks-message-impersonate-permission]", + ); }); }); }); @@ -965,7 +968,10 @@ describe('[Incoming Integrations]', () => { }) .expect((res) => { expect(res.body).to.have.property('success', false); - expect(res.body).to.have.property('error', 'Invalid Post As User [error-invalid-post-as-user]'); + expect(res.body).to.have.property( + 'error', + "User selected for the incoming integration lacks the 'message-impersonate' permission. [error-user-lacks-message-impersonate-permission]", + ); }); }); diff --git a/packages/i18n/src/locales/en.i18n.json b/packages/i18n/src/locales/en.i18n.json index b29ec32dc1295..ebe586a20a676 100644 --- a/packages/i18n/src/locales/en.i18n.json +++ b/packages/i18n/src/locales/en.i18n.json @@ -6490,6 +6490,7 @@ "error-user-is-not-activated": "User is not activated", "error-user-is-not-agent": "User is not an Omnichannel Agent", "error-user-is-offline": "User is offline", + "error-user-lacks-message-impersonate-permission": "User selected for the incoming integration lacks the 'message-impersonate' permission.", "error-user-limit-exceeded": "The number of users you are trying to invite to #channel_name exceeds the limit set by the administrator", "error-user-not-belong-to-department": "User does not belong to this department", "error-user-not-found": "User not found",