Skip to content

Commit

Permalink
fix: add missing route guards to issues pages (#2235)
Browse files Browse the repository at this point in the history
* fix: users should always be able to view their own issues

* fix: apply route guards to issues pages instead

* fix(api): only allow users w/ issue perms to edit comments / delete issues
  • Loading branch information
TheCatLady committed Oct 31, 2021
1 parent 3ec4a9c commit c79dc9f
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 27 deletions.
58 changes: 32 additions & 26 deletions server/routes/issue.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ issueRoutes.get<Record<string, string>, IssueResultsResponse>(
return next({
status: 403,
message:
'You do not have permission to view issues created by other users',
'You do not have permission to view issues reported by other users',
});
}
query = query.andWhere('createdBy.id = :id', { id: req.user?.id });
Expand Down Expand Up @@ -291,35 +291,41 @@ issueRoutes.post<{ issueId: string; status: string }, Issue>(
}
);

issueRoutes.delete('/:issueId', async (req, res, next) => {
const issueRepository = getRepository(Issue);

try {
const issue = await issueRepository.findOneOrFail({
where: { id: Number(req.params.issueId) },
relations: ['createdBy'],
});
issueRoutes.delete(
'/:issueId',
isAuthenticated([Permission.MANAGE_ISSUES, Permission.CREATE_ISSUES], {
type: 'or',
}),
async (req, res, next) => {
const issueRepository = getRepository(Issue);

if (
!req.user?.hasPermission(Permission.MANAGE_ISSUES) &&
(issue.createdBy.id !== req.user?.id || issue.comments.length > 1)
) {
return next({
status: 401,
message: 'You do not have permission to delete this issue.',
try {
const issue = await issueRepository.findOneOrFail({
where: { id: Number(req.params.issueId) },
relations: ['createdBy'],
});
}

await issueRepository.remove(issue);
if (
!req.user?.hasPermission(Permission.MANAGE_ISSUES) &&
(issue.createdBy.id !== req.user?.id || issue.comments.length > 1)
) {
return next({
status: 401,
message: 'You do not have permission to delete this issue.',
});
}

return res.status(204).send();
} catch (e) {
logger.error('Something went wrong deleting an issue.', {
label: 'API',
errorMessage: e.message,
});
next({ status: 404, message: 'Issue not found.' });
await issueRepository.remove(issue);

return res.status(204).send();
} catch (e) {
logger.error('Something went wrong deleting an issue.', {
label: 'API',
errorMessage: e.message,
});
next({ status: 404, message: 'Issue not found.' });
}
}
});
);

export default issueRoutes;
19 changes: 18 additions & 1 deletion server/routes/request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -500,9 +500,26 @@ requestRoutes.get('/:requestId', async (req, res, next) => {
relations: ['requestedBy', 'modifiedBy'],
});

if (
request.requestedBy.id !== req.user?.id &&
!req.user?.hasPermission(
[Permission.MANAGE_REQUESTS, Permission.REQUEST_VIEW],
{ type: 'or' }
)
) {
return next({
status: 403,
message: 'You do not have permission to view this request.',
});
}

return res.status(200).json(request);
} catch (e) {
next({ status: 404, message: 'Request not found' });
logger.debug('Failed to retrieve request.', {
label: 'API',
errorMessage: e.message,
});
next({ status: 404, message: 'Request not found.' });
}
});

Expand Down
12 changes: 12 additions & 0 deletions src/pages/issues/[issueId]/index.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,20 @@
import { NextPage } from 'next';
import React from 'react';
import IssueDetails from '../../../components/IssueDetails';
import useRouteGuard from '../../../hooks/useRouteGuard';
import { Permission } from '../../../hooks/useUser';

const IssuePage: NextPage = () => {
useRouteGuard(
[
Permission.MANAGE_ISSUES,
Permission.CREATE_ISSUES,
Permission.VIEW_ISSUES,
],
{
type: 'or',
}
);
return <IssueDetails />;
};

Expand Down
12 changes: 12 additions & 0 deletions src/pages/issues/index.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,20 @@
import { NextPage } from 'next';
import React from 'react';
import IssueList from '../../components/IssueList';
import useRouteGuard from '../../hooks/useRouteGuard';
import { Permission } from '../../hooks/useUser';

const IssuePage: NextPage = () => {
useRouteGuard(
[
Permission.MANAGE_ISSUES,
Permission.CREATE_ISSUES,
Permission.VIEW_ISSUES,
],
{
type: 'or',
}
);
return <IssueList />;
};

Expand Down

0 comments on commit c79dc9f

Please sign in to comment.