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 =