tonhowtf/omniget · error
plugin id must not be empty
Error message
plugin id must not be empty
What it means
`validate_plugin_id` (public in plugin_loader, called by plugin_dir) first rejects an empty id: an empty string cannot form a valid plugin directory name and would resolve to the parent path. It bails via anyhow.
Solutions
- Provide a valid non-empty plugin id matching the known set (courses, study, telegram, convert, misc or other allowlist-compliant ids)
- Validate the id before calling plugin_dir/validate_plugin_id
- Fix the manifest so `id` is always present
Example fix
// before
let dir = plugin_dir("")?;
// after
ensure!(!id.is_empty(), "plugin id required");
let dir = plugin_dir(&id)?; Defensive patterns
Strategy: validation
Validate before calling
ensure!(!plugin_id.is_empty(), "plugin id required"); plugin_dir(&plugin_id)?;
Type guard
fn non_empty(s: &str) -> bool { !s.is_empty() } Try / catch
let dir = plugin_dir(&id).with_context(|| format!("resolving plugin dir for {id:?}"))?; Prevention
- Make `id` a required manifest field
- Validate ids at the API/CLI boundary
- Avoid String::new() defaults for ids
When it happens
Trigger: Calling plugin_dir or validate_plugin_id with "" — e.g. a missing manifest `id` field, an empty query param, or a String::new() default reaching the loader.
Common situations: Corrupted or hand-edited plugin manifest lacking id; API route with blank id segment; deserialized struct defaulted to empty string.
Understand the failure class
Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.
Related errors
- external_data_cache: plugin_id must not be empty
- external_data_cache: namespace must not be empty
- plugin id contains an illegal character
- external_data_cache: plugin_id/namespace must not contain…
- plugin id must not be a relative path component
AI-assisted analysis of tonhowtf/omniget@8600b91f42 (2026-09-12).
Data as JSON: /api/errors/e9f9c2f3e186087e.
Report an issue: GitHub.
Appendix: source
Thrown at src-tauri/src/plugin_loader.rs:233
/// — registro remoto -> `installed.json` -> frontend -> comando Tauri — e
/// nenhum ponto dessa cadeia o sanitizava, entao um id com `..` escapava do
/// diretorio de plugins e o `remove_dir_all` do `unregister` apagava
/// caminho arbitrario.
pub fn plugin_dir(&self, plugin_id: &str) -> anyhow::Result<PathBuf> {
validate_plugin_id(plugin_id)?;
Ok(self.plugins_dir.join(plugin_id))
}
}
/// Aceita apenas `[A-Za-z0-9._-]`, recusando separador de caminho, byte nulo,
/// componente relativo e id vazio.
///
/// Allowlist e nao blocklist de proposito: o conjunto de ids reais e pequeno e
/// conhecido (`courses`, `study`, `telegram`, `convert`, `misc`), e uma
/// blocklist erra por omissao a cada codificacao nova.
pub fn validate_plugin_id(plugin_id: &str) -> anyhow::Result<()> {
if plugin_id.is_empty() {
anyhow::bail!("plugin id must not be empty");
}
if plugin_id == "." || plugin_id == ".." || plugin_id.starts_with('.') {
anyhow::bail!("plugin id must not be a relative path component: {plugin_id:?}");
}
if let Some(bad) = plugin_id
.chars()
.find(|c| !c.is_ascii_alphanumeric() && !matches!(c, '.' | '_' | '-'))
{
anyhow::bail!("plugin id contains an illegal character {bad:?}: {plugin_id:?}");
}
if plugin_id.contains("..") {
anyhow::bail!("plugin id must not contain '..': {plugin_id:?}");
}
Ok(())
}
fn load_single_plugin(
plugin_dir: &Path,View on GitHub (pinned to 8600b91f42)