From e3e918285fe1e17162b9cec44df055a3a8aca85d Mon Sep 17 00:00:00 2001 From: Tom Ha Date: Fri, 26 Jun 2026 16:38:03 +0100 Subject: [PATCH 01/11] chore: Rename Dart package to `security_toolkit` --- .../security_toolkit/SecurityToolkitApi.g.kt | 136 +++++++++++++++ .../SecurityToolkitApi.g.swift | 155 +++++++++++++++++ lib/flutter_security_suite.dart | 3 - lib/security_toolkit.dart | 3 + lib/src/engine/api/security_suite_api.g.dart | 164 ------------------ .../engine/api/security_toolkit_api.g.dart | 148 ++++++++++++++++ ...urity_suite.dart => security_toolkit.dart} | 8 +- ...dels.dart => security_toolkit_models.dart} | 0 pigeons/security_suite_messages.dart | 24 --- pigeons/security_toolkit_messages.dart | 24 +++ pubspec.yaml | 2 +- ...dart => security_toolkit_models_test.dart} | 4 +- 12 files changed, 473 insertions(+), 198 deletions(-) create mode 100644 android/src/main/kotlin/com/apadmi/security_toolkit/SecurityToolkitApi.g.kt create mode 100644 ios/security_toolkit/Sources/security_toolkit/SecurityToolkitApi.g.swift delete mode 100644 lib/flutter_security_suite.dart create mode 100644 lib/security_toolkit.dart delete mode 100644 lib/src/engine/api/security_suite_api.g.dart create mode 100644 lib/src/engine/api/security_toolkit_api.g.dart rename lib/src/engine/feature/{security_suite.dart => security_toolkit.dart} (85%) rename lib/src/engine/feature/{security_suite_models.dart => security_toolkit_models.dart} (100%) delete mode 100644 pigeons/security_suite_messages.dart create mode 100644 pigeons/security_toolkit_messages.dart rename test/unit/engine/feature/{security_suite_models_test.dart => security_toolkit_models_test.dart} (89%) diff --git a/android/src/main/kotlin/com/apadmi/security_toolkit/SecurityToolkitApi.g.kt b/android/src/main/kotlin/com/apadmi/security_toolkit/SecurityToolkitApi.g.kt new file mode 100644 index 0000000..af7c844 --- /dev/null +++ b/android/src/main/kotlin/com/apadmi/security_toolkit/SecurityToolkitApi.g.kt @@ -0,0 +1,136 @@ +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon +@file:Suppress("UNCHECKED_CAST", "ArrayInDataClass") + + +import android.util.Log +import io.flutter.plugin.common.BasicMessageChannel +import io.flutter.plugin.common.BinaryMessenger +import io.flutter.plugin.common.EventChannel +import io.flutter.plugin.common.MessageCodec +import io.flutter.plugin.common.StandardMethodCodec +import io.flutter.plugin.common.StandardMessageCodec +import java.io.ByteArrayOutputStream +import java.nio.ByteBuffer +private object SecurityToolkitApiPigeonUtils { + + fun wrapResult(result: Any?): List { + return listOf(result) + } + + fun wrapError(exception: Throwable): List { + return if (exception is SecurityToolkitError) { + listOf( + exception.code, + exception.message, + exception.details + ) + } else { + listOf( + exception.javaClass.simpleName, + exception.toString(), + "Cause: " + exception.cause + ", Stacktrace: " + Log.getStackTraceString(exception) + ) + } + } +} + +/** + * Error class for passing custom error details to Flutter via a thrown PlatformException. + * @property code The error code. + * @property message The error message. + * @property details The error details. Must be a datatype supported by the api codec. + */ +class SecurityToolkitError ( + val code: String, + override val message: String? = null, + val details: Any? = null +) : RuntimeException() +private open class SecurityToolkitApiPigeonCodec : StandardMessageCodec() { + override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? { + return super.readValueOfType(type, buffer) + } + override fun writeValue(stream: ByteArrayOutputStream, value: Any?) { + super.writeValue(stream, value) + } +} + +/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ +interface SecurityToolkitApi { + fun isRooted(): Boolean + fun isDebugged(): Boolean + fun isLikelyEmulator(): Boolean + fun isReverseEngineered(): Boolean + + companion object { + /** The codec used by SecurityToolkitApi. */ + val codec: MessageCodec by lazy { + SecurityToolkitApiPigeonCodec() + } + /** Sets up an instance of `SecurityToolkitApi` to handle messages through the `binaryMessenger`. */ + @JvmOverloads + fun setUp(binaryMessenger: BinaryMessenger, api: SecurityToolkitApi?, messageChannelSuffix: String = "") { + val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" + run { + 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) { + SecurityToolkitApiPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } + run { + 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) { + SecurityToolkitApiPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } + run { + 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) { + SecurityToolkitApiPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } + run { + 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) { + SecurityToolkitApiPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } + } + } +} diff --git a/ios/security_toolkit/Sources/security_toolkit/SecurityToolkitApi.g.swift b/ios/security_toolkit/Sources/security_toolkit/SecurityToolkitApi.g.swift new file mode 100644 index 0000000..b7b2349 --- /dev/null +++ b/ios/security_toolkit/Sources/security_toolkit/SecurityToolkitApi.g.swift @@ -0,0 +1,155 @@ +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +import Foundation + +#if os(iOS) + import Flutter +#elseif os(macOS) + import FlutterMacOS +#else + #error("Unsupported platform.") +#endif + +/// Error class for passing custom error details to Dart side. +final class SecurityToolkitError: Error { + let code: String + let message: String? + let details: Sendable? + + init(code: String, message: String?, details: Sendable?) { + self.code = code + self.message = message + self.details = details + } + + var localizedDescription: String { + return + "SecurityToolkitError(code: \(code), message: \(message ?? ""), details: \(details ?? "")" + } +} + +private func wrapResult(_ result: Any?) -> [Any?] { + return [result] +} + +private func wrapError(_ error: Any) -> [Any?] { + if let pigeonError = error as? SecurityToolkitError { + return [ + pigeonError.code, + pigeonError.message, + pigeonError.details, + ] + } + if let flutterError = error as? FlutterError { + return [ + flutterError.code, + flutterError.message, + flutterError.details, + ] + } + return [ + "\(error)", + "\(Swift.type(of: error))", + "Stacktrace: \(Thread.callStackSymbols)", + ] +} + +private func isNullish(_ value: Any?) -> Bool { + return value is NSNull || value == nil +} + +private func nilOrValue(_ value: Any?) -> T? { + if value is NSNull { return nil } + return value as! T? +} + + +private class SecurityToolkitApiPigeonCodecReader: FlutterStandardReader { +} + +private class SecurityToolkitApiPigeonCodecWriter: FlutterStandardWriter { +} + +private class SecurityToolkitApiPigeonCodecReaderWriter: FlutterStandardReaderWriter { + override func reader(with data: Data) -> FlutterStandardReader { + return SecurityToolkitApiPigeonCodecReader(data: data) + } + + override func writer(with data: NSMutableData) -> FlutterStandardWriter { + return SecurityToolkitApiPigeonCodecWriter(data: data) + } +} + +class SecurityToolkitApiPigeonCodec: FlutterStandardMessageCodec, @unchecked Sendable { + static let shared = SecurityToolkitApiPigeonCodec(readerWriter: SecurityToolkitApiPigeonCodecReaderWriter()) +} + +/// Generated protocol from Pigeon that represents a handler of messages from Flutter. +protocol SecurityToolkitApi { + func isRooted() throws -> Bool + func isDebugged() throws -> Bool + func isLikelyEmulator() throws -> Bool + func isReverseEngineered() throws -> Bool +} + +/// Generated setup class from Pigeon to handle messages through the `binaryMessenger`. +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.security_toolkit.SecurityToolkitApi.isRooted\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + isRootedChannel.setMessageHandler { _, reply in + do { + let result = try api.isRooted() + reply(wrapResult(result)) + } catch { + reply(wrapError(error)) + } + } + } else { + isRootedChannel.setMessageHandler(nil) + } + 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 { + let result = try api.isDebugged() + reply(wrapResult(result)) + } catch { + reply(wrapError(error)) + } + } + } else { + isDebuggedChannel.setMessageHandler(nil) + } + 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 { + let result = try api.isLikelyEmulator() + reply(wrapResult(result)) + } catch { + reply(wrapError(error)) + } + } + } else { + isLikelyEmulatorChannel.setMessageHandler(nil) + } + 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 { + let result = try api.isReverseEngineered() + reply(wrapResult(result)) + } catch { + reply(wrapError(error)) + } + } + } else { + isReverseEngineeredChannel.setMessageHandler(nil) + } + } +} 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 8eb1a64..7e93d88 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,4 +1,4 @@ -name: flutter_security_suite +name: security_toolkit description: "Security utilities for Flutter apps" version: 1.1.0 homepage: 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({}); From 1fb1df8dbaa49d10ded3c11f323f2357b0ca00d3 Mon Sep 17 00:00:00 2001 From: Tom Ha Date: Fri, 26 Jun 2026 16:42:14 +0100 Subject: [PATCH 02/11] chore: Rename example app package --- example/lib/main.dart | 11 ++++------- example/lib/widgets/overall.dart | 2 +- example/lib/widgets/security_reading.dart | 2 +- example/pubspec.lock | 14 +++++++------- example/pubspec.yaml | 6 +++--- 5 files changed, 16 insertions(+), 19 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index 8e2d9a6..263a1d6 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()); @@ -33,7 +30,7 @@ class _MyAppState extends State { title: const Text('Flutter Security Suite 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..cb047cf 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: "1.1.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 From 80bf02e72581f4dfd6b79a9c64390fd9009c7222 Mon Sep 17 00:00:00 2001 From: Tom Ha Date: Mon, 20 Jul 2026 11:06:40 +0100 Subject: [PATCH 03/11] chore: Update Android package name --- android/build.gradle.kts | 4 +- android/settings.gradle.kts | 2 +- android/src/main/AndroidManifest.xml | 2 +- .../SecuritySuiteApi.g.kt | 136 ------------------ .../EmulatorChecker.kt | 2 +- .../SecurityToolkitImpl.kt} | 8 +- .../SecurityToolkitPlugin.kt} | 10 +- .../ServiceLocator.kt | 8 +- 8 files changed, 18 insertions(+), 154 deletions(-) delete mode 100644 android/src/main/kotlin/com/apadmi/flutter_security_suite/SecuritySuiteApi.g.kt rename android/src/main/kotlin/com/apadmi/{flutter_security_suite => security_toolkit}/EmulatorChecker.kt (99%) rename android/src/main/kotlin/com/apadmi/{flutter_security_suite/SecuritySuiteImpl.kt => security_toolkit/SecurityToolkitImpl.kt} (84%) rename android/src/main/kotlin/com/apadmi/{flutter_security_suite/FlutterSecuritySuitePlugin.kt => security_toolkit/SecurityToolkitPlugin.kt} (62%) rename android/src/main/kotlin/com/apadmi/{flutter_security_suite => security_toolkit}/ServiceLocator.kt (69%) 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/SecuritySuiteApi.g.kt b/android/src/main/kotlin/com/apadmi/flutter_security_suite/SecuritySuiteApi.g.kt deleted file mode 100644 index e5782c6..0000000 --- a/android/src/main/kotlin/com/apadmi/flutter_security_suite/SecuritySuiteApi.g.kt +++ /dev/null @@ -1,136 +0,0 @@ -// Autogenerated from Pigeon (v25.3.1), do not edit directly. -// See also: https://pub.dev/packages/pigeon -@file:Suppress("UNCHECKED_CAST", "ArrayInDataClass") - - -import android.util.Log -import io.flutter.plugin.common.BasicMessageChannel -import io.flutter.plugin.common.BinaryMessenger -import io.flutter.plugin.common.EventChannel -import io.flutter.plugin.common.MessageCodec -import io.flutter.plugin.common.StandardMethodCodec -import io.flutter.plugin.common.StandardMessageCodec -import java.io.ByteArrayOutputStream -import java.nio.ByteBuffer -private object SecuritySuiteApiPigeonUtils { - - fun wrapResult(result: Any?): List { - return listOf(result) - } - - fun wrapError(exception: Throwable): List { - return if (exception is FlutterSecuritySuiteError) { - listOf( - exception.code, - exception.message, - exception.details - ) - } else { - listOf( - exception.javaClass.simpleName, - exception.toString(), - "Cause: " + exception.cause + ", Stacktrace: " + Log.getStackTraceString(exception) - ) - } - } -} - -/** - * Error class for passing custom error details to Flutter via a thrown PlatformException. - * @property code The error code. - * @property message The error message. - * @property details The error details. Must be a datatype supported by the api codec. - */ -class FlutterSecuritySuiteError ( - val code: String, - override val message: String? = null, - val details: Any? = null -) : Throwable() -private open class SecuritySuiteApiPigeonCodec : StandardMessageCodec() { - override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? { - return super.readValueOfType(type, buffer) - } - override fun writeValue(stream: ByteArrayOutputStream, value: Any?) { - super.writeValue(stream, value) - } -} - -/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ -interface SecuritySuiteApi { - fun isRooted(): Boolean - fun isDebugged(): Boolean - fun isLikelyEmulator(): Boolean - fun isReverseEngineered(): Boolean - - companion object { - /** The codec used by SecuritySuiteApi. */ - val codec: MessageCodec by lazy { - SecuritySuiteApiPigeonCodec() - } - /** Sets up an instance of `SecuritySuiteApi` to handle messages through the `binaryMessenger`. */ - @JvmOverloads - fun setUp(binaryMessenger: BinaryMessenger, api: SecuritySuiteApi?, messageChannelSuffix: String = "") { - val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isRooted$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.isRooted()) - } catch (exception: Throwable) { - SecuritySuiteApiPigeonUtils.wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isDebugged$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.isDebugged()) - } catch (exception: Throwable) { - SecuritySuiteApiPigeonUtils.wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isLikelyEmulator$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.isLikelyEmulator()) - } catch (exception: Throwable) { - SecuritySuiteApiPigeonUtils.wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isReverseEngineered$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.isReverseEngineered()) - } catch (exception: Throwable) { - SecuritySuiteApiPigeonUtils.wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - } - } -} 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/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 From 1895c5406f5dccc0a6f4c02a651cdb830fbfc5b4 Mon Sep 17 00:00:00 2001 From: Tom Ha Date: Mon, 20 Jul 2026 11:07:02 +0100 Subject: [PATCH 04/11] chore: Update iOS package name --- .../FlutterSecuritySuitePlugin.swift | 18 -- .../SecuritySuiteApi.g.swift | 155 ------------------ ...suite.podspec => security_toolkit.podspec} | 4 +- .../Package.swift | 6 +- .../Sources/CInternalDarwin/empty.c | 2 +- .../CInternalDarwin/include/CInternalDarwin.h | 2 +- .../security_toolkit}/DebuggerChecker.swift | 0 .../security_toolkit}/JailbreakChecker.swift | 0 .../ReverseEngineerChecker.swift | 0 .../SecurityToolkitImpl.swift} | 5 +- .../SecurityToolkitPlugin.swift | 18 ++ .../security_toolkit}/ServiceLocator.swift | 0 .../security_toolkit}/SimulatorChecker.swift | 0 13 files changed, 28 insertions(+), 182 deletions(-) delete mode 100644 ios/flutter_security_suite/Sources/flutter_security_suite/FlutterSecuritySuitePlugin.swift delete mode 100644 ios/flutter_security_suite/Sources/flutter_security_suite/SecuritySuiteApi.g.swift rename ios/{flutter_security_suite.podspec => security_toolkit.podspec} (82%) rename ios/{flutter_security_suite => security_toolkit}/Package.swift (78%) rename ios/{flutter_security_suite => security_toolkit}/Sources/CInternalDarwin/empty.c (70%) rename ios/{flutter_security_suite => security_toolkit}/Sources/CInternalDarwin/include/CInternalDarwin.h (87%) rename ios/{flutter_security_suite/Sources/flutter_security_suite => security_toolkit/Sources/security_toolkit}/DebuggerChecker.swift (100%) rename ios/{flutter_security_suite/Sources/flutter_security_suite => security_toolkit/Sources/security_toolkit}/JailbreakChecker.swift (100%) rename ios/{flutter_security_suite/Sources/flutter_security_suite => security_toolkit/Sources/security_toolkit}/ReverseEngineerChecker.swift (100%) rename ios/{flutter_security_suite/Sources/flutter_security_suite/SecuritySuiteImpl.swift => security_toolkit/Sources/security_toolkit/SecurityToolkitImpl.swift} (89%) create mode 100644 ios/security_toolkit/Sources/security_toolkit/SecurityToolkitPlugin.swift rename ios/{flutter_security_suite/Sources/flutter_security_suite => security_toolkit/Sources/security_toolkit}/ServiceLocator.swift (100%) rename ios/{flutter_security_suite/Sources/flutter_security_suite => security_toolkit/Sources/security_toolkit}/SimulatorChecker.swift (100%) 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/Sources/flutter_security_suite/SecuritySuiteApi.g.swift b/ios/flutter_security_suite/Sources/flutter_security_suite/SecuritySuiteApi.g.swift deleted file mode 100644 index dcbb426..0000000 --- a/ios/flutter_security_suite/Sources/flutter_security_suite/SecuritySuiteApi.g.swift +++ /dev/null @@ -1,155 +0,0 @@ -// Autogenerated from Pigeon (v25.3.1), do not edit directly. -// See also: https://pub.dev/packages/pigeon - -import Foundation - -#if os(iOS) - import Flutter -#elseif os(macOS) - import FlutterMacOS -#else - #error("Unsupported platform.") -#endif - -/// Error class for passing custom error details to Dart side. -final class SecuritySuiteError: Error { - let code: String - let message: String? - let details: Sendable? - - init(code: String, message: String?, details: Sendable?) { - self.code = code - self.message = message - self.details = details - } - - var localizedDescription: String { - return - "SecuritySuiteError(code: \(code), message: \(message ?? ""), details: \(details ?? "")" - } -} - -private func wrapResult(_ result: Any?) -> [Any?] { - return [result] -} - -private func wrapError(_ error: Any) -> [Any?] { - if let pigeonError = error as? SecuritySuiteError { - return [ - pigeonError.code, - pigeonError.message, - pigeonError.details, - ] - } - if let flutterError = error as? FlutterError { - return [ - flutterError.code, - flutterError.message, - flutterError.details, - ] - } - return [ - "\(error)", - "\(type(of: error))", - "Stacktrace: \(Thread.callStackSymbols)", - ] -} - -private func isNullish(_ value: Any?) -> Bool { - return value is NSNull || value == nil -} - -private func nilOrValue(_ value: Any?) -> T? { - if value is NSNull { return nil } - return value as! T? -} - - -private class SecuritySuiteApiPigeonCodecReader: FlutterStandardReader { -} - -private class SecuritySuiteApiPigeonCodecWriter: FlutterStandardWriter { -} - -private class SecuritySuiteApiPigeonCodecReaderWriter: FlutterStandardReaderWriter { - override func reader(with data: Data) -> FlutterStandardReader { - return SecuritySuiteApiPigeonCodecReader(data: data) - } - - override func writer(with data: NSMutableData) -> FlutterStandardWriter { - return SecuritySuiteApiPigeonCodecWriter(data: data) - } -} - -class SecuritySuiteApiPigeonCodec: FlutterStandardMessageCodec, @unchecked Sendable { - static let shared = SecuritySuiteApiPigeonCodec(readerWriter: SecuritySuiteApiPigeonCodecReaderWriter()) -} - -/// Generated protocol from Pigeon that represents a handler of messages from Flutter. -protocol SecuritySuiteApi { - func isRooted() throws -> Bool - func isDebugged() throws -> Bool - func isLikelyEmulator() throws -> Bool - func isReverseEngineered() throws -> Bool -} - -/// 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 = "") { - let channelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : "" - let isRootedChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isRooted\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) - if let api = api { - isRootedChannel.setMessageHandler { _, reply in - do { - let result = try api.isRooted() - reply(wrapResult(result)) - } catch { - reply(wrapError(error)) - } - } - } else { - isRootedChannel.setMessageHandler(nil) - } - let isDebuggedChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isDebugged\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) - if let api = api { - isDebuggedChannel.setMessageHandler { _, reply in - do { - let result = try api.isDebugged() - reply(wrapResult(result)) - } catch { - reply(wrapError(error)) - } - } - } else { - isDebuggedChannel.setMessageHandler(nil) - } - let isLikelyEmulatorChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isLikelyEmulator\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) - if let api = api { - isLikelyEmulatorChannel.setMessageHandler { _, reply in - do { - let result = try api.isLikelyEmulator() - reply(wrapResult(result)) - } catch { - reply(wrapError(error)) - } - } - } else { - isLikelyEmulatorChannel.setMessageHandler(nil) - } - let isReverseEngineeredChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.flutter_security_suite.SecuritySuiteApi.isReverseEngineered\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) - if let api = api { - isReverseEngineeredChannel.setMessageHandler { _, reply in - do { - let result = try api.isReverseEngineered() - reply(wrapResult(result)) - } catch { - reply(wrapError(error)) - } - } - } else { - isReverseEngineeredChannel.setMessageHandler(nil) - } - } -} 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/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 100% rename from ios/flutter_security_suite/Sources/flutter_security_suite/ServiceLocator.swift rename to ios/security_toolkit/Sources/security_toolkit/ServiceLocator.swift diff --git a/ios/flutter_security_suite/Sources/flutter_security_suite/SimulatorChecker.swift b/ios/security_toolkit/Sources/security_toolkit/SimulatorChecker.swift similarity index 100% rename from ios/flutter_security_suite/Sources/flutter_security_suite/SimulatorChecker.swift rename to ios/security_toolkit/Sources/security_toolkit/SimulatorChecker.swift From 64c94898549c5962797c2cb387ac38e760578a65 Mon Sep 17 00:00:00 2001 From: Tom Ha Date: Mon, 20 Jul 2026 11:07:28 +0100 Subject: [PATCH 05/11] chore: Update example app package name --- example/README.md | 4 ++-- example/ios/Runner.xcodeproj/project.pbxproj | 4 ++++ example/ios/Runner/Info.plist | 2 +- example/lib/main.dart | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) 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/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 522b916..32cb558 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -55,6 +55,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 784666492D4C4C64000A1A5F /* FlutterFramework */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterFramework; path = Flutter/ephemeral/Packages/.packages/FlutterFramework; sourceTree = ""; }; + 78DABEA22ED26510000E7860 /* security_toolkit */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = security_toolkit; path = ../../ios/security_toolkit; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -86,6 +88,8 @@ 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( + 78DABEA22ED26510000E7860 /* security_toolkit */, + 784666492D4C4C64000A1A5F /* FlutterFramework */, 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist index 2f5ec71..b947ded 100644 --- a/example/ios/Runner/Info.plist +++ b/example/ios/Runner/Info.plist @@ -15,7 +15,7 @@ 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 263a1d6..84d08b7 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -27,7 +27,7 @@ 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: SecurityToolkit.checkSecureEnvironment(), From 8d28110a3f744c3f665c2ed81ec44519e24910c2 Mon Sep 17 00:00:00 2001 From: Tom Ha Date: Mon, 20 Jul 2026 11:09:02 +0100 Subject: [PATCH 06/11] chore: Update Flutter plugin front-matter --- LICENSE | 2 +- README.md | 6 +++--- pubspec.yaml | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) 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..0f1541e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Flutter Security Suite +# Security Toolkit > [!IMPORTANT] > Whilst this plugin is open-source, and you are free to use according to the license, this is @@ -27,9 +27,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/pubspec.yaml b/pubspec.yaml index 7e93d88..7eec0f9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -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 From 9ff7122eb50b87024045a21392d298e8a9ce1a0b Mon Sep 17 00:00:00 2001 From: Tom Ha Date: Mon, 20 Jul 2026 11:24:39 +0100 Subject: [PATCH 07/11] fix: Update symbol names in `ServiceLocator` --- .../Sources/security_toolkit/ServiceLocator.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/security_toolkit/Sources/security_toolkit/ServiceLocator.swift b/ios/security_toolkit/Sources/security_toolkit/ServiceLocator.swift index 9ae3961..d3373b4 100644 --- a/ios/security_toolkit/Sources/security_toolkit/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, From 873f40e0c2434cf31f9563f111e9b520deece002 Mon Sep 17 00:00:00 2001 From: Tom Ha Date: Mon, 20 Jul 2026 11:24:54 +0100 Subject: [PATCH 08/11] fix: Add missing `Foundation` import in `SimulatorChecker` --- .../Sources/security_toolkit/SimulatorChecker.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ios/security_toolkit/Sources/security_toolkit/SimulatorChecker.swift b/ios/security_toolkit/Sources/security_toolkit/SimulatorChecker.swift index e6ec07c..f082f1f 100644 --- a/ios/security_toolkit/Sources/security_toolkit/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" From 31f912470bb91c0c683b3078d77bd0a73f2b16f2 Mon Sep 17 00:00:00 2001 From: Tom Ha Date: Mon, 20 Jul 2026 13:48:10 +0100 Subject: [PATCH 09/11] fix: Rename Android example app package ID --- example/android/app/build.gradle.kts | 4 ++-- example/android/app/src/main/AndroidManifest.xml | 2 +- .../security_toolkit_example}/MainActivity.kt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename example/android/app/src/main/kotlin/com/{example/flutter_security_suite_example => apadmi/security_toolkit_example}/MainActivity.kt (64%) 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 @@ Date: Mon, 20 Jul 2026 13:48:19 +0100 Subject: [PATCH 10/11] docs: Update docs with new name --- CONTRIBUTING.md | 2 +- README.md | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) 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/README.md b/README.md index 0f1541e..dc218ba 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -# Security Toolkit - > [!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 From 5b964a12b59d346355efe8ca7bfac437c86b6265 Mon Sep 17 00:00:00 2001 From: Tom Ha Date: Tue, 21 Jul 2026 09:05:55 +0100 Subject: [PATCH 11/11] chore: Bump version --- CHANGELOG.md | 4 ++++ example/pubspec.lock | 2 +- pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) 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/example/pubspec.lock b/example/pubspec.lock index cb047cf..e221e8d 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -192,7 +192,7 @@ packages: path: ".." relative: true source: path - version: "1.1.0" + version: "2.0.0" sky_engine: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 3866d22..2dda1c7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: security_toolkit description: "Security utilities for Flutter apps" -version: 1.1.0 +version: 2.0.0 homepage: environment: