import React, { createRef } from "react";
import { Input, Button, Container, Icon, NgIf, Loader, CSSTransition } from "../../components/";
import { Config, Admin } from "../../model/";
import { notify, FormObjToJSON, alert, prompt } from "../../helpers";
import { bcrypt_password } from "../../helpers/bcrypt";
//import ReactCSSTransitionGroup from "react-addons-css-transition-group";
import "./setup.scss";
export class SetupPage extends React.Component {
constructor(props){
super(props);
this.state = {
busy: false,
};
}
componentDidMount() {
const start = (e) => {
e.preventDefault();
this.props.history.push("/");
};
Config.all().then((config) => {
if(config.log.telemetry.value === true) return;
this.unlisten = this.props.history.listen((location, action) => {
this.unlisten();
alert.now((
Help making this software better by sending crash reports and anonymous usage statistics
));
});
});
}
onAdminPassword(p, done){
this.setState({busy: true});
Config.all().then((config) => {
return bcrypt_password(p).then((hash) => {
config = FormObjToJSON(config);
config.connections = window.CONFIG.connections;
config.auth.admin = hash;
Config.save(config, false)
.then(() => Admin.login(p))
.then(() => this.setState({busy: false}, done))
.catch((err) => {
this.setState({busy: false});
notify.send(err && err.message, "error");
});
}).catch((err) => {
this.setState({busy: false});
notify.send("Hash error: " + JSON.stringify(err), "error");
});
}).catch((err) => {
notify.send(err && err.message, "error");
this.setState({busy: false});
});
}
enableLog(value){
Config.all().then((config) => {
config = FormObjToJSON(config);
config.connections = window.CONFIG.connections;
config.log.telemetry = value;
Config.save(config, false);
});
};
summaryCall(){
this.setState({busy: true});
return Config.all().then((config) => {
this.setState({busy: false});
return [
{
"name_success": "SSL is configured properly",
"name_failure": "SSL is not configured properly",
"pass": window.location.protocol !== "http:",
"severe": true,
"message": "This can lead to data leaks. Please use a SSL certificate"
}, {
"name_success": "Application is running as '" + objectGet(config, ["constant", "user", "value"]) + "'",
"name_failure": "Application is running as root",
"pass": objectGet(config, ["constant", "user", "value"]) !== "root",
"severe": true,
"message": "This is dangerous, you should use another user with less privileges"
}, {
"name_success": "Emacs is installed",
"name_failure": "Emacs is not installed",
"pass": objectGet(config, ["constant", "emacs", "value"]),
"severe": false,
"message": "If you want to use all the org-mode features of Filestash, you need to install emacs"
}, {
"name_success": "Pdftotext is installed",
"name_failure": "Pdftotext is not installed",
"pass": objectGet(config, ["constant", "pdftotext", "value"]),
"severe": false,
"message": "You won't be able to search through PDF documents without it"
}
];
}).catch((err) => {
notify.send(err && err.message, "error");
this.setState({busy: false});
});
}
render(){
return (
);
}
}
class MultiStepForm extends React.Component {
constructor(props){
super(props);
this.state = {
current: parseInt(window.location.hash.replace("#", "")) || 0,
answer_password: "",
has_answered_password: false,
deps: []
};
this.$input = createRef()
}
componentDidMount(){
if(this.state.current === 1){
this.props.summaryCall().then((deps) => {
this.setState({deps: deps});
});
}
}
onAdminPassword(e){
e.preventDefault();
this.props.onAdminPassword(this.state.answer_password, () => {
this.setState({has_answered_password: true});
this.onStepChange(1);
});
}
onStepChange(n){
this.setState({current: n}, () => {
if(n === 1) this.componentDidMount();
});
}
render() {
const hideMenu = ;
if(this.state.current === 0) {
return (
Admin Password
Create your instance admin password:
{hideMenu}
);
} else if(this.state.current === 1) {
return (
Summary
Verifying
{
this.state.deps.map((dep, idx) => {
return (
{dep.pass ? dep.name_success : dep.name_failure}{dep.pass ? null : ": " + dep.message}
);
})
}
);
}
return null;
}
}
const FormStage = (props) => {
return (
{ props.navleft === true ? props.onStepChange(props.current - 1)}/> : null}
{ props.children }
{ props.navright === true ? props.onStepChange(props.current + 1)}/> : null }
);
};
function objectGet(obj, paths){
let value = obj;
for(let i=0; i