From cf7ea51c9b020ce4b5df87e577ad46b721371077 Mon Sep 17 00:00:00 2001 From: Yuriy Artamonov Date: Thu, 20 Mar 2025 03:49:23 +0300 Subject: [PATCH] [json] IJPL-181564 JSON schema path matcher is not robust to errors in schema catalog (cherry picked from commit 067ea6e8c77f1df5cc2b91c5984ae2ef9a9cdcee) IJ-CR-158093 GitOrigin-RevId: a188846ccc2caf9d9b9d54f58f34e4b9d2910d99 --- .../jsonSchema/impl/JsonSchemaServiceImpl.java | 13 ++++++++++++- .../remote/JsonSchemaCatalogManager.java | 16 ++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java index 812a763f07c2..c690fb727ada 100644 --- a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java +++ b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java @@ -7,7 +7,9 @@ import com.intellij.diagnostic.PluginException; import com.intellij.ide.lightEdit.LightEdit; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Attachment; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.diagnostic.RuntimeExceptionWithAttachments; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; @@ -446,7 +448,16 @@ public class JsonSchemaServiceImpl implements JsonSchemaService, ModificationTra } private @Nullable VirtualFile resolveSchemaFromOtherSources(@NotNull VirtualFile file) { - return myCatalogManager.getSchemaFileForFile(file); + try { + return myCatalogManager.getSchemaFileForFile(file); + } + catch (ProcessCanceledException e) { + throw e; + } + catch (Exception e) { + throw new RuntimeExceptionWithAttachments("Unable to resolve JSON schema from file " + file.getName(), e, + new Attachment("Schema URL", file.getUrl())); + } } @Override diff --git a/json/src/com/jetbrains/jsonSchema/remote/JsonSchemaCatalogManager.java b/json/src/com/jetbrains/jsonSchema/remote/JsonSchemaCatalogManager.java index e3636973364b..1b368753b8d7 100644 --- a/json/src/com/jetbrains/jsonSchema/remote/JsonSchemaCatalogManager.java +++ b/json/src/com/jetbrains/jsonSchema/remote/JsonSchemaCatalogManager.java @@ -5,6 +5,7 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.util.Disposer; @@ -31,8 +32,11 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentMap; +import java.util.regex.PatternSyntaxException; public final class JsonSchemaCatalogManager { + private static final Logger LOG = Logger.getInstance(JsonSchemaCatalogManager.class); + static final String DEFAULT_CATALOG = "http://schemastore.org/api/json/catalog.json"; static final String DEFAULT_CATALOG_HTTPS = "https://schemastore.org/api/json/catalog.json"; private static final Set SCHEMA_URL_PREFIXES_WITH_TOO_MANY_VARIANTS = Set.of( @@ -181,13 +185,21 @@ public final class JsonSchemaCatalogManager { path = Paths.get(filePath); } catch (InvalidPathException e) { + LOG.debug("Unable to process invalid path '" + filePath + "'", e); return null; } + for (FileMatcher matcher : matchers) { - if (matcher.matches(path)) { - return matcher.myEntry.getUrl(); + try { + if (matcher.matches(path)) { + return matcher.myEntry.getUrl(); + } + } + catch (PatternSyntaxException pse) { + LOG.warn("Unable to process matches for path '" + path + "' with matcher URL '" + matcher.myEntry.getUrl() + "'", pse); } } + return null; }