diff options
author | iilyak <iilyak@users.noreply.github.com> | 2018-10-10 10:53:41 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-10 10:53:41 -0700 |
commit | 959945575293244f948e887d6b0c42449fcdccd6 (patch) | |
tree | 8f14e02414c98581f15e9020081cca42b02773c7 | |
parent | be6de6f32d0be7147dce8ebe39dd54c07d7be31f (diff) | |
parent | aa63804c3b3fc4b637d7095f5ff993ff2d01818e (diff) | |
download | couchdb-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.erl | 15 |
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] |