import React, {FunctionComponent, useEffect, useState} from 'react'; import { useHistory } from 'react-router-dom'; import Button from 'aws-northstar/components/Button'; import Inline from 'aws-northstar/layouts/Inline'; import StatusIndicator from 'aws-northstar/components/StatusIndicator'; import Table, { Column } from 'aws-northstar/components/Table'; import {deleteRequest, getRequests, invokeFederateConsole, invokeFederateCli} from "../../data"; import {ICredential, IRequest, ReduxRoot} from "../../interfaces"; import '../home/styles.css'; import { ExpandableSection, Modal, Stack, } from "aws-northstar"; import Flashbar, {FlashbarMessage} from "aws-northstar/components/Flashbar"; import {useSelector} from "react-redux"; const RequestTable: FunctionComponent = () => { const userInfo = useSelector( (state:ReduxRoot) => { return state.breakGlassReducerState.userInfo }); const columnDefinitions: Column[]= [ { id: 'request_account', width: 150, Header: 'Account', accessor: 'request_account' }, { id: 'request_role', width: 200, Header: 'Role', accessor: 'request_role' }, { id: 'request_duration', width: 100, Header: 'Duration', accessor: 'request_duration' }, { id: 'request_justification', width: 200, Header: 'Justification', accessor: 'request_justification' }, { id: 'request_status', width: 100, Header: 'Status', Cell: ({ row }: any) => { if (row && row.original) { const status = row.original.request_status; switch(status) { case 'Requested': return Requested; case 'Approved': return Approved; case 'Rejected': return Rejected; case 'Expired': return Expired; case 'Ended': return Ended; default: return
; } } return row.id; } }, { id: 'request_time', width: 150, Header: 'Requested time', accessor: 'request_time' }, { id: 'expiration_time', width: 150, Header: 'End time', accessor: 'expiration_time' }, { id: 'request_url', width: 300, Header: 'Access', Cell: ({ row }: any) => { if (row && row.original) { const status = row.original.request_status; switch(status) { case 'Approved': return
   
default: return
; } } return row.id; } } ]; const [requests, setRequests] = useState([]); const [selectedItems, setSelectedItems] = useState([]); const history = useHistory(); const [loading, setLoading] = useState(false); const [cliVisible, setCliVisible] = useState(false); const [cli, setCli] = useState({accessKeyId: "", secretAccessKey: "", sessionToken: ""}); const [errors, setErrors] = React.useState([]); const CLIViewer = () => { const copyJSONToClipboard = () => { let content = getJSON(cli) navigator.clipboard.writeText(content); } const copyBashToClipboard = () => { let content = getBash(cli) navigator.clipboard.writeText(content); } const copyFishToClipboard = () => { let content = getFish(cli) navigator.clipboard.writeText(content); } const copyPowershellToClipboard = () => { let content = getPowershell(cli) navigator.clipboard.writeText(content); } const copyWindowsToClipboard = () => { let content = getWindows(cli) navigator.clipboard.writeText(content); } return (
setCliVisible(false)}>

{
   "accessKeyId": "{cli.accessKeyId}",
   "secretAccessKey": "{cli.secretAccessKey}",
   "sessionToken": "{cli.sessionToken}"
}

export AWS_ACCESS_KEY_ID={cli.accessKeyId}
export AWS_SECRET_ACCESS_KEY={cli.secretAccessKey}
export AWS_SESSION_TOKEN={cli.sessionToken}

set -x AWS_ACCESS_KEY_ID "{cli.accessKeyId}"
set -x AWS_SECRET_ACCESS_KEY "{cli.secretAccessKey}"
set -x AWS_SESSION_TOKEN "{cli.sessionToken}"

$Env:AWS_ACCESS_KEY_ID="{cli.accessKeyId}"
$Env:AWS_SECRET_ACCESS_KEY="{cli.secretAccessKey}"
$Env:AWS_SESSION_TOKEN="{cli.sessionToken}"

set AWS_ACCESS_KEY_ID={cli.accessKeyId}
set AWS_SECRET_ACCESS_KEY={cli.secretAccessKey}
set AWS_SESSION_TOKEN={cli.sessionToken}

); }; const invokeFederateEndpointConsole = async (account: string, role: string) => { try { let response = await invokeFederateConsole(userInfo.token, account, role).then( (result: any) => { return result; }); window.open(response, "") } catch (err) { const items:FlashbarMessage[] = [ { header: 'Could not federate into the account and role: ' + err.toString(), type: 'error', dismissible: true, } ]; setErrors(items); } } const invokeFederateEndpointCli = async (account: string, role: string) => { try { let response = await invokeFederateCli(userInfo.token, account, role).then( (result: any) => { return result; }); setCli(response); setCliVisible(true); } catch (err) { console.log(err.toString()); const items:FlashbarMessage[] = [ { header: 'Could not get the details to federate into the account: ' + err.toString(), type: 'error', dismissible: true, } ]; setErrors(items); } } useEffect( () => { const getAllRequests = async () => { try { setLoading(true); let requests = await getRequests(userInfo.token).then( (result: IRequest[]) => { return result; }); setRequests(requests); await Promise.resolve(); setLoading(false); } catch (err) { const items:FlashbarMessage[] = [ { header: 'Could not get the requests: ' + err.toString(), type: 'error', dismissible: true, } ]; setErrors(items); } } getAllRequests().then(() => console.log("getAllRequests() completed.")); }, [userInfo]); const onCreateClick = () => { history.push('/Create-request'); } const onDeleteClick = async () => { let selectedItem:IRequest = selectedItems[0]; try { await deleteRequest(userInfo.token, selectedItem.id, selectedItem.request_time).then( (result: any) => { return result; }); let selected_requests = remove_request(requests, selectedItem) setRequests(selected_requests) history.push('/Request-dashboard'); } catch (err) { const items:FlashbarMessage[] = [ { header: 'Could not delete the request: ' + err.toString(), type: 'error', dismissible: true, } ]; setErrors(items); } } const handleSelectionChange = (items: object[]) => { if (!(selectedItems.length === 0 && items.length === 0)) { setSelectedItems(items); } }; const tableActions = ( ); return
} function getJSON(credential: ICredential) { let output: string = ""; output = output.concat("{\n") output = output.concat("\t\"accessKeyId\": \"") output = output.concat(credential.accessKeyId) output = output.concat("\",\n") output = output.concat("\t\"secretAccessKey\": \"") output = output.concat(credential.secretAccessKey) output = output.concat("\",\n") output = output.concat("\t\"sessionToken\": \"") output = output.concat(credential.sessionToken) output = output.concat("\"\n}") return output; } function getBash(credential: ICredential) { let output: string = ""; output = output.concat("export AWS_ACCESS_KEY_ID=") output = output.concat(credential.accessKeyId) output = output.concat("\n") output = output.concat("export AWS_SECRET_ACCESS_KEY=") output = output.concat(credential.secretAccessKey) output = output.concat("\n") output = output.concat("export AWS_SESSION_TOKEN=") output = output.concat(credential.sessionToken) return output; } function getFish(credential: ICredential) { let output: string = ""; output = output.concat("set -x AWS_ACCESS_KEY_ID \"") output = output.concat(credential.accessKeyId) output = output.concat("\"\n") output = output.concat("set -x AWS_SECRET_ACCESS_KEY \"") output = output.concat(credential.secretAccessKey) output = output.concat("\"\n") output = output.concat("set -x AWS_SESSION_TOKEN \"") output = output.concat(credential.sessionToken) output = output.concat("\"") return output; } function getPowershell(credential: ICredential) { let output: string = ""; output = output.concat("$Env:AWS_ACCESS_KEY_ID=\"") output = output.concat(credential.accessKeyId) output = output.concat("\"\n") output = output.concat("$Env:AWS_SECRET_ACCESS_KEY=\"") output = output.concat(credential.secretAccessKey) output = output.concat("\"\n") output = output.concat("$Env:AWS_SESSION_TOKEN=\"") output = output.concat(credential.sessionToken) output = output.concat("\"") return output; } function getWindows(credential: ICredential) { let output: string = ""; output = output.concat("set AWS_ACCESS_KEY_ID=") output = output.concat(credential.accessKeyId) output = output.concat("\n") output = output.concat("set AWS_SECRET_ACCESS_KEY=") output = output.concat(credential.secretAccessKey) output = output.concat("\n") output = output.concat("set AWS_SESSION_TOKEN=") output = output.concat(credential.sessionToken) return output; } function remove_request(requests: any, selected: any) { let list: Array = []; for (var request of requests) { if (request.id !== selected.id) { list.push(request) } } return list; } export default RequestTable;