From 686e080e0ce8be7f526a3f3eba74f2ba2b943f24 Mon Sep 17 00:00:00 2001 From: spacewander Date: Wed, 13 Jan 2021 19:43:55 +0800 Subject: [PATCH 1/2] fix: always inject disable field into plugin schema Fix https://github.com/apache/apisix-dashboard/issues/1227 Signed-off-by: spacewander --- apisix/plugin.lua | 25 ++++++++++++++++++++----- apisix/schema_def.lua | 7 +++++-- t/control/schema.t | 16 +++++++++++++--- 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/apisix/plugin.lua b/apisix/plugin.lua index 18954f47e1d4..fc24778127a8 100644 --- a/apisix/plugin.lua +++ b/apisix/plugin.lua @@ -102,12 +102,27 @@ local function load_plugin(name, plugins_list, is_stream_plugin) return end - if plugin.schema and plugin.schema.type == "object" then - if not plugin.schema.properties or - core.table.nkeys(plugin.schema.properties) == 0 - then - plugin.schema.properties = core.schema.plugin_disable_schema + if type(plugin.schema) ~= "table" then + core.log.error("invalid plugin [", name, "] schema field") + return + end + + if not plugin.schema.properties then + plugin.schema.properties = {} + end + + local properties = plugin.schema.properties + local plugin_injected_schema = core.schema.plugin_injected_schema + + if properties['$comment'] ~= plugin_injected_schema['$comment'] then + if properties.disable then + core.log.error("invalid plugin [", name, + "]: found forbidden 'disable' field in the schema") + return end + + properties.disable = plugin_injected_schema.disable + properties['$comment'] = plugin_injected_schema['$comment'] end plugin.name = name diff --git a/apisix/schema_def.lua b/apisix/schema_def.lua index daa4acea4fa8..7d9cf49a97c9 100644 --- a/apisix/schema_def.lua +++ b/apisix/schema_def.lua @@ -739,8 +739,11 @@ _M.plugins = { _M.id_schema = id_schema -_M.plugin_disable_schema = { - disable = {type = "boolean"} +_M.plugin_injected_schema = { + ["$comment"] = "this is a mark for our injected plugin schema", + disable = { + type = "boolean", + } } diff --git a/t/control/schema.t b/t/control/schema.t index c1197cfc1d2d..ac0c124e70f3 100644 --- a/t/control/schema.t +++ b/t/control/schema.t @@ -60,16 +60,26 @@ __DATA__ "upstream": {"type":"object"}, "upstream_hash_header_schema": {"type":"string"}, "upstream_hash_vars_schema": {"type":"string"}, - }, + },]] .. [[ "plugins": { "example-plugin": { "version": 0.1, "priority": 0, - "schema": {"type":"object"}, + "schema": { + "type":"object", + "properties": { + "disable": {"type": "boolean"} + } + }, "metadata_schema": {"type":"object"} }, "mqtt-proxy": { - "schema": {"type":"object"}, + "schema": { + "type":"object", + "properties": { + "disable": {"type": "boolean"} + } + }, "priority": 1000 }, "basic-auth": { From 42c96ba3e8039e0a1e15e5c28d850aa6997a4d1e Mon Sep 17 00:00:00 2001 From: spacewander Date: Wed, 13 Jan 2021 21:00:06 +0800 Subject: [PATCH 2/2] fix test Signed-off-by: spacewander --- apisix/plugins/error-log-logger.lua | 4 ++++ t/admin/plugins.t | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/apisix/plugins/error-log-logger.lua b/apisix/plugins/error-log-logger.lua index 528b12a2b334..af5f96948d5f 100644 --- a/apisix/plugins/error-log-logger.lua +++ b/apisix/plugins/error-log-logger.lua @@ -53,6 +53,9 @@ local metadata_schema = { }, required = {"host", "port"} } +local schema = { + type = "object", +} local log_level = { @@ -77,6 +80,7 @@ local _M = { version = 0.1, priority = 1091, name = plugin_name, + schema = schema, metadata_schema = metadata_schema, } diff --git a/t/admin/plugins.t b/t/admin/plugins.t index 9bb92020e04f..eedee616922e 100644 --- a/t/admin/plugins.t +++ b/t/admin/plugins.t @@ -191,7 +191,7 @@ plugins: } } --- response_body eval -qr/\{"metadata_schema":\{"additionalProperties":false,"properties":\{"ikey":\{"minimum":0,"type":"number"\},"skey":\{"type":"string"\}\},"required":\["ikey","skey"\],"type":"object"\},"priority":0,"schema":\{"properties":\{"i":\{"minimum":0,"type":"number"\},"ip":\{"type":"string"\},"port":\{"type":"integer"\},"s":\{"type":"string"\},"t":\{"minItems":1,"type":"array"\}\},"required":\["i"\],"type":"object"\},"version":0.1\}/ +qr/\{"metadata_schema":\{"additionalProperties":false,"properties":\{"ikey":\{"minimum":0,"type":"number"\},"skey":\{"type":"string"\}\},"required":\["ikey","skey"\],"type":"object"\},"priority":0,"schema":\{"properties":\{"\$comment":"this is a mark for our injected plugin schema","disable":\{"type":"boolean"\},"i":\{"minimum":0,"type":"number"\},"ip":\{"type":"string"\},"port":\{"type":"integer"\},"s":\{"type":"string"\},"t":\{"minItems":1,"type":"array"\}\},"required":\["i"\],"type":"object"\},"version":0.1\}/ --- no_error_log [error]