Skip to content
Snippets Groups Projects
DesktopModule.kt 6.86 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * 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
    }