Skip to content
Snippets Groups Projects
DesktopModule.kt 6.86 KiB
Newer Older
/*
 * Briar Desktop
 * Copyright (C) 2021-2022 The Briar Project
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

Nico's avatar
Nico committed
package org.briarproject.briar.desktop
Nico's avatar
Nico committed

import dagger.Module
import dagger.Provides
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.asExecutor
import kotlinx.coroutines.swing.Swing
Nico's avatar
Nico committed
import org.briarproject.bramble.account.AccountModule
import org.briarproject.bramble.api.FeatureFlags
import org.briarproject.bramble.api.db.DatabaseConfig
import org.briarproject.bramble.api.event.EventExecutor
Nico's avatar
Nico committed
import org.briarproject.bramble.api.plugin.PluginConfig
import org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_CONTROL_PORT
import org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_SOCKS_PORT
import org.briarproject.bramble.api.plugin.TorControlPort
Nico's avatar
Nico committed
import org.briarproject.bramble.api.plugin.TorDirectory
import org.briarproject.bramble.api.plugin.TorSocksPort
Nico's avatar
Nico committed
import org.briarproject.bramble.api.plugin.TransportId
import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory
import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory
import org.briarproject.bramble.battery.DefaultBatteryManagerModule
import org.briarproject.bramble.network.JavaNetworkModule
akwizgran's avatar
akwizgran committed
import org.briarproject.bramble.plugin.tcp.LanTcpPluginFactory
Nico's avatar
Nico committed
import org.briarproject.bramble.plugin.tor.CircumventionModule
import org.briarproject.bramble.plugin.tor.UnixTorPluginFactory
import org.briarproject.bramble.socks.SocksModule
import org.briarproject.bramble.system.ClockModule
Nico's avatar
Nico committed
import org.briarproject.bramble.system.DefaultTaskSchedulerModule
import org.briarproject.bramble.system.DefaultWakefulIoExecutorModule
import org.briarproject.bramble.system.DesktopSecureRandomModule
import org.briarproject.bramble.system.JavaSystemModule
import org.briarproject.bramble.util.OsUtils.isLinux
import org.briarproject.bramble.util.OsUtils.isMac
import org.briarproject.briar.attachment.AttachmentModule
import org.briarproject.briar.desktop.attachment.media.ImageCompressor
import org.briarproject.briar.desktop.attachment.media.ImageCompressorImpl
import org.briarproject.briar.desktop.settings.UnencryptedSettings
import org.briarproject.briar.desktop.settings.UnencryptedSettingsImpl
import org.briarproject.briar.desktop.threading.BriarExecutors
import org.briarproject.briar.desktop.threading.BriarExecutorsImpl
import org.briarproject.briar.desktop.threading.UiExecutor
import org.briarproject.briar.desktop.ui.BriarUi
import org.briarproject.briar.desktop.ui.BriarUiImpl
import org.briarproject.briar.desktop.viewmodel.ViewModelModule
import org.briarproject.briar.identity.IdentityModule
Nico's avatar
Nico committed
import java.io.File
import java.nio.file.Path
Nico's avatar
Nico committed
import java.util.Collections.emptyList
import java.util.concurrent.Executor
Nico's avatar
Nico committed
import javax.inject.Singleton

@Module(
    includes = [
        AccountModule::class,
        IdentityModule::class,
Nico's avatar
Nico committed
        CircumventionModule::class,
        ClockModule::class,
Nico's avatar
Nico committed
        DefaultBatteryManagerModule::class,
        DefaultTaskSchedulerModule::class,
        DefaultWakefulIoExecutorModule::class,
        DesktopSecureRandomModule::class,
        JavaNetworkModule::class,
        JavaSystemModule::class,
        AttachmentModule::class,
Nico's avatar
Nico committed
    ]
)
internal class DesktopModule(
    private val appDir: Path,
    private val socksPort: Int = DEFAULT_SOCKS_PORT,
    private val controlPort: Int = DEFAULT_CONTROL_PORT
) {
Nico's avatar
Nico committed

    @Provides
    @Singleton
Sebastian's avatar
Sebastian committed
    internal fun provideBriarService(briarService: BriarUiImpl): BriarUi = briarService
Nico's avatar
Nico committed

    @Provides
    @Singleton
    internal fun provideDatabaseConfig(): DatabaseConfig {
        val dbDir = appDir.resolve("db")
        val keyDir = appDir.resolve("key")
        return DesktopDatabaseConfig(dbDir, keyDir)
    @Provides
    @Singleton
    fun provideUnencryptedSettings(settings: UnencryptedSettingsImpl): UnencryptedSettings = settings
    @Provides
    @Singleton
    @EventExecutor
    fun provideEventExecutor(): Executor = provideUiExecutor()

    @Provides
    @Singleton
    @UiExecutor
    fun provideUiExecutor(): Executor = Dispatchers.Swing.asExecutor()
    @Provides
    @Singleton
    fun provideBriarExecutors(briarExecutors: BriarExecutorsImpl): BriarExecutors = briarExecutors

Nico's avatar
Nico committed
    @Provides
    @TorDirectory
    internal fun provideTorDirectory(): File {
        return appDir.resolve("tor").toFile()
    @Provides
    @Singleton
    @TorSocksPort
    internal fun provideTorSocksPort() = socksPort

    @Provides
    @Singleton
    @TorControlPort
    internal fun provideTorControlPort() = controlPort

Nico's avatar
Nico committed
    @Provides
akwizgran's avatar
akwizgran committed
    internal fun providePluginConfig(tor: UnixTorPluginFactory, lan: LanTcpPluginFactory): PluginConfig {
Nico's avatar
Nico committed
        val duplex: List<DuplexPluginFactory> =
akwizgran's avatar
akwizgran committed
            if (isLinux() || isMac()) listOf(tor, lan) else listOf(lan)
Nico's avatar
Nico committed
        return object : PluginConfig {
            override fun getDuplexFactories(): Collection<DuplexPluginFactory> = duplex
            override fun getSimplexFactories(): Collection<SimplexPluginFactory> = emptyList()
            override fun shouldPoll(): Boolean = true
            override fun getTransportPreferences(): Map<TransportId, List<TransportId>> = emptyMap()
        }
    }

    @Provides
Sebastian's avatar
Sebastian committed
    internal fun provideFeatureFlags(desktopFeatureFlags: DesktopFeatureFlags) = object : FeatureFlags {
Sebastian's avatar
Sebastian committed
        override fun shouldEnableImageAttachments() = true
        override fun shouldEnableProfilePictures() = true
        override fun shouldEnableDisappearingMessages() = false
Sebastian's avatar
Sebastian committed
        override fun shouldEnablePrivateGroupsInCore() = desktopFeatureFlags.shouldEnablePrivateGroups()
        override fun shouldEnableForumsInCore() = desktopFeatureFlags.shouldEnableForums()
        override fun shouldEnableBlogsInCore() = desktopFeatureFlags.shouldEnableBlogs()
akwizgran's avatar
akwizgran committed
        override fun shouldEnableMailbox() = false
    @Provides
    @Singleton
    internal fun provideDesktopFeatureFlags() = object : DesktopFeatureFlags {
        override fun shouldEnablePrivateGroups() = false
        override fun shouldEnableForums() = false
        override fun shouldEnableBlogs() = false
        override fun shouldEnableTransportSettings() = false
    }

    @Provides
    @Singleton
    internal fun provideImageCompressor(imageCompressor: ImageCompressorImpl): ImageCompressor {
        return imageCompressor
    }
Nico's avatar
Nico committed
}