From e8fd26944024d1a2dd44f8c837d59837bb25acfb Mon Sep 17 00:00:00 2001 From: guyluz Date: Fri, 24 Mar 2023 15:08:11 +0300 Subject: [PATCH 1/6] Fixing less points on pub dev. Added more documentation. --- network_tools/lib/src/host_scanner.dart | 12 ++++++------ network_tools/lib/src/models/active_host.dart | 3 +++ network_tools/test/host_scanner_test.dart | 11 +++++++---- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/network_tools/lib/src/host_scanner.dart b/network_tools/lib/src/host_scanner.dart index 0a1395d..3c6d7db 100644 --- a/network_tools/lib/src/host_scanner.dart +++ b/network_tools/lib/src/host_scanner.dart @@ -246,12 +246,6 @@ class HostScanner { /// Defines total number of subnets in class C network static const classCSubnets = 256; - /// Minimum value of first octet in IPv4 address used by [getMaxHost] - static const int minNetworkId = 1; - - /// Maximum value of first octect in IPv4 address used by [getMaxHost] - static const int maxNetworkId = 223; - /// returns the max number of hosts a subnet can have excluding network Id and broadcast Id @Deprecated( "Implementation is wrong, since we only append in last octet, max host can only be 254. Use maxHost getter", @@ -267,6 +261,12 @@ class HostScanner { ); } + /// Minimum value of first octet in IPv4 + const int minNetworkId = 1; + + /// Maximum value of first octet in IPv4 + const int maxNetworkId = 223; + final int firstOctet = int.parse(firstOctetStr[0]); if (firstOctet >= minNetworkId && firstOctet < 128) { diff --git a/network_tools/lib/src/models/active_host.dart b/network_tools/lib/src/models/active_host.dart index 8c849b5..391deee 100644 --- a/network_tools/lib/src/models/active_host.dart +++ b/network_tools/lib/src/models/active_host.dart @@ -69,6 +69,9 @@ class ActiveHost extends Comparable { static const generic = 'Generic Device'; InternetAddress internetAddress; + + /// The device specific number in the ip address. In IPv4 numbers after the + /// last dot, in IPv6 the numbers after the last colon late String hostId; /// Host name of the device, not to be confused with deviceName which does diff --git a/network_tools/test/host_scanner_test.dart b/network_tools/test/host_scanner_test.dart index a6e8681..923cc44 100644 --- a/network_tools/test/host_scanner_test.dart +++ b/network_tools/test/host_scanner_test.dart @@ -78,27 +78,30 @@ void main() { expect(() => HostScanner.getMaxHost("x"), throwsFormatException); expect(() => HostScanner.getMaxHost("x.x.x"), throwsFormatException); expect(() => HostScanner.getMaxHost("256.0.0.0"), throwsRangeError); + + const int minNetworkId = 1; + const int maxNetworkId = 223; expect( () => HostScanner.getMaxHost( - (HostScanner.minNetworkId - 1).toString(), + (minNetworkId - 1).toString(), ), throwsRangeError, ); expect( () => HostScanner.getMaxHost( - (HostScanner.maxNetworkId + 1).toString(), + (maxNetworkId + 1).toString(), ), throwsRangeError, ); //Normally returned cases expect( - HostScanner.getMaxHost(HostScanner.minNetworkId.toString()), + HostScanner.getMaxHost(minNetworkId.toString()), HostScanner.classASubnets, ); expect( - HostScanner.getMaxHost(HostScanner.maxNetworkId.toString()), + HostScanner.getMaxHost(maxNetworkId.toString()), HostScanner.classCSubnets, ); expect(HostScanner.getMaxHost("10.0.0.0"), HostScanner.classASubnets); From 5bf116665c59b99cc8531366051201418f15a5c3 Mon Sep 17 00:00:00 2001 From: Guy Luz Date: Sat, 25 Nov 2023 21:27:47 +0200 Subject: [PATCH 2/6] Made mDNS search find more results --- lib/src/mdns_scanner/mdns_scanner.dart | 99 ++++++++++++++++++-------- 1 file changed, 71 insertions(+), 28 deletions(-) diff --git a/lib/src/mdns_scanner/mdns_scanner.dart b/lib/src/mdns_scanner/mdns_scanner.dart index 1cdeafc..a33d8de 100644 --- a/lib/src/mdns_scanner/mdns_scanner.dart +++ b/lib/src/mdns_scanner/mdns_scanner.dart @@ -51,8 +51,6 @@ class MdnsScanner { static Future> findingMdnsWithAddress( String serviceType, ) async { - final List mdnsFoundList = []; - final MDnsClient client = MDnsClient( rawDatagramSocketFactory: ( dynamic host, @@ -70,6 +68,7 @@ class MdnsScanner { }, ); + final List listOfActiveHost = []; await client.start(); await for (final PtrResourceRecord ptr in client.lookup( @@ -79,42 +78,86 @@ class MdnsScanner { in client.lookup( ResourceRecordQuery.service(ptr.domainName), )) { - final MdnsInfo mdnsFound = MdnsInfo( - srvResourceRecord: srv, - ptrResourceRecord: ptr, + listOfActiveHost.addAll( + await findAllActiveHostForSrv( + addressType: AddressType.ipv4, + client: client, + ptr: ptr, + srv: srv, + ), + ); + listOfActiveHost.addAll( + await findAllActiveHostForSrv( + addressType: AddressType.ipv6, + client: client, + ptr: ptr, + srv: srv, + ), ); - mdnsFoundList.add(mdnsFound); } } client.stop(); + return listOfActiveHost; + } + + static Future> findAllActiveHostForSrv({ + required AddressType addressType, + required MDnsClient client, + required PtrResourceRecord ptr, + required SrvResourceRecord srv, + }) async { final List listOfActiveHost = []; - for (final MdnsInfo foundMdns in mdnsFoundList) { - final List? internetAddressList; - try { - internetAddressList = - await InternetAddress.lookup(foundMdns.mdnsSrvTarget); - - // There can be multiple devices with the same name - for (final InternetAddress internetAddress in internetAddressList) { - final ActiveHost tempHost = ActiveHost( - internetAddress: internetAddress, - mdnsInfoVar: foundMdns, - ); - listOfActiveHost.add(tempHost); - } - } catch (e) { - log.severe( - 'Error finding ip of mdns record ${foundMdns.ptrResourceRecord.name} srv target ${foundMdns.mdnsSrvTarget}, will add it with ip 0.0.0.0\n$e', + try { + Stream iPAddressResourceRecordStream; + + if (addressType == AddressType.ipv4) { + iPAddressResourceRecordStream = client.lookup( + ResourceRecordQuery.addressIPv4(srv.target), + ); + } else { + iPAddressResourceRecordStream = client.lookup( + ResourceRecordQuery.addressIPv6(srv.target), ); - final ActiveHost tempHost = ActiveHost( - internetAddress: InternetAddress('0.0.0.0'), - mdnsInfoVar: foundMdns, + } + await for (final IPAddressResourceRecord ip + in iPAddressResourceRecordStream) { + final ActiveHost activeHost = convertSrvToHostName( + internetAddress: ip.address, + ptr: ptr, + srv: srv, ); - listOfActiveHost.add(tempHost); + + listOfActiveHost.add(activeHost); } + } catch (e) { + log.severe( + 'Error finding ip of mdns record ${ptr.name} srv target ${srv.target}, will add it with ip 0.0.0.0\n$e', + ); + final ActiveHost activeHost = convertSrvToHostName( + internetAddress: InternetAddress('0.0.0.0'), + srv: srv, + ptr: ptr, + ); + listOfActiveHost.add(activeHost); } - return listOfActiveHost; } + + static ActiveHost convertSrvToHostName({ + required InternetAddress internetAddress, + required PtrResourceRecord ptr, + required SrvResourceRecord srv, + }) { + final MdnsInfo mdnsInfo = MdnsInfo( + srvResourceRecord: srv, + ptrResourceRecord: ptr, + ); + return ActiveHost( + internetAddress: internetAddress, + mdnsInfoVar: mdnsInfo, + ); + } } + +enum AddressType { ipv4, ipv6 } From d4550b53c7f10be3f4f7cd7f80db384e4fbc700e Mon Sep 17 00:00:00 2001 From: Guy Luz Date: Sat, 16 Dec 2023 16:30:15 +0200 Subject: [PATCH 3/6] Added new srv record --- lib/src/mdns_scanner/list_of_srv_records.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/src/mdns_scanner/list_of_srv_records.dart b/lib/src/mdns_scanner/list_of_srv_records.dart index ecb302f..51a3eb1 100644 --- a/lib/src/mdns_scanner/list_of_srv_records.dart +++ b/lib/src/mdns_scanner/list_of_srv_records.dart @@ -70,8 +70,9 @@ List tcpSrvRecordsList = [ '_zwave-js-server._tcp', // "domain": "zwave_js" '_axis-video._tcp', // "properties": { "macaddress": "00408c*" } "properties": { "macaddress": "accc8e*" } "properties": { "macaddress": "b8a44f*" } '_androidtvremote2._tcp', - '_ewelink._tcp', + '_ewelink._tcp', // Ewelink devices '_nvstream_dbd._tcp', + '_smartview._tcp', // Samsung tv's ]; List udpSrvRecordsList = [ From b37ad755e68e49ce818ead5995dc0e33ee559fc8 Mon Sep 17 00:00:00 2001 From: Guy Luz Date: Sat, 30 Dec 2023 13:25:40 +0200 Subject: [PATCH 4/6] Updated dependencies. Exposed tcpSrvRecordsList udpSrvRecordsList. --- lib/network_tools.dart | 1 + lib/src/device_info/arp_table_helper.dart | 2 +- lib/src/device_info/net_interface.dart | 2 +- lib/src/device_info/vendor_table.dart | 2 +- lib/src/mdns_scanner/list_of_srv_records.dart | 2 +- lib/src/mdns_scanner/mdns_scanner.dart | 1 - lib/src/models/arp_data.dart | 2 +- pubspec.yaml | 22 +++++++++---------- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/network_tools.dart b/lib/network_tools.dart index 2dc54e7..27eb944 100644 --- a/lib/network_tools.dart +++ b/lib/network_tools.dart @@ -11,6 +11,7 @@ import 'package:network_tools/src/services/arp_service.dart'; export 'src/device_info/net_interface.dart'; export 'src/device_info/vendor_table.dart'; export 'src/host_scanner.dart'; +export 'src/mdns_scanner/list_of_srv_records.dart'; export 'src/mdns_scanner/mdns_scanner.dart'; export 'src/models/active_host.dart'; export 'src/models/arp_data.dart'; diff --git a/lib/src/device_info/arp_table_helper.dart b/lib/src/device_info/arp_table_helper.dart index d42545c..60aae5b 100644 --- a/lib/src/device_info/arp_table_helper.dart +++ b/lib/src/device_info/arp_table_helper.dart @@ -1,8 +1,8 @@ import 'dart:convert'; -import 'dart:io'; import 'package:logging/logging.dart'; import 'package:network_tools/src/models/arp_data.dart'; +import 'package:universal_io/io.dart'; class ARPTableHelper { static final arpLogger = Logger("arp-table-logger"); diff --git a/lib/src/device_info/net_interface.dart b/lib/src/device_info/net_interface.dart index 09b1ab1..5837b16 100644 --- a/lib/src/device_info/net_interface.dart +++ b/lib/src/device_info/net_interface.dart @@ -1,4 +1,4 @@ -import 'dart:io'; +import 'package:universal_io/io.dart'; class NetInterface { NetInterface({ diff --git a/lib/src/device_info/vendor_table.dart b/lib/src/device_info/vendor_table.dart index fcb1fbe..e908e54 100644 --- a/lib/src/device_info/vendor_table.dart +++ b/lib/src/device_info/vendor_table.dart @@ -1,11 +1,11 @@ import 'dart:convert'; -import 'dart:io'; import 'package:csv/csv.dart'; import 'package:http/http.dart' as http; import 'package:network_tools/network_tools.dart'; import 'package:network_tools/src/network_tools_utils.dart'; import 'package:path/path.dart' as p; +import 'package:universal_io/io.dart'; class VendorTable { static Map _vendorTableMap = {}; diff --git a/lib/src/mdns_scanner/list_of_srv_records.dart b/lib/src/mdns_scanner/list_of_srv_records.dart index 51a3eb1..db26e3e 100644 --- a/lib/src/mdns_scanner/list_of_srv_records.dart +++ b/lib/src/mdns_scanner/list_of_srv_records.dart @@ -1,7 +1,7 @@ /// Service record list that is including the protocol, mostly _tcp, _udp may /// not work List tcpSrvRecordsList = [ - '_uscan._tcp', // Any HP-compatible network scanners + '_scan._tcp', // Any HP-compatible network scanners '_uscans._tcp', // Any SSL/TLS-capable HP-compatible network scanners '_privet._tcp', // Any Google CloudPrint-capable printers or print services '_http-alt._tcp', diff --git a/lib/src/mdns_scanner/mdns_scanner.dart b/lib/src/mdns_scanner/mdns_scanner.dart index a33d8de..1bc4eba 100644 --- a/lib/src/mdns_scanner/mdns_scanner.dart +++ b/lib/src/mdns_scanner/mdns_scanner.dart @@ -1,7 +1,6 @@ import 'package:multicast_dns/multicast_dns.dart'; import 'package:network_tools/network_tools.dart'; import 'package:network_tools/src/mdns_scanner/get_srv_list_by_os/srv_list.dart'; -import 'package:network_tools/src/mdns_scanner/list_of_srv_records.dart'; import 'package:network_tools/src/network_tools_utils.dart'; import 'package:universal_io/io.dart'; diff --git a/lib/src/models/arp_data.dart b/lib/src/models/arp_data.dart index 79456c4..83eb239 100644 --- a/lib/src/models/arp_data.dart +++ b/lib/src/models/arp_data.dart @@ -1,5 +1,5 @@ -import 'dart:io'; import 'package:json_annotation/json_annotation.dart'; +import 'package:universal_io/io.dart'; part 'arp_data.g.dart'; diff --git a/pubspec.yaml b/pubspec.yaml index e3eaf2e..58057be 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,36 +20,36 @@ funding: dependencies: # A dart csv to list converter. - csv: ^5.0.2 + csv: ^5.1.1 # Multi-platform network ping utility. - dart_ping: ^9.0.0 + dart_ping: ^9.0.1 # Defines the annotations used by json_serializable - get_it: ^7.6.0 + get_it: ^7.6.4 # A composable, Future-based library for making HTTP requests. - http: ^1.1.0 + http: ^1.1.2 # Injectable is a convenient code generator for get_it. - injectable: ^2.2.0 + injectable: ^2.3.2 # Defines the annotations used by json_serializable. json_annotation: ^4.8.1 # Debugging and error logging. logging: ^1.2.0 # Performing mDNS queries (e.g. Bonjour, Avahi). - multicast_dns: ^0.3.2+2 + multicast_dns: ^0.3.2+6 # A comprehensive, cross-platform path manipulation library for Dart. - path: ^1.8.3 + path: ^1.9.0 # Process run helpers - process_run: ^0.13.1 + process_run: ^0.13.3+1 # Yet another NoSQL persistent store database solution for single process io apps. sembast: ^3.5.0+1 # Cross-platform 'dart:io' that works in all platforms. - universal_io: ^2.0.4 + universal_io: ^2.2.2 dev_dependencies: # Standalone generator and watcher for Dart - build_runner: ^2.4.6 + build_runner: ^2.4.7 # A generator for injectable library. - injectable_generator: ^2.4.0 + injectable_generator: ^2.4.1 # Provides Dart Build System builders for handling JSON. json_serializable: ^6.7.1 # Set of lint rules for Dart. From 7f1686fb3f670338bcd527f13ef40d25535eb03d Mon Sep 17 00:00:00 2001 From: Guy Luz Date: Sat, 30 Dec 2023 13:40:20 +0200 Subject: [PATCH 5/6] Updated dart min version to 3.2.0 --- lib/src/mdns_scanner/list_of_srv_records.dart | 2 +- lib/src/models/active_host.dart | 3 +-- lib/src/models/open_port.dart | 4 ++-- pubspec.yaml | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/src/mdns_scanner/list_of_srv_records.dart b/lib/src/mdns_scanner/list_of_srv_records.dart index db26e3e..51a3eb1 100644 --- a/lib/src/mdns_scanner/list_of_srv_records.dart +++ b/lib/src/mdns_scanner/list_of_srv_records.dart @@ -1,7 +1,7 @@ /// Service record list that is including the protocol, mostly _tcp, _udp may /// not work List tcpSrvRecordsList = [ - '_scan._tcp', // Any HP-compatible network scanners + '_uscan._tcp', // Any HP-compatible network scanners '_uscans._tcp', // Any SSL/TLS-capable HP-compatible network scanners '_privet._tcp', // Any Google CloudPrint-capable printers or print services '_http-alt._tcp', diff --git a/lib/src/models/active_host.dart b/lib/src/models/active_host.dart index 8fb0284..cbb5c7a 100644 --- a/lib/src/models/active_host.dart +++ b/lib/src/models/active_host.dart @@ -9,7 +9,7 @@ final _getIt = GetIt.instance; /// ActiveHost which implements comparable /// By default sort by hostId ascending -class ActiveHost extends Comparable { +class ActiveHost { ActiveHost({ required this.internetAddress, this.openPorts = const [], @@ -219,7 +219,6 @@ class ActiveHost extends Comparable { @override bool operator ==(Object o) => o is ActiveHost && address == o.address; - @override int compareTo(ActiveHost other) { return hostId.compareTo(other.hostId); } diff --git a/lib/src/models/open_port.dart b/lib/src/models/open_port.dart index 6381b20..045afff 100644 --- a/lib/src/models/open_port.dart +++ b/lib/src/models/open_port.dart @@ -1,9 +1,10 @@ import 'package:json_annotation/json_annotation.dart'; + part 'open_port.g.dart'; /// Represents open port for a target Address @JsonSerializable() -class OpenPort extends Comparable { +class OpenPort { OpenPort(this.port, {this.isOpen = true}); factory OpenPort.fromJson(Map json) => _$OpenPortFromJson(json); @@ -11,7 +12,6 @@ class OpenPort extends Comparable { final int port; final bool isOpen; - @override int compareTo(OpenPort other) { return port.compareTo(other.port); } diff --git a/pubspec.yaml b/pubspec.yaml index 58057be..b567d9b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/osociety/network_tools/issues repository: https://github.com/osociety/network_tools environment: - sdk: ">=2.17.6 <4.0.0" + sdk: ">=3.2.0 <4.0.0" topics: - network From ba7e206cfafbc06c2e78c5da33a26f1d24158479 Mon Sep 17 00:00:00 2001 From: Guy Luz Date: Sat, 30 Dec 2023 13:55:27 +0200 Subject: [PATCH 6/6] path package to 1.8.3 to be compatible with flutter core packages --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index b567d9b..198d1f5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -36,7 +36,7 @@ dependencies: # Performing mDNS queries (e.g. Bonjour, Avahi). multicast_dns: ^0.3.2+6 # A comprehensive, cross-platform path manipulation library for Dart. - path: ^1.9.0 + path: ^1.8.3 # Process run helpers process_run: ^0.13.3+1 # Yet another NoSQL persistent store database solution for single process io apps.