You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by rn...@apache.org on 2014/08/28 14:00:01 UTC
[38/50] chttpd commit: updated refs/heads/master to 58020ab
Add cassim
Project: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/commit/2a270596
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/tree/2a270596
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/diff/2a270596
Branch: refs/heads/master
Commit: 2a2705967db91b43a476e7e3850fad5220ab269b
Parents: 58c203d
Author: Robert Newson <rn...@apache.org>
Authored: Wed Jul 30 12:07:19 2014 +0100
Committer: Robert Newson <rn...@apache.org>
Committed: Thu Jul 31 11:55:11 2014 +0100
----------------------------------------------------------------------
src/chttpd.app.src | 3 ++-
src/chttpd_auth_request.erl | 2 +-
src/chttpd_db.erl | 56 ++++++++++++++++++++++++++++++++--------
3 files changed, 48 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/blob/2a270596/src/chttpd.app.src
----------------------------------------------------------------------
diff --git a/src/chttpd.app.src b/src/chttpd.app.src
index f24716d..5e63d66 100644
--- a/src/chttpd.app.src
+++ b/src/chttpd.app.src
@@ -39,7 +39,8 @@
config,
couch,
ets_lru,
- fabric
+ fabric,
+ cassim
]},
{mod, {chttpd_app,[]}}
]}.
http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/blob/2a270596/src/chttpd_auth_request.erl
----------------------------------------------------------------------
diff --git a/src/chttpd_auth_request.erl b/src/chttpd_auth_request.erl
index 0c311a0..c9cc3a9 100644
--- a/src/chttpd_auth_request.erl
+++ b/src/chttpd_auth_request.erl
@@ -74,7 +74,7 @@ server_authorization_check(#httpd{path_parts=[<<"_", _/binary>>|_]}=Req) ->
require_admin(Req).
db_authorization_check(#httpd{path_parts=[DbName|_],user_ctx=Ctx}=Req) ->
- {_} = fabric:get_security(DbName, [{user_ctx, Ctx}]),
+ {_} = cassim:get_security(DbName, [{user_ctx, Ctx}]),
Req.
require_admin(Req) ->
http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/blob/2a270596/src/chttpd_db.erl
----------------------------------------------------------------------
diff --git a/src/chttpd_db.erl b/src/chttpd_db.erl
index 4741502..86e32dd 100644
--- a/src/chttpd_db.erl
+++ b/src/chttpd_db.erl
@@ -244,7 +244,7 @@ delete_db_req(#httpd{}=Req, DbName) ->
end.
do_db_req(#httpd{path_parts=[DbName|_], user_ctx=Ctx}=Req, Fun) ->
- fabric:get_security(DbName, [{user_ctx,Ctx}]), % calls check_is_reader
+ cassim:get_security(DbName, [{user_ctx,Ctx}]), % calls check_is_reader
Fun(Req, #db{name=DbName, user_ctx=Ctx}).
db_req(#httpd{method='GET',path_parts=[DbName]}=Req, _Db) ->
@@ -462,22 +462,25 @@ db_req(#httpd{method='POST',path_parts=[_,<<"_revs_diff">>]}=Req, Db) ->
db_req(#httpd{path_parts=[_,<<"_revs_diff">>]}=Req, _Db) ->
send_method_not_allowed(Req, "POST");
-db_req(#httpd{method='PUT',path_parts=[_,<<"_security">>],user_ctx=Ctx}=Req,
- Db) ->
- SecObj = chttpd:json_body(Req),
- case fabric:set_security(Db, SecObj, [{user_ctx, Ctx}]) of
- ok ->
- send_json(Req, {[{<<"ok">>, true}]});
- Else ->
- throw(Else)
- end;
+%% DEPRECATED: this endpoint functionality will be replaced by _security_mvcc
+db_req(#httpd{method='PUT',path_parts=[_,<<"_security">>]}=Req, Db) ->
+ put_security(Req, Db, true);
db_req(#httpd{method='GET',path_parts=[_,<<"_security">>],user_ctx=Ctx}=Req, Db) ->
- send_json(Req, fabric:get_security(Db, [{user_ctx,Ctx}]));
+ send_json(Req, cassim:get_security(Db, [{user_ctx,Ctx}]));
db_req(#httpd{path_parts=[_,<<"_security">>]}=Req, _Db) ->
send_method_not_allowed(Req, "PUT,GET");
+db_req(#httpd{method='PUT',path_parts=[_,<<"_security_mvcc">>]}=Req, Db) ->
+ put_security(Req, Db, false);
+
+db_req(#httpd{method='GET',path_parts=[_,<<"_security_mvcc">>],user_ctx=Ctx}=Req, Db) ->
+ send_json(Req, cassim:get_security(Db, [{user_ctx,Ctx}]));
+
+db_req(#httpd{path_parts=[_,<<"_security_mvcc">>]}=Req, _Db) ->
+ send_method_not_allowed(Req, "PUT,GET");
+
db_req(#httpd{method='PUT',path_parts=[_,<<"_revs_limit">>],user_ctx=Ctx}=Req,
Db) ->
Limit = chttpd:json_body(Req),
@@ -1392,6 +1395,37 @@ monitor_attachments(Att) ->
demonitor_refs(Refs) when is_list(Refs) ->
[demonitor(Ref) || Ref <- Refs].
+put_security(#httpd{user_ctx=Ctx}=Req, Db, FetchRev) ->
+ DbName = Db#db.name,
+ DocId = cassim_metadata_cache:security_meta_id(DbName),
+ {SecObj0} = chttpd:json_body(Req),
+ {OldSecDoc} = cassim:get_security(DbName),
+ OldRev = couch_util:get_value(<<"_rev">>, OldSecDoc, undefined),
+ %% Maybe update the security doc with the rev when hiding mvcc logic
+ SecObj = case {FetchRev, OldRev} of
+ %% User supplied rev, just use the req body
+ {false, _} ->
+ SecObj0;
+ %% User did not supply rev, but new security doc
+ {true, undefined} ->
+ SecObj0;
+ %% User did not supply rev, use the old rev
+ {true, OldRev} ->
+ [{<<"_rev">>, OldRev} | proplists:delete(<<"_rev">>, SecObj0)]
+ end,
+ SecDoc = couch_doc_from_req(Req, DocId, {SecObj}),
+ Options = [
+ delay_commit,
+ interactive_edit,
+ {user_ctx, Ctx},
+ {w, integer_to_list(mem3:quorum(Db))}
+ ],
+ {Status, {etag, Etag}, Body} =
+ cassim:set_security(Db, SecDoc, Options),
+ HttpCode = http_code_from_status(Status),
+ ResponseHeaders = [{"Etag", Etag}],
+ send_json(Req, HttpCode, ResponseHeaders, Body).
+
-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").