Skip to content

Commit

Permalink
feat: append sensitive data when as admin
Browse files Browse the repository at this point in the history
  • Loading branch information
supersonictw committed Nov 16, 2024
1 parent 707c6a2 commit 511f366
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 30 deletions.
126 changes: 101 additions & 25 deletions src/routes/rooms.js
Original file line number Diff line number Diff line change
Expand Up @@ -200,15 +200,20 @@ router.patch(
}),
);

router.get("/:code",
middlewareValidator.param("code").isString().notEmpty(),
router.get("/:roomCode",
middlewareValidator.param("roomCode").isString().notEmpty(),
middlewareInspector,
withAwait(async (req, res) => {
// Get user ID
const userId = req.auth.id;

// Get room code
const code = req.params.code;
const roomCode = req.params.roomCode;

// Find room
const room = await Room.findOne({code}).exec();
const room = await Room.findOne({
code: roomCode,
}).exec();
if (!room) {
res.
status(StatusCodes.NOT_FOUND).
Expand All @@ -218,31 +223,43 @@ router.get("/:code",
return;
}

// Define room data
const roomData = {};

// Append sensitive data
const isAdministrator = room.administrators.some(
(administrator) => administrator.toString() === userId,
);
if (isAdministrator) {
Object.assign(roomData, room.toObject());
} else {
const {
label, members, description, backgroundImage, pageUrl,
} = room;
Object.assign(roomData, {
label, members, description, backgroundImage, pageUrl,
});
}

// Send response
res.send({
label: room.label,
members: room.members,
description: room.description,
backgroundImage: room.backgroundImage,
pageUrl: room.pageUrl,
});
res.send(roomData);
}),
);

router.patch("/:code",
router.patch("/:roomCode",
middlewareAccess(null),
middlewareValidator.param("code").isString().notEmpty(),
middlewareValidator.param("roomCode").isString().notEmpty(),
middlewareInspector,
withAwait(async (req, res) => {
// Get user ID
const userId = req.auth.id;

// Get room code
const code = req.params.code;
const roomCode = req.params.roomCode;

// Find room
const room = await Room.findOne({
code,
code: roomCode,
administrators: {
$in: [userId],
},
Expand Down Expand Up @@ -278,20 +295,20 @@ router.patch("/:code",
}),
);

router.delete("/:code",
router.delete("/:roomCode",
middlewareAccess(null),
middlewareValidator.param("code").isString().notEmpty(),
middlewareValidator.param("roomCode").isString().notEmpty(),
middlewareInspector,
withAwait(async (req, res) => {
// Get user ID
const userId = req.auth.id;

// Get room code
const code = req.params.code;
const roomCode = req.params.roomCode;

// Find room
const room = await Room.findOne({
code,
code: roomCode,
creator: userId,
}).exec();
if (!room) {
Expand Down Expand Up @@ -378,14 +395,11 @@ router.post("/:roomCode/administrators",
}),
);

router.patch("/invitations/:invitationId",
router.get("/invitations/:invitationId",
middlewareAccess(null),
middlewareValidator.param("invitationId").isString().notEmpty(),
middlewareInspector,
withAwait(async (req, res) => {
// Get user ID
const userId = req.auth.id;

// Get user email
const userEmail = req.auth.metadata.profile.email;

Expand All @@ -404,11 +418,23 @@ router.patch("/invitations/:invitationId",
return;
}

// Check email
if (invitation.email !== userEmail) {
res.
status(StatusCodes.FORBIDDEN).
send({
error: "Invalid email",
});
return;
}

// Get room code
const roomCode = invitation.roomCode;

// Find room
const room = await Room.findOne({code: roomCode}).exec();
const room = await Room.findOne({
code: roomCode,
}).exec();
if (!room) {
res.
status(StatusCodes.NOT_FOUND).
Expand All @@ -418,6 +444,37 @@ router.patch("/invitations/:invitationId",
return;
}

// Send response
res.send({room, invitation});
}),
);

router.patch("/invitations/:invitationId",
middlewareAccess(null),
middlewareValidator.param("invitationId").isString().notEmpty(),
middlewareInspector,
withAwait(async (req, res) => {
// Get user ID
const userId = req.auth.id;

// Get user email
const userEmail = req.auth.metadata.profile.email;

// Get request data
const invitationId = req.params.invitationId;

// Fine invitation
const cache = useCache();
const invitation = cache.get(`invitation:${invitationId}`);
if (!invitation) {
res.
status(StatusCodes.NOT_FOUND).
send({
error: "Invitation not found",
});
return;
}

// Check email
if (invitation.email !== userEmail) {
res.
Expand All @@ -428,11 +485,30 @@ router.patch("/invitations/:invitationId",
return;
}

// Get room code
const roomCode = invitation.roomCode;

// Find room
const room = await Room.findOne({
code: roomCode,
}).exec();
if (!room) {
res.
status(StatusCodes.NOT_FOUND).
send({
error: "Room not found",
});
return;
}

// Remove invitation
cache.del(`invitation:${invitationId}`);

// Check if the user is an administrator
if (room.administrators.map((i) => i.toString()).includes(userId)) {
const isAdministrator = room.administrators.some(
(administrator) => administrator.toString() === userId,
);
if (isAdministrator) {
res.
status(StatusCodes.CONFLICT).
send({
Expand Down
7 changes: 5 additions & 2 deletions src/utils/sara_token.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// Token utils of Sara.

// Import config
const {getMust} = require("../config");
const {getMust, isProduction} = require("../config");

// Import modules
const axios = require("axios");
Expand Down Expand Up @@ -39,8 +39,11 @@ const verifyOptions = {
* @return {Promise<boolean>}
*/
async function isActivated(tokenId) {
const queryKey = ["sara_token", tokenId].join(":");
if (!isProduction()) {
return true;
}

const queryKey = ["sara_token", tokenId].join(":");
const cache = useCache();
if (cache.has(queryKey)) {
return cache.get(queryKey);
Expand Down
10 changes: 7 additions & 3 deletions src/utils/test_token.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,15 @@
// Import config
const {isProduction} = require("../config");

// Import utils
const {sha256hex} = require("./native");

// Default fake user
const DEFAULT_FAKE_USER = {
_id: "67345206787c5d2b9be61c37",
nickname: "The Fake User",
email: "the_fake_user@web-tech-tw.github.io",
avatar_hash: "fake_user",
nickname: "Fake User",
email: "fake_user@web-tech-tw.github.io",
avatar_hash: sha256hex("fake_user@web-tech-tw.github.io"),
roles: [],
};

Expand Down

0 comments on commit 511f366

Please sign in to comment.