From c5744a6785201a7859e701e7925f23013ff61aff Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Thu, 31 Jan 2019 15:53:43 +0000
Subject: [PATCH] Repo config...

---
 borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/FilesystemBrowserRest.java |   41 ++++++++++++--------
 borgbutler-webapp/src/components/views/repos/ConfigureRepoPage.jsx                             |   79 +++++++++++++++++++++++++++++++++------
 2 files changed, 91 insertions(+), 29 deletions(-)

diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/FilesystemBrowserRest.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/FilesystemBrowserRest.java
index 150e913..3e93121 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/FilesystemBrowserRest.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/FilesystemBrowserRest.java
@@ -35,13 +35,11 @@
             log.info(msg);
             return msg;
         }
-        JFileChooser chooser;
-        if (StringUtils.isNotBlank(current)) {
-            chooser = new JFileChooser(current);
-        } else {
-            chooser = new JFileChooser();
+        if (chooser != null) {
+            log.warn("Cannot call already opened file choose twice. Close file chooser first.");
+            return "{\"directory\": \"\"}";
         }
-        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+        File file = null;
         synchronized (FilesystemBrowserRest.class) {
             if (frame == null) {
                 frame = new JFrame("BorgButler");
@@ -50,18 +48,28 @@
                 frame.getContentPane().add(label);
                 frame.pack();
             }
-        }
-        frame.setVisible(true);
-        frame.setAlwaysOnTop(true);
-        int returnCode = chooser.showDialog(frame, "Choose");
-        frame.setVisible(false);
-        frame.setAlwaysOnTop(false);
-        File file = null;
-        if (returnCode == JFileChooser.APPROVE_OPTION) {
-            file = chooser.getSelectedFile();
+            try {
+                if (StringUtils.isNotBlank(current)) {
+                    chooser = new JFileChooser(current);
+                } else {
+                    chooser = new JFileChooser();
+                }
+                chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+
+                frame.setVisible(true);
+                frame.setAlwaysOnTop(true);
+                int returnCode = chooser.showDialog(frame, "Choose");
+                frame.setVisible(false);
+                frame.setAlwaysOnTop(false);
+                if (returnCode == JFileChooser.APPROVE_OPTION) {
+                    file = chooser.getSelectedFile();
+                }
+            } finally {
+                chooser = null;
+            }
         }
         String filename = file != null ? JsonUtils.toJson(file.getAbsolutePath()) : "";
-        String result = "{\"directory\":" + filename + "}";
+        String result = "{\"directory\":\"" + filename + "\"}";
         return result;
     }
 
@@ -81,4 +89,5 @@
     }
 
     private static JFrame frame;
+    private static JFileChooser chooser;
 }
diff --git a/borgbutler-webapp/src/components/views/repos/ConfigureRepoPage.jsx b/borgbutler-webapp/src/components/views/repos/ConfigureRepoPage.jsx
index 2bbe2ee..0aeddb0 100644
--- a/borgbutler-webapp/src/components/views/repos/ConfigureRepoPage.jsx
+++ b/borgbutler-webapp/src/components/views/repos/ConfigureRepoPage.jsx
@@ -1,5 +1,6 @@
 import React from 'react';
 import {Link} from 'react-router-dom'
+import {Alert} from 'reactstrap';
 import {
     FormButton,
     FormField,
@@ -12,6 +13,7 @@
     FormSelect
 } from '../../general/forms/FormComponents';
 import I18n from "../../general/translation/I18n";
+import {getRestServiceUrl} from "../../../utilities/global";
 import {PageHeader} from "../../general/BootstrapComponents";
 
 class ConfigureRepoPage extends React.Component {
@@ -22,10 +24,11 @@
         this.handleRepoTextChange = this.handleRepoTextChange.bind(this);
         this.handleCheckboxChange = this.handleCheckboxChange.bind(this);
         this.state = {
-            repoConfig: {},
+            repoConfig: {
+                encryption: 'repoKey'
+            },
             mode: 'existingRepo',
             localRemote: 'local',
-            encryption: 'repokey',
             passwordMethod: 'passwordCommand',
             passwordCreate: null
         };
@@ -101,6 +104,28 @@
         }*/
     }
 
