Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[local_auth_darwin] MacOS Support #6267

Open
wants to merge 119 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 89 commits
Commits
Show all changes
119 commits
Select commit Hold shift + click to select a range
532ed7f
Beginning of macos support
alexrabin-sentracam Mar 5, 2024
0eb64ee
Merge branch 'flutter:main' into macos-support
alexrabin-sentracam Mar 5, 2024
25ca34e
Made macos deployment target 10.15
alexrabin-sentracam Mar 5, 2024
c57ac02
Merge branch 'macos-support' of https://github.com/alexrabin-sentraca…
alexrabin-sentracam Mar 5, 2024
00bd678
Separate ios and macos code
alexrabin-sentracam Mar 5, 2024
509708f
Adjusted format
alexrabin-sentracam Mar 5, 2024
fd6c539
Updated change log
alexrabin-sentracam Mar 5, 2024
44dd8c8
Removed duplicated analysis_options.yaml
Mar 5, 2024
4f68b52
Removed unnecessary widget_test in darwin
Mar 5, 2024
8646867
Added license blocks in macos example files
Mar 5, 2024
676b0eb
Changed iOSAuthMessages to DarwinAuthMessages
Mar 5, 2024
bcee2e7
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 5, 2024
4aab9d8
Added macos comment
Mar 5, 2024
1bded66
Changed macOS capitalization
Mar 5, 2024
7335837
Removed unnecessary test, added comment, and changed version number
Mar 5, 2024
849c07b
Removed prettier ignore
Mar 5, 2024
c810eb4
Reset upgrade version
Mar 5, 2024
6867b3a
Revert "Changed iOSAuthMessages to DarwinAuthMessages" and add MacOSA…
Mar 5, 2024
995f41d
Changed podspec to use ios deployment_target
Mar 5, 2024
8ab5d09
Checks if macos is 10.15 or higher before checking for faceid
Mar 5, 2024
507470e
Shows correct window for registrar
Mar 5, 2024
05b52ae
Changed wording
Mar 5, 2024
8f35101
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 5, 2024
2b0e6d6
Combined @available statements and renamed keywindow
Mar 6, 2024
c808c82
Created initWithRegistrar initializer
Mar 6, 2024
64bd0b7
Moved runner tests
Mar 6, 2024
7dab5b4
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 6, 2024
7ff9871
Fixed format issues
Mar 6, 2024
04f6a76
Revert "Moved runner tests"
Mar 6, 2024
04c8f12
Fixed tests and platform available check
Mar 6, 2024
64366dd
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 6, 2024
7babc9c
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 7, 2024
b71f172
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 7, 2024
cfabac0
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 8, 2024
5bc080e
Added macos tests
Mar 8, 2024
d794eb9
Fixed format
Mar 8, 2024
74ae648
Added info.plist key and added license heading
Mar 8, 2024
2374375
Added xml language to readme
Mar 8, 2024
f053fce
Upgraded project settings
Mar 8, 2024
04049a3
Reset example macos project
Mar 8, 2024
9be16c3
Fixed macos tests
Mar 8, 2024
ff533bc
Removed settings button on macos due to no native support from Apple …
Mar 8, 2024
783b0cc
Added @available check
Mar 8, 2024
5e9b627
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 11, 2024
1748039
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 11, 2024
ebdb5f1
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 11, 2024
b73254a
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 12, 2024
c4c9f3b
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 12, 2024
6ca1476
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 18, 2024
69db0ec
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 18, 2024
a39e82a
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 19, 2024
59ce98a
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 19, 2024
e54c7ea
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 19, 2024
b8ca53a
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 20, 2024
018fe8f
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 20, 2024
ff38a26
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 21, 2024
e76f6bc
Addressed additional feedback
Mar 25, 2024
72b8212
Fixed plugin tests
Mar 25, 2024
113195e
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 25, 2024
7525f01
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 26, 2024
6330a9e
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 26, 2024
79ebae9
Made initWithRegistrar the designated initializer
Mar 26, 2024
0c84f2b
Merge branch 'macos-support' of https://github.com/alexrabin-sentraca…
Mar 26, 2024
c84a376
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 27, 2024
5dc7c75
Merge branch 'main' into macos-support
alexrabin-sentracam Mar 29, 2024
c33ed13
Merge branch 'main' into macos-support
alexrabin-sentracam Apr 1, 2024
186d89c
Updated messaging
Apr 1, 2024
f9e11db
Merge branch 'main' into macos-support
alexrabin-sentracam Apr 4, 2024
c45084b
Remove gotosettingsbutton on macos and didn't make it required
Apr 4, 2024
7003142
Merge branch 'main' into macos-support
alexrabin-sentracam Apr 9, 2024
18453dc
Merge branch 'main' into macos-support
alexrabin-sentracam Apr 11, 2024
fc14107
Merge branch 'main' into macos-support
alexrabin-sentracam Apr 18, 2024
5840a73
Merge branch 'flutter:main' into macos-support
alexrabin-sentracam Apr 22, 2024
ce1fa37
Merge branch 'main' into macos-support
alexrabin-sentracam Apr 24, 2024
ad83e24
Adjusted format
Apr 24, 2024
8beb6dd
Merge branch 'main' into macos-support
alexrabin-sentracam Apr 24, 2024
067a0c0
Added initWithContextFactoryAndRegistrar since tests failing due to m…
Apr 24, 2024
e3e89d4
Fixed mock test error
Apr 24, 2024
a9167cc
Merge branch 'main' into macos-support
alexrabin-sentracam Apr 25, 2024
0f56ad6
Created base StubAlertFactory
Apr 25, 2024
17bd1c7
Merge branch 'macos-support' of https://github.com/alexrabin-sentraca…
Apr 25, 2024
2441440
Added test to check if the alert window is using the registrar window
Apr 25, 2024
8af7ec7
Added overridemacosmessages
Apr 25, 2024
4fcbc5d
Removes default false for overrideUseMacOSAuthMessages
Apr 25, 2024
8bd0531
Merge branch 'main' into macos-support
alexrabin-sentracam Apr 26, 2024
44e5ae3
Merge branch 'main' into macos-support
alexrabin-sentracam Apr 29, 2024
51b3b02
Merge branch 'main' into macos-support
alexrabin-sentracam Apr 29, 2024
6d0684f
Merge branch 'main' into macos-support
alexrabin-sentracam Apr 29, 2024
ca5789f
Merge branch 'main' into macos-support
alexrabin-sentracam Apr 29, 2024
6d5a0c6
Merge branch 'main' into macos-support
alexrabin-sentracam May 7, 2024
11e6991
Merge branch 'main' into macos-support
alexrabin-sentracam May 8, 2024
316bb68
Updated method names
May 8, 2024
3728490
Fixed comment format
May 8, 2024
5b72aea
Fixed macos tests
May 8, 2024
6dd9092
Merge branch 'main' into macos-support
alexrabin-sentracam May 8, 2024
b5ea028
Merge branch 'main' into macos-support
alexrabin-sentracam May 9, 2024
dd545e5
Merge branch 'main' of https://github.com/flutter/packages into macos…
May 15, 2024
85678af
Upgraded version to 1.4.0
May 15, 2024
679854a
Removed copy property
May 15, 2024
464ae48
Checks parent window correctly and uses nsa;ert object
May 15, 2024
05bc529
Merge branch 'main' into macos-support
alexrabin-sentracam May 16, 2024
d3ce499
Merge branch 'main' into macos-support
alexrabin-sentracam May 20, 2024
57c50d3
Added nonnulll keyword
May 20, 2024
860d198
Updated format
May 20, 2024
9224412
Added nonnull
May 20, 2024
9c345f9
Added non null to create alert
May 20, 2024
71a2824
Merge branch 'main' into macos-support
alexrabin-sentracam May 20, 2024
0d420c5
Updated elif check
May 20, 2024
3415984
Merge branch 'macos-support' of https://github.com/alexrabin-sentraca…
May 20, 2024
09236d6
Added target conditionals import
May 20, 2024
b0de86c
Added declaration comments
May 20, 2024
288b04b
Merge branch 'main' into macos-support
alexrabin-sentracam May 21, 2024
23305d0
Merge remote-tracking branch 'upstream/main' into macos-support
May 29, 2024
2293ff6
Merge branch 'main' into macos-support
alexrabin-sentracam May 29, 2024
46ce252
Merge branch 'main' into macos-support
alexrabin-sentracam May 29, 2024
0f7dac8
Merge branch 'main' into macos-support
alexrabin-sentracam May 29, 2024
a91e4e9
Fixed swift tests
May 30, 2024
e5c9b97
Merge branch 'main' into macos-support
alexrabin-sentracam May 30, 2024
f90387f
Merge branch 'main' into macos-support
alexrabin-sentracam May 30, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 2 additions & 1 deletion AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,5 @@ Twin Sun, LLC <google-contrib@twinsunsolutions.com>
Amir Panahandeh <amirpanahandeh@gmail.com>
Daniele Cambi <dancam.dev@gmail.com>
Michele Benedetti <michelebenx98@gmail.com>
Taskulu LDA <contributions@taskulu.com>
Taskulu LDA <contributions@taskulu.com>
Alexander Rabin <alex.rabin@sentracam.com>
4 changes: 4 additions & 0 deletions packages/local_auth/local_auth_darwin/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 1.3.0

