Skip to content

Commit 4a4db68

Browse files
Merge pull request #1969 from OpenSignLabs/updates-18129802734
v2.29.1
2 parents 4146680 + 870973e commit 4a4db68

File tree

5 files changed

+674
-592
lines changed

5 files changed

+674
-592
lines changed

apps/OpenSign/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@
3636
"react-dom": "^18.3.1",
3737
"react-gtm-module": "^2.0.11",
3838
"react-helmet": "^6.1.0",
39-
"react-i18next": "^15.7.3",
39+
"react-i18next": "^15.7.4",
4040
"react-konva": "^18.2.12",
4141
"react-pdf": "^9.2.1",
4242
"react-quill-new": "^3.6.0",
4343
"react-redux": "^9.2.0",
4444
"react-rnd": "^10.5.2",
45-
"react-router": "^7.9.1",
45+
"react-router": "^7.9.3",
4646
"react-scrollbars-custom": "^4.1.1",
4747
"react-select": "^5.10.2",
4848
"react-signature-canvas": "^1.1.0-alpha.2",

apps/OpenSign/src/pages/UserList.jsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,11 @@ const UserList = () => {
253253
};
254254
const handleBtnVisibility = (act, item) => {
255255
if (act.restrictAdmin) {
256-
return item?.objectId !== extClass?.[0]?.objectId;
256+
if (item?.UserRole === "contracts_Admin") {
257+
return false;
258+
} else {
259+
return item?.objectId !== extClass?.[0]?.objectId;
260+
}
257261
} else if (
258262
act.restrictBtn === true &&
259263
item?.objectId === extClass?.[0]?.objectId
@@ -263,6 +267,13 @@ const UserList = () => {
263267
return true;
264268
}
265269
};
270+
const handleActiveToggleVisibility = (item) => {
271+
if (item?.UserRole === "contracts_Admin") {
272+
return false;
273+
} else {
274+
return item?.objectId !== extClass?.[0]?.objectId;
275+
}
276+
};
266277
return (
267278
<div className="relative">
268279
{isLoader && (
@@ -340,7 +351,7 @@ const UserList = () => {
340351
<td className="px-4 py-2">
341352
{formatRow(item.TeamIds)}
342353
</td>
343-
{item.UserRole !== "contracts_Admin" ? (
354+
{handleActiveToggleVisibility(item) ? (
344355
<td className="px-4 py-2 font-semibold">
345356
<label className="cursor-pointer relative block items-center mb-0">
346357
<input

apps/OpenSignServer/cloud/customRoute/deleteAccount/deleteUser.js

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const resetPasswordAndDeleteSession = async userId => {
3232
await Parse.Object.destroyAll(sessions, { useMasterKey: true });
3333
}
3434
};
35-
export async function deleteUser(userId, adminId) {
35+
export async function deleteUser(userId, adminId, adminTenantId, isOrgAdmin, orgPtr) {
3636
const userPointer = { __type: 'Pointer', className: '_User', objectId: userId };
3737
let userDetails = {
3838
UserRole: 'not found',
@@ -47,20 +47,29 @@ export async function deleteUser(userId, adminId) {
4747
const Users = Parse.Object.extend('contracts_Users');
4848
const userQuery = new Parse.Query(Users);
4949
userQuery.equalTo('UserId', userPointer);
50-
if (adminId) {
50+
if (adminTenantId) {
51+
userQuery.equalTo('TenantId', adminTenantId);
52+
if (isOrgAdmin && orgPtr) {
53+
userQuery.equalTo('OrganizationId', orgPtr);
54+
}
55+
} else if (adminId) {
5156
userQuery.equalTo('CreatedBy', { __type: 'Pointer', className: '_User', objectId: adminId });
5257
}
5358
const userResult = await userQuery.first({ useMasterKey: true });
5459
userDetails = { ...userDetails, UserId: userId };
5560
if (!userResult) {
56-
const errorMessage = 'User not found.';
61+
const errorMessage = isOrgAdmin ? 'Unauthorized.' : 'User not found.';
5762
return { code: 400, message: errorMessage };
5863
}
5964
const contractsUserId = userResult.id;
6065
const tenantId = userResult.get('TenantId')?.id;
6166
const teamIds = userResult.get('TeamIds') || [];
6267
const organizationId = userResult.get('OrganizationId')?.id;
6368
const isAdmin = userResult?.get('UserRole') === 'contracts_Admin' ? true : false;
69+
if (isOrgAdmin && isAdmin) {
70+
const errorMessage = 'Unauthorized.';
71+
return { code: 400, message: errorMessage };
72+
}
6473
userDetails = {
6574
...userDetails,
6675
UserRole: userResult?.get('UserRole'),
@@ -267,6 +276,21 @@ export const deleteUserPost = async (req, res) => {
267276
return res.send(errorMessage);
268277
}
269278

279+
if (extUser?.get('UserRole') !== 'contracts_Admin') {
280+
const errorMessage =
281+
'This action is not permitted. Kindly contact your administrator to request account deletion.';
282+
return res.send(errorMessage);
283+
}
284+
285+
const extUsers = new Parse.Query('contracts_Users');
286+
extUsers.equalTo('TenantId', extUser?.get('TenantId'));
287+
extUsers.notEqualTo('UserRole', 'contracts_Admin');
288+
const isTeamUsers = await extUsers.first({ useMasterKey: true });
289+
if (isTeamUsers) {
290+
const errorMessage = `To delete this account, start by removing all team users associated with it. Once all users are removed, you'll be able to permanently delete the account.`;
291+
return res.send(errorMessage);
292+
}
293+
270294
// Get stored OTP info
271295
const savedOtp = extUser.get('DeleteOTP') || '';
272296
const expiry = extUser.get('DeleteOTPExpiry');
@@ -352,7 +376,30 @@ export const deleteUserByAdmin = async (req, res) => {
352376
const errorMessage = 'User not found.';
353377
return res.status(400).json({ message: errorMessage });
354378
}
355-
const response = await deleteUser(userId, adminId);
379+
380+
if (adminId === userId) {
381+
return res.status(400).json({ message: 'You cannot delete your own account.' });
382+
}
383+
// 2. ext user details
384+
const extUserQuery = new Parse.Query('contracts_Users');
385+
extUserQuery.equalTo('UserId', { __type: 'Pointer', className: '_User', objectId: adminId });
386+
const extUser = await extUserQuery.first({ useMasterKey: true });
387+
if (!extUser) {
388+
const errorMessage = 'User not found.';
389+
return res.status(400).json({ message: errorMessage });
390+
}
391+
const isAdmin =
392+
extUser?.get('UserRole') === 'contracts_Admin' ||
393+
extUser?.get('UserRole') === 'contracts_OrgAdmin'
394+
? true
395+
: false;
396+
const isOrgAdmin = extUser?.get('UserRole') === 'contracts_OrgAdmin';
397+
const tenantId = extUser?.get('TenantId');
398+
const orgPtr = isOrgAdmin && extUser?.get('OrganizationId');
399+
if (!isAdmin) {
400+
return res.status(400).json({ message: 'Unauthorized.' });
401+
}
402+
const response = await deleteUser(userId, adminId, tenantId, isOrgAdmin, orgPtr);
356403
const code = response?.code || 400;
357404
const message = response?.message || 'An error occurred while deleting your account.';
358405
return res.status(code).json({ message: message });

0 commit comments

Comments
 (0)