fix session not found errors

This commit is contained in:
Luke Pulverenti 2015-03-09 15:40:03 -04:00
parent 231f146c8c
commit 1b46fb62c4
9 changed files with 118 additions and 75 deletions

View file

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Dto; using System.Threading.Tasks;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
@ -88,9 +89,9 @@ namespace MediaBrowser.Api
/// Gets the session. /// Gets the session.
/// </summary> /// </summary>
/// <returns>SessionInfo.</returns> /// <returns>SessionInfo.</returns>
protected SessionInfo GetSession() protected async Task<SessionInfo> GetSession()
{ {
var session = SessionContext.GetSession(Request); var session = await SessionContext.GetSession(Request).ConfigureAwait(false);
if (session == null) if (session == null)
{ {

View file

@ -315,7 +315,7 @@ namespace MediaBrowser.Api.LiveTv
private void AssertUserCanManageLiveTv() private void AssertUserCanManageLiveTv()
{ {
var user = SessionContext.GetUser(Request); var user = SessionContext.GetUser(Request).Result;
if (user == null) if (user == null)
{ {

View file

@ -418,7 +418,7 @@ namespace MediaBrowser.Api.Session
SeekPositionTicks = request.SeekPositionTicks SeekPositionTicks = request.SeekPositionTicks
}; };
var task = _sessionManager.SendPlaystateCommand(GetSession().Id, request.Id, command, CancellationToken.None); var task = _sessionManager.SendPlaystateCommand(GetSession().Result.Id, request.Id, command, CancellationToken.None);
Task.WaitAll(task); Task.WaitAll(task);
} }
@ -436,7 +436,7 @@ namespace MediaBrowser.Api.Session
ItemType = request.ItemType ItemType = request.ItemType
}; };
var task = _sessionManager.SendBrowseCommand(GetSession().Id, request.Id, command, CancellationToken.None); var task = _sessionManager.SendBrowseCommand(GetSession().Result.Id, request.Id, command, CancellationToken.None);
Task.WaitAll(task); Task.WaitAll(task);
} }
@ -455,7 +455,7 @@ namespace MediaBrowser.Api.Session
name = commandType.ToString(); name = commandType.ToString();
} }
var currentSession = GetSession(); var currentSession = GetSession().Result;
var command = new GeneralCommand var command = new GeneralCommand
{ {
@ -481,7 +481,7 @@ namespace MediaBrowser.Api.Session
Text = request.Text Text = request.Text
}; };
var task = _sessionManager.SendMessageCommand(GetSession().Id, request.Id, command, CancellationToken.None); var task = _sessionManager.SendMessageCommand(GetSession().Result.Id, request.Id, command, CancellationToken.None);
Task.WaitAll(task); Task.WaitAll(task);
} }
@ -500,14 +500,14 @@ namespace MediaBrowser.Api.Session
StartPositionTicks = request.StartPositionTicks StartPositionTicks = request.StartPositionTicks
}; };
var task = _sessionManager.SendPlayCommand(GetSession().Id, request.Id, command, CancellationToken.None); var task = _sessionManager.SendPlayCommand(GetSession().Result.Id, request.Id, command, CancellationToken.None);
Task.WaitAll(task); Task.WaitAll(task);
} }
public void Post(SendGeneralCommand request) public void Post(SendGeneralCommand request)
{ {
var currentSession = GetSession(); var currentSession = GetSession().Result;
var command = new GeneralCommand var command = new GeneralCommand
{ {
@ -522,7 +522,7 @@ namespace MediaBrowser.Api.Session
public void Post(SendFullGeneralCommand request) public void Post(SendFullGeneralCommand request)
{ {
var currentSession = GetSession(); var currentSession = GetSession().Result;
request.ControllingUserId = currentSession.UserId.HasValue ? currentSession.UserId.Value.ToString("N") : null; request.ControllingUserId = currentSession.UserId.HasValue ? currentSession.UserId.Value.ToString("N") : null;
@ -545,7 +545,7 @@ namespace MediaBrowser.Api.Session
{ {
if (string.IsNullOrWhiteSpace(request.Id)) if (string.IsNullOrWhiteSpace(request.Id))
{ {
request.Id = GetSession().Id; request.Id = GetSession().Result.Id;
} }
_sessionManager.ReportCapabilities(request.Id, new ClientCapabilities _sessionManager.ReportCapabilities(request.Id, new ClientCapabilities
{ {
@ -569,7 +569,7 @@ namespace MediaBrowser.Api.Session
{ {
if (string.IsNullOrWhiteSpace(request.Id)) if (string.IsNullOrWhiteSpace(request.Id))
{ {
request.Id = GetSession().Id; request.Id = GetSession().Result.Id;
} }
_sessionManager.ReportCapabilities(request.Id, request); _sessionManager.ReportCapabilities(request.Id, request);
} }

View file

@ -231,7 +231,7 @@ namespace MediaBrowser.Api.UserLibrary
datePlayed = DateTime.ParseExact(request.DatePlayed, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); datePlayed = DateTime.ParseExact(request.DatePlayed, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
} }
var session = GetSession(); var session = await GetSession().ConfigureAwait(false);
var dto = await UpdatePlayedStatus(user, request.Id, true, datePlayed).ConfigureAwait(false); var dto = await UpdatePlayedStatus(user, request.Id, true, datePlayed).ConfigureAwait(false);
@ -266,7 +266,7 @@ namespace MediaBrowser.Api.UserLibrary
public void Post(ReportPlaybackStart request) public void Post(ReportPlaybackStart request)
{ {
request.SessionId = GetSession().Id; request.SessionId = GetSession().Result.Id;
var task = _sessionManager.OnPlaybackStart(request); var task = _sessionManager.OnPlaybackStart(request);
@ -294,7 +294,7 @@ namespace MediaBrowser.Api.UserLibrary
public void Post(ReportPlaybackProgress request) public void Post(ReportPlaybackProgress request)
{ {
request.SessionId = GetSession().Id; request.SessionId = GetSession().Result.Id;
var task = _sessionManager.OnPlaybackProgress(request); var task = _sessionManager.OnPlaybackProgress(request);
@ -317,7 +317,7 @@ namespace MediaBrowser.Api.UserLibrary
public void Post(ReportPlaybackStopped request) public void Post(ReportPlaybackStopped request)
{ {
request.SessionId = GetSession().Id; request.SessionId = GetSession().Result.Id;
var task = _sessionManager.OnPlaybackStopped(request); var task = _sessionManager.OnPlaybackStopped(request);
@ -339,7 +339,7 @@ namespace MediaBrowser.Api.UserLibrary
{ {
var user = _userManager.GetUserById(request.UserId); var user = _userManager.GetUserById(request.UserId);
var session = GetSession(); var session = await GetSession().ConfigureAwait(false);
var dto = await UpdatePlayedStatus(user, request.Id, false, null).ConfigureAwait(false); var dto = await UpdatePlayedStatus(user, request.Id, false, null).ConfigureAwait(false);

View file

@ -1,14 +1,15 @@
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Session; using MediaBrowser.Controller.Session;
using System.Threading.Tasks;
namespace MediaBrowser.Controller.Net namespace MediaBrowser.Controller.Net
{ {
public interface ISessionContext public interface ISessionContext
{ {
SessionInfo GetSession(object requestContext); Task<SessionInfo> GetSession(object requestContext);
User GetUser(object requestContext); Task<User> GetUser(object requestContext);
SessionInfo GetSession(IServiceRequest requestContext); Task<SessionInfo> GetSession(IServiceRequest requestContext);
User GetUser(IServiceRequest requestContext); Task<User> GetUser(IServiceRequest requestContext);
} }
} }

View file

@ -1,5 +1,6 @@
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Security;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Events; using MediaBrowser.Model.Events;
using MediaBrowser.Model.Session; using MediaBrowser.Model.Session;
@ -282,8 +283,18 @@ namespace MediaBrowser.Controller.Session
/// Gets the session by authentication token. /// Gets the session by authentication token.
/// </summary> /// </summary>
/// <param name="token">The token.</param> /// <param name="token">The token.</param>
/// <param name="remoteEndpoint">The remote endpoint.</param>
/// <returns>SessionInfo.</returns> /// <returns>SessionInfo.</returns>
SessionInfo GetSessionByAuthenticationToken(string token); Task<SessionInfo> GetSessionByAuthenticationToken(string token, string remoteEndpoint);
/// <summary>
/// Gets the session by authentication token.
/// </summary>
/// <param name="info">The information.</param>
/// <param name="remoteEndpoint">The remote endpoint.</param>
/// <param name="appVersion">The application version.</param>
/// <returns>Task&lt;SessionInfo&gt;.</returns>
Task<SessionInfo> GetSessionByAuthenticationToken(AuthenticationInfo info, string remoteEndpoint, string appVersion);
/// <summary> /// <summary>
/// Logouts the specified access token. /// Logouts the specified access token.

View file

@ -1,8 +1,10 @@
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Security;
using MediaBrowser.Controller.Session; using MediaBrowser.Controller.Session;
using ServiceStack.Web; using ServiceStack.Web;
using System.Threading.Tasks;
namespace MediaBrowser.Server.Implementations.HttpServer.Security namespace MediaBrowser.Server.Implementations.HttpServer.Security
{ {
@ -19,31 +21,41 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
_sessionManager = sessionManager; _sessionManager = sessionManager;
} }
public SessionInfo GetSession(IServiceRequest requestContext) public Task<SessionInfo> GetSession(IServiceRequest requestContext)
{ {
var authorization = _authContext.GetAuthorizationInfo(requestContext); var authorization = _authContext.GetAuthorizationInfo(requestContext);
if (!string.IsNullOrWhiteSpace(authorization.Token)) if (!string.IsNullOrWhiteSpace(authorization.Token))
{ {
return _sessionManager.GetSessionByAuthenticationToken(authorization.Token); var auth = GetTokenInfo(requestContext);
} return _sessionManager.GetSessionByAuthenticationToken(auth, requestContext.RemoteIp, authorization.Version);
return _sessionManager.GetSession(authorization.DeviceId, authorization.Client, authorization.Version);
} }
public User GetUser(IServiceRequest requestContext) var session = _sessionManager.GetSession(authorization.DeviceId, authorization.Client, authorization.Version);
return Task.FromResult(session);
}
private AuthenticationInfo GetTokenInfo(IServiceRequest request)
{ {
var session = GetSession(requestContext); object info;
request.Items.TryGetValue("OriginalAuthenticationInfo", out info);
return session == null || !session.UserId.HasValue ? null : _userManager.GetUserById(session.UserId.Value); return info as AuthenticationInfo;
} }
public SessionInfo GetSession(object requestContext) public Task<SessionInfo> GetSession(object requestContext)
{ {
var req = new ServiceStackServiceRequest((IRequest)requestContext); var req = new ServiceStackServiceRequest((IRequest)requestContext);
return GetSession(req); return GetSession(req);
} }
public User GetUser(object requestContext) public async Task<User> GetUser(IServiceRequest requestContext)
{
var session = await GetSession(requestContext).ConfigureAwait(false);
return session == null || !session.UserId.HasValue ? null : _userManager.GetUserById(session.UserId.Value);
}
public Task<User> GetUser(object requestContext)
{ {
var req = new ServiceStackServiceRequest((IRequest)requestContext); var req = new ServiceStackServiceRequest((IRequest)requestContext);
return GetUser(req); return GetUser(req);

View file

@ -237,10 +237,7 @@ namespace MediaBrowser.Server.Implementations.Session
var activityDate = DateTime.UtcNow; var activityDate = DateTime.UtcNow;
var userId = user == null ? (Guid?)null : user.Id; var session = await GetSessionInfo(clientType, appVersion, deviceId, deviceName, remoteEndPoint, user).ConfigureAwait(false);
var username = user == null ? null : user.Name;
var session = await GetSessionInfo(clientType, appVersion, deviceId, deviceName, remoteEndPoint, userId, username).ConfigureAwait(false);
session.LastActivityDate = activityDate; session.LastActivityDate = activityDate;
@ -281,7 +278,7 @@ namespace MediaBrowser.Server.Implementations.Session
if (session != null) if (session != null)
{ {
var key = GetSessionKey(session.Client, session.ApplicationVersion, session.DeviceId); var key = GetSessionKey(session.Client, session.DeviceId);
SessionInfo removed; SessionInfo removed;
@ -365,7 +362,7 @@ namespace MediaBrowser.Server.Implementations.Session
} }
} }
private string GetSessionKey(string clientType, string appVersion, string deviceId) private string GetSessionKey(string clientType, string deviceId)
{ {
return clientType + deviceId; return clientType + deviceId;
} }
@ -378,23 +375,25 @@ namespace MediaBrowser.Server.Implementations.Session
/// <param name="deviceId">The device id.</param> /// <param name="deviceId">The device id.</param>
/// <param name="deviceName">Name of the device.</param> /// <param name="deviceName">Name of the device.</param>
/// <param name="remoteEndPoint">The remote end point.</param> /// <param name="remoteEndPoint">The remote end point.</param>
/// <param name="userId">The user identifier.</param> /// <param name="user">The user.</param>
/// <param name="username">The username.</param>
/// <returns>SessionInfo.</returns> /// <returns>SessionInfo.</returns>
private async Task<SessionInfo> GetSessionInfo(string clientType, string appVersion, string deviceId, string deviceName, string remoteEndPoint, Guid? userId, string username) private async Task<SessionInfo> GetSessionInfo(string clientType, string appVersion, string deviceId, string deviceName, string remoteEndPoint, User user)
{ {
var key = GetSessionKey(clientType, appVersion, deviceId); var key = GetSessionKey(clientType, deviceId);
await _sessionLock.WaitAsync(CancellationToken.None).ConfigureAwait(false); await _sessionLock.WaitAsync(CancellationToken.None).ConfigureAwait(false);
var userId = user == null ? (Guid?)null : user.Id;
var username = user == null ? null : user.Name;
try try
{ {
SessionInfo connection; SessionInfo sessionInfo;
DeviceInfo device = null; DeviceInfo device = null;
if (!_activeConnections.TryGetValue(key, out connection)) if (!_activeConnections.TryGetValue(key, out sessionInfo))
{ {
var sessionInfo = new SessionInfo sessionInfo = new SessionInfo
{ {
Client = clientType, Client = clientType,
DeviceId = deviceId, DeviceId = deviceId,
@ -410,7 +409,6 @@ namespace MediaBrowser.Server.Implementations.Session
OnSessionStarted(sessionInfo); OnSessionStarted(sessionInfo);
_activeConnections.TryAdd(key, sessionInfo); _activeConnections.TryAdd(key, sessionInfo);
connection = sessionInfo;
if (!string.IsNullOrEmpty(deviceId)) if (!string.IsNullOrEmpty(deviceId))
{ {
@ -426,24 +424,25 @@ namespace MediaBrowser.Server.Implementations.Session
deviceName = device.CustomName; deviceName = device.CustomName;
} }
connection.DeviceName = deviceName; sessionInfo.DeviceName = deviceName;
connection.UserId = userId; sessionInfo.UserId = userId;
connection.UserName = username; sessionInfo.UserName = username;
connection.RemoteEndPoint = remoteEndPoint; sessionInfo.RemoteEndPoint = remoteEndPoint;
sessionInfo.ApplicationVersion = appVersion;
if (!userId.HasValue) if (!userId.HasValue)
{ {
connection.AdditionalUsers.Clear(); sessionInfo.AdditionalUsers.Clear();
} }
if (connection.SessionController == null) if (sessionInfo.SessionController == null)
{ {
connection.SessionController = _sessionFactories sessionInfo.SessionController = _sessionFactories
.Select(i => i.GetSessionController(connection)) .Select(i => i.GetSessionController(sessionInfo))
.FirstOrDefault(i => i != null); .FirstOrDefault(i => i != null);
} }
return connection; return sessionInfo;
} }
finally finally
{ {
@ -1640,7 +1639,25 @@ namespace MediaBrowser.Server.Implementations.Session
string.Equals(i.Client, client)); string.Equals(i.Client, client));
} }
public SessionInfo GetSessionByAuthenticationToken(string token) public Task<SessionInfo> GetSessionByAuthenticationToken(AuthenticationInfo info, string remoteEndpoint, string appVersion)
{
if (info == null)
{
throw new ArgumentNullException("info");
}
var user = string.IsNullOrWhiteSpace(info.UserId)
? null
: _userManager.GetUserById(info.UserId);
appVersion = string.IsNullOrWhiteSpace(appVersion)
? "1"
: appVersion;
return GetSessionInfo(info.AppName, appVersion, info.DeviceId, info.DeviceName, remoteEndpoint, user);
}
public Task<SessionInfo> GetSessionByAuthenticationToken(string token, string remoteEndpoint)
{ {
var result = _authRepo.Get(new AuthenticationInfoQuery var result = _authRepo.Get(new AuthenticationInfoQuery
{ {
@ -1654,10 +1671,12 @@ namespace MediaBrowser.Server.Implementations.Session
var info = result.Items[0]; var info = result.Items[0];
// TODO: Make Token part of SessionInfo and get result that way if (info == null)
// This can't be done until all apps are updated to new authentication. {
return Sessions.FirstOrDefault(i => string.Equals(i.DeviceId, info.DeviceId) && return null;
string.Equals(i.Client, info.AppName)); }
return GetSessionByAuthenticationToken(info, remoteEndpoint, null);
} }
public Task SendMessageToUserSessions<T>(string userId, string name, T data, public Task SendMessageToUserSessions<T>(string userId, string name, T data,

View file

@ -1,5 +1,4 @@
using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Security;
using MediaBrowser.Controller.Session; using MediaBrowser.Controller.Session;
using MediaBrowser.Model.Events; using MediaBrowser.Model.Events;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
@ -61,9 +60,9 @@ namespace MediaBrowser.Server.Implementations.Session
serverManager.WebSocketConnected += _serverManager_WebSocketConnected; serverManager.WebSocketConnected += _serverManager_WebSocketConnected;
} }
void _serverManager_WebSocketConnected(object sender, GenericEventArgs<IWebSocketConnection> e) async void _serverManager_WebSocketConnected(object sender, GenericEventArgs<IWebSocketConnection> e)
{ {
var session = GetSession(e.Argument.QueryString); var session = await GetSession(e.Argument.QueryString, e.Argument.RemoteEndPoint).ConfigureAwait(false);
if (session != null) if (session != null)
{ {
@ -84,11 +83,11 @@ namespace MediaBrowser.Server.Implementations.Session
} }
} }
void _httpServer_WebSocketConnecting(object sender, WebSocketConnectingEventArgs e) async void _httpServer_WebSocketConnecting(object sender, WebSocketConnectingEventArgs e)
{ {
if (e.QueryString.AllKeys.Contains("api_key", StringComparer.OrdinalIgnoreCase)) if (e.QueryString.AllKeys.Contains("api_key", StringComparer.OrdinalIgnoreCase))
{ {
var session = GetSession(e.QueryString); var session = await GetSession(e.QueryString, e.Endpoint).ConfigureAwait(false);
if (session == null) if (session == null)
{ {
@ -97,10 +96,10 @@ namespace MediaBrowser.Server.Implementations.Session
} }
} }
private SessionInfo GetSession(NameValueCollection queryString) private Task<SessionInfo> GetSession(NameValueCollection queryString, string remoteEndpoint)
{ {
var token = queryString["api_key"]; var token = queryString["api_key"];
return _sessionManager.GetSessionByAuthenticationToken(token); return _sessionManager.GetSessionByAuthenticationToken(token, remoteEndpoint);
} }
public void Dispose() public void Dispose()