From d469bf6fe0cdbb15949441f05675cbbc0be97262 Mon Sep 17 00:00:00 2001 From: Thibault Charbonnier Date: Thu, 26 Mar 2015 16:33:57 -0700 Subject: [PATCH 1/2] wip --- kong-0.1.0beta-2.rockspec | 149 +++++++++--------- {src => kong}/cli/config.lua | 0 {src => kong}/cli/db.lua | 0 {src => kong}/cli/restart.lua | 0 {src => kong}/cli/start.lua | 0 {src => kong}/cli/stop.lua | 0 {src => kong}/cli/utils/start.lua | 0 {src => kong}/cli/utils/stop.lua | 0 {src => kong}/cli/utils/utils.lua | 0 {src => kong}/cli/version.lua | 0 {src => kong}/constants.lua | 0 {src => kong}/dao/cassandra/apis.lua | 0 {src => kong}/dao/cassandra/applications.lua | 0 {src => kong}/dao/cassandra/base_dao.lua | 0 {src => kong}/dao/cassandra/consumers.lua | 0 {src => kong}/dao/cassandra/factory.lua | 33 ++-- {src => kong}/dao/cassandra/metrics.lua | 0 {src => kong}/dao/cassandra/plugins.lua | 0 {src => kong}/dao/error.lua | 0 {src => kong}/dao/schemas.lua | 0 {src => kong}/kong.lua | 0 {src => kong}/plugins/base_plugin.lua | 0 {src => kong}/plugins/basicauth/access.lua | 0 {src => kong}/plugins/basicauth/handler.lua | 0 {src => kong}/plugins/basicauth/schema.lua | 0 {src => kong}/plugins/filelog/handler.lua | 0 {src => kong}/plugins/filelog/log.lua | 0 {src => kong}/plugins/filelog/schema.lua | 0 .../plugins/keyauth}/access.lua | 93 +++++++---- kong/plugins/keyauth/dao/cassandra.lua | 49 ++++++ .../plugins/keyauth}/handler.lua | 0 .../plugins/keyauth}/schema.lua | 0 {src => kong}/plugins/ratelimiting/access.lua | 0 .../plugins/ratelimiting/handler.lua | 0 {src => kong}/plugins/ratelimiting/schema.lua | 0 {src => kong}/plugins/tcplog/handler.lua | 0 {src => kong}/plugins/tcplog/log.lua | 0 {src => kong}/plugins/tcplog/schema.lua | 0 {src => kong}/plugins/udplog/handler.lua | 0 {src => kong}/plugins/udplog/log.lua | 0 {src => kong}/plugins/udplog/schema.lua | 0 {src => kong}/resolver/access.lua | 0 {src => kong}/resolver/handler.lua | 0 {src => kong}/resolver/header_filter.lua | 0 {src => kong}/tools/cache.lua | 0 {src => kong}/tools/faker.lua | 0 {src => kong}/tools/http_client.lua | 0 {src => kong}/tools/io.lua | 6 +- {src => kong}/tools/migrations.lua | 0 {src => kong}/tools/timestamp.lua | 0 {src => kong}/tools/utils.lua | 0 {src => kong}/vendor/classic.lua | 0 {src => kong}/vendor/lapp.lua | 0 {src => kong}/web/admin/index.html | 0 {src => kong}/web/app.lua | 0 {src => kong}/web/routes/apis.lua | 0 {src => kong}/web/routes/applications.lua | 0 {src => kong}/web/routes/base_controller.lua | 0 {src => kong}/web/routes/consumers.lua | 0 {src => kong}/web/routes/plugins.lua | 0 {src => kong}/web/static/favicon.ico | Bin spec/unit/dao/cassandra_spec.lua | 4 +- src/plugins/headerauth/access.lua | 74 --------- src/plugins/headerauth/handler.lua | 19 --- src/plugins/headerauth/schema.lua | 4 - 65 files changed, 209 insertions(+), 222 deletions(-) rename {src => kong}/cli/config.lua (100%) rename {src => kong}/cli/db.lua (100%) rename {src => kong}/cli/restart.lua (100%) rename {src => kong}/cli/start.lua (100%) rename {src => kong}/cli/stop.lua (100%) rename {src => kong}/cli/utils/start.lua (100%) rename {src => kong}/cli/utils/stop.lua (100%) rename {src => kong}/cli/utils/utils.lua (100%) rename {src => kong}/cli/version.lua (100%) rename {src => kong}/constants.lua (100%) rename {src => kong}/dao/cassandra/apis.lua (100%) rename {src => kong}/dao/cassandra/applications.lua (100%) rename {src => kong}/dao/cassandra/base_dao.lua (100%) rename {src => kong}/dao/cassandra/consumers.lua (100%) rename {src => kong}/dao/cassandra/factory.lua (89%) rename {src => kong}/dao/cassandra/metrics.lua (100%) rename {src => kong}/dao/cassandra/plugins.lua (100%) rename {src => kong}/dao/error.lua (100%) rename {src => kong}/dao/schemas.lua (100%) rename {src => kong}/kong.lua (100%) rename {src => kong}/plugins/base_plugin.lua (100%) rename {src => kong}/plugins/basicauth/access.lua (100%) rename {src => kong}/plugins/basicauth/handler.lua (100%) rename {src => kong}/plugins/basicauth/schema.lua (100%) rename {src => kong}/plugins/filelog/handler.lua (100%) rename {src => kong}/plugins/filelog/log.lua (100%) rename {src => kong}/plugins/filelog/schema.lua (100%) rename {src/plugins/queryauth => kong/plugins/keyauth}/access.lua (58%) create mode 100644 kong/plugins/keyauth/dao/cassandra.lua rename {src/plugins/queryauth => kong/plugins/keyauth}/handler.lua (100%) rename {src/plugins/queryauth => kong/plugins/keyauth}/schema.lua (100%) rename {src => kong}/plugins/ratelimiting/access.lua (100%) rename {src => kong}/plugins/ratelimiting/handler.lua (100%) rename {src => kong}/plugins/ratelimiting/schema.lua (100%) rename {src => kong}/plugins/tcplog/handler.lua (100%) rename {src => kong}/plugins/tcplog/log.lua (100%) rename {src => kong}/plugins/tcplog/schema.lua (100%) rename {src => kong}/plugins/udplog/handler.lua (100%) rename {src => kong}/plugins/udplog/log.lua (100%) rename {src => kong}/plugins/udplog/schema.lua (100%) rename {src => kong}/resolver/access.lua (100%) rename {src => kong}/resolver/handler.lua (100%) rename {src => kong}/resolver/header_filter.lua (100%) rename {src => kong}/tools/cache.lua (100%) rename {src => kong}/tools/faker.lua (100%) rename {src => kong}/tools/http_client.lua (100%) rename {src => kong}/tools/io.lua (90%) rename {src => kong}/tools/migrations.lua (100%) rename {src => kong}/tools/timestamp.lua (100%) rename {src => kong}/tools/utils.lua (100%) rename {src => kong}/vendor/classic.lua (100%) rename {src => kong}/vendor/lapp.lua (100%) rename {src => kong}/web/admin/index.html (100%) rename {src => kong}/web/app.lua (100%) rename {src => kong}/web/routes/apis.lua (100%) rename {src => kong}/web/routes/applications.lua (100%) rename {src => kong}/web/routes/base_controller.lua (100%) rename {src => kong}/web/routes/consumers.lua (100%) rename {src => kong}/web/routes/plugins.lua (100%) rename {src => kong}/web/static/favicon.ico (100%) delete mode 100644 src/plugins/headerauth/access.lua delete mode 100644 src/plugins/headerauth/handler.lua delete mode 100644 src/plugins/headerauth/schema.lua diff --git a/kong-0.1.0beta-2.rockspec b/kong-0.1.0beta-2.rockspec index d95542ce79a..83cdf66dd11 100644 --- a/kong-0.1.0beta-2.rockspec +++ b/kong-0.1.0beta-2.rockspec @@ -31,85 +31,82 @@ dependencies = { build = { type = "builtin", modules = { - ["kong"] = "src/kong.lua", - - ["classic"] = "src/vendor/classic.lua", - ["lapp"] = "src/vendor/lapp.lua", - - ["kong.constants"] = "src/constants.lua", - - ["kong.cli.utils"] = "src/cli/utils/utils.lua", - ["kong.cli.utils.start"] = "src/cli/utils/start.lua", - ["kong.cli.utils.stop"] = "src/cli/utils/stop.lua", - ["kong.cli.db"] = "src/cli/db.lua", - ["kong.cli.config"] = "src/cli/config.lua", - ["kong.cli.stop"] = "src/cli/stop.lua", - ["kong.cli.start"] = "src/cli/start.lua", - ["kong.cli.restart"] = "src/cli/restart.lua", - ["kong.cli.version"] = "src/cli/version.lua", - - ["kong.tools.utils"] = "src/tools/utils.lua", - ["kong.tools.io"] = "src/tools/io.lua", - ["kong.tools.migrations"] = "src/tools/migrations.lua", - ["kong.tools.faker"] = "src/tools/faker.lua", - ["kong.tools.cache"] = "src/tools/cache.lua", - ["kong.tools.timestamp"] = "src/tools/timestamp.lua", - ["kong.tools.http_client"] = "src/tools/http_client.lua", - - ["kong.resolver.handler"] = "src/resolver/handler.lua", - ["kong.resolver.access"] = "src/resolver/access.lua", - ["kong.resolver.header_filter"] = "src/resolver/header_filter.lua", - - ["kong.dao.error"] = "src/dao/error.lua", - ["kong.dao.schemas"] = "src/dao/schemas.lua", - ["kong.dao.cassandra.factory"] = "src/dao/cassandra/factory.lua", - ["kong.dao.cassandra.base_dao"] = "src/dao/cassandra/base_dao.lua", - ["kong.dao.cassandra.apis"] = "src/dao/cassandra/apis.lua", - ["kong.dao.cassandra.metrics"] = "src/dao/cassandra/metrics.lua", - ["kong.dao.cassandra.plugins"] = "src/dao/cassandra/plugins.lua", - ["kong.dao.cassandra.consumers"] = "src/dao/cassandra/consumers.lua", - ["kong.dao.cassandra.applications"] = "src/dao/cassandra/applications.lua", - - ["kong.plugins.base_plugin"] = "src/plugins/base_plugin.lua", - - ["kong.plugins.basicauth.handler"] = "src/plugins/basicauth/handler.lua", - ["kong.plugins.basicauth.access"] = "src/plugins/basicauth/access.lua", - ["kong.plugins.basicauth.schema"] = "src/plugins/basicauth/schema.lua", - - ["kong.plugins.queryauth.handler"] = "src/plugins/queryauth/handler.lua", - ["kong.plugins.queryauth.access"] = "src/plugins/queryauth/access.lua", - ["kong.plugins.queryauth.schema"] = "src/plugins/queryauth/schema.lua", - - ["kong.plugins.headerauth.handler"] = "src/plugins/headerauth/handler.lua", - ["kong.plugins.headerauth.access"] = "src/plugins/headerauth/access.lua", - ["kong.plugins.headerauth.schema"] = "src/plugins/headerauth/schema.lua", - - ["kong.plugins.tcplog.handler"] = "src/plugins/tcplog/handler.lua", - ["kong.plugins.tcplog.log"] = "src/plugins/tcplog/log.lua", - ["kong.plugins.tcplog.schema"] = "src/plugins/tcplog/schema.lua", - - ["kong.plugins.udplog.handler"] = "src/plugins/udplog/handler.lua", - ["kong.plugins.udplog.log"] = "src/plugins/udplog/log.lua", - ["kong.plugins.udplog.schema"] = "src/plugins/udplog/schema.lua", - - ["kong.plugins.filelog.handler"] = "src/plugins/filelog/handler.lua", - ["kong.plugins.filelog.log"] = "src/plugins/filelog/log.lua", - ["kong.plugins.filelog.schema"] = "src/plugins/filelog/schema.lua", - - ["kong.plugins.ratelimiting.handler"] = "src/plugins/ratelimiting/handler.lua", - ["kong.plugins.ratelimiting.access"] = "src/plugins/ratelimiting/access.lua", - ["kong.plugins.ratelimiting.schema"] = "src/plugins/ratelimiting/schema.lua", - - ["kong.web.app"] = "src/web/app.lua", - ["kong.web.routes.apis"] = "src/web/routes/apis.lua", - ["kong.web.routes.consumers"] = "src/web/routes/consumers.lua", - ["kong.web.routes.applications"] = "src/web/routes/applications.lua", - ["kong.web.routes.plugins"] = "src/web/routes/plugins.lua", - ["kong.web.routes.base_controller"] = "src/web/routes/base_controller.lua" + ["kong"] = "kong/kong.lua", + + ["classic"] = "kong/vendor/classic.lua", + ["lapp"] = "kong/vendor/lapp.lua", + + ["kong.constants"] = "kong/constants.lua", + + ["kong.cli.utils"] = "kong/cli/utils/utils.lua", + ["kong.cli.utils.start"] = "kong/cli/utils/start.lua", + ["kong.cli.utils.stop"] = "kong/cli/utils/stop.lua", + ["kong.cli.db"] = "kong/cli/db.lua", + ["kong.cli.config"] = "kong/cli/config.lua", + ["kong.cli.stop"] = "kong/cli/stop.lua", + ["kong.cli.start"] = "kong/cli/start.lua", + ["kong.cli.restart"] = "kong/cli/restart.lua", + ["kong.cli.version"] = "kong/cli/version.lua", + + ["kong.tools.utils"] = "kong/tools/utils.lua", + ["kong.tools.io"] = "kong/tools/io.lua", + ["kong.tools.migrations"] = "kong/tools/migrations.lua", + ["kong.tools.faker"] = "kong/tools/faker.lua", + ["kong.tools.cache"] = "kong/tools/cache.lua", + ["kong.tools.timestamp"] = "kong/tools/timestamp.lua", + ["kong.tools.http_client"] = "kong/tools/http_client.lua", + + ["kong.resolver.handler"] = "kong/resolver/handler.lua", + ["kong.resolver.access"] = "kong/resolver/access.lua", + ["kong.resolver.header_filter"] = "kong/resolver/header_filter.lua", + + ["kong.dao.error"] = "kong/dao/error.lua", + ["kong.dao.schemas"] = "kong/dao/schemas.lua", + ["kong.dao.cassandra.factory"] = "kong/dao/cassandra/factory.lua", + ["kong.dao.cassandra.base_dao"] = "kong/dao/cassandra/base_dao.lua", + ["kong.dao.cassandra.apis"] = "kong/dao/cassandra/apis.lua", + ["kong.dao.cassandra.metrics"] = "kong/dao/cassandra/metrics.lua", + ["kong.dao.cassandra.plugins"] = "kong/dao/cassandra/plugins.lua", + ["kong.dao.cassandra.consumers"] = "kong/dao/cassandra/consumers.lua", + ["kong.dao.cassandra.applications"] = "kong/dao/cassandra/applications.lua", + + ["kong.plugins.base_plugin"] = "kong/plugins/base_plugin.lua", + + ["kong.plugins.basicauth.handler"] = "kong/plugins/basicauth/handler.lua", + ["kong.plugins.basicauth.access"] = "kong/plugins/basicauth/access.lua", + ["kong.plugins.basicauth.schema"] = "kong/plugins/basicauth/schema.lua", + + ["kong.plugins.keyauth.handler"] = "kong/plugins/keyauth/handler.lua", + ["kong.plugins.keyauth.access"] = "kong/plugins/keyauth/access.lua", + ["kong.plugins.keyauth.schema"] = "kong/plugins/keyauth/schema.lua", + ["kong.plugins.keyauth.dao.cassandra"] = "kong/plugins/keyauth/dao/cassandra.lua", + + ["kong.plugins.tcplog.handler"] = "kong/plugins/tcplog/handler.lua", + ["kong.plugins.tcplog.log"] = "kong/plugins/tcplog/log.lua", + ["kong.plugins.tcplog.schema"] = "kong/plugins/tcplog/schema.lua", + + ["kong.plugins.udplog.handler"] = "kong/plugins/udplog/handler.lua", + ["kong.plugins.udplog.log"] = "kong/plugins/udplog/log.lua", + ["kong.plugins.udplog.schema"] = "kong/plugins/udplog/schema.lua", + + ["kong.plugins.filelog.handler"] = "kong/plugins/filelog/handler.lua", + ["kong.plugins.filelog.log"] = "kong/plugins/filelog/log.lua", + ["kong.plugins.filelog.schema"] = "kong/plugins/filelog/schema.lua", + + ["kong.plugins.ratelimiting.handler"] = "kong/plugins/ratelimiting/handler.lua", + ["kong.plugins.ratelimiting.access"] = "kong/plugins/ratelimiting/access.lua", + ["kong.plugins.ratelimiting.schema"] = "kong/plugins/ratelimiting/schema.lua", + + ["kong.web.app"] = "kong/web/app.lua", + ["kong.web.routes.apis"] = "kong/web/routes/apis.lua", + ["kong.web.routes.consumers"] = "kong/web/routes/consumers.lua", + ["kong.web.routes.applications"] = "kong/web/routes/applications.lua", + ["kong.web.routes.plugins"] = "kong/web/routes/plugins.lua", + ["kong.web.routes.base_controller"] = "kong/web/routes/base_controller.lua" }, install = { conf = { "kong.yml" }, bin = { "bin/kong" } }, - copy_directories = { "src/web/admin/", "src/web/static/", "database/migrations/" } + copy_directories = { "kong/web/admin/", "kong/web/static/", "database/migrations/" } } diff --git a/src/cli/config.lua b/kong/cli/config.lua similarity index 100% rename from src/cli/config.lua rename to kong/cli/config.lua diff --git a/src/cli/db.lua b/kong/cli/db.lua similarity index 100% rename from src/cli/db.lua rename to kong/cli/db.lua diff --git a/src/cli/restart.lua b/kong/cli/restart.lua similarity index 100% rename from src/cli/restart.lua rename to kong/cli/restart.lua diff --git a/src/cli/start.lua b/kong/cli/start.lua similarity index 100% rename from src/cli/start.lua rename to kong/cli/start.lua diff --git a/src/cli/stop.lua b/kong/cli/stop.lua similarity index 100% rename from src/cli/stop.lua rename to kong/cli/stop.lua diff --git a/src/cli/utils/start.lua b/kong/cli/utils/start.lua similarity index 100% rename from src/cli/utils/start.lua rename to kong/cli/utils/start.lua diff --git a/src/cli/utils/stop.lua b/kong/cli/utils/stop.lua similarity index 100% rename from src/cli/utils/stop.lua rename to kong/cli/utils/stop.lua diff --git a/src/cli/utils/utils.lua b/kong/cli/utils/utils.lua similarity index 100% rename from src/cli/utils/utils.lua rename to kong/cli/utils/utils.lua diff --git a/src/cli/version.lua b/kong/cli/version.lua similarity index 100% rename from src/cli/version.lua rename to kong/cli/version.lua diff --git a/src/constants.lua b/kong/constants.lua similarity index 100% rename from src/constants.lua rename to kong/constants.lua diff --git a/src/dao/cassandra/apis.lua b/kong/dao/cassandra/apis.lua similarity index 100% rename from src/dao/cassandra/apis.lua rename to kong/dao/cassandra/apis.lua diff --git a/src/dao/cassandra/applications.lua b/kong/dao/cassandra/applications.lua similarity index 100% rename from src/dao/cassandra/applications.lua rename to kong/dao/cassandra/applications.lua diff --git a/src/dao/cassandra/base_dao.lua b/kong/dao/cassandra/base_dao.lua similarity index 100% rename from src/dao/cassandra/base_dao.lua rename to kong/dao/cassandra/base_dao.lua diff --git a/src/dao/cassandra/consumers.lua b/kong/dao/cassandra/consumers.lua similarity index 100% rename from src/dao/cassandra/consumers.lua rename to kong/dao/cassandra/consumers.lua diff --git a/src/dao/cassandra/factory.lua b/kong/dao/cassandra/factory.lua similarity index 89% rename from src/dao/cassandra/factory.lua rename to kong/dao/cassandra/factory.lua index c4c87abba1f..fd0e17860bd 100644 --- a/src/dao/cassandra/factory.lua +++ b/kong/dao/cassandra/factory.lua @@ -32,7 +32,7 @@ end -- Instanciate a Cassandra DAO. -- @param properties Cassandra properties -function CassandraFactory:new(properties) +function CassandraFactory:new(properties, plugins_available) self.type = "cassandra" self._properties = properties @@ -41,11 +41,24 @@ function CassandraFactory:new(properties) -- And it may cause errors like "host not found" for "localhost" self._properties.hosts = normalize_localhost(self._properties.hosts) - self.apis = Apis(properties) - self.metrics = Metrics(properties) - self.plugins = Plugins(properties) - self.consumers = Consumers(properties) - self.applications = Applications(properties) + -- TODO: a metatable to this could prepare all statements as soon as an entry is added + self.daos = { + apis = Apis(properties), + metrics = Metrics(properties), + plugins = Plugins(properties), + consumers = Consumers(properties), + applications = Applications(properties) + } + + for _, plugin_name in ipairs(plugins_available) do + local status, res = pcall(require, string.format("kong.plugins.%s.dao.%s", plugin_name, self.type)) + if not status then + print("No DAO for plugin: "..plugin_name..". "..res) + else + local plugin_dao = res() + table.insert(self.daos, plugin_dao(properties)) + end + end end function CassandraFactory:drop() @@ -84,12 +97,8 @@ end -- Prepare all statements of collections -- @return error if any function CassandraFactory:prepare() - for _, collection in ipairs({ self.apis, - self.metrics, - self.plugins, - self.consumers, - self.applications }) do - local status, err = pcall(function() prepare_collection(collection) end) + for _, dao in pairs(self.daos) do + local status, err = pcall(prepare_collection, dao) if not status then return err end diff --git a/src/dao/cassandra/metrics.lua b/kong/dao/cassandra/metrics.lua similarity index 100% rename from src/dao/cassandra/metrics.lua rename to kong/dao/cassandra/metrics.lua diff --git a/src/dao/cassandra/plugins.lua b/kong/dao/cassandra/plugins.lua similarity index 100% rename from src/dao/cassandra/plugins.lua rename to kong/dao/cassandra/plugins.lua diff --git a/src/dao/error.lua b/kong/dao/error.lua similarity index 100% rename from src/dao/error.lua rename to kong/dao/error.lua diff --git a/src/dao/schemas.lua b/kong/dao/schemas.lua similarity index 100% rename from src/dao/schemas.lua rename to kong/dao/schemas.lua diff --git a/src/kong.lua b/kong/kong.lua similarity index 100% rename from src/kong.lua rename to kong/kong.lua diff --git a/src/plugins/base_plugin.lua b/kong/plugins/base_plugin.lua similarity index 100% rename from src/plugins/base_plugin.lua rename to kong/plugins/base_plugin.lua diff --git a/src/plugins/basicauth/access.lua b/kong/plugins/basicauth/access.lua similarity index 100% rename from src/plugins/basicauth/access.lua rename to kong/plugins/basicauth/access.lua diff --git a/src/plugins/basicauth/handler.lua b/kong/plugins/basicauth/handler.lua similarity index 100% rename from src/plugins/basicauth/handler.lua rename to kong/plugins/basicauth/handler.lua diff --git a/src/plugins/basicauth/schema.lua b/kong/plugins/basicauth/schema.lua similarity index 100% rename from src/plugins/basicauth/schema.lua rename to kong/plugins/basicauth/schema.lua diff --git a/src/plugins/filelog/handler.lua b/kong/plugins/filelog/handler.lua similarity index 100% rename from src/plugins/filelog/handler.lua rename to kong/plugins/filelog/handler.lua diff --git a/src/plugins/filelog/log.lua b/kong/plugins/filelog/log.lua similarity index 100% rename from src/plugins/filelog/log.lua rename to kong/plugins/filelog/log.lua diff --git a/src/plugins/filelog/schema.lua b/kong/plugins/filelog/schema.lua similarity index 100% rename from src/plugins/filelog/schema.lua rename to kong/plugins/filelog/schema.lua diff --git a/src/plugins/queryauth/access.lua b/kong/plugins/keyauth/access.lua similarity index 58% rename from src/plugins/queryauth/access.lua rename to kong/plugins/keyauth/access.lua index 7bee056806d..c98123c6645 100644 --- a/src/plugins/queryauth/access.lua +++ b/kong/plugins/keyauth/access.lua @@ -65,20 +65,40 @@ end -- @param {table} conf Plugin configuration (value property) -- @return {string} public_key -- @return {string} private_key -local function retrieve_credentials(request, conf) - local public_key +local retrieve_credentials = { + [constants.AUTHENTICATION.HEADER] = function(request, conf) + local public_key + local headers = request.get_headers() + + if conf.authentication_key_names then + for _,key_name in ipairs(conf.authentication_key_names) do + if headers[key_name] ~= nil then + public_key = headers[key_name] + + if conf.hide_credentials then + request.clear_header(key_name) + end + + return public_key + end + end + end + end, + [constants.AUTHENTICATION.QUERY] = function(request, conf) + local public_key - if conf.key_names then - for _,key_name in ipairs(conf.key_names) do - public_key = get_key_from_query(key_name, request, conf) + if conf.authentication_key_names then + for _,key_name in ipairs(conf.authentication_key_names) do + public_key = get_key_from_query(key_name, request, conf) - if public_key then - return public_key - end + if public_key then + return public_key + end + end end end -end +} -- Fast lookup for credential validation depending on the type of the authentication -- @@ -88,36 +108,45 @@ end -- @param {string} public_key -- @param {string} private_key -- @return {boolean} Success of authentication -local function validate_credentials(application, public_key) - return application ~= nil -end +--[[ +local validate_credentials = { + [constants.AUTHENTICATION.HEADER] = function(application, public_key) + return application ~= nil + end, + [constants.AUTHENTICATION.QUERY] = function(application, public_key) + return application ~= nil + end +} +]] function _M.execute(conf) if not conf then return end - local public_key, secret_key = retrieve_credentials(ngx.req, conf) - local application - - -- Make sure we are not sending an empty table to find_by_keys - if public_key then - application = cache.get_and_set(cache.application_key(public_key), function() - local applications, err = dao.applications:find_by_keys { public_key = public_key } - local result - if err then - ngx.log(ngx.ERR, err) - utils.show_error(500) - elseif #applications > 0 then - result = applications[1] - end - return result - end) - end + for k, v in ipairs({ constants.AUTHENTICATION.QUERY, constants.AUTHENTICATION.HEADER }) do + local public_key, secret_key = retrieve_credentials[conf.authentication_type](ngx.req, conf) + local application + + -- Make sure we are not sending an empty table to find_by_keys + if public_key then + application = cache.get_and_set(cache.application_key(public_key), function() + local applications, err = dao.applications:find_by_keys { public_key = public_key } + local result + if err then + ngx.log(ngx.ERR, err) + utils.show_error(500) + elseif #applications > 0 then + result = applications[1] + end + return result + end) + end - if not validate_credentials(application, public_key, secret_key) then - utils.show_error(403, "Your authentication credentials are invalid") + if not application then + utils.show_error(403, "Your authentication credentials are invalid") + end end - ngx.req.set_header(constants.HEADERS.CONSUMER_ID, application.consumer_id) + ngx.req.set_header(constants.HEADERS.ACCOUNT_ID, application.account_id) ngx.ctx.authenticated_entity = application end diff --git a/kong/plugins/keyauth/dao/cassandra.lua b/kong/plugins/keyauth/dao/cassandra.lua new file mode 100644 index 00000000000..65627ed7c6b --- /dev/null +++ b/kong/plugins/keyauth/dao/cassandra.lua @@ -0,0 +1,49 @@ +local constants = require "kong.constants" +local BaseDao = require "kong.dao.cassandra.base_dao" + +local SCHEMA = { + key = { type = "string", required = true, queryable = true }, + consumer_id = { type = constants.DATABASE_TYPES.ID, required = true, foreign = true, queryable = true, immutable = true }, + created_at = { type = constants.DATABASE_TYPES.TIMESTAMP } +} + +local UP = [[ + CREATE TABLE IF NOT EXISTS keyauth_credentials( + consumer_id uuid, + key text, + created_at timestamp, + PRIMARY KEY (key, consumer_id) + ); +]] + +local DOWN = [[ + DROP TABLE keyauth_credentials; +]] + +local KeyAuthDAO = BaseDao:extend() + +function KeyAuthDAO:new(properties) + self._entity = "keyauth_credentials" + self._schema = SCHEMA + self._queries = { + insert = { + params = { "key", "consumer_id", "created_at" }, + query = [[ INSERT INTO keyauth_credentials(key, consumer_id, created_at) VALUES(?, ?, ?); ]] + }, + select = { + query = [[ SELECT * FROM keyauth_credentials %s; ]] + }, + select_one = { + params = { "key" }, + query = [[ SELECT * FROM keyauth_credentials WHERE key = ?; ]] + }, + delete = { + params = { "key" }, + query = [[ DELETE FROM keyauth_credentials WHERE key = ?; ]] + } + } + + KeyAuthDAO.super.new(self, properties) +end + +return KeyAuthDAO diff --git a/src/plugins/queryauth/handler.lua b/kong/plugins/keyauth/handler.lua similarity index 100% rename from src/plugins/queryauth/handler.lua rename to kong/plugins/keyauth/handler.lua diff --git a/src/plugins/queryauth/schema.lua b/kong/plugins/keyauth/schema.lua similarity index 100% rename from src/plugins/queryauth/schema.lua rename to kong/plugins/keyauth/schema.lua diff --git a/src/plugins/ratelimiting/access.lua b/kong/plugins/ratelimiting/access.lua similarity index 100% rename from src/plugins/ratelimiting/access.lua rename to kong/plugins/ratelimiting/access.lua diff --git a/src/plugins/ratelimiting/handler.lua b/kong/plugins/ratelimiting/handler.lua similarity index 100% rename from src/plugins/ratelimiting/handler.lua rename to kong/plugins/ratelimiting/handler.lua diff --git a/src/plugins/ratelimiting/schema.lua b/kong/plugins/ratelimiting/schema.lua similarity index 100% rename from src/plugins/ratelimiting/schema.lua rename to kong/plugins/ratelimiting/schema.lua diff --git a/src/plugins/tcplog/handler.lua b/kong/plugins/tcplog/handler.lua similarity index 100% rename from src/plugins/tcplog/handler.lua rename to kong/plugins/tcplog/handler.lua diff --git a/src/plugins/tcplog/log.lua b/kong/plugins/tcplog/log.lua similarity index 100% rename from src/plugins/tcplog/log.lua rename to kong/plugins/tcplog/log.lua diff --git a/src/plugins/tcplog/schema.lua b/kong/plugins/tcplog/schema.lua similarity index 100% rename from src/plugins/tcplog/schema.lua rename to kong/plugins/tcplog/schema.lua diff --git a/src/plugins/udplog/handler.lua b/kong/plugins/udplog/handler.lua similarity index 100% rename from src/plugins/udplog/handler.lua rename to kong/plugins/udplog/handler.lua diff --git a/src/plugins/udplog/log.lua b/kong/plugins/udplog/log.lua similarity index 100% rename from src/plugins/udplog/log.lua rename to kong/plugins/udplog/log.lua diff --git a/src/plugins/udplog/schema.lua b/kong/plugins/udplog/schema.lua similarity index 100% rename from src/plugins/udplog/schema.lua rename to kong/plugins/udplog/schema.lua diff --git a/src/resolver/access.lua b/kong/resolver/access.lua similarity index 100% rename from src/resolver/access.lua rename to kong/resolver/access.lua diff --git a/src/resolver/handler.lua b/kong/resolver/handler.lua similarity index 100% rename from src/resolver/handler.lua rename to kong/resolver/handler.lua diff --git a/src/resolver/header_filter.lua b/kong/resolver/header_filter.lua similarity index 100% rename from src/resolver/header_filter.lua rename to kong/resolver/header_filter.lua diff --git a/src/tools/cache.lua b/kong/tools/cache.lua similarity index 100% rename from src/tools/cache.lua rename to kong/tools/cache.lua diff --git a/src/tools/faker.lua b/kong/tools/faker.lua similarity index 100% rename from src/tools/faker.lua rename to kong/tools/faker.lua diff --git a/src/tools/http_client.lua b/kong/tools/http_client.lua similarity index 100% rename from src/tools/http_client.lua rename to kong/tools/http_client.lua diff --git a/src/tools/io.lua b/kong/tools/io.lua similarity index 90% rename from src/tools/io.lua rename to kong/tools/io.lua index 8eca95f9f0a..54babece57d 100644 --- a/src/tools/io.lua +++ b/kong/tools/io.lua @@ -66,8 +66,8 @@ function _M.load_configuration_and_dao(configuration_path) -- Configuraiton should already be validated by the CLI at this point local configuration = yaml.load(configuration_file) - local dao_config = configuration.databases_available[configuration.database] - if dao_config == nil then + local dao_properties = configuration.databases_available[configuration.database] + if dao_properties == nil then error("No dao \""..configuration.database.."\" defined") end @@ -76,7 +76,7 @@ function _M.load_configuration_and_dao(configuration_path) -- Instanciate the DAO Factory along with the configuration local DaoFactory = require("kong.dao."..configuration.database..".factory") - local dao_factory = DaoFactory(dao_config.properties) + local dao_factory = DaoFactory(dao_properties.properties, configuration.plugins_available) return configuration, dao_factory end diff --git a/src/tools/migrations.lua b/kong/tools/migrations.lua similarity index 100% rename from src/tools/migrations.lua rename to kong/tools/migrations.lua diff --git a/src/tools/timestamp.lua b/kong/tools/timestamp.lua similarity index 100% rename from src/tools/timestamp.lua rename to kong/tools/timestamp.lua diff --git a/src/tools/utils.lua b/kong/tools/utils.lua similarity index 100% rename from src/tools/utils.lua rename to kong/tools/utils.lua diff --git a/src/vendor/classic.lua b/kong/vendor/classic.lua similarity index 100% rename from src/vendor/classic.lua rename to kong/vendor/classic.lua diff --git a/src/vendor/lapp.lua b/kong/vendor/lapp.lua similarity index 100% rename from src/vendor/lapp.lua rename to kong/vendor/lapp.lua diff --git a/src/web/admin/index.html b/kong/web/admin/index.html similarity index 100% rename from src/web/admin/index.html rename to kong/web/admin/index.html diff --git a/src/web/app.lua b/kong/web/app.lua similarity index 100% rename from src/web/app.lua rename to kong/web/app.lua diff --git a/src/web/routes/apis.lua b/kong/web/routes/apis.lua similarity index 100% rename from src/web/routes/apis.lua rename to kong/web/routes/apis.lua diff --git a/src/web/routes/applications.lua b/kong/web/routes/applications.lua similarity index 100% rename from src/web/routes/applications.lua rename to kong/web/routes/applications.lua diff --git a/src/web/routes/base_controller.lua b/kong/web/routes/base_controller.lua similarity index 100% rename from src/web/routes/base_controller.lua rename to kong/web/routes/base_controller.lua diff --git a/src/web/routes/consumers.lua b/kong/web/routes/consumers.lua similarity index 100% rename from src/web/routes/consumers.lua rename to kong/web/routes/consumers.lua diff --git a/src/web/routes/plugins.lua b/kong/web/routes/plugins.lua similarity index 100% rename from src/web/routes/plugins.lua rename to kong/web/routes/plugins.lua diff --git a/src/web/static/favicon.ico b/kong/web/static/favicon.ico similarity index 100% rename from src/web/static/favicon.ico rename to kong/web/static/favicon.ico diff --git a/spec/unit/dao/cassandra_spec.lua b/spec/unit/dao/cassandra_spec.lua index 20f80965a7e..de2b936900d 100644 --- a/spec/unit/dao/cassandra_spec.lua +++ b/spec/unit/dao/cassandra_spec.lua @@ -20,9 +20,9 @@ configuration.cassandra = configuration.databases_available[configuration.databa -- An utility function to apply tests on each collection local function describe_all_collections(tests_cb) for type, dao in pairs({ api = dao_factory.apis, + plugin = dao_factory.plugins, consumer = dao_factory.consumers, - application = dao_factory.applications, - plugin = dao_factory.plugins }) do + application = dao_factory.applications }) do local collection = type.."s" describe(collection, function() tests_cb(type, collection) diff --git a/src/plugins/headerauth/access.lua b/src/plugins/headerauth/access.lua deleted file mode 100644 index befd44377f6..00000000000 --- a/src/plugins/headerauth/access.lua +++ /dev/null @@ -1,74 +0,0 @@ -local constants = require "kong.constants" -local cache = require "kong.tools.cache" - -local _M = {} - --- Fast lookup for credential retrieval depending on the type of the authentication --- --- All methods must respect: --- --- @param request ngx request object --- @param {table} conf Plugin configuration (value property) --- @return {string} public_key --- @return {string} private_key -local function retrieve_credentials(request, conf) - local public_key - local headers = request.get_headers() - - if conf.header_names then - for _,key_name in ipairs(conf.header_names) do - if headers[key_name] ~= nil then - public_key = headers[key_name] - - if conf.hide_credentials then - request.clear_header(key_name) - end - - return public_key - end - end - end -end - --- Fast lookup for credential validation depending on the type of the authentication --- --- All methods must respect: --- --- @param {table} application The retrieved application from the public_key passed in the request --- @param {string} public_key --- @param {string} private_key --- @return {boolean} Success of authentication -local function validate_credentials(application, public_key) - return application ~= nil -end - -function _M.execute(conf) - if not conf then return end - - local public_key, secret_key = retrieve_credentials(ngx.req, conf) - local application - - -- Make sure we are not sending an empty table to find_by_keys - if public_key then - application = cache.get_and_set(cache.application_key(public_key), function() - local applications, err = dao.applications:find_by_keys { public_key = public_key } - local result - if err then - ngx.log(ngx.ERR, err) - utils.show_error(500) - elseif #applications > 0 then - result = applications[1] - end - return result - end) - end - - if not validate_credentials(application, public_key, secret_key) then - utils.show_error(403, "Your authentication credentials are invalid") - end - - ngx.req.set_header(constants.HEADERS.CONSUMER_ID, application.consumer_id) - ngx.ctx.authenticated_entity = application -end - -return _M diff --git a/src/plugins/headerauth/handler.lua b/src/plugins/headerauth/handler.lua deleted file mode 100644 index ab766fe0bfe..00000000000 --- a/src/plugins/headerauth/handler.lua +++ /dev/null @@ -1,19 +0,0 @@ --- Copyright (C) Mashape, Inc. - -local BasePlugin = require "kong.plugins.base_plugin" -local access = require "kong.plugins.headerauth.access" - -local HeaderAuthHandler = BasePlugin:extend() - -function HeaderAuthHandler:new() - HeaderAuthHandler.super.new(self, "headerauth") -end - -function HeaderAuthHandler:access(conf) - HeaderAuthHandler.super.access(self) - access.execute(conf) -end - -HeaderAuthHandler.PRIORITY = 1000 - -return HeaderAuthHandler diff --git a/src/plugins/headerauth/schema.lua b/src/plugins/headerauth/schema.lua deleted file mode 100644 index d0c7ba413a4..00000000000 --- a/src/plugins/headerauth/schema.lua +++ /dev/null @@ -1,4 +0,0 @@ -return { - header_names = { required = true, type = "table" }, - hide_credentials = { type = "boolean", default = false } -} From 91cc9bae28757a74d6981cb81c899500efa9f474 Mon Sep 17 00:00:00 2001 From: Thibault Charbonnier Date: Thu, 26 Mar 2015 18:02:18 -0700 Subject: [PATCH 2/2] refactor: schema to have plugin-related tables --- .../2015-01-12-175310_init_schema.lua | 27 +++--- kong-0.1.0beta-2.rockspec | 3 +- kong/dao/cassandra/factory.lua | 4 +- kong/dao/cassandra/metrics.lua | 89 ------------------ kong/plugins/basicauth/dao/cassandra.lua | 56 ++++++++++++ kong/plugins/keyauth/dao/cassandra.lua | 30 ++++--- kong/plugins/ratelimiting/dao/cassandra.lua | 90 +++++++++++++++++++ 7 files changed, 178 insertions(+), 121 deletions(-) delete mode 100644 kong/dao/cassandra/metrics.lua create mode 100644 kong/plugins/basicauth/dao/cassandra.lua create mode 100644 kong/plugins/ratelimiting/dao/cassandra.lua diff --git a/database/migrations/cassandra/2015-01-12-175310_init_schema.lua b/database/migrations/cassandra/2015-01-12-175310_init_schema.lua index 7fcf68676f7..a322611069a 100644 --- a/database/migrations/cassandra/2015-01-12-175310_init_schema.lua +++ b/database/migrations/cassandra/2015-01-12-175310_init_schema.lua @@ -101,6 +101,18 @@ local Migration = { -- TEMPORARY UNTIL MOVED TO EACH PLUGIN -- keyauth_credentials, metrics -- + + -- username is what the plugin will query this table with. We shouldn't need a consumer_id yet on it + -- and then compare the password with the one received by a request + CREATE TABLE IF NOT EXISTS basicauth_credentials( + consumer_id uuid, + username text, + password text, + created_at timestamp, + PRIMARY KEY (username, consumer_id) + ); + + -- key is what the plugin will query this table with. We shouldn't need a consumer_id yet on it CREATE TABLE IF NOT EXISTS keyauth_credentials( consumer_id uuid, key text, @@ -108,7 +120,7 @@ local Migration = { PRIMARY KEY (key, consumer_id) ); - CREATE TABLE IF NOT EXISTS metrics( + CREATE TABLE IF NOT EXISTS ratelimiting_metrics( api_id uuid, identifier text, period text, @@ -141,19 +153,6 @@ local Migration = { ); CREATE INDEX IF NOT EXISTS ON applications(consumer_id); CREATE INDEX IF NOT EXISTS ON applications(public_key); - - - - - - - - - - - - - ]] end, diff --git a/kong-0.1.0beta-2.rockspec b/kong-0.1.0beta-2.rockspec index 83cdf66dd11..c53c74bbe6c 100644 --- a/kong-0.1.0beta-2.rockspec +++ b/kong-0.1.0beta-2.rockspec @@ -65,7 +65,6 @@ build = { ["kong.dao.cassandra.factory"] = "kong/dao/cassandra/factory.lua", ["kong.dao.cassandra.base_dao"] = "kong/dao/cassandra/base_dao.lua", ["kong.dao.cassandra.apis"] = "kong/dao/cassandra/apis.lua", - ["kong.dao.cassandra.metrics"] = "kong/dao/cassandra/metrics.lua", ["kong.dao.cassandra.plugins"] = "kong/dao/cassandra/plugins.lua", ["kong.dao.cassandra.consumers"] = "kong/dao/cassandra/consumers.lua", ["kong.dao.cassandra.applications"] = "kong/dao/cassandra/applications.lua", @@ -75,6 +74,7 @@ build = { ["kong.plugins.basicauth.handler"] = "kong/plugins/basicauth/handler.lua", ["kong.plugins.basicauth.access"] = "kong/plugins/basicauth/access.lua", ["kong.plugins.basicauth.schema"] = "kong/plugins/basicauth/schema.lua", + ["kong.plugins.basicauth.dao.cassandra"] = "kong/plugins/basicauth/dao/cassandra.lua", ["kong.plugins.keyauth.handler"] = "kong/plugins/keyauth/handler.lua", ["kong.plugins.keyauth.access"] = "kong/plugins/keyauth/access.lua", @@ -96,6 +96,7 @@ build = { ["kong.plugins.ratelimiting.handler"] = "kong/plugins/ratelimiting/handler.lua", ["kong.plugins.ratelimiting.access"] = "kong/plugins/ratelimiting/access.lua", ["kong.plugins.ratelimiting.schema"] = "kong/plugins/ratelimiting/schema.lua", + ["kong.plugins.ratelimiting.dao.cassandra"] = "kong/plugins/ratelimiting/dao/cassandra.lua", ["kong.web.app"] = "kong/web/app.lua", ["kong.web.routes.apis"] = "kong/web/routes/apis.lua", diff --git a/kong/dao/cassandra/factory.lua b/kong/dao/cassandra/factory.lua index fd0e17860bd..7385e4c3eec 100644 --- a/kong/dao/cassandra/factory.lua +++ b/kong/dao/cassandra/factory.lua @@ -44,10 +44,8 @@ function CassandraFactory:new(properties, plugins_available) -- TODO: a metatable to this could prepare all statements as soon as an entry is added self.daos = { apis = Apis(properties), - metrics = Metrics(properties), plugins = Plugins(properties), - consumers = Consumers(properties), - applications = Applications(properties) + consumers = Consumers(properties) } for _, plugin_name in ipairs(plugins_available) do diff --git a/kong/dao/cassandra/metrics.lua b/kong/dao/cassandra/metrics.lua deleted file mode 100644 index d15b26047d9..00000000000 --- a/kong/dao/cassandra/metrics.lua +++ /dev/null @@ -1,89 +0,0 @@ -local cassandra = require "cassandra" -local BaseDao = require "kong.dao.cassandra.base_dao" -local timestamp = require "kong.tools.timestamp" - -local Metrics = BaseDao:extend() - -function Metrics:new(properties) - self._queries = { - increment_counter = { - query = [[ UPDATE metrics SET value = value + 1 WHERE api_id = ? AND - identifier = ? AND - period_date = ? AND - period = ?; ]] - }, - select_one = { - query = [[ SELECT * FROM metrics WHERE api_id = ? AND - identifier = ? AND - period_date = ? AND - period = ?; ]] - }, - delete = { - query = [[ DELETE FROM metrics WHERE api_id = ? AND - identifier = ? AND - period_date = ? AND - period = ?; ]] - } - } - - Metrics.super.new(self, properties) -end - -function Metrics:increment(api_id, identifier, current_timestamp) - local periods = timestamp.get_timestamps(current_timestamp) - local batch = cassandra.BatchStatement(cassandra.batch_types.COUNTER) - - for period, period_date in pairs(periods) do - batch:add(self._statements.increment_counter.query, { - cassandra.uuid(api_id), - identifier, - cassandra.timestamp(period_date), - period - }) - end - - return Metrics.super._execute(self, batch) -end - -function Metrics:find_one(api_id, identifier, current_timestamp, period) - local periods = timestamp.get_timestamps(current_timestamp) - - local metric, err = Metrics.super._execute(self, self._statements.select_one, { - cassandra.uuid(api_id), - identifier, - cassandra.timestamp(periods[period]), - period - }) - if err then - return nil, err - elseif #metric > 0 then - metric = metric[1] - else - metric = nil - end - - return metric -end - -function Metrics:delete(api_id, identifier, periods) - error("metrics:delete() not yet implemented") -end - --- Unsuported -function Metrics:insert() - error("metrics:insert() not supported") -end - -function Metrics:update() - error("metrics:update() not supported") -end - -function Metrics:find() - error("metrics:find() not supported") -end - -function Metrics:find_by_keys() - error("metrics:find_by_keys() not supported") -end - -return Metrics diff --git a/kong/plugins/basicauth/dao/cassandra.lua b/kong/plugins/basicauth/dao/cassandra.lua new file mode 100644 index 00000000000..731425fff77 --- /dev/null +++ b/kong/plugins/basicauth/dao/cassandra.lua @@ -0,0 +1,56 @@ +local constants = require "kong.constants" +local BaseDao = require "kong.dao.cassandra.base_dao" + +local SCHEMA = { + username = { type = "string", required = true, queryable = true }, + password = { type = "string", required = true }, + consumer_id = { type = constants.DATABASE_TYPES.ID, + required = true, + foreign = true, + immutable = true }, + created_at = { type = constants.DATABASE_TYPES.TIMESTAMP } +} + +local BasicAuthDAO = BaseDao:extend() + +function BasicAuthDAO:new(properties) + self._entity = "basicauth_credentials" + self._schema = SCHEMA + self._queries = { + insert = { + params = { "username", "password", "consumer_id", "created_at" }, + query = [[ INSERT INTO basicauth_credentials(username, password, consumer_id, created_at) VALUES(?, ?, ?, ?); ]] + }, + select = { + query = [[ SELECT * FROM basicauth_credentials %s; ]] + }, + select_one = { + params = { "username" }, + query = [[ SELECT * FROM basicauth_credentials WHERE username = ?; ]] + }, + update = { + params = { "password", "username" }, + query = [[ UPDATE basicauth_credentials SET password = ? WHERE username = ?; ]] + }, + delete = { + params = { "username" }, + query = [[ DELETE FROM basicauth_credentials WHERE username = ?; ]] + }, + __foreign = { + consumer_id = { + params = { "consumer_id" }, + query = [[ SELECT id FROM consumers WHERE id = ?; ]] + } + }, + __unique = { + self = { + params = { "username" }, + query = [[ SELECT * FROM basicauth_credentials WHERE username = ?; ]] + } + } + } + + BasicAuthDAO.super.new(self, properties) +end + +return BasicAuthDAO diff --git a/kong/plugins/keyauth/dao/cassandra.lua b/kong/plugins/keyauth/dao/cassandra.lua index 65627ed7c6b..2a1bb9c7c01 100644 --- a/kong/plugins/keyauth/dao/cassandra.lua +++ b/kong/plugins/keyauth/dao/cassandra.lua @@ -3,23 +3,13 @@ local BaseDao = require "kong.dao.cassandra.base_dao" local SCHEMA = { key = { type = "string", required = true, queryable = true }, - consumer_id = { type = constants.DATABASE_TYPES.ID, required = true, foreign = true, queryable = true, immutable = true }, + consumer_id = { type = constants.DATABASE_TYPES.ID, + required = true, + foreign = true, + immutable = true }, created_at = { type = constants.DATABASE_TYPES.TIMESTAMP } } -local UP = [[ - CREATE TABLE IF NOT EXISTS keyauth_credentials( - consumer_id uuid, - key text, - created_at timestamp, - PRIMARY KEY (key, consumer_id) - ); -]] - -local DOWN = [[ - DROP TABLE keyauth_credentials; -]] - local KeyAuthDAO = BaseDao:extend() function KeyAuthDAO:new(properties) @@ -40,6 +30,18 @@ function KeyAuthDAO:new(properties) delete = { params = { "key" }, query = [[ DELETE FROM keyauth_credentials WHERE key = ?; ]] + }, + __foreign = { + consumer_id = { + params = { "consumer_id" }, + query = [[ SELECT id FROM consumers WHERE id = ?; ]] + } + }, + __unique = { + key = { + params = { "key" }, + query = [[ SELECT * FROM keyauth_credentials WHERE key = ?; ]] + } } } diff --git a/kong/plugins/ratelimiting/dao/cassandra.lua b/kong/plugins/ratelimiting/dao/cassandra.lua new file mode 100644 index 00000000000..116888fbab8 --- /dev/null +++ b/kong/plugins/ratelimiting/dao/cassandra.lua @@ -0,0 +1,90 @@ +local cassandra = require "cassandra" +local BaseDao = require "kong.dao.cassandra.base_dao" +local timestamp = require "kong.tools.timestamp" + +local RateLimitingDao = BaseDao:extend() + +function RateLimitingDao:new(properties) + self._entity = "ratelimiting_metrics" + self._queries = { + increment_counter = { + query = [[ UPDATE ratelimiting_metrics SET value = value + 1 WHERE api_id = ? AND + identifier = ? AND + period_date = ? AND + period = ?; ]] + }, + select_one = { + query = [[ SELECT * FROM ratelimiting_metrics WHERE api_id = ? AND + identifier = ? AND + period_date = ? AND + period = ?; ]] + }, + delete = { + query = [[ DELETE FROM ratelimiting_metrics WHERE api_id = ? AND + identifier = ? AND + period_date = ? AND + period = ?; ]] + } + } + + RateLimitingDao.super.new(self, properties) +end + +function RateLimitingDao:increment(api_id, identifier, current_timestamp) + local periods = timestamp.get_timestamps(current_timestamp) + local batch = cassandra.BatchStatement(cassandra.batch_types.COUNTER) + + for period, period_date in pairs(periods) do + batch:add(self._statements.increment_counter.query, { + cassandra.uuid(api_id), + identifier, + cassandra.timestamp(period_date), + period + }) + end + + return RateLimitingDao.super._execute(self, batch) +end + +function RateLimitingDao:find_one(api_id, identifier, current_timestamp, period) + local periods = timestamp.get_timestamps(current_timestamp) + + local metric, err = RateLimitingDao.super._execute(self, self._statements.select_one, { + cassandra.uuid(api_id), + identifier, + cassandra.timestamp(periods[period]), + period + }) + if err then + return nil, err + elseif #metric > 0 then + metric = metric[1] + else + metric = nil + end + + return metric +end + +function RateLimitingDao:delete(api_id, identifier, periods) + error("RateLimitingDao:delete() not yet implemented") +end + +-- Unsuported +function RateLimitingDao:insert() + error("RateLimitingDao:insert() not supported") +end + +function RateLimitingDao:update() + error("RateLimitingDao:update() not supported") +end + +function RateLimitingDao:find() + error("RateLimitingDao:find() not supported") +end + +function RateLimitingDao:find_by_keys() + error("RateLimitingDao:find_by_keys() not supported") +end + +return RateLimitingDao