mirror of
https://github.com/ppy/osu.git
synced 2025-01-12 09:32:56 +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;
|
APIEndpointUrl = endpointConfiguration.APIEndpointUrl;
|
||||||
WebsiteRootUrl = endpointConfiguration.WebsiteRootUrl;
|
WebsiteRootUrl = endpointConfiguration.WebsiteRootUrl;
|
||||||
NotificationsClient = new WebSocketNotificationsClientConnector(this);
|
NotificationsClient = setUpNotificationsClient();
|
||||||
|
|
||||||
authentication = new OAuth(endpointConfiguration.APIClientID, endpointConfiguration.APIClientSecret, APIEndpointUrl);
|
authentication = new OAuth(endpointConfiguration.APIClientID, endpointConfiguration.APIClientSecret, APIEndpointUrl);
|
||||||
log = Logger.GetLogger(LoggingTarget.Network);
|
log = Logger.GetLogger(LoggingTarget.Network);
|
||||||
@ -119,6 +119,30 @@ namespace osu.Game.Online.API
|
|||||||
thread.Start();
|
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);
|
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);
|
internal new void Schedule(Action action) => base.Schedule(action);
|
||||||
@ -270,10 +294,7 @@ namespace osu.Game.Online.API
|
|||||||
|
|
||||||
setLocalUser(me);
|
setLocalUser(me);
|
||||||
|
|
||||||
if (me.SessionVerified)
|
state.Value = me.SessionVerified ? APIState.Online : APIState.RequiresSecondFactorAuth;
|
||||||
state.Value = APIState.Online;
|
|
||||||
else
|
|
||||||
setUpSecondFactorAuthentication();
|
|
||||||
failureCount = 0;
|
failureCount = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -356,20 +377,6 @@ namespace osu.Game.Online.API
|
|||||||
this.password = password;
|
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)
|
public void AuthenticateSecondFactor(string code)
|
||||||
{
|
{
|
||||||
Debug.Assert(State.Value == APIState.RequiresSecondFactorAuth);
|
Debug.Assert(State.Value == APIState.RequiresSecondFactorAuth);
|
||||||
|
@ -11,6 +11,7 @@ using osu.Framework.Screens;
|
|||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Online.Metadata;
|
using osu.Game.Online.Metadata;
|
||||||
using osu.Game.Online.Multiplayer;
|
using osu.Game.Online.Multiplayer;
|
||||||
|
using osu.Game.Online.Notifications.WebSocket;
|
||||||
using osu.Game.Online.Spectator;
|
using osu.Game.Online.Spectator;
|
||||||
using osu.Game.Overlays;
|
using osu.Game.Overlays;
|
||||||
using osu.Game.Overlays.Notifications;
|
using osu.Game.Overlays.Notifications;
|
||||||
@ -25,6 +26,8 @@ namespace osu.Game.Online
|
|||||||
{
|
{
|
||||||
private readonly Func<IScreen> getCurrentScreen;
|
private readonly Func<IScreen> getCurrentScreen;
|
||||||
|
|
||||||
|
private INotificationsClient notificationsClient = null!;
|
||||||
|
|
||||||
[Resolved]
|
[Resolved]
|
||||||
private MultiplayerClient multiplayerClient { get; set; } = null!;
|
private MultiplayerClient multiplayerClient { get; set; } = null!;
|
||||||
|
|
||||||
@ -55,9 +58,11 @@ namespace osu.Game.Online
|
|||||||
private void load(IAPIProvider api)
|
private void load(IAPIProvider api)
|
||||||
{
|
{
|
||||||
apiState = api.State.GetBoundCopy();
|
apiState = api.State.GetBoundCopy();
|
||||||
|
notificationsClient = api.NotificationsClient;
|
||||||
multiplayerState = multiplayerClient.IsConnected.GetBoundCopy();
|
multiplayerState = multiplayerClient.IsConnected.GetBoundCopy();
|
||||||
spectatorState = spectatorClient.IsConnected.GetBoundCopy();
|
spectatorState = spectatorClient.IsConnected.GetBoundCopy();
|
||||||
|
|
||||||
|
notificationsClient.MessageReceived += notifyAboutForcedDisconnection;
|
||||||
multiplayerClient.Disconnecting += notifyAboutForcedDisconnection;
|
multiplayerClient.Disconnecting += notifyAboutForcedDisconnection;
|
||||||
spectatorClient.Disconnecting += notifyAboutForcedDisconnection;
|
spectatorClient.Disconnecting += notifyAboutForcedDisconnection;
|
||||||
metadataClient.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)
|
protected override void Dispose(bool isDisposing)
|
||||||
{
|
{
|
||||||
base.Dispose(isDisposing);
|
base.Dispose(isDisposing);
|
||||||
|
|
||||||
|
if (notificationsClient.IsNotNull())
|
||||||
|
notificationsClient.MessageReceived += notifyAboutForcedDisconnection;
|
||||||
|
|
||||||
if (spectatorClient.IsNotNull())
|
if (spectatorClient.IsNotNull())
|
||||||
spectatorClient.Disconnecting -= notifyAboutForcedDisconnection;
|
spectatorClient.Disconnecting -= notifyAboutForcedDisconnection;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user