You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by va...@apache.org on 2019/09/16 21:44:01 UTC

[couchdb] 01/01: Make get_security calls consistent

This is an automated email from the ASF dual-hosted git repository.

vatamane pushed a commit to branch make-get-security-consistent
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit 9c9d6b79f4ffa62005fe6329d40f0447b11bc90d
Author: Nick Vatamaniuc <va...@apache.org>
AuthorDate: Mon Sep 16 17:39:32 2019 -0400

    Make get_security calls consistent
    
    There are two fixes:
    
    1) In `fabric2_fdb:get_config/1`, Db was matched before and after
    `ensure_current/1`. Only path was used and didn't normally change so it didn't
    actually blow up. But it's worth fixing it anyway.
    
    2) In `fabric2_db:get_security/2` we used a cached value of the security
    document outside the transaction. Now we force it go through a transaction to
    call `fabric2_fdb:get_config/1` which call `ensure_current/1`. When done also
    update the cached Db handle.
---
 src/fabric/src/fabric2_db.erl  | 17 +++++++++++++++--
 src/fabric/src/fabric2_fdb.erl |  2 +-
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/src/fabric/src/fabric2_db.erl b/src/fabric/src/fabric2_db.erl
index 853b502..7118795 100644
--- a/src/fabric/src/fabric2_db.erl
+++ b/src/fabric/src/fabric2_db.erl
@@ -350,8 +350,21 @@ get_revs_limit(#{revs_limit := RevsLimit}) ->
     RevsLimit.
 
 
-get_security(#{security_doc := SecurityDoc}) ->
-    SecurityDoc.
+get_security(#{security_doc := OldSecDoc} = Db) ->
+    KVs = fabric2_fdb:transactional(Db, fun(TxDb) ->
+        fabric2_fdb:get_config(TxDb)
+    end),
+    SecDoc = case lists:keyfind(<<"security_doc">>, 1, KVs) of
+        false ->
+            {[]};
+        {<<"security_doc">>, SecBin} ->
+            ?JSON_DECODE(SecBin)
+    end,
+    case OldSecDoc /= SecDoc of
+        true -> fabric2_server:store(Db#{security_doc := SecDoc});
+        false -> ok
+    end,
+    SecDoc.
 
 
 get_update_seq(#{} = Db) ->
diff --git a/src/fabric/src/fabric2_fdb.erl b/src/fabric/src/fabric2_fdb.erl
index 391122e..cb00aba 100644
--- a/src/fabric/src/fabric2_fdb.erl
+++ b/src/fabric/src/fabric2_fdb.erl
@@ -338,7 +338,7 @@ get_config(#{} = Db) ->
     #{
         tx := Tx,
         db_prefix := DbPrefix
-    } = Db = ensure_current(Db),
+    } = ensure_current(Db),
 
     {Start, End} = erlfdb_tuple:range({?DB_CONFIG}, DbPrefix),
     Future = erlfdb:get_range(Tx, Start, End),