diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/BriarService.java b/briar-headless/src/main/java/org/briarproject/briar/headless/BriarService.java new file mode 100644 index 000000000..abfa21996 --- /dev/null +++ b/briar-headless/src/main/java/org/briarproject/briar/headless/BriarService.java @@ -0,0 +1,105 @@ +package org.briarproject.briar.headless; + +import org.briarproject.bramble.api.account.AccountManager; +import org.briarproject.bramble.api.lifecycle.LifecycleManager; +import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; + +import java.io.Console; +import java.util.Scanner; +import java.util.logging.Logger; + +import javax.annotation.ParametersAreNonnullByDefault; +import javax.inject.Inject; + +import static java.lang.System.console; +import static java.lang.System.err; +import static java.lang.System.exit; +import static java.lang.System.out; +import static java.util.logging.Logger.getLogger; +import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH; + +@MethodsNotNullByDefault +@ParametersAreNonnullByDefault +public class BriarService { + + private final static Logger LOG = getLogger(BriarService.class.getName()); + + private final AccountManager accountManager; + private final LifecycleManager lifecycleManager; + + @Inject + public BriarService(AccountManager accountManager, + LifecycleManager lifecycleManager) { + this.accountManager = accountManager; + this.lifecycleManager = lifecycleManager; + } + + public void start() { + Console console = console(); + out.println("Welcome to Briar!\n"); + + if (!accountManager.accountExists()) { + if (console == null) { + LOG.warning("No account found."); + LOG.warning("Please start in terminal to set one up."); + exit(1); + } + console.printf("No account found. Let's create one!\n\n"); + String nickname = createNickname(console); + String password = createPassword(console); + accountManager.createAccount(nickname, password); + } else { + out.print("Password: "); + String password; + if (console == null) { + Scanner scanner = new Scanner(System.in); + password = scanner.nextLine(); + } else { + password = new String(console.readPassword()); + } + if (!accountManager.signIn(password)) { + err.println("Error: Password invalid"); + exit(1); + } + } + assert accountManager.getDatabaseKey() != null; + + lifecycleManager.startServices(accountManager.getDatabaseKey()); + } + + private String createNickname(Console console) { + String nickname; + boolean error; + do { + nickname = console.readLine("Nickname: "); + if (nickname.length() == 0) { + console.printf("Please enter a nickname!\n"); + error = true; + } else if (nickname.length() > MAX_AUTHOR_NAME_LENGTH) { + console.printf("Please choose a shorter nickname!\n"); + error = true; + } else { + error = false; + } + } while (error); + return nickname; + } + + private String createPassword(Console console) { + String password; + boolean error; + do { + password = new String(console.readPassword("Password: ")); + if (password.length() < 4) { + console.printf( + "Please enter a password with at least 4 characters!\n"); + error = true; + // TODO enforce stronger password + } else { + error = false; + } + } while (error); + return password; + } + +} diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/Router.java b/briar-headless/src/main/java/org/briarproject/briar/headless/Router.java index 41f4b4d8b..8975175af 100644 --- a/briar-headless/src/main/java/org/briarproject/briar/headless/Router.java +++ b/briar-headless/src/main/java/org/briarproject/briar/headless/Router.java @@ -1,8 +1,5 @@ package org.briarproject.briar.headless; -import org.briarproject.bramble.api.account.AccountManager; -import org.briarproject.bramble.api.lifecycle.LifecycleManager; - import javax.inject.Inject; import javax.inject.Singleton; @@ -11,28 +8,17 @@ import io.javalin.Javalin; @Singleton public class Router { - private final AccountManager accountManager; - private final LifecycleManager lifecycleManager; + private final BriarService briarService; private final ForumController forumController; @Inject - public Router(AccountManager accountManager, - LifecycleManager lifecycleManager, - ForumController forumController) { - this.accountManager = accountManager; - this.lifecycleManager = lifecycleManager; + public Router(BriarService briarService, ForumController forumController) { + this.briarService = briarService; this.forumController = forumController; } public void start() { - if (accountManager.accountExists()) { - accountManager.signIn("test"); - } else { - accountManager.createAccount("test", "test"); - } - assert accountManager.getDatabaseKey() != null; - - lifecycleManager.startServices(accountManager.getDatabaseKey()); + briarService.start(); Javalin app = Javalin.create() .port(7000)