From cf94bce463ac0d05b57e0d4ef1ebf2cf129a7494 Mon Sep 17 00:00:00 2001 From: Thibault Charbonnier Date: Sat, 9 May 2015 16:00:55 +0200 Subject: [PATCH] refactor; back to supporting pcre (only for regex field) --- kong-0.2.1-1.rockspec | 5 ++++- kong/dao/cassandra/apis.lua | 11 +---------- kong/dao/cassandra/base_dao.lua | 4 ++-- kong/dao/schemas.lua | 7 +++++++ kong/tools/io.lua | 4 ++-- spec/unit/schemas_spec.lua | 26 ++++++++++++++++++-------- 6 files changed, 34 insertions(+), 23 deletions(-) diff --git a/kong-0.2.1-1.rockspec b/kong-0.2.1-1.rockspec index 8a508e9f48d..ff988ccddbb 100644 --- a/kong-0.2.1-1.rockspec +++ b/kong-0.2.1-1.rockspec @@ -24,7 +24,10 @@ dependencies = { "lua-cjson ~> 2.1.0-1", "luasocket ~> 2.0.2-5", "ansicolors ~> 1.0.2-3", - "multipart ~> 0.1-2" + "multipart ~> 0.1-2", + + "lua-llthreads2 ~> 0.1.3-1", + "lrexlib-pcre ~> 2.8.0-1" } build = { type = "builtin", diff --git a/kong/dao/cassandra/apis.lua b/kong/dao/cassandra/apis.lua index c0dd3503fbc..d0ffb21260d 100644 --- a/kong/dao/cassandra/apis.lua +++ b/kong/dao/cassandra/apis.lua @@ -2,20 +2,11 @@ local BaseDao = require "kong.dao.cassandra.base_dao" local constants = require "kong.constants" local PluginsConfigurations = require "kong.dao.cassandra.plugins_configurations" -local function is_valid_public_dns(str) - -- check the format - local pattern1 = "[A-Za-z0-9%-]*%.*[A-Za-z0-9%-]*%.[A-Za-z0-9][A-Za-z0-9]+$" - -- check all characters are alphanumeric - local pattern2 = "^[%w%.%-]*$" - -- both checks need to be true to be a valid public_dns - return str:match(pattern1) and str:match(pattern2) -end - local SCHEMA = { id = { type = constants.DATABASE_TYPES.ID }, name = { type = "string", unique = true, queryable = true, default = function(api_t) return api_t.public_dns end }, public_dns = { type = "string", required = true, unique = true, queryable = true, - func = is_valid_public_dns }, + regex = "(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])" }, target_url = { type = "string", required = true }, created_at = { type = constants.DATABASE_TYPES.TIMESTAMP } } diff --git a/kong/dao/cassandra/base_dao.lua b/kong/dao/cassandra/base_dao.lua index 374138887dd..ad1285b1dd7 100644 --- a/kong/dao/cassandra/base_dao.lua +++ b/kong/dao/cassandra/base_dao.lua @@ -182,8 +182,8 @@ function BaseDao:_close_session(session) end end -local x = "%x" -local uuid_pattern = "^"..table.concat({ x:rep(8), x:rep(4), x:rep(4), x:rep(4), x:rep(12) }, '%-').."$" +local digit = "[0-9a-f]" +local uuid_pattern = "^"..table.concat({ digit:rep(8), digit:rep(4), digit:rep(4), digit:rep(4), digit:rep(12) }, '%-').."$" local function is_valid_uuid(uuid) return uuid and uuid:match(uuid_pattern) ~= nil end diff --git a/kong/dao/schemas.lua b/kong/dao/schemas.lua index 955649d2532..a93a61ea937 100644 --- a/kong/dao/schemas.lua +++ b/kong/dao/schemas.lua @@ -1,3 +1,4 @@ +local reg = require "rex_pcre" local utils = require "kong.tools.utils" local constants = require "kong.constants" @@ -66,6 +67,12 @@ function _M.validate(t, schema, is_update) errors = utils.add_error(errors, column, string.format("\"%s\" is not allowed. Allowed values are: \"%s\"", t[column], table.concat(v.enum, "\", \""))) end + -- Check field against a regex if specified + elseif t[column] ~= nil and v.regex then + if not reg.match(t[column], v.regex) then + errors = utils.add_error(errors, column, column.." has an invalid value") + end + -- Check field against a custom function elseif v.func and type(v.func) == "function" then local ok, err = v.func(t[column], t) diff --git a/kong/tools/io.lua b/kong/tools/io.lua index dba1d6557ad..d3e58f2b3aa 100644 --- a/kong/tools/io.lua +++ b/kong/tools/io.lua @@ -1,7 +1,7 @@ -local constants = require "kong.constants" -local path = require("path").new("/") local yaml = require "yaml" +local path = require("path").new("/") local stringy = require "stringy" +local constants = require "kong.constants" local _M = {} diff --git a/spec/unit/schemas_spec.lua b/spec/unit/schemas_spec.lua index dc53798b359..20cebd11717 100644 --- a/spec/unit/schemas_spec.lua +++ b/spec/unit/schemas_spec.lua @@ -19,6 +19,7 @@ describe("Schemas", function() local schema = { string = { type = "string", required = true, immutable = true }, table = { type = "table" }, + url = { regex = "(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])" }, date = { default = 123456, immutable = true }, allowed = { enum = { "hello", "world" }}, boolean_val = { type = "boolean" }, @@ -40,7 +41,7 @@ describe("Schemas", function() } it("should confirm a valid entity is valid", function() - local values = { string = "mockbin entity" } + local values = { string = "mockbin entity", url = "mockbin.com" } local valid, err = validate(values, schema) assert.falsy(err) @@ -48,7 +49,7 @@ describe("Schemas", function() end) it("should invalidate entity if required property is missing", function() - local values = { table = {"mockbin.com"} } + local values = { url = "mockbin.com" } local valid, err = validate(values, schema) assert.falsy(valid) @@ -93,7 +94,7 @@ describe("Schemas", function() it("should set default values if those are variables or functions specified in the validator", function() -- Variables - local values = { string = "mockbin entity" } + local values = { string = "mockbin entity", url = "mockbin.com" } local valid, err = validate(values, schema) assert.falsy(err) @@ -101,7 +102,7 @@ describe("Schemas", function() assert.are.same(123456, values.date) -- Functions - local values = { string = "mockbin entity" } + local values = { string = "mockbin entity", url = "mockbin.com" } local valid, err = validate(values, schema) assert.falsy(err) @@ -111,7 +112,7 @@ describe("Schemas", function() it("should override default values if specified", function() -- Variables - local values = { string = "mockbin entity", date = 654321 } + local values = { string = "mockbin entity", url = "mockbin.com", date = 654321 } local valid, err = validate(values, schema) assert.falsy(err) @@ -119,7 +120,7 @@ describe("Schemas", function() assert.are.same(654321, values.date) -- Functions - local values = { string = "mockbin entity", default = "abcdef" } + local values = { string = "mockbin entity", url = "mockbin.com", default = "abcdef" } local valid, err = validate(values, schema) assert.falsy(err) @@ -127,8 +128,17 @@ describe("Schemas", function() assert.are.same("abcdef", values.default) end) + it("should validate a field against a regex", function() + local values = { string = "mockbin entity", url = "mockbin_!" } + + local valid, err = validate(values, schema) + assert.falsy(valid) + assert.truthy(err) + assert.are.same("url has an invalid value", err.url) + end) + it("should return error when unexpected values are included in the schema", function() - local values = { string = "mockbin entity", unexpected = "abcdef" } + local values = { string = "mockbin entity", url = "mockbin.com", unexpected = "abcdef" } local valid, err = validate(values, schema) assert.falsy(valid) @@ -136,7 +146,7 @@ describe("Schemas", function() end) it("should be able to return multiple errors at once", function() - local values = { unexpected = "abcdef" } + local values = { url = "mockbin.com", unexpected = "abcdef" } local valid, err = validate(values, schema) assert.falsy(valid)