/* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ import React, { useState } from 'react'; import Admin from "../actions/admin"; import { Auth } from "@aws-amplify/auth"; import { Tabs, SpaceBetween, StatusIndicator, } from '@awsui/components-react'; import { useModal } from '../actions/Modal.js'; import {useAdminPermissions} from "../actions/AdminPermissionsHook.js"; import ItemTable from '../components/ItemTable.jsx'; import PermissionsView from "../components/PermissionsView"; import ItemAmend from "../components/ItemAmend"; import {useUserGroupsModal} from "../actions/UserGroupsModalHook"; import {useAmendItemModal} from "../actions/AmendItemModalHook"; const ViewPermissions = (props) => { //Viewer pane state management. const [viewerCurrentTab, setViewerCurrentTab] = useState('details'); async function handleViewerTabChange(tabselected) { setViewerCurrentTab(tabselected); } if (props.selectedItems.length === 1 && (props.selectedTab === 'roles' || props.selectedTab === 'policies')) { return ( ); } else { return null; } } const AdminPolicy = (props) => { const [{ isLoading: permissionsIsLoading, data: permissionsData, error: permissionsError}, { update: permissionsUpdate }] = useAdminPermissions(); const allData = {policy: {data: permissionsData.policies, isLoading: permissionsIsLoading, error: permissionsError}, roles: {data: permissionsData.roles, isLoading: permissionsIsLoading, error: permissionsError}, groups: {data: permissionsData.groups, isLoading: permissionsIsLoading, error: permissionsError}} //Layout state management. const [editingItem, setEditingItem] = useState(false); //Main table state management. const [selectedItems, setSelectedItems] = useState([]); const [focusItem, setFocusItem] = useState([]); const [selectedTab, setSelectedTab] = useState('roles'); const [action, setAction] = useState(['add']); //Modals const { show: showDeleteConfirmation, hide: hideDeleteConfirmation, RenderModal: DeleteModal } = useModal() const { show: showGroupDeleteConfirmation, hide: hideGroupDeleteConfirmation, RenderModal: GroupDeleteModal } = useModal() const { show: showAddGroups, RenderModal: AddGroupsModal } = useUserGroupsModal() const { show: showRemoveGroups, RenderModal: RemoveGroupsModal } = useUserGroupsModal() const { show: showAddGroup, RenderModal: AddGroupModal } = useAmendItemModal() function getPermissions(isLoading, permissionsData, key){ if (isLoading){ return [] } else { return permissionsData[key] } } function displayAdminPolicy(editingItem){ if (!editingItem) { return handleTabChange(detail.activeTabId)} tabs={[ { label: "Roles", id: "roles", content: }, { label: "Policies", id: "policies", content: } , { label: "Groups", id: "groups", content: } , { label: "Users", id: "users", content: } ]} /> }else { return } } function handleNotification(notification) { return props.updateNotification('add', notification) } function handleAddItem() { setAction('add'); setFocusItem({}); setEditingItem(true); } async function handleAddGroupClick(e) { e.preventDefault(); showAddGroup(); } async function handleDeleteGroupClick(e) { e.preventDefault(); showGroupDeleteConfirmation(); } function handleEditItem() { setAction('edit'); setFocusItem(selectedItems[0]); setEditingItem(true); } function handleResetScreen() { setEditingItem(false); } function handleItemSelectionChange(selection) { setSelectedItems(selection); if (selectedItems.length !== 0) { setFocusItem(selectedItems[0]); } else { setFocusItem({}); } } async function handleSave(editItem, action) { let newItem = Object.assign({}, editItem); let notificationHeader = 'policy'; try { if (action === 'edit' && selectedTab === 'policies') { const session = await Auth.currentSession(); const apiAdmin = new Admin(session); await apiAdmin.putPolicy(newItem); handleNotification({ type: 'success', dismissible: true, header: "Update " + notificationHeader, content: editItem.policy_name + " updated successfully.", }); //Update permissions for user UI. await permissionsUpdate() setEditingItem(false); //This is needed to ensure the item in selectApps reflects new updates setSelectedItems([]); setFocusItem({}); //Reload actual permissions for current user. await props.reloadPermissions(); } else if (action === 'edit' && selectedTab === 'roles') { notificationHeader = 'role' const session = await Auth.currentSession(); const apiAdmin = new Admin(session); await apiAdmin.putRole(newItem); handleNotification({ type: 'success', dismissible: true, header: "Update " + notificationHeader, content: editItem.role_name + " updated successfully.", }); //Update permissions for user UI. await permissionsUpdate() setEditingItem(false); //This is needed to ensure the item in selectApps reflects new updates setSelectedItems([]); setFocusItem({}); //Reload actual permissions for current user. await props.reloadPermissions(); } else if (action === 'add' && selectedTab === 'roles') { notificationHeader = 'role' const session = await Auth.currentSession(); const apiAdmin = new Admin(session); await apiAdmin.postRole(newItem); handleNotification({ type: 'success', dismissible: true, header: "Update " + notificationHeader, content: editItem.role_name + " updated successfully.", }); //Update permissions for user UI. await permissionsUpdate() setEditingItem(false); //This is needed to ensure the item in selectApps reflects new updates setSelectedItems([]); setFocusItem({}); //Reload actual permissions for current user. await props.reloadPermissions(); } else if (action === 'add' && selectedTab === 'policies') { const session = await Auth.currentSession(); const apiAdmin = new Admin(session); await apiAdmin.postPolicy(newItem); handleNotification({ type: 'success', dismissible: true, header: "Update " + notificationHeader, content: editItem.policy_name + " updated successfully.", }); //Update permissions for user UI. await permissionsUpdate() setEditingItem(false); //This is needed to ensure the item in selectApps reflects new updates setSelectedItems([]); setFocusItem({}); //Reload actual permissions for current user. await props.reloadPermissions(); } else { setEditingItem(false); } } catch (e) { console.log(e); if ('response' in e && 'data' in e.response) { handleNotification({ type: 'error', dismissible: true, header: "Save " + notificationHeader, content: e.response.data }); } else{ handleNotification({ type: 'error', dismissible: true, header: "Save " + notificationHeader, content: 'Unknown error occurred', }); } } } async function handleTabChange(tabselected) { setSelectedTab(tabselected); setSelectedItems([]); } async function handleDeleteItemClick(e) { e.preventDefault(); showDeleteConfirmation(); } async function handleRefreshClick(e) { await permissionsUpdate(); } async function handleActionClick(e) { e.preventDefault(); let action = e.detail.id; if(action === 'add_group'){ await addUsersToGroupsClick() } else if (action === 'remove_group'){ await removeUsersFromGroupsClick() } } async function addUsersToGroups(groups) { if (!groups.selectedGroups){ return; } let notificationId = null; try { notificationId = handleNotification({ type: 'success', loading: true, dismissible: false, header: "Update users", content: "Adding selected users to groups: " + groups.selectedGroups.map(group => group.value), }); let users = []; for (const user of selectedItems) { users.push({'username': user['userRef'], 'addGroups': groups.selectedGroups.map(group => group.value)}) } const session = await Auth.currentSession(); const apiAdmin = await new Admin(session); await apiAdmin.putUsers(users); permissionsUpdate(); handleNotification({ id: notificationId, type: 'success', dismissible: true, header: "Update users", content: "Users added to groups: " + groups.selectedGroups.map(group => group.value), }); setSelectedItems([]); } catch (e) { console.log(e); if ('response' in e) { if(e.response != null && typeof e.response === 'object') { if ('data' in e.response) { handleNotification({ id: notificationId, type: 'error', dismissible: true, header: "Update users", content: 'Add to group failed: ' + e.response.data }); } } else { handleNotification({ id: notificationId, type: 'error', dismissible: true, header: "Update users", content: 'Add to group failed: ' + e.message }); } } else { handleNotification({ id: notificationId, type: 'error', dismissible: true, header: "Update users", content: 'Add to group failed.', }); } } } async function addUsersToGroupsClick() { await showAddGroups(); } async function removeUsersFromGroups(groups) { if (!groups.selectedGroups){ return; } let notificationId = null; try { notificationId = handleNotification({ type: 'success', loading: true, dismissible: false, header: "Update users", content: "Removing selected users from groups: " + groups.selectedGroups.map(group => group.value), }); let users = []; for (const user of selectedItems) { users.push({'username': user['userRef'], 'removeGroups': groups.selectedGroups.map(group => group.value)}) } const session = await Auth.currentSession(); const apiAdmin = await new Admin(session); await apiAdmin.putUsers(users); permissionsUpdate(); handleNotification({ id: notificationId, type: 'success', dismissible: true, header: "Update users", content: "Users removed from groups: " + groups.selectedGroups.map(group => group.value), }); setSelectedItems([]); } catch (e) { console.log(e); if ('response' in e) { if(e.response != null && typeof e.response === 'object') { if ('data' in e.response) { handleNotification({ id: notificationId, type: 'error', dismissible: true, header: "Update users", content: 'Remove from group failed: ' + e.response.data }); } } else { handleNotification({ id: notificationId, type: 'error', dismissible: true, header: "Update users", content: 'Remove from group failed: ' + e.message }); } } else { handleNotification({ id: notificationId, type: 'error', dismissible: true, header: "Update users", content: 'Remove from group failed.', }); } } } async function createGroup(group) { if (!group.group_name){ return; } let notificationId = null; try { notificationId = handleNotification({ type: 'success', loading: true, dismissible: false, header: "Add group", content: "Adding new group: " + group.group_name, }); const session = await Auth.currentSession(); const apiAdmin = await new Admin(session); await apiAdmin.postGroups([group]); permissionsUpdate(); handleNotification({ id: notificationId, type: 'success', dismissible: true, header: "Add group", content: "New group added: " + group.group_name, }); setSelectedItems([]); } catch (e) { console.log(e); if ('response' in e) { if(e.response != null && typeof e.response === 'object') { if ('data' in e.response) { handleNotification({ id: notificationId, type: 'error', dismissible: true, header: "Add group", content: 'Add group failed: ' + e.response.data }); } } else { handleNotification({ id: notificationId, type: 'error', dismissible: true, header: "Add group", content: 'Add group failed: ' + e.message }); } } else { handleNotification({ id: notificationId, type: 'error', dismissible: true, header: "Add group", content: 'Add group failed.', }); } } } async function removeUsersFromGroupsClick() { await showRemoveGroups(); } async function handleDeleteItem(e) { e.preventDefault(); let currentItem = 0; let notifcationHeader = 'Group' await hideDeleteConfirmation(); await hideGroupDeleteConfirmation(); try { const session = await Auth.currentSession(); const apiAdmin = new Admin(session); if (selectedTab === 'roles') { await apiAdmin.delRole(selectedItems[0].role_id); handleNotification({ type: 'success', dismissible: true, header: notifcationHeader + ' deleted successfully', content: selectedItems[0].role_name + ' was deleted.' }); } if (selectedTab === 'policies') { notifcationHeader = 'Policy' await apiAdmin.delPolicy(selectedItems[0].policy_id); handleNotification({ type: 'success', dismissible: true, header: notifcationHeader + ' deleted successfully', content: selectedItems[0].policy_name + ' was deleted.' }); } if (selectedTab === 'groups') { notifcationHeader = 'Group' await apiAdmin.delGroup(selectedItems[0].group_name); handleNotification({ type: 'success', dismissible: true, header: notifcationHeader + ' deleted successfully', content: selectedItems[0].group_name + ' was deleted.' }); } permissionsUpdate(); setSelectedItems([]); } catch (e) { console.log(e); handleNotification({ type: 'error', dismissible: true, header: notifcationHeader + ' deletion failed', content: selectedItems[currentItem].role_id ? selectedItems[currentItem].role_id : selectedItems[currentItem].policy_id + ' failed to delete.' }); } } return (
{props.schemaIsLoading ? Loading schema... : displayAdminPolicy(editingItem) } {selectedItems.length === 1 ?

Are you sure you wish to delete the selected policy?

:

Are you sure you wish to delete the {selectedItems.length} selected policies?

}
{selectedItems.length === 1 ?

Are you sure you wish to delete the selected group?

:

Are you sure you wish to delete the {selectedItems.length} selected groups?

}
group.group_name)} > group.group_name)} >
); }; export default AdminPolicy;