summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriilyak <iilyak@users.noreply.github.com>2018-10-10 10:53:41 -0700
committerGitHub <noreply@github.com>2018-10-10 10:53:41 -0700
commit959945575293244f948e887d6b0c42449fcdccd6 (patch)
tree8f14e02414c98581f15e9020081cca42b02773c7
parentbe6de6f32d0be7147dce8ebe39dd54c07d7be31f (diff)
parentaa63804c3b3fc4b637d7095f5ff993ff2d01818e (diff)
downloadcouchdb-959945575293244f948e887d6b0c42449fcdccd6.tar.gz
Merge pull request #1647 from cloudant/validate-prefix-for-systemdbs
Validate database prefix against DBNAME_REGEX for system dbs
-rw-r--r--src/couch/src/couch_db.erl15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/couch/src/couch_db.erl b/src/couch/src/couch_db.erl
index 55664e964..4d76ceedc 100644
--- a/src/couch/src/couch_db.erl
+++ b/src/couch/src/couch_db.erl
@@ -1738,8 +1738,15 @@ validate_dbname_int(DbName, Normalized) when is_binary(DbName) ->
is_systemdb(DbName) when is_list(DbName) ->
is_systemdb(?l2b(DbName));
is_systemdb(DbName) when is_binary(DbName) ->
- lists:member(dbname_suffix(DbName), ?SYSTEM_DATABASES).
-
+ Normalized = normalize_dbname(DbName),
+ Suffix = filename:basename(Normalized),
+ case {filename:dirname(Normalized), lists:member(Suffix, ?SYSTEM_DATABASES)} of
+ {<<".">>, Result} -> Result;
+ {Prefix, false} -> false;
+ {Prefix, true} ->
+ ReOpts = [{capture,none}, dollar_endonly],
+ re:run(Prefix, ?DBNAME_REGEX, ReOpts) == match
+ end.
set_design_doc_keys(Options1) ->
Dir = case lists:keyfind(dir, 1, Options1) of
@@ -1831,7 +1838,9 @@ validate_dbname_fail_test_() ->
Cases = generate_cases("_long/co$mplex-/path+/_something")
++ generate_cases("_something")
++ generate_cases_with_shards("long/co$mplex-/path+/_something#")
- ++ generate_cases_with_shards("long/co$mplex-/path+/some.thing"),
+ ++ generate_cases_with_shards("long/co$mplex-/path+/some.thing")
+ ++ generate_cases("!abcdefg/werwej/_users")
+ ++ generate_cases_with_shards("!abcdefg/werwej/_users"),
{
foreach, fun setup/0, fun teardown/1,
[should_fail_validate_dbname(A) || {_, A} <- Cases]