// // HPAuthFlow.m // HotPocket (macOS) // // Created by Tomek Wójcik on 21/09/2025. // #import "HPAuthFlow.h" #import "HPAPI.h" #import "HPCredentialsHelper.h" #import "HPRPCClient.h" @implementation HPAuthParams #pragma mark - HPAuthParams implementation @end @implementation HPAuthFlow (HPAuthFlowPrivate) #pragma mark - HPAuthFlow private interface -(NSURL *)resolveAuthenticateURL { if (self.baseURL == nil) { return nil; } NSURL *authURL = [self.baseURL URLByAppendingPathComponent:@"/integrations/extension/authenticate/"]; if (authURL.scheme == nil) { return nil; } NSBundle *mainBundle = [NSBundle mainBundle]; NSURLComponents *authURLComponents = [NSURLComponents componentsWithURL:authURL resolvingAgainstBaseURL:NO]; authURLComponents.queryItems = @[ [NSURLQueryItem queryItemWithName:@"source" value:[[mainBundle infoDictionary] valueForKey:@"HPAuthFlowSource"]], [NSURLQueryItem queryItemWithName:@"session_token" value:self.sessionToken], ]; return authURLComponents.URL; } @end @implementation HPAuthFlow #pragma mark - Initialization -(id)init { if (self = [super init]) { self.baseURL = nil; self.sessionToken = nil; } return self; } #pragma mark - Public interface -(NSURL *)start { if (self.baseURL == nil) { return nil; } if (self.sessionToken == nil) { self.sessionToken = [[NSUUID UUID] UUIDString]; } return [self resolveAuthenticateURL]; } -(HPAuthParams *)handlePostAuthenticateURL:(NSURL *)url { if (url == nil) { return nil; } NSDictionary *postAuthenticateURLParams = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"HPAuthFlowPostAuthenticateURLParts"]; if (postAuthenticateURLParams == nil) { return nil; } NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; if ([urlComponents.scheme isEqualToString:[postAuthenticateURLParams valueForKey:@"scheme"]] == NO) { return nil; } if ([urlComponents.host isEqualToString:[postAuthenticateURLParams valueForKey:@"host"]] == NO) { return nil; } HPAuthParams *result = [[HPAuthParams alloc] init]; for (NSURLQueryItem *queryItem in urlComponents.queryItems) { if ([queryItem.name isEqualToString:@"auth_key"] == YES) { result.authKey = queryItem.value; } else if ([queryItem.name isEqualToString:@"session_token"] == YES) { result.sessionToken = queryItem.value; } } if ([self.sessionToken isEqualToString:result.sessionToken] == NO) { return nil; } return result; } -(BOOL)handleAuthParams:(HPAuthParams *)authParams { HPRPCClient *rpcClient = [[HPRPCClient alloc] initWithBaseURL:self.baseURL accessToken:nil]; NSArray *callParams = @[ authParams.authKey, [HPAPI getAccessTokenMeta], ]; BOOL callResult = [rpcClient call:self.sessionToken method:@"accounts.access_tokens.create" params:callParams endopoint:@"/accounts/rpc/" completionHandler:^(NSString *callId, HPRPCCallResult *result) { dispatch_async(dispatch_get_main_queue(), ^{ if (result.error != nil) { NSLog(@"-[HPAuthFlow handleAuthParams:] error=`%@`", result.error); } else { HPCredentialsHelper *credentialsHelper = [HPCredentialsHelper sharedHelper]; [credentialsHelper saveCredentials:[self.baseURL absoluteString] accessToken:(NSString *)result.result]; } self.sessionToken = nil; [[NSNotificationCenter defaultCenter] postNotificationName:@"AuthFlowDidFinish" object:self]; }); }]; return callResult; } @end