gotify/server · error

plugin does not support %s

Error message

plugin does not support %s

What it means

supportOrAbort checks whether a plugin instance implements a required capability (compat.Capability) via compat.HasSupport. If the plugin lacks the module, the handler writes a 400 response with "plugin does not support <capability>" and aborts the request chain. It is a guard used by API handlers that delegate functionality to a pluggable backend.

Source

Thrown at api/plugin.go:415

		}
		if err := instance.ValidateAndSetConfig(newConf); err != nil {
			ctx.AbortWithError(400, err)
			return
		}
		conf.Config = newconfBytes
		successOrAbort(ctx, 500, c.DB.UpdatePluginConf(conf))
	})
}

func isPluginOwner(ctx *gin.Context, conf *model.PluginConf) bool {
	return conf.UserID == auth.GetUserID(ctx)
}

func supportOrAbort(ctx *gin.Context, instance compat.PluginInstance, module compat.Capability) (aborted bool) {
	if compat.HasSupport(instance, module) {
		return false
	}
	ctx.AbortWithError(400, fmt.Errorf("plugin does not support %s", module))
	return true
}

View on GitHub (pinned to 14bfc25627)

Solutions

  1. Use or configure a plugin instance that implements the required capability (verify with compat.HasSupport).
  2. Check the plugin configuration so the endpoint resolves to the correct instance with the module enabled.
  3. Upgrade or rebuild the plugin to a version that supports the missing module.
  4. If the endpoint is not needed, stop calling it or guard the client code against 400 responses carrying this message.

Example fix

// before: calling endpoint backed by a plugin without the module
client.Storage.Download(ctx, file) // -> 400 plugin does not support storage
// after: pick an instance that supports the capability
if !compat.HasSupport(instance, module) {
    instance = loadInstanceWithModule(module)
}
Defensive patterns

Strategy: validation

Validate before calling

if !compat.HasSupport(instance, module) {
    // skip the call or choose another instance
    return
}

Type guard

func supportsModule(instance compat.PluginInstance, module compat.Capability) bool {
    return compat.HasSupport(instance, module)
}

Prevention

When it happens

Trigger: Calling any API handler that routes through supportOrAbort when the configured plugin instance does not implement the requested capability module (e.g. an auth or storage plugin lacking the module the endpoint requires).

Common situations: Deploying with a minimal or legacy plugin build that omits a capability; misconfiguring the plugin so a different instance (without the module) is selected; upgrading Gitea/woodpecker-style plugin interfaces and forgetting to enable a module.

Related errors


AI-assisted analysis of gotify/server@14bfc25627 (2026-09-05). Data as JSON: /api/errors/003e9631d39542c3. Report an issue: GitHub.