Skip to content

Commit 98e57f2

Browse files
committed
feat(app_check,windows): add custom provider support for Windows
1 parent 55a7f6f commit 98e57f2

File tree

14 files changed

+596
-370
lines changed

14 files changed

+596
-370
lines changed

packages/firebase_app_check/firebase_app_check/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/FirebaseAppCheckPlugin.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class FirebaseAppCheckPlugin :
5555
androidProvider: String?,
5656
appleProvider: String?,
5757
debugToken: String?,
58+
windowsProvider: String?,
5859
callback: (Result<Unit>) -> Unit
5960
) {
6061
try {

packages/firebase_app_check/firebase_app_check/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/GeneratedAndroidFirebaseAppCheck.g.kt

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ import java.io.ByteArrayOutputStream
1818
import java.nio.ByteBuffer
1919
private object GeneratedAndroidFirebaseAppCheckPigeonUtils {
2020

21+
fun createConnectionError(channelName: String): FlutterError {
22+
return FlutterError("channel-error", "Unable to establish connection on channel: '$channelName'.", "") }
23+
2124
fun wrapResult(result: Any?): List<Any?> {
2225
return listOf(result)
2326
}
@@ -62,7 +65,7 @@ private open class GeneratedAndroidFirebaseAppCheckPigeonCodec : StandardMessage
6265

6366
/** Generated interface from Pigeon that represents a handler of messages from Flutter. */
6467
interface FirebaseAppCheckHostApi {
65-
fun activate(appName: String, androidProvider: String?, appleProvider: String?, debugToken: String?, callback: (Result<Unit>) -> Unit)
68+
fun activate(appName: String, androidProvider: String?, appleProvider: String?, debugToken: String?, windowsProvider: String?, callback: (Result<Unit>) -> Unit)
6669
fun getToken(appName: String, forceRefresh: Boolean, callback: (Result<String?>) -> Unit)
6770
fun setTokenAutoRefreshEnabled(appName: String, isTokenAutoRefreshEnabled: Boolean, callback: (Result<Unit>) -> Unit)
6871
fun registerTokenListener(appName: String, callback: (Result<String>) -> Unit)
@@ -86,7 +89,8 @@ interface FirebaseAppCheckHostApi {
8689
val androidProviderArg = args[1] as String?
8790
val appleProviderArg = args[2] as String?
8891
val debugTokenArg = args[3] as String?
89-
api.activate(appNameArg, androidProviderArg, appleProviderArg, debugTokenArg) { result: Result<Unit> ->
92+
val windowsProviderArg = args[4] as String?
93+
api.activate(appNameArg, androidProviderArg, appleProviderArg, debugTokenArg, windowsProviderArg) { result: Result<Unit> ->
9094
val error = result.exceptionOrNull()
9195
if (error != null) {
9296
reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapError(error))
@@ -183,3 +187,32 @@ interface FirebaseAppCheckHostApi {
183187
}
184188
}
185189
}
190+
/** Generated class from Pigeon that represents Flutter messages that can be called from Kotlin. */
191+
class FirebaseAppCheckFlutterApi(private val binaryMessenger: BinaryMessenger, private val messageChannelSuffix: String = "") {
192+
companion object {
193+
/** The codec used by FirebaseAppCheckFlutterApi. */
194+
val codec: MessageCodec<Any?> by lazy {
195+
GeneratedAndroidFirebaseAppCheckPigeonCodec()
196+
}
197+
}
198+
fun getCustomToken(callback: (Result<String>) -> Unit)
199+
{
200+
val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else ""
201+
val channelName = "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckFlutterApi.getCustomToken$separatedMessageChannelSuffix"
202+
val channel = BasicMessageChannel<Any?>(binaryMessenger, channelName, codec)
203+
channel.send(null) {
204+
if (it is List<*>) {
205+
if (it.size > 1) {
206+
callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?)))
207+
} else if (it[0] == null) {
208+
callback(Result.failure(FlutterError("null-error", "Flutter api returned null value for non-null return value.", "")))
209+
} else {
210+
val output = it[0] as String
211+
callback(Result.success(output))
212+
}
213+
} else {
214+
callback(Result.failure(GeneratedAndroidFirebaseAppCheckPigeonUtils.createConnectionError(channelName)))
215+
}
216+
}
217+
}
218+
}

packages/firebase_app_check/firebase_app_check/ios/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckMessages.g.swift

Lines changed: 81 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,13 @@ final class PigeonError: Error {
2727
}
2828

2929
var localizedDescription: String {
30-
"PigeonError(code: \(code), message: \(message ?? "<nil>"), details: \(details ?? "<nil>")"
30+
return
31+
"PigeonError(code: \(code), message: \(message ?? "<nil>"), details: \(details ?? "<nil>")"
3132
}
3233
}
3334

3435
private func wrapResult(_ result: Any?) -> [Any?] {
35-
[result]
36+
return [result]
3637
}
3738

3839
private func wrapError(_ error: Any) -> [Any?] {
@@ -57,171 +58,140 @@ private func wrapError(_ error: Any) -> [Any?] {
5758
]
5859
}
5960

61+
private func createConnectionError(withChannelName channelName: String) -> PigeonError {
62+
return PigeonError(code: "channel-error", message: "Unable to establish connection on channel: '\(channelName)'.", details: "")
63+
}
64+
6065
private func isNullish(_ value: Any?) -> Bool {
61-
value is NSNull || value == nil
66+
return value is NSNull || value == nil
6267
}
6368

6469
private func nilOrValue<T>(_ value: Any?) -> T? {
6570
if value is NSNull { return nil }
6671
return value as! T?
6772
}
6873

69-
private class FirebaseAppCheckMessagesPigeonCodecReader: FlutterStandardReader {}
7074

71-
private class FirebaseAppCheckMessagesPigeonCodecWriter: FlutterStandardWriter {}
75+
private class FirebaseAppCheckMessagesPigeonCodecReader: FlutterStandardReader {
76+
}
77+
78+
private class FirebaseAppCheckMessagesPigeonCodecWriter: FlutterStandardWriter {
79+
}
7280

7381
private class FirebaseAppCheckMessagesPigeonCodecReaderWriter: FlutterStandardReaderWriter {
7482
override func reader(with data: Data) -> FlutterStandardReader {
75-
FirebaseAppCheckMessagesPigeonCodecReader(data: data)
83+
return FirebaseAppCheckMessagesPigeonCodecReader(data: data)
7684
}
7785

7886
override func writer(with data: NSMutableData) -> FlutterStandardWriter {
79-
FirebaseAppCheckMessagesPigeonCodecWriter(data: data)
87+
return FirebaseAppCheckMessagesPigeonCodecWriter(data: data)
8088
}
8189
}
8290

8391
class FirebaseAppCheckMessagesPigeonCodec: FlutterStandardMessageCodec, @unchecked Sendable {
84-
static let shared =
85-
FirebaseAppCheckMessagesPigeonCodec(
86-
readerWriter: FirebaseAppCheckMessagesPigeonCodecReaderWriter()
87-
)
92+
static let shared = FirebaseAppCheckMessagesPigeonCodec(readerWriter: FirebaseAppCheckMessagesPigeonCodecReaderWriter())
8893
}
8994

95+
9096
/// Generated protocol from Pigeon that represents a handler of messages from Flutter.
9197
protocol FirebaseAppCheckHostApi {
92-
func activate(appName: String, androidProvider: String?, appleProvider: String?,
93-
debugToken: String?, completion: @escaping (Result<Void, Error>) -> Void)
94-
func getToken(appName: String, forceRefresh: Bool,
95-
completion: @escaping (Result<String?, Error>) -> Void)
96-
func setTokenAutoRefreshEnabled(appName: String, isTokenAutoRefreshEnabled: Bool,
97-
completion: @escaping (Result<Void, Error>) -> Void)
98+
func activate(appName: String, androidProvider: String?, appleProvider: String?, debugToken: String?, windowsProvider: String?, completion: @escaping (Result<Void, Error>) -> Void)
99+
func getToken(appName: String, forceRefresh: Bool, completion: @escaping (Result<String?, Error>) -> Void)
100+
func setTokenAutoRefreshEnabled(appName: String, isTokenAutoRefreshEnabled: Bool, completion: @escaping (Result<Void, Error>) -> Void)
98101
func registerTokenListener(appName: String, completion: @escaping (Result<String, Error>) -> Void)
99-
func getLimitedUseAppCheckToken(appName: String,
100-
completion: @escaping (Result<String, Error>) -> Void)
102+
func getLimitedUseAppCheckToken(appName: String, completion: @escaping (Result<String, Error>) -> Void)
101103
}
102104

103105
/// Generated setup class from Pigeon to handle messages through the `binaryMessenger`.
104106
class FirebaseAppCheckHostApiSetup {
105-
static var codec: FlutterStandardMessageCodec {
106-
FirebaseAppCheckMessagesPigeonCodec.shared
107-
}
108-
109-
/// Sets up an instance of `FirebaseAppCheckHostApi` to handle messages through the
110-
/// `binaryMessenger`.
111-
static func setUp(binaryMessenger: FlutterBinaryMessenger, api: FirebaseAppCheckHostApi?,
112-
messageChannelSuffix: String = "") {
107+
static var codec: FlutterStandardMessageCodec { FirebaseAppCheckMessagesPigeonCodec.shared }
108+
/// Sets up an instance of `FirebaseAppCheckHostApi` to handle messages through the `binaryMessenger`.
109+
static func setUp(binaryMessenger: FlutterBinaryMessenger, api: FirebaseAppCheckHostApi?, messageChannelSuffix: String = "") {
113110
let channelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : ""
114-
let activateChannel = FlutterBasicMessageChannel(
115-
name: "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.activate\(channelSuffix)",
116-
binaryMessenger: binaryMessenger,
117-
codec: codec
118-
)
119-
if let api {
111+
let activateChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.activate\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
112+
if let api = api {
120113
activateChannel.setMessageHandler { message, reply in
121114
let args = message as! [Any?]
122115
let appNameArg = args[0] as! String
123116
let androidProviderArg: String? = nilOrValue(args[1])
124117
let appleProviderArg: String? = nilOrValue(args[2])
125118
let debugTokenArg: String? = nilOrValue(args[3])
126-
api.activate(
127-
appName: appNameArg,
128-
androidProvider: androidProviderArg,
129-
appleProvider: appleProviderArg,
130-
debugToken: debugTokenArg
131-
) { result in
119+
let windowsProviderArg: String? = nilOrValue(args[4])
120+
api.activate(appName: appNameArg, androidProvider: androidProviderArg, appleProvider: appleProviderArg, debugToken: debugTokenArg, windowsProvider: windowsProviderArg) { result in
132121
switch result {
133122
case .success:
134123
reply(wrapResult(nil))
135-
case let .failure(error):
124+
case .failure(let error):
136125
reply(wrapError(error))
137126
}
138127
}
139128
}
140129
} else {
141130
activateChannel.setMessageHandler(nil)
142131
}
143-
let getTokenChannel = FlutterBasicMessageChannel(
144-
name: "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.getToken\(channelSuffix)",
145-
binaryMessenger: binaryMessenger,
146-
codec: codec
147-
)
148-
if let api {
132+
let getTokenChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.getToken\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
133+
if let api = api {
149134
getTokenChannel.setMessageHandler { message, reply in
150135
let args = message as! [Any?]
151136
let appNameArg = args[0] as! String
152137
let forceRefreshArg = args[1] as! Bool
153138
api.getToken(appName: appNameArg, forceRefresh: forceRefreshArg) { result in
154139
switch result {
155-
case let .success(res):
140+
case .success(let res):
156141
reply(wrapResult(res))
157-
case let .failure(error):
142+
case .failure(let error):
158143
reply(wrapError(error))
159144
}
160145
}
161146
}
162147
} else {
163148
getTokenChannel.setMessageHandler(nil)
164149
}
165-
let setTokenAutoRefreshEnabledChannel = FlutterBasicMessageChannel(
166-
name: "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.setTokenAutoRefreshEnabled\(channelSuffix)",
167-
binaryMessenger: binaryMessenger,
168-
codec: codec
169-
)
170-
if let api {
150+
let setTokenAutoRefreshEnabledChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.setTokenAutoRefreshEnabled\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
151+
if let api = api {
171152
setTokenAutoRefreshEnabledChannel.setMessageHandler { message, reply in
172153
let args = message as! [Any?]
173154
let appNameArg = args[0] as! String
174155
let isTokenAutoRefreshEnabledArg = args[1] as! Bool
175-
api.setTokenAutoRefreshEnabled(
176-
appName: appNameArg,
177-
isTokenAutoRefreshEnabled: isTokenAutoRefreshEnabledArg
178-
) { result in
156+
api.setTokenAutoRefreshEnabled(appName: appNameArg, isTokenAutoRefreshEnabled: isTokenAutoRefreshEnabledArg) { result in
179157
switch result {
180158
case .success:
181159
reply(wrapResult(nil))
182-
case let .failure(error):
160+
case .failure(let error):
183161
reply(wrapError(error))
184162
}
185163
}
186164
}
187165
} else {
188166
setTokenAutoRefreshEnabledChannel.setMessageHandler(nil)
189167
}
190-
let registerTokenListenerChannel = FlutterBasicMessageChannel(
191-
name: "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.registerTokenListener\(channelSuffix)",
192-
binaryMessenger: binaryMessenger,
193-
codec: codec
194-
)
195-
if let api {
168+
let registerTokenListenerChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.registerTokenListener\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
169+
if let api = api {
196170
registerTokenListenerChannel.setMessageHandler { message, reply in
197171
let args = message as! [Any?]
198172
let appNameArg = args[0] as! String
199173
api.registerTokenListener(appName: appNameArg) { result in
200174
switch result {
201-
case let .success(res):
175+
case .success(let res):
202176
reply(wrapResult(res))
203-
case let .failure(error):
177+
case .failure(let error):
204178
reply(wrapError(error))
205179
}
206180
}
207181
}
208182
} else {
209183
registerTokenListenerChannel.setMessageHandler(nil)
210184
}
211-
let getLimitedUseAppCheckTokenChannel = FlutterBasicMessageChannel(
212-
name: "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.getLimitedUseAppCheckToken\(channelSuffix)",
213-
binaryMessenger: binaryMessenger,
214-
codec: codec
215-
)
216-
if let api {
185+
let getLimitedUseAppCheckTokenChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.getLimitedUseAppCheckToken\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
186+
if let api = api {
217187
getLimitedUseAppCheckTokenChannel.setMessageHandler { message, reply in
218188
let args = message as! [Any?]
219189
let appNameArg = args[0] as! String
220190
api.getLimitedUseAppCheckToken(appName: appNameArg) { result in
221191
switch result {
222-
case let .success(res):
192+
case .success(let res):
223193
reply(wrapResult(res))
224-
case let .failure(error):
194+
case .failure(let error):
225195
reply(wrapError(error))
226196
}
227197
}
@@ -231,3 +201,39 @@ class FirebaseAppCheckHostApiSetup {
231201
}
232202
}
233203
}
204+
/// Generated protocol from Pigeon that represents Flutter messages that can be called from Swift.
205+
protocol FirebaseAppCheckFlutterApiProtocol {
206+
func getCustomToken(completion: @escaping (Result<String, PigeonError>) -> Void)
207+
}
208+
class FirebaseAppCheckFlutterApi: FirebaseAppCheckFlutterApiProtocol {
209+
private let binaryMessenger: FlutterBinaryMessenger
210+
private let messageChannelSuffix: String
211+
init(binaryMessenger: FlutterBinaryMessenger, messageChannelSuffix: String = "") {
212+
self.binaryMessenger = binaryMessenger
213+
self.messageChannelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : ""
214+
}
215+
var codec: FirebaseAppCheckMessagesPigeonCodec {
216+
return FirebaseAppCheckMessagesPigeonCodec.shared
217+
}
218+
func getCustomToken(completion: @escaping (Result<String, PigeonError>) -> Void) {
219+
let channelName: String = "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckFlutterApi.getCustomToken\(messageChannelSuffix)"
220+
let channel = FlutterBasicMessageChannel(name: channelName, binaryMessenger: binaryMessenger, codec: codec)
221+
channel.sendMessage(nil) { response in
222+
guard let listResponse = response as? [Any?] else {
223+
completion(.failure(createConnectionError(withChannelName: channelName)))
224+
return
225+
}
226+
if listResponse.count > 1 {
227+
let code: String = listResponse[0] as! String
228+
let message: String? = nilOrValue(listResponse[1])
229+
let details: String? = nilOrValue(listResponse[2])
230+
completion(.failure(PigeonError(code: code, message: message, details: details)))
231+
} else if listResponse[0] == nil {
232+
completion(.failure(PigeonError(code: "null-error", message: "Flutter api returned null value for non-null return value.", details: "")))
233+
} else {
234+
let result = listResponse[0] as! String
235+
completion(.success(result))
236+
}
237+
}
238+
}
239+
}

packages/firebase_app_check/firebase_app_check/ios/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckPlugin.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public class FirebaseAppCheckPlugin: NSObject, FlutterPlugin,
6060
private var binaryMessenger: FlutterBinaryMessenger?
6161

6262
func activate(appName: String, androidProvider: String?, appleProvider: String?,
63-
debugToken: String?,
63+
debugToken: String?, windowsProvider: String?,
6464
completion: @escaping (Result<Void, Error>) -> Void) {
6565
guard let app = FLTFirebasePlugin.firebaseAppNamed(appName) else {
6666
completion(.failure(FlutterError(

packages/firebase_app_check/firebase_app_check/lib/firebase_app_check.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ export 'package:firebase_app_check_platform_interface/firebase_app_check_platfor
2323
ReCaptchaV3Provider,
2424
WebDebugProvider,
2525
WindowsAppCheckProvider,
26-
WindowsDebugProvider;
26+
WindowsDebugProvider,
27+
WindowsCustomProvider,
28+
FirebaseAppCheckFlutterApi;
2729
export 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart'
2830
show FirebaseException;
2931

0 commit comments

Comments
 (0)