From 953e84454128f2a93697f5bb4c12e2a924d375df Mon Sep 17 00:00:00 2001 From: l0ng-ai <24760907+l0ng-ai@users.noreply.github.com> Date: Wed, 4 Nov 2026 18:24:43 +0800 Subject: [PATCH] feat(plugins): community plugins, version compatibility and categories in the marketplace (#1226) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(plugins): list community plugins from a registry in the marketplace The marketplace index can now carry plugins of other publishers, published from their authors' repositories through the l0ng-ai/openidea-plugins registry. - `openidea-plugin index` with a key replaces only that publisher's plugins (it used to drop every other entry); without a key it indexes each package against the publishers the index already lists, checking the key and the id prefix instead of only the signature itself. - `openidea-plugin merge` takes another index's publishers, plugins and revocations in place of every publisher but `--keep`; the other index can't list or revoke the kept publishers' plugins. - `openidea-plugin check` accepts a `.oiplugin` file. - Releases merge the registry's index into plugins-index.json and attach the Linux x64 tool; plugins-index.yml refreshes the community plugins in the latest release hourly or when the registry signals a change. - plugins/README.md and CONTRIBUTING.md describe official and community plugins. * feat(plugins): offer the newest plugin version this IDE can load Index entries record the plugin API each version needs (`engine`: the manifest's `engines.openidea` narrowed to the API its component was built for), and an index may list several versions of a plugin. Settings › Plugins offers the newest version this IDE can load; with none, the plugin is shown as incompatible with the API it needs, and downloading it is refused. `openidea-plugin index` keeps, of each plugin, the newest version per API requirement, so users of an older IDE keep the last version built for them; `--download-base` makes downloads absolute, and the release workflow points them at the release that published them. Scratch directories are now unique per call. * feat(plugins): file marketplace plugins under categories `plugin.toml` takes `categories` (up to 3 of languages, themes, icon-themes, linters, vcs, ai, frameworks, tools, other). A plugin that declares none is filed under what its contributions imply (themes, icon themes, languages), else under other; categories an IDE doesn't know are ignored, and `check` warns about them. Index entries carry the categories, and Settings › Plugins › Available filters by them and shows them in a plugin's details. The official plugins declare theirs. * feat(plugins): let a marketplace index point to where it moved An index with `moved` sends the IDE to the index at that URL (relative or absolute, up to three hops; an https index can only move to https). Downloads resolve against the index actually read, so a marketplace can change hosts while released IDEs keep the address they were built with. * fix(plugins): full-width category filter and aligned incompatibility note * fix(plugins): translate the AI category in Chinese * feat(plugins): keep a plugin's signer across updates and announce updates - Index format: fields are only added; an IDE reading a newer `format` still applies its revocations and `moved`, lists no plugins and asks to be updated, instead of failing to read the index. - Key continuity: an installed plugin updates silently only to a package signed with the same key, or a key it endorsed (`KeyEntry.endorsement`, `index --previous-key`, `openidea-plugin endorse`). Another signer, or an unsigned package replacing a signed one, is shown on the install page and needs the user's confirmation (`Consent.signerChange`). - Official key: release builds carry the official publisher's public key (`OPENIDEA_OFFICIAL_PLUGIN_KEYS`, derived from PLUGIN_SIGNING_KEY); `openidea.*` plugins must be signed with it or a key it endorsed, whatever the index lists. - Updates: the daily marketplace check announces new versions once, with Update All (also in the gear menu and as an action). An update that asks for nothing new installs with the grants the installed version has. - Index entries need `engine`; `categories` beyond the first three are ignored instead of rejecting the manifest. --- .github/workflows/plugins-index.yml | 46 ++ .github/workflows/release.yml | 36 +- CONTRIBUTING.md | 5 + Cargo.lock | 1 + crates/ide-extension/src/lib.rs | 4 +- crates/ide-extension/src/manifest.rs | 66 +++ crates/ide-extension/src/package.rs | 536 +++++++++++++++++- crates/ide-host/Cargo.toml | 1 + .../ide-host/src/bin/openidea-plugin/main.rs | 394 +++++++++++-- .../src/bin/openidea-plugin/templates.rs | 3 + crates/ide-host/src/plugins/market.rs | 150 ++++- crates/ide-host/src/plugins/mod.rs | 55 +- crates/ide-host/src/plugins/remote_host.rs | 3 +- crates/ide-host/src/plugins/types.rs | 12 + crates/ide-host/tests/distribution.rs | 245 +++++++- plugins/README.md | 81 ++- .../official/ai-completion/dist/plugin.wasm | Bin 166971 -> 167301 bytes .../ai-completion/dist/plugin.wasm.sources | 2 +- plugins/official/ai-completion/plugin.toml | 1 + plugins/official/checkstyle/dist/plugin.wasm | Bin 159016 -> 159390 bytes .../checkstyle/dist/plugin.wasm.sources | 2 +- plugins/official/checkstyle/plugin.toml | 1 + plugins/official/csv-editor/dist/plugin.wasm | Bin 130963 -> 131750 bytes .../csv-editor/dist/plugin.wasm.sources | 2 +- plugins/official/csv-editor/plugin.toml | 1 + plugins/official/excalidraw/plugin.toml | 1 + plugins/official/git-toolbox/dist/plugin.wasm | Bin 108855 -> 109018 bytes .../git-toolbox/dist/plugin.wasm.sources | 2 +- plugins/official/git-toolbox/plugin.toml | 1 + plugins/official/graphviz/dist/plugin.wasm | Bin 124849 -> 124790 bytes .../graphviz/dist/plugin.wasm.sources | 2 +- plugins/official/graphviz/plugin.toml | 1 + .../official/key-promoter/dist/plugin.wasm | Bin 98959 -> 99184 bytes .../key-promoter/dist/plugin.wasm.sources | 2 +- plugins/official/key-promoter/plugin.toml | 1 + .../official/license-header/dist/plugin.wasm | Bin 143721 -> 143785 bytes .../license-header/dist/plugin.wasm.sources | 2 +- plugins/official/license-header/plugin.toml | 1 + plugins/official/mybatis/dist/plugin.wasm | Bin 159800 -> 160539 bytes .../official/mybatis/dist/plugin.wasm.sources | 2 +- plugins/official/mybatis/plugin.toml | 1 + .../official/regex-tester/dist/plugin.wasm | Bin 930798 -> 930619 bytes .../regex-tester/dist/plugin.wasm.sources | 2 +- plugins/official/regex-tester/plugin.toml | 1 + plugins/official/solidity/dist/plugin.wasm | Bin 107192 -> 107043 bytes .../solidity/dist/plugin.wasm.sources | 2 +- plugins/official/solidity/plugin.toml | 1 + .../official/string-tools/dist/plugin.wasm | Bin 164796 -> 164898 bytes .../string-tools/dist/plugin.wasm.sources | 2 +- plugins/official/string-tools/plugin.toml | 1 + src/bindings.ts | 41 +- src/features/plugins/PluginsPage.module.css | 8 + src/features/plugins/PluginsPage.tsx | 121 +++- .../plugins/__tests__/intellijImport.test.tsx | 2 + .../plugins/__tests__/plugins.test.tsx | 206 ++++++- src/features/plugins/backend.ts | 2 + src/features/plugins/bridge.ts | 22 +- src/features/plugins/consent.tsx | 10 +- src/features/plugins/index.ts | 12 +- src/features/plugins/store.ts | 76 ++- src/platform/locales/text/zh.json | 18 +- 61 files changed, 2030 insertions(+), 160 deletions(-) create mode 100644 .github/workflows/plugins-index.yml diff --git a/.github/workflows/plugins-index.yml b/.github/workflows/plugins-index.yml new file mode 100644 index 00000000..bbf1d256 --- /dev/null +++ b/.github/workflows/plugins-index.yml @@ -0,0 +1,46 @@ +name: Plugin index + +# Refreshes the community plugins in the latest release's plugins-index.json +# (what released apps read) from the registry, l0ng-ai/openidea-plugins. The +# official plugins, their key and revocations stay as the release wrote them. +on: + schedule: + - cron: "17 * * * *" + workflow_dispatch: + # Sent by the registry when its index changes. + repository_dispatch: + types: [community-plugins] + +permissions: + contents: write + +concurrency: + group: plugins-index + +env: + COMMUNITY_PLUGINS_INDEX: https://github.com/l0ng-ai/openidea-plugins/releases/download/index/index.json + +jobs: + merge: + runs-on: ubuntu-latest + steps: + - name: Merge the community index + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + set -euo pipefail + cd "$RUNNER_TEMP" + tag="$(gh release view --repo "$GITHUB_REPOSITORY" --json tagName -q .tagName)" + tool=openidea-plugin-linux-x86_64 + if ! gh release download "$tag" --repo "$GITHUB_REPOSITORY" -p plugins-index.json -p "$tool.gz"; then + echo "::notice::$tag has no plugin index or openidea-plugin tool yet" + exit 0 + fi + gunzip "$tool.gz" && chmod +x "$tool" + cp plugins-index.json before.json + "./$tool" merge plugins-index.json "$COMMUNITY_PLUGINS_INDEX" --keep openidea + if cmp -s before.json plugins-index.json; then + echo "unchanged" + else + gh release upload "$tag" plugins-index.json --repo "$GITHUB_REPOSITORY" --clobber + fi diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3874f17e..9a4af689 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,6 +18,7 @@ env: CARGO_TERM_COLOR: always CARGO_INCREMENTAL: 0 TAG: ${{ github.event.inputs.tag || github.ref_name }} + COMMUNITY_PLUGINS_INDEX: https://github.com/l0ng-ai/openidea-plugins/releases/download/index/index.json jobs: # Creates (or reuses) one draft release that every platform build uploads into. @@ -25,6 +26,7 @@ jobs: runs-on: ubuntu-latest outputs: release_id: ${{ steps.release.outputs.id }} + official_plugin_keys: ${{ steps.plugin-keys.outputs.keys }} steps: - uses: actions/checkout@v4 with: { ref: "${{ env.TAG }}" } @@ -35,6 +37,20 @@ jobs: echo "::error::tag $TAG does not match tauri.conf.json version $app" exit 1 fi + # The official plugins' public key (from PLUGIN_SIGNING_KEY, the seed + # `openidea-plugin keygen` writes), built into the app: their packages + # must carry its signature whatever the marketplace index lists. Without + # the secret the app takes the index's word, as development builds do. + - id: plugin-keys + env: + SIGNING_KEY: ${{ secrets.PLUGIN_SIGNING_KEY }} + run: | + if [ -n "$SIGNING_KEY" ]; then + seed="$(printf %s "$SIGNING_KEY" | base64 -d | od -An -tx1 | tr -d ' \n')" + key="$(printf '302e020100300506032b657004220420%s' "$seed" | xxd -r -p | + openssl pkey -inform DER -pubout -outform DER | tail -c 32 | base64)" + echo "keys=$key" >> "$GITHUB_OUTPUT" + fi - id: release uses: actions/github-script@v7 with: @@ -57,6 +73,8 @@ jobs: build: needs: create-release name: Build (${{ matrix.name }}) + env: + OPENIDEA_OFFICIAL_PLUGIN_KEYS: ${{ needs.create-release.outputs.official_plugin_keys }} strategy: fail-fast: false matrix: @@ -184,7 +202,11 @@ jobs: # (releases/latest/download/plugins-index.json). They are not in the # installers: users install them from Settings › Plugins. Without the # signing key (secret PLUGIN_SIGNING_KEY: the file `openidea-plugin keygen` - # writes) nothing is published and the release goes on. + # writes) nothing is published and the release goes on. The index also lists + # the community plugins of the registry (COMMUNITY_PLUGINS_INDEX; refreshed + # between releases by plugins-index.yml), and the release carries the + # openidea-plugin tool for Linux x64, which that workflow and the registry's + # checks run. plugins: needs: create-release name: Official plugins @@ -237,11 +259,17 @@ jobs: version="$(sed -n 's/^version *= *"\(.*\)".*/\1/p' "$dir/plugin.toml" | head -1)" "$tool" pack "$dir" --key "$key" --publisher openidea --out "$out/$id-$version.oiplugin" done - # The published index's revocations and earlier keys carry over. + # The published index's revocations, earlier keys and community plugins carry over. curl -fsSL "https://github.com/$GITHUB_REPOSITORY/releases/latest/download/plugins-index.json" \ -o "$out/plugins-index.json" || rm -f "$out/plugins-index.json" - "$tool" index "$out" --publisher openidea --name OpenIDEA --key "$key" --out "$out/plugins-index.json" - gh release upload "$TAG" "$out"/*.oiplugin "$out/plugins-index.json" --clobber + # Downloads point at this release: older versions kept for older IDEs stay where they were published. + "$tool" index "$out" --publisher openidea --name OpenIDEA --key "$key" --out "$out/plugins-index.json" \ + --download-base "https://github.com/$GITHUB_REPOSITORY/releases/download/$TAG" + "$tool" merge "$out/plugins-index.json" "$COMMUNITY_PLUGINS_INDEX" --keep openidea || + echo "::warning::the community plugins were not refreshed" + gzip -9 -c "$tool" > "$out/openidea-plugin-linux-x86_64.gz" + gh release upload "$TAG" "$out"/*.oiplugin "$out/plugins-index.json" \ + "$out/openidea-plugin-linux-x86_64.gz" --clobber # The updater manifest (latest.json), built once from the signed bundles every build uploaded. # Fails when a platform is missing, so a release never ships a manifest without it. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6d10aacf..5dfa9ffd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -31,5 +31,10 @@ Project layout, coding rules, commands and checks are in [AGENTS.md](AGENTS.md). - If a change needs a product decision you can't make, ask in the issue and stop rather than guessing. +Plugins: pull requests here add or change official plugins (`plugins/official/`) +and the plugin API. Community plugins live in their authors' repositories and +are listed through [l0ng-ai/openidea-plugins](https://github.com/l0ng-ai/openidea-plugins); +see [`plugins/README.md`](plugins/README.md) § 8.1. + A check on each PR adds `needs-info` when the issue link or the verification section is missing, and removes it once they're filled in. diff --git a/Cargo.lock b/Cargo.lock index a9bce378..76ff7212 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4276,6 +4276,7 @@ dependencies = [ "regex-syntax", "reqwest", "rustix", + "semver", "serde", "serde_json", "specta", diff --git a/crates/ide-extension/src/lib.rs b/crates/ide-extension/src/lib.rs index 9089067a..fdf63d95 100644 --- a/crates/ide-extension/src/lib.rs +++ b/crates/ide-extension/src/lib.rs @@ -27,8 +27,8 @@ mod when; pub use capability::{Capability, CapabilityInfo, Risk, host_matches}; pub use index::ContributionIndex; pub use manifest::{ - ActivationEvent, Capabilities, ENGINE_VERSION, EVENT_KINDS, LEGACY_API, MANIFEST_FILE, Manifest, check_relative, - engine_compatible, validate_item_id, validate_plugin_id, validate_point_id, + ActivationEvent, CATEGORIES, Capabilities, ENGINE_VERSION, EVENT_KINDS, LEGACY_API, MANIFEST_FILE, MAX_CATEGORIES, + Manifest, check_relative, engine_compatible, validate_item_id, validate_plugin_id, validate_point_id, }; pub use point::{Commit, Disposable, ExtensionPoint, MAX_PACKAGE_FILE, Package, Placement, Prepared, decode}; pub use registry::{ContributionInfo, ExtensionRegistry, PreparedSet}; diff --git a/crates/ide-extension/src/manifest.rs b/crates/ide-extension/src/manifest.rs index 99820d5f..d079cff2 100644 --- a/crates/ide-extension/src/manifest.rs +++ b/crates/ide-extension/src/manifest.rs @@ -35,6 +35,11 @@ pub const MANIFEST_FILE: &str = "plugin.toml"; pub const ENGINE_VERSION: &str = "1.0.0"; /// The 0.1 API, still accepted for contribution-only packages and 0.1 components. pub const LEGACY_API: &str = "0.1"; +/// Marketplace categories, in the order they are shown. +pub const CATEGORIES: &[&str] = + &["languages", "themes", "icon-themes", "linters", "vcs", "ai", "frameworks", "tools", "other"]; +/// Categories a plugin is listed under; later ones are ignored. +pub const MAX_CATEGORIES: usize = 3; #[derive(Clone, Debug, PartialEq)] pub struct Manifest { @@ -47,6 +52,8 @@ pub struct Manifest { pub license: Option, /// Release notes of this version (Settings › Plugins › What's New). pub change_notes: Option, + /// Marketplace categories as declared (see [`Manifest::categories`]). + pub declared_categories: Vec, /// `engines.openidea` (a semver requirement), or the legacy `openidea-api`. pub engine: String, /// Written in the 0.1 format. @@ -166,6 +173,8 @@ struct Raw { #[serde(default)] change_notes: Option, #[serde(default)] + categories: Vec, + #[serde(default)] engines: Option, /// 0.1 format. #[serde(default)] @@ -243,6 +252,7 @@ impl Manifest { homepage: raw.homepage, license: raw.license, change_notes: raw.change_notes, + declared_categories: raw.categories, engine, legacy, wasm: raw.wasm, @@ -290,6 +300,9 @@ impl Manifest { return Err(format!("duplicate activation event {event}")); } } + for c in &self.declared_categories { + validate_item_id(c, "category")?; + } for (point, decls) in &self.contributes { validate_point_id(point)?; if !matches!(decls, toml::Value::Array(_) | toml::Value::Table(_)) { @@ -325,6 +338,39 @@ impl Manifest { } } +impl Manifest { + /// Its marketplace categories, in [`CATEGORIES`] order: the first + /// [`MAX_CATEGORIES`] declared that this IDE knows; without any, those its + /// contributions imply (themes, icon themes, languages), else `other`. + pub fn categories(&self) -> Vec { + let pick = |f: &dyn Fn(&str) -> bool| CATEGORIES.iter().filter(|c| f(c)).map(|c| c.to_string()).collect(); + let mut known: Vec<&str> = Vec::new(); + for d in &self.declared_categories { + if CATEGORIES.contains(&d.as_str()) && !known.contains(&d.as_str()) && known.len() < MAX_CATEGORIES { + known.push(d); + } + } + let mut out: Vec = pick(&|c| known.contains(&c)); + if out.is_empty() { + out = pick(&|c| match c { + "themes" => self.contributes.contains_key("themes"), + "icon-themes" => self.contributes.contains_key("iconThemes"), + "languages" => self.contributes.contains_key("languages"), + _ => false, + }); + } + if out.is_empty() { + out.push("other".into()); + } + out + } + + /// Declared categories this IDE doesn't know (ignored). + pub fn unknown_categories(&self) -> Vec<&str> { + self.declared_categories.iter().map(String::as_str).filter(|c| !CATEGORIES.contains(c)).collect() + } +} + /// Whether this host can load a plugin written for `engine`. pub fn engine_compatible(engine: &str, legacy: bool) -> bool { if legacy { @@ -417,6 +463,26 @@ mod tests { assert!(ActivationEvent::parse("on-event:scheduled").is_err(), "declared with on-schedule"); } + #[test] + fn categories_are_declared_or_implied() { + let head = "id = \"acme.x\"\nname = \"X\"\nversion = \"1.0.0\"\nengines.openidea = \"^1.0\"\n"; + let m = |rest: &str| Manifest::parse(&format!("{head}{rest}")); + // Declared, in the catalogue's order; unknown ones (a newer IDE's) are ignored. + let declared = m("categories = [\"tools\", \"vcs\", \"robots\"]\n").unwrap(); + assert_eq!(declared.categories(), ["vcs", "tools"]); + assert_eq!(declared.unknown_categories(), ["robots"]); + // None declared: implied by the contributions, else `other`. + let theme = m("[[contributes.themes]]\nid = \"t\"\n[[contributes.languages]]\nid = \"l\"\n").unwrap(); + assert_eq!(theme.categories(), ["languages", "themes"]); + let declared_wins = m("categories = [\"tools\"]\n[[contributes.languages]]\nid = \"l\"\n").unwrap(); + assert_eq!(declared_wins.categories(), ["tools"]); + assert_eq!(m("").unwrap().categories(), ["other"]); + // At most three: the first ones declared. + let many = m("categories = [\"vcs\", \"ai\", \"vcs\", \"tools\", \"themes\"]\n").unwrap(); + assert_eq!(many.categories(), ["vcs", "ai", "tools"]); + assert!(m("categories = [\"Bad Name\"]\n").is_err()); + } + #[test] fn parses_the_02_format() { let m = Manifest::parse(FULL).unwrap(); diff --git a/crates/ide-extension/src/package.rs b/crates/ide-extension/src/package.rs index b8d3988d..f1bc9c04 100644 --- a/crates/ide-extension/src/package.rs +++ b/crates/ide-extension/src/package.rs @@ -9,9 +9,19 @@ //! proves who published the bytes; whether to trust that publisher is the //! index's call. //! - **Index** (`index.json`): the publishers and their keys (the trust root), -//! the published plugins, and revocations. A publisher owns the id prefix -//! `.`; a revoked key invalidates everything it signed, a -//! revoked plugin version is disabled where it is installed. +//! the published plugin versions, and revocations. A publisher owns the id +//! prefix `.`; a revoked key invalidates everything it signed, a +//! revoked plugin version is disabled where it is installed. A plugin may be +//! listed in several versions, each with the plugin API it needs: the IDE +//! offers the newest one it can load. +//! - **Key continuity**: an installed plugin updates silently only to a +//! package signed with the same key, or with a key the installed one +//! endorsed ([`Endorsement`], a publisher rotating keys); any other signer +//! is the user's call. An IDE can pin a publisher to keys it was built with +//! ([`Index::pin_publisher`]): the index then can't replace them. +//! - **Format**: fields are only ever added (IDEs ignore those they don't +//! know); `format` grows only for changes older IDEs can't read, and they +//! still apply such an index's revocations ([`Index::parse`]). use crate::MANIFEST_FILE; use base64::Engine as _; @@ -40,6 +50,24 @@ fn signed_message(id: &str, version: &str, digest: &str) -> Vec { format!("openidea-plugin/1\n{id}\n{version}\n{digest}").into_bytes() } +fn endorsement_message(publisher: &str, key: &str) -> Vec { + format!("openidea-key/1\n{publisher}\n{key}").into_bytes() +} + +/// Whether `signature` (base64) is `key`'s (base64) Ed25519 signature of +/// `message`; malformed keys and signatures are errors. +fn verify_ed25519(key: &str, message: &[u8], signature: &str) -> Result { + let key: [u8; 32] = B64 + .decode(key) + .ok() + .and_then(|b| b.try_into().ok()) + .ok_or_else(|| "signature: malformed public key".to_owned())?; + let key = VerifyingKey::from_bytes(&key).map_err(|_| "signature: invalid public key".to_owned())?; + let sig: [u8; 64] = + B64.decode(signature).ok().and_then(|b| b.try_into().ok()).ok_or_else(|| "signature: malformed".to_owned())?; + Ok(key.verify_strict(message, &Signature::from_bytes(&sig)).is_ok()) +} + /// `SIGNATURE.json` of a signed package. #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -74,6 +102,12 @@ impl PublisherKey { B64.encode(self.0.verifying_key().to_bytes()) } + /// Vouches for `publisher`'s new key `key` (base64), the one that follows this one. + pub fn endorse(&self, publisher: &str, key: &str) -> Endorsement { + let sig = self.0.sign(&endorsement_message(publisher, key)); + Endorsement { key: self.public_base64(), signature: B64.encode(sig.to_bytes()) } + } + pub fn sign(&self, publisher: &str, id: &str, version: &str, digest: &str) -> PackageSignature { let sig = self.0.sign(&signed_message(id, version, digest)); PackageSignature { @@ -88,19 +122,11 @@ impl PackageSignature { /// Whether the signature is valid for `id`, `version` and `digest` (the /// key's validity is checked against an [`Index`]). pub fn check(&self, id: &str, version: &str, digest: &str) -> Result<(), String> { - let key: [u8; 32] = B64 - .decode(&self.key) - .ok() - .and_then(|b| b.try_into().ok()) - .ok_or_else(|| "signature: malformed public key".to_owned())?; - let key = VerifyingKey::from_bytes(&key).map_err(|_| "signature: invalid public key".to_owned())?; - let sig: [u8; 64] = B64 - .decode(&self.signature) - .ok() - .and_then(|b| b.try_into().ok()) - .ok_or_else(|| "signature: malformed".to_owned())?; - key.verify_strict(&signed_message(id, version, digest), &Signature::from_bytes(&sig)) - .map_err(|_| "the signature does not match the package (it was changed after signing)".to_owned()) + if verify_ed25519(&self.key, &signed_message(id, version, digest), &self.signature)? { + Ok(()) + } else { + Err("the signature does not match the package (it was changed after signing)".to_owned()) + } } } @@ -242,6 +268,10 @@ pub struct Index { pub plugins: Vec, #[serde(default)] pub revoked: Vec, + /// The marketplace moved: its index is at this URL (relative to this + /// one, or absolute), and the IDE reads that one instead. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub moved: Option, } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, specta::Type)] @@ -253,7 +283,7 @@ pub struct Publisher { pub keys: Vec, } -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, specta::Type)] +#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, specta::Type)] #[serde(rename_all = "camelCase")] pub struct KeyEntry { /// Ed25519 public key, base64. @@ -261,6 +291,27 @@ pub struct KeyEntry { /// Packages signed with it are no longer trusted. #[serde(default)] pub revoked: bool, + /// The publisher's earlier key vouching for this one. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub endorsement: Option, +} + +impl KeyEntry { + pub fn new(key: String) -> Self { + Self { key, ..Self::default() } + } +} + +/// A publisher's earlier key vouching for a newer one: plugins installed from +/// packages signed with the earlier key update to ones signed with the newer +/// key without asking the user. +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, specta::Type)] +#[serde(rename_all = "camelCase")] +pub struct Endorsement { + /// The endorsing key, base64. + pub key: String, + /// Its Ed25519 signature of `openidea-key/1\n\n`, base64. + pub signature: String, } /// A published plugin version. @@ -281,6 +332,34 @@ pub struct IndexEntry { pub digest: String, #[serde(default)] pub capabilities: Vec, + /// The plugin API versions it loads in (a semver requirement): its + /// manifest's `engines.openidea` and the API its component was built for. + /// Required: an entry without one is offered to no IDE. + #[serde(default)] + pub engine: String, + /// Marketplace categories (`CATEGORIES`); an IDE ignores those it doesn't know. + #[serde(default)] + pub categories: Vec, +} + +impl IndexEntry { + /// Whether this IDE can load the version. + pub fn compatible(&self) -> bool { + crate::engine_compatible(&self.engine, false) + } + + fn semver(&self) -> Option { + semver::Version::parse(&self.version).ok() + } +} + +/// `engines.openidea` of a manifest narrowed to the API its component was built +/// for (`major.minor`, if it has code): the requirement an index lists. +pub fn engine_requirement(manifest_engine: &str, built_for: Option<&semver::Version>) -> String { + match built_for { + Some(v) => format!("{manifest_engine}, ^{}.{}", v.major, v.minor), + None => manifest_engine.to_owned(), + } } /// A plugin (all versions when `versions` is empty) that must not run. @@ -294,12 +373,71 @@ pub struct Revocation { } impl Index { + /// Parses an index. One in a newer format keeps what must reach every IDE — + /// revocations, publisher keys (revoked ones) and `moved` — and lists no + /// plugins ([`Index::is_newer`]): the IDE needs updating to install from it. pub fn parse(text: &str) -> Result { - let index: Index = serde_json::from_str(text).map_err(|e| format!("index: {e}"))?; - if index.format != INDEX_FORMAT { - return Err(format!("index format {} is not supported (this IDE reads {INDEX_FORMAT})", index.format)); + let value: serde_json::Value = serde_json::from_str(text).map_err(|e| format!("index: {e}"))?; + let format = value.get("format").and_then(serde_json::Value::as_u64).ok_or("index: `format` is missing")?; + if format == u64::from(INDEX_FORMAT) { + return serde_json::from_value(value).map_err(|e| format!("index: {e}")); } - Ok(index) + if format < u64::from(INDEX_FORMAT) { + return Err(format!("index format {format} is not supported (this IDE reads {INDEX_FORMAT})")); + } + fn each(value: &serde_json::Value, field: &str) -> Vec { + let items = value.get(field).and_then(serde_json::Value::as_array); + items.into_iter().flatten().filter_map(|v| serde_json::from_value(v.clone()).ok()).collect() + } + Ok(Index { + format: u32::try_from(format).unwrap_or(u32::MAX), + publishers: each(&value, "publishers"), + plugins: Vec::new(), + revoked: each(&value, "revoked"), + moved: value.get("moved").and_then(serde_json::Value::as_str).map(str::to_owned), + }) + } + + /// Written in a format newer than this IDE reads: it lists no plugins. + pub fn is_newer(&self) -> bool { + self.format > INDEX_FORMAT + } + + /// The version of each plugin to offer, and whether this IDE can load it: + /// the newest it can load, else the newest. Revoked versions are skipped; + /// plugins come in the order they are first listed. + pub fn offered(&self) -> Vec<(&IndexEntry, bool)> { + let mut ids: Vec<&str> = Vec::new(); + for e in &self.plugins { + if !ids.contains(&e.id.as_str()) { + ids.push(&e.id); + } + } + ids.into_iter() + .filter_map(|id| { + let versions: Vec<&IndexEntry> = + self.plugins.iter().filter(|e| e.id == id && self.revocation(id, &e.version).is_none()).collect(); + let newest = |loadable: bool| { + versions.iter().copied().filter(|e| !loadable || e.compatible()).max_by_key(|e| e.semver()) + }; + newest(true).map(|e| (e, true)).or_else(|| newest(false).map(|e| (e, false))) + }) + .collect() + } + + /// Drops the versions no IDE would pick: revoked ones, and of each plugin + /// all but the newest version per API requirement. + pub fn prune_versions(&mut self) { + let plugins = std::mem::take(&mut self.plugins); + let mut kept: Vec = Vec::new(); + for e in plugins.into_iter().filter(|e| self.revocation(&e.id, &e.version).is_none()) { + match kept.iter_mut().find(|k| k.id == e.id && k.engine == e.engine) { + Some(k) if e.semver() > k.semver() => *k = e, + Some(_) => {} + None => kept.push(e), + } + } + self.plugins = kept; } /// The revocation that applies to `id` at `version`. @@ -335,6 +473,127 @@ impl Index { sig.check(id, version, digest)?; Ok(publisher.id.clone()) } + + /// Whether `to` is `from`, or a key of `publisher` that `from` endorsed, + /// directly or through keys it endorsed. Endorsements by revoked keys don't + /// count: whoever stole a key could vouch for their own. + pub fn succeeds(&self, publisher: &str, from: &str, to: &str) -> bool { + let keys = self.publishers.iter().find(|p| p.id == publisher).map_or(&[][..], |p| &p.keys[..]); + let mut key = to; + // Each step moves to an earlier key; more steps than keys is a loop. + for _ in 0..=keys.len() { + if key == from { + return true; + } + let Some(e) = keys.iter().find(|k| k.key == key).and_then(|k| k.endorsement.as_ref()) else { + return false; + }; + let endorser_valid = keys.iter().any(|k| k.key == e.key && !k.revoked); + if !endorser_valid || verify_ed25519(&e.key, &endorsement_message(publisher, key), &e.signature) != Ok(true) + { + return false; + } + key = &e.key; + } + false + } + + /// Makes `roots` (base64) the keys `publisher` signs with, whatever this + /// index says: another key it lists stays only when a root endorsed it (a + /// rotation the roots vouched for). Revocations of the keys are kept. + pub fn pin_publisher(&mut self, publisher: &str, name: &str, roots: &[String]) { + if roots.is_empty() { + return; + } + let i = match self.publishers.iter().position(|p| p.id == publisher) { + Some(i) => i, + None => { + self.publishers.push(Publisher { id: publisher.into(), name: name.into(), keys: Vec::new() }); + self.publishers.len() - 1 + } + }; + for root in roots { + if !self.publishers[i].keys.iter().any(|k| &k.key == root) { + self.publishers[i].keys.push(KeyEntry::new(root.clone())); + } + } + let keys = self.publishers[i].keys.clone(); + let trusted = keys + .into_iter() + .filter(|k| roots.iter().any(|r| self.succeeds(publisher, r, &k.key))) + .map(|k| if roots.contains(&k.key) { KeyEntry { endorsement: None, ..k } } else { k }) + .collect(); + self.publishers[i].keys = trusted; + } + + /// Replaces what this index lists for every publisher but `keep` with what + /// `other` lists: its publishers, their plugins and their revocations + /// (`other`'s downloads should already be absolute). `other` may only + /// speak for its own publishers, and none of them may be in `keep`. + pub fn include(&mut self, other: Index, keep: &[&str]) -> Result<(), String> { + let mut theirs: Vec<&str> = Vec::new(); + for p in &other.publishers { + if !publisher_id_ok(&p.id) { + return Err(format!("invalid publisher id {:?}: use a-z, 0-9, '-' and '_'", p.id)); + } + if keep.contains(&p.id.as_str()) { + return Err(format!("may not list publisher {:?}", p.id)); + } + if theirs.contains(&p.id.as_str()) { + return Err(format!("publisher {:?} is listed twice", p.id)); + } + theirs.push(&p.id); + } + let owned_by = |id: &str| theirs.iter().any(|p| owns(p, id)); + for e in &other.plugins { + if !theirs.contains(&e.publisher.as_str()) || !owns(&e.publisher, &e.id) { + return Err(format!("{}: not a plugin of publisher {:?}", e.id, e.publisher)); + } + if semver::VersionReq::parse(&e.engine).is_err() { + return Err(format!("{} {}: `engine` must be the plugin API it needs", e.id, e.version)); + } + } + if let Some(r) = other.revoked.iter().find(|r| !owned_by(&r.id)) { + return Err(format!("{}: revoked by an index that doesn't publish it", r.id)); + } + let kept = |id: &str| keep.iter().any(|p| owns(p, id)); + self.publishers.retain(|p| keep.contains(&p.id.as_str())); + self.plugins.retain(|e| keep.contains(&e.publisher.as_str())); + self.revoked.retain(|r| kept(&r.id)); + self.publishers.extend(other.publishers); + self.plugins.extend(other.plugins); + self.revoked.extend(other.revoked); + Ok(()) + } +} + +/// Whether a package signed `new` (`None`: unsigned) may replace an installed +/// one signed `installed` without asking the user: signed with the same key, +/// or with one the installed key endorsed (per `index`). An unsigned installed +/// copy pins nothing. +pub fn signer_continues( + index: Option<&Index>, + installed: Option<&PackageSignature>, + new: Option<&PackageSignature>, +) -> bool { + match (installed, new) { + (None, _) => true, + (Some(_), None) => false, + (Some(old), Some(new)) => { + old.publisher == new.publisher + && (old.key == new.key || index.is_some_and(|i| i.succeeds(&new.publisher, &old.key, &new.key))) + } + } +} + +/// Whether the plugin `id` is in `publisher`'s namespace. +fn owns(publisher: &str, id: &str) -> bool { + id.strip_prefix(publisher).is_some_and(|rest| rest.starts_with('.')) +} + +/// A publisher id is a single segment of a plugin id. +pub fn publisher_id_ok(id: &str) -> bool { + !id.contains('.') && crate::validate_plugin_id(id).is_ok() } #[cfg(test)] @@ -354,7 +613,7 @@ mod tests { publishers: vec![Publisher { id: "acme".into(), name: "ACME".into(), - keys: vec![KeyEntry { key: key.public_base64(), revoked: false }], + keys: vec![KeyEntry::new(key.public_base64())], }], plugins: Vec::new(), revoked: vec![Revocation { @@ -362,6 +621,7 @@ mod tests { versions: vec!["1.0.0".into()], reason: "malware".into(), }], + moved: None, } } @@ -399,6 +659,138 @@ mod tests { assert_eq!(PublisherKey::from_base64(&key.seed_base64()).unwrap().public_base64(), key.public_base64()); } + fn entry(id: &str, publisher: &str) -> IndexEntry { + IndexEntry { + id: id.into(), + name: id.into(), + version: "1.0.0".into(), + description: String::new(), + authors: Vec::new(), + publisher: publisher.into(), + download: format!("https://example.com/{id}.oiplugin"), + digest: "d".into(), + capabilities: Vec::new(), + engine: "^1.0".into(), + categories: Vec::new(), + } + } + + fn version(id: &str, version: &str, engine: &str) -> IndexEntry { + IndexEntry { version: version.into(), engine: engine.into(), ..entry(id, "acme") } + } + + #[test] + fn the_ide_is_offered_the_newest_version_it_can_load() { + let host = crate::ENGINE_VERSION; + let newer = semver::Version::parse(host).unwrap().major + 1; + let mut index = Index { + format: INDEX_FORMAT, + plugins: vec![ + version("acme.a", "1.0.0", &format!("^{host}")), + version("acme.a", "1.2.0", &format!("^{host}")), + version("acme.a", "2.0.0", &format!("^{newer}.0")), + version("acme.b", "0.1.0", &format!("^{newer}.0")), + version("acme.b", "0.2.0", &format!("^{newer}.1")), + version("acme.c", "1.0.0", ""), + version("acme.c", "1.1.0", ""), + ], + revoked: vec![Revocation { id: "acme.c".into(), versions: vec!["1.1.0".into()], reason: "r".into() }], + ..Index::default() + }; + let offered = |index: &Index| { + index.offered().into_iter().map(|(e, ok)| (e.id.clone(), e.version.clone(), ok)).collect::>() + }; + let expected = [ + ("acme.a".to_owned(), "1.2.0".to_owned(), true), + ("acme.b".to_owned(), "0.2.0".to_owned(), false), + // No `engine`: listed, but no IDE installs it. + ("acme.c".to_owned(), "1.0.0".to_owned(), false), + ]; + assert_eq!(offered(&index), expected); + + // Pruning keeps the newest version per requirement, which changes nothing offered. + index.prune_versions(); + let left: Vec<_> = index.plugins.iter().map(|e| format!("{} {}", e.id, e.version)).collect(); + assert_eq!(left, ["acme.a 1.2.0", "acme.a 2.0.0", "acme.b 0.1.0", "acme.b 0.2.0", "acme.c 1.0.0"]); + assert_eq!(offered(&index), expected); + + let built_for = semver::Version::new(1, 3, 0); + assert_eq!(engine_requirement("^1.0", Some(&built_for)), "^1.0, ^1.3"); + assert_eq!(engine_requirement("^1.0", None), "^1.0"); + assert!(semver::VersionReq::parse(&engine_requirement("^1.0", Some(&built_for))).is_ok()); + } + + fn publisher(id: &str) -> Publisher { + Publisher { id: id.into(), name: id.into(), keys: vec![KeyEntry::new(format!("{id}-key"))] } + } + + fn revocation(id: &str) -> Revocation { + Revocation { id: id.into(), versions: Vec::new(), reason: "r".into() } + } + + #[test] + fn including_an_index_replaces_everything_but_the_kept_publishers() { + let mut official = Index { + format: INDEX_FORMAT, + publishers: vec![publisher("openidea"), publisher("gone")], + plugins: vec![entry("openidea.a", "openidea"), entry("gone.x", "gone")], + revoked: vec![revocation("openidea.old"), revocation("gone.x")], + moved: None, + }; + let community = Index { + format: INDEX_FORMAT, + publishers: vec![publisher("alice")], + plugins: vec![entry("alice.arthas", "alice")], + revoked: vec![revocation("alice.bad")], + moved: None, + }; + official.include(community.clone(), &["openidea"]).unwrap(); + let ids = |v: &[IndexEntry]| v.iter().map(|e| e.id.clone()).collect::>(); + assert_eq!(official.publishers.iter().map(|p| p.id.as_str()).collect::>(), ["openidea", "alice"]); + assert_eq!(ids(&official.plugins), ["openidea.a", "alice.arthas"]); + assert_eq!(official.revoked.iter().map(|r| r.id.as_str()).collect::>(), ["openidea.old", "alice.bad"]); + + // Including again is idempotent. + let once = official.clone(); + official.include(community.clone(), &["openidea"]).unwrap(); + assert_eq!(official, once); + } + + #[test] + fn an_included_index_speaks_only_for_its_own_publishers() { + let base = Index { format: INDEX_FORMAT, publishers: vec![publisher("openidea")], ..Index::default() }; + let with = |publishers: Vec, plugins: Vec, revoked: Vec| Index { + format: INDEX_FORMAT, + publishers, + plugins, + revoked, + moved: None, + }; + let cases = [ + (with(vec![publisher("openidea")], vec![], vec![]), "may not list"), + (with(vec![publisher("alice"), publisher("alice")], vec![], vec![]), "listed twice"), + (with(vec![publisher("openidea.x")], vec![], vec![]), "invalid publisher"), + (with(vec![publisher("alice")], vec![entry("openidea.a", "alice")], vec![]), "not a plugin of"), + (with(vec![publisher("alice")], vec![entry("alice.a", "bob")], vec![]), "not a plugin of"), + (with(vec![publisher("alice")], vec![entry("alicex.a", "alice")], vec![]), "not a plugin of"), + (with(vec![publisher("alice")], vec![], vec![revocation("openidea.a")]), "doesn't publish"), + ( + with( + vec![publisher("alice")], + vec![IndexEntry { engine: String::new(), ..entry("alice.a", "alice") }], + vec![], + ), + "`engine`", + ), + ]; + for (other, error) in cases { + let mut index = base.clone(); + let err = index.include(other, &["openidea"]).unwrap_err(); + assert!(err.contains(error), "{err}"); + assert_eq!(index, base); + } + } + #[test] fn unpacking_refuses_paths_leaving_the_package() { let tmp = tempfile::tempdir().unwrap(); @@ -413,7 +805,7 @@ mod tests { let err = unpack(&out, &tmp.path().join("dest")).unwrap_err(); assert!(err.contains("invalid path"), "{err}"); assert!(!tmp.path().join("outside.txt").exists()); - assert!(Index::parse(r#"{"format": 2}"#).is_err()); + assert!(Index::parse(r#"{"format": 2}"#).unwrap().is_newer()); } fn zip_of(path: &Path, entries: &[(&str, &str)]) { @@ -462,4 +854,102 @@ mod tests { assert!(err.contains("is not an OpenIDEA plugin"), "{name}: {err}"); } } + + #[test] + fn a_newer_index_still_revokes_and_moves() { + let newer = format!( + r#"{{"format": {}, "plugins": [{{"anything": "new"}}], "shape": "changed", + "publishers": [{{"id": "acme", "name": "ACME", "keys": [{{"key": "k1", "revoked": true}}]}}, {{"id": 5}}], + "revoked": [{{"id": "acme.bad", "reason": "malware"}}, {{"oops": 1}}], + "moved": "https://example.com/next.json"}}"#, + INDEX_FORMAT + 1 + ); + let index = Index::parse(&newer).unwrap(); + assert!(index.is_newer()); + assert!(index.plugins.is_empty() && index.offered().is_empty()); + assert_eq!(index.revocation("acme.bad", "2.0.0").unwrap().reason, "malware"); + assert!(index.key_revoked("k1")); + assert_eq!(index.moved.as_deref(), Some("https://example.com/next.json")); + // Fields this IDE doesn't know are ignored in its own format. + let current = format!(r#"{{"format": {INDEX_FORMAT}, "later": true, "plugins": []}}"#); + assert!(!Index::parse(¤t).unwrap().is_newer()); + assert!(Index::parse(r#"{"format": 0}"#).unwrap_err().contains("not supported")); + assert!(Index::parse(r#"{"plugins": []}"#).is_err()); + } + + fn keys<'a>(index: &'a mut Index, publisher: &str) -> &'a mut Vec { + &mut index.publishers.iter_mut().find(|p| p.id == publisher).unwrap().keys + } + + #[test] + fn rotated_keys_continue_through_endorsements() { + let (k1, k2, k3) = + (PublisherKey::from_seed([1; 32]), PublisherKey::from_seed([2; 32]), PublisherKey::from_seed([3; 32])); + let mut index = index(&k1); + let endorsed = |by: &PublisherKey, key: &PublisherKey| KeyEntry { + endorsement: Some(by.endorse("acme", &key.public_base64())), + ..KeyEntry::new(key.public_base64()) + }; + keys(&mut index, "acme").push(endorsed(&k1, &k2)); + keys(&mut index, "acme").push(endorsed(&k2, &k3)); + let (p1, p2, p3) = (k1.public_base64(), k2.public_base64(), k3.public_base64()); + assert!(index.succeeds("acme", &p1, &p1)); + assert!(index.succeeds("acme", &p1, &p3), "through k2"); + assert!(!index.succeeds("acme", &p3, &p1), "not backwards"); + assert!(!index.succeeds("other", &p1, &p2)); + // An endorsement for another publisher, or by a revoked key, doesn't count. + let mut foreign = index.clone(); + keys(&mut foreign, "acme")[1].endorsement = Some(k1.endorse("evil", &p2)); + assert!(!foreign.succeeds("acme", &p1, &p2)); + let mut stolen = index.clone(); + keys(&mut stolen, "acme")[0].revoked = true; + assert!(!stolen.succeeds("acme", &p1, &p2)); + + let sig = |key: &PublisherKey| key.sign("acme", "acme.tools", "1.0.0", "d"); + assert!(signer_continues(Some(&index), Some(&sig(&k1)), Some(&sig(&k3)))); + assert!(signer_continues(None, Some(&sig(&k1)), Some(&sig(&k1)))); + assert!(!signer_continues(None, Some(&sig(&k1)), Some(&sig(&k2))), "no index to vouch"); + let stranger = PublisherKey::from_seed([4; 32]); + assert!(!signer_continues(Some(&index), Some(&sig(&k1)), Some(&sig(&stranger)))); + assert!(!signer_continues(Some(&index), Some(&sig(&k1)), None), "signed, then unsigned"); + assert!(signer_continues(Some(&index), None, Some(&sig(&stranger))), "unsigned pins nothing"); + } + + #[test] + fn pinned_publishers_keep_their_built_in_keys() { + let (root, next, intruder) = + (PublisherKey::from_seed([1; 32]), PublisherKey::from_seed([2; 32]), PublisherKey::from_seed([5; 32])); + let mut index = index(&intruder); + index.publishers[0].id = "openidea".into(); + keys(&mut index, "openidea").push(KeyEntry { + endorsement: Some(root.endorse("openidea", &next.public_base64())), + ..KeyEntry::new(next.public_base64()) + }); + let roots = [root.public_base64()]; + let listed = |index: &Index| -> Vec<(String, bool)> { + let mut index = index.clone(); + index.pin_publisher("openidea", "OpenIDEA", &roots); + keys(&mut index, "openidea").iter().map(|k| (k.key.clone(), k.revoked)).collect() + }; + // The intruder's key goes, the successor the root endorsed stays, the root is added. + assert_eq!(listed(&index), [(next.public_base64(), false), (root.public_base64(), false)]); + let mut pinned = index.clone(); + pinned.pin_publisher("openidea", "OpenIDEA", &roots); + let digest = "d"; + let signed = |k: &PublisherKey| k.sign("openidea", "openidea.tools", "1.0.0", digest); + assert!(pinned.verify(&signed(&intruder), "openidea.tools", "1.0.0", digest).is_err()); + assert!(pinned.verify(&signed(&next), "openidea.tools", "1.0.0", digest).is_ok()); + // A revoked root stays revoked, and what it endorsed is no longer trusted. + keys(&mut index, "openidea").push(KeyEntry { revoked: true, ..KeyEntry::new(root.public_base64()) }); + assert_eq!(listed(&index), [(root.public_base64(), true)]); + + // A publisher missing from the index is added with its roots. + let mut empty = Index { format: INDEX_FORMAT, ..Index::default() }; + empty.pin_publisher("openidea", "OpenIDEA", &[root.public_base64()]); + assert_eq!(empty.verify(&signed(&root), "openidea.tools", "1.0.0", digest).unwrap(), "openidea"); + // No roots: the index decides. + let mut open = index.clone(); + open.pin_publisher("openidea", "OpenIDEA", &[]); + assert_eq!(open, index); + } } diff --git a/crates/ide-host/Cargo.toml b/crates/ide-host/Cargo.toml index 70c843e7..a8473b6b 100644 --- a/crates/ide-host/Cargo.toml +++ b/crates/ide-host/Cargo.toml @@ -46,6 +46,7 @@ ide-extension.workspace = true ide-plugin.workspace = true ide-tools = { path = "../ide-tools" } ide-docker = { path = "../ide-docker" } +semver = "1" serde.workspace = true serde_json.workspace = true toml.workspace = true diff --git a/crates/ide-host/src/bin/openidea-plugin/main.rs b/crates/ide-host/src/bin/openidea-plugin/main.rs index 99b73630..c0bee922 100644 --- a/crates/ide-host/src/bin/openidea-plugin/main.rs +++ b/crates/ide-host/src/bin/openidea-plugin/main.rs @@ -3,13 +3,15 @@ //! ```text //! openidea-plugin new [--template command|theme|icon-theme|language] [--id ID] [--name NAME] [--sdk PATH] //! openidea-plugin build [dir] [--debug] # cargo → dist/plugin.wasm, then `check` -//! openidea-plugin check [dir] # validate the package as the IDE would install it +//! openidea-plugin check [dir|package] # validate the package as the IDE would install it //! openidea-plugin link [dir] # load the folder in the IDE without installing it //! openidea-plugin unlink [dir] //! openidea-plugin links # list linked folders //! openidea-plugin keygen # a publisher's Ed25519 key +//! openidea-plugin endorse --key OLD --publisher ID # vouch for a new key //! openidea-plugin pack [dir] [--key F --publisher ID] [--out FILE] # -.oiplugin -//! openidea-plugin index --publisher ID --name NAME --key F # marketplace index.json +//! openidea-plugin index [--publisher ID --name NAME --key F [--previous-key F]] # marketplace index.json +//! openidea-plugin merge --keep ID # list another index's publishers //! ``` //! //! `link` writes `links.json` in the IDE's plugins directory @@ -20,7 +22,7 @@ mod templates; use ide_extension::{Manifest, validate_plugin_id}; -use ide_host::plugins::PluginHost; +use ide_host::plugins::{PluginHost, read_market_url, resolve_market_href}; use ide_plugin::{Limits, PluginEngine}; use std::path::{Path, PathBuf}; use std::process::{Command, ExitCode}; @@ -33,15 +35,27 @@ commands: new [--template T] [--id ID] [--name NAME] [--sdk PATH] create a plugin; T = command (default), theme, icon-theme, language build [dir] [--debug] compile a Rust plugin to dist/plugin.wasm and check it - check [dir] validate the package as the IDE would install it + check [dir|package] validate the package (folder or .oiplugin) as the IDE would install it link [dir] load the folder in the IDE without installing it unlink [dir] stop loading a linked folder links list linked folders keygen create a publisher signing key (keep the file secret) + endorse --key F --publisher ID + print an earlier key's endorsement of a new one (JSON), for an + index the publisher doesn't write with `index --previous-key` pack [dir] [--key F --publisher ID] [--out FILE] write -.oiplugin, signed with the key - index --publisher ID --name NAME --key F [--out FILE] - write the marketplace index.json for the packages in dir + index [--publisher ID --name NAME --key F [--previous-key F]] [--out FILE] + [--download-base URL] + write the marketplace index.json for the packages in dir: with a + key, register it and list that publisher's plugins (earlier + versions stay for older IDEs); without, list only these packages, + each checked against the index's publishers. A new key replacing + an earlier one is endorsed with --previous-key, so installed + plugins update to it without asking + merge --keep ID [--out FILE] + replace every publisher but ID in index with those of other-index + (a path or URL), their plugins and revocations environment: OPENIDEA_PLUGINS_DIR the IDE's plugins directory (default: the app data directory)"; @@ -51,13 +65,15 @@ fn main() -> ExitCode { let result = match args.first().map(String::as_str) { Some("new") => cmd_new(&args[1..]), Some("build") => cmd_build(&args[1..]), - Some("check") => dir_arg(&args[1..]).and_then(|d| check(&d)), + Some("check") => dir_arg(&args[1..]).and_then(|d| check_path(&d)), Some("link") => dir_arg(&args[1..]).and_then(|d| link(&d, true)), Some("unlink") => dir_arg(&args[1..]).and_then(|d| link(&d, false)), Some("links") => list_links(), Some("keygen") => cmd_keygen(&args[1..]), + Some("endorse") => cmd_endorse(&args[1..]), Some("pack") => cmd_pack(&args[1..]), Some("index") => cmd_index(&args[1..]), + Some("merge") => cmd_merge(&args[1..]), Some("--version" | "-V") => { println!("openidea-plugin {} (plugin API {})", env!("CARGO_PKG_VERSION"), ide_extension::ENGINE_VERSION); Ok(()) @@ -323,10 +339,21 @@ fn ensure_wasm_target() { /// Validates `dir` exactly as Install from Disk would, and checks the /// component imports only the plugin API. +/// [`check`] of a folder, or of a package file unpacked as installing would. +fn check_path(path: &Path) -> Result<(), String> { + if !path.is_file() { + return check(path); + } + let tmp = scratch_dir("unpack")?; + let dir = tmp.path().join("package"); + package::unpack(path, &dir).and_then(|_| check(&dir)) +} + fn check(dir: &Path) -> Result<(), String> { let dir = canonical(dir)?; - let scratch = std::env::temp_dir().join(format!("openidea-plugin-check-{}", std::process::id())); - let result = (|| { + let tmp = scratch_dir("check")?; + let scratch = tmp.path().join("host"); + (|| { let host = PluginHost::new(scratch.clone(), Arc::new(|_: Option<&str>, _| {}), Limits::default()) .map_err(|e| e.to_string())?; let preview = host.preview_install(&dir).map_err(|e| e.to_string())?; @@ -345,6 +372,17 @@ fn check(dir: &Path) -> Result<(), String> { } else { println!(" code: none (contributions only)"); } + println!(" categories: {}", manifest.categories().join(", ")); + for c in manifest.unknown_categories() { + println!(" warning: unknown category {c:?} (ignored); use {}", ide_extension::CATEGORIES.join(", ")); + } + if manifest.declared_categories.len() > ide_extension::MAX_CATEGORIES { + println!( + " warning: only the first {} known categories are used; {} are declared", + ide_extension::MAX_CATEGORIES, + manifest.declared_categories.len() + ); + } if !manifest.activation.is_empty() { let events: Vec = manifest.activation.iter().map(ToString::to_string).collect(); println!(" activation: {}", events.join(", ")); @@ -361,9 +399,7 @@ fn check(dir: &Path) -> Result<(), String> { } println!("ok"); Ok(()) - })(); - let _ = std::fs::remove_dir_all(&scratch); - result + })() } fn human_size(bytes: u64) -> String { @@ -479,14 +515,31 @@ fn cmd_keygen(args: &[String]) -> Result<(), String> { Ok(()) } +fn cmd_endorse(args: &[String]) -> Result<(), String> { + let a = Args::parse(args, &[], &["key", "publisher"])?; + let usage = "usage: openidea-plugin endorse --key --publisher ID"; + let ([new], Some(key), Some(publisher)) = (a.positional.as_slice(), a.value("key"), a.value("publisher")) else { + return Err(usage.into()); + }; + if !package::publisher_id_ok(publisher) { + return Err(format!("invalid publisher id {publisher:?}")); + } + let endorsement = read_key(key)?.endorse(publisher, new.trim()); + println!("{}", serde_json::to_string_pretty(&endorsement).map_err(|e| e.to_string())?); + Ok(()) +} + +/// A fresh scratch directory, removed when dropped. +fn scratch_dir(what: &str) -> Result { + tempfile::Builder::new().prefix(&format!("openidea-plugin-{what}-")).tempdir().map_err(|e| e.to_string()) +} + /// A scratch host to list a package's files as the IDE would. fn with_scratch_host(f: impl FnOnce(&PluginHost) -> Result) -> Result { - let scratch = std::env::temp_dir().join(format!("openidea-plugin-pack-{}", std::process::id())); - let result = PluginHost::new(scratch.clone(), Arc::new(|_: Option<&str>, _| {}), Limits::default()) + let tmp = scratch_dir("host")?; + PluginHost::new(tmp.path().join("host"), Arc::new(|_: Option<&str>, _| {}), Limits::default()) .map_err(|e| e.to_string()) - .and_then(|h| f(&h)); - let _ = std::fs::remove_dir_all(&scratch); - result + .and_then(|h| f(&h)) } fn cmd_pack(args: &[String]) -> Result<(), String> { @@ -522,29 +575,28 @@ fn cmd_pack(args: &[String]) -> Result<(), String> { } fn cmd_index(args: &[String]) -> Result<(), String> { - let a = Args::parse(args, &[], &["publisher", "name", "key", "out"])?; + let a = Args::parse(args, &[], &["publisher", "name", "key", "previous-key", "out", "download-base"])?; let dir = canonical(&a.dir()?)?; - let publisher = a.value("publisher").ok_or("--publisher is required")?; - let name = a.value("name").unwrap_or(publisher); - let key = read_key(a.value("key").ok_or("--key is required")?)?; let out = a.value("out").map(PathBuf::from).unwrap_or_else(|| dir.join("index.json")); + let base = a.value("download-base").map(|b| b.trim_end_matches('/')); // Revocations and other publishers of an existing index are kept. let mut index = match std::fs::read_to_string(&out) { - Ok(text) => Index::parse(&text)?, + Ok(text) => current_format(Index::parse(&text)?, &out.to_string_lossy())?, Err(_) => Index { format: package::INDEX_FORMAT, ..Index::default() }, }; - // Earlier keys of the publisher stay listed (packages they signed remain valid until revoked). - let current = key.public_base64(); - let earlier: Vec = index - .publishers - .iter() - .filter(|p| p.id == publisher) - .flat_map(|p| p.keys.iter().filter(|k| k.key != current).cloned()) - .collect(); - index.publishers.retain(|p| p.id != publisher); - let keys: Vec = std::iter::once(KeyEntry { key: current, revoked: false }).chain(earlier).collect(); - index.publishers.push(package::Publisher { id: publisher.into(), name: name.into(), keys }); - index.plugins.clear(); + let publisher = match (a.value("publisher"), a.value("key")) { + (Some(publisher), Some(key)) => { + let key = read_key(key)?; + let name = a.value("name").unwrap_or(publisher); + let previous = a.value("previous-key").map(read_key).transpose()?; + index.publishers = + register_key(std::mem::take(&mut index.publishers), publisher, name, &key, previous.as_ref())?; + Some(publisher) + } + (None, None) if a.has("previous-key") => return Err("--previous-key goes with --publisher and --key".into()), + (None, None) => None, + _ => return Err("--publisher and --key go together".into()), + }; let mut packages: Vec = std::fs::read_dir(&dir) .map_err(|e| e.to_string())? .flatten() @@ -552,35 +604,144 @@ fn cmd_index(args: &[String]) -> Result<(), String> { .filter(|p| p.extension().is_some_and(|e| e == package::PACKAGE_EXTENSION)) .collect(); packages.sort(); + let engine = PluginEngine::new()?; + let mut added: Vec = Vec::new(); for path in packages { - let scratch = std::env::temp_dir().join(format!("openidea-plugin-index-{}", std::process::id())); - let _ = std::fs::remove_dir_all(&scratch); - let unpacked = package::unpack(&path, &scratch)?; + let tmp = scratch_dir("index")?; + let scratch = tmp.path().join("package"); let entry = (|| { + let unpacked = package::unpack(&path, &scratch)?; let m = Manifest::load(&scratch)?; let files = with_scratch_host(|h| h.package_files_of(&scratch).map_err(|e| e.to_string()))?; let digest = package::package_digest(&scratch, &files).map_err(|e| e.to_string())?; - let sig = unpacked.signature.as_ref().ok_or_else(|| format!("{}: not signed", path.display()))?; - sig.check(&m.id, &m.version, &digest).map_err(|e| format!("{}: {e}", path.display()))?; + let sig = unpacked.signature.as_ref().ok_or("not signed")?; + let signer = index.verify(sig, &m.id, &m.version, &digest)?; + if publisher.is_some_and(|p| p != signer) { + return Err(format!("signed by {signer}, not {}", publisher.unwrap_or_default())); + } + if added.iter().any(|e| (&e.id, &e.version) == (&m.id, &m.version)) { + return Err(format!("another package of {} {} is in the folder", m.id, m.version)); + } + if m.legacy { + return Err("plugin.toml uses the 0.1 format; see plugins/README.md".into()); + } + let built_for = match &m.wasm { + Some(wasm) => engine.check_component(&engine.compile(&scratch.join(wasm))?)?, + None => None, + }; + let file = path.file_name().map(|n| n.to_string_lossy().into_owned()).unwrap_or_default(); Ok::<_, String>(IndexEntry { id: m.id.clone(), name: m.name.clone(), version: m.version.clone(), description: m.description.clone(), authors: m.authors.clone(), - publisher: sig.publisher.clone(), - download: path.file_name().map(|n| n.to_string_lossy().into_owned()).unwrap_or_default(), + publisher: signer, + download: base.map_or_else(|| file.clone(), |b| format!("{b}/{file}")), digest, capabilities: m.capabilities.all().map(|c| c.to_string()).collect(), + engine: package::engine_requirement(&m.engine, built_for.as_ref()), + categories: m.categories(), }) })(); - let _ = std::fs::remove_dir_all(&scratch); - let entry = entry?; - println!(" {} {}", entry.id, entry.version); - index.plugins.push(entry); + let entry = entry.map_err(|e| format!("{}: {e}", path.display()))?; + println!(" {} {} (plugin API {})", entry.id, entry.version, entry.engine); + added.push(entry); } - let json = serde_json::to_string_pretty(&index).map_err(|e| e.to_string())?; - std::fs::write(&out, json).map_err(|e| format!("{}: {e}", out.display()))?; + // A publisher's earlier versions of these plugins stay for IDEs that can't load the new + // ones (pruned below); plugins no longer in the folder go. + index.plugins.retain(|e| match publisher { + Some(p) => { + e.publisher != p + || (added.iter().any(|n| n.id == e.id) + && !added.iter().any(|n| (&n.id, &n.version) == (&e.id, &e.version))) + } + None => false, + }); + index.plugins.extend(added); + index.prune_versions(); + write_index(&index, &out) +} + +/// `publishers` with `key` as `publisher`'s current key. Earlier keys stay listed +/// (packages they signed remain valid until revoked); a key new to the +/// publisher is endorsed by `previous`, one of them, so installed plugins +/// signed with it update without asking. +fn register_key( + mut publishers: Vec, + publisher: &str, + name: &str, + key: &PublisherKey, + previous: Option<&PublisherKey>, +) -> Result, String> { + let current = key.public_base64(); + let earlier: Vec = publishers.iter().filter(|p| p.id == publisher).flat_map(|p| p.keys.clone()).collect(); + let entry = match earlier.iter().find(|k| k.key == current) { + Some(listed) => listed.clone(), + None => { + let endorsement = match previous { + Some(prev) => { + let prev_key = prev.public_base64(); + if !earlier.iter().any(|k| k.key == prev_key && !k.revoked) { + return Err(format!("--previous-key is not one of {publisher}'s valid keys in the index")); + } + Some(prev.endorse(publisher, ¤t)) + } + None => { + if earlier.iter().any(|k| !k.revoked) { + println!( + " warning: {publisher}'s new key is not endorsed (--previous-key): users who installed \ + its plugins will be asked to confirm the change when they update" + ); + } + None + } + }; + KeyEntry { endorsement, ..KeyEntry::new(current.clone()) } + } + }; + let keys = std::iter::once(entry).chain(earlier.into_iter().filter(|k| k.key != current)).collect(); + publishers.retain(|p| p.id != publisher); + publishers.push(package::Publisher { id: publisher.into(), name: name.into(), keys }); + Ok(publishers) +} + +/// `index`, unless a newer `openidea-plugin` wrote it (rewriting it would drop what this one can't read). +fn current_format(index: Index, file: &str) -> Result { + if index.is_newer() { + return Err(format!( + "{file}: index format {} is newer than this tool writes; update openidea-plugin", + index.format + )); + } + Ok(index) +} + +fn cmd_merge(args: &[String]) -> Result<(), String> { + let a = Args::parse(args, &[], &["keep", "out"])?; + let [base, other] = a.positional.as_slice() else { + return Err("usage: openidea-plugin merge --keep ID [--out FILE]".into()); + }; + let keep = a.value("keep").ok_or("--keep is required")?; + let out = a.value("out").unwrap_or(base); + let mut index = + current_format(Index::parse(&std::fs::read_to_string(base).map_err(|e| format!("{base}: {e}"))?)?, base)?; + let bytes = read_market_url(other, 16 << 20)?; + let theirs = Index::parse(&String::from_utf8(bytes).map_err(|_| format!("{other}: not UTF-8"))?)?; + let mut theirs = current_format(theirs, other)?; + // Their downloads are relative to their index, not to ours. + for e in &mut theirs.plugins { + e.download = resolve_market_href(other, &e.download); + } + let count = theirs.plugins.len(); + index.include(theirs, &[keep]).map_err(|e| format!("{other}: {e}"))?; + println!(" {count} plugins from {other}"); + write_index(&index, Path::new(out)) +} + +fn write_index(index: &Index, out: &Path) -> Result<(), String> { + let json = serde_json::to_string_pretty(index).map_err(|e| e.to_string())?; + std::fs::write(out, json).map_err(|e| format!("{}: {e}", out.display()))?; println!("-> {} ({} plugins)", out.display(), index.plugins.len()); Ok(()) } @@ -589,6 +750,25 @@ fn cmd_index(args: &[String]) -> Result<(), String> { mod tests { use super::*; + #[test] + fn a_new_key_is_endorsed_by_the_previous_one() { + let (k1, k2, k3) = + (PublisherKey::from_seed([1; 32]), PublisherKey::from_seed([2; 32]), PublisherKey::from_seed([3; 32])); + let first = register_key(Vec::new(), "acme", "ACME", &k1, None).unwrap(); + let rotated = register_key(first.clone(), "acme", "ACME", &k2, Some(&k1)).unwrap(); + let index = Index { format: package::INDEX_FORMAT, publishers: rotated.clone(), ..Index::default() }; + assert!(index.succeeds("acme", &k1.public_base64(), &k2.public_base64())); + assert_eq!(rotated[0].keys.len(), 2, "the earlier key stays listed"); + // Registering the current key again keeps its endorsement. + let again = register_key(rotated.clone(), "acme", "ACME", &k2, None).unwrap(); + assert_eq!(again, rotated); + // Only a key the publisher has can endorse. + assert!(register_key(first.clone(), "acme", "ACME", &k2, Some(&k3)).unwrap_err().contains("--previous-key")); + // Without one the new key is listed unendorsed. + let unendorsed = register_key(first, "acme", "ACME", &k3, None).unwrap(); + assert!(unendorsed[0].keys[0].endorsement.is_none()); + } + #[test] fn names() { assert_eq!(slugify("My Cool_Plugin"), "my-cool-plugin"); @@ -601,6 +781,126 @@ mod tests { assert_eq!(relative(Path::new("/x/y"), Path::new("/z")), None); } + /// A theme package `id` signed by `publisher` with `key`, packed into `out`. + fn signed_theme(tmp: &Path, id: &str, publisher: &str, key: &str, out: &Path) { + signed_theme_version(tmp, id, "0.1.0", "^1.0", publisher, key, out); + } + + fn signed_theme_version(tmp: &Path, id: &str, version: &str, engine: &str, publisher: &str, key: &str, out: &Path) { + let src = tmp.join("src").join(format!("{id}-{version}")); + let vars = templates::Vars { id, name: id, sdk: None }; + for (rel, content) in templates::render(templates::Template::Theme, &vars) { + let path = src.join(rel); + std::fs::create_dir_all(path.parent().unwrap()).unwrap(); + let content = content + .replace("version = \"0.1.0\"", &format!("version = \"{version}\"")) + .replace("engines.openidea = \"^1.0\"", &format!("engines.openidea = \"{engine}\"")); + std::fs::write(path, content).unwrap(); + } + std::fs::create_dir_all(out).unwrap(); + let args = [src.to_str().unwrap(), "--key", key, "--publisher", publisher, "--out"] + .into_iter() + .map(String::from) + .chain([out.join(format!("{id}-{version}.oiplugin")).to_string_lossy().into_owned()]) + .collect::>(); + cmd_pack(&args).unwrap(); + } + + #[test] + fn a_release_keeps_the_versions_older_ides_need() { + let tmp = tempfile::tempdir().unwrap(); + let t = tmp.path(); + let key = t.join("acme.key"); + std::fs::write(&key, PublisherKey::from_seed([5; 32]).seed_base64()).unwrap(); + let key = key.to_string_lossy().into_owned(); + let index_file = t.join("index.json"); + let release = |n: usize, packages: &[(&str, &str, &str)]| { + let dir = t.join(format!("release-{n}")); + for (id, version, engine) in packages { + signed_theme_version(t, id, version, engine, "acme", &key, &dir); + } + let base = format!("https://example.com/download/v{n}"); + let args = [dir.to_str().unwrap(), "--publisher", "acme", "--key", &key, "--download-base", &base]; + cmd_index(&strings(&[&args[..], &["--out", index_file.to_str().unwrap()]].concat())).unwrap(); + let index = Index::parse(&std::fs::read_to_string(&index_file).unwrap()).unwrap(); + index.plugins.iter().map(|e| format!("{} {} {}", e.id, e.version, e.download)).collect::>() + }; + release(1, &[("acme.a", "1.0.0", "^1.0"), ("acme.b", "1.0.0", "^1.0")]); + // Same requirement: the newer version replaces it; acme.b is gone from the release. + assert_eq!( + release(2, &[("acme.a", "1.1.0", "^1.0")]), + ["acme.a 1.1.0 https://example.com/download/v2/acme.a-1.1.0.oiplugin"] + ); + // Another API requirement: the last version for the earlier one stays, where it was published. + assert_eq!( + release(3, &[("acme.a", "2.0.0", ">=1.0, <2")]), + [ + "acme.a 1.1.0 https://example.com/download/v2/acme.a-1.1.0.oiplugin", + "acme.a 2.0.0 https://example.com/download/v3/acme.a-2.0.0.oiplugin", + ] + ); + let index = Index::parse(&std::fs::read_to_string(&index_file).unwrap()).unwrap(); + assert_eq!(index.offered()[0].0.version, "2.0.0", "the newest this IDE can load"); + } + + fn strings(args: &[&str]) -> Vec { + args.iter().map(|a| a.to_string()).collect() + } + + #[test] + fn official_and_community_indexes_merge() { + let tmp = tempfile::tempdir().unwrap(); + let t = tmp.path(); + let mut keys = Vec::new(); + for (name, seed) in [("openidea", 1), ("alice", 2), ("carol", 3)] { + let file = t.join(format!("{name}.key")); + let key = PublisherKey::from_seed([seed; 32]); + std::fs::write(&file, key.seed_base64()).unwrap(); + keys.push((file.to_string_lossy().into_owned(), key.public_base64())); + } + let (official, community) = (t.join("official"), t.join("community")); + signed_theme(t, "openidea.night", "openidea", &keys[0].0, &official); + signed_theme(t, "alice.dawn", "alice", &keys[1].0, &community); + let official_index = official.join("index.json"); + let community_index = community.join("index.json"); + let release = strings(&[official.to_str().unwrap(), "--publisher", "openidea", "--key", &keys[0].0]); + cmd_index(&release).unwrap(); + + // The community index lists its publishers; `index` without a key checks packages against them. + let skeleton = Index { + format: package::INDEX_FORMAT, + publishers: vec![package::Publisher { + id: "alice".into(), + name: "Alice".into(), + keys: vec![KeyEntry::new(keys[1].1.clone())], + }], + ..Index::default() + }; + write_index(&skeleton, &community_index).unwrap(); + cmd_index(&strings(&[community.to_str().unwrap()])).unwrap(); + + cmd_merge(&strings(&[ + official_index.to_str().unwrap(), + community_index.to_str().unwrap(), + "--keep", + "openidea", + ])) + .unwrap(); + // A release rebuilds the official plugins and keeps the community's. + cmd_index(&release).unwrap(); + let index = Index::parse(&std::fs::read_to_string(&official_index).unwrap()).unwrap(); + let listed: Vec<_> = index.plugins.iter().map(|e| (e.id.as_str(), e.publisher.as_str())).collect(); + assert_eq!(listed, [("alice.dawn", "alice"), ("openidea.night", "openidea")]); + assert_eq!(index.plugins[1].categories, ["themes"], "implied by the theme"); + assert_eq!(index.plugins[1].download, "openidea.night-0.1.0.oiplugin"); + assert!(Path::new(&index.plugins[0].download).is_absolute(), "{}", index.plugins[0].download); + + // A package by a publisher the index doesn't know is refused. + signed_theme(t, "carol.noon", "carol", &keys[2].0, &community); + let err = cmd_index(&strings(&[community.to_str().unwrap()])).unwrap_err(); + assert!(err.contains("unknown publisher"), "{err}"); + } + #[test] fn every_template_is_a_valid_package() { for t in templates::Template::ALL { diff --git a/crates/ide-host/src/bin/openidea-plugin/templates.rs b/crates/ide-host/src/bin/openidea-plugin/templates.rs index fc23cdd0..6c1c04e0 100644 --- a/crates/ide-host/src/bin/openidea-plugin/templates.rs +++ b/crates/ide-host/src/bin/openidea-plugin/templates.rs @@ -82,6 +82,9 @@ name = "__NAME__" version = "0.1.0" description = "Adds two sample commands." authors = [] +# Marketplace categories (up to 3): languages, themes, icon-themes, linters, +# vcs, ai, frameworks, tools, other. +categories = ["tools"] engines.openidea = "^1.0" # Built by `openidea-plugin build`. The code is loaded the first time one of # its commands runs; the commands below show in Find Action before that. diff --git a/crates/ide-host/src/plugins/market.rs b/crates/ide-host/src/plugins/market.rs index 4ab77fdb..061b5df2 100644 --- a/crates/ide-host/src/plugins/market.rs +++ b/crates/ide-host/src/plugins/market.rs @@ -3,11 +3,14 @@ //! plugins, and revocations. The host keeps the last index it read //! (`market-index.json`), checks signatures against it, and disables what it //! revokes — at start-up and on every refresh (the desktop refreshes daily). +//! Release builds pin the official publisher to the keys they were built +//! with, so no index can sign `openidea.*` plugins with another key. -use super::{PackageFile, PluginHost, PluginSource, PluginStatus}; +use super::{PackageFile, PluginEvent, PluginHost, PluginSource, PluginStatus, PluginUpdate, install}; use ide_core::{IdeError, IdeResult}; use ide_extension::package::{self, Index, IndexEntry, PackageSignature, SIGNATURE_FILE}; use ide_extension::{MANIFEST_FILE, Manifest}; +use semver::Version; use serde::{Deserialize, Serialize}; use std::path::{Path, PathBuf}; @@ -15,6 +18,9 @@ use std::path::{Path, PathBuf}; /// the app, next to the signed packages of the official plugins. pub const OFFICIAL_INDEX: &str = "https://github.com/l0ng-ai/openidea/releases/latest/download/plugins-index.json"; +/// The publisher of the official plugins. +pub const OFFICIAL_PUBLISHER: &str = "openidea"; + /// The last index read, in the plugins directory. pub const INDEX_FILE: &str = "market-index.json"; const DOWNLOADS: &str = ".downloads"; @@ -22,6 +28,8 @@ const MAX_INDEX: usize = 16 << 20; const MAX_PACKAGE: usize = 256 << 20; const MAX_STAGED_FILES: usize = 256; const MAX_STAGED_BYTES: usize = 16 << 20; +/// `moved` links followed before giving up (a loop, or a misconfiguration). +const MAX_MOVES: usize = 3; /// A marketplace entry with what is installed. #[derive(Clone, Debug, Serialize, Deserialize, specta::Type)] @@ -31,6 +39,32 @@ pub struct MarketPlugin { pub entry: IndexEntry, /// Installed version, if any. pub installed: Option, + /// Whether this IDE can load `entry` (the newest version it can, else the newest). + pub compatible: bool, +} + +impl MarketPlugin { + /// A version this IDE can load, newer than the one installed. + pub fn is_update(&self) -> bool { + let newer = |installed: &String| match (Version::parse(&self.entry.version), Version::parse(installed)) { + (Ok(offered), Ok(installed)) => offered > installed, + _ => false, + }; + self.compatible && self.installed.as_ref().is_some_and(newer) + } +} + +/// The official publisher's keys this IDE was built with +/// (`OPENIDEA_OFFICIAL_PLUGIN_KEYS`: base64, comma-separated). Development +/// builds have none: the index decides. +pub(super) fn built_in_official_keys() -> Vec { + let keys = option_env!("OPENIDEA_OFFICIAL_PLUGIN_KEYS").unwrap_or_default(); + keys.split(',').map(str::trim).filter(|k| !k.is_empty()).map(str::to_owned).collect() +} + +fn pinned(mut index: Index, official_keys: &[String]) -> Index { + index.pin_publisher(OFFICIAL_PUBLISHER, "OpenIDEA", official_keys); + index } /// Reads `url`: `http(s)://…`, `file://…` or a local path. @@ -58,6 +92,33 @@ pub fn read_url(url: &str, max: usize) -> Result, String> { Ok(bytes) } +/// The index at `url`, following `moved`, with downloads made absolute against +/// where it was read from. +fn read_index(url: &str) -> IdeResult { + let mut url = url.to_owned(); + for _ in 0..=MAX_MOVES { + let bytes = read_url(&url, MAX_INDEX).map_err(IdeError::unavailable)?; + let text = String::from_utf8(bytes).map_err(|_| IdeError::invalid("the index is not UTF-8"))?; + let mut index = Index::parse(&text).map_err(IdeError::invalid)?; + match index.moved.take().filter(|m| !m.trim().is_empty()) { + Some(next) => { + let next = resolve(&url, &next); + if url.starts_with("https://") && !next.starts_with("https://") { + return Err(IdeError::invalid(format!("the marketplace moved to {next}, which isn't https"))); + } + url = next; + } + None => { + for e in &mut index.plugins { + e.download = resolve(&url, &e.download); + } + return Ok(index); + } + } + } + Err(IdeError::unavailable(format!("the marketplace index moved more than {MAX_MOVES} times"))) +} + /// `href` relative to the index at `base`: a URL, or a local path (with the /// platform's separators, e.g. `C:\\market\\index.json`). pub fn resolve(base: &str, href: &str) -> String { @@ -77,9 +138,16 @@ pub fn resolve(base: &str, href: &str) -> String { } impl PluginHost { - pub(super) fn load_market_index(dir: &Path) -> Option { + pub(super) fn load_market_index(dir: &Path, official_keys: &[String]) -> Option { let text = std::fs::read_to_string(dir.join(INDEX_FILE)).ok()?; - Index::parse(&text).map_err(|e| tracing::warn!("{INDEX_FILE}: {e}")).ok() + let index = Index::parse(&text).map_err(|e| tracing::warn!("{INDEX_FILE}: {e}")).ok()?; + Some(pinned(index, official_keys)) + } + + /// Pins the official publisher to `keys` (base64) instead of the built-in + /// ones, from the next index read. + pub fn set_official_keys(&self, keys: Vec) { + *self.official_keys.write() = keys; } /// The marketplace index URL: the user's, else the default (none: no marketplace). @@ -97,14 +165,16 @@ impl PluginHost { self.save_state(); } - /// Reads the index again, keeps it, and applies its revocations. + /// Reads the index again, keeps it, and applies its revocations. Announces + /// updates of installed plugins it hasn't announced yet. pub fn refresh_market(&self) -> IdeResult> { let url = self.market_url().ok_or_else(|| IdeError::unavailable("no plugin marketplace is configured"))?; - let bytes = read_url(&url, MAX_INDEX).map_err(IdeError::unavailable)?; - let text = String::from_utf8(bytes).map_err(|_| IdeError::invalid("the index is not UTF-8"))?; - let index = Index::parse(&text).map_err(IdeError::invalid)?; - let _ = std::fs::write(self.plugins_dir.join(INDEX_FILE), &text); - *self.market.write() = Some(index); + let index = read_index(&url)?; + if let Ok(json) = serde_json::to_string(&index) { + let _ = std::fs::write(self.plugins_dir.join(INDEX_FILE), json); + } + let newer = index.is_newer().then_some(index.format); + *self.market.write() = Some(pinned(index, &self.official_keys.read())); // Trust may have changed: who signed what, what is revoked. let installed: Vec<_> = self.plugins.read().values().filter(|p| p.source == PluginSource::Installed).cloned().collect(); @@ -113,7 +183,41 @@ impl PluginHost { plugin.meta.lock().publisher = publisher; } self.apply_revocations(); - Ok(self.market_plugins()) + if let Some(format) = newer { + return Err(IdeError::unavailable(format!( + "the marketplace needs a newer OpenIDEA (index format {format}); its revocations still apply" + ))); + } + let plugins = self.market_plugins(); + self.announce_updates(&plugins); + Ok(plugins) + } + + /// Tells the windows about updates once per set of versions: a later + /// refresh offering the same ones says nothing. + fn announce_updates(&self, plugins: &[MarketPlugin]) { + let updates: Vec = plugins + .iter() + .filter(|p| p.is_update()) + .map(|p| PluginUpdate { + id: p.entry.id.clone(), + name: p.entry.name.clone(), + version: p.entry.version.clone(), + }) + .collect(); + let key: Vec = updates.iter().map(|u| format!("{}@{}", u.id, u.version)).collect(); + if std::mem::replace(&mut *self.announced_updates.lock(), key.clone()) != key && !updates.is_empty() { + self.emit(None, PluginEvent::UpdatesAvailable { updates }); + } + } + + /// Whether the package in `src` would replace the installed `id`'s copy + /// with one signed by another key than that copy, without that key's + /// endorsement: the user confirms the change of signer. + pub(super) fn signer_changed(&self, id: &str, src: &Path) -> bool { + let Some(current) = install::active_dir(&self.plugins_dir.join(id)) else { return false }; + let market = self.market.read(); + !package::signer_continues(market.as_ref(), read_signature(¤t).as_ref(), read_signature(src).as_ref()) } /// The plugins of the last index read. @@ -121,16 +225,14 @@ impl PluginHost { let Some(index) = self.market.read().clone() else { return Vec::new() }; let plugins = self.plugins.read(); index - .plugins - .iter() - .filter(|e| index.revocation(&e.id, &e.version).is_none()) - .cloned() - .map(|entry| { + .offered() + .into_iter() + .map(|(entry, compatible)| { let installed = plugins .get(&entry.id) .filter(|p| p.source == PluginSource::Installed) .map(|p| p.manifest().version.clone()); - MarketPlugin { entry, installed } + MarketPlugin { entry: entry.clone(), installed, compatible } }) .collect() } @@ -141,12 +243,18 @@ impl PluginHost { pub fn download_market_plugin(&self, id: &str) -> IdeResult { let url = self.market_url().ok_or_else(|| IdeError::unavailable("no plugin marketplace is configured"))?; let index = self.market.read().clone().ok_or_else(|| IdeError::unavailable("refresh the marketplace first"))?; - let entry = index - .plugins - .iter() - .find(|e| e.id == id) - .cloned() + let (entry, compatible) = index + .offered() + .into_iter() + .find(|(e, _)| e.id == id) + .map(|(e, ok)| (e.clone(), ok)) .ok_or_else(|| IdeError::not_found(format!("{id} is not in the marketplace")))?; + if !compatible { + return Err(IdeError::unavailable(format!( + "{} {} needs plugin API {}: update OpenIDEA", + entry.name, entry.version, entry.engine + ))); + } let bytes = read_url(&resolve(&url, &entry.download), MAX_PACKAGE).map_err(IdeError::unavailable)?; let downloads = self.plugins_dir.join(DOWNLOADS); std::fs::create_dir_all(&downloads)?; diff --git a/crates/ide-host/src/plugins/mod.rs b/crates/ide-host/src/plugins/mod.rs index 208da138..0b82a935 100644 --- a/crates/ide-host/src/plugins/mod.rs +++ b/crates/ide-host/src/plugins/mod.rs @@ -36,7 +36,10 @@ pub mod web; pub use api::{FileSecretStore, HostWorkspace, PluginWorkspace, SecretStore}; pub use icons::{map_asset as icon_theme_map_asset, sanitize_svg, svg_prefix as icon_theme_svg_prefix}; -pub use market::{INDEX_FILE as MARKET_INDEX_FILE, MarketPlugin, OFFICIAL_INDEX as OFFICIAL_MARKET_INDEX}; +pub use market::{ + INDEX_FILE as MARKET_INDEX_FILE, MarketPlugin, OFFICIAL_INDEX as OFFICIAL_MARKET_INDEX, OFFICIAL_PUBLISHER, + read_url as read_market_url, resolve as resolve_market_href, +}; pub use points::{COMMANDS, CommandDecl, register_builtin_points}; pub(crate) use providers::editor_providers as editor_providers_for; pub use providers::{ProviderKind, set_editor_providers}; @@ -242,12 +245,16 @@ pub struct Consent { /// Optional capabilities the user accepted (`net:crates.io`, …). Required /// ones are implied by consenting at all. pub optional: Vec, + /// The user accepted a package signed by another key than the installed + /// copy ([`InstallPreview::signer_changed`]). + #[serde(default)] + pub signer_change: bool, } impl Consent { /// Accept everything the plugin asks for (tests, trusted official plugins). pub fn all() -> Self { - Self { optional: vec!["*".into()] } + Self { optional: vec!["*".into()], signer_change: true } } fn accepts(&self, cap: &Capability) -> bool { @@ -274,6 +281,14 @@ pub struct InstallPreview { pub unsigned: bool, /// The verified publisher. pub publisher: Option, + /// Replaces an installed copy signed with another key, which didn't + /// endorse this package's (or this one is unsigned): the user confirms it + /// ([`Consent::signer_change`]). + pub signer_changed: bool, + /// Something to confirm: a first install, an unsigned package, another + /// signer, or capabilities the installed version wasn't granted or + /// refused. Without, an update installs with the grants it has. + pub needs_consent: bool, } type ProjectPolicy = Arc bool + Send + Sync>; @@ -320,6 +335,10 @@ pub struct PluginHost { pins: Arc>>, /// The last marketplace index read: trust root for signatures, revocations. market: RwLock>, + /// The official publisher's keys the index is pinned to (none: as listed). + official_keys: RwLock>, + /// `id@version` of the updates last announced. + announced_updates: Mutex>, /// The marketplace used while the user has set none (the app's official one). default_market_url: RwLock>, /// Updates not confirmed yet (the new version hasn't started once): what @@ -358,9 +377,12 @@ impl PluginHost { policy_pins.read().get(&(plugin.to_owned(), cap.to_string())).cloned() })); let shared = api::Shared::new(sink.clone(), plugins_dir.join(".data"), pins.clone(), ui.clone()); - let market = RwLock::new(Self::load_market_index(&plugins_dir)); + let official_keys = market::built_in_official_keys(); + let market = RwLock::new(Self::load_market_index(&plugins_dir, &official_keys)); let host = Self { market, + official_keys: RwLock::new(official_keys), + announced_updates: Mutex::default(), default_market_url: RwLock::new(None), updates: Mutex::default(), project_policy: RwLock::new(Arc::new(|_| false)), @@ -703,14 +725,27 @@ impl PluginHost { } let publisher = self.verified_publisher(src); let m = &pkg.manifest; + let replaces = self.plugins.read().get(&m.id).map(|p| p.manifest().version.clone()); + // An update shows what the installed version was granted. + let grant = replaces + .as_ref() + .and_then(|_| self.ledger.lock().get(&Subject::Installed(m.id.clone())).cloned()) + .filter(|g| g.confirmed); + let granted = |c: &Capability| grant.as_ref().is_some_and(|g| g.has(c)); let mut capabilities: Vec = - m.capabilities.all().map(|c| CapabilityInfo::new(c, m.capabilities.is_optional(c), false)).collect(); + m.capabilities.all().map(|c| CapabilityInfo::new(c, m.capabilities.is_optional(c), granted(c))).collect(); for extra in &set.capabilities { if !m.declares(extra) { - capabilities.push(CapabilityInfo::new(extra, true, false)); + capabilities.push(CapabilityInfo::new(extra, true, granted(extra))); } } capabilities.sort_by(|a, b| b.risk.cmp(&a.risk).then(a.id.cmp(&b.id))); + let signer_changed = self.signer_changed(&m.id, src); + let answered = |c: &CapabilityInfo| { + c.granted || (c.optional && grant.as_ref().is_some_and(|g| g.declined.contains(&c.id))) + }; + let needs_consent = + grant.is_none() || publisher.is_none() || signer_changed || !capabilities.iter().all(answered); Ok(InstallPreview { id: m.id.clone(), name: m.name.clone(), @@ -721,9 +756,11 @@ impl PluginHost { capabilities, contributions: counts(m), warnings: set.warnings.clone(), - replaces: self.plugins.read().get(&m.id).map(|p| p.manifest().version.clone()), + replaces, unsigned: publisher.is_none(), publisher, + signer_changed, + needs_consent, }) } @@ -746,6 +783,11 @@ impl PluginHost { if let Some(problem) = self.signature_problem(src) { return Err(IdeError::invalid(format!("refusing {id}: {problem}"))); } + if !consent.signer_change && self.signer_changed(&id, src) { + return Err(IdeError::invalid(format!( + "refusing {id}: it is signed by another key than the installed version; confirm the change of signer" + ))); + } let version = pkg.manifest.version.clone(); if let Some(r) = self.market.read().as_ref().and_then(|i| i.revocation(&id, &version)) { return Err(IdeError::invalid(format!("{id} {version} was revoked: {}", r.reason))); @@ -2211,6 +2253,7 @@ fn placeholder_manifest(dir: &Path) -> Manifest { homepage: None, license: None, change_notes: None, + declared_categories: Vec::new(), engine: ide_extension::ENGINE_VERSION.into(), legacy: false, wasm: None, diff --git a/crates/ide-host/src/plugins/remote_host.rs b/crates/ide-host/src/plugins/remote_host.rs index 71be9116..947c0b9b 100644 --- a/crates/ide-host/src/plugins/remote_host.rs +++ b/crates/ide-host/src/plugins/remote_host.rs @@ -272,7 +272,8 @@ impl RemotePlugins { report.failed.push(format!("{}: invalid plugin id", pkg.id)); continue; } - let consent = Consent { optional: pkg.granted.clone() }; + // The desktop asked the user, change of signer included. + let consent = Consent { optional: pkg.granted.clone(), signer_change: true }; if self.current_digest(&pkg.id).as_deref() == Some(pkg.digest.as_str()) { if let Err(e) = self.follow_grants(&pkg, &consent) { report.failed.push(format!("{}: {e}", pkg.id)); diff --git a/crates/ide-host/src/plugins/types.rs b/crates/ide-host/src/plugins/types.rs index db3b18f9..fc13800f 100644 --- a/crates/ide-host/src/plugins/types.rs +++ b/crates/ide-host/src/plugins/types.rs @@ -138,12 +138,24 @@ pub struct PluginsSnapshot { pub ui: Vec, } +/// A newer version of an installed plugin in the marketplace. +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Type)] +#[serde(rename_all = "camelCase")] +pub struct PluginUpdate { + pub id: String, + pub name: String, + pub version: String, +} + /// Backend → UI notifications (Tauri event `ide://plugin`). #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, Type)] #[serde(tag = "type", rename_all = "camelCase")] pub enum PluginEvent { /// Plugins, their status or their contributions changed: re-fetch `plugin_list`. CommandsChanged, + /// The marketplace offers newer versions of installed plugins (announced + /// once per set of versions). + UpdatesAvailable { updates: Vec }, #[serde(rename_all = "camelCase")] Notification { plugin_id: String, level: NotificationLevel, title: String, body: String }, /// A plugin's status bar item was set (`item`) or removed. diff --git a/crates/ide-host/tests/distribution.rs b/crates/ide-host/tests/distribution.rs index 540073a5..a8d97934 100644 --- a/crates/ide-host/tests/distribution.rs +++ b/crates/ide-host/tests/distribution.rs @@ -131,25 +131,44 @@ fn installs_from_before_versioning_keep_working_and_move_on_update() { /// `hello` as `acme.hello` at `version`, packed and signed with `key`. fn signed_hello(dir: &Path, version: &str, key: &PublisherKey, host: &PluginHost) -> (PathBuf, IndexEntry) { - let src = variant(&repo().join("crates/ide-plugin/tests/fixtures/hello"), dir, &format!("src-{version}"), |t| { - t.replace("id = \"hello\"", "id = \"acme.hello\"") - .replace("version = \"0.3.0\"", &format!("version = \"{version}\"")) - }); + signed(dir, "acme", version, key, host, |t| t.to_owned()) +} + +/// `hello` as `.hello` at `version`, its manifest changed by +/// `edit`, packed and signed with `key`. +fn signed( + dir: &Path, + publisher: &str, + version: &str, + key: &PublisherKey, + host: &PluginHost, + edit: impl Fn(&str) -> String, +) -> (PathBuf, IndexEntry) { + let id = format!("{publisher}.hello"); + let src = + variant(&repo().join("crates/ide-plugin/tests/fixtures/hello"), dir, &format!("src-{id}-{version}"), |t| { + edit( + &t.replace("id = \"hello\"", &format!("id = \"{id}\"")) + .replace("version = \"0.3.0\"", &format!("version = \"{version}\"")), + ) + }); let files = host.package_files_of(&src).unwrap(); let digest = package::package_digest(&src, &files).unwrap(); - let sig = key.sign("acme", "acme.hello", version, &digest); - let out = dir.join(format!("acme.hello-{version}.oiplugin")); + let sig = key.sign(publisher, &id, version, &digest); + let out = dir.join(format!("{id}-{version}.oiplugin")); package::pack(&src, &files, &out, Some(&sig)).unwrap(); let entry = IndexEntry { - id: "acme.hello".into(), + id: id.clone(), name: "Hello".into(), version: version.into(), description: String::new(), authors: vec![], - publisher: "acme".into(), + publisher: publisher.into(), download: out.file_name().unwrap().to_string_lossy().into_owned(), digest, capabilities: vec![], + engine: "^1.0".into(), + categories: vec!["tools".into()], }; (out, entry) } @@ -166,10 +185,11 @@ fn write_index( publishers: vec![Publisher { id: "acme".into(), name: "ACME".into(), - keys: vec![KeyEntry { key: key.public_base64(), revoked: key_revoked }], + keys: vec![KeyEntry { revoked: key_revoked, ..KeyEntry::new(key.public_base64()) }], }], plugins, revoked, + moved: None, }; let path = dir.join("index.json"); std::fs::write(&path, serde_json::to_string(&index).unwrap()).unwrap(); @@ -260,3 +280,210 @@ fn package_files_install_from_disk_unsigned() { let info = f.host.install_from_dir(&dir, &Consent::all()).unwrap(); assert_eq!((info.status, info.publisher), (PluginStatus::Inactive, None)); } + +#[test] +fn the_marketplace_offers_the_newest_version_this_ide_can_load() { + let f = fixture(); + let market = f.work.join("market"); + std::fs::create_dir_all(&market).unwrap(); + let key = PublisherKey::from_seed([3; 32]); + let (_, old) = signed_hello(&market, "1.0.0", &key, &f.host); + let (_, new) = signed_hello(&market, "2.0.0", &key, &f.host); + let next_major = ide_extension::ENGINE_VERSION.split('.').next().unwrap().parse::().unwrap() + 1; + let new = IndexEntry { engine: format!("^{next_major}.0"), ..new }; + f.host.set_market_url(Some(write_index(&market, &key, vec![old.clone(), new.clone()], vec![], false))); + + let listed = f.host.refresh_market().unwrap(); + assert_eq!((listed.len(), listed[0].entry.version.as_str(), listed[0].compatible), (1, "1.0.0", true)); + let dir = f.host.download_market_plugin("acme.hello").unwrap(); + assert_eq!(f.host.preview_install(&dir).unwrap().version, "1.0.0"); + + // Only a version for a newer IDE: shown as such, not downloaded. + write_index(&market, &key, vec![new], vec![], false); + let listed = f.host.refresh_market().unwrap(); + assert_eq!((listed[0].entry.version.as_str(), listed[0].compatible), ("2.0.0", false)); + let err = f.host.download_market_plugin("acme.hello").unwrap_err(); + assert!(err.message.contains("update OpenIDEA"), "{}", err.message); +} + +#[test] +fn a_moved_marketplace_is_read_where_it_moved_to() { + let f = fixture(); + let market = f.work.join("market"); + std::fs::create_dir_all(&market).unwrap(); + let key = PublisherKey::from_seed([3; 32]); + let (_, entry) = signed_hello(&market, "1.0.0", &key, &f.host); + write_index(&market, &key, vec![entry], vec![], false); + // The old address points at the new one; downloads resolve against where the index is. + let old = f.work.join("old"); + std::fs::create_dir_all(&old).unwrap(); + std::fs::write(old.join("index.json"), r#"{"format": 1, "moved": "../market/index.json"}"#).unwrap(); + f.host.set_market_url(Some(old.join("index.json").to_string_lossy().into_owned())); + + let listed = f.host.refresh_market().unwrap(); + assert_eq!(listed[0].entry.id, "acme.hello"); + let dir = f.host.download_market_plugin("acme.hello").unwrap(); + assert_eq!(f.host.preview_install(&dir).unwrap().version, "1.0.0"); + + // A loop gives up. + std::fs::write(old.join("index.json"), r#"{"format": 1, "moved": "index.json"}"#).unwrap(); + let err = f.host.refresh_market().unwrap_err(); + assert!(err.message.contains("moved more than"), "{}", err.message); +} + +/// `dir/index.json` listing `publishers` and `plugins`; its path. +fn index_of(dir: &Path, publishers: Vec, plugins: Vec) -> String { + let index = Index { format: package::INDEX_FORMAT, publishers, plugins, ..Index::default() }; + let path = dir.join("index.json"); + std::fs::write(&path, serde_json::to_string(&index).unwrap()).unwrap(); + path.to_string_lossy().into_owned() +} + +fn publisher(id: &str, keys: Vec) -> Publisher { + Publisher { id: id.into(), name: id.into(), keys } +} + +fn updates_announced(events: &Events) -> Vec> { + events + .lock() + .iter() + .filter_map(|e| match e { + PluginEvent::UpdatesAvailable { updates } => { + Some(updates.iter().map(|u| format!("{} {}", u.id, u.version)).collect()) + } + _ => None, + }) + .collect() +} + +/// What the install page sends for an update it doesn't need to show: the grants the installed version has. +fn as_granted(preview: &InstallPreview) -> Consent { + let optional = preview.capabilities.iter().filter(|c| c.optional && c.granted).map(|c| c.id.clone()).collect(); + Consent { optional, signer_change: false } +} + +#[test] +fn updates_keep_their_signer_and_need_no_consent_when_nothing_is_new() { + let f = fixture(); + let market = f.work.join("market"); + std::fs::create_dir_all(&market).unwrap(); + let (k1, k2, k3) = + (PublisherKey::from_seed([1; 32]), PublisherKey::from_seed([2; 32]), PublisherKey::from_seed([3; 32])); + let same = |t: &str| t.to_owned(); + let (_, v1) = signed(&market, "acme", "1.0.0", &k1, &f.host, same); + f.host.set_market_url(Some(index_of( + &market, + vec![publisher("acme", vec![KeyEntry::new(k1.public_base64())])], + vec![v1.clone()], + ))); + f.host.refresh_market().unwrap(); + let dir = f.host.download_market_plugin("acme.hello").unwrap(); + let first = f.host.preview_install(&dir).unwrap(); + assert!(first.needs_consent && !first.signer_changed, "a first install is confirmed"); + f.host.install_from_dir(&dir, &Consent::default()).unwrap(); + assert!(updates_announced(&f.events).is_empty()); + + // 1.1.0, same key and needs: announced once, installed with the grants it has. + let (_, v11) = signed(&market, "acme", "1.1.0", &k1, &f.host, same); + let keys1 = vec![KeyEntry::new(k1.public_base64())]; + index_of(&market, vec![publisher("acme", keys1.clone())], vec![v1.clone(), v11.clone()]); + f.host.refresh_market().unwrap(); + f.host.refresh_market().unwrap(); + assert_eq!(updates_announced(&f.events), [["acme.hello 1.1.0"]], "once per set of versions"); + let dir = f.host.download_market_plugin("acme.hello").unwrap(); + let preview = f.host.preview_install(&dir).unwrap(); + assert_eq!(preview.replaces.as_deref(), Some("1.0.0")); + assert!(!preview.needs_consent && !preview.signer_changed); + assert!(preview.capabilities.iter().all(|c| c.granted), "shows what the installed version was granted"); + f.host.install_from_dir(&dir, &as_granted(&preview)).unwrap(); + assert!(f.host.market_plugins().iter().all(|p| !p.is_update())); + + // 1.2.0 asks for something new: the user is asked. + let (_, v12) = signed(&market, "acme", "1.2.0", &k1, &f.host, |t| { + t.replace( + "required = [\"editor.read\", \"editor.write\"]", + "required = [\"editor.read\", \"editor.write\"]\noptional = [\"net:example.com\"]", + ) + }); + index_of(&market, vec![publisher("acme", keys1.clone())], vec![v12.clone()]); + f.host.refresh_market().unwrap(); + let dir = f.host.download_market_plugin("acme.hello").unwrap(); + let preview = f.host.preview_install(&dir).unwrap(); + assert!(preview.needs_consent && !preview.signer_changed); + f.host.install_from_dir(&dir, &Consent::default()).unwrap(); + + // 1.3.0 signed with a key the installed one didn't endorse: another signer, the user's call. + let (_, v13) = signed(&market, "acme", "1.3.0", &k2, &f.host, same); + let keys12 = vec![KeyEntry::new(k1.public_base64()), KeyEntry::new(k2.public_base64())]; + index_of(&market, vec![publisher("acme", keys12)], vec![v13]); + f.host.refresh_market().unwrap(); + let dir = f.host.download_market_plugin("acme.hello").unwrap(); + let preview = f.host.preview_install(&dir).unwrap(); + assert!(preview.signer_changed && preview.needs_consent); + let err = f.host.install_from_dir(&dir, &as_granted(&preview)).unwrap_err(); + assert!(err.message.contains("another key"), "{}", err.message); + assert_eq!(f.host.info_of("acme.hello").unwrap().version, "1.2.0", "nothing changed"); + f.host.install_from_dir(&dir, &Consent { signer_change: true, ..as_granted(&preview) }).unwrap(); + + // 1.4.0 signed with k3, which k2 endorsed: a rotation the installed signer vouched for. + let (_, v14) = signed(&market, "acme", "1.4.0", &k3, &f.host, same); + let keys = vec![ + KeyEntry { endorsement: Some(k2.endorse("acme", &k3.public_base64())), ..KeyEntry::new(k3.public_base64()) }, + KeyEntry::new(k2.public_base64()), + ]; + index_of(&market, vec![publisher("acme", keys)], vec![v14]); + f.host.refresh_market().unwrap(); + let dir = f.host.download_market_plugin("acme.hello").unwrap(); + let preview = f.host.preview_install(&dir).unwrap(); + assert!(!preview.signer_changed && !preview.needs_consent); + f.host.install_from_dir(&dir, &as_granted(&preview)).unwrap(); + assert_eq!(f.host.info_of("acme.hello").unwrap().version, "1.4.0"); +} + +#[test] +fn an_index_in_a_newer_format_still_revokes() { + let f = fixture(); + let market = f.work.join("market"); + std::fs::create_dir_all(&market).unwrap(); + let key = PublisherKey::from_seed([3; 32]); + let (_, entry) = signed_hello(&market, "1.0.0", &key, &f.host); + f.host.set_market_url(Some(write_index(&market, &key, vec![entry], vec![], false))); + f.host.refresh_market().unwrap(); + let dir = f.host.download_market_plugin("acme.hello").unwrap(); + f.host.install_from_dir(&dir, &Consent::all()).unwrap(); + + let newer = format!( + r#"{{"format": {}, "plugins": "a shape this IDE can't read", + "revoked": [{{"id": "acme.hello", "reason": "steals tokens"}}]}}"#, + package::INDEX_FORMAT + 1 + ); + std::fs::write(market.join("index.json"), newer).unwrap(); + let err = f.host.refresh_market().unwrap_err(); + assert!(err.message.contains("newer OpenIDEA"), "{}", err.message); + let info = f.host.info_of("acme.hello").unwrap(); + assert_eq!((info.status, info.error.as_deref()), (PluginStatus::Failed, Some("revoked: steals tokens"))); + assert!(f.host.market_plugins().is_empty()); +} + +#[test] +fn official_plugins_need_the_key_this_ide_was_built_with() { + let f = fixture(); + let market = f.work.join("market"); + std::fs::create_dir_all(&market).unwrap(); + let (root, intruder) = (PublisherKey::from_seed([1; 32]), PublisherKey::from_seed([6; 32])); + f.host.set_official_keys(vec![root.public_base64()]); + // The index lists the intruder's key for the official publisher. + let (_, forged) = signed(&market, OFFICIAL_PUBLISHER, "1.0.0", &intruder, &f.host, |t| t.to_owned()); + let keys = vec![KeyEntry::new(intruder.public_base64())]; + f.host.set_market_url(Some(index_of(&market, vec![publisher(OFFICIAL_PUBLISHER, keys.clone())], vec![forged]))); + f.host.refresh_market().unwrap(); + let err = f.host.download_market_plugin("openidea.hello").unwrap_err(); + assert!(err.message.contains("trusted publisher"), "{}", err.message); + + // Signed with the built-in key it installs, whatever keys the index lists. + let (_, genuine) = signed(&market, OFFICIAL_PUBLISHER, "1.0.1", &root, &f.host, |t| t.to_owned()); + index_of(&market, vec![publisher(OFFICIAL_PUBLISHER, keys)], vec![genuine]); + f.host.refresh_market().unwrap(); + let dir = f.host.download_market_plugin("openidea.hello").unwrap(); + assert_eq!(f.host.preview_install(&dir).unwrap().publisher.as_deref(), Some(OFFICIAL_PUBLISHER)); +} diff --git a/plugins/README.md b/plugins/README.md index d90839c1..ae53436b 100644 --- a/plugins/README.md +++ b/plugins/README.md @@ -79,6 +79,7 @@ authors = ["You "] homepage = "https://example.com" # optional license = "MIT" # optional change-notes = "1.2.0 — …" # shown under What's New +categories = ["tools"] # marketplace categories, see below engines.openidea = "^1.0" # the plugin API this package needs wasm = "dist/plugin.wasm" # omit for data-only plugins activation = ["on-language:markdown"] # optional, see below @@ -94,6 +95,13 @@ category = "Word Tools" # group in Search Everywhere / Keymap when = "editorFocus" # optional: same expressions as built-in actions ``` +`categories` (up to 3) file the plugin in the marketplace: `languages`, +`themes`, `icon-themes`, `linters` (linters and formatters), `vcs`, `ai`, +`frameworks`, `tools`, `other`. Without them, a plugin contributing themes, +icon themes or languages is filed under those, any other under `other`. +Categories an IDE doesn't know, and any after the first three it knows, are +ignored (`check` warns about both). + All paths are relative to the package directory and may not leave it. A manifest is validated as a whole: if one contribution is invalid, nothing is installed or loaded. Contribution types the IDE does not know (a newer API) are @@ -739,6 +747,12 @@ granted, and starts the approved program. the version it replaced automatically (you're told why); _Roll Back to …_ in the plugin's details does it by hand. Data (`storage`) is per plugin, not per version. +- **Updates:** when the daily marketplace check finds newer versions of + installed plugins, the IDE says so once, with _Update All_ (also in the gear + menu and as the _Update All Plugins_ action). An update that asks for + nothing new installs with the grants the installed version has; the install + page is shown only for new capabilities, an unsigned package or another + signer (see _Distribution_). - **Linked plugins:** `openidea-plugin link ` (§1). Listed with a _linked_ tag; capabilities are granted per folder. - **Project plugins:** put (or symlink) the package in @@ -758,6 +772,9 @@ files). openidea-plugin keygen acme.key # once; keep the file secret openidea-plugin pack plugins/acme-tools --key acme.key --publisher acme openidea-plugin index market/ --publisher acme --name "ACME" --key acme.key +openidea-plugin check acme.tools-1.0.0.oiplugin # a package as installing would check it +openidea-plugin merge market/index.json https://example.com/index.json --keep acme +openidea-plugin endorse --key acme.key --publisher acme # when rotating keys ``` A **marketplace** is static: an `index.json` and the packages next to it, on @@ -773,8 +790,68 @@ and the publisher's key, then shows the install page. - **Revocation:** the index can revoke plugin versions (or all versions) and publisher keys. The IDE reads the index daily; revoked plugins are disabled with the reason and the user is notified — also after a restart, before - their code could run. A publisher rotates keys by adding the new one; older - keys stay valid until revoked. + their code could run. +- **Key rotation:** a publisher rotates keys by registering the new one with + `index --key new.key --previous-key old.key`: the old key endorses the new + one, and older keys stay valid until revoked (`endorse` prints the + endorsement for an index someone else writes, such as the registry's). An installed plugin updates + silently only to a package signed with the key it was installed with, or + one that key endorsed (directly or through endorsed keys; endorsements by + revoked keys don't count). Another signer — an unendorsed key, or an + unsigned package replacing a signed one — is shown on the install page and + needs the user's confirmation. +- **Official key:** release builds carry the official publisher's public key + (`OPENIDEA_OFFICIAL_PLUGIN_KEYS`, derived from the release's signing key). + `openidea.*` plugins must be signed with it, or with a key it endorsed, + whatever keys an index lists for `openidea`. +- **Format:** fields are only ever added to the index (an IDE ignores those it + doesn't know), and `format` stays `1` unless older IDEs can't read the + change. An IDE reading a newer format still applies its revocations and + `moved`, lists no plugins, and asks the user to update. +- **Moving:** an index with `"moved": ""` sends the IDE to the index at + that URL (relative or absolute; https stays https), so a marketplace can + change hosts while released IDEs keep the address they were built with. + +**Versions.** Each index entry records the plugin API it needs (`engine`: the +manifest's `engines.openidea`, narrowed to the API its component was built +for; an entry without one is offered to no IDE), and a plugin may be listed in +several versions. Settings › Plugins +offers the newest version this IDE can load; when there is none, it shows the +plugin as incompatible and says which API it needs. Entries also carry the +plugin's categories, which Settings › Plugins › Available filters by. Indexing keeps, of each +plugin, the newest version per API requirement, so users of an older IDE keep +the last version built for them. + +`index` with a key registers the publisher and lists the folder's packages +as its plugins (their earlier versions stay as above; plugins no longer in the +folder go), keeping the other publishers'; `--download-base` makes downloads +absolute, so a version stays where it was first published. Without a key, it +lists every package in the folder, each checked against the publishers the +index already has. `merge` takes the +publishers, plugins and revocations of another index (downloads made absolute) +in place of every publisher but `--keep`; `check` also takes a `.oiplugin`. + +### 8.1 Official and community plugins + +The IDE's default marketplace is `plugins-index.json` of the latest release. +It lists two kinds of plugins: + +- **Official** (`plugins/official/`, ids `openidea.*`): maintained in this + repository, built and signed by its release workflow, and kept working as + the API changes. New official plugins are proposed in an issue first; they + cover general needs or show how to use part of the API. +- **Community** (their authors' ids and keys): developed in their authors' + repositories and listed through the registry, + [l0ng-ai/openidea-plugins](https://github.com/l0ng-ai/openidea-plugins). + An author registers a publisher (an id prefix, its public key and the GitHub + accounts that may change it) and adds each plugin version by pull request; + the registry checks the package (digest, signature, `openidea-plugin check`) + and publishes its index, which `plugins-index.yml` merges into the release's + within the hour. Its README has the rules. + +Pull requests that add a plugin to this repository are for official plugins. +A plugin that needs a new extension point brings the extension point here, as +its own pull request, and the plugin to the registry. ## 9. Testing the host diff --git a/plugins/official/ai-completion/dist/plugin.wasm b/plugins/official/ai-completion/dist/plugin.wasm index ee11a42e850fc3b06e5979c68cdcb859b988659b..c51a0c6730695403d05b5dacbd0999a7691a8355 100644 GIT binary patch delta 31200 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

f%M#^rQVi|Yte*Dp8e#S%=) zBiZw2YTQI`8BTZDcs$MHB(kFNdrDTLbxou{xZFB+-b{UX!qk>@%B`Vzoz~?$shTy@ zq>9{xx#O+gt?)NZD16b1;yJzAO0O@yH9gGbHLa;Br>9%fPEI%chwi5HR>d}yg``az zXaq3Gt8J)X#&^8KUOrpkubl9b1lt=p1_d~;{0dvO1#<%Ch_=+Ygb3xg%MnsF=TVlVdGs`tWoo9^4;HoXVYx6@4lk~o+o z3W>P(pvKd;)1xJrlt;GF9a`dt-a!c^0)0KzSKXnhj;Z3T8h6r%jPtoW_57G&vDe-T z*dn*uM?xeNA+(a+v<|h`8{qDsH(*K!&0ueJp#7lujE>Zjez5j+q>qs@@+ z)IgA_pRwY;1&LCt?fYrN^r%q2nEX56LFDsR{xU*1~7wq*)+$RJAewS&Skns;4K;%^Hi2&>C);k zkWy%tHF+Rd^UPN3&4Kg{&9t7mmo|#&+l#snq6Y-cw)PK!VVSYB=-d#TJjJOER@?}x zWi=T}^Tf$rMZ1S`?UGGgn<>tGVAUB8UwiRZU0(E|)oBFEn^d`$HDo09p=m`QjKse- zBM@oY`WL7bA+}?0eqgj=H;7!T?*xjrwvWYuY2r3(#snzO-^Rjqo4(EJKMq3u#I_=L^wCEvf;1ZL!S-T&FrJn-7dIBsa5NI)hZna^W zV%j!q?*tgPsVc2zRn5m~aUo*|_I2Y~P?)jMnwd}Sc;dtPYGNKy&GHpcKTJNkfF5+Z zH)_tGZ@DJZ)1{@glj%Mjg_EXGhWn)MGQFtR6zb#5|G_TuR5<;HmxPPA*`VwO_@p+C z4*rh~e+B9bLGF^suhncCcAPkFD6 z`PQr_sUsNq%O@ccDv7qTXQ2DEqJA?dhkP@nVu~OmQ=xHl;E>3cgg^%V^hFG|J;XI1Q z3Z9t@FL2TBvbFJx86;vJnxZ}@R4*(LE3!Get%mdHHb5(whbj%tXMH#i`nd$;C2rCn zuW#xj5r&zujn{A1!I5c-HCY)e);sof$L~dO8dmTfK#YK-TpuOaNR&UgF>n@A- zxaS8-X^SW!a@&Urx2FgSaGP$KX7yP_xAUg2TSTon{b`Zf{2EVzHz4V~pMpb%^#XMe$m*7*K&=Ple>L;lCbY4DwvP`xHEY6=7yD|jQ}?T{@SujmGs zZs3Olg89xau3qSdPTISKey0`IM@uQa-clt?rS{F^`Mw*@-9M?6@%xrH>sjG=0o{W5-?Jqv)j-G&uPG22_>jX}wE097S7SqL=V5$ssqm zkRGj=kAFqY;hF0BEXZ(-M(r!)a8yGYW0$`VayTMU4#uyA({M~e+62Ei{IWw0$DK$Y z#hAo0<)JA1%9MwroQiS?e#!W`?O#5|w+lnz6Z~r8#}!=me1qdnSV@r%Y!l`Y>k_`*M1-M7)5Q4=Bzg%ZyK zV2;RS!?DWRw2g+ELtKXAZd66#R~NrzFl!x4`n&(HtyEKO1jm1hC~WyekU-3D--kuo7O%am_Np25wtqPEkWl>%7h zpo+2h*}88#?EiEtXb1I&j9Ym-2!Eb$t=d7g^QU9;7~W&pHC{%byzaX4`s>Q~W3zdK z0{yvM8ReHj_gj(v7fWV}?Ep!bzAN!#WCG>M$YYP5^<2W|r9#nP(!vU5f S%WpWE;@8YyG-fCHvi=`+F`a$@ delta 20217 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

nY*%uxrArQD_Y;1EG-(d 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

xW2MJt6s*ccz$$T)s7a4 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 diff --git a/plugins/official/git-toolbox/dist/plugin.wasm.sources b/plugins/official/git-toolbox/dist/plugin.wasm.sources index fd509401..0bcb7925 100644 --- a/plugins/official/git-toolbox/dist/plugin.wasm.sources +++ b/plugins/official/git-toolbox/dist/plugin.wasm.sources @@ -1 +1 @@ -ad545605b33c6f4e55a06a376333de3162739ed920b5d7d277942e50a4420083 +22876f842f727a2b9aa292986df3393f5b5f30c5c34319f5665f7d2701c8accf diff --git a/plugins/official/git-toolbox/plugin.toml b/plugins/official/git-toolbox/plugin.toml index ff5bbfce..d0f02117 100644 --- a/plugins/official/git-toolbox/plugin.toml +++ b/plugins/official/git-toolbox/plugin.toml @@ -5,6 +5,7 @@ description = "Fetches your repositories in the background and shows the branch authors = ["OpenIDEA contributors"] license = "Apache-2.0" change-notes = "0.1.0 — first release: auto-fetch every 5 minutes, ahead/behind in the status bar, Fetch Now." +categories = ["vcs"] engines.openidea = "^1.0" wasm = "dist/plugin.wasm" # Fetches on schedule (also after being reclaimed while idle) and refreshes diff --git a/plugins/official/graphviz/dist/plugin.wasm b/plugins/official/graphviz/dist/plugin.wasm index fa2c8114e3846abbe9244214d6b59a223f906514..337a978116ac65184907600d3ba9d006d43b8b74 100644 GIT binary patch delta 16673 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 MYm_%>J%uIzAIZhu0{{R3 delta 16837 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 ZD&d+X5x;8qS=x(9Srm}ne>Hg}{2w1I@`nHb diff --git a/plugins/official/graphviz/dist/plugin.wasm.sources b/plugins/official/graphviz/dist/plugin.wasm.sources index 8e261ce0..f750b77c 100644 --- a/plugins/official/graphviz/dist/plugin.wasm.sources +++ b/plugins/official/graphviz/dist/plugin.wasm.sources @@ -1 +1 @@ -de353be96a6b66629901f55a8027a0f27107a7ac2fb9d891089db1b7fd716299 +14c60782eca79a25cf2c38d58c05be0eb97c4afc607d4cc83302d1445d094aab diff --git a/plugins/official/graphviz/plugin.toml b/plugins/official/graphviz/plugin.toml index 04f87a2e..8cf06eb4 100644 --- a/plugins/official/graphviz/plugin.toml +++ b/plugins/official/graphviz/plugin.toml @@ -5,6 +5,7 @@ description = "Graphviz DOT files (.dot, .gv) with a live preview beside the tex authors = ["OpenIDEA contributors"] license = "Apache-2.0" change-notes = "0.1.0 — first release: live preview (Graphviz compiled to WebAssembly), layout engines, zoom, errors as problems, SVG and PNG export." +categories = ["languages", "tools"] engines.openidea = "^1.0" wasm = "dist/plugin.wasm" activation = ["on-view:preview"] diff --git a/plugins/official/key-promoter/dist/plugin.wasm b/plugins/official/key-promoter/dist/plugin.wasm index daefc884d5dfdb76569c03d572061b0576f6b763..9ef9e3d0cc4d334ffbed45e398b927a9fd5774df 100644 GIT binary patch delta 13403 zcmcgS33OD&vbTCB$&i^O7Zb=rmOGP$$p#@n!Y1S*TaZOSwkP`{5JYzHDVl%*fBwJ6Se@B!v;75J75}o0>|M5Y=)Ci23z1uI0c`>bT|x$;A_|kpTRcx6tZ9| z9D}3q6`Y1mPzZaV7vGwdMJHs}k)ymjcY!CaM-DKC;4R)P*UfO0n$=~$-#CK0#afXzp)>k~# z>;u%4Pjl7J53cZTe)Zv+Guv;pA$`S^j0{OKhfmJH+UB7yn=2;y;-rTqVp7rnB}V%H z51YT`lK%g^-lqlOZwAhR_qiqL1eWK67KCiqEOn})($%Y)CD!w~HFDqve-s`WlvlKK z;qJ*f3v$w@Du!r-srk-*Kb|}G@x7lX^1;DLbBzWv%Xhe6Xb;cLTGvnholgjD!SW9B?V*v@wL}@+ zNJ&#X?5rLY4HTx9X~-b|%vo677LUpA5Gx@~exx`3(qtDDn*wTaGlwI&49UtgTo;0v z#(RXt#unxjql@EclQj8+pd_j3NsMSeO^|;ORu{_nS79n_<$+2le9jvvZQx5jS*fnv zcga_vi=(8;m!32q@O4T}+(KnoKHv|P6z@6nh_M=~FvTF>;BBpu%4a%$LYit+W%&>4 zT8w6;3Mrw5yn<&~V}aB;2G;U0+c3DtXV@D1S6UQKLD7-NqPiq$sSV7t<`R z7S7|nW9*4eU0&k#msv>j8S7XQ6X7~K5aFK}jjS!qjA(mNZy>J|alxc`>Mak&TW=X@ zCGC>fC6ns+X*Mt8o9cG)+d#M&o*{|Jy64~Lq4jE1-KY(yMvBvRjMKbry%c$~2DLMb z)eZf13(v1-^DWX*Wf$wsz;`A2@$c)^OSe_jBeJ4UFCo#tzzrH)TNmvKN&cAVTHx6e z2x?EWN(!jyX*TeZ%x3d82FCPooP`^@R2pt$5j?Yg|8(6TOkS=F8j)s21E>LMRs&X+ zG^^3&DhW2XCnj=pnTU}WHA!M^P*E(J)k`*{AbZ74GZBk6q-Z8WtTt#OO=LP?&E!UH zHLflTxx$FvH|TwX-Ut0e1^Iz4ZK>qaYaAby6x7D{7gN>)NPpVEs2&UIF*d;NO=mgL} zvO!WTNWfrLGxhmkR;OxBvsp1HRmf`$NJjBa7A;Gf;;F%mX^L5c1+-67+@lSW*26T> z-OfxJQbd~K)kq=|=>7&2!k&ieFtx@Vpn&3$#At^p2CT87C}Pe7UKruW6B;Hm+{S|% zM#Cq3Rzn+~l$?yMPm=3BC$ccyN##3u6W`RZHEiP#8b(+96op5EvX;3Sw6u-KHVTAK zdCNxiF_^y9C=3JR!ba2J0=G4u0K55u#-G6+-nB`*-yWK6R{Sx2#3WGh!?SHKpV#F5 zPWphmTFPAh-4y+piJ)b&0mViPUq-Z~Rl>9Rubw4W-u}G)^Y!a&Cw3GS@V^@#sfv3V zay7~t9B2a*oR!1*!slD!{o>;D?Xj%gv=f$-o4$tSt)^L6PHeUx%VsH^vCK_*8%tTG z_CPfa%cJUh;X8zSB()e%aHf^A24kuT1z>V9f2;X8#J^ zXOMUBO)XMkC;y{GFqQ!=mt*4nS5ME? zMa8zfkN?~@A!HY=jlvl%M9+oQb=u6W&Sozz24wPWyO~(ZovZQm_7n7$xx>HpR(^*~ z*y`7%nzMh$0z!ZM66sa$9Ke@!8YNoV^gzD3^BQ>H*{_QS^jc#wx>w%)IWXL2(2h3w zwoti2&A_Y^Fu$h*>WT)lvrN##xxvmdF!QIw&!FNiwUDCiEQ{}Xc~C+YkXs}nHrBYa zGO$+fpa}(4`KCrK+As>k3Ql^1_v{+^-%l#+Iw=zOyn0#?Mh|fjRxb(2VHbqI(oJdc z-^yh5)MJc?#Y9{%-}r&=>J}aTOhQVfweg7VR``Lp>K;`KSO3fjPiccrW))JZi*is!_hBDUNhz(dptOW3qu1jC7(Zt2qr3VEMC z6G?zR#5BCG5TLIRpl=|uKG3&KEkWFD_Lej^m)8h2_=sSLYL-jsj$nSs3>YilG4MG~ z-w;Onf0Ff5wxTPD$xi3Uelg&w=en3=I2ZPR32;$226V=Ry4k=Wf8B_Ff(4!$s9+@b zBOf)8f_wi#6x=5disCm0j;qjr(U<{X`)Fk1M zSc4}rkdKHa@xqWo@y4jQ$p-|`TL;SfdBWg;riTTPP63oAA5Uh<$4qLVd2)f)uUbw= zUZg>E{3U$a;M#RuKI29{<8mwodzNy~b$fE?H3s0v>s7Zs)+w>j<2^xo#($k1YM7foQ{@wZ)86F=8PN_166+%u0U$T5NM$sz0+trqQ5!% zRYbfvI;UNIaiZ#pedfvH42kj>FG+(~C3zu9jPtcI6)>|P-$MvJnuxr>j44DF#N?lk zNp5xH5Ye#V`H8t!x&1ySK_qh&a?>c|2AxtsnCfk!b@eEwZCPOWgZYN$m_7_~!opCk!*>UtjduLonc#o%yZ&Z!bJd_t%$k|$Z z73DhB`A6gH25&t~OhpbMeA*_(OC|-2D)KCTcf2*Y?4J`HIw*GYi7j#WWKFDF{nC75qy8ev3rGaTO>K}SXF88hWDwxwLIeSFjbgaS z1n} z4yw@BnXhR^H;kLQXn~j!jAR}P4alc8^Oa-#sG05v?ou~(>oG!i*-qxX%bPFz7Ye~J zLA4pnAIa414!+~fFjjbypMNuiVej#qby%^3*LkaEaEWVz)o4gjjLp+KmA|xV^zGDlO#R!tpRJVf6@uN3jH z(K~Zs3qSl$T`0{>Z(l3hC8wOGo1S5=DrXX9c`lV!U@6*vc_n`$mE6T z*2;iy(gUg=a1@g_ErN2A0@s{TKmO_*8q#KK{_=z$El+W!(YRSx@evtTn9FBpG=vV$rntnk0<7_ z$&LN?YyPy07M6X4WRx>_=#*d_Zaih4oGmO*Clb8qC7~iNPKgXyEffI?zJ%f($My2C z>Ld?+x3RoR%n-2%V@K9WKI~n4*HVpg9!~^P5zCY&e@H_%yq}Pc?pHv^ z719nuXhq75C|`cJ1$@L~GvnEx8T?ysMX_|I4=tb$-Iak zUs;VCrX|8Mo;0oYa{{U`tDB&Nk}Tm9r?rNeeCMa@wr6?_%6DsebvAt=ch8Dp^B3~OtW|hjIGYt2m?d_CFpdR%go2Nq z%{R!|Ja9$`#=_(o-7s~ZHKTELeRpXe6i^x!JqZ)C^E3KXa17~*V|03NKV0U4GZO>u z2p*W8>$^|u%NO~;nYM^2nuE}}ZP2d#OukGoycXg$8k0$R9$!6kkhh+^;Bl2I#4^4qKk_?8FH zZo&$W@_)^499*KsLOnnzMm$hdgE+4+;%u7TDMAa_6^>XNs2WTWE(mJ&NgkCm7K(U& zPIR?zwLoi@_mh>;575>2@zXh}wz&kr#|aGixT{R$(sbU^#+^q)@~8ZTIdA&jSy)Wr zA`(YV>t`%4ol~QhLpzjW5k4O$gSu6WVxvSu`U$3g#LZ#dVzfys4uttl~2qA^38;($S&b8O;brpSuk9baeV5c#tpY=qT^*&-K{$v zN^DTGghylJhzmhDnn9hfx%y%LV9^MqGi32iEK75fdG?a1Kye4r*L=Ccn$Ph=OFH;3 z6&sr(28Lr=Iu=HZl?h9muvN$S>q~q6Ey~5E_`?m{`*g6TV+fKj@#Sk` z5`Wd0u@q#89%r#Jj3A(%7DuYpK*t4B0Uw52dg0c`3;SaJcugBvz+11i)zD5Agwp#s zK7^;)+(fiB$OSxe?NIM)MBJ4Ql=0u!hIk5)`h_Ha$F1wC`JZ;lWM!HN6u;y-y#2aR zJT+ch7X~>zdz}(?PRLUsPO2J29QyK9erR3ekP8BbJjiGhK16Sv`r0q>@bxjzEg{3% z3{O7VUEqD!H^%L?aJ?1F&({wP|3^kD9?QtA%?2A{58n`hWzL4)_@(F8hK`s#Hr*J{ z{+P^1Y;5cQkXBCbuc%W$RJqmNthnQ){^-WQ7VnZ2_{GSexZ_6@id1-=?7Ydv=H{D|J0YCRi z6ebCUoBesvW*<1mV>SmrcSVSR#}2R*JW~D8J$h`8k3A>MN=rZuM6-Zo174(P0nflM z+#HX@zTF&%8|eP#gwz{Ek}?PqU3=CAxgyZ$0^Y8GsXqXN{F4CU1+RdQ-jd++h`Kh^ zCcbhr{EbE7mTtBFB$$<9o)Vr%*IBg@T1rjFEdQ}KLctlQpjH`v@2ppp*)fA`hJK^H zAN@jTDqyh3D-+PVCTrukMR1qPcgx2yU8e0JPtnG4Yf)&s%RRQ%uKK;eLYJbos?Xyk zv-Q>vc#)g8buY|wzOrpS3!P2Vf)vS|08G4eYlpemkn#c^wcXw(mr%@u#klV5cf>}p zvjF8jgBg7*BNhRkIz=pY#^XT@6Q2hrI zSu%@6Ghg5q#Dkg78Slpz7n%6O9scpzWkivfVT7LAO}4L^%s;#-Ql6WnK4eX3gRsz=qNT`y5}bXO=q-y)_R`qp4_)L|={P6Jz_ngV%?FvdRX^l2d3~;)xvdf&wd(1!-TI}sY)q=hI zsOq=|G@*!wRM(nR9G&vTa6-EMMI=?#_eWEu?ynPDt^-U-bxtmj$!f%n zs{t$OWzYUTK`u^P4K^drELSN~ZCp}^h`(MEM%C<+q@el2ULN!$>aJ9w&si=`{Cr6( ze;2Jn1HE~dFPAqt5P>gC{Y5$LKx6zkz59S2A=eLtU|Hp$(0j^3n_1AedZ>~-pN}{w zl)UVqSmEJ=LFMEFZ0=9ih>|@z*r1+^wJcVFNtm&tmutzWHgXU87$v*3;7+<6cE}#= z(h=G(Ld|%`>TakY`1(UjT&`kN%;+jT4tFD66dtzYBECLcr&>ARj^$d%@vtKSgx2s# z6RIX2dH)F&PoyFrT}SX8M}>ZWIy!-R!;U3Wwfxu-sz#SqqbjR(C@kbZm4;A9K3^iv0@>im_UKIN;=sMqYYkYmhgA;+E5bqN^x^#NGKZ-3pHIxn2D zQ8na@nC3XMmwLU=iXByORsctR8_Y|uxbd53rc%lYFQx!9g_^EfQ!18?=ga`&wsc+0PGyDqHc9dFmb_VC;F ztE?hbOJ;cuUwwNCVx`_`jpK9fGdcwtsqb z1a|P9kDb+b(rUciFrko(MUx&Gck!%0qw$08$A8wv+v(*$ufbbNpRoM!vk)!H9JL@t=jLH zY=T>G#4)N0{sg9Q4F0)E8F5!J;pGA<@Y4iXFfELjyLq*ikP4l8N_- z0C-U+7w9+{fJxYbV#lKZh-33b9q4Eg2t$4Ll62@>Cj50N{_Mc+`%)qK<7_>8;5Tq2z zQ5px;E%Zx+G}Tiv43|qBi^9N)XgkB;nyKIfDOTR?*rY&bC~`cGKz9g^-bcQPkmHU^HkemVuV_j*bb{FVbDlNJD1S+-ryHY~Pd|b< z?qZ!12_0dZBPSAnMqlb^9|iI3{!YhFQE1r}C5{bI;14B^FQOotttxpM+_)wLvZW=C zZZ)ADPX3@KYG0ddb=;~6W*3DjCB&Z+A;;R97#%c9m2qNq9J-X2KY<#}L9WnOpxG)G zGgqf$y&YZ%);DE^@UTnlXEi`R;;=+RcU0`4Xqe)zA@Zg{jF+p7jAF@rwN2jHk>Qq<#GIW2^8d*D`iI|&%4$QdM~m8B#||Dd zw)VK8BS-WfTYJplQ6p=Q95wj$VS@(uk015g_#wkyj~_F5$gr{F#{9eX*g?Z|0%Z$LlZS zGy4@B@A4lEZWlzYyf{aE_a9Xwzz0n>ceEIFOGFHNRk`Ytrb~H#lIKvPwM69Hw6NU K{_Fuc(f>wEc delta 13151 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 delta 20721 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 diff --git a/plugins/official/license-header/dist/plugin.wasm.sources b/plugins/official/license-header/dist/plugin.wasm.sources index 01859b4b..7dc3c5ab 100644 --- a/plugins/official/license-header/dist/plugin.wasm.sources +++ b/plugins/official/license-header/dist/plugin.wasm.sources @@ -1 +1 @@ -6a4210a3978f058b3526427eb41ef398924e8c011cc4dc53c19f5419d31501f3 +45a7ee993b5c234b0d25e5b05ef60e714fa3edf63d6bd0d6a29b13587c8d09ce diff --git a/plugins/official/license-header/plugin.toml b/plugins/official/license-header/plugin.toml index af970e2e..c32b4176 100644 --- a/plugins/official/license-header/plugin.toml +++ b/plugins/official/license-header/plugin.toml @@ -5,6 +5,7 @@ description = "Keeps a copyright and SPDX license header at the top of source fi authors = ["OpenIDEA contributors"] license = "Apache-2.0" change-notes = "0.1.0 — first release: missing headers reported on open and save, Add License Header quick fix and command, project scan in the background." +categories = ["tools"] engines.openidea = "^1.0" wasm = "dist/plugin.wasm" activation = ["on-event:file-opened", "on-event:file-saved", "on-command:*"] diff --git a/plugins/official/mybatis/dist/plugin.wasm b/plugins/official/mybatis/dist/plugin.wasm index 5ed3800aaa646c6e75d7e85dd6872d915651644c..ca729516bc530945523cc7cfae70d006fcf0d434 100644 GIT binary patch delta 31921 zcmb`w3!F{W`#*l3ea_6BnKNTH27|#q$6$tG24hBU%@$ITOS%X}D29;KN7pkLh1?gG zTnAH1DK%=ksHW0ApA;2ER7jFbRQh!Bdp~RKedY}6`}zD||FqA#ul1~FJ-79&wfDTR zKYsb4_)Rw^7!U3(8aU4PUz*#`A*`f z6Z$#xw3ApW`qr%7YyNM#{S#|+n9Nmnmg>ZbpLO`8Q)!VCnp|m@Q)$I1U1|TH;@O(l zc@Iz^2TmP79AI@ zYv+1TP?p$U+j9CliKaIiEqtC$)R94IE>6_05q_K!hY!1H^o1J~yU$zcZdN_8R{&emA}{{xJSD z_8ET}XN^O~lg7`+X=AGQuyMfn#`xBF%J|wiWBh6qd8c^4Fm@XojRn4=#`ne%0RV|)VI#}h_BSQ%D2|H!Y6$R%ioKeRkpv*FH~o4aZ!;c z$zywhWO?jo>9Qn`1LBtewo6>dc08K)jlnam)NIFReXz zp!C^{>6S0ko7#2y+PB|2^1^Go&v>R6_e~<*V~Ff2%eYUwfkpOCJ>~-!922us6Se(? zmN&!j@Q=@2AimGYO4(WkSleeOnxBfy%$ovHFp4Fa%`|BB{vNc2&1=&FQK$LfD=yTf z#}9uP>|NWkNi_DnnO=X?!ips=`~BaD^Hw6x`+p#=O{;ds zFDu08Rzm{6tY9*+Fzc1#<5mrT&*QE7(<0F|`|c`mzLU*x9?#A=2hL~$6s>c3nS168 z4gWnNoMry+q16OhluZ6`V{jsPV>^ur#igsb6=(VKjJ^oGc}6dz!1*UXL6@jT!v9#({0_8475k0TL^s(5X)L;g?FKu--L# zBbT7jy^+rU@HE628O9|3nQVT@4U7VJq)U^S-crQ9ZTur&zzFkIADPA`#Ai71#}F?< zoS`+>>B*}2S{3&Ny+(l-J=*OH?F3BJYtClj0Qnft!?ageAw6a%@l~77eRm$IV7YkK zk&8fL?<7wkfG%}xFM|W3Z9$SwhHr%5@%{wf)y~IW%P81K#yY) zh8!zN)0ll)!~C^IICr1OE4)=9DZ}uGj69D)%auvh!6^8X- z7HabN3Wwite?g`hf1dF!*YsM(m^|Y{j-r=h3ZXE=m_c^NSO;3S19Wl1gS^eEuKgj$ zH|hAhg!q#>4)V)09z(n(8dPurAmSPFdhX%z6NzzeG46ftbXSN4?P^!E)Z%$Gp3}v1 z?QTg)EwulHU6#7#_z}QwbMQ}pM2kbKb8CiovY6XVcX%UpEHRoyYtg#w# z_D&4BMX#m;_YodGWT?fDT13!rWD&96ig0|EA6P8GXi;le2=#8oM;6hi7m>w9kV_D; zm_}3wpawfJ0$ZG3I%m1m((!Vk_j6b4OSM{tBIvUG>fvJ7Q~>BOFyibBt^pTB7J(BN zTm>$OECVODQ=yiN$pOs?mdlO@9R6+SFffFh?TL`iR+qcQW$i~*k^5WPv)n(>zDczD zJV!r8tIz*lu8V;e*|bY6zo_8CcE<6Gs@fSpc1jhOwoKOA^1p=Uzc+)#Zyj1)7>=S& zwM5^Jz0bi)s;KD5ux#&G1v6Atb4O#wQ>mY^q4+10Omy$m?C)SX7blMO@L%HNe}G|D z=Vt$)#hVj_O=Sf_h0Zr3#wr`xK4h4mI&|gh6W*w*L%G)%6;pdH z$`d(Vy5(#-RKbd88f%DiI;%K$+zN~6Ge0eBbMb(3>xc`A;it zY#u7RWk7o}-IRu64~f3*Q_J4D`a7aC;^}Lz@-2#`n8jaH?bwV$i_HBZbY08(kLqoS z-~5wXS%!U@4Kx@L=4R3FtD54z>jdo=)dz-Xs>mHUhCUS~1G^&r?Z6u^HY_94$jyg& zWw5z72^tX@lk%}?K`g_#H_!01GJ-lr!rY=va4_s*gg%5vJ%zy-gl7=O zBHWKK&LZeK7#0W;VO}Bd1QR&$2Ll}Vf{8H2670!^L0DXf5(AXj1GXVSt8!gCu`tB# ztOWiEI6uCyIfJJN^%t=G+))w-o?taAo>R#jc!DMXft{fSMpwQbpv1&DJKm@&Ro?$f!d|>XFF)H{_w$n2f6StD`4AUa3S{_VjvXZ$| zvdlaq>_dH6&K@L>&ojWNT+hlkvUFZXo{@`K^$woC zIs*Xr(y`P$fUByT`9^yk^W+=dG|Vt1;DCyS{cG4I;?&^lK=HkX^bUUDqXc)CG9SAX zBOSu52*jx-mS?1hmxiu*15VYd?s!XgNr&1V-3?ntviI*@0yybFEo{_GD zGz2_Yo`H2_5@aCFZOYtIKqMfilh|}aN;ps-(1c=a4_1%NshW~9jDn!g0QqDXoowm> z_z~;IG;P6!;n67`pC1ROIUtV914KN1t zvZ~?{JWW*$InZ9`K@Nb_xJeP|B?BZgFw|rRC!)kG08G``C*&9=@h-FHH zoz0ZyVe{UP00yED5|s%JYlB@5&nqHbJT@#uH4{h!z1)G>L_WFT7^R45LvukIFATMl zK1!f!E@@PV*kN`E(!sV^Kqx_BXB9$7=x9nI1chN^hdwMVd>z(>F{GHNuS%pbnl#gT zu}G?I#!_u8m8kIOA}l+K+Up|4!7MkLsi71b+gm-l z(BoM6r<5=c!dDecl0_4#o}53C64Z~#X&oQ-+S@&aEj^xUb?d@Q?2Czw^T#Iy5|gSW zo7HR7OsQ47PO2whhlAA;>$-O8uWpyI!KB1GZtkCMt{=Iz-Q4NRD~cdt6YT(UYq`1e z-Q1WkvQymb#cnotQPa&`>E^~Dw}zX$*3FGaZgn^J2{)HPGu_;0++6NA+0A{CbHfZ9 zP?K2A&3?tL%)=$Qxo^0+TsP6pecR2ALvFy$-4>mj;O6dhbGhGmH#fZ7&E}5%ZuVX` zmuDB}<{ol$d3LdG?ol_FQ5@su{_5uPoPBQYSvQw^@FF+N>}5|^MhP&%uo-UUS#B4i{F2TUGbIEK2Ofmm1!6`i`%;3oOJXULY$aMrO19XZa4^v*z>X9y z1xN!H{nzDtUw}~OXy1GRXi>kY^R&V$~7 zqk!|EUmz|x5Bi0fBvEY_m8DV|h8JcOkCuUbeV#Ev4GggJy+bX>Jh0m{tZZ;XLqpGT z6cQ0Sj$`c$S?O^MoX5jK7jcT!IXZ=o;uLs{%b=Y&h5aCxL3Vk>vf-_|j=-oemWE=Y z`yp_YvR$Plwz4QzMbrPhh?w}gCl7>fgiN9G=p zcgt9ML9Dyw3en^4eB-ww5x%=Ettz`^R6VvRr;fgc=84^-m(wY6M`2U^t|+`3zdseO z!0)^<7vcB4G0pIMa?CaO?Kzh7501@(J-PDM!HN41v9!<|32}UEh`!bE zYZ_)f3Hu_|im`Y@m+v)I%t*x~_r9vq?QwRelfyzvdGL_9TqP|Z`?p7T`F!M7r9Leu^ZYAvWy zjoMTdW7MW|OrbVQmjbmpIuEFAuk(Of6P_5bi=%@|#GncFZTKVE2<--I5kXJwMe2o2 zkbX~Y$yieX;MeWVA2iAUA+RU5O|Z=em9YcvNrV|s<_wX&u%2i+)8AsZs%lhD<^T>X zU2UE-Cge*;g(7rp8RE9vS^x(tZ>!ragv|udWE9wtIg{*`@HBH300{EQ;8-T+?S)AM z7Gyp|sWMMtZg4HkI#KMotx*{MS#7GEyK+8kob=Fv_oE=H@Qew09gwh*R>W*#AEYr3 zcQ0a$@f40JXwq~kFmCBQjGdwLJo(99m`E5Yg7N+ndnO!H6ZSIdUYTf{4^>6oY(`x; zV;l=bGUw>RO7y*pQ)3r>3~ZF0>;MbPRB;~5R2NufzXEk^siIT?tMU}EDi7qr;!MNp zgZ3#A<8SYga6+#i1H0>X+nie!*m(?Wz4i{U^Uno#sTeY;r|mE@_wIv)Wvcl}^@=ex z2Sd=C&*_0s#XJ>>Lg;3gtHckJY;!@?kr%3wT{MYvN8T$Y+;LerWH@YQXfA}t1t0qg z&&&7fd`&BCs-DB2XoZdBIlUn>)v<)xr+j|L;;%buLwwh|Gow;2y37k!bXF&gV~$)@ zrC1#%apYlj6dSXOf?V`La=DbG5eG&vH!!x00;7Nlzdf8Q1`8M;tGb{U=Mn}=h(z(7 zO{=-OTHE5{g*zJt)DF`ai}AeT>pQ#FtrUoMrB(i-K|ay{U*p5>dYNU;5~XA7jU`Rh zyZJZ=5pPR^}WOMErBsd9INd#6U8}e4t?%1f8}`w zvNV1@;$M?%CPvp2vnPkbzd5+bD8$hQ4z!>VlwxLo9;lbc4m88`s)~HjOB#=*1N< zuQXOF1>g{flna3861N^LMUMs*W(Ey!0hZ&eGjA;ZIrC0rYbn(MxWzeBZ&#$}h`FCX zyNl16e`H!>*tA+H(WqBw4LnQY;MBI^a|?Lw{$@#8z$lfV);H3>MxSyQIqOuZ<6T7j zO|OAKmoCaexX=Qht9Lx$;d7xCU5W>o#Z~3obg{O$yQORaW&$7VQ?RIcnrnsp>?=m< zQ}NNfG|_l^U0<=60-|7gW*VG=*bKuYf@3Y7B?7z5V%W9~2E?4{S>XUuSf8yPWj-gM zLI}0sN@F`|0vuro#s;e~8|#0ZF(Q<#`UH3iM^AEB_#^3NCJe|JoE;b)znXq z`kWOor!u$WRvtMLx*;$2>5e;lmzRA^FvrUC1nwJ>7-eCS2Q z!~+i$kQDRhcK2=dKt-4jwn$K;LEmom$SDa_Pi(xeiTLpTno;?p=$_`axV~C$b`m=B zV28N#!OSp_3@2JVs9PQ8s__wX##b>lzKW?`1D}e4jp6pd3bDz=fwD+q?esz%8!l8M zdD$@tvB%SaV=z}w2eB+Y9mLY}4e+QJy}`*6Ckh@)6}?0Pt>7to!TgwEs#rOrM%1QZ z(~PUkSyjm8sDc>mMT_vLTGR9P_7%nQ4qZ!6*SgEP(9&*QZ`l({ z)D3Qjjh<+Gde*NN8|z_jP;9^kNZb<)8XE+rqOf7&Kyz>!fr(+f+EU9Rcol&Bou=q?ctEV?aE z~`xSA>&Wbe_SGA_qB5pP3=dZpC zInS(4N6u#|C$?lda%PuYOKZe|lFqbNgx2KIIx%ofGaLz==d{W;%#~uv{doc;?U$>Cj!*z_Z4_d}%I-;D^%s_>Fs{Eq*&b!Z{NjVd7ZuNE&{hQokQOa%m;4nM`A#wUh|0Wj)FS z+3(R{BTZ$iyp@g@K4Gimiv^FmxQbV(VXAj<70*&Xo}H+`m3Mu2IxQ|+e?4$gx_(Yr z_Z!&Y_r+G#c-+0?MKPB;3y(`u*pKKvkv{hVW{Sz#Fd|;0oYE{xa6pp?1%y04dSY`A z{y=Pq`O=>!2>((r)>~jt7n>gInKOfQaWRMfJoJJNaODTT7}1#pZrx0P+C_(xMf1m- z{O^sXJbrHz=tSir_Ok8Zc5LH1Bl5A=);S_;gVp_ig(;Ze=-@aUHJ~?0r9Y+!u_2@J z1$(lpOiui~A!wj_>Jv>`Vg46vaSlFMyJO!kWJ$uYvF#+wS8mTg`nu(iTm8Jg&}^}@ ztVgE0!vMODVV9Z~n<}c!mw4WSDG&ED(SCCp+FZT4Rbq5CQM`FPEfc3VcL{4V7UnXW zbupE$ftT^Vi0f`VQRy3nTgeA>u|GQ$!+|dp%S&z8aaRQ6AQ!n4_{%|%U}$#lz+u{W z2G0P8=Z&$;!T3l4 zu8s6TZVVr3G4sP9BDgt$7U!mnvPC)H+^kTJ_UXYGSiTmTq76>x!d5)n%?S`K$m7nf zI5iX|fo%o)bMAkltseuSxe>rLW6%m0P|nhAe4GXl_!dh%nCYWXoJOnbJhxd-r}HhC;xAQ?J=6$6?#sILgkx*pDicV&KbHByX;A`|^2F_Oir_ z8CPs+5w#)x*Os2uo?pV901QY*bC=k*r9Dif*jJvTakdrfikz$a$EcU%4aup_a>x8f?PegwQqApW5u z_5EA0At-u3rOkFKgi$+g0E<6#Cvg06D!yZx%THXePVq;JTN!I;b;VbMFX2G||VwcHspE12}) zJLaEWdI*jdu&`k$p!fK!%U|VW92IuLrr?U(l@Wq--wb1ynEinj#)O~`Hg>fhu;Mlr z=c6J^txQzp6KbU$cfm-Rz^m(JmjyC8;C4Kq-okJhj}C%ymf|TryM&00!a1_jA|j)}D;%%1MPZi5W4{*em89$j9C|~8;E2WYk1^Ld81Z!Q zysKd5Z6M@vg_;m|*a?z%D}xD{ybEDhv?zk7%>^AL0Lpwx3r&R*%(O^#h6`+rfypdJ zxMWlaw^7takW&-X#c;-xcT~QYM{Hco;3&5R-bnx$d$=2fJDvBgm;^8&Omz*69^Anr z_TC_f6-5zD=|aFsk&tHF>I0pj@z;!N*ke#--n7ApZ1gut*8u3(*I zC9o0z263q&g3vgf1ks^|u&xlU&UvIYC^e zjOFVSUeW&F&BBoT@t6S>hGL+rAj(my5$fI*usjO=70PL);}eu`kawz@h}hd|@I4E- zgYt}}m=&*FDZ)t86-+CMdU}bL!7u9}=y8iyE@UM}=7+u_3y+B#K)WJsuA{Mz@}>O# z1g{i(Mexh?{F#N zqv?~idUbA`URJt2o!T;&RJUq4T=IhElK6k*67l=TEiJsLk*WHf4N3zoz}@xnU~sU^8T#c7yipT^u3$&0->S(LnV+wMntVs6I`6o| zvK{rhZ-!Gf4LNAF1-z4vxyFHRna=q1l#eapXmXaP^!o~MWaQN*HN9QfN{Hm0wc;1K zg`(xooN%$50!#o(S%)!JvSYLG1s+9yxU}Pn9~>e1o$aw&Pkud&FBL-g;vx`lc3Hm6 zKs1q~8Q^oClq-i=ltk>TGhrl@WMHzNZ#V`L4s;mvU=e3Rr>iJPRhSSdJaB#?&e)xn zJF66yc`43SttKDR%VX>C3ghrke}jG>@>x&XD<1u<8?KoAfHQTpHb9?nYS|%yBI!YBPt~XJL-)oV*l<` z@!nneFu3UM+&bsEseg(y62gY~Yj?x2

bSn+z;BT(O-H0GaCYF6(kI2@G3^KuA7s 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 diff --git a/plugins/official/mybatis/dist/plugin.wasm.sources b/plugins/official/mybatis/dist/plugin.wasm.sources index 0241ff75..758553fc 100644 --- a/plugins/official/mybatis/dist/plugin.wasm.sources +++ b/plugins/official/mybatis/dist/plugin.wasm.sources @@ -1 +1 @@ -f7df58bb0ab2b92370b148de2614174ec1ff9b01c0078b5c20bd331f82298616 +d5cf81455ae8b2b0fd6d1402d8775913bd7999db62b9bdf87675890ce52b1e80 diff --git a/plugins/official/mybatis/plugin.toml b/plugins/official/mybatis/plugin.toml index fac11916..d5a55c69 100644 --- a/plugins/official/mybatis/plugin.toml +++ b/plugins/official/mybatis/plugin.toml @@ -5,6 +5,7 @@ description = "Jumps between MyBatis mapper interfaces and their XML statements authors = ["OpenIDEA contributors"] license = "Apache-2.0" change-notes = "0.1.0 — first release: navigation both ways, line markers, id and parameter completion." +categories = ["frameworks"] engines.openidea = "^1.0" wasm = "dist/plugin.wasm" activation = ["on-command:*"] diff --git a/plugins/official/regex-tester/dist/plugin.wasm b/plugins/official/regex-tester/dist/plugin.wasm index 9eed421b1bd1cfc2d44d3ebc0563c16dd5dd95c6..1d39d764e537bfdd16c1e6be6b5c2b4063e43664 100644 GIT binary patch delta 174374 zcmeFa2Y6IP_XoT)cW<(r-M~UZ2!Vv%6i7lzKp=Ej6a)dm1|qylv0y|5E1;5u1Pr}g zVL~rbLJu_vh@q%RFCw7_K?z6+0*ch{H#7Hcq4>W4_C3${Jm34u-g~Eg&isG;u#X*WyaVWvmVzC4T@me$gp+Oc)AXQeCgf5padn!a7XZj;x-Jb5L&Qw9E0q=Q+a4;N68m(JDl zDn3OPYd0#!_PD9HxGg%Ruav{j(y#YLX^#FhZ~1;P*$m2|Twf;JuGVX(>DM8mwrH`e zEz$;6szz>T^D8wVpJ}Hn)ghm29U_w~y?gY1z0Vt_!FZ@g)1q1P_)<}UG4FrW*OX2e z2`g32Y|0?TCUr!>NOhjNQeCBS6VidQ?5G4pBx0TvC5ki`C!M-_`T#W%ZnTMZKV2R5O*K0ejRR)gRPd>JD|Ux?SC; z?o@ZH=>cDxm*r2fi=dAbCZR#5JHodR@X3eLWX#pG6O|~`kx;jJMY5h)}tmdoJ z)kW$Ob*Z{cU9PTB*Q#Hu>(y`7E$SF$LcmyMNWdudn);_YQO!`k47g5jsyFE0>QH5T zz%WG%7_P8@FO(?(d1|gYMJZ87D?h2(%Cvxm>X%AZz+!c?dRzTVy`fH0r>a}knQB_P zGBx0DniG(t&R3cGje1MHqfS$&sG}`6>=&)Y*7Mfu_EYvd*2C5#)??ORty2OoSg%@t zwBENKu>NhmX-yB>Yn>c8Cg>OIxWGTH69Y#CO$r~e0 z+P2oV%C^R~!S=iDqV1CHvh9kk#5UGG#y-nF!am(T%|6>c)qc``!oI+M(EgMCu>FYr zvi+L;(bT8diti9$MAAkSnf^<`=JIYDiMfdmP)-i8Xdb-JE zi^)jG)mk?Y!~xVQ@IXKng+%iR1)ZHGFQ1jW+g%*G2F zr++^wZ=`l7u6whe9swmR_#cRYs;%X zNA_qWz9veN<6Dv6wNK(ZgdZG%r8xuLXMw>3`hDY6$0F@ye08!fs$RB93{BfI8@-~xSXbwIs@bBIN}(k zKL_&XQKTL%AdXI!R4ja6@QUvCmmlU<6pW!V}{ zfbNbpS_9paYsBj44saK9x@bFUG@)5THEYdk^sfx9Ud?1o;;ovq$Z5@z)Q)V_UP^if zzq69U>6D||`lM!fxRun!E@>9v4(BjlORiLU)=@#Gd;3jbpczZF5y{DEYX#K<+~a_1 z#XVlOu;O;%lFgjKgB?rt7MKerEZgPDRhb>jMWtLbYWaNg_4bxjhcN@(3huJ2HYZk% z#Ty)urjuQ9ua)Da0Lr&wF4F|-U?xlac_@Gbs9q0jK%Y{-ibsOdDQ~g6evP<`eD6SiuEJL8_m6_r9`k*-LA|IGQn)F)K!Wb@ z(W8}?!9myr6vq*5bA#+~qlx2&4v))-;^r%DCstW4+#@MQlW{cFsXBhwt~TsY!B_@g zp0QLurA1noMk!d%_(pO$(PcO?jMf4%T2SK}(82W^N6~BP+RKe=ynRW`fv<2o8XK$S z_r_|Wo1+ySjN%#a&Lc~+$)nnS326D+lE&dxH_6f5Y4xbd9%yq4$?9i_wUlx^YJHnj zNc9oVWR4$?bnfz(PN5pSFodA@sYk;fCFkLf1jL8)?nVJ_|KZO14`;w1M;|o+r<2cA zAMERXgnDzDVQxfg2@OKEh^8S{NiQH;tJl<7$Dp2}3uR-)4Lqg~_`pT&utLmS`h6&* zjc8ii2h4X(N62li<72Idw4qrYgAK(;sJRUh_ELafqLl z;x~@TJC5n!jB~bm)zZc|(gv8sDuT{cP2BpC47X6OROd32J5SnW2n~Une(ldNQkQ?M7PDA>=-ZaopxuC9KrqN5V7g$jWA)OVy<4HWw&*c zVcL$ih2#tEt9J1icvrhlE{~j2x5Lly%98z#YfrYXhkk?FN8&f9eOtP01S5fgky@8j zZVI-2Ha1ykX`gLDvi(Cl*?DWHwMj(qgy(!3ZbsM4P!W2pw;BD)lI~7MDVsJ1Jz+O`e8bW_Hp9 zYEGecH*qPPifCoQ1?Fd{#GH%bkqcoxT1nhlQtPGBa1`x>VyEsrK`cCmraHdjL(%5) z|6G_my3^z+<^MsuqjplP3m0>O(lG^d$6Y*qxgK?Zk%S_~Kq$jd?#6e5;4r~m zkp%Ff4+fk>lkF@aL@WP-JH)drXR2eiT$a}6xsEkC^h))pU5rRWQ~20o99VIVe1U2o z_*%&eE?rrH+*-tosUYCc7h|yzE_%^jX1{0;YS>*Wrgb2ljp-6tfsOlDpr!0VSqHAu zr*?vsX-i#N$Cs+P-DY^Nwnx&O0MAMqQ+`n!tCgg+zY;xZh?yE_f0=m)W_?EBB_A-P> z=VI7-`b+1uSA6!lYluH?C_lC5 zq>hJS+SuI^Qd==Q7Hg+pi%9dJ#>-TCZe)~MaFN9UF6 z=2XY`V&c#(YHBn{GYs9px#NfOD?*E^w?)B&Ez*D`ImAzrGtl8D)qjX00N6O3<5RXQ z^h~A@9R9$7dYkQLH|2o{le-Y6*bn*ya}@pFXhmX-X5e|z%4VyFUXB92ha=UoO{?6! zGTEjz>s}*mLMEREpjx=)FIQ@kE47v7{ru$1R+Sg|wL(|nH24+Twn>b;ufxQAU_I!N z4ii(BzUhnCQKEQ~j_q+0+m3PK8C#(j>AT=;8YIf`!14t(SCq=RL*-~Yd)Bh;7{Zro zJ5GqgR!Q2bi|pXNj##7(R|b3#y)_>(-PIGlmUX$P5399qTcLR&y|4A+)%pi zJKzWE*uk4aQxur+pX4l18W2sAI)t-vFh@LbX9o!3&`P~tB}|{<7ZQ7XDqL8!XS-J{ z1rfX^7QngJ!HcXQWw9vIy7j6;hh=CxyTk_H5<^4DK}`2(ce;c}bP>$&2GTgvebtQC ztVaWjglb!)sQf%(AyBsy8!u46 zf6R_s8CtbBJHuSbe6z7#+7R4Uff=#$%}gl84sX2&JLKE9x{+VCO1)huY1;c0vRj+n z+e!b<&^GiQO}^CHyj{8MZyZ0-1O(>&;gFrv2EFYhi?pe4M*zawx2uz@+L^aI`&&4x z=A<%0_ON|j1H)O+tASUea0nv`;K#YgV70WQ(S}TMxet z#czM{n=5`#iQllkZ9=vP>{z%+I4xXU99y*a`*uUGy?uMy^jc@2BTsAm-db{AyY}9* z_-)azIes(y@%sb)+F`uP{S(lqP5-*sdei#-V;A7taV(T5!Dh!1(mPH`XcQ9Susd-9_JDB1YYljQt_ zkE>yX6NC5&Jw85-;wL|8jNkN6I^cKTCupLD4(N#AHwJu!md6IjmX);X1E-^O$H0pC z{cT_~{8ky%6~99Uz2bpb_R~cu`R3DD{QmMOAGGUdZ{T{9i8AJ&5@nz|tqa7EqRxG}Y^SV|#;LN_V8w$NwghW*B) zctXR;wNOWZh+f#(?CycpLLJ{r?c$y9Vlt^qKrAL&R(FH{1B`J2#bRQ4z@cN;1Cb4Rr%Z*q8yFLz@##c?GLO#>o=r2 z*{V$+@&bOZ4k?e{eOa;it(ob0H%EdgZxP~Ny`sLLTr zdHf*2sfrQH42wrq!(n{HuERRwcZs;)J**P$FAPiQC1KhYS!p+fa?c*NM9wYg{e$ z&=QUK8G(T6keUq#ApKm3Imgohnms%2zuu`=_6S{t;$TDo=eEI?3BzNb`mavF739w1 zV&Dq2TfpYnejHP^)Zqy+j|7Cx$!8(j?%^&nRl71gq1q!`Kd^2tMM?tIx{PQ6Z-3f| zcT%&xCnK;t+_8PIdkacQl-lc20T-RjDGEm=Ea5y(kb1PAoCtm~ienw;Y1kS-X}@UQ ztTa1N$c+sJ&N3rcNlhhQ8q0jk99bRP$HkFV^vx!KL)IckMPWUSN7crr^4_TRP=1M{ z+u`>U@w;twQ`{?KcuB`G-N9Ka#zXB1SK5aG522Z5Kns}40(BcYn#sVrQiW*?g{QPH~D7B?GPuardS-eGg#7o zwT{n@UqQP+p*E0HTWgQ~B3*OpM=F%7jRV>etr2|NVy%8ex(pRpgW_E6cP=-bb!?)B zTP=_us948dt?QSya6CEs%O&J%t>MIhc8@qUcA1%Th&fa{II%8pXr0ssu=lYTtM_yw znT2ZFq!5@k3nq0#ZF&wr-b-dxVGq5`_=Y!{wGh2zd8p>d2_cuX*qp9DtwXf}lwL=V zT51cE<7S2yG}$eBMQN#%BXtj+`_!d~ zJwagO@qY`3H$e5cd1w=-B#lI@y(>dR!6_QupV$qH@P)HXg5il}M- z0_S`-Eg7p{I;|3V?3mU|KRDo?H>YvK>3vYXV0vc{>A|80w4fQyDjObVAU924_ADAs zt$5UW&v=TT+AW(=rS@N()8I|$5kTTS?4s@@u3Po9F5)@s(gJ42Juym#5>;XQ!t*Q; zqVZr{gFImXIaOzX<20uzO7ai|$9lq{-yNc>3+uzi?!M&PPORC%+X%3tjV0B6 z?V&c7Fy2TX6M$~&Ewr(-Bg&2vQ-Y2%JBIUH$2e`nY&XZ@z1cO$c&+-J>a{QEiVbt> zEnRmi4jpwvL>`!OH1XwN@{XO_tT|3q-W{70O*XE&H|IM-E^FK7zD=%ZHRm-WQ?$PG z#*z~4-n=&CfYy3`9eOog8$3VR|KL9e2mhPqcMf5aD4@Fgj^zGhTKodeZ|xV11ScI? zz>nB1x$?e>HNbPkwKX@9jz6MZ$!!FWq}syvXgqLXcc_D-3mZRSI5Wq=c2_vN*!W(a zidY$S=fc(B#utwJB1Hruv9c1a&7#D#Sz*sshDFJd9xU zG#TtMqSS(i{2E$yh)et%S~)`+4YmG@%eVBXCn}DoRYO0i?oqOVkz;C7okmC?LeEQ zt6xi-#AQixj^rXc!XF4uTOjBLii`YbBv8y}q|XotA4d#vLjc(bzH)TSP^OMmeV8>| z0%>zjsCC-NH66n*aE=y_)MeG%x)r2ITwBuMLWQ|k%eM3@bLrVGP zAfyxv-iCXloZlPe^-~@4Oq{xLD~`p{IzH90opT=K5BTQ@;)L(NvEuVSTnvGS6zaRI z>b~f|%L+;Hq0VEUIoKBebFdst?f)2z-=d=beK+m9Z{k3X-@j=K7D(CTWdTlbe-_|` zel!cj7DyJTtwnEnLXep=kwN_W6jn}~&HPB7bB3h`?#{1Io7C8}e*w)Tgou%+Gp;d0oeodt3q!dX3Wr%M&HP`kf<9Q`|88~@{q zU?X>rPt3+hT_r|)e@8gCzzb5;C^CwjN>Qt5`**xm{!kX0@beXJNXJJ9iaaZ%^L5x+ zCCZ!5=QI-icrYXgjRVj`+xc+DAFLfzahNd6YnXUH1LC!v^T=dv@~*Dl`6EE+GykC7 zpL&xHNALbL_E%~BE3nY?ERkSS3zN$%Z7LYdisPtOeNWY>xrXWBX~+lVW*3?q(faS< z0ZVPq^HGZp!_R1FmkluyI~po`YoKARz0ISH>=Mt=XbAEmj4v9F-OEL5&E7^}>8pFg zTN?UY==XR-y}L~=yUm^E3g*!uea~I};8cm20meC^J-d(3v){g!fVy_y=gO?Z1#I8c zz%Z@der^W!-~U=AeV__(t#p8wWO|qC*sWdM&$qAm11s@+>;OMzHy?aYce|RhRw+tS zfb6f8?h;*Ui@s0G(<7}}m+~)KOfldXuuKp?hdAxMJ>$JS?!7%BZbQ)){vd_ZY(~7d zNEDXR3mqr5CO?IfU-)m2pB~lzkSGMX0K{>X?{B4TrH$U#pTj#~K7!waY)n!7vX!^eldR9deU}+Pp)9%a7vQrHkN<#Bj#@L-qb6k(kPrBb}m!{By=|QY;2%=8mCaa+Gs7f6QjV zZv{5j795Quo3!0Wxyx95v@vqI;*Ont@y;+Y>LIClbXM5-g>PXZ&LtfBDDE7EXFBi! zq9N^2DLINKzrked$(u6mU&lKnPxAxp2V?t#Ft!7RcKrAzi1pMHw_(7sleJ;#?KoMH z%v$x^$=!rZ(^ePNd~&)#Dvyc7530}4&k<9TbB+#h4_Uq$+RR-S)l1~ydQ!57sRA6+ zwYbwwoJ`DLb(NILW#p+$1H8g=_837C5%PBn29Ftd^t)y6wYydlvP82 z$sx$*jXL`kf-zgpjw6$_7k+h2#6Ww5aW13v@gg5M{?mg{tJ z3@Kp!5|I~l>tcJdRBL^yE?LZoi-eb#Hq>}N6gMR8NVP@GbD_5MQVy)|R+rQ8`~BsX zL8l}p6~{iU+?8jn1!8W*F;eS&rAE*%-pZL*8U_6-AI)ex^GXHn?iDB5uSJzqAmg<9 zB{6UcyOq?hJ3&Bz#C3BaI))vTXO$4dTyfvs(50ABAvRwlXfr|kv19@{sCB#A7n|bF zt6gzl^^cm6uugxtAYlXkXoQ^g)qnIrN!Yb09fOLFLHD&f;XCELouq~dPIziVQ#e!@ zar~@}zV;D1Dc4;ObgFf|O5Oc(stHPRi?rv0b>8D~0>?OBg9CTW)6~#p;djOYv{Bb< zB51JTdK+L+z3~>}DDU2g5Bfvmh9Dd`^F}2EQ8wO)@GUI5(GcEr#Xswkv)XfiehAOy z`#&2;-IVG^XK$yuhRMRS2%s}mXkb(!qJ zV073Mt{?@GSDx=5N=YbdNk~~#eN0IQlFz=UB$|B9&Qnqoh2aY6ji(HSM3QlArb04eM)_l$CpMXN zg=jH%?dWty%)*pvX$ftUUsK;Eyp zL@$+U?ipWQ&$l+I>J_MZBrQ3{vyp*hGCh~UPH#|OWP>au6Kdd|g-pj~nw2EuvfD}$ zaQVwhUVrRLh6ItJXk)RFxwtH~i5`b-qCdjINhqvuCvmvEYA5do-7%y;kBtc>F=Q+I z8?_a0ieeD*n!GVp#3WUxsiGr~H9(Ff+WiaiPgb(QcnaC7GXW0A_{NR&k!@^sFsT-F z(IY_Yd@#Y$4zraa6@xB#i<3){%AWp^NS=lP8UK#;EJZ#iU$P>!C*QL>rAU3>ZcR&z zNfeYPVQfHYVy|fIqF&7MO;lobW@*wX=y&g!_t7~{&Y2sk*x$|E7WLR`SG`SFI7ns8 z`Yi`(9+WQk4`>6X7w>nF3S($jaS{|-Yee;h+>XYZCH?nf}h(Q+i(m$Hvx zh#y(~FfT*w;0)nn*TP8cpz~g8C6y;BK;2vANun>vspWx;tqjca`h#pxU1EVqHsCoC zF!cC29#Y?9fY5Z4+lR29hYNJh3@3G*a#$yEUlQXZ^N{q9CKa(GgORwLTnmS;%VUiy zcyLYlIi&*4_yg-xfwb_Q`ML_E9vWY%fSLOY7!x68-a6v{jFTo+A}#faU#lI4QYs(3j{qRs^y*{Nbz0OTu@ zN;p{)ZT-1V1xETtl9$LXwk?wMC%aj_C{h*4Ca*?eHsjeR{Am}P8AV#e>^3IV4~c!; z2*C#TA(B^-uMQJc*h9=*nf!>}dn%JK^!~Ln9JqzN8$bU;`syN<;)Fun%z8V?Q{*sP z>Lf3aLT+MJCQF&ig~3L!HZJT=zp*VY(u7Qy6ir@(OWr-2OpcHaitun1wM7t+`)K302)zo6tGJ%q&(XfLl9x%_fz#|oFO<6*=!V>9t*Ad3)>Wn z!OyakIMSJHU}NK8`yCVOh7k=*i0AHNr8uX|XPe@{Img(IIMOq1gE2IYF?8-dF0-_a zNHg3&Pt_PvuvrNg@aUfE&uOHc6oWDfV^}d5;vaBS~NbQ4>v0v)E*^32R8N zg?2ZSNx$$j0@awhDtUktM(_Zd^h1ZMwaCDb)4Y*9Wrae4^X)jrKCewS0#d^#uosVF zsZWrl7&E*Msqu)`C)vw&$PhF;R)_3{U6H@2F4;mV{>s7fJafR*$vjHh8mrkCDdZh) zfm~040WgD2u8(0R=Kolqv?H!Bct6BuFl+A6D&ki9pB$89D67|yyc?hi@T_^L`3aTF z({XmXA!$lRua1^65iA*-^<37xF^RU^k#ji2QX7**GKWoU49>jBb~PsP zm4x{5LEPbeQXRsB0nyRh(GRh3rgQ5+&HV_5bN6nqc3E6O~~76ySWj? zF)2st09E~=ifytY_MwX6ypy)g!4Hff0D%zKlny=O@aT|42wnBb@4bSj)b`^Eo8UcB)Za7UT*UV5nh+D5h5JLu6`2uFREp* z{R;vw^6R&`f%VviC!tffF!~fpq(kyp&8J9(ia!WR#2lgFOb)*Y1nc<}`G`zlg-=1J zjbb;Sf^Hno(p!>_WH#I1l2oDN5qDUtgt5}Ch|NAtE`{$XxvWYn@+O_MpN(lnCh=>P zr%6j!_HY?P;}bX8+@HDi*GAk%1snA=dD7x}I{Y*lMzYwetznL4u|ch&3bNRW)?_&@ zJ=&0$Y4*=-LmTMbTz0VyiHgV?4Zy$?PSu=tm>AJY3q+%kq>;s9pCKQYGwOLBk>T6j zWH@z91i+)u!0yXpW!u79%3>*P$-5l<{I=LlBzTlwZ3|N(iv_hK=^kJO80;ZnJKB+k zBr9KSPfk*DGXHD`Y&bAJDm(|=Ww6xekUw;e(dS83GL$7gPu?VF*!btkhvoFRuSgjm z!h@cm$#*Q`1=50E8^T_F0mF}ApS(bJlP_4y7fCV6WHnzB)9>;UwDV3j|0VJ~=KHTs z#1({SH+A##@a-(N6R9tY69FK*6RGmTt|NlGIVWBLK9FK9sDqn*l1%!cuZMO2eFp|h z<3p==-h(@n$rZPYaWKjqlIj*7k~>EZFgL&U%iyeTfAez$9t9HV^T^5K$>GHD2lsl! z`8|3%uE|F3JfK^^!Y}swKlNe+jT|?`J*>rdqPby-P33wP!?|;(NSP4M0rz$z{a^Z* z0Ki|j9?P7sz=HdNz3~cpJNCG7_7B5U7d#%QMOebje_%2>?y!ul=5pnH1TXWbK&2j= zrxS*22?tj2%kcwMAwPAx!CctKin~FYa@ec?g1M2y#{Y}N}sa0ovapS5y~uNj&$HipkrVv--RrPXX0y~c$SnS7 zf0G=qv?Y_bR$$vVGEqO!|Q01!^{3tdXr9MN&eN|q%^^LNGd5uma+1w^TlC6ZeH-@`~BDX9E2yOj!NTEuF+1Ie4u zhQ34E!0$rmPfL%}n@C;TkBx6{4r4`qNNG#qbiMPiK8WEQXG{7(=jIxPfAs`ANz^Vp~XqyzimebN}AZSx1vf{R(w2c)Y}bMyo91d2+1NUGz~=tJ@^ z^tTTpNo@Ovqzt*qj($k009}yEUf{YnJ|fX&bGZuP{D~Y-Bnok}bn-`HCBJ<{UIyf5 zAB!c7{#Yylmxd}&_nOaeTbnic1VX)xz4-~KvVu+i1YEt8t^b5H!(wiIf}Y}1lYKk@ ztRNP!2t_Fa;gyI>B3n9;yeg-;8sfNl5DC#=VGZZf&rS^j$nldtC5Oq7{K8KmAkg`@ zKO?PNITHj`y*?V%&DwQ(1?%}aT%l!b)aNAAohu8M3yoO{o^K%Rc%-!$$2E#O=d{pC z@xVmRR9~F}%@dADW5>b7MP{-02Sazl9Unv9X3jJcR&lBj2I1l-r_e0^2C3rC!uwVC zhO_6=u#s_Qr85VlDu3mzhH?*sZ3k-2r5HAp9sE>Y)! z1u{j$|3FhN=t$~vtYlZllPESZog|b#qALKTnZRF~%66xdaEb|>ODE4^0u3^NiOZ~4 z2B{nJo6sx@PmBeio5%}0#};S6wz!wcCXawCn$Ge^ked0=4MBV-@ID9Z_?f+)Np6+e zKHeAQjBF#}EGvsl4e`O<_DK?V`L&0Vt+c{X-rp6+krGdf5VzGQzmt{9CVS#Vb+pCt zGjApv6)Vvq4YWwSLnxQJlbMH;`cLHgjSty0{Pmmu6;`LiiLWjoY4K_$VYWZ#*ge)vjz5@Sr>e7*F);gl1c~rRR2x7gBS}}+zlF*^ABnfi3{X-{ z!N&&Wkun+TtmqK9c2Tx}I0;p#<1llMdK6q^QpRlAv{9sy&!qkuMV{B`c9?Y>O`K^D zjOoSOI=T58GK7<&2No=6DGOm^EIZ-Zw+kh%^nDk0PN3T`3Uek37BJ!<3cE5I8fg=& zG=@}7yDY_}hUp3w@0co3K3*XlDF=uFR@V6q@Te&i`?cVRRQUUn7Kb4@XTjX}_;^xs zz+Z%I8H4i>A-|iTN%F?xs9+U)b{zEkPBwiUtko6l@;EZsV&IH@IGzkbP#Ch7l2-Jn zy=mX03Uj6j9Qf~I*^er`DV2?X%i>2B7MAxb#e${Ep2ylxAx+t>2_z_drbMr(fyBkS zx#47SoMDwT($rU1A>nLZ2Lq~>){3w%sGh!VN0$yiL|BjhOqY2NE5l?73j)x^CYP(z1lh| zNPNqKr_o+!m6=f6FEdhtZM97f>4yCZyI&GJlta2ayKa%7wD%Qck9^7sL%0GwY9`me zLMNj$7@B)N`)o3)uWt+dttp`#jBR1ZWD;4*U~VuwC)BT=F&ojLjC3ifO-dy908>Gfm(e;w~G!zJa&r-{zq_ zVV{2kz_C~`4RzxkYbQ-24##D^C%%F4P*0fmA~y}<3V#;HpV8ni*q}Y-uc|s} zSuvb33I6sfPJb7YYSrZo!1z4x6*I6JAQF^#7k|yrnd-K=@892Qa?D{Z7Ln*K7yn@; za4;zU`iDQD<^oWC4#@5WUmxc#6yAutlmY&mMWlMzB`^371)lh1H?aGQNcqYJZp4z3 zNNW#nc$<6K?BYU#&jmgLPdt>&vp&SUbSO1UFS~%B8m2BH0supfFBAk|6Bd)W#4G=R zc3AI}zr-cMvD1r5SOpzw66r0#6`>Xjm%yD^$d)W2FO~AR2K?(A zb6M%7Fns5;qC9+0bnsGQ)9)kAHsL07(~dWMpx6GT@Q&uOvdhSm=MkxLRUaJKwVbrToL*lJQ&u0pXt@A^F5Hj6Y+JFxd8G7%J*VawQ?84i zVu0o=P_%*#U4a~lh3wFZhu2wurRap|@lLqZQu$kRdjF7BBr$xB?wsEhyAh%!;qE%{ zR)(>cRzZ(m${)3glp&)WP>r!OsA+R1T#*V|eAHT%`sR#+u^)SQGe?4?b7JGL+khhb4x)GY=0>2mI#<8v& z1mq7l0P+R4dxMA$^5I$ejikIBU+FgRe{k@EkIHH-x|W<3Vnr9}ayga+mqShORKS)ZzzcV;qm&e6YeGV73paG>q;u zod;%<+sIr$Ai1O@f94OQC9&Mhm3Uzn zx1-Hg*6l}OF7R%`=(yOB6mW_y=ua! z&z`Kt!CMg~M>pQPx~aor<#)k98_!zpf^#ySrR^f|kw!LG3CuS=QBFnR+~F>vh+l0( zht~`#*cHHSU9;{fo87DZo=xt-Jh=iJI#1M)9L~?-jNa>n40(HdWQskv8(BR1nGP5X zTFQ{;Y*y3@i%0}!(baHvT1*KWcKsJte}Qv*L#*it5L(xPUv zr^fE7!JFxis_BM-HsXxP>#g8B$aqFFl&9;g2kMuIXYZiLeV=U&`N~Z^ZFddZc!(s> zKZme$hj4tjld+#6q;nO;1 zIS#X~fHgRdQ2*C#({b`d(t6R3e=@|eLBGX^L^kTT@jTKR&)*N=*Hp(h%y|L^*Cy8I z1ORSlVJFGUWoPlm{43({#t^*>bo|KDPZB5D!DgR?TfUS1bP^|>yI9pz5TKo`^C>dV zGHa9+4;EQO!s{3+iF%}DpI*tl0I4|`Klts z+P7jo0#c3(xg&rs@i=M9TGd?DQED zT6xPzwBb2#c2^+3SX|;;3@W@(kz*NpmduS4+D)9t2zuhJP}kpg&^hEP8%^jd zmRwDjgDZr7Uiq6-++RRGsvU0*15G;5<<8L?jilI{&$1PcoAUjCd==t6GKbG-=>#z}55OES}#_oNm<5}VInYT>a-u_pvNM)1xu+K5-i z?{g*tzj|9gwx>@U#hq>Jw`{W+NBU6eznf_{oZz=sX?*B>c^ED}4!ciE=t7pI(o3Ld zhd>(6Mg-7p^1d2QAAh&)poPdK}O**pTd{fH+EW;1NqHPzu?#Rg6U{} zEh$ASv4~Q%8-Ey3ihisYj_23R(sU}nIvwPSa6ULm1t79aK zDMK3}u=QFQS_zlW%FuAcBqx@kt-ZU=uVv_VGKnoKizeA@XIVPJI$RuP+mU7ZY6uMj z=|2jgo#Q;EJaPpE0}CcJS{gFqTdhLFBN>-=OE$JLU1^Gg?O_6_xGfN|FS8>{7CAQM ze;!IdCY62_Ou)@5JJ!R$b0fax+8v+&`;CQiSf3scq@Rfl@&BsW7zWY)C#TRc2k}z)x%9=S$cD`nO$sV zj$>8AX)9!vz8j9OOq8&&3N!^lif1d(1dok+7UvTB#*9-<40IM>k7Qp~pyOeyRf#~X za2i`4LFbd1tW!l=50}vuX*4n?@+u-oauBK3G?RSAE>@z|$y!z+l2%gJ^0l$0QM5Aa z5=pDU*c%#2JD}~MNE!p>^miov#JYwza#|c~*}y2ehUXY1SEeqseZDd{{~*h%jJ8); zZe==1Z(9~^t2yadRBmw6!PY$jf*qwTT(lup`MC@7aFCsK(PzCg0y#q?guL@4hfztX zj$uNNnBCWFrh;N)qN$4u@``9$j;zi9AsWF|97O#UgC!r#pAk#f5_qmJRiU*)cZ&f7 zg;ghR`HZGif%4MWnJTmj+6PsoXL$F^@w6hk1tmZ&Jk-sBZmkk%%hDR337=NU4g@Om z*^~re>mUP=hLaL$_Xvq2e8Tu=L=B73L}1n#1fz0LBCP>r;kzU}KP&%YBArC(A78Mn z8c?a{*}NL`$@-qGn4*?OT1?S*fZ~%FgA_8~%otHUojGelI;XQHHKCc-3URd4i5AWsH>#vS6^rb)Z)<*c)}|=XjUkOdYy3O61iz1CW1-k@%d9K5~A` z>dN^Q)}^cH-7Ge`9&Hg`EMjI3uki?-w7oXGwsZC9^P%Y+VIo&jPCd}^M;2?J0>(ec zvQy~N;I9Nrib^gL^=UJ(<&gUHNeKS;_36->a!!gq6~(bl=*2K+xlI15p(0fgZSF29 zD=0az0qstwtz^z*8fFc!aqqP(G{db1kpAT?vLQ_@tAEeb2PEs#@X2-^=Hk2RvMYLe~o)m`D?-4g5KzMtXeLaBC_ao!BJ;wc&z zAavL;_IzVnUH6!HzXzMPt%LbJ4*3U<2-Z>VQz?8HNi%X?$W?I_zeACmi(S z+cqbmo>GT^i)`jovYD6I+UnSf<)>^o8?XE{4X-UR3HKjwI9ogipeFuqx`&Bv0B`c_ zB<#6oXq^5nU|W`qf;ckSjHe}He&ko|QP-b_0?lXTTGM36Osm#Xga)^kwF_I*nh~C{ z^MbIuiJi{m-j4fW>}qQo9;fewCdU_I?-8G2$P~AA4Gds+so4fr#F(dPVEGm()e*w; zSNWvj>#Sk@+R!*YCDw*U2IuSK$Je&8i*0U0qcF>&HnjXpayVNg@8?;&#Ej?B#y`FQ zgu8i~sU%v`w5c zbCxUu|KT7gs4aa7jNZL1jm2fCyew)9<-Q5#0rZT@V;IBO-L|xTv?te6XAFUsQ38=R zfz&mub30lGp@mWHpfJT@urtYsbyV`<1Yjecf8kX|IQSW{9cu#6W2BUs1wR0W)< z_K^2YtdqQO+2cO9PL5^m!3zZ=S-(MQC~TkfKqMCAj4>YDJWDs>?Ap?S{?KCXDq(+m za)S7GEFCF|@t0au_r79r$P*6t3U282K)sg;a*`|Zzg;8wJ zbM#kWa`p4HJ}#G@r>#P_OM7>}VVvWLaRPh#1?*eX*^n1tN>5en#mC; z&&>#$q2gU+*lu`{&fyuhuf0S&q=_cbXRMKLuV%Je7t1m0W$nv($U8^RGnD5U1VKwOFssZ{CTvB3Q^5o#_jfLKzUqFqe1680i~2@HLjktV)Q%@ zlwf-q1Ik=aq22Cavj)OEImSx*(*(A-Cnj}_?M$WkoM$guC#Hz2Js#SKXc=tbUj?h= zbQp}IpBu2HgJ|D0<3vWEi{jxRBV6LCsHpePnJvh6UaxR@0*QtG%koxi_p8vsWD77A z9ma8~;+bH!F~Jod&=58Zbay>)2%z%-tdvcQ<%+{!Y6vem7KxG_oG~u zReoEvYV-1W zg8uMT1aW&vy1ow2CHWm%$+FJC4kuro|D1d-5Bapy?huzm|G&Y0m4^{;fbk%{e;*p< ze2`g?+vBQ=AQlq$L!H5n{cL$3gv@ev&S8J|p-n)Kly{*&j^)4lF73<7v%ByAPab#9 z?EhWz-28w>S#sq`$!Zq$A^ixL{_;bPcm~AR%s>Ajg(0<{RsWc-^$N#@kLjyk;pq4Y z><%FgmD!h{&@#B6FN=15BIM=HCy0*}v#0^!Xs;FxwTBxV{T1slKnPgs0MT;P0HN}s zMRl2}$nFiGWf7VyGmwT>oaNDULVm(q27C2m^MOKooWxwNk`x!O3_&j%BhF=C4m4ya zfn6GCD99&Rmq8f2h>aXXBmS492}^e>=7|42q5Abx#G4CQz0YW3wPJZ@u3JS?iV^2K zaaPzuCwQ!{P-?-2`6EB0pAl##%V65fZzu2Q*~Iz2?tRL?KbY^`NJC1863b!R(?On} z*oAaD3k)(c1C{Go)gkl(8$Fr^B5YJ4lh*aJNvBNOz`LunOxoGYG=HKFh}oZo?YKjh zV45CTG^$dr-)?}EaNn(bY8I_4J2l0{F_c#R=k{%f(kLH}E6?}s5NBC9Ltn8p^ahZb zLxpv)dnm#U#jMOQiZ5HU2E%Bw&sH76w`$pM7E6;&77U}&7GtYs`-chD{o62%=jFH3 zd~=rl=CX({1iwA=1?>&oZ5~JWvLV^DI}S+BWYb13JfI^3on>{6{J_5Ht?=JBad>5< zZ+PUn|8ThQ>)7TAv^+aDoJPlF&yf3}zBvc*JZv*w&=2AtHo&1msw0OvM_^LNSjGst z%Ce3N8bU#=)>Soxbr?za{ePO!QEcZJS{n2PwHsMW>j?gTkLvlLI%2f=NWpko>Hmb{ z-6w!}g5nJ<2C?(;C)b-3WJ=8c&R6U&ediM~uAHxd1rysC=6X|P^_~c0lnP;-% zNpv4BUo(0bm+?7tH7>0t)9#i+<7Dj0e4MQ9WsMggl%2yyE`T!4Vc#r(`=7&3E}&si zRwE}$b$j07R6Xx-vi(!&N_;{jYbxCf*e_0_191quXButd9inh9?GR;01b#1PPaYBF zZw(+?iHv)*dl%l=VEO6OX(F+Fxmxmj{>mBjX+m#ivfDEeUCd!CmeF#o<1A{ce&)1L zl$GHou9JxcdfFZY%C2+BI{h$@eKCtJ=TPd;2397roY^>5kig1eFY{(rt=7k7f6t~v zv6{3wz{W(jXAbT0j{_Rpm}kJQU(rZox?{egw&1_HpULxa;f+pY^S`35>JvE@;7%hE z+XRIp=Nt``UJxrA&QHzf$_XuG*S`*pPwgV20@NHne5^`7z;TpWIpYR%X{-_SUG);ICp}Z%Rl>u z%(jVa%6!`1OT&M|Ca#c2@kZHPy3)FbV}LfN%~`)ZT9sYTrL%0A;w5(cg~C~sjbDM> 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 z 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 M^A+F!9=q@V0?!TLZvX%Q delta 174903 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%0D`3F*tW*Ad)}jV~`oXsDTTe)X8o1ATjTW9SKIZG? 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 diff --git a/plugins/official/regex-tester/dist/plugin.wasm.sources b/plugins/official/regex-tester/dist/plugin.wasm.sources index b9543105..013089c4 100644 --- a/plugins/official/regex-tester/dist/plugin.wasm.sources +++ b/plugins/official/regex-tester/dist/plugin.wasm.sources @@ -1 +1 @@ -d2e35f3e4ee6b699899ea43fdf96d5ec99f0730c502f94fd6f3246e605be99a7 +227c8150c6ad7a5a20236764f149c876cbbc3b082763bf2e7fc05de99726b740 diff --git a/plugins/official/regex-tester/plugin.toml b/plugins/official/regex-tester/plugin.toml index a889b96a..22e45435 100644 --- a/plugins/official/regex-tester/plugin.toml +++ b/plugins/official/regex-tester/plugin.toml @@ -5,6 +5,7 @@ description = "Try a regular expression against sample text: matches highlighted authors = ["OpenIDEA contributors"] license = "Apache-2.0" change-notes = "0.1.0 — first release: live matching with flags, capture groups, replacement preview, the editor's selection as test text." +categories = ["tools"] engines.openidea = "^1.0" wasm = "dist/plugin.wasm" activation = ["on-view:regex", "on-command:*"] diff --git a/plugins/official/solidity/dist/plugin.wasm b/plugins/official/solidity/dist/plugin.wasm index 3cb17fd7ce387e314537ba999335fee7cb97f89d..4fd185f6a667245d3da51a89a8c77d06f265dc63 100644 GIT binary patch delta 12185 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 Ir0-Mz4_?`BB>(^b delta 12288 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 diff --git a/plugins/official/string-tools/dist/plugin.wasm.sources b/plugins/official/string-tools/dist/plugin.wasm.sources index 2dbf488f..7c78b969 100644 --- a/plugins/official/string-tools/dist/plugin.wasm.sources +++ b/plugins/official/string-tools/dist/plugin.wasm.sources @@ -1 +1 @@ -a88c39d5782369329efa55b12330daa906e5c8d91252bd57c7343648840bac79 +09cc92e8e731f8f59f3857a71f9a30cc3d9e04a1c32092920f573b0f26592855 diff --git a/plugins/official/string-tools/plugin.toml b/plugins/official/string-tools/plugin.toml index 18ff2bb5..9ff53b75 100644 --- a/plugins/official/string-tools/plugin.toml +++ b/plugins/official/string-tools/plugin.toml @@ -5,6 +5,7 @@ description = "Case conversion (camelCase, snake_case, kebab-case…), encoding authors = ["OpenIDEA contributors"] license = "Apache-2.0" change-notes = "0.1.0 — first release: 26 commands in four groups." +categories = ["tools"] engines.openidea = "^1.0" wasm = "dist/plugin.wasm" # The commands are declared below, so Find Action and the keymap list them diff --git a/src/bindings.ts b/src/bindings.ts index c78b7e45..324f2122 100644 --- a/src/bindings.ts +++ b/src/bindings.ts @@ -2239,6 +2239,11 @@ export type Consent = { * ones are implied by consenting at all. */ optional: string[], + /** + * The user accepted a package signed by another key than the installed + * copy ([`InstallPreview::signer_changed`]). + */ + signerChange?: boolean, }; /** Build, Execution, Deployment › Console. */ @@ -4139,6 +4144,14 @@ export type IndexEntry = { /** [`package_digest`] of its contents. */ digest: string, capabilities?: string[], + /** + * The plugin API versions it loads in (a semver requirement): its + * manifest's `engines.openidea` and the API its component was built for. + * Required: an entry without one is offered to no IDE. + */ + engine?: string, + /** Marketplace categories (`CATEGORIES`); an IDE ignores those it doesn't know. */ + categories?: string[], }; export type IndexStatus = { @@ -4296,6 +4309,18 @@ export type InstallPreview = { unsigned: boolean, /** The verified publisher. */ publisher: string | null, + /** + * Replaces an installed copy signed with another key, which didn't + * endorse this package's (or this one is unsigned): the user confirms it + * ([`Consent::signer_change`]). + */ + signerChanged: boolean, + /** + * Something to confirm: a first install, an unsigned package, another + * signer, or capabilities the installed version wasn't granted or + * refused. Without, an update installs with the grants it has. + */ + needsConsent: boolean, }; /** A theme of a plugin installed in a JetBrains IDE. */ @@ -4871,6 +4896,8 @@ export type MarkdownSettings = { export type MarketPlugin = { /** Installed version, if any. */ installed: string | null, + /** Whether this IDE can load `entry` (the newest version it can, else the newest). */ + compatible: boolean, } & IndexEntry; export type Markup = { @@ -5244,7 +5271,12 @@ export type PluginEditor = { /** Backend → UI notifications (Tauri event `ide://plugin`). */ export type PluginEvent = /** Plugins, their status or their contributions changed: re-fetch `plugin_list`. */ -{ type: "commandsChanged" } | { type: "notification"; pluginId: string; level: NotificationLevel; title: string; body: string } | +{ type: "commandsChanged" } | +/** + * The marketplace offers newer versions of installed plugins (announced + * once per set of versions). + */ +{ type: "updatesAvailable"; updates: PluginUpdate[] } | { type: "notification"; pluginId: string; level: NotificationLevel; title: string; body: string } | /** A plugin's status bar item was set (`item`) or removed. */ { type: "statusItemChanged"; pluginId: string; id: string; item: StatusItem | null } | /** A plugin began a task: show it with the background tasks. */ @@ -5353,6 +5385,13 @@ export type PluginStatusItem = { item: StatusItem, }; +/** A newer version of an installed plugin in the marketplace. */ +export type PluginUpdate = { + id: string, + name: string, + version: string, +}; + export type PluginsSnapshot = { plugins: PluginInfo[], activeTheme: ActiveTheme | null, diff --git a/src/features/plugins/PluginsPage.module.css b/src/features/plugins/PluginsPage.module.css index 1f4b0e8d..a2764a19 100644 --- a/src/features/plugins/PluginsPage.module.css +++ b/src/features/plugins/PluginsPage.module.css @@ -380,6 +380,14 @@ min-width: 0; } +.categorySelect { + width: 100%; +} + +.detailsNotice { + margin: 0 0 12px; +} + .marketOverview { padding: 12px 16px; overflow: auto; diff --git a/src/features/plugins/PluginsPage.tsx b/src/features/plugins/PluginsPage.tsx index 33a2065a..3f8da6c6 100644 --- a/src/features/plugins/PluginsPage.tsx +++ b/src/features/plugins/PluginsPage.tsx @@ -18,6 +18,7 @@ import { IconButton, Input, SearchField, + Select, Spinner, Tabs, showContextMenu, @@ -28,6 +29,7 @@ import { RISK_LABEL, sortByRisk } from "./consent"; import { itemsOf, uiPoint } from "./projection"; import { compareVersions, + isUpdate, grantPlugin, installFromDisk, installFromMarket, @@ -41,6 +43,7 @@ import { setPluginCapability, setPluginEnabled, uninstallPlugin, + updateAllPlugins, usePlugins, } from "./store"; import { useProject } from "@/platform/project"; @@ -536,9 +539,15 @@ interface GearActions { importInstalledIntellij: () => void; } -function gearMenu(plugins: readonly PluginInfo[], actions: GearActions): MenuItem[] { +function gearMenu(plugins: readonly PluginInfo[], updates: number, actions: GearActions): MenuItem[] { const installed = plugins.filter((p) => p.source === "installed"); return [ + { + label: updates > 0 ? tx`Update All Plugins (${updates})` : "Update All Plugins", + disabled: updates === 0, + run: () => void updateAllPlugins(), + }, + { kind: "separator" }, { label: "Install Plugin from Disk…", icon: "package", run: () => actions.install(false) }, { label: "Install Plugin from Package File…", run: () => actions.install(true) }, ...(actions.canImport @@ -572,6 +581,79 @@ function gearMenu(plugins: readonly PluginInfo[], actions: GearActions): MenuIte ]; } +const CATEGORIES = [ + "languages", + "themes", + "icon-themes", + "linters", + "vcs", + "ai", + "frameworks", + "tools", + "other", +] as const; +type Category = (typeof CATEGORIES)[number]; + +function categoryLabel(c: Category): string { + switch (c) { + case "languages": + return tx("Languages"); + case "themes": + return tx("Themes"); + case "icon-themes": + return tx("Icon Themes"); + case "linters": + return tx("Linters & Formatters"); + case "vcs": + return tx("Version Control"); + case "ai": + return tx("AI"); + case "frameworks": + return tx("Frameworks"); + case "tools": + return tx("Tools"); + case "other": + return tx("Other"); + } +} + +/** A marketplace plugin's categories this IDE knows; `other` without any. */ +function categoriesOf(m: MarketPlugin): Category[] { + const known = CATEGORIES.filter((c) => m.categories?.includes(c)); + return known.length > 0 ? known : ["other"]; +} + +/** Filters the marketplace by category; lists the categories that have plugins. */ +function CategoryFilter({ + market, + value, + onChange, +}: { + market: readonly MarketPlugin[]; + value: Category | "all"; + onChange: (value: Category | "all") => void; +}) { + const counts = new Map(); + for (const m of market) for (const c of categoriesOf(m)) counts.set(c, (counts.get(c) ?? 0) + 1); + const options = [ + { value: "all" as const, label: tx("All Categories"), detail: String(market.length) }, + ...CATEGORIES.filter((c) => counts.has(c)).map((c) => ({ + value: c, + label: categoryLabel(c), + detail: String(counts.get(c)), + })), + ]; + return ( +