From 8b6c6a91dde1d9e77e623ec3caa11c98576726be Mon Sep 17 00:00:00 2001 From: csicar Date: Thu, 28 Oct 2021 11:58:08 +0200 Subject: [PATCH 1/2] Initial wip --- .../java/de/csicar/ning/DeviceInfoFragment.kt | 35 ++++++++++++++++--- .../de/csicar/ning/scanner/PortScanner.kt | 16 ++++++++- .../res/layout/fragment_deviceinfo_list.xml | 12 ++++++- app/src/main/res/values/strings.xml | 1 + 4 files changed, 57 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/de/csicar/ning/DeviceInfoFragment.kt b/app/src/main/java/de/csicar/ning/DeviceInfoFragment.kt index 8eeb2dd..6078890 100644 --- a/app/src/main/java/de/csicar/ning/DeviceInfoFragment.kt +++ b/app/src/main/java/de/csicar/ning/DeviceInfoFragment.kt @@ -54,8 +54,8 @@ class DeviceInfoFragment : Fragment() { copyUtil.makeTextViewCopyable(deviceHwAddressTextView) copyUtil.makeTextViewCopyable(deviceVendorTextView) - viewModel.deviceDao.getById(argumentDeviceId).observe(this, Observer { - fetchInfo(it.asDevice) + viewModel.deviceDao.getById(argumentDeviceId).observe(viewLifecycleOwner, Observer { + fetchCommonPorts(it.asDevice) deviceTypeTextView.text = getString(it.deviceType.label) deviceIpTextView.text = it.ip.hostAddress deviceNameTextView.text = if (it.isScanningDevice) { @@ -70,7 +70,15 @@ class DeviceInfoFragment : Fragment() { val ports = viewModel.portDao.getAllForDevice(argumentDeviceId) - recyclerView.setHandler(context!!, this, object : + this.scanAllPortsButton = view.findViewById(R.id.scanAllPorts) + + this.scanAllPortsButton.setOnClickListener { + viewModel.viewModelScope.launch(context = Dispatchers.IO) { + fetchAllPorts(viewModel.deviceDao.getByIdNow(argumentDeviceId)) + } + } + + recyclerView.setHandler(requireContext(), this, object : RecyclerViewCommon.Handler(R.layout.fragment_port_item, ports) { override fun shareIdentity(a: Port, b: Port) = a.port == b.port override fun areContentsTheSame(a: Port, b: Port) = a == b @@ -118,10 +126,27 @@ class DeviceInfoFragment : Fragment() { return view } - fun fetchInfo(device: Device) { + private fun fetchAllPorts(device: Device) { + viewModel.viewModelScope.launch { + withContext(Dispatchers.IO) { + PortScanner(device.ip).scanAllPorts().forEach { + launch { + val result = it.await() + if (result.isOpen) { + viewModel.portDao.upsert( + Port(0, result.port, result.protocol, device.deviceId) + ) + } + } + } + } + } + } + + private fun fetchCommonPorts(device: Device) { viewModel.viewModelScope.launch { withContext(Dispatchers.IO) { - PortScanner(device.ip).scanPorts().forEach { + PortScanner(device.ip).scanCommonPorts().forEach { launch { val result = it.await() if (result.isOpen) { diff --git a/app/src/main/java/de/csicar/ning/scanner/PortScanner.kt b/app/src/main/java/de/csicar/ning/scanner/PortScanner.kt index 233a961..3de8884 100644 --- a/app/src/main/java/de/csicar/ning/scanner/PortScanner.kt +++ b/app/src/main/java/de/csicar/ning/scanner/PortScanner.kt @@ -54,7 +54,21 @@ class PortScanner(val ip: InetAddress) { } } - suspend fun scanPorts() = withContext(Dispatchers.Main) { + suspend fun scanAllPorts() = withContext(Dispatchers.Main) { + (1 .. 65535).flatMap { + listOf( + async { + PortResult(it, Protocol.TCP, isTcpPortOpen(it)) + }, + async { + PortResult(it, Protocol.UDP, isUdpPortOpen(it)) + } + ) + } + } + + + suspend fun scanCommonPorts() = withContext(Dispatchers.Main) { PortDescription.commonPorts.flatMap { listOf( async { diff --git a/app/src/main/res/layout/fragment_deviceinfo_list.xml b/app/src/main/res/layout/fragment_deviceinfo_list.xml index 27c6ec9..cc91709 100644 --- a/app/src/main/res/layout/fragment_deviceinfo_list.xml +++ b/app/src/main/res/layout/fragment_deviceinfo_list.xml @@ -154,6 +154,16 @@ android:nestedScrollingEnabled="false" app:layoutManager="LinearLayoutManager" tools:context=".DeviceInfoFragment" - tools:listitem="@layout/fragment_port_item"/> + tools:listitem="@layout/fragment_port_item"> + + + +