🐛 Check permission for API update user (#781)
This commit is contained in:
@@ -38,6 +38,7 @@ import gr from "../../global-resolver";
|
|||||||
import config from "config";
|
import config from "config";
|
||||||
import { getLogger } from "../../../core/platform/framework";
|
import { getLogger } from "../../../core/platform/framework";
|
||||||
import { UpdateUser } from "../services/users/types";
|
import { UpdateUser } from "../services/users/types";
|
||||||
|
import { hasCompanyAdminLevel } from "../../../utils/company";
|
||||||
|
|
||||||
export class UsersCrudController
|
export class UsersCrudController
|
||||||
implements
|
implements
|
||||||
@@ -372,9 +373,27 @@ export class UsersCrudController
|
|||||||
request: FastifyRequest<{ Body: UpdateUser; Params: UserParameters }>,
|
request: FastifyRequest<{ Body: UpdateUser; Params: UserParameters }>,
|
||||||
reply: FastifyReply,
|
reply: FastifyReply,
|
||||||
): Promise<ResourceCreateResponse<UserObject>> {
|
): Promise<ResourceCreateResponse<UserObject>> {
|
||||||
|
const id = request.params.id;
|
||||||
const context = getExecutionContext(request);
|
const context = getExecutionContext(request);
|
||||||
|
|
||||||
const id = request.params.id;
|
const [currentUserCompanies, requestedUserCompanies] = await Promise.all(
|
||||||
|
[context.user.id, request.params.id].map(userId =>
|
||||||
|
gr.services.users.getUserCompanies({ id: userId }),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
const currentUserCompaniesIds = new Set(currentUserCompanies.map(a => a.group_id));
|
||||||
|
const sameCompanies = requestedUserCompanies.filter(a =>
|
||||||
|
currentUserCompaniesIds.has(a.group_id),
|
||||||
|
);
|
||||||
|
const roles = await Promise.all(
|
||||||
|
sameCompanies.map(a => gr.services.companies.getUserRole(a.group_id, context.user?.id)),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!roles.some(role => hasCompanyAdminLevel(role) === true)) {
|
||||||
|
reply.unauthorized(`User ${context.user?.id} is not allowed to update user ${id}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const user = await gr.services.users.get({ id });
|
const user = await gr.services.users.get({ id });
|
||||||
if (!user) {
|
if (!user) {
|
||||||
reply.notFound(`User ${id} not found`);
|
reply.notFound(`User ${id} not found`);
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ const routes: FastifyPluginCallback = (fastify: FastifyInstance, options, next)
|
|||||||
fastify.route({
|
fastify.route({
|
||||||
method: "PUT",
|
method: "PUT",
|
||||||
url: `${usersUrl}/:id`,
|
url: `${usersUrl}/:id`,
|
||||||
preValidation: [fastify.authenticateOptional],
|
preValidation: [fastify.authenticate],
|
||||||
handler: usersController.update.bind(usersController),
|
handler: usersController.update.bind(usersController),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user