diff --git a/CHANGELOG.md b/CHANGELOG.md index 04708a6..3bc5199 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.0 + +* Changed package name to `security_toolkit`. + ## 1.1.0 * Migrates plugin to built-in Kotlin & AGP 9. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 54cdd68..f56c3a8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,7 +30,7 @@ for frequent breaking changes. Whenever you wish to update the Pigeon bindings, simply run: ```shell -dart run pigeon --input pigeons/security_suite_messages.dart +dart run pigeon --input pigeons/security_toolkit_messages.dart ``` Generated pigeon bindings are source-controlled in this package due to it being published diff --git a/LICENSE b/LICENSE index 3e02b1d..3718727 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -flutter_security_suite +security_toolkit MIT License diff --git a/README.md b/README.md index 5fbc942..dc218ba 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -# Flutter Security Suite - > [!IMPORTANT] > Whilst this plugin is open-source, and you are free to use according to the license, this is > primarily a convenience for internal Apadmi projects. Our priorities responding to issues @@ -27,9 +25,9 @@ Usage of this plugin has the following requirements: ## Usage -A single class, `SecuritySuite`, is exposed which has a number of static methods to perform the +A single class, `SecurityToolkit`, is exposed which has a number of static methods to perform the checks listed above. That said, most of the time you'll simply want to use -`SecuritySuite.checkSecureEnvironment()` for a single, comprehensive check. +`SecurityToolkit.checkSecureEnvironment()` for a single, comprehensive check. ## Considerations diff --git a/android/build.gradle.kts b/android/build.gradle.kts index 30ce784..d663785 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -1,4 +1,4 @@ -group = "com.apadmi.flutter_security_suite" +group = "com.apadmi.security_toolkit" version = "1.0-SNAPSHOT" buildscript { @@ -26,7 +26,7 @@ plugins { } android { - namespace = "com.apadmi.flutter_security_suite" + namespace = "com.apadmi.security_toolkit" compileSdk = 36 diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts index c8fa1e6..d4206ab 100644 --- a/android/settings.gradle.kts +++ b/android/settings.gradle.kts @@ -1 +1 @@ -rootProject.name = "flutter_security_suite" \ No newline at end of file +rootProject.name = "security_toolkit" \ No newline at end of file diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index 32de33b..3c1710c 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -1,3 +1,3 @@ + package="com.apadmi.security_toolkit"> diff --git a/android/src/main/kotlin/com/apadmi/flutter_security_suite/EmulatorChecker.kt b/android/src/main/kotlin/com/apadmi/security_toolkit/EmulatorChecker.kt similarity index 99% rename from android/src/main/kotlin/com/apadmi/flutter_security_suite/EmulatorChecker.kt rename to android/src/main/kotlin/com/apadmi/security_toolkit/EmulatorChecker.kt index ede2c8a..6c2be3c 100644 --- a/android/src/main/kotlin/com/apadmi/flutter_security_suite/EmulatorChecker.kt +++ b/android/src/main/kotlin/com/apadmi/security_toolkit/EmulatorChecker.kt @@ -1,4 +1,4 @@ -package com.apadmi.flutter_security_suite +package com.apadmi.security_toolkit import android.os.Build import android.view.inputmethod.InputMethodManager diff --git a/android/src/main/kotlin/com/apadmi/flutter_security_suite/SecuritySuiteApi.g.kt b/android/src/main/kotlin/com/apadmi/security_toolkit/SecurityToolkitApi.g.kt similarity index 73% rename from android/src/main/kotlin/com/apadmi/flutter_security_suite/SecuritySuiteApi.g.kt rename to android/src/main/kotlin/com/apadmi/security_toolkit/SecurityToolkitApi.g.kt index e5782c6..af7c844 100644 --- a/android/src/main/kotlin/com/apadmi/flutter_security_suite/SecuritySuiteApi.g.kt +++ b/android/src/main/kotlin/com/apadmi/security_toolkit/SecurityToolkitApi.g.kt @@ -1,4 +1,4 @@ -// Autogenerated from Pigeon (v25.3.1), do not edit directly. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. // See also: https://pub.dev/packages/pigeon @file:Suppress("UNCHECKED_CAST", "ArrayInDataClass") @@ -12,14 +12,14 @@ import io.flutter.plugin.common.StandardMethodCodec import io.flutter.plugin.common.StandardMessageCodec import java.io.ByteArrayOutputStream import java.nio.ByteBuffer -private object SecuritySuiteApiPigeonUtils { +private object SecurityToolkitApiPigeonUtils { fun wrapResult(result: Any?): List { return listOf(result) } fun wrapError(exception: Throwable): List { - return if (exception is FlutterSecuritySuiteError) { + return if (exception is SecurityToolkitError) { listOf( exception.code, exception.message, @@ -41,12 +41,12 @@ private object SecuritySuiteApiPigeonUtils { * @property message The error message. * @property details The error details. Must be a datatype supported by the api codec. */ -class FlutterSecuritySuiteError ( +class SecurityToolkitError ( val code: String, override val message: String? = null, val details: Any? = null -) : Throwable() -private open class SecuritySuiteApiPigeonCodec : StandardMessageCodec() { +) : RuntimeException() +private open class SecurityToolkitApiPigeonCodec : StandardMessageCodec() { override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? { return super.readValueOfType(type, buffer) } @@ -56,29 +56,29 @@ private open class SecuritySuiteApiPigeonCodec : StandardMessageCodec() { } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ -interface SecuritySuiteApi { +interface SecurityToolkitApi { fun isRooted(): Boolean fun isDebugged(): Boolean fun isLikelyEmulator(): Boolean fun isReverseEngineered(): Boolean companion object { - /** The codec used by SecuritySuiteApi. */ + /** The codec used by SecurityToolkitApi. */ val codec: MessageCodec by lazy { - SecuritySuiteApiPigeonCodec() + SecurityToolkitApiPigeonCodec() } - /** Sets up an instance of `SecuritySuiteApi` to handle messages through the `binaryMessenger`. */ + /** Sets up an instance of `SecurityToolkitApi` to handle messages through the `binaryMessenger`. */ @JvmOverloads - fun setUp(binaryMessenger: BinaryMessenger, api: SecuritySuiteApi?, messageChannelSuffix: String = "") { + fun setUp(binaryMessenger: BinaryMessenger, api: SecurityToolkitApi?, messageChannelSuffix: String = "") { val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isRooted$separatedMessageChannelSuffix", codec) + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.security_toolkit.SecurityToolkitApi.isRooted$separatedMessageChannelSuffix", codec) if (api != null) { channel.setMessageHandler { _, reply -> val wrapped: List = try { listOf(api.isRooted()) } catch (exception: Throwable) { - SecuritySuiteApiPigeonUtils.wrapError(exception) + SecurityToolkitApiPigeonUtils.wrapError(exception) } reply.reply(wrapped) } @@ -87,13 +87,13 @@ interface SecuritySuiteApi { } } run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isDebugged$separatedMessageChannelSuffix", codec) + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.security_toolkit.SecurityToolkitApi.isDebugged$separatedMessageChannelSuffix", codec) if (api != null) { channel.setMessageHandler { _, reply -> val wrapped: List = try { listOf(api.isDebugged()) } catch (exception: Throwable) { - SecuritySuiteApiPigeonUtils.wrapError(exception) + SecurityToolkitApiPigeonUtils.wrapError(exception) } reply.reply(wrapped) } @@ -102,13 +102,13 @@ interface SecuritySuiteApi { } } run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isLikelyEmulator$separatedMessageChannelSuffix", codec) + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.security_toolkit.SecurityToolkitApi.isLikelyEmulator$separatedMessageChannelSuffix", codec) if (api != null) { channel.setMessageHandler { _, reply -> val wrapped: List = try { listOf(api.isLikelyEmulator()) } catch (exception: Throwable) { - SecuritySuiteApiPigeonUtils.wrapError(exception) + SecurityToolkitApiPigeonUtils.wrapError(exception) } reply.reply(wrapped) } @@ -117,13 +117,13 @@ interface SecuritySuiteApi { } } run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isReverseEngineered$separatedMessageChannelSuffix", codec) + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.security_toolkit.SecurityToolkitApi.isReverseEngineered$separatedMessageChannelSuffix", codec) if (api != null) { channel.setMessageHandler { _, reply -> val wrapped: List = try { listOf(api.isReverseEngineered()) } catch (exception: Throwable) { - SecuritySuiteApiPigeonUtils.wrapError(exception) + SecurityToolkitApiPigeonUtils.wrapError(exception) } reply.reply(wrapped) } diff --git a/android/src/main/kotlin/com/apadmi/flutter_security_suite/SecuritySuiteImpl.kt b/android/src/main/kotlin/com/apadmi/security_toolkit/SecurityToolkitImpl.kt similarity index 84% rename from android/src/main/kotlin/com/apadmi/flutter_security_suite/SecuritySuiteImpl.kt rename to android/src/main/kotlin/com/apadmi/security_toolkit/SecurityToolkitImpl.kt index 7b9fdc1..f86cf3d 100644 --- a/android/src/main/kotlin/com/apadmi/flutter_security_suite/SecuritySuiteImpl.kt +++ b/android/src/main/kotlin/com/apadmi/security_toolkit/SecurityToolkitImpl.kt @@ -1,15 +1,15 @@ -package com.apadmi.flutter_security_suite +package com.apadmi.security_toolkit -import SecuritySuiteApi +import SecurityToolkitApi import android.content.Context import android.content.pm.ApplicationInfo import com.scottyab.rootbeer.RootBeer -class SecuritySuiteImpl( +class SecurityToolkitImpl( private val context: Context, private val emulatorChecker: EmulatorChecker, private val rootBeer: RootBeer, -): SecuritySuiteApi { +): SecurityToolkitApi { override fun isRooted(): Boolean = rootBeer.isRooted override fun isDebugged(): Boolean = BuildConfig.DEBUG || context.applicationContext.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE != 0 diff --git a/android/src/main/kotlin/com/apadmi/flutter_security_suite/FlutterSecuritySuitePlugin.kt b/android/src/main/kotlin/com/apadmi/security_toolkit/SecurityToolkitPlugin.kt similarity index 62% rename from android/src/main/kotlin/com/apadmi/flutter_security_suite/FlutterSecuritySuitePlugin.kt rename to android/src/main/kotlin/com/apadmi/security_toolkit/SecurityToolkitPlugin.kt index 3e31f3d..abde593 100644 --- a/android/src/main/kotlin/com/apadmi/flutter_security_suite/FlutterSecuritySuitePlugin.kt +++ b/android/src/main/kotlin/com/apadmi/security_toolkit/SecurityToolkitPlugin.kt @@ -1,16 +1,16 @@ -package com.apadmi.flutter_security_suite +package com.apadmi.security_toolkit -import SecuritySuiteApi +import SecurityToolkitApi import io.flutter.embedding.engine.plugins.FlutterPlugin import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler import io.flutter.plugin.common.MethodChannel.Result -class FlutterSecuritySuitePlugin: FlutterPlugin { +class SecurityToolkitPlugin: FlutterPlugin { override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { - val securityApi = ServiceLocator.getSecuritySuite(flutterPluginBinding.applicationContext) - SecuritySuiteApi.setUp(flutterPluginBinding.binaryMessenger, securityApi) + val securityApi = ServiceLocator.getSecurityToolkit(flutterPluginBinding.applicationContext) + SecurityToolkitApi.setUp(flutterPluginBinding.binaryMessenger, securityApi) } override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { diff --git a/android/src/main/kotlin/com/apadmi/flutter_security_suite/ServiceLocator.kt b/android/src/main/kotlin/com/apadmi/security_toolkit/ServiceLocator.kt similarity index 69% rename from android/src/main/kotlin/com/apadmi/flutter_security_suite/ServiceLocator.kt rename to android/src/main/kotlin/com/apadmi/security_toolkit/ServiceLocator.kt index 022ac67..69aa6f3 100644 --- a/android/src/main/kotlin/com/apadmi/flutter_security_suite/ServiceLocator.kt +++ b/android/src/main/kotlin/com/apadmi/security_toolkit/ServiceLocator.kt @@ -1,6 +1,6 @@ -package com.apadmi.flutter_security_suite +package com.apadmi.security_toolkit -import SecuritySuiteApi +import SecurityToolkitApi import android.content.Context import android.view.inputmethod.InputMethodManager import com.scottyab.rootbeer.RootBeer @@ -15,6 +15,6 @@ object ServiceLocator { private fun getInputMethodManager(context: Context): InputMethodManager = context.getSystemService(InputMethodManager::class.java) - fun getSecuritySuite(context: Context): SecuritySuiteApi = - SecuritySuiteImpl(context, getEmulatorChecker(context), getRootBeer(context)) + fun getSecurityToolkit(context: Context): SecurityToolkitApi = + SecurityToolkitImpl(context, getEmulatorChecker(context), getRootBeer(context)) } \ No newline at end of file diff --git a/example/README.md b/example/README.md index dec67f0..b82d0b3 100644 --- a/example/README.md +++ b/example/README.md @@ -1,3 +1,3 @@ -# flutter_security_suite_example +# security_toolkit_example -Demonstrates how to use the flutter_security_suite plugin. +Demonstrates how to use the security_toolkit plugin. diff --git a/example/android/app/build.gradle.kts b/example/android/app/build.gradle.kts index 169dc6c..aabb3fd 100644 --- a/example/android/app/build.gradle.kts +++ b/example/android/app/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } android { - namespace = "com.example.flutter_security_suite_example" + namespace = "com.apadmi.security_toolkit_example" compileSdk = flutter.compileSdkVersion ndkVersion = flutter.ndkVersion @@ -16,7 +16,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.flutter_security_suite_example" + applicationId = "com.apadmi.security_toolkit_example" // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. minSdk = flutter.minSdkVersion diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index fa5b5cf..e0a04d4 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - flutter_security_suite_example + security_toolkit_example CFBundlePackageType APPL CFBundleShortVersionString diff --git a/example/lib/main.dart b/example/lib/main.dart index 8e2d9a6..84d08b7 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,10 +1,7 @@ import 'package:flutter/material.dart'; -import 'dart:async'; - -import 'package:flutter/services.dart'; -import 'package:flutter_security_suite/flutter_security_suite.dart'; -import 'package:flutter_security_suite_example/widgets/overall.dart'; -import 'package:flutter_security_suite_example/widgets/security_reading.dart'; +import 'package:security_toolkit/security_toolkit.dart'; +import 'package:security_toolkit_example/widgets/overall.dart'; +import 'package:security_toolkit_example/widgets/security_reading.dart'; void main() { runApp(const MyApp()); @@ -30,10 +27,10 @@ class _MyAppState extends State { builder: (context) { return Scaffold( appBar: AppBar( - title: const Text('Flutter Security Suite Example'), + title: const Text('Security Toolkit Example'), ), body: FutureBuilder( - future: SecuritySuite.checkSecureEnvironment(), + future: SecurityToolkit.checkSecureEnvironment(), builder: (_, state) => switch (state) { AsyncSnapshot(connectionState: ConnectionState.waiting) => diff --git a/example/lib/widgets/overall.dart b/example/lib/widgets/overall.dart index 7e35ff0..6ff5c81 100644 --- a/example/lib/widgets/overall.dart +++ b/example/lib/widgets/overall.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_security_suite/flutter_security_suite.dart'; +import 'package:security_toolkit/security_toolkit.dart'; class OverallSecurityReading extends StatelessWidget { final SecurityCheckResult result; diff --git a/example/lib/widgets/security_reading.dart b/example/lib/widgets/security_reading.dart index cfa6397..e96358d 100644 --- a/example/lib/widgets/security_reading.dart +++ b/example/lib/widgets/security_reading.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_security_suite_example/utils/color_ext.dart'; +import 'package:security_toolkit_example/utils/color_ext.dart'; class IndividualSecurityReading extends StatelessWidget { final String name; diff --git a/example/pubspec.lock b/example/pubspec.lock index d0b3557..e221e8d 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -83,13 +83,6 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" - flutter_security_suite: - dependency: "direct main" - description: - path: ".." - relative: true - source: path - version: "1.1.0" flutter_test: dependency: "direct dev" description: flutter @@ -193,6 +186,13 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.3" + security_toolkit: + dependency: "direct main" + description: + path: ".." + relative: true + source: path + version: "2.0.0" sky_engine: dependency: transitive description: flutter diff --git a/example/pubspec.yaml b/example/pubspec.yaml index ef2a322..5aa24c1 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -1,5 +1,5 @@ -name: flutter_security_suite_example -description: "Demonstrates how to use the flutter_security_suite plugin." +name: security_toolkit_example +description: "Demonstrates how to use the security_toolkit plugin." publish_to: 'none' environment: @@ -10,7 +10,7 @@ dependencies: flutter: sdk: flutter - flutter_security_suite: + security_toolkit: path: ../ cupertino_icons: ^1.0.8 diff --git a/ios/flutter_security_suite/Sources/flutter_security_suite/FlutterSecuritySuitePlugin.swift b/ios/flutter_security_suite/Sources/flutter_security_suite/FlutterSecuritySuitePlugin.swift deleted file mode 100644 index fbcfc09..0000000 --- a/ios/flutter_security_suite/Sources/flutter_security_suite/FlutterSecuritySuitePlugin.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Flutter -import UIKit - -public class FlutterSecuritySuitePlugin: NSObject, FlutterPlugin { - - let securitySuite: SecuritySuiteApi - - override init() { - self.securitySuite = ServiceLocator.getSecuritySuiteApi() - } - - public static func register(with registrar: FlutterPluginRegistrar) { - let plugin = FlutterSecuritySuitePlugin() - let securitySuite = plugin.securitySuite - SecuritySuiteApiSetup.setUp(binaryMessenger: registrar.messenger(), api: securitySuite) - registrar.publish(plugin) - } -} diff --git a/ios/flutter_security_suite.podspec b/ios/security_toolkit.podspec similarity index 82% rename from ios/flutter_security_suite.podspec rename to ios/security_toolkit.podspec index 0015405..2b1c4b5 100644 --- a/ios/flutter_security_suite.podspec +++ b/ios/security_toolkit.podspec @@ -1,5 +1,5 @@ Pod::Spec.new do |s| - s.name = 'flutter_security_suite' + s.name = 'security_toolkit' s.version = '0.0.1' s.summary = 'Security utilities for Flutter apps.' s.description = <<-DESC @@ -9,7 +9,7 @@ Security utilities for Flutter apps. s.license = { :file => '../LICENSE' } s.author = { 'Apadmi Ltd.' => 'tomh@apadmi.com' } s.source = { :path => '.' } - s.source_files = 'flutter_security_suite/Sources/flutter_security_suite/**/*.swift' + s.source_files = 'security_toolkit/Sources/security_toolkit/**/*.swift' s.dependency 'Flutter' s.platform = :ios, '13.0' diff --git a/ios/flutter_security_suite/Package.swift b/ios/security_toolkit/Package.swift similarity index 78% rename from ios/flutter_security_suite/Package.swift rename to ios/security_toolkit/Package.swift index 5c61a41..4a64e99 100644 --- a/ios/flutter_security_suite/Package.swift +++ b/ios/security_toolkit/Package.swift @@ -4,19 +4,19 @@ import PackageDescription let package = Package( - name: "flutter_security_suite", + name: "security_toolkit", platforms: [ .iOS("13.0") ], products: [ - .library(name: "flutter-security-suite", targets: ["flutter_security_suite"]) + .library(name: "security-toolkit", targets: ["security_toolkit"]) ], dependencies: [ .package(name: "FlutterFramework", path: "../FlutterFramework") ], targets: [ .target( - name: "flutter_security_suite", + name: "security_toolkit", dependencies: [ .product(name: "FlutterFramework", package: "FlutterFramework"), "CInternalDarwin" diff --git a/ios/flutter_security_suite/Sources/CInternalDarwin/empty.c b/ios/security_toolkit/Sources/CInternalDarwin/empty.c similarity index 70% rename from ios/flutter_security_suite/Sources/CInternalDarwin/empty.c rename to ios/security_toolkit/Sources/CInternalDarwin/empty.c index 580a6b1..850b3da 100644 --- a/ios/flutter_security_suite/Sources/CInternalDarwin/empty.c +++ b/ios/security_toolkit/Sources/CInternalDarwin/empty.c @@ -1,6 +1,6 @@ // // empty.c -// flutter_security_suite +// security_toolkit // // Created by Tom Handcock on 08/05/2026. // diff --git a/ios/flutter_security_suite/Sources/CInternalDarwin/include/CInternalDarwin.h b/ios/security_toolkit/Sources/CInternalDarwin/include/CInternalDarwin.h similarity index 87% rename from ios/flutter_security_suite/Sources/CInternalDarwin/include/CInternalDarwin.h rename to ios/security_toolkit/Sources/CInternalDarwin/include/CInternalDarwin.h index 8628c68..12da567 100644 --- a/ios/flutter_security_suite/Sources/CInternalDarwin/include/CInternalDarwin.h +++ b/ios/security_toolkit/Sources/CInternalDarwin/include/CInternalDarwin.h @@ -1,6 +1,6 @@ // // CInternalDarwin.h -// flutter_security_suite +// security_toolkit // // Created by Tom Handcock on 08/05/2026. // diff --git a/ios/flutter_security_suite/Sources/flutter_security_suite/DebuggerChecker.swift b/ios/security_toolkit/Sources/security_toolkit/DebuggerChecker.swift similarity index 100% rename from ios/flutter_security_suite/Sources/flutter_security_suite/DebuggerChecker.swift rename to ios/security_toolkit/Sources/security_toolkit/DebuggerChecker.swift diff --git a/ios/flutter_security_suite/Sources/flutter_security_suite/JailbreakChecker.swift b/ios/security_toolkit/Sources/security_toolkit/JailbreakChecker.swift similarity index 100% rename from ios/flutter_security_suite/Sources/flutter_security_suite/JailbreakChecker.swift rename to ios/security_toolkit/Sources/security_toolkit/JailbreakChecker.swift diff --git a/ios/flutter_security_suite/Sources/flutter_security_suite/ReverseEngineerChecker.swift b/ios/security_toolkit/Sources/security_toolkit/ReverseEngineerChecker.swift similarity index 100% rename from ios/flutter_security_suite/Sources/flutter_security_suite/ReverseEngineerChecker.swift rename to ios/security_toolkit/Sources/security_toolkit/ReverseEngineerChecker.swift diff --git a/ios/flutter_security_suite/Sources/flutter_security_suite/SecuritySuiteApi.g.swift b/ios/security_toolkit/Sources/security_toolkit/SecurityToolkitApi.g.swift similarity index 67% rename from ios/flutter_security_suite/Sources/flutter_security_suite/SecuritySuiteApi.g.swift rename to ios/security_toolkit/Sources/security_toolkit/SecurityToolkitApi.g.swift index dcbb426..b7b2349 100644 --- a/ios/flutter_security_suite/Sources/flutter_security_suite/SecuritySuiteApi.g.swift +++ b/ios/security_toolkit/Sources/security_toolkit/SecurityToolkitApi.g.swift @@ -1,4 +1,4 @@ -// Autogenerated from Pigeon (v25.3.1), do not edit directly. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. // See also: https://pub.dev/packages/pigeon import Foundation @@ -12,7 +12,7 @@ import Foundation #endif /// Error class for passing custom error details to Dart side. -final class SecuritySuiteError: Error { +final class SecurityToolkitError: Error { let code: String let message: String? let details: Sendable? @@ -25,7 +25,7 @@ final class SecuritySuiteError: Error { var localizedDescription: String { return - "SecuritySuiteError(code: \(code), message: \(message ?? ""), details: \(details ?? "")" + "SecurityToolkitError(code: \(code), message: \(message ?? ""), details: \(details ?? "")" } } @@ -34,7 +34,7 @@ private func wrapResult(_ result: Any?) -> [Any?] { } private func wrapError(_ error: Any) -> [Any?] { - if let pigeonError = error as? SecuritySuiteError { + if let pigeonError = error as? SecurityToolkitError { return [ pigeonError.code, pigeonError.message, @@ -50,7 +50,7 @@ private func wrapError(_ error: Any) -> [Any?] { } return [ "\(error)", - "\(type(of: error))", + "\(Swift.type(of: error))", "Stacktrace: \(Thread.callStackSymbols)", ] } @@ -65,28 +65,28 @@ private func nilOrValue(_ value: Any?) -> T? { } -private class SecuritySuiteApiPigeonCodecReader: FlutterStandardReader { +private class SecurityToolkitApiPigeonCodecReader: FlutterStandardReader { } -private class SecuritySuiteApiPigeonCodecWriter: FlutterStandardWriter { +private class SecurityToolkitApiPigeonCodecWriter: FlutterStandardWriter { } -private class SecuritySuiteApiPigeonCodecReaderWriter: FlutterStandardReaderWriter { +private class SecurityToolkitApiPigeonCodecReaderWriter: FlutterStandardReaderWriter { override func reader(with data: Data) -> FlutterStandardReader { - return SecuritySuiteApiPigeonCodecReader(data: data) + return SecurityToolkitApiPigeonCodecReader(data: data) } override func writer(with data: NSMutableData) -> FlutterStandardWriter { - return SecuritySuiteApiPigeonCodecWriter(data: data) + return SecurityToolkitApiPigeonCodecWriter(data: data) } } -class SecuritySuiteApiPigeonCodec: FlutterStandardMessageCodec, @unchecked Sendable { - static let shared = SecuritySuiteApiPigeonCodec(readerWriter: SecuritySuiteApiPigeonCodecReaderWriter()) +class SecurityToolkitApiPigeonCodec: FlutterStandardMessageCodec, @unchecked Sendable { + static let shared = SecurityToolkitApiPigeonCodec(readerWriter: SecurityToolkitApiPigeonCodecReaderWriter()) } /// Generated protocol from Pigeon that represents a handler of messages from Flutter. -protocol SecuritySuiteApi { +protocol SecurityToolkitApi { func isRooted() throws -> Bool func isDebugged() throws -> Bool func isLikelyEmulator() throws -> Bool @@ -94,12 +94,12 @@ protocol SecuritySuiteApi { } /// Generated setup class from Pigeon to handle messages through the `binaryMessenger`. -class SecuritySuiteApiSetup { - static var codec: FlutterStandardMessageCodec { SecuritySuiteApiPigeonCodec.shared } - /// Sets up an instance of `SecuritySuiteApi` to handle messages through the `binaryMessenger`. - static func setUp(binaryMessenger: FlutterBinaryMessenger, api: SecuritySuiteApi?, messageChannelSuffix: String = "") { +class SecurityToolkitApiSetup { + static var codec: FlutterStandardMessageCodec { SecurityToolkitApiPigeonCodec.shared } + /// Sets up an instance of `SecurityToolkitApi` to handle messages through the `binaryMessenger`. + static func setUp(binaryMessenger: FlutterBinaryMessenger, api: SecurityToolkitApi?, messageChannelSuffix: String = "") { let channelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : "" - let isRootedChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isRooted\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + let isRootedChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.security_toolkit.SecurityToolkitApi.isRooted\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) if let api = api { isRootedChannel.setMessageHandler { _, reply in do { @@ -112,7 +112,7 @@ class SecuritySuiteApiSetup { } else { isRootedChannel.setMessageHandler(nil) } - let isDebuggedChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isDebugged\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + let isDebuggedChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.security_toolkit.SecurityToolkitApi.isDebugged\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) if let api = api { isDebuggedChannel.setMessageHandler { _, reply in do { @@ -125,7 +125,7 @@ class SecuritySuiteApiSetup { } else { isDebuggedChannel.setMessageHandler(nil) } - let isLikelyEmulatorChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isLikelyEmulator\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + let isLikelyEmulatorChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.security_toolkit.SecurityToolkitApi.isLikelyEmulator\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) if let api = api { isLikelyEmulatorChannel.setMessageHandler { _, reply in do { @@ -138,7 +138,7 @@ class SecuritySuiteApiSetup { } else { isLikelyEmulatorChannel.setMessageHandler(nil) } - let isReverseEngineeredChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isReverseEngineered\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + let isReverseEngineeredChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.security_toolkit.SecurityToolkitApi.isReverseEngineered\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) if let api = api { isReverseEngineeredChannel.setMessageHandler { _, reply in do { diff --git a/ios/flutter_security_suite/Sources/flutter_security_suite/SecuritySuiteImpl.swift b/ios/security_toolkit/Sources/security_toolkit/SecurityToolkitImpl.swift similarity index 89% rename from ios/flutter_security_suite/Sources/flutter_security_suite/SecuritySuiteImpl.swift rename to ios/security_toolkit/Sources/security_toolkit/SecurityToolkitImpl.swift index 3f437c2..49b75a7 100644 --- a/ios/flutter_security_suite/Sources/flutter_security_suite/SecuritySuiteImpl.swift +++ b/ios/security_toolkit/Sources/security_toolkit/SecurityToolkitImpl.swift @@ -1,11 +1,12 @@ // -// SecuritySuiteImpl.swift +// SecurityToolkitImpl.swift // Pods // // Created by Tom Handcock on 24/06/2025. +// Re-factored by Tom Handcock on 08/07/2025. // -class SecuritySuiteImpl: SecuritySuiteApi { +class SecurityToolkitImpl: SecurityToolkitApi { let debuggerChecker: DebuggerChecker let jailbreakChecker: JailbreakChecker diff --git a/ios/security_toolkit/Sources/security_toolkit/SecurityToolkitPlugin.swift b/ios/security_toolkit/Sources/security_toolkit/SecurityToolkitPlugin.swift new file mode 100644 index 0000000..06e94d2 --- /dev/null +++ b/ios/security_toolkit/Sources/security_toolkit/SecurityToolkitPlugin.swift @@ -0,0 +1,18 @@ +import Flutter +import UIKit + +public class SecurityToolkitPlugin: NSObject, FlutterPlugin { + + let securityToolkit: SecurityToolkitApi + + override init() { + self.securityToolkit = ServiceLocator.getSecurityToolkitApi() + } + + public static func register(with registrar: FlutterPluginRegistrar) { + let plugin = SecurityToolkitPlugin() + let securityToolkit = plugin.securityToolkit + SecurityToolkitApiSetup.setUp(binaryMessenger: registrar.messenger(), api: securityToolkit) + registrar.publish(plugin) + } +} diff --git a/ios/flutter_security_suite/Sources/flutter_security_suite/ServiceLocator.swift b/ios/security_toolkit/Sources/security_toolkit/ServiceLocator.swift similarity index 87% rename from ios/flutter_security_suite/Sources/flutter_security_suite/ServiceLocator.swift rename to ios/security_toolkit/Sources/security_toolkit/ServiceLocator.swift index 9ae3961..d3373b4 100644 --- a/ios/flutter_security_suite/Sources/flutter_security_suite/ServiceLocator.swift +++ b/ios/security_toolkit/Sources/security_toolkit/ServiceLocator.swift @@ -15,8 +15,8 @@ class ServiceLocator { static let simulatorChecker: SimulatorChecker = SimulatorChecker() - static func getSecuritySuiteApi() -> SecuritySuiteApi { - return SecuritySuiteImpl( + static func getSecurityToolkitApi() -> SecurityToolkitApi { + return SecurityToolkitImpl( debuggerChecker: debuggerChecker, jailbreakChecker: jailbreakChecker, reverseEngineerChecker: reverseEngineerChecker, diff --git a/ios/flutter_security_suite/Sources/flutter_security_suite/SimulatorChecker.swift b/ios/security_toolkit/Sources/security_toolkit/SimulatorChecker.swift similarity index 95% rename from ios/flutter_security_suite/Sources/flutter_security_suite/SimulatorChecker.swift rename to ios/security_toolkit/Sources/security_toolkit/SimulatorChecker.swift index e6ec07c..f082f1f 100644 --- a/ios/flutter_security_suite/Sources/flutter_security_suite/SimulatorChecker.swift +++ b/ios/security_toolkit/Sources/security_toolkit/SimulatorChecker.swift @@ -4,6 +4,8 @@ // // Created by Tom Handcock on 24/06/2025. // +import Foundation + class SimulatorChecker { static private let simulatorNameKey = "SIMULATOR_DEVICE_NAME" diff --git a/lib/flutter_security_suite.dart b/lib/flutter_security_suite.dart deleted file mode 100644 index 35f525d..0000000 --- a/lib/flutter_security_suite.dart +++ /dev/null @@ -1,3 +0,0 @@ -export 'src/engine/feature/security_suite.dart' show SecuritySuite; -export 'src/engine/feature/security_suite_models.dart' - show SecurityCheckResult, SecurityViolation; diff --git a/lib/security_toolkit.dart b/lib/security_toolkit.dart new file mode 100644 index 0000000..c4bf719 --- /dev/null +++ b/lib/security_toolkit.dart @@ -0,0 +1,3 @@ +export 'src/engine/feature/security_toolkit.dart' show SecurityToolkit; +export 'src/engine/feature/security_toolkit_models.dart' + show SecurityCheckResult, SecurityViolation; diff --git a/lib/src/engine/api/security_suite_api.g.dart b/lib/src/engine/api/security_suite_api.g.dart deleted file mode 100644 index 7fb3bcb..0000000 --- a/lib/src/engine/api/security_suite_api.g.dart +++ /dev/null @@ -1,164 +0,0 @@ -// Autogenerated from Pigeon (v25.3.1), do not edit directly. -// See also: https://pub.dev/packages/pigeon -// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers - -import 'dart:async'; -import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; - -import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer; -import 'package:flutter/services.dart'; - -PlatformException _createConnectionError(String channelName) { - return PlatformException( - code: 'channel-error', - message: 'Unable to establish connection on channel: "$channelName".', - ); -} - - -class _PigeonCodec extends StandardMessageCodec { - const _PigeonCodec(); - @override - void writeValue(WriteBuffer buffer, Object? value) { - if (value is int) { - buffer.putUint8(4); - buffer.putInt64(value); - } else { - super.writeValue(buffer, value); - } - } - - @override - Object? readValueOfType(int type, ReadBuffer buffer) { - switch (type) { - default: - return super.readValueOfType(type, buffer); - } - } -} - -class SecuritySuiteApi { - /// Constructor for [SecuritySuiteApi]. The [binaryMessenger] named argument is - /// available for dependency injection. If it is left null, the default - /// BinaryMessenger will be used which routes to the host platform. - SecuritySuiteApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; - final BinaryMessenger? pigeonVar_binaryMessenger; - - static const MessageCodec pigeonChannelCodec = _PigeonCodec(); - - final String pigeonVar_messageChannelSuffix; - - Future isRooted() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isRooted$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); - final List? pigeonVar_replyList = - await pigeonVar_sendFuture as List?; - if (pigeonVar_replyList == null) { - throw _createConnectionError(pigeonVar_channelName); - } else if (pigeonVar_replyList.length > 1) { - throw PlatformException( - code: pigeonVar_replyList[0]! as String, - message: pigeonVar_replyList[1] as String?, - details: pigeonVar_replyList[2], - ); - } else if (pigeonVar_replyList[0] == null) { - throw PlatformException( - code: 'null-error', - message: 'Host platform returned null value for non-null return value.', - ); - } else { - return (pigeonVar_replyList[0] as bool?)!; - } - } - - Future isDebugged() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isDebugged$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); - final List? pigeonVar_replyList = - await pigeonVar_sendFuture as List?; - if (pigeonVar_replyList == null) { - throw _createConnectionError(pigeonVar_channelName); - } else if (pigeonVar_replyList.length > 1) { - throw PlatformException( - code: pigeonVar_replyList[0]! as String, - message: pigeonVar_replyList[1] as String?, - details: pigeonVar_replyList[2], - ); - } else if (pigeonVar_replyList[0] == null) { - throw PlatformException( - code: 'null-error', - message: 'Host platform returned null value for non-null return value.', - ); - } else { - return (pigeonVar_replyList[0] as bool?)!; - } - } - - Future isLikelyEmulator() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isLikelyEmulator$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); - final List? pigeonVar_replyList = - await pigeonVar_sendFuture as List?; - if (pigeonVar_replyList == null) { - throw _createConnectionError(pigeonVar_channelName); - } else if (pigeonVar_replyList.length > 1) { - throw PlatformException( - code: pigeonVar_replyList[0]! as String, - message: pigeonVar_replyList[1] as String?, - details: pigeonVar_replyList[2], - ); - } else if (pigeonVar_replyList[0] == null) { - throw PlatformException( - code: 'null-error', - message: 'Host platform returned null value for non-null return value.', - ); - } else { - return (pigeonVar_replyList[0] as bool?)!; - } - } - - Future isReverseEngineered() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isReverseEngineered$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); - final List? pigeonVar_replyList = - await pigeonVar_sendFuture as List?; - if (pigeonVar_replyList == null) { - throw _createConnectionError(pigeonVar_channelName); - } else if (pigeonVar_replyList.length > 1) { - throw PlatformException( - code: pigeonVar_replyList[0]! as String, - message: pigeonVar_replyList[1] as String?, - details: pigeonVar_replyList[2], - ); - } else if (pigeonVar_replyList[0] == null) { - throw PlatformException( - code: 'null-error', - message: 'Host platform returned null value for non-null return value.', - ); - } else { - return (pigeonVar_replyList[0] as bool?)!; - } - } -} diff --git a/lib/src/engine/api/security_toolkit_api.g.dart b/lib/src/engine/api/security_toolkit_api.g.dart new file mode 100644 index 0000000..590a949 --- /dev/null +++ b/lib/src/engine/api/security_toolkit_api.g.dart @@ -0,0 +1,148 @@ +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon +// ignore_for_file: unused_import, unused_shown_name +// ignore_for_file: type=lint + +import 'dart:async'; +import 'dart:typed_data' show Float64List, Int32List, Int64List; + +import 'package:flutter/services.dart'; +import 'package:meta/meta.dart' show immutable, protected, visibleForTesting; + +Object? _extractReplyValueOrThrow( + List? replyList, + String channelName, { + required bool isNullValid, +}) { + if (replyList == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel: "$channelName".', + ); + } else if (replyList.length > 1) { + throw PlatformException( + code: replyList[0]! as String, + message: replyList[1] as String?, + details: replyList[2], + ); + } else if (!isNullValid && (replyList.isNotEmpty && replyList[0] == null)) { + throw PlatformException( + code: 'null-error', + message: 'Host platform returned null value for non-null return value.', + ); + } + return replyList.firstOrNull; +} + + + +class _PigeonCodec extends StandardMessageCodec { + const _PigeonCodec(); + @override + void writeValue(WriteBuffer buffer, Object? value) { + if (value is int) { + buffer.putUint8(4); + buffer.putInt64(value); + } else { + super.writeValue(buffer, value); + } + } + + @override + Object? readValueOfType(int type, ReadBuffer buffer) { + switch (type) { + default: + return super.readValueOfType(type, buffer); + } + } +} + +class SecurityToolkitApi { + /// Constructor for [SecurityToolkitApi]. The [binaryMessenger] named argument is + /// available for dependency injection. If it is left null, the default + /// BinaryMessenger will be used which routes to the host platform. + SecurityToolkitApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) + : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + final BinaryMessenger? pigeonVar_binaryMessenger; + + static const MessageCodec pigeonChannelCodec = _PigeonCodec(); + + final String pigeonVar_messageChannelSuffix; + + Future isRooted() async { + final pigeonVar_channelName = 'dev.flutter.pigeon.security_toolkit.SecurityToolkitApi.isRooted$pigeonVar_messageChannelSuffix'; + final pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); + final pigeonVar_replyList = await pigeonVar_sendFuture as List?; + + final Object? pigeonVar_replyValue = _extractReplyValueOrThrow( + pigeonVar_replyList, + pigeonVar_channelName, + isNullValid: false, + ) + ; + return pigeonVar_replyValue! as bool; + } + + Future isDebugged() async { + final pigeonVar_channelName = 'dev.flutter.pigeon.security_toolkit.SecurityToolkitApi.isDebugged$pigeonVar_messageChannelSuffix'; + final pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); + final pigeonVar_replyList = await pigeonVar_sendFuture as List?; + + final Object? pigeonVar_replyValue = _extractReplyValueOrThrow( + pigeonVar_replyList, + pigeonVar_channelName, + isNullValid: false, + ) + ; + return pigeonVar_replyValue! as bool; + } + + Future isLikelyEmulator() async { + final pigeonVar_channelName = 'dev.flutter.pigeon.security_toolkit.SecurityToolkitApi.isLikelyEmulator$pigeonVar_messageChannelSuffix'; + final pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); + final pigeonVar_replyList = await pigeonVar_sendFuture as List?; + + final Object? pigeonVar_replyValue = _extractReplyValueOrThrow( + pigeonVar_replyList, + pigeonVar_channelName, + isNullValid: false, + ) + ; + return pigeonVar_replyValue! as bool; + } + + Future isReverseEngineered() async { + final pigeonVar_channelName = 'dev.flutter.pigeon.security_toolkit.SecurityToolkitApi.isReverseEngineered$pigeonVar_messageChannelSuffix'; + final pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); + final pigeonVar_replyList = await pigeonVar_sendFuture as List?; + + final Object? pigeonVar_replyValue = _extractReplyValueOrThrow( + pigeonVar_replyList, + pigeonVar_channelName, + isNullValid: false, + ) + ; + return pigeonVar_replyValue! as bool; + } +} diff --git a/lib/src/engine/feature/security_suite.dart b/lib/src/engine/feature/security_toolkit.dart similarity index 85% rename from lib/src/engine/feature/security_suite.dart rename to lib/src/engine/feature/security_toolkit.dart index f1f7df4..b15a4bc 100644 --- a/lib/src/engine/feature/security_suite.dart +++ b/lib/src/engine/feature/security_toolkit.dart @@ -1,9 +1,9 @@ import 'package:flutter/foundation.dart'; -import 'package:flutter_security_suite/src/engine/api/security_suite_api.g.dart'; -import 'package:flutter_security_suite/src/engine/feature/security_suite_models.dart'; +import 'package:security_toolkit/src/engine/api/security_toolkit_api.g.dart'; +import 'package:security_toolkit/src/engine/feature/security_toolkit_models.dart'; -abstract class SecuritySuite { - static final _api = SecuritySuiteApi(); +abstract class SecurityToolkit { + static final _api = SecurityToolkitApi(); /// Answers [true] if the app is running on a rooted or jail-broken device. static Future isRooted() => _api.isRooted(); diff --git a/lib/src/engine/feature/security_suite_models.dart b/lib/src/engine/feature/security_toolkit_models.dart similarity index 100% rename from lib/src/engine/feature/security_suite_models.dart rename to lib/src/engine/feature/security_toolkit_models.dart diff --git a/pigeons/security_suite_messages.dart b/pigeons/security_suite_messages.dart deleted file mode 100644 index 1bd3060..0000000 --- a/pigeons/security_suite_messages.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:pigeon/pigeon.dart'; - -@ConfigurePigeon( - PigeonOptions( - dartPackageName: "flutter_security_suite", - dartOut: "lib/src/engine/api/security_suite_api.g.dart", - dartOptions: DartOptions(), - kotlinOut: - "android/src/main/kotlin/com/apadmi/flutter_security_suite/SecuritySuiteApi.g.kt", - kotlinOptions: KotlinOptions(errorClassName: "FlutterSecuritySuiteError"), - swiftOut: "ios/flutter_security_suite/Sources/flutter_security_suite/SecuritySuiteApi.g.swift", - swiftOptions: SwiftOptions(errorClassName: "SecuritySuiteError"), - ), -) -@HostApi() -abstract class SecuritySuiteApi { - bool isRooted(); - - bool isDebugged(); - - bool isLikelyEmulator(); - - bool isReverseEngineered(); -} diff --git a/pigeons/security_toolkit_messages.dart b/pigeons/security_toolkit_messages.dart new file mode 100644 index 0000000..72aab1c --- /dev/null +++ b/pigeons/security_toolkit_messages.dart @@ -0,0 +1,24 @@ +import 'package:pigeon/pigeon.dart'; + +@ConfigurePigeon( + PigeonOptions( + dartPackageName: "security_toolkit", + dartOut: "lib/src/engine/api/security_toolkit_api.g.dart", + dartOptions: DartOptions(), + kotlinOut: + "android/src/main/kotlin/com/apadmi/security_toolkit/SecurityToolkitApi.g.kt", + kotlinOptions: KotlinOptions(errorClassName: "SecurityToolkitError"), + swiftOut: "ios/security_toolkit/Sources/security_toolkit/SecurityToolkitApi.g.swift", + swiftOptions: SwiftOptions(errorClassName: "SecurityToolkitError"), + ), +) +@HostApi() +abstract class SecurityToolkitApi { + bool isRooted(); + + bool isDebugged(); + + bool isLikelyEmulator(); + + bool isReverseEngineered(); +} diff --git a/pubspec.yaml b/pubspec.yaml index b63bd96..2dda1c7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ -name: flutter_security_suite +name: security_toolkit description: "Security utilities for Flutter apps" -version: 1.1.0 +version: 2.0.0 homepage: environment: @@ -22,7 +22,7 @@ flutter: plugin: platforms: android: - package: com.apadmi.flutter_security_suite - pluginClass: FlutterSecuritySuitePlugin + package: com.apadmi.security_toolkit + pluginClass: SecurityToolkitPlugin ios: - pluginClass: FlutterSecuritySuitePlugin + pluginClass: SecurityToolkitPlugin diff --git a/test/unit/engine/feature/security_suite_models_test.dart b/test/unit/engine/feature/security_toolkit_models_test.dart similarity index 89% rename from test/unit/engine/feature/security_suite_models_test.dart rename to test/unit/engine/feature/security_toolkit_models_test.dart index fd97949..d306907 100644 --- a/test/unit/engine/feature/security_suite_models_test.dart +++ b/test/unit/engine/feature/security_toolkit_models_test.dart @@ -1,8 +1,8 @@ -import 'package:flutter_security_suite/flutter_security_suite.dart'; +import 'package:security_toolkit/security_toolkit.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { - group("Security suite models unit tests", () { + group("Security toolkit models unit tests", () { test("isSecureEnvironment - when no violations - returns true", () { // Setup final receiver = SecurityCheckResult({});