mirror of
https://github.com/ppy/osu.git
synced 2025-01-12 06:42:54 +08:00
Handle forced logouts due to password change too
This commit is contained in:
parent
3d3506b906
commit
04cae874b0
@ -86,7 +86,7 @@ namespace osu.Game.Online.API
|
||||
|
||||
APIEndpointUrl = endpointConfiguration.APIEndpointUrl;
|
||||
WebsiteRootUrl = endpointConfiguration.WebsiteRootUrl;
|
||||
NotificationsClient = new WebSocketNotificationsClientConnector(this);
|
||||
NotificationsClient = setUpNotificationsClient();
|
||||
|
||||
authentication = new OAuth(endpointConfiguration.APIClientID, endpointConfiguration.APIClientSecret, APIEndpointUrl);
|
||||
log = Logger.GetLogger(LoggingTarget.Network);
|
||||
@ -119,6 +119,30 @@ namespace osu.Game.Online.API
|
||||
thread.Start();
|
||||
}
|
||||
|
||||
private WebSocketNotificationsClientConnector setUpNotificationsClient()
|
||||
{
|
||||
var connector = new WebSocketNotificationsClientConnector(this);
|
||||
|
||||
connector.MessageReceived += msg =>
|
||||
{
|
||||
switch (msg.Event)
|
||||
{
|
||||
case @"verified":
|
||||
if (state.Value == APIState.RequiresSecondFactorAuth)
|
||||
state.Value = APIState.Online;
|
||||
break;
|
||||
|
||||
case @"logout":
|
||||
if (state.Value == APIState.Online)
|
||||
Logout();
|
||||
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
return connector;
|
||||
}
|
||||
|
||||
private void onTokenChanged(ValueChangedEvent<OAuthToken> e) => config.SetValue(OsuSetting.Token, config.Get<bool>(OsuSetting.SavePassword) ? authentication.TokenString : string.Empty);
|
||||
|
||||
internal new void Schedule(Action action) => base.Schedule(action);
|
||||
@ -270,10 +294,7 @@ namespace osu.Game.Online.API
|
||||
|
||||
setLocalUser(me);
|
||||
|
||||
if (me.SessionVerified)
|
||||
state.Value = APIState.Online;
|
||||
else
|
||||
setUpSecondFactorAuthentication();
|
||||
state.Value = me.SessionVerified ? APIState.Online : APIState.RequiresSecondFactorAuth;
|
||||
failureCount = 0;
|
||||
};
|
||||
|
||||
@ -356,20 +377,6 @@ namespace osu.Game.Online.API
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
private void setUpSecondFactorAuthentication()
|
||||
{
|
||||
if (state.Value == APIState.RequiresSecondFactorAuth)
|
||||
return;
|
||||
|
||||
state.Value = APIState.RequiresSecondFactorAuth;
|
||||
|
||||
NotificationsClient.MessageReceived += msg =>
|
||||
{
|
||||
if (msg.Event == @"verified")
|
||||
state.Value = APIState.Online;
|
||||
};
|
||||
}
|
||||
|
||||
public void AuthenticateSecondFactor(string code)
|
||||
{
|
||||
Debug.Assert(State.Value == APIState.RequiresSecondFactorAuth);
|
||||
|
@ -11,6 +11,7 @@ using osu.Framework.Screens;
|
||||
using osu.Game.Online.API;
|
||||
using osu.Game.Online.Metadata;
|
||||
using osu.Game.Online.Multiplayer;
|
||||
using osu.Game.Online.Notifications.WebSocket;
|
||||
using osu.Game.Online.Spectator;
|
||||
using osu.Game.Overlays;
|
||||
using osu.Game.Overlays.Notifications;
|
||||
@ -25,6 +26,8 @@ namespace osu.Game.Online
|
||||
{
|
||||
private readonly Func<IScreen> getCurrentScreen;
|
||||
|
||||
private INotificationsClient notificationsClient = null!;
|
||||
|
||||
[Resolved]
|
||||
private MultiplayerClient multiplayerClient { get; set; } = null!;
|
||||
|
||||
@ -55,9 +58,11 @@ namespace osu.Game.Online
|
||||
private void load(IAPIProvider api)
|
||||
{
|
||||
apiState = api.State.GetBoundCopy();
|
||||
notificationsClient = api.NotificationsClient;
|
||||
multiplayerState = multiplayerClient.IsConnected.GetBoundCopy();
|
||||
spectatorState = spectatorClient.IsConnected.GetBoundCopy();
|
||||
|
||||
notificationsClient.MessageReceived += notifyAboutForcedDisconnection;
|
||||
multiplayerClient.Disconnecting += notifyAboutForcedDisconnection;
|
||||
spectatorClient.Disconnecting += notifyAboutForcedDisconnection;
|
||||
metadataClient.Disconnecting += notifyAboutForcedDisconnection;
|
||||
@ -127,10 +132,27 @@ namespace osu.Game.Online
|
||||
});
|
||||
}
|
||||
|
||||
private void notifyAboutForcedDisconnection(SocketMessage obj)
|
||||
{
|
||||
if (obj.Event != @"logout") return;
|
||||
|
||||
if (userNotified) return;
|
||||
|
||||
userNotified = true;
|
||||
notificationOverlay?.Post(new SimpleErrorNotification
|
||||
{
|
||||
Icon = FontAwesome.Solid.ExclamationCircle,
|
||||
Text = "You have been logged out due to a change to your account. Please log in again."
|
||||
});
|
||||
}
|
||||
|
||||
protected override void Dispose(bool isDisposing)
|
||||
{
|
||||
base.Dispose(isDisposing);
|
||||
|
||||
if (notificationsClient.IsNotNull())
|
||||
notificationsClient.MessageReceived += notifyAboutForcedDisconnection;
|
||||
|
||||
if (spectatorClient.IsNotNull())
|
||||
spectatorClient.Disconnecting -= notifyAboutForcedDisconnection;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user