|
58 | 58 | handle_delete_profile/2,
|
59 | 59 | handle_put_profile/2,
|
60 | 60 | handle_lookup_ldap_user/2,
|
61 |
| - gen_password/1 |
| 61 | + gen_password/1, |
| 62 | + handle_get_uiroles/1 |
62 | 63 | ]).
|
63 | 64 |
|
64 | 65 | -define(MIN_USERS_PAGE_SIZE, 2).
|
@@ -189,19 +190,23 @@ get_roles_by_permission(Permission, Config) ->
|
189 | 190 | menelaus_roles:produce_roles_by_permission(Permission, Config),
|
190 | 191 | pipes:collect()).
|
191 | 192 |
|
| 193 | +maybe_remove_security_roles(Req, Config, Roles) -> |
| 194 | + Roles -- |
| 195 | + case menelaus_auth:has_permission(?SECURITY_READ, Req) of |
| 196 | + true -> |
| 197 | + []; |
| 198 | + false -> |
| 199 | + menelaus_roles:get_security_roles(Config) |
| 200 | + end. |
| 201 | + |
192 | 202 | handle_get_roles(Req) ->
|
193 | 203 | Config = ns_config:get(),
|
194 | 204 | validator:handle(
|
195 | 205 | fun (Values) ->
|
196 | 206 | Permission = proplists:get_value(permission, Values),
|
197 |
| - Roles = |
198 |
| - get_roles_by_permission(Permission, Config) -- |
199 |
| - case menelaus_auth:has_permission(?SECURITY_READ, Req) of |
200 |
| - true -> |
201 |
| - []; |
202 |
| - false -> |
203 |
| - menelaus_roles:get_security_roles(Config) |
204 |
| - end, |
| 207 | + Roles = maybe_remove_security_roles( |
| 208 | + Req, Config, |
| 209 | + get_roles_by_permission(Permission, Config)), |
205 | 210 | Json =
|
206 | 211 | [{role_to_json(Role) ++ jsonify_props(Props)} ||
|
207 | 212 | {Role, Props} <- Roles],
|
@@ -1677,6 +1682,72 @@ handle_put_profile(RawIdentity, Req) ->
|
1677 | 1682 | menelaus_util:reply_json(Req, <<"Invalid Json">>, 400)
|
1678 | 1683 | end.
|
1679 | 1684 |
|
| 1685 | +handle_get_uiroles(Req) -> |
| 1686 | + menelaus_util:require_permission(Req, {[admin, security], read}), |
| 1687 | + |
| 1688 | + Roles = |
| 1689 | + maybe_remove_security_roles(Req, ns_config:latest(), |
| 1690 | + menelaus_roles:get_visible_role_definitions( |
| 1691 | + ns_config:latest())), |
| 1692 | + Folders = |
| 1693 | + lists:filtermap(build_ui_folder(_, Roles), menelaus_roles:ui_folders()), |
| 1694 | + |
| 1695 | + Buckets = menelaus_auth:get_accessible_buckets( |
| 1696 | + ?cut({[{bucket, _}, settings], read}), Req), |
| 1697 | + |
| 1698 | + Parameters = {[build_ui_parameters(bucket_name, Buckets)]}, |
| 1699 | + |
| 1700 | + menelaus_util:reply_json(Req, {[{folders, Folders}, |
| 1701 | + {parameters, Parameters}]}). |
| 1702 | + |
| 1703 | +build_ui_folder({Key, Name}, Roles) -> |
| 1704 | + case lists:filter(fun ({_, _, Props, _}) -> |
| 1705 | + proplists:get_value(folder, Props) =:= Key |
| 1706 | + end, Roles) of |
| 1707 | + [] -> |
| 1708 | + false; |
| 1709 | + FolderRoles -> |
| 1710 | + {true, {[{name, list_to_binary(Name)}, |
| 1711 | + {roles, [build_ui_role(Role) || Role <- FolderRoles]}]}} |
| 1712 | + end. |
| 1713 | + |
| 1714 | +build_ui_role({Role, Params, Props, _}) -> |
| 1715 | + {[{role, Role}, {params, Params} | jsonify_props(Props)]}. |
| 1716 | + |
| 1717 | +build_ui_value(Value, Children) -> |
| 1718 | + case lists:filter(fun ({_, L}) -> L =/= [] end, Children) of |
| 1719 | + [] -> |
| 1720 | + {[{value, list_to_binary(Value)}]}; |
| 1721 | + NonEmpty -> |
| 1722 | + {[{value, list_to_binary(Value)}, |
| 1723 | + {children, {NonEmpty}}]} |
| 1724 | + end. |
| 1725 | + |
| 1726 | +build_ui_parameters(Name, List) -> |
| 1727 | + {Name, build_ui_values(Name, List)}. |
| 1728 | + |
| 1729 | +build_ui_values(bucket_name, Buckets) -> |
| 1730 | + lists:map( |
| 1731 | + fun ({Name, BucketCfg}) -> |
| 1732 | + Scopes = |
| 1733 | + case cluster_compat_mode:is_enterprise() andalso |
| 1734 | + collections:enabled(BucketCfg) of |
| 1735 | + true -> |
| 1736 | + collections:get_scopes( |
| 1737 | + collections:get_manifest(BucketCfg)); |
| 1738 | + false -> |
| 1739 | + [] |
| 1740 | + end, |
| 1741 | + build_ui_value(Name, [build_ui_parameters(scope_name, Scopes)]) |
| 1742 | + end, Buckets); |
| 1743 | +build_ui_values(scope_name, Scopes) -> |
| 1744 | + [build_ui_value( |
| 1745 | + Name, [build_ui_parameters(collection_name, |
| 1746 | + collections:get_collections(Scope))]) || |
| 1747 | + {Name, Scope} <- Scopes]; |
| 1748 | +build_ui_values(collection_name, Collections) -> |
| 1749 | + [build_ui_value(Name, []) || {Name, _} <- Collections]. |
| 1750 | + |
1680 | 1751 | -ifdef(TEST).
|
1681 | 1752 | role_to_string_test() ->
|
1682 | 1753 | ?assertEqual("role", role_to_string(role)),
|
|
0 commit comments