Confirm side-loaded plugin installs

This commit is contained in:
2026-05-07 23:46:16 -04:00
parent e30d14728b
commit aca38c20f8
2 changed files with 16 additions and 6 deletions
@@ -146,7 +146,7 @@ fn render_plugin_install_confirmation(
.text_xs() .text_xs()
.truncate() .truncate()
.text_color(rgb(colors::MUTED)) .text_color(rgb(colors::MUTED))
.child(high_risk_permissions_label(pending)), .child(plugin_install_confirmation_label(pending)),
), ),
) )
.child( .child(
@@ -427,12 +427,16 @@ fn plugin_audit_action_label(action: &PluginAuditAction) -> &'static str {
} }
} }
fn high_risk_permissions_label(pending: &PendingPluginInstall) -> String { fn plugin_install_confirmation_label(pending: &PendingPluginInstall) -> String {
if !pending.requires_high_risk_confirmation() {
return "Local package from disk requires confirmation.".to_string();
}
let permissions = pending let permissions = pending
.high_risk_permissions() .high_risk_permissions()
.iter() .iter()
.map(|permission| permission.as_str()) .map(|permission| permission.as_str())
.collect::<Vec<_>>() .collect::<Vec<_>>()
.join(", "); .join(", ");
format!("High risk permissions: {permissions}") format!("Local package from disk. High risk permissions: {permissions}")
} }
+9 -3
View File
@@ -34,6 +34,10 @@ impl PendingPluginInstall {
pub(super) fn high_risk_permissions(&self) -> &[PluginPermission] { pub(super) fn high_risk_permissions(&self) -> &[PluginPermission] {
&self.high_risk_permissions &self.high_risk_permissions
} }
pub(super) fn requires_high_risk_confirmation(&self) -> bool {
!self.high_risk_permissions.is_empty()
}
} }
impl PendingPluginUninstall { impl PendingPluginUninstall {
@@ -98,7 +102,8 @@ impl ElyShell {
return; return;
}; };
self.install_plugin_package(pending.package, true, cx); let high_risk_confirmed = pending.requires_high_risk_confirmation();
self.install_plugin_package(pending.package, true, high_risk_confirmed, cx);
} }
pub(super) fn cancel_plugin_install(&mut self, cx: &mut Context<Self>) { pub(super) fn cancel_plugin_install(&mut self, cx: &mut Context<Self>) {
@@ -172,7 +177,7 @@ impl ElyShell {
cx: &mut Context<Self>, cx: &mut Context<Self>,
) { ) {
match result { match result {
Ok(package) => self.install_plugin_package(package, false, cx), Ok(package) => self.install_plugin_package(package, false, false, cx),
Err(error) => { Err(error) => {
self.plugin_install_error = Some(error.to_string()); self.plugin_install_error = Some(error.to_string());
self.pending_plugin_install = None; self.pending_plugin_install = None;
@@ -184,12 +189,13 @@ impl ElyShell {
fn install_plugin_package( fn install_plugin_package(
&mut self, &mut self,
package: VerifiedPluginPackage, package: VerifiedPluginPackage,
local_package_confirmed: bool,
high_risk_confirmed: bool, high_risk_confirmed: bool,
cx: &mut Context<Self>, cx: &mut Context<Self>,
) { ) {
let high_risk_permissions = let high_risk_permissions =
package.manifest().high_risk_permissions().cloned().collect::<Vec<_>>(); package.manifest().high_risk_permissions().cloned().collect::<Vec<_>>();
if !high_risk_confirmed && !high_risk_permissions.is_empty() { if !local_package_confirmed || (!high_risk_confirmed && !high_risk_permissions.is_empty()) {
self.pending_plugin_install = self.pending_plugin_install =
Some(PendingPluginInstall::new(package, high_risk_permissions)); Some(PendingPluginInstall::new(package, high_risk_permissions));
self.plugin_install_error = None; self.plugin_install_error = None;