From e46a2b2331711dea5c21a100e1e21a527c99135c Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 27 May 2024 12:46:49 +0700 Subject: [PATCH] fix(developer): handle invalid project file when scanning for owner project Also updates the only other place where a project file is loaded like this, in the project renderer, and handles it too (this scenario is less likely to happen because the project file must already have been loaded in order to be presented in the UI). Fixes: #11557 Fixes: KEYMAN-DEVELOPER-1Z2 --- .../Keyman.Developer.System.HttpServer.App.pas | 17 ++++++++++++++--- ...eyman.Developer.System.ProjectOwningFile.pas | 13 +++++++++++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/developer/src/tike/http/Keyman.Developer.System.HttpServer.App.pas b/developer/src/tike/http/Keyman.Developer.System.HttpServer.App.pas index b438efc916b..c934fc4163a 100644 --- a/developer/src/tike/http/Keyman.Developer.System.HttpServer.App.pas +++ b/developer/src/tike/http/Keyman.Developer.System.HttpServer.App.pas @@ -45,6 +45,7 @@ implementation KeymanDeveloperOptions, Keyman.Developer.System.Project.Project, Keyman.Developer.System.Project.ProjectFile, + Keyman.Developer.System.Project.ProjectLoader, Keyman.Developer.System.Project.WelcomeRenderer, RedistFiles; @@ -95,6 +96,7 @@ procedure TAppHttpResponder.RespondProject(doc: string; AContext: TIdContext; procedure RespondProjectFile; var path: string; + p: TProject; begin if ARequestInfo.Params.IndexOfName('path') < 0 then begin @@ -113,12 +115,21 @@ procedure TAppHttpResponder.RespondProject(doc: string; AContext: TIdContext; end; // Transform the .kpj - with TProject.Create(ptUnknown, path, True) do + try + p := TProject.Create(ptUnknown, path, True); + except + on E:EProjectLoader do + begin + AResponseInfo.ResponseNo := 400; + AResponseInfo.ResponseText := 'Invalid project file: '+E.Message; + Exit; + end; + end; try AResponseInfo.ContentType := 'text/html; charset=UTF-8'; - AResponseInfo.ContentText := Render; + AResponseInfo.ContentText := p.Render; finally - Free; + p.Free; end; end; diff --git a/developer/src/tike/main/Keyman.Developer.System.ProjectOwningFile.pas b/developer/src/tike/main/Keyman.Developer.System.ProjectOwningFile.pas index b13a79e396c..e130adcf7fc 100644 --- a/developer/src/tike/main/Keyman.Developer.System.ProjectOwningFile.pas +++ b/developer/src/tike/main/Keyman.Developer.System.ProjectOwningFile.pas @@ -9,7 +9,8 @@ implementation uses System.SysUtils, - Keyman.Developer.System.Project.ProjectFile; + Keyman.Developer.System.Project.ProjectFile, + Keyman.Developer.System.Project.ProjectLoader; function CheckOwnerProjectForFile(const project, filename: string): Boolean; forward; @@ -71,7 +72,15 @@ function CheckOwnerProjectForFile(const project, filename: string): Boolean; if SameFileName(project, filename) then Exit(True); - p := TProject.Create(ptUnknown, project, True); + try + p := TProject.Create(ptUnknown, project, True); + except + on E:EProjectLoader do + begin + Result := False; + Exit; + end; + end; try Result := p.Files.IndexOfFileName(filename) >= 0; finally