Files
khanhduytran0 28df9fcc68 Feat[auth]: move tokens to keychain
Previously, tokens were saved in json under plain text, making it
insecure. Now, they are stored in iOS's keychian with the hope of
making it more secure.
2024-04-04 19:12:32 +07:00

80 lines
2.3 KiB
Objective-C

#import <Security/Security.h>
#import "BaseAuthenticator.h"
#import "../LauncherPreferences.h"
#import "../ios_uikit_bridge.h"
#import "../utils.h"
@implementation BaseAuthenticator
static BaseAuthenticator *current = nil;
+ (id)current {
if (current == nil) {
[self loadSavedName:getPrefObject(@"internal.selected_account")];
}
return current;
}
+ (void)setCurrent:(BaseAuthenticator *)auth {
current = auth;
}
+ (id)loadSavedName:(NSString *)name {
NSMutableDictionary *authData = parseJSONFromFile([NSString stringWithFormat:@"%s/accounts/%@.json", getenv("POJAV_HOME"), name]);
if (authData[@"NSErrorObject"] != nil) {
NSError *error = ((NSError *)authData[@"NSErrorObject"]);
if (error.code != NSFileReadNoSuchFileError) {
showDialog(localize(@"Error", nil), error.localizedDescription);
}
return nil;
}
if ([authData[@"expiresAt"] longValue] == 0) {
return [[LocalAuthenticator alloc] initWithData:authData];
} else {
return [[MicrosoftAuthenticator alloc] initWithData:authData];
}
}
- (id)initWithData:(NSMutableDictionary *)data {
current = self = [self init];
self.authData = data;
return self;
}
- (id)initWithInput:(NSString *)string {
NSMutableDictionary *data = [[NSMutableDictionary alloc] init];
data[@"input"] = string;
return [self initWithData:data];
}
- (void)loginWithCallback:(Callback)callback {
}
- (void)refreshTokenWithCallback:(Callback)callback {
}
- (BOOL)saveChanges {
NSError *error;
[self.authData removeObjectForKey:@"input"];
NSString *newPath = [NSString stringWithFormat:@"%s/accounts/%@.json", getenv("POJAV_HOME"), self.authData[@"username"]];
if (self.authData[@"oldusername"] != nil && ![self.authData[@"username"] isEqualToString:self.authData[@"oldusername"]]) {
NSString *oldPath = [NSString stringWithFormat:@"%s/accounts/%@.json", getenv("POJAV_HOME"), self.authData[@"oldusername"]];
[NSFileManager.defaultManager moveItemAtPath:oldPath toPath:newPath error:&error];
// handle error?
}
[self.authData removeObjectForKey:@"oldusername"];
error = saveJSONToFile(self.authData, newPath);
if (error != nil) {
showDialog(@"Error while saving file", error.localizedDescription);
}
return error == nil;
}
@end