import React, { useEffect} from 'react'; import {Link} from 'react-router-dom'; import Paper from '@material-ui/core/Paper'; import FormControlLabel from '@material-ui/core/FormControlLabel'; import Switch from '@material-ui/core/Switch'; import Select from '@material-ui/core/Select'; import MenuItem from '@material-ui/core/MenuItem'; import List from '@material-ui/core/List'; import Divider from '@material-ui/core/Divider'; import TextField from '@material-ui/core/TextField'; import ListItem from '@material-ui/core/ListItem'; import Button from '@material-ui/core/Button'; import Tabs from '@material-ui/core/Tabs'; import Tab from '@material-ui/core/Tab'; import ListItemText from '@material-ui/core/ListItemText'; import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'; import { useAlert } from "react-alert"; import { Dialog, DialogTitle, DialogActions, DialogContent } from '@material-ui/core'; import { useTheme } from '@material-ui/core/styles'; import CachedIcon from '@material-ui/icons/Cached'; import AccessibilityNewIcon from '@material-ui/icons/AccessibilityNew'; import LockIcon from '@material-ui/icons/Lock'; import EcoIcon from '@material-ui/icons/Eco'; import ScheduleIcon from '@material-ui/icons/Schedule'; import CloudIcon from '@material-ui/icons/Cloud'; import BusinessIcon from '@material-ui/icons/Business'; const Admin = (props) => { const { globalUrl } = props; const theme = useTheme(); const [firstRequest, setFirstRequest] = React.useState(true); const [modalUser, setModalUser] = React.useState({}); const [modalOpen, setModalOpen] = React.useState(false); const [loginInfo, setLoginInfo] = React.useState(""); const [curTab, setCurTab] = React.useState(0); const [users, setUsers] = React.useState([]); const [environments, setEnvironments] = React.useState([]); const [authentication, setAuthentication] = React.useState([]); const [schedules, setSchedules] = React.useState([]) const [selectedUser, setSelectedUser] = React.useState({}) const [newPassword, setNewPassword] = React.useState(""); const [selectedUserModalOpen, setSelectedUserModalOpen] = React.useState(false) const [selectedAuthentication, setSelectedAuthentication] = React.useState({}) const [selectedAuthenticationModalOpen, setSelectedAuthenticationModalOpen] = React.useState(false) const [showArchived, setShowArchived] = React.useState(false) const getApps = () => { fetch(globalUrl+"/api/v1/workflows/apps", { method: 'GET', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, credentials: "include", }) .then((response) => { if (response.status !== 200) { console.log("Status not 200 for apps :O!") } return response.json() }) .then((responseJson) => { console.log("apps: ", responseJson) //setApps(responseJson) //setFilteredApps(responseJson) //if (responseJson.length > 0) { // setSelectedApp(responseJson[0]) // if (responseJson[0].actions !== null && responseJson[0].actions.length > 0) { // setSelectedAction(responseJson[0].actions[0]) // } else { // setSelectedAction({}) // } //} }) .catch(error => { alert.error(error.toString()) }); } const categories = [ { "name": "Ticketing", "apps": [ "TheHive", "Service-Now", "SecureWorks", ], "categories": ["tickets", "ticket", "ticketing"] }, ] /* "SIEM", "Active Directory", "Firewalls", "Proxies web", "SIEM", "SOAR", "Mail", "EDR", "AV", "MDM/MAM", "DNS", "Ticketing platform", "TIP", "Communication", "DDOS protection", "VMS", ] */ const alert = useAlert() const deleteAuthentication = (data) => { alert.info("Deleting auth " + data.label) // Just use this one? const url = globalUrl + '/api/v1/apps/authentication/' + data.id console.log("URL: ", url) fetch(url, { method: 'DELETE', credentials: "include", headers: { 'Content-Type': 'application/json', }, }) .then(response => response.json().then(responseJson => { console.log("RESP: ", responseJson) if (responseJson["success"] === false) { alert.error("Failed stopping schedule") } else { getAppAuthentication() alert.success("Successfully stopped schedule!") } }), ) .catch(error => { console.log("Error in userdata: ", error) }); } const deleteSchedule = (data) => { // FIXME - add some check here ROFL console.log("INPUT: ", data) // Just use this one? const url = globalUrl + '/api/v1/workflows/' + data["workflow_id"] + "/schedule/" + data.id console.log("URL: ", url) fetch(url, { method: 'DELETE', credentials: "include", headers: { 'Content-Type': 'application/json', }, }) .then(response => response.json().then(responseJson => { console.log("RESP: ", responseJson) if (responseJson["success"] === false) { alert.error("Failed stopping schedule") } else { getSchedules() alert.success("Successfully stopped schedule!") } }), ) .catch(error => { console.log("Error in userdata: ", error) }); } const onPasswordChange = () => { const data = { "username": selectedUser.username, "newpassword": newPassword } const url = globalUrl + '/api/v1/users/passwordchange'; fetch(url, { mode: 'cors', method: 'POST', body: JSON.stringify(data), credentials: 'include', crossDomain: true, withCredentials: true, headers: { 'Content-Type': 'application/json; charset=utf-8', }, }) .then(response => response.json().then(responseJson => { if (responseJson["success"] === false) { alert.error("Failed setting new password") } else { alert.success("Successfully password!") setSelectedUserModalOpen(false) } }), ) .catch(error => { alert.error("Err: " + error.toString()) }); } const deleteUser = (data) => { // Just use this one? const url = globalUrl + '/api/v1/users/' + data.id fetch(url, { method: 'DELETE', credentials: "include", headers: { 'Content-Type': 'application/json', }, }) .then(response => { if (response.status === 200) { getUsers() } return response.json() }) .then((responseJson) => { if (!responseJson.success && responseJson.reason !== undefined) { alert.error("Failed to deactivate user: "+responseJson.reason) } else { alert.success("Deactivated user "+data.id) } }) .catch(error => { console.log("Error in userdata: ", error) }); } const submitUser = (data) => { console.log("INPUT: ", data) // Just use this one? var data = { "username": data.Username, "password": data.Password } var baseurl = globalUrl const url = baseurl + '/api/v1/users/register'; fetch(url, { method: 'POST', credentials: "include", body: JSON.stringify(data), headers: { 'Content-Type': 'application/json', }, }) .then(response => response.json().then(responseJson => { if (responseJson["success"] === false) { setLoginInfo("Error in input: " + responseJson.reason) } else { setLoginInfo("") setModalOpen(false) getUsers() } }), ) .catch(error => { console.log("Error in userdata: ", error) }); } // Horrible frontend fix for environments const setDefaultEnvironment = (name) => { // FIXME - add some check here ROFL alert.info("Setting default env to " + name) var newEnv = [] for (var key in environments) { if (environments[key].Name == name) { if (environments[key].archived) { alert.error("Can't set archived to default") return } environments[key].default = true } else if (environments[key].default == true && environments[key].name !== name) { environments[key].default = false } newEnv.push(environments[key]) } // Just use this one? const url = globalUrl + '/api/v1/setenvironments'; fetch(url, { method: 'PUT', credentials: "include", body: JSON.stringify(newEnv), headers: { 'Content-Type': 'application/json', }, }) .then(response => response.json().then(responseJson => { if (responseJson["success"] === false) { alert.error(responseJson.reason) getEnvironments() } else { setLoginInfo("") setModalOpen(false) getEnvironments() } }), ) .catch(error => { console.log("Error in backend data: ", error) }) } const deleteEnvironment = (name) => { // FIXME - add some check here ROFL alert.info("Deleting environment " + name) var newEnv = [] for (var key in environments) { if (environments[key].Name == name) { if (environments[key].default) { alert.info("Can't delete the default environment") return } environments[key].archived = true } newEnv.push(environments[key]) } // Just use this one? const url = globalUrl + '/api/v1/setenvironments'; fetch(url, { method: 'PUT', credentials: "include", body: JSON.stringify(newEnv), headers: { 'Content-Type': 'application/json', }, }) .then(response => response.json().then(responseJson => { if (responseJson["success"] === false) { alert.error(responseJson.reason) getEnvironments() } else { setLoginInfo("") setModalOpen(false) getEnvironments() } }), ) .catch(error => { console.log("Error when deleting: ", error) }) } const submitEnvironment = (data) => { // FIXME - add some check here ROFL environments.push({ "name": data.environment, "type": "onprem", }) // Just use this one? var baseurl = globalUrl const url = baseurl + '/api/v1/setenvironments'; fetch(url, { method: 'PUT', credentials: "include", body: JSON.stringify(environments), headers: { 'Content-Type': 'application/json', }, }) .then(response => response.json().then(responseJson => { if (responseJson["success"] === false) { setLoginInfo("Error in input: " + responseJson.reason) getEnvironments() } else { setLoginInfo("") setModalOpen(false) getEnvironments() } }), ) .catch(error => { console.log("Error in userdata: ", error) }); } const getSchedules = () => { fetch(globalUrl + "/api/v1/workflows/schedules", { method: 'GET', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, credentials: "include", }) .then((response) => { if (response.status !== 200) { console.log("Status not 200 for apps :O!") return } return response.json() }) .then((responseJson) => { setSchedules(responseJson) }) .catch(error => { alert.error(error.toString()) }); } const getAppAuthentication = () => { fetch(globalUrl + "/api/v1/apps/authentication", { method: 'GET', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, credentials: "include", }) .then((response) => { if (response.status !== 200) { console.log("Status not 200 for apps :O!") return } return response.json() }) .then((responseJson) => { if (responseJson.success) { console.log(responseJson.data) setAuthentication(responseJson.data) } else { alert.error("Failed getting authentications") } }) .catch(error => { alert.error(error.toString()) }); } const getEnvironments = () => { fetch(globalUrl + "/api/v1/getenvironments", { method: 'GET', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, credentials: "include", }) .then((response) => { if (response.status !== 200) { console.log("Status not 200 for apps :O!") return } return response.json() }) .then((responseJson) => { setEnvironments(responseJson) }) .catch(error => { alert.error(error.toString()) }); } const getUsers = () => { fetch(globalUrl + "/api/v1/getusers", { method: 'GET', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, credentials: "include", }) .then((response) => { if (response.status !== 200) { console.log("Status not 200 for apps :O!") return } return response.json() }) .then((responseJson) => { console.log(responseJson) setUsers(responseJson) }) .catch(error => { alert.error(error.toString()) }); } if (firstRequest) { setFirstRequest(false) getUsers() } const paperStyle = { maxWidth: 1250, margin: "auto", color: "white", backgroundColor: theme.palette.surfaceColor, marginBottom: 10, padding: 20, } const changeModalData = (field, value) => { modalUser[field] = value } const setUser = (userId, field, value) => { const data = { "user_id": userId } data[field] = value console.log("DATA: ", data) fetch(globalUrl + "/api/v1/users/updateuser", { method: 'PUT', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, body: JSON.stringify(data), credentials: "include", }) .then((response) => { if (response.status !== 200) { console.log("Status not 200 for WORKFLOW EXECUTION :O!") } else { getUsers() } return response.json() }) .then((responseJson) => { if (!responseJson.success && responseJson.reason !== undefined) { alert.error("Failed setting user: " + responseJson.reason) } else { alert.success("Set the user field " + field + " to " + value) } }) .catch(error => { console.log(error) }); } const generateApikey = (userId) => { const data = { "user_id": userId } fetch(globalUrl + "/api/v1/generateapikey", { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, body: JSON.stringify(data), credentials: "include", }) .then((response) => { if (response.status !== 200) { console.log("Status not 200 for WORKFLOW EXECUTION :O!") } else { getUsers() } return response.json() }) .then((responseJson) => { console.log("RESP: ", responseJson) if (!responseJson.success && responseJson.reason !== undefined) { alert.error("Failed getting new: " + responseJson.reason) } else { alert.success("Got new API key") } }) .catch(error => { console.log(error) }); } const editAuthenticationModal = const editUserModal = const modalView = const usersView = curTab === 0 ?