diff --git a/build.gradle b/build.gradle index c985f2e..d81cc9a 100644 --- a/build.gradle +++ b/build.gradle @@ -45,6 +45,7 @@ dependencies { implementation 'org.jupnp:org.jupnp:2.7.1' implementation 'org.jupnp:org.jupnp.support:2.7.1' + implementation 'org.osgi:org.osgi.service.http:1.2.2' implementation 'org.apache.httpcomponents:httpclient:4.5.14' // to avoid snakeyaml-1.3 vulnerability CVE-2022-1471 implementation 'org.yaml:snakeyaml:2.2' diff --git a/src/integration/groovy/support/IntegrationSpecification.groovy b/src/integration/groovy/support/IntegrationSpecification.groovy index c248ad3..0f51d52 100644 --- a/src/integration/groovy/support/IntegrationSpecification.groovy +++ b/src/integration/groovy/support/IntegrationSpecification.groovy @@ -6,15 +6,18 @@ import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootContextLoader import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.test.web.client.TestRestTemplate +import org.springframework.context.annotation.Import import org.springframework.test.context.ActiveProfiles import org.springframework.test.context.ContextConfiguration import spock.lang.Specification +import support.beans.TestConfig import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT @ContextConfiguration(loader = SpringBootContextLoader, classes = NextcloudDLNAApp.class) @SpringBootTest(webEnvironment = DEFINED_PORT) @ActiveProfiles("integration") +@Import(TestConfig.class) class IntegrationSpecification extends Specification { @Autowired private TestRestTemplate restTemplate diff --git a/src/integration/groovy/support/beans/TestConfig.groovy b/src/integration/groovy/support/beans/TestConfig.groovy new file mode 100644 index 0000000..cebb120 --- /dev/null +++ b/src/integration/groovy/support/beans/TestConfig.groovy @@ -0,0 +1,7 @@ +package support.beans + +import org.springframework.context.annotation.ComponentScan + +@ComponentScan(["support", "net.schowek.nextclouddlna"]) +class TestConfig { +} \ No newline at end of file diff --git a/src/integration/groovy/support/beans/dlna/upnp/UpnpServiceConfigurationInt.groovy b/src/integration/groovy/support/beans/dlna/upnp/UpnpServiceConfigurationInt.groovy new file mode 100644 index 0000000..4d95c90 --- /dev/null +++ b/src/integration/groovy/support/beans/dlna/upnp/UpnpServiceConfigurationInt.groovy @@ -0,0 +1,29 @@ +package support.beans.dlna.upnp + +import org.jupnp.DefaultUpnpServiceConfiguration +import org.jupnp.transport.spi.DatagramIO +import org.jupnp.transport.spi.NetworkAddressFactory +import org.jupnp.transport.spi.StreamClient +import org.jupnp.transport.spi.StreamServer +import org.springframework.context.annotation.Profile +import org.springframework.stereotype.Component + +@Component +@Profile("integration") +class UpnpServiceConfigurationInt extends DefaultUpnpServiceConfiguration { + @Override + public StreamClient createStreamClient() { + return null + } + + + @Override + public StreamServer createStreamServer(NetworkAddressFactory networkAddressFactory) { + return null + } + +// @Override +// public DatagramIO createDatagramIO(NetworkAddressFactory networkAddressFactory) { +// +// } +} diff --git a/src/integration/groovy/net/schowek/nextclouddlna/nextcloud/config/NextcloudAppPathProviderInt.groovy b/src/integration/groovy/support/beans/nextcloud/config/NextcloudAppPathProviderInt.groovy similarity index 75% rename from src/integration/groovy/net/schowek/nextclouddlna/nextcloud/config/NextcloudAppPathProviderInt.groovy rename to src/integration/groovy/support/beans/nextcloud/config/NextcloudAppPathProviderInt.groovy index 2bd3b98..dfa76da 100644 --- a/src/integration/groovy/net/schowek/nextclouddlna/nextcloud/config/NextcloudAppPathProviderInt.groovy +++ b/src/integration/groovy/support/beans/nextcloud/config/NextcloudAppPathProviderInt.groovy @@ -1,6 +1,6 @@ -package net.schowek.nextclouddlna.nextcloud.config - +package support.beans.nextcloud.config +import net.schowek.nextclouddlna.nextcloud.config.NextcloudAppPathProvider import org.springframework.context.annotation.Profile import org.springframework.stereotype.Component diff --git a/src/integration/groovy/net/schowek/nextclouddlna/util/ServerInfoProviderInt.groovy b/src/integration/groovy/support/beans/util/ServerInfoProviderInt.groovy similarity index 88% rename from src/integration/groovy/net/schowek/nextclouddlna/util/ServerInfoProviderInt.groovy rename to src/integration/groovy/support/beans/util/ServerInfoProviderInt.groovy index 1a30d66..47b96ff 100644 --- a/src/integration/groovy/net/schowek/nextclouddlna/util/ServerInfoProviderInt.groovy +++ b/src/integration/groovy/support/beans/util/ServerInfoProviderInt.groovy @@ -1,5 +1,6 @@ -package net.schowek.nextclouddlna.util +package support.beans.util +import net.schowek.nextclouddlna.util.ServerInfoProvider import org.springframework.beans.factory.annotation.Autowired import org.springframework.context.annotation.Profile import org.springframework.stereotype.Component diff --git a/src/integration/groovy/net/schowek/nextclouddlna/util/ServerPortCustomizer.groovy b/src/integration/groovy/support/beans/util/ServerPortCustomizer.groovy similarity index 94% rename from src/integration/groovy/net/schowek/nextclouddlna/util/ServerPortCustomizer.groovy rename to src/integration/groovy/support/beans/util/ServerPortCustomizer.groovy index 4c997ad..5b5f23d 100644 --- a/src/integration/groovy/net/schowek/nextclouddlna/util/ServerPortCustomizer.groovy +++ b/src/integration/groovy/support/beans/util/ServerPortCustomizer.groovy @@ -1,4 +1,4 @@ -package net.schowek.nextclouddlna.util +package support.beans.util import org.springframework.beans.factory.annotation.Value import org.springframework.boot.web.server.ConfigurableWebServerFactory diff --git a/src/main/kotlin/net/schowek/nextclouddlna/DllnaService.kt b/src/main/kotlin/net/schowek/nextclouddlna/DllnaService.kt index 9b10166..4c76a91 100644 --- a/src/main/kotlin/net/schowek/nextclouddlna/DllnaService.kt +++ b/src/main/kotlin/net/schowek/nextclouddlna/DllnaService.kt @@ -3,36 +3,20 @@ package net.schowek.nextclouddlna import jakarta.annotation.PreDestroy import mu.KLogging import net.schowek.nextclouddlna.dlna.media.MediaServer -import net.schowek.nextclouddlna.dlna.transport.ApacheStreamClient -import net.schowek.nextclouddlna.dlna.transport.ApacheStreamClientConfiguration -import net.schowek.nextclouddlna.dlna.transport.MyStreamServerConfiguration -import net.schowek.nextclouddlna.dlna.transport.MyStreamServerImpl -import net.schowek.nextclouddlna.util.ServerInfoProvider -import org.jupnp.DefaultUpnpServiceConfiguration -import org.jupnp.UpnpServiceConfiguration -import org.jupnp.UpnpServiceImpl +import org.jupnp.UpnpService import org.jupnp.model.message.StreamRequestMessage import org.jupnp.model.message.StreamResponseMessage import org.jupnp.model.message.UpnpResponse -import org.jupnp.protocol.ProtocolFactory -import org.jupnp.registry.RegistryImpl -import org.jupnp.transport.impl.NetworkAddressFactoryImpl -import org.jupnp.transport.spi.NetworkAddressFactory import org.springframework.context.event.ContextRefreshedEvent import org.springframework.context.event.EventListener import org.springframework.stereotype.Component -import java.net.InetAddress -import java.net.NetworkInterface @Component class DlnaService( - private val mediaServer: MediaServer, - private val serverInfoProvider: ServerInfoProvider, + private val upnpService: UpnpService, + private val mediaServer: MediaServer ) { - private val addressesToBind: List = listOf(serverInfoProvider.host) - var upnpService = MyUpnpService(MyUpnpServiceConfiguration()) - fun start() { upnpService.startup() upnpService.registry.addDevice(mediaServer.device) @@ -61,30 +45,5 @@ class DlnaService( } } - inner class MyUpnpService( - configuration: UpnpServiceConfiguration - ) : UpnpServiceImpl(configuration) { - override fun createRegistry(pf: ProtocolFactory) = RegistryImpl(this) - } - - private inner class MyUpnpServiceConfiguration : DefaultUpnpServiceConfiguration(serverInfoProvider.port) { - override fun createStreamClient() = - ApacheStreamClient(ApacheStreamClientConfiguration(syncProtocolExecutorService)) - - override fun createStreamServer(networkAddressFactory: NetworkAddressFactory) = - MyStreamServerImpl(MyStreamServerConfiguration(networkAddressFactory.streamListenPort)) - - override fun createNetworkAddressFactory(streamListenPort: Int, multicastResponsePort: Int) = - MyNetworkAddressFactory(streamListenPort, multicastResponsePort) - } - - inner class MyNetworkAddressFactory( - streamListenPort: Int, - multicastResponsePort: Int - ) : NetworkAddressFactoryImpl(streamListenPort, multicastResponsePort) { - override fun isUsableAddress(iface: NetworkInterface, address: InetAddress) = - addressesToBind.contains(address.hostAddress) - } - companion object : KLogging() } diff --git a/src/main/kotlin/net/schowek/nextclouddlna/dlna/upnp/MyUpnpService.kt b/src/main/kotlin/net/schowek/nextclouddlna/dlna/upnp/MyUpnpService.kt new file mode 100644 index 0000000..99996e9 --- /dev/null +++ b/src/main/kotlin/net/schowek/nextclouddlna/dlna/upnp/MyUpnpService.kt @@ -0,0 +1,14 @@ +package net.schowek.nextclouddlna.dlna.upnp + +import org.jupnp.UpnpServiceConfiguration +import org.jupnp.UpnpServiceImpl +import org.jupnp.protocol.ProtocolFactory +import org.jupnp.registry.RegistryImpl +import org.springframework.stereotype.Component + +@Component +class MyUpnpService( + upnpServiceConfiguration: UpnpServiceConfiguration +) : UpnpServiceImpl(upnpServiceConfiguration) { + override fun createRegistry(pf: ProtocolFactory) = RegistryImpl(this) +} diff --git a/src/main/kotlin/net/schowek/nextclouddlna/dlna/upnp/MyUpnpServiceConfiguration.kt b/src/main/kotlin/net/schowek/nextclouddlna/dlna/upnp/MyUpnpServiceConfiguration.kt new file mode 100644 index 0000000..9edff5c --- /dev/null +++ b/src/main/kotlin/net/schowek/nextclouddlna/dlna/upnp/MyUpnpServiceConfiguration.kt @@ -0,0 +1,44 @@ +package net.schowek.nextclouddlna.dlna.upnp + +import net.schowek.nextclouddlna.dlna.upnp.transport.ApacheStreamClient +import net.schowek.nextclouddlna.dlna.upnp.transport.ApacheStreamClientConfiguration +import net.schowek.nextclouddlna.dlna.upnp.transport.MyStreamServerConfiguration +import net.schowek.nextclouddlna.dlna.upnp.transport.MyStreamServerImpl +import net.schowek.nextclouddlna.util.ServerInfoProvider +import org.jupnp.DefaultUpnpServiceConfiguration +import org.jupnp.transport.impl.NetworkAddressFactoryImpl +import org.jupnp.transport.spi.DatagramIO +import org.jupnp.transport.spi.NetworkAddressFactory +import org.springframework.context.annotation.Profile +import org.springframework.stereotype.Component +import java.net.InetAddress +import java.net.NetworkInterface + +@Component +@Profile("!integration") +class MyUpnpServiceConfiguration( + private val serverInfoProvider: ServerInfoProvider +) : DefaultUpnpServiceConfiguration(serverInfoProvider.port) { + val addressesToBind = listOf(serverInfoProvider.host) + + override fun createStreamClient() = + ApacheStreamClient(ApacheStreamClientConfiguration(syncProtocolExecutorService)) + + override fun createStreamServer(networkAddressFactory: NetworkAddressFactory) = + MyStreamServerImpl(MyStreamServerConfiguration(networkAddressFactory.streamListenPort)) + + override fun createDatagramIO(networkAddressFactory: NetworkAddressFactory): DatagramIO<*> { + return super.createDatagramIO(networkAddressFactory) + } + + override fun createNetworkAddressFactory(streamListenPort: Int, multicastResponsePort: Int) = + MyNetworkAddressFactory(serverInfoProvider, multicastResponsePort) + + inner class MyNetworkAddressFactory( + private val serverInfoProvider: ServerInfoProvider, + multicastResponsePort: Int + ) : NetworkAddressFactoryImpl(serverInfoProvider.port, multicastResponsePort) { + override fun isUsableAddress(iface: NetworkInterface, address: InetAddress) = + addressesToBind.contains(address.hostAddress) + } +} diff --git a/src/main/kotlin/net/schowek/nextclouddlna/dlna/transport/ApacheStreamClient.kt b/src/main/kotlin/net/schowek/nextclouddlna/dlna/upnp/transport/ApacheStreamClient.kt similarity index 99% rename from src/main/kotlin/net/schowek/nextclouddlna/dlna/transport/ApacheStreamClient.kt rename to src/main/kotlin/net/schowek/nextclouddlna/dlna/upnp/transport/ApacheStreamClient.kt index 863b7ce..5e21fa4 100644 --- a/src/main/kotlin/net/schowek/nextclouddlna/dlna/transport/ApacheStreamClient.kt +++ b/src/main/kotlin/net/schowek/nextclouddlna/dlna/upnp/transport/ApacheStreamClient.kt @@ -1,4 +1,4 @@ -package net.schowek.nextclouddlna.dlna.transport +package net.schowek.nextclouddlna.dlna.upnp.transport import mu.KLogging import org.apache.http.HttpMessage diff --git a/src/main/kotlin/net/schowek/nextclouddlna/dlna/transport/ApacheStreamClientConfiguration.kt b/src/main/kotlin/net/schowek/nextclouddlna/dlna/upnp/transport/ApacheStreamClientConfiguration.kt similarity index 90% rename from src/main/kotlin/net/schowek/nextclouddlna/dlna/transport/ApacheStreamClientConfiguration.kt rename to src/main/kotlin/net/schowek/nextclouddlna/dlna/upnp/transport/ApacheStreamClientConfiguration.kt index a05ca44..3d824ac 100644 --- a/src/main/kotlin/net/schowek/nextclouddlna/dlna/transport/ApacheStreamClientConfiguration.kt +++ b/src/main/kotlin/net/schowek/nextclouddlna/dlna/upnp/transport/ApacheStreamClientConfiguration.kt @@ -1,4 +1,4 @@ -package net.schowek.nextclouddlna.dlna.transport +package net.schowek.nextclouddlna.dlna.upnp.transport import org.jupnp.transport.spi.AbstractStreamClientConfiguration import java.util.concurrent.ExecutorService diff --git a/src/main/kotlin/net/schowek/nextclouddlna/dlna/transport/MyStreamServerConfiguration.kt b/src/main/kotlin/net/schowek/nextclouddlna/dlna/upnp/transport/MyStreamServerConfiguration.kt similarity index 79% rename from src/main/kotlin/net/schowek/nextclouddlna/dlna/transport/MyStreamServerConfiguration.kt rename to src/main/kotlin/net/schowek/nextclouddlna/dlna/upnp/transport/MyStreamServerConfiguration.kt index 5df9171..e6fc950 100644 --- a/src/main/kotlin/net/schowek/nextclouddlna/dlna/transport/MyStreamServerConfiguration.kt +++ b/src/main/kotlin/net/schowek/nextclouddlna/dlna/upnp/transport/MyStreamServerConfiguration.kt @@ -1,4 +1,4 @@ -package net.schowek.nextclouddlna.dlna.transport +package net.schowek.nextclouddlna.dlna.upnp.transport import org.jupnp.transport.spi.StreamServerConfiguration diff --git a/src/main/kotlin/net/schowek/nextclouddlna/dlna/transport/MyStreamServerImpl.kt b/src/main/kotlin/net/schowek/nextclouddlna/dlna/upnp/transport/MyStreamServerImpl.kt similarity index 90% rename from src/main/kotlin/net/schowek/nextclouddlna/dlna/transport/MyStreamServerImpl.kt rename to src/main/kotlin/net/schowek/nextclouddlna/dlna/upnp/transport/MyStreamServerImpl.kt index 5108ca7..e7d2eca 100644 --- a/src/main/kotlin/net/schowek/nextclouddlna/dlna/transport/MyStreamServerImpl.kt +++ b/src/main/kotlin/net/schowek/nextclouddlna/dlna/upnp/transport/MyStreamServerImpl.kt @@ -1,4 +1,4 @@ -package net.schowek.nextclouddlna.dlna.transport +package net.schowek.nextclouddlna.dlna.upnp.transport import mu.KLogging import org.jupnp.transport.Router