@@ -174,7 +174,7 @@ void UImmutablePassport::ConnectPKCE(bool IsConnectImx, const FImtblPassportResp
174
174
}
175
175
#endif
176
176
177
- void UImmutablePassport::Logout (const FImtblPassportResponseDelegate& ResponseDelegate)
177
+ void UImmutablePassport::Logout (bool DoHardLogout, const FImtblPassportResponseDelegate& ResponseDelegate)
178
178
{
179
179
#if PLATFORM_ANDROID | PLATFORM_IOS | PLATFORM_MAC
180
180
if (IsStateFlagsSet (IPS_PKCE) || bIsPrevConnectedViaPKCEFlow)
@@ -184,6 +184,10 @@ void UImmutablePassport::Logout(const FImtblPassportResponseDelegate& ResponseDe
184
184
#endif
185
185
if (IsStateFlagsSet (IPS_CONNECTED))
186
186
{
187
+ if (DoHardLogout)
188
+ {
189
+ SetStateFlags (IPS_HARDLOGOUT);
190
+ }
187
191
CallJS (ImmutablePassportAction::Logout, TEXT (" " ), ResponseDelegate, FImtblJSResponseDelegate::CreateUObject (this , &UImmutablePassport::OnLogoutResponse));
188
192
}
189
193
else
@@ -428,60 +432,79 @@ void UImmutablePassport::OnInitDeviceFlowResponse(FImtblJSResponse Response)
428
432
429
433
void UImmutablePassport::OnLogoutResponse (FImtblJSResponse Response)
430
434
{
431
- if (auto ResponseDelegate = GetResponseDelegate (Response))
435
+ auto ResponseDelegate = GetResponseDelegate (Response);
436
+
437
+ if (!ResponseDelegate)
432
438
{
433
- if (Response.success )
434
- {
435
- FString Url;
436
- FString Err;
439
+ return ;
440
+ }
437
441
438
- Response.JsonObject ->TryGetStringField (TEXT (" result" ), Url);
439
- if (!Url.IsEmpty ())
440
- {
442
+ FString Message;
443
+
444
+ if (!Response.success )
445
+ {
446
+ Message = Response.Error .IsSet () ? Response.Error ->ToString () : Response.JsonObject ->GetStringField (TEXT (" error" ));
447
+
448
+ IMTBL_ERR (" %s" , *Message)
449
+ ResponseDelegate->ExecuteIfBound (FImmutablePassportResult{ Response.success , Message, Response });
450
+
451
+ return ;
452
+ }
453
+
454
+ if (!IsStateFlagsSet (IPS_HARDLOGOUT))
455
+ {
456
+ Message = " Logged out without clearing browser session" ;
457
+
458
+ IMTBL_LOG (" %s" , *Message)
459
+ ResponseDelegate->ExecuteIfBound (FImmutablePassportResult{ true , Message });
460
+
461
+ return ;
462
+ }
463
+
464
+ FString Url;
465
+ FString ErrorMessage;
466
+
467
+ ResetStateFlags (IPS_HARDLOGOUT);
468
+ Response.JsonObject ->TryGetStringField (TEXT (" result" ), Url);
469
+ if (!Url.IsEmpty ())
470
+ {
441
471
#if PLATFORM_ANDROID | PLATFORM_IOS | PLATFORM_MAC
442
- if (IsStateFlagsSet (IPS_PKCE) || bIsPrevConnectedViaPKCEFlow)
443
- {
444
- OnHandleDeepLink = FImtblPassportHandleDeepLinkDelegate::CreateUObject (this , &UImmutablePassport::OnDeepLinkActivated);
472
+ if (IsStateFlagsSet (IPS_PKCE) || bIsPrevConnectedViaPKCEFlow)
473
+ {
474
+ OnHandleDeepLink = FImtblPassportHandleDeepLinkDelegate::CreateUObject (this , &UImmutablePassport::OnDeepLinkActivated);
445
475
#if PLATFORM_ANDROID
446
- LaunchAndroidUrl (Url);
476
+ LaunchAndroidUrl (Url);
447
477
#elif PLATFORM_IOS
448
- [[ImmutableIOS instance] launchUrl:TCHAR_TO_ANSI (*Url)];
478
+ [[ImmutableIOS instance] launchUrl:TCHAR_TO_ANSI (*Url)];
449
479
#elif PLATFORM_MAC
450
- [[ImmutableMac instance] launchUrl:TCHAR_TO_ANSI (*Url) forRedirectUri:TCHAR_TO_ANSI (*InitData.logoutRedirectUri )];
451
- #endif
452
- }
453
- else
454
- {
455
- #endif
456
- FPlatformProcess::LaunchURL (*Url, nullptr , &Err);
457
- if (Err.Len ())
458
- {
459
- FString Msg = " Failed to connect to Browser: " + Err;
460
- IMTBL_ERR (" %s" , *Msg);
461
- ResponseDelegate->ExecuteIfBound (FImmutablePassportResult{false , Msg, Response});
462
- return ;
463
- }
464
- IMTBL_LOG (" Logged out." )
465
- ResponseDelegate->ExecuteIfBound (FImmutablePassportResult{Response.success , " Logged out" });
466
- #if PLATFORM_ANDROID | PLATFORM_IOS | PLATFORM_MAC
467
- }
480
+ [[ImmutableMac instance] launchUrl:TCHAR_TO_ANSI (*Url) forRedirectUri:TCHAR_TO_ANSI (*InitData.logoutRedirectUri )];
468
481
#endif
469
- }
470
- else
471
- {
472
- ResponseDelegate->ExecuteIfBound (FImmutablePassportResult{false , " Logout Url is empty" , Response});
473
- }
474
- ResetStateFlags (IPS_CONNECTED);
475
482
}
476
483
else
477
484
{
478
- FString Msg = Response.Error .IsSet () ? Response.Error ->ToString () : Response.JsonObject ->GetStringField (TEXT (" error" ));
479
-
480
- ResponseDelegate->ExecuteIfBound (FImmutablePassportResult{Response.success , Msg, Response});
485
+ #endif
486
+ FPlatformProcess::LaunchURL (*Url, nullptr , &ErrorMessage);
487
+ if (ErrorMessage.Len ())
488
+ {
489
+ Message = " Failed to connect to Browser: " + ErrorMessage;
490
+
491
+ IMTBL_ERR (" %s" , *Message);
492
+ ResponseDelegate->ExecuteIfBound (FImmutablePassportResult{ false , Message, Response });
481
493
482
- IMTBL_ERR (" Error logging out." )
494
+ return ;
495
+ }
496
+ Message = " Logged out" ;
497
+ IMTBL_LOG (" %s" , *Message)
498
+ ResponseDelegate->ExecuteIfBound (FImmutablePassportResult{ Response.success , Message });
499
+ #if PLATFORM_ANDROID | PLATFORM_IOS | PLATFORM_MAC
483
500
}
501
+ #endif
502
+ }
503
+ else
504
+ {
505
+ ResponseDelegate->ExecuteIfBound (FImmutablePassportResult{false , " Logout Url is empty" , Response});
484
506
}
507
+ ResetStateFlags (IPS_CONNECTED);
485
508
}
486
509
487
510
void UImmutablePassport::OnConnectSilentResponse (FImtblJSResponse Response)
0 commit comments