diff --git a/src/fabric_doc_open.erl b/src/fabric_doc_open.erl index c9f3f0a..9b6d1e4 100644 --- a/src/fabric_doc_open.erl +++ b/src/fabric_doc_open.erl @@ -158,6 +158,8 @@ choose_reply(Docs) -> format_reply({ok, #doc{deleted=true}}, true) -> {not_found, deleted}; +format_reply({ok, #doc{}=Doc}, _) -> + couch_doc_security:filter(Doc); format_reply(Else, _) -> Else. diff --git a/src/fabric_doc_open_revs.erl b/src/fabric_doc_open_revs.erl index 7539f51..45c97cd 100644 --- a/src/fabric_doc_open_revs.erl +++ b/src/fabric_doc_open_revs.erl @@ -48,7 +48,9 @@ go(DbName, Id, Revs, Options) -> RexiMon = fabric_util:create_monitors(Workers), try fabric_util:recv(Workers, #shard.ref, fun handle_message/3, State) of {ok, {ok, Reply}} -> - {ok, Reply}; + {ok, format_reply(Reply)}; + {ok, Reply} -> + {ok, format_reply(Reply)}; Else -> Else after @@ -139,6 +141,13 @@ maybe_reply(DbName, ReplyDict, Complete, RepairDocs, R) -> noreply end. +format_reply(DocList) -> + MapFun = fun + ({ok, #doc{}=Doc}) -> couch_doc_security:filter(Doc); + (Else) -> Else + end, + lists:map(MapFun, DocList). + extract_replies(Replies) -> lists:map(fun({_,{Reply,_}}) -> Reply end, Replies). diff --git a/src/fabric_view.erl b/src/fabric_view.erl index 220386d..dff866a 100644 --- a/src/fabric_view.erl +++ b/src/fabric_view.erl @@ -256,7 +256,8 @@ transform_row(#view_row{key=Key, id=Id, value=Value, doc=undefined}) -> {row, {[{id,Id}, {key,Key}, {value,Value}]}}; transform_row(#view_row{key=Key, id=Id, value=Value, doc={error,Reason}}) -> {row, {[{id,Id}, {key,Key}, {value,Value}, {error,Reason}]}}; -transform_row(#view_row{key=Key, id=Id, value=Value, doc=Doc}) -> +transform_row(#view_row{key=Key, id=Id, value=Value, doc=Doc0}) -> + {ok, Doc} = couch_doc_security:filter(Doc0), {row, {[{id,Id}, {key,Key}, {value,Value}, {doc,Doc}]}}. diff --git a/src/fabric_view_changes.erl b/src/fabric_view_changes.erl index 7a375fd..9d88e42 100644 --- a/src/fabric_view_changes.erl +++ b/src/fabric_view_changes.erl @@ -371,6 +371,9 @@ changes_row(Props0, IncludeDocs) -> {true, {error, Reason}} -> % Transform {doc, {error, Reason}} to {error, Reason} for JSON lists:keyreplace(doc, 1, Props0, {error, Reason}); + {true, Doc0} when Doc0 /= undefined -> + {ok, Doc} = couch_doc_security:filter(Doc0), + lists:keyreplace(doc, 1, Props0, {doc, Doc}); {false, _} -> lists:keydelete(doc, 1, Props0); _ ->