import React, { createRef } from "react"; import ReactCSSTransitionGroup from "react-addons-css-transition-group"; import { Input, Button, Icon, NgIf, Loader } from "../../components/"; import { Config, Admin } from "../../model/"; import { notify, FormObjToJSON, alert, objectGet } from "../../helpers"; import { bcrypt_password } from "../../helpers/bcrypt"; 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.general.host = location.host; 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 = (