Skip to content

Commit

Permalink
[Models] Delete sanitizeQuery function from SanitizationAndValidation.ts
Browse files Browse the repository at this point in the history
Looking for library-provided sanitization instead.
  • Loading branch information
dchege711 committed Jun 24, 2024
1 parent b9a4a17 commit 3009e3c
Show file tree
Hide file tree
Showing 4 changed files with 4 additions and 40 deletions.
11 changes: 3 additions & 8 deletions src/models/CardsMongoDB.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import { FilterQuery, SortOrder } from "mongoose";
import * as MetadataDB from "./MetadataMongoDB";
import { Card, ICard, ICardDocument } from "./mongoose_models/CardSchema";
import { sanitizeCard, sanitizeQuery } from "./SanitizationAndValidation";
import { sanitizeCard } from "./SanitizationAndValidation";

export type CreateCardParams = Pick<
ICard,
Expand Down Expand Up @@ -84,7 +84,6 @@ export function read(
projection =
"title description descriptionHTML tags urgency createdById isPublic",
): Promise<ICard | null> {
payload = sanitizeQuery(payload);
const query: FilterQuery<ICard> = { createdById: payload.userIDInApp };
if (payload.cardID) { query._id = payload.cardID; }
return Card.findOne(query).select(projection).exec();
Expand Down Expand Up @@ -179,7 +178,7 @@ export function search(
*/
return collectSearchResults(
computeInternalQueryFromClientQuery(
sanitizeQuery(payload),
payload,
{ createdById },
),
);
Expand Down Expand Up @@ -290,7 +289,7 @@ export function publicSearch(
): Promise<CardsSearchResult[]> {
return collectSearchResults(
computeInternalQueryFromClientQuery(
sanitizeQuery(payload),
payload,
{ isPublic: true },
),
);
Expand Down Expand Up @@ -323,7 +322,6 @@ export function readPublicCard(
function _readPublicCard(
payload: ReadPublicCardParams,
): Promise<ICardDocument | null> {
payload = sanitizeQuery(payload);
if (payload.cardID === undefined) {
return Promise.reject("cardID is undefined");
}
Expand All @@ -350,7 +348,6 @@ export interface DuplicateCardParams {
export async function duplicateCard(
payload: DuplicateCardParams,
): Promise<ICard> {
payload = sanitizeQuery(payload);
const originalCard = await _readPublicCard({ cardID: payload.cardID });
if (originalCard === null) {
return Promise.reject("Card not found!");
Expand Down Expand Up @@ -395,7 +392,6 @@ export interface FlagCardParams {
* as its keys. If successful, the message will contain the saved card.
*/
export async function flagCard(payload: FlagCardParams): Promise<ICard> {
payload = sanitizeQuery(payload);
const flagsToUpdate: Partial<
Pick<ICard, "numTimesMarkedAsDuplicate" | "numTimesMarkedForReview">
> = {};
Expand Down Expand Up @@ -429,7 +425,6 @@ export type TagGroupings = string[][];
export function getTagGroupings(
payload: TagGroupingsParam,
): Promise<TagGroupings> {
payload = sanitizeQuery(payload);
return Card
.find({ createdById: payload.userIDInApp })
.select("tags").exec()
Expand Down
3 changes: 0 additions & 3 deletions src/models/LogInUtilities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import { Card } from "./mongoose_models/CardSchema";
import { Metadata } from "./mongoose_models/MetadataCardSchema";
import { IToken, Token } from "./mongoose_models/Token";
import { IUser, User } from "./mongoose_models/UserSchema";
import { sanitizeQuery } from "./SanitizationAndValidation";

const DIGITS = "0123456789";
const LOWER_CASE = "abcdefghijklmnopqrstuvwxyz";
Expand Down Expand Up @@ -260,8 +259,6 @@ export type RegisterUserAndPasswordParams =
export async function registerUserAndPassword(
payload: RegisterUserAndPasswordParams,
): Promise<string> {
payload = sanitizeQuery(payload);

const conflictingUser = await User.findOne({
$or: [{ username: payload.username }, { email: payload.email }],
}).exec();
Expand Down
18 changes: 1 addition & 17 deletions src/models/MetadataMongoDB.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import {
Metadata,
} from "./mongoose_models/MetadataCardSchema";
import { IUser, User } from "./mongoose_models/UserSchema";
import { sanitizeQuery } from "./SanitizationAndValidation";

type MetadataCreateParams =
& Pick<IMetadata, "metadataIndex">
Expand All @@ -34,8 +33,6 @@ type MetadataCreateParams =
export async function create(
payload: MetadataCreateParams,
): Promise<IMetadata> {
payload = sanitizeQuery(payload);

const preExistingMetadata = await Metadata.findOne({
createdById: payload.userIDInApp,
metadataIndex: payload.metadataIndex,
Expand Down Expand Up @@ -64,7 +61,6 @@ export function read(
function _readInternal(
payload: Pick<IUser, "userIDInApp">,
): Promise<IMetadataDocument[]> {
payload = sanitizeQuery(payload);
return Metadata.find({ createdById: payload.userIDInApp }).exec();
}

Expand Down Expand Up @@ -200,7 +196,6 @@ export async function updatePublicUserMetadata(
export function deleteAllMetadata(
payload: Pick<IUser, "userIDInApp">,
): Promise<DeleteResult> {
payload = sanitizeQuery(payload);
return Metadata.deleteMany({ createdById: payload.userIDInApp }).exec();
}

Expand All @@ -216,8 +211,6 @@ export type SendCardToTrashParams = Pick<ICard, "_id" | "createdById">;
export async function sendCardToTrash(
payload: SendCardToTrashParams,
): Promise<string> {
payload = sanitizeQuery(payload);

const card = await Card.findOne({
_id: payload._id,
createdById: payload.createdById,
Expand Down Expand Up @@ -286,8 +279,6 @@ export type RestoreCardFromTrashParams = SendCardToTrashParams;
export async function restoreCardFromTrash(
restoreCardArgs: RestoreCardFromTrashParams,
): Promise<string> {
restoreCardArgs = sanitizeQuery(restoreCardArgs);

const card = await Card.findOne({
_id: restoreCardArgs._id,
createdById: restoreCardArgs.createdById,
Expand Down Expand Up @@ -320,8 +311,6 @@ type DeleteCardFromTrashParams = SendCardToTrashParams;
export async function deleteCardFromTrash(
deleteCardArgs: DeleteCardFromTrashParams,
): Promise<string> {
deleteCardArgs = sanitizeQuery(deleteCardArgs);

const card = await Card.findOneAndDelete({
_id: deleteCardArgs._id,
createdById: deleteCardArgs.createdById,
Expand Down Expand Up @@ -385,9 +374,8 @@ interface WriteCardsToJSONFileResult {
export async function writeCardsToJSONFile(
userIDInApp: number,
): Promise<WriteCardsToJSONFileResult> {
const query = sanitizeQuery({ userIDInApp: userIDInApp });
const cards = await Card
.find({ createdById: query.userIDInApp })
.find({ createdById: userIDInApp })
.select("title description tags urgency createdAt isPublic")
.exec();

Expand Down Expand Up @@ -493,8 +481,6 @@ export type UpdateUserSettingsParams = Pick<
export async function updateUserSettings(
newUserSettings: UpdateUserSettingsParams,
): Promise<IUser> {
newUserSettings = sanitizeQuery(newUserSettings);

const supportedChanges = new Set(["cardsAreByDefaultPrivate", "dailyTarget"]);
const validChanges = Object.keys(newUserSettings).filter((setting) =>
supportedChanges.has(setting)
Expand Down Expand Up @@ -545,8 +531,6 @@ export type UpdateStreakParams =
export function updateStreak(
streakUpdateObj: UpdateStreakParams,
): Promise<IStreak> {
streakUpdateObj = sanitizeQuery(streakUpdateObj);

return Metadata
.findOne({ createdById: streakUpdateObj.userIDInApp, metadataIndex: 0 })
.exec()
Expand Down
12 changes: 0 additions & 12 deletions src/models/SanitizationAndValidation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,15 +100,3 @@ export function sanitizeCard(card: Partial<ICard>): Partial<ICard> {

return card;
}

/**
* @description Prevent a NoSQL Injection in the search parameters. This is
* achieved by deleting all query values that begin with `$`.
*/
export function sanitizeQuery(query: any) {
const keys = Object.keys(query);
for (let i = 0; i < keys.length; i++) {
if (/^\$/.test(query[keys[i]])) { delete query[keys[i]]; }
}
return query;
}

0 comments on commit 3009e3c

Please sign in to comment.