* Adds macOS support.

## 1.2.2

* Adds compatibility with `intl` 0.19.0.
Expand Down
4 changes: 2 additions & 2 deletions packages/local_auth/local_auth_darwin/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# local_auth_darwin

The iOS implementation of [`local_auth`][1].
The iOS and macOS implementation of [`local_auth`][1].

## Usage

Expand All @@ -12,4 +12,4 @@ However, if you `import` this package to use any of its APIs directly, you
should add it to your `pubspec.yaml` as usual.

[1]: https://pub.dev/packages/local_auth
[2]: https://flutter.dev/docs/development/packages-and-plugins/developing-packages#endorsed-federated-plugin
[2]: https://flutter.dev/docs/development/packages-and-plugins/developing-packages#endorsed-federated-plugin
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,18 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#if TARGET_OS_OSX
#import <FlutterMacOS/FlutterMacOS.h>
#else
#import <Flutter/Flutter.h>
#endif

#import "messages.g.h"

@interface FLALocalAuthPlugin : NSObject <FlutterPlugin, FLADLocalAuthApi>

- (instancetype)init NS_UNAVAILABLE;

- (instancetype)initWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar
NS_DESIGNATED_INITIALIZER;
@end
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,24 @@ - (LAContext *)createAuthContext {
}
@end