+    browseDirectory = () => {
+        const current = "&current=" + encodeURIComponent(this.state.repoConfig.repo);
+        fetch(getRestServiceUrl("files/browse-local-filesystem?type=dir" + current), {
+            method: "GET",
+            dataType: "JSON",
+            headers: {
+                "Content-Type": "text/plain; charset=utf-8",
+            }
+        })
+            .then((resp) => {
+                return resp.json()
+            })
+            .then((data) => {
+                if (data.directory) {
+                    this.setState({repoConfig: {...this.state.repoConfig, repo: data.directory}});
+                }
+            })
+            .catch((error) => {
+                console.log(error, "Oups, what's happened?")
+            })
+    }
+
     render() {
         const repoConfig = this.state.repoConfig;
         var passwordMethods = [['password-command', 'Password command'],
@@ -108,7 +133,8 @@
             ['macos-keychain', 'Mac OS X keychain'],
             ['gnome-keyring', 'GNOME keyring'],
             ['kwallet', 'KWallet'],
-            ['passphrase', 'Passphrase (not recommended)']
+            ['passphrase', 'Passphrase (not recommended)'],
+            ['none', 'No password (no encryption, not recommended)']
         ];
         let repoPlaceHolder = 'Enter the repo used by Borg.';
         if (this.state.mode === 'initNewRepo' && this.state.localRemote === 'remote') {
@@ -118,10 +144,15 @@
         let browseButton = null;
         if (this.state.localRemote === 'local') {
             repoFieldLength = 9;
-            browseButton = <FormButton onClick={null}
-                                       hint={'Browse local backup directory.'}>Browse</FormButton>
+            browseButton = <FormButton onClick={this.browseDirectory}
+                                       hint={'Browse local backup directory.'}><I18n name={'common.browse'}/>
+            </FormButton>;
             repoPlaceHolder = 'Enter or browse the local path of the repo home dir used by Borg.';
         }
+        let encrypted = true;
+        if (this.state.repoConfig.encryption === 'none' || this.state.passwordMethod === 'none') {
+            encrypted = false;
+        }
         return <React.Fragment>
             <PageHeader>
                 Configure repository
@@ -179,7 +210,7 @@
                                      className={this.state.localRemote === 'local' ? 'hidden' : null}/>
                 <FormGroup className={this.state.mode === 'existingRepo' ? 'hidden' : null}>
                     <FormLabel length={2}>{'Encryption'}</FormLabel>
-                    <FormField length={2}>
+                    <FormField length={4}>
                         <FormSelect
                             value={repoConfig.encryption}
                             name={'encryption'}
@@ -193,9 +224,11 @@
                         </FormSelect>
                     </FormField>
                 </FormGroup>
-                <FormGroup>
+                <FormGroup
+                    className={this.state.repoConfig.encryption === 'none' ? 'hidden' : null}
+                >
                     <FormLabel length={2}>{'Password method'}</FormLabel>
-                    <FormField length={3}>
+                    <FormField length={4}>
                         <FormSelect
                             value={this.state.passwordMethod}
                             name={'passwordMethod'}
@@ -217,14 +250,37 @@
                                      name={'passwordCommand'} value={repoConfig.passwordCommand}
                                      onChange={this.handleRepoTextChange}
                                      placeholder="Enter the password command to get the command from or choose a method above."
-                                     className={this.state.passwordMethod === 'passphrase' ? 'hidden' : null}
+                                     className={!encrypted || this.state.passwordMethod === 'passphrase' ? 'hidden' : null}
                 />
                 <FormLabelInputField label={'Password'} fieldLength={6} type={'password'}
                                      name={'passphrase'} value={repoConfig.passphrase}
                                      onChange={this.handleRepoTextChange}
                                      hint={"It's recommended to use password command instead."}
-                                     className={this.state.passwordMethod !== 'passphrase' ? 'hidden' : null}
+                                     className={(!encrypted || this.state.passwordMethod !== 'passphrase') ? 'hidden' : null}
                 />
+                <FormGroup className={!encrypted ? 'hidden' : null}>
+                    <FormField length={2}>
+                    </FormField>
+                    <FormField length={10}>
+                        <Alert
+                            color={'warning'}
+                        >
+                            Please keep a copy of your password safe! If your password get lost, your backup might be
+                            lost!
+                        </Alert>
+                    </FormField>
+                </FormGroup>
+                <FormGroup className={encrypted ? 'hidden' : null}>
+                    <FormField length={2}>
+                    </FormField>
+                    <FormField length={10}>
+                        <Alert
+                            color={'danger'}
+                        >
+                            You backup isn't encrpyted! You should ensure, that your destination storage is encrypted and protected.
+                        </Alert>
+                    </FormField>
+                </FormGroup>
                 <FormField length={12}>
                     <Link to={'/repos'} className={'btn btn-outline-primary'}><I18n name={'common.cancel'}/>
                     </Link>
@@ -238,9 +294,6 @@
                 <ul>
                     <li>Implement 'Save' button ;-)</li>
                     <li>Add own environment variables.</li>
-                    <li>Implement browse button for local repos.</li>
-                    <li>Note (for new backups): Save your password, otherwise your backup will be lost without!</li>
-                    <li>Note (hide password fields): Your backup will not be encrypted!</li>
                     <li>Remove and clone repo.</li>
                 </ul>
             </code>

--
Gitblit v1.10.0