Skip to content

Commit 22cd5ba

Browse files
committed
MB-52431 Return authType/saslPassword
When running cluster_compat mode older than 7.1 the bucket config still has an authType bucket property which should be returned in REST results. Return the saslPassword if there is one (for pre-7.0 compat mode), return empty saslPassword for 7.0 compat mode, and don't return saslPassword for 7.1 compat mode. Change-Id: I93e1aad382363dc8b3ee5784beeb73f86ecf8d94 Reviewed-on: https://review.couchbase.org/c/ns_server/+/175679 Well-Formed: Restriction Checker Well-Formed: Build Bot <[email protected]> Reviewed-by: Dave Finlay <[email protected]> Reviewed-by: Artem Stemkovski <[email protected]> Tested-by: Steve Watanabe <[email protected]>
1 parent 7e93db8 commit 22cd5ba

File tree

2 files changed

+56
-7
lines changed

2 files changed

+56
-7
lines changed

src/menelaus_web_buckets.erl

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,23 @@
6464

6565
-define(MAX_BUCKET_NAME_LEN, 100).
6666

67+
may_expose_bucket_auth(Name, Req) ->
68+
case menelaus_auth:get_token(Req) of
69+
undefined ->
70+
case cluster_compat_mode:is_cluster_71() of
71+
false ->
72+
%% The bucket password permission was removed in 7.1
73+
%% so would only come into play when running mixed versions
74+
%% with pre-7.1 nodes.
75+
menelaus_auth:has_permission({[{bucket, Name}, password],
76+
read}, Req);
77+
true ->
78+
false
79+
end;
80+
_ ->
81+
false
82+
end.
83+
6784
get_info_level(Req) ->
6885
case proplists:get_value("basic_stats", mochiweb_request:parse_qs(Req)) of
6986
undefined ->
@@ -227,10 +244,11 @@ build_buckets_info(Req, Buckets, Ctx, InfoLevel) ->
227244
SkipMap = InfoLevel =/= streaming andalso
228245
proplists:get_value(
229246
"skipMap", mochiweb_request:parse_qs(Req)) =:= "true",
230-
[build_bucket_info(BucketName, Ctx, InfoLevel, SkipMap) ||
247+
[build_bucket_info(BucketName, Ctx, InfoLevel,
248+
may_expose_bucket_auth(BucketName, Req), SkipMap) ||
231249
BucketName <- Buckets].
232250

233-
build_bucket_info(Id, Ctx, InfoLevel, SkipMap) ->
251+
build_bucket_info(Id, Ctx, InfoLevel, MayExposeAuth, SkipMap) ->
234252
Snapshot = menelaus_web_node:get_snapshot(Ctx),
235253
{ok, BucketConfig} = ns_bucket:get_bucket(Id, Snapshot),
236254
BucketUUID = ns_bucket:uuid(Id, Snapshot),
@@ -254,10 +272,35 @@ build_bucket_info(Id, Ctx, InfoLevel, SkipMap) ->
254272
"Directory"])},
255273
{nodeStatsListURI,
256274
bucket_info_cache:build_pools_uri(["buckets", Id, "nodes"])}]}},
275+
build_authType(BucketConfig),
257276
build_auto_compaction_info(BucketConfig),
258277
build_purge_interval_info(BucketConfig),
259278
build_replica_index(BucketConfig),
260-
build_dynamic_bucket_info(InfoLevel, Id, BucketConfig, Ctx)])}.
279+
build_dynamic_bucket_info(InfoLevel, Id, BucketConfig, Ctx),
280+
[build_sasl_password(BucketConfig) || MayExposeAuth]])}.
281+
282+
build_authType(BucketConfig) ->
283+
case cluster_compat_mode:is_cluster_71() of
284+
false ->
285+
[{authType, misc:expect_prop_value(auth_type, BucketConfig)}];
286+
true ->
287+
[]
288+
end.
289+
290+
build_sasl_password(BucketConfig) ->
291+
case cluster_compat_mode:is_cluster_71() of
292+
true ->
293+
[];
294+
false ->
295+
case cluster_compat_mode:is_cluster_70() of
296+
true ->
297+
{saslPassword, <<>>};
298+
false ->
299+
{saslPassword,
300+
list_to_binary(proplists:get_value(sasl_password,
301+
BucketConfig, ""))}
302+
end
303+
end.
261304

262305
build_replica_index(BucketConfig) ->
263306
[{replicaIndex, proplists:get_value(replica_index, BucketConfig, true)} ||

src/ns_bucket.erl

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ fetch_snapshot(Bucket, Txn) ->
165165
fetch_snapshot(Bucket, Txn, all_sub_keys()).
166166

167167
fetch_snapshot(_Bucket, {ns_config, Config}, _SubKeys) ->
168-
Converted = bucket_configs_to_chronicle(get_buckets(Config)),
168+
Converted = bucket_configs_to_chronicle(get_buckets(Config), false),
169169
maps:from_list([{K, {V, no_rev}} || {K, V} <- Converted]);
170170
fetch_snapshot(all, Txn, SubKeys) ->
171171
{ok, {Names, _} = NamesRev} = chronicle_compat:txn_get(root(), Txn),
@@ -185,15 +185,21 @@ get_snapshot(Bucket, Opts) ->
185185

186186
upgrade_to_chronicle(Buckets, NodesWanted) ->
187187
BucketConfigs = proplists:get_value(configs, Buckets, []),
188-
bucket_configs_to_chronicle(BucketConfigs) ++
188+
bucket_configs_to_chronicle(BucketConfigs, true) ++
189189
collections:default_kvs(BucketConfigs, NodesWanted).
190190

191-
bucket_configs_to_chronicle(BucketConfigs) ->
191+
bucket_configs_to_chronicle(BucketConfigs, ToChronicle) ->
192192
[{root(), [N || {N, _} <- BucketConfigs]} |
193193
lists:flatmap(
194194
fun ({B, BC}) ->
195195
{value, {uuid, UUID}, BC1} = lists:keytake(uuid, 1, BC),
196-
[{sub_key(B, props), lists:keydelete(sasl_password, 1, BC1)},
196+
BC2 = case ToChronicle of
197+
true ->
198+
lists:keydelete(sasl_password, 1, BC1);
199+
false ->
200+
BC1
201+
end,
202+
[{sub_key(B, props), BC2},
197203
{uuid_key(B), UUID}]
198204
end, BucketConfigs)].
199205

0 commit comments

Comments
 (0)