@interface FLADefaultAlertFactory : NSObject <FLADAlertFactory>
alexrabin-sentracam marked this conversation as resolved.
Show resolved Hide resolved
@end

@implementation FLADefaultAlertFactory

#if TARGET_OS_OSX
- (NSAlert *)createNSAlert {
alexrabin-sentracam marked this conversation as resolved.
Show resolved Hide resolved
return [[NSAlert alloc] init];
}
#elif TARGET_OS_IOS
- (UIAlertController *)createUIAlert:(NSString *)message {
alexrabin-sentracam marked this conversation as resolved.
Show resolved Hide resolved
return [UIAlertController alertControllerWithTitle:@""
message:message
preferredStyle:UIAlertControllerStyleAlert];
}
#endif
@end

#pragma mark -

/// A data container for sticky auth state.
Expand Down Expand Up @@ -49,24 +67,37 @@ - (instancetype)initWithOptions:(nonnull FLADAuthOptions *)options
@interface FLALocalAuthPlugin ()
@property(nonatomic, strong, nullable) FLAStickyAuthState *lastCallState;
@property(nonatomic, strong) NSObject<FLADAuthContextFactory> *authContextFactory;
@property(nonatomic, strong) NSObject<FLADAlertFactory> *alertFactory;
alexrabin-sentracam marked this conversation as resolved.
Show resolved Hide resolved
@property(nonatomic, strong) NSObject<FlutterPluginRegistrar> *registrar;
@end

