aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmiliano Ciavatta2020-09-16 15:55:13 +0000
committerGitHub2020-09-16 15:55:13 +0000
commit53301d30b56e5c328baf73d3bc512dc3170e49ea (patch)
tree0c7336d9561fb22bc9ae32632ab147de371069a9
parent4f70dbfb5519ae2a6e68869ecba0a9e4cfb3013b (diff)
parent83a5fedb95ea211f3bd66ab94d87e82ee1cc51e3 (diff)
Merge pull request #15 from therealbobo/configuration-gui
Configuration gui
-rw-r--r--frontend/public/favicon.icobin3150 -> 34239 bytes
-rw-r--r--frontend/public/logo192.pngbin5347 -> 34239 bytes
-rw-r--r--frontend/public/logo512.pngbin9664 -> 34239 bytes
-rw-r--r--frontend/src/views/App.js25
-rw-r--r--frontend/src/views/Config.js248
-rw-r--r--frontend/src/views/Config.scss55
-rw-r--r--frontend/src/views/Header.js6
-rw-r--r--frontend/src/views/Services.js23
8 files changed, 346 insertions, 11 deletions
diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico
index bcd5dfd..1dc499d 100644
--- a/frontend/public/favicon.ico
+++ b/frontend/public/favicon.ico
Binary files differ
diff --git a/frontend/public/logo192.png b/frontend/public/logo192.png
index fc44b0a..1dc499d 100644
--- a/frontend/public/logo192.png
+++ b/frontend/public/logo192.png
Binary files differ
diff --git a/frontend/public/logo512.png b/frontend/public/logo512.png
index a4e47a6..1dc499d 100644
--- a/frontend/public/logo512.png
+++ b/frontend/public/logo512.png
Binary files differ
diff --git a/frontend/src/views/App.js b/frontend/src/views/App.js
index 6c101fa..5a2d913 100644
--- a/frontend/src/views/App.js
+++ b/frontend/src/views/App.js
@@ -6,6 +6,7 @@ import {BrowserRouter as Router, Route, Switch} from "react-router-dom";
import Services from "./Services";
import Filters from "./Filters";
import Rules from "./Rules";
+import Config from "./Config";
class App extends Component {
@@ -14,8 +15,21 @@ class App extends Component {
this.state = {
servicesWindowOpen: false,
filterWindowOpen: false,
- rulesWindowOpen: false
+ rulesWindowOpen: false,
+ configWindowOpen: false,
+ configDone: false
};
+
+ fetch('/api/services')
+ .then(response => {
+ if( response.status === 503){
+ this.setState({configWindowOpen: true});
+ } else if (response.status === 200){
+ this.setState({configDone: true});
+ }
+ });
+
+
}
render() {
@@ -29,13 +43,20 @@ class App extends Component {
if (this.state.rulesWindowOpen) {
modal = <Rules onHide={() => this.setState({rulesWindowOpen: false})}/>;
}
+ if (this.state.configWindowOpen) {
+ modal = <Config onHide={() => this.setState({configWindowOpen: false})}
+ onDone={() => this.setState({configDone: true})}/>;
+ }
return (
<div className="app">
<Router>
<Header onOpenServices={() => this.setState({servicesWindowOpen: true})}
onOpenFilters={() => this.setState({filterWindowOpen: true})}
- onOpenRules={() => this.setState({rulesWindowOpen: true})} />
+ onOpenRules={() => this.setState({rulesWindowOpen: true})}
+ onOpenConfig={() => this.setState({configWindowOpen: true})}
+ onConfigDone={this.state.configDone}
+ />
<Switch>
<Route path="/connections/:id" children={<MainPane/>}/>
<Route path="/" children={<MainPane/>}/>
diff --git a/frontend/src/views/Config.js b/frontend/src/views/Config.js
new file mode 100644
index 0000000..f5766eb
--- /dev/null
+++ b/frontend/src/views/Config.js
@@ -0,0 +1,248 @@
+import {
+ validateIpAddress,
+} from "../utils";
+import React, {Component, useState} from 'react';
+import './Config.scss';
+import {Button, ButtonGroup, ToggleButton, Col, Container, Form, FormControl, InputGroup, Modal, Row, Table} from "react-bootstrap";
+import {createCurlCommand} from '../utils';
+
+class Config extends Component {
+
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ server_address: "",
+ flag_regex: "",
+ auth_required: false,
+ accounts: {},
+ showSignup: false,
+ showConfig: true,
+ tmpUser:"",
+ tmpPass:"",
+ tmpConf:"",
+ errors:""
+ };
+
+ this.serverIpChanged = this.serverIpChanged.bind(this);
+ this.flagRegexChanged = this.flagRegexChanged.bind(this);
+ this.authRequiredChanged = this.authRequiredChanged.bind(this);
+ this.userChanged = this.userChanged.bind(this);
+ this.passwdChanged = this.passwdChanged.bind(this);
+ this.confirmChanged = this.confirmChanged.bind(this);
+ }
+
+ serverIpChanged(event) {
+ this.setState({server_address: event.target.value});
+ }
+
+ flagRegexChanged(event) {
+ this.setState({flag_regex: event.target.value});
+ }
+
+ authRequiredChanged() {
+ this.setState({auth_required: !this.value});
+ this.checked = !this.checked;
+ this.value = !this.value;
+ }
+
+ userChanged(event) {
+ this.setState({tmpUser: event.target.value});
+ }
+
+ passwdChanged(event) {
+ this.setState({tmpPass: event.target.value});
+ }
+
+ confirmChanged(event) {
+ this.setState({tmpConf: event.target.value});
+ }
+
+ setup() {
+ const requestOptions = {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ config: {
+ server_address: this.state.server_address,
+ flag_regex: this.state.flag_regex,
+ auth_required: this.state.auth_required,
+ },
+ accounts: this.state.accounts
+ })
+ };
+
+ let msg = "";
+
+ fetch('/setup', requestOptions)
+ .then(response => {
+ if (response.status === 202 ){
+ //this.setState({showConfig:false});
+ this.props.onHide();
+ this.props.onDone();
+ } else {
+ response.json().then(data => {
+ this.setState(
+ {errors : data.error.toString()}
+ );
+ });
+ }
+ }
+ );
+
+ }
+
+ signup(){
+ if (this.state.tmpPass === this.state.tmpConf){
+ const accounts = {...this.state.accounts};
+ accounts[this.state.tmpUser] = this.state.tmpPass;
+ this.setState({accounts});
+ console.log(this.state);
+ this.setState({showSignup:false,showConfig:true})
+ }
+ this.setState({tmpUser : ""});
+ this.setState({tmpPass : ""});
+ this.setState({tmpConf : ""});
+ }
+
+ render() {
+ let rows = Object.keys(this.state.accounts).map(u =>
+ <tr>
+ <td>{u}</td>
+ </tr>
+ );
+
+
+
+ return (
+ <>
+ <Modal show={this.state.showSignup} size="lg" aria-labelledby="services-dialog" centered >
+ <Modal.Header>
+ <Modal.Title id="services-dialog">
+ # passwd
+ </Modal.Title>
+ </Modal.Header>
+ <Modal.Body>
+ <Container>
+ <Row>
+ <Form id="passwd-form">
+ <Form.Group controlId="username">
+ <Form.Label>username:</Form.Label>
+ <Form.Control type="text" onChange={this.userChanged} value={this.state.tmpUser}/>
+ </Form.Group>
+
+ <Form.Group controlId="password">
+ <Form.Label>password:</Form.Label>
+ <Form.Control type="password" onChange={this.passwdChanged} value={this.state.tmpPass}/>
+ </Form.Group>
+
+ <Form.Group controlId="confirmPassword">
+ <Form.Label>confirm password:</Form.Label>
+ <Form.Control type="password" onChange={this.confirmChanged} value={this.state.tmpConf}/>
+ </Form.Group>
+
+
+ </Form>
+
+ </Row>
+
+ </Container>
+ </Modal.Body>
+ <Modal.Footer className="dialog-footer">
+ <Button variant="green" onClick={() => this.signup()}>signup</Button>
+ <Button variant="red" onClick={() => this.setState({showSignup:false,showConfig:true})}>close</Button>
+ </Modal.Footer>
+
+ </Modal>
+ <Modal
+ {...this.props}
+ show="true"
+ size="lg"
+ aria-labelledby="services-dialog"
+ centered
+ >
+ <Modal.Header>
+ <Modal.Title id="services-dialog">
+ ~/.config
+ </Modal.Title>
+ </Modal.Header>
+ <Modal.Body>
+ <div class="blink"><span><b>Warning:</b></span> once the configuration is completed, it cannot be changed unless you reset caronte :(</div>
+ <hr/>
+ <Container>
+ <Row>
+ <Col md={5}>
+
+ <ButtonGroup toggle className="mb-2">
+ <ToggleButton
+ type="checkbox"
+ variant="secondary"
+ checked={this.state.auth_required}
+ value={this.state.auth_required}
+ onChange={() => this.authRequiredChanged()}
+ >
+ Authentication
+ </ToggleButton>
+ </ButtonGroup>
+
+ <Table borderless size="sm" className="users-list">
+
+ <thead>
+ <tr>
+ <th>users</th>
+ </tr>
+ </thead>
+ <tbody>
+ {rows}
+ <tr> <td>
+ <Button size="sm" onClick={() => this.setState({showSignup:true,showConfig:false})}>new</Button>
+ </td> </tr>
+ </tbody>
+ </Table>
+
+
+
+ </Col>
+
+ <Col md={7}>
+
+ <Form>
+ <Form.Group controlId="server_address">
+ <Form.Label>server_address:</Form.Label>
+ <Form.Control type="text" onChange={this.serverIpChanged} value={this.state.server_address}/>
+ </Form.Group>
+
+ <Form.Group controlId="flag_regex">
+ <Form.Label>flag_regex:</Form.Label>
+ <Form.Control type="text" onChange={this.flagRegexChanged} value={this.state.flag_regex}/>
+ </Form.Group>
+
+ </Form>
+
+ </Col>
+
+ </Row>
+ <Row>
+ <div class="error">
+ <b>
+ {this.state.errors
+ .split('\n').map((item, key) => {
+ return <span key={key}>{item}<br/></span>})
+ }
+ </b>
+ </div>
+ </Row>
+
+ </Container>
+ </Modal.Body>
+ <Modal.Footer className="dialog-footer">
+ <Button variant="green" onClick={() => this.setup()}>set</Button>
+ <Button variant="red" onClick={this.props.onHide}>close</Button>
+ </Modal.Footer>
+ </Modal>
+ </>
+ );
+ }
+}
+
+export default Config;
diff --git a/frontend/src/views/Config.scss b/frontend/src/views/Config.scss
new file mode 100644
index 0000000..331d7a7
--- /dev/null
+++ b/frontend/src/views/Config.scss
@@ -0,0 +1,55 @@
+@import '../colors.scss';
+
+.curl-output {
+ width: 100%;
+ font-size: 13px;
+}
+
+#passwd-form {
+ margin:auto;
+}
+
+.users-list {
+ .btn {
+ width: 70px;
+ }
+
+ td {
+ background-color: $color-primary-2;
+ border-top: 2px solid $color-primary-0;
+ vertical-align: middle;
+ text-align: center;
+ }
+
+ th {
+ background-color: $color-primary-1;
+ text-align: center;
+ }
+}
+
+.btn-color {
+ border: 3px solid #fff;
+}
+
+.dialog-footer {
+ .btn {
+ width: 80px;
+ }
+}
+
+.blink{
+
+ span{
+ animation: blink 1s linear infinite;
+ }
+ @keyframes blink{
+ 0%{opacity: 0;}
+ 50%{opacity: .5;}
+ 100%{opacity: 1;}
+ }
+
+}
+
+.error{
+ color: red;
+}
diff --git a/frontend/src/views/Header.js b/frontend/src/views/Header.js
index 5d0f690..3f95bcd 100644
--- a/frontend/src/views/Header.js
+++ b/frontend/src/views/Header.js
@@ -72,9 +72,9 @@ class Header extends Component {
<Button onClick={this.props.onOpenFilters}>filters</Button>
<Button variant="yellow" size="sm">pcaps</Button>
<Button variant="blue" onClick={this.props.onOpenRules}>rules</Button>
- <Button variant="red" onClick={this.props.onOpenServices}>
- services
- </Button>
+ <Button variant="red" onClick={this.props.onOpenServices}>services</Button>
+ <Button variant="green" onClick={this.props.onOpenConfig}
+ disabled={this.props.onConfigDone}>config</Button>
</div>
</div>
</div>
diff --git a/frontend/src/views/Services.js b/frontend/src/views/Services.js
index b95b01c..0de021f 100644
--- a/frontend/src/views/Services.js
+++ b/frontend/src/views/Services.js
@@ -64,12 +64,23 @@ class Services extends Component {
saveService() {
if (this.state.portValid && this.state.nameValid) {
- axios.put("/api/services", {
- name: this.state.name,
- port: this.state.port,
- color: this.state.color,
- notes: this.state.notes
- });
+ const requestOptions = {
+ method: 'PUT',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ color: this.state.color,
+ name: this.state.name,
+ notes: this.state.notes,
+ port: this.state.port,
+ })
+ };
+
+
+ fetch('/api/services', requestOptions)
+ .then(function(response){
+ console.log(response);
+ }
+ );
this.newService();
this.loadServices();