Skip to content
Snippets Groups Projects
Commit 9bf1e035 authored by Nico's avatar Nico
Browse files

Clean up even more

parent c949f8f1
No related branches found
No related tags found
No related merge requests found
Showing
with 313 additions and 109 deletions
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="Briar Desktop" type="JetRunConfigurationType"> <configuration default="false" name="Briar Desktop" type="JetRunConfigurationType">
<option name="MAIN_CLASS_NAME" value="org.briarproject.briar.compose.MainKt" /> <option name="MAIN_CLASS_NAME" value="org.briarproject.briar.desktop.MainKt" />
<module name="briar-desktop.main" /> <module name="briar-desktop.main" />
<option name="PROGRAM_PARAMETERS" value="--debug" />
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>
......
...@@ -3,9 +3,9 @@ import org.jetbrains.compose.desktop.application.dsl.TargetFormat ...@@ -3,9 +3,9 @@ import org.jetbrains.compose.desktop.application.dsl.TargetFormat
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins { plugins {
kotlin("jvm") version "1.4.30" kotlin("jvm") version "1.5.10"
kotlin("kapt") version "1.3.72" kotlin("kapt") version "1.3.72"
id("org.jetbrains.compose") version "0.3.1" id("org.jetbrains.compose") version "0.4.0"
id("java") id("java")
id("idea") id("idea")
} }
...@@ -20,13 +20,18 @@ repositories { ...@@ -20,13 +20,18 @@ repositories {
} }
dependencies { dependencies {
testImplementation(kotlin("test-testng"))
implementation(compose.desktop.currentOs) implementation(compose.desktop.currentOs)
implementation("com.fasterxml.jackson.core:jackson-databind:2.10.0") implementation("com.fasterxml.jackson.core:jackson-databind:2.10.0")
implementation("com.github.ajalt:clikt:2.2.0")
implementation(project(path = ":briar:briar-core", configuration = "default")) implementation(project(path = ":briar:briar-core", configuration = "default"))
implementation(project(path = ":briar:bramble-java", configuration = "default")) implementation(project(path = ":briar:bramble-java", configuration = "default"))
val daggerVersion = "2.24" val daggerVersion = "2.24"
kapt("com.google.dagger:dagger-compiler:$daggerVersion") kapt("com.google.dagger:dagger-compiler:$daggerVersion")
testImplementation(kotlin("test-testng"))
} }
tasks.test { tasks.test {
......
package org.briarproject.briar.compose
import org.briarproject.bramble.BrambleCoreEagerSingletons
import org.briarproject.briar.BriarCoreEagerSingletons
import java.io.File
import java.io.File.separator
import java.io.IOException
import java.lang.System.getProperty
import java.nio.file.Files.setPosixFilePermissions
import java.nio.file.attribute.PosixFilePermission
import java.util.logging.Level
import java.util.logging.LogManager
fun main() {
LogManager.getLogManager().getLogger("").level = Level.INFO
val dataDir = getDataDir()
val app =
DaggerBriarSwingApp.builder().swingModule(
SwingModule(
dataDir
)
).build()
// We need to load the eager singletons directly after making the
// dependency graphs
BrambleCoreEagerSingletons.Helper.injectEagerSingletons(app)
BriarCoreEagerSingletons.Helper.injectEagerSingletons(app)
app.getUI().startBriar()
app.getUI().startUI()
}
private fun getDataDir(): File {
val file = File(getProperty("user.home") + separator + ".briar")
if (!file.exists() && !file.mkdirs()) {
throw IOException("Could not create directory: ${file.absolutePath}")
} else if (!file.isDirectory) {
throw IOException("Data dir is not a directory: ${file.absolutePath}")
}
val perms = HashSet<PosixFilePermission>()
perms.add(PosixFilePermission.OWNER_READ)
perms.add(PosixFilePermission.OWNER_WRITE)
perms.add(PosixFilePermission.OWNER_EXECUTE)
setPosixFilePermissions(file.toPath(), perms)
return file
}
\ No newline at end of file
package org.briarproject.briar.compose package org.briarproject.briar.desktop
import dagger.Component import dagger.Component
import org.briarproject.bramble.BrambleCoreEagerSingletons import org.briarproject.bramble.BrambleCoreEagerSingletons
...@@ -12,11 +12,11 @@ import javax.inject.Singleton ...@@ -12,11 +12,11 @@ import javax.inject.Singleton
modules = [ modules = [
BrambleCoreModule::class, BrambleCoreModule::class,
BriarCoreModule::class, BriarCoreModule::class,
SwingModule::class DesktopModule::class
] ]
) )
@Singleton @Singleton
internal interface BriarSwingApp : BrambleCoreEagerSingletons, BriarCoreEagerSingletons { internal interface BriarDesktopApp : BrambleCoreEagerSingletons, BriarCoreEagerSingletons {
fun getUI(): UI fun getUI(): UI
......
package org.briarproject.briar.compose package org.briarproject.briar.desktop
import org.briarproject.bramble.api.account.AccountManager import org.briarproject.bramble.api.account.AccountManager
import org.briarproject.bramble.api.crypto.DecryptionException
import org.briarproject.bramble.api.crypto.PasswordStrengthEstimator import org.briarproject.bramble.api.crypto.PasswordStrengthEstimator
import org.briarproject.bramble.api.lifecycle.LifecycleManager import org.briarproject.bramble.api.lifecycle.LifecycleManager
import org.briarproject.briar.desktop.dialogs.Login
import org.briarproject.briar.desktop.dialogs.Registration
import javax.annotation.concurrent.Immutable import javax.annotation.concurrent.Immutable
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
import javax.swing.JOptionPane
interface BriarService { interface BriarService {
fun start() fun start()
...@@ -26,29 +26,10 @@ constructor( ...@@ -26,29 +26,10 @@ constructor(
override fun start() { override fun start() {
if (!accountManager.accountExists()) { if (!accountManager.accountExists()) {
createAccount(); createAccount()
} else { } else {
while (true) { login()
// val password = PasswordPrompt.promptForPassword();
// if (!password.isValid) {
// // this happens when dismissing the dialog or clicking 'cancel'
// exitProcess(1)
// }
val password = "sdifjasdjhfksjadf"
try {
accountManager.signIn(password)
break
} catch (e: DecryptionException) {
JOptionPane.showMessageDialog(
null, "Wrong password",
"Error", JOptionPane.ERROR_MESSAGE
)
}
}
} }
val dbKey = accountManager.databaseKey ?: throw AssertionError()
lifecycleManager.startServices(dbKey)
lifecycleManager.waitForStartup()
} }
override fun stop() { override fun stop() {
...@@ -57,19 +38,11 @@ constructor( ...@@ -57,19 +38,11 @@ constructor(
} }
private fun createAccount() { private fun createAccount() {
// echo("No account found. Let's create one!\n\n") print("No account found. Let's create one!\n\n")
// val result = NewAccountPrompt.promptForDetails(); Registration("Briar", accountManager, lifecycleManager)
// if (!result.isValid) {
// echo("Error: Please enter a username and password")
// exitProcess(1)
// }
// try {
// check(passwordStrengthEstimator, result)
// } catch (e: UsageError) {
// return;
// }
accountManager.createAccount("Nico", "sdifjasdjhfksjadf")
} }
private fun login() {
Login("Briar", accountManager, lifecycleManager)
}
} }
package org.briarproject.briar.compose package org.briarproject.briar.desktop
import org.briarproject.bramble.api.crypto.KeyStrengthener import org.briarproject.bramble.api.crypto.KeyStrengthener
import org.briarproject.bramble.api.db.DatabaseConfig import org.briarproject.bramble.api.db.DatabaseConfig
import java.io.File import java.io.File
internal class SwingDatabaseConfig(private val dbDir: File, private val keyDir: File) : internal class DesktopDatabaseConfig(private val dbDir: File, private val keyDir: File) :
DatabaseConfig { DatabaseConfig {
override fun getDatabaseDirectory() = dbDir override fun getDatabaseDirectory() = dbDir
......
package org.briarproject.briar.compose package org.briarproject.briar.desktop
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.ObjectMapper
import dagger.Module import dagger.Module
...@@ -41,7 +41,7 @@ import javax.inject.Singleton ...@@ -41,7 +41,7 @@ import javax.inject.Singleton
SocksModule::class SocksModule::class
] ]
) )
internal class SwingModule(private val appDir: File) { internal class DesktopModule(private val appDir: File) {
@Provides @Provides
@Singleton @Singleton
...@@ -52,7 +52,7 @@ internal class SwingModule(private val appDir: File) { ...@@ -52,7 +52,7 @@ internal class SwingModule(private val appDir: File) {
internal fun provideDatabaseConfig(): DatabaseConfig { internal fun provideDatabaseConfig(): DatabaseConfig {
val dbDir = File(appDir, "db") val dbDir = File(appDir, "db")
val keyDir = File(appDir, "key") val keyDir = File(appDir, "key")
return SwingDatabaseConfig(dbDir, keyDir) return DesktopDatabaseConfig(dbDir, keyDir)
} }
@Provides @Provides
......
package org.briarproject.briar.desktop
import com.github.ajalt.clikt.core.CliktCommand
import com.github.ajalt.clikt.parameters.options.counted
import com.github.ajalt.clikt.parameters.options.default
import com.github.ajalt.clikt.parameters.options.flag
import com.github.ajalt.clikt.parameters.options.option
import org.briarproject.bramble.BrambleCoreEagerSingletons
import org.briarproject.briar.BriarCoreEagerSingletons
import java.io.File
import java.io.File.separator
import java.io.IOException
import java.lang.System.getProperty
import java.nio.file.Files.setPosixFilePermissions
import java.nio.file.attribute.PosixFilePermission
import java.nio.file.attribute.PosixFilePermission.*
import java.util.logging.Level.*
import java.util.logging.LogManager
private val DEFAULT_DATA_DIR = getProperty("user.home") + separator + ".briar"
private class Main : CliktCommand(
name = "briar-desktop",
help = "Briar Desktop Client"
) {
private val debug by option("--debug", "-d", help = "Enable printing of debug messages").flag(
default = false
)
private val verbosity by option(
"--verbose",
"-v",
help = "Print verbose log messages"
).counted()
private val dataDir by option(
"--data-dir",
help = "The directory where Briar will store its files. Default: $DEFAULT_DATA_DIR",
metavar = "PATH",
envvar = "BRIAR_DATA_DIR"
).default(DEFAULT_DATA_DIR)
override fun run() {
val level = if (debug) ALL else when (verbosity) {
0 -> WARNING
1 -> INFO
else -> ALL
}
LogManager.getLogManager().getLogger("").level = level
val dataDir = getDataDir()
val app =
DaggerBriarDesktopApp.builder().desktopModule(
DesktopModule(dataDir)
).build()
// We need to load the eager singletons directly after making the
// dependency graphs
BrambleCoreEagerSingletons.Helper.injectEagerSingletons(app)
BriarCoreEagerSingletons.Helper.injectEagerSingletons(app)
app.getUI().startBriar()
app.getUI().startUI()
}
private fun getDataDir(): File {
val file = File(dataDir)
if (!file.exists() && !file.mkdirs()) {
throw IOException("Could not create directory: ${file.absolutePath}")
} else if (!file.isDirectory) {
throw IOException("Data dir is not a directory: ${file.absolutePath}")
}
val perms = HashSet<PosixFilePermission>()
perms.add(OWNER_READ)
perms.add(OWNER_WRITE)
perms.add(OWNER_EXECUTE)
setPosixFilePermissions(file.toPath(), perms)
return file
}
}
fun main(args: Array<String>) = Main().main(args)
\ No newline at end of file
package org.briarproject.briar.desktop
import org.briarproject.bramble.api.account.AccountManager
import org.briarproject.bramble.api.contact.ContactManager
import org.briarproject.bramble.api.crypto.PasswordStrengthEstimator
import org.briarproject.bramble.api.event.EventBus
import org.briarproject.briar.api.conversation.ConversationManager
import org.briarproject.briar.api.introduction.IntroductionManager
import org.briarproject.briar.api.messaging.MessagingManager
import org.briarproject.briar.api.messaging.PrivateMessageFactory
class MainUI(
private val briarService: BriarService,
val accountManager: AccountManager,
val contactManager: ContactManager,
private val conversationManager: ConversationManager,
private val messagingManager: MessagingManager,
private val introductionManager: IntroductionManager,
private val privateMessageFactory: PrivateMessageFactory,
private val eventBus: EventBus,
val passwordStrengthEstimator: PasswordStrengthEstimator
) {
init {
// Should be shown only when logged in
// val title = "Briar Desktop"
// Window (title = title) {
// Column(
// modifier = Modifier.padding(16.dp).fillMaxSize(),
// verticalArrangement = Arrangement.Center,
// horizontalAlignment = Alignment.CenterHorizontally
// ) {
// Text("Welcome to Briar")
// }
// }
}
}
package org.briarproject.briar.compose package org.briarproject.briar.desktop
import androidx.compose.desktop.Window
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.svgResource
import androidx.compose.ui.unit.dp
import org.briarproject.bramble.api.account.AccountManager import org.briarproject.bramble.api.account.AccountManager
import org.briarproject.bramble.api.contact.ContactManager import org.briarproject.bramble.api.contact.ContactManager
import org.briarproject.bramble.api.crypto.PasswordStrengthEstimator import org.briarproject.bramble.api.crypto.PasswordStrengthEstimator
...@@ -41,54 +30,27 @@ constructor( ...@@ -41,54 +30,27 @@ constructor(
) { ) {
private val logger = getLogger(UI::javaClass.name) private val logger = getLogger(UI::javaClass.name)
// private val configuration = Configuration()
internal fun startBriar() { internal fun startBriar() {
briarService.start(); briarService.start();
} }
internal fun startUI() { internal fun startUI() {
Window { MainUI(
Column( briarService,
modifier = Modifier.padding(16.dp) accountManager,
) { contactManager,
TheImage() conversationManager,
Spacer(Modifier.height(32.dp)) messagingManager,
TheText() introductionManager,
TheButton() privateMessageFactory,
} eventBus,
} passwordStrengthEstimator
)
} }
internal fun getContactManager(): ContactManager { internal fun getContactManager(): ContactManager {
return contactManager return contactManager
} }
} }
\ No newline at end of file
@Composable
private fun TheButton() {
var text by remember { mutableStateOf("Start chatting") }
Button(onClick = {
text = "Sorry, not yet available"
}) {
Text(text)
}
}
@Composable
private fun TheImage() {
Image(
painter = svgResource("images/logo_circle.svg"),
contentDescription = "Briar logo",
modifier = Modifier
.fillMaxWidth()
.clip(shape = RoundedCornerShape(400.dp))
)
}
@Composable
private fun TheText() {
Text("Welcome to Briar")
}
package org.briarproject.briar.desktop.dialogs
import androidx.compose.desktop.Window
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Button
import androidx.compose.material.OutlinedTextField
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.svgResource
import androidx.compose.ui.unit.dp
import org.briarproject.bramble.api.account.AccountManager
import org.briarproject.bramble.api.lifecycle.LifecycleManager
// TODO: Error handling
fun Login(title: String, accountManager: AccountManager, lifecycleManager: LifecycleManager) =
Window(title = title) {
Column(
modifier = Modifier.padding(16.dp).fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
TheImage()
Spacer(Modifier.height(32.dp))
TheTextField(accountManager, lifecycleManager)
}
}
@Composable
private fun TheImage() {
Image(
painter = svgResource("images/logo_circle.svg"),
contentDescription = "Briar logo",
modifier = Modifier
.fillMaxWidth()
.clip(shape = RoundedCornerShape(400.dp))
)
}
@Composable
private fun TheTextField(accountManager: AccountManager, lifecycleManager: LifecycleManager) {
var password by remember { mutableStateOf("") }
OutlinedTextField(password, { password = it }, label = { Text("Password") })
Spacer(Modifier.height(16.dp))
Button(onClick = {
accountManager.signIn(password)
val dbKey = accountManager.databaseKey ?: throw AssertionError()
lifecycleManager.startServices(dbKey)
lifecycleManager.waitForStartup()
}) {
Text("Login")
}
}
\ No newline at end of file
package org.briarproject.briar.desktop.dialogs
import androidx.compose.desktop.Window
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Button
import androidx.compose.material.OutlinedTextField
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.svgResource
import androidx.compose.ui.unit.dp
import org.briarproject.bramble.api.account.AccountManager
import org.briarproject.bramble.api.lifecycle.LifecycleManager
// TODO: Error handling and password strength
fun Registration(title: String, accountManager: AccountManager, lifecycleManager: LifecycleManager) =
Window(title = title) {
Column(
modifier = Modifier.padding(16.dp).fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
TheImage()
Spacer(Modifier.height(32.dp))
TheTextFields(accountManager, lifecycleManager)
}
}
@Composable
private fun TheImage() {
Image(
painter = svgResource("images/logo_circle.svg"),
contentDescription = "Briar logo",
modifier = Modifier
.fillMaxWidth()
.clip(shape = RoundedCornerShape(400.dp))
)
}
@Composable
private fun TheTextFields(accountManager: AccountManager, lifecycleManager: LifecycleManager) {
var username by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") }
OutlinedTextField(username, { username = it }, label = { Text("Username") })
OutlinedTextField(password, { password = it }, label = { Text("Password") })
Spacer(Modifier.height(16.dp))
Button(onClick = {
accountManager.createAccount(username, password)
val dbKey = accountManager.databaseKey ?: throw AssertionError()
lifecycleManager.startServices(dbKey)
lifecycleManager.waitForStartup()
}) {
Text("Register")
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment