From 8a1da9925f3ae68548ae978a8d038426721fe6f6 Mon Sep 17 00:00:00 2001 From: Collin Duncan <3679940+cgduncan7@users.noreply.github.com> Date: Wed, 28 Jun 2023 21:40:29 +0200 Subject: [PATCH] Fixing some transformation and logging sensitive data issues --- src/reservations/entity.ts | 45 ++++++++++++++++++++++++---- src/runner/baanreserveren/service.ts | 14 +++++---- 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/reservations/entity.ts b/src/reservations/entity.ts index 4f227c8..a72b9a5 100644 --- a/src/reservations/entity.ts +++ b/src/reservations/entity.ts @@ -2,6 +2,7 @@ import { Exclude, Transform, Type } from 'class-transformer' import { Dayjs } from 'dayjs' import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm' import dayjs from '../common/dayjs' +import { TransformationType } from 'class-transformer' @Entity({ name: 'reservations' }) export class Reservation { @@ -17,14 +18,44 @@ export class Reservation { @Column('varchar', { length: 255, nullable: false }) password: string - @Column('datetime', { nullable: false }) + @Column('datetime', { + nullable: false, + transformer: { + to: (value: Dayjs) => value.format(), + from: (value: Date) => dayjs(value), + }, + }) @Type(() => Dayjs) - @Transform(({ value }) => dayjs(value).format()) + @Transform(({ value, type }) => { + switch (type) { + case TransformationType.PLAIN_TO_CLASS: + return dayjs(value) + case TransformationType.CLASS_TO_PLAIN: + return value.format() + default: + return value + } + }) dateRangeStart: Dayjs - @Column('datetime', { nullable: false }) + @Column('datetime', { + nullable: false, + transformer: { + to: (value: Dayjs) => value.format(), + from: (value: Date) => dayjs(value), + }, + }) @Type(() => Dayjs) - @Transform(({ value }) => dayjs(value).format()) + @Transform(({ value, type }) => { + switch (type) { + case TransformationType.PLAIN_TO_CLASS: + return dayjs(value) + case TransformationType.CLASS_TO_PLAIN: + return value.format() + default: + return value + } + }) dateRangeEnd: Dayjs @Column('varchar', { length: 32, nullable: false }) @@ -56,9 +87,13 @@ export class Reservation { */ @Exclude() public isAvailableForReservation(): boolean { - return dayjs().diff(this.dateRangeStart, 'day') <= 7 + return this.dateRangeStart.diff(dayjs(), 'day') <= 7 } + /** + * Get the date which a reservation can be made + * @returns the date from which a reservation is allowed to be made + */ @Exclude() public getAllowedReservationDate(): Dayjs { return this.dateRangeStart diff --git a/src/runner/baanreserveren/service.ts b/src/runner/baanreserveren/service.ts index d5e9314..8f88e1c 100644 --- a/src/runner/baanreserveren/service.ts +++ b/src/runner/baanreserveren/service.ts @@ -5,6 +5,7 @@ import { EmptyPage } from '../pages/empty' import dayjs from '../../common/dayjs' import { Reservation } from '../../reservations/entity' import { LoggerService } from 'src/logger/service' +import { instanceToPlain } from 'class-transformer' const baanReserverenRoot = 'https://squashcity.baanreserveren.nl' @@ -100,7 +101,9 @@ export class BaanReserverenService { } private async init(reservation: Reservation) { - this.loggerService.debug('Initializing', { reservation }) + this.loggerService.debug('Initializing', { + reservation: instanceToPlain(reservation), + }) await this.page.goto(baanReserverenRoot) const action = this.checkSession(reservation.username) switch (action) { @@ -142,7 +145,6 @@ export class BaanReserverenService { throw new RunnerNavigationMonthError(e) }) } - await this.page ?.waitForSelector( `td#cal_${date.get('year')}_${date.get('month') + 1}_${date.get( @@ -169,7 +171,9 @@ export class BaanReserverenService { } private async selectAvailableTime(reservation: Reservation): Promise { - this.loggerService.debug('Selecting available time', { reservation }) + this.loggerService.debug('Selecting available time', { + reservation: instanceToPlain(reservation), + }) let freeCourt: ElementHandle | null | undefined let i = 0 const possibleDates = reservation.createPossibleDates() @@ -187,7 +191,7 @@ export class BaanReserverenService { throw new NoCourtAvailableError() } - this.loggerService.debug('Free court found', { freeCourt }) + this.loggerService.debug('Free court found') await freeCourt.click().catch((e: Error) => { throw new RunnerCourtSelectionError(e) @@ -197,7 +201,7 @@ export class BaanReserverenService { private async selectOpponent(id: string, name: string): Promise { this.loggerService.debug('Selecting opponent', { id, name }) const player2Search = await this.page - ?.waitForSelector('tr.res-make-player-2 > td > input') + ?.waitForSelector('input:has(~ select[name="players[2]"])') .catch((e: Error) => { throw new RunnerOpponentSearchError(e) })