@implementation FLALocalAuthPlugin

+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar {
FLALocalAuthPlugin *instance = [[FLALocalAuthPlugin alloc] init];
FLALocalAuthPlugin *instance = [[FLALocalAuthPlugin alloc] initWithRegistrar:registrar];
[registrar addApplicationDelegate:instance];
SetUpFLADLocalAuthApi([registrar messenger], instance);
}

- (instancetype)init {
return [self initWithContextFactory:[[FLADefaultAuthContextFactory alloc] init]];
- (instancetype)initWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar {
self = [super init];
alexrabin-sentracam marked this conversation as resolved.
Show resolved Hide resolved
if (self) {
_registrar = registrar;
_authContextFactory = [[FLADefaultAuthContextFactory alloc] init];
_alertFactory = [[FLADefaultAlertFactory alloc] init];
}
return self;
}

- (instancetype)initWithContextFactory:(NSObject<FLADAuthContextFactory> *)factory {
/// Returns an instance that uses the given factory to create LAContexts.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Declaration comments only go on the declaration, they should not be copied to the definition.

- (instancetype)initWithContextFactory:(NSObject<FLADAuthContextFactory> *)authFactory
andRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar
andAlertFactory:(NSObject<FLADAlertFactory> *)alertFactory {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Obj-C naming does not use "and"; this should be called initWithRegistrar:contextFactory:alertFactory:.

self = [super init];
if (self) {
_authContextFactory = factory;
_registrar = registrar;
_authContextFactory = authFactory;
_alertFactory = alertFactory;
}
return self;
}
Expand Down Expand Up @@ -130,9 +161,13 @@ - (nullable NSNumber *)deviceCanSupportBiometricsWithError:
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
error:&authError]) {
if (authError == nil) {
if (context.biometryType == LABiometryTypeFaceID) {
[biometrics addObject:[FLADAuthBiometricWrapper makeWithValue:FLADAuthBiometricFace]];
} else if (context.biometryType == LABiometryTypeTouchID) {
if (@available(macOS 10.15, iOS 11.0, *)) {
if (context.biometryType == LABiometryTypeFaceID) {
[biometrics addObject:[FLADAuthBiometricWrapper makeWithValue:FLADAuthBiometricFace]];
return biometrics;
}
}
if (context.biometryType == LABiometryTypeTouchID) {
[biometrics
addObject:[FLADAuthBiometricWrapper makeWithValue:FLADAuthBiometricFingerprint]];
}
Expand All @@ -153,10 +188,18 @@ - (void)showAlertWithMessage:(NSString *)message
dismissButtonTitle:(NSString *)dismissButtonTitle
openSettingsButtonTitle:(NSString *)openSettingsButtonTitle
completion:(FLADAuthCompletion)completion {
UIAlertController *alert =
[UIAlertController alertControllerWithTitle:@""
message:message
preferredStyle:UIAlertControllerStyleAlert];
#if TARGET_OS_OSX
NSAlert *alert = [_alertFactory createNSAlert];
[alert setMessageText:message];
[alert addButtonWithTitle:dismissButtonTitle];
NSWindow *window = self.registrar.view.window;
[alert beginSheetModalForWindow:window
completionHandler:^(NSModalResponse returnCode) {
[self handleSucceeded:NO withCompletion:completion];
}];
return;
#elif TARGET_OS_IOS
UIAlertController *alert = [_alertFactory createUIAlert:message];

UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:dismissButtonTitle
style:UIAlertActionStyleDefault
Expand All @@ -182,6 +225,8 @@ - (void)showAlertWithMessage:(NSString *)message
[[UIApplication sharedApplication].delegate.window.rootViewController presentViewController:alert
animated:YES
completion:nil];

#endif
}

- (void)handleAuthReplyWithSuccess:(BOOL)success
Expand Down Expand Up @@ -257,12 +302,15 @@ - (void)handleError:(NSError *)authError

#pragma mark - AppDelegate

// This method is called when the app is resumed from the background only on iOS
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is missing a period.

#if TARGET_OS_IOS
alexrabin-sentracam marked this conversation as resolved.
Show resolved Hide resolved
- (void)applicationDidBecomeActive:(UIApplication *)application {
if (self.lastCallState != nil) {
[self authenticateWithOptions:_lastCallState.options
strings:_lastCallState.strings
completion:_lastCallState.resultHandler];
}
}
#endif

@end
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,33 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#if TARGET_OS_OSX
#import <FlutterMacOS/FlutterMacOS.h>
#else
#import <Flutter/Flutter.h>
#endif

#import <LocalAuthentication/LocalAuthentication.h>

/// Protocol for a source of LAContext instances. Used to allow context injection in unit tests.
@protocol FLADAuthContextFactory <NSObject>
- (LAContext *)createAuthContext;
@end

@protocol FLADAlertFactory <NSObject>
alexrabin-sentracam marked this conversation as resolved.
Show resolved Hide resolved

#if TARGET_OS_OSX
- (NSAlert *)createNSAlert;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As do the methods.

#elif TARGET_OS_IOS
- (UIAlertController *)createUIAlert:(NSString *)message;
#endif

@end

@interface FLALocalAuthPlugin ()
/// Returns an instance that uses the given factory to create LAContexts.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment needs to be updated to reflect the changes.

- (instancetype)initWithContextFactory:(NSObject<FLADAuthContextFactory> *)factory
- (instancetype)initWithContextFactory:(NSObject<FLADAuthContextFactory> *)authFactory
andRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar
andAlertFactory:(NSObject<FLADAlertFactory> *)alertFactory
NS_DESIGNATED_INITIALIZER;
@end
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,14 @@ typedef NS_ENUM(NSUInteger, FLADAuthBiometric) {
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)makeWithReason:(NSString *)reason
lockOut:(NSString *)lockOut
goToSettingsButton:(NSString *)goToSettingsButton
goToSettingsDescription:(NSString *)goToSettingsDescription
goToSettingsButton:(nullable NSString *)goToSettingsButton
goToSettingsDescription:(nullable NSString *)goToSettingsDescription
cancelButton:(NSString *)cancelButton
localizedFallbackTitle:(nullable NSString *)localizedFallbackTitle;
@property(nonatomic, copy) NSString *reason;
@property(nonatomic, copy) NSString *lockOut;
@property(nonatomic, copy) NSString *goToSettingsButton;
@property(nonatomic, copy) NSString *goToSettingsDescription;
@property(nonatomic, copy, nullable) NSString *goToSettingsButton;
@property(nonatomic, copy, nullable) NSString *goToSettingsDescription;
@property(nonatomic, copy) NSString *cancelButton;
@property(nonatomic, copy, nullable) NSString *localizedFallbackTitle;
@end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,8 @@ - (NSArray *)toList;
@implementation FLADAuthStrings
+ (instancetype)makeWithReason:(NSString *)reason
lockOut:(NSString *)lockOut
goToSettingsButton:(NSString *)goToSettingsButton
goToSettingsDescription:(NSString *)goToSettingsDescription
goToSettingsButton:(nullable NSString *)goToSettingsButton
goToSettingsDescription:(nullable NSString *)goToSettingsDescription
cancelButton:(NSString *)cancelButton
localizedFallbackTitle:(nullable NSString *)localizedFallbackTitle {
FLADAuthStrings *pigeonResult = [[FLADAuthStrings alloc] init];
Expand Down