From ba7d416e90e5ca88cfdcc348aa28bf0abf7e0acd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Tainon?= Date: Mon, 17 Nov 2025 17:44:17 +0100 Subject: [PATCH 1/3] Allow idUser = 0 in task token payload --- src/platform_interface.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform_interface.ts b/src/platform_interface.ts index 7c5969e..be2042f 100644 --- a/src/platform_interface.ts +++ b/src/platform_interface.ts @@ -49,7 +49,7 @@ export async function extractPlatformTaskTokenData(token: string|null|undefined, } } - if (!payload.idUser || (!payload.idItem && !payload.itemUrl)) { + if (undefined === payload.idUser || null === payload.idUser || (!payload.idItem && !payload.itemUrl)) { throw new InvalidInputError('Missing idUser or idItem in token'); } From 57c0201bcd4bbfe6d9e7f3f36f3230572de45b8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Tainon?= Date: Mon, 17 Nov 2025 18:18:42 +0100 Subject: [PATCH 2/3] Allow submission without answerToken if idUser = 0 for test mode --- src/grader_interface.ts | 4 ---- src/submissions.ts | 6 ++++-- src/tokenization.ts | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/grader_interface.ts b/src/grader_interface.ts index d38b2a0..4b517b1 100644 --- a/src/grader_interface.ts +++ b/src/grader_interface.ts @@ -166,10 +166,6 @@ WHERE tm_submissions.ID = :idSubmission throw new InvalidInputError('Cannot find source code associated with this submission'); } - if (!submissionData.answerToken && !appConfig.testMode.enabled && 'UserTest' !== submission.sMode) { - throw new InvalidInputError('Missing answerToken, required for this type of submission'); - } - let tests: TaskTest[] = []; if ('UserTest' === submission.sMode) { tests = await Db.execute('SELECT tm_tasks_tests.* FROM tm_tasks_tests WHERE idUser = :idUser and idPlatform = :idPlatform and idTask = :idTask and idSubmission = :idSubmission ORDER BY iRank ASC', { diff --git a/src/submissions.ts b/src/submissions.ts index 6955371..1ba3a97 100644 --- a/src/submissions.ts +++ b/src/submissions.ts @@ -168,9 +168,13 @@ export async function createSubmission(submissionData: SubmissionParameters): Pr throw new InvalidInputError(`Invalid task id: ${taskTokenData.taskId}`); } + const mode = submissionData.userTests && submissionData.userTests.length ? SubmissionMode.UserTest : SubmissionMode.Submitted; + let answerTokenData: PlatformAnswerTokenData|null = null; if (submissionData.answerToken) { answerTokenData = await extractPlatformAnswerTaskTokenData(submissionData.answerToken, submissionData.platform, submissionData.taskId); + } else if (!appConfig.testMode.enabled && 'UserTest' !== mode && '0' !== String(taskTokenData.payload.idUser)) { + throw new InvalidInputError('Missing answerToken, required for this type of submission'); } const submissionParamsKeys: (keyof PlatformTaskTokenPayload)[] = [ @@ -188,8 +192,6 @@ export async function createSubmission(submissionData: SubmissionParameters): Pr checkAnswerTokenValid(answerTokenData, taskTokenData); - const mode = submissionData.userTests && submissionData.userTests.length ? SubmissionMode.UserTest : SubmissionMode.Submitted; - // save source code (with bSubmission = 1) const idNewSourceCode = getRandomId(); const idSubmission = getRandomId(); diff --git a/src/tokenization.ts b/src/tokenization.ts index da216f2..22481b6 100644 --- a/src/tokenization.ts +++ b/src/tokenization.ts @@ -7,7 +7,7 @@ import {InvalidInputError} from './error_handler'; import * as Db from './db'; export interface PlatformGenericTokenPayload { - idUser: string|null, + idUser: string|number|null, itemUrl: string|null, nbHintsGiven: number, idItem?: string, From 57e06958a3ed571e54c2de281d7d3b9ecfe4bc01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Tainon?= Date: Mon, 24 Nov 2025 10:55:46 +0100 Subject: [PATCH 3/3] Consider idUser to be a string --- src/tokenization.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tokenization.ts b/src/tokenization.ts index 22481b6..da216f2 100644 --- a/src/tokenization.ts +++ b/src/tokenization.ts @@ -7,7 +7,7 @@ import {InvalidInputError} from './error_handler'; import * as Db from './db'; export interface PlatformGenericTokenPayload { - idUser: string|number|null, + idUser: string|null, itemUrl: string|null, nbHintsGiven: number, idItem?: string,