fix: Disable 'Invite people…' control for non-admins (#1903)

closes #1902
This commit is contained in:
Tom Moor
2021-02-18 23:35:55 -08:00
committed by GitHub
parent fae54c7957
commit bbf434e2f4
4 changed files with 46 additions and 29 deletions

View File

@ -171,6 +171,7 @@ function MainSidebar() {
</Section> </Section>
</Secondary> </Secondary>
</Flex> </Flex>
{can.invite && (
<Modal <Modal
title={t("Invite people")} title={t("Invite people")}
onRequestClose={handleInviteModalClose} onRequestClose={handleInviteModalClose}
@ -178,6 +179,7 @@ function MainSidebar() {
> >
<Invite onSubmit={handleInviteModalClose} /> <Invite onSubmit={handleInviteModalClose} />
</Modal> </Modal>
)}
<Modal <Modal
title={t("Create a collection")} title={t("Create a collection")}
onRequestClose={handleCreateCollectionModalClose} onRequestClose={handleCreateCollectionModalClose}

View File

@ -87,6 +87,7 @@ class People extends React.Component<Props> {
{team.signinMethods} but havent signed in yet. {team.signinMethods} but havent signed in yet.
</Trans> </Trans>
</HelpText> </HelpText>
{can.invite && (
<Button <Button
type="button" type="button"
data-on="click" data-on="click"
@ -98,6 +99,7 @@ class People extends React.Component<Props> {
> >
{t("Invite people")} {t("Invite people")}
</Button> </Button>
)}
<Tabs> <Tabs>
<Tab to="/settings/people" exact> <Tab to="/settings/people" exact>
@ -135,7 +137,7 @@ class People extends React.Component<Props> {
/> />
)} )}
/> />
{can.invite && (
<Modal <Modal
title={t("Invite people")} title={t("Invite people")}
onRequestClose={this.handleInviteModalClose} onRequestClose={this.handleInviteModalClose}
@ -143,6 +145,7 @@ class People extends React.Component<Props> {
> >
<Invite onSubmit={this.handleInviteModalClose} /> <Invite onSubmit={this.handleInviteModalClose} />
</Modal> </Modal>
)}
</CenteredContent> </CenteredContent>
); );
} }

View File

@ -195,8 +195,9 @@ router.post("users.invite", auth(), async (ctx) => {
const { invites } = ctx.body; const { invites } = ctx.body;
ctx.assertPresent(invites, "invites is required"); ctx.assertPresent(invites, "invites is required");
const user = ctx.state.user; const { user } = ctx.state;
authorize(user, "invite", User); const team = await Team.findByPk(user.teamId);
authorize(user, "invite", team);
const response = await userInviter({ user, invites, ip: ctx.request.ip }); const response = await userInviter({ user, invites, ip: ctx.request.ip });

View File

@ -107,7 +107,7 @@ describe("#users.info", () => {
describe("#users.invite", () => { describe("#users.invite", () => {
it("should return sent invites", async () => { it("should return sent invites", async () => {
const user = await buildUser(); const user = await buildUser({ isAdmin: true });
const res = await server.post("/api/users.invite", { const res = await server.post("/api/users.invite", {
body: { body: {
token: user.getJwtToken(), token: user.getJwtToken(),
@ -119,6 +119,17 @@ describe("#users.invite", () => {
expect(body.data.sent.length).toEqual(1); expect(body.data.sent.length).toEqual(1);
}); });
it("should require admin", async () => {
const user = await buildUser();
const res = await server.post("/api/users.invite", {
body: {
token: user.getJwtToken(),
invites: [{ email: "test@example.com", name: "Test", guest: false }],
},
});
expect(res.status).toEqual(403);
});
it("should require authentication", async () => { it("should require authentication", async () => {
const res = await server.post("/api/users.invite"); const res = await server.post("/api/users.invite");
expect(res.status).toEqual(401); expect(res.status).toEqual(401);