connect to socket with access token

This commit is contained in:
Luke Pulverenti
2015-03-08 15:48:30 -04:00
parent 55c47e50fc
commit ccb2dda358
13 changed files with 247 additions and 21 deletions

View File

@@ -1640,6 +1640,26 @@ namespace MediaBrowser.Server.Implementations.Session
string.Equals(i.Client, client));
}
public SessionInfo GetSessionByAuthenticationToken(string token)
{
var result = _authRepo.Get(new AuthenticationInfoQuery
{
AccessToken = token
});
if (result.Items.Length == 0)
{
return null;
}
var info = result.Items[0];
// TODO: Make Token part of SessionInfo and get result that way
// This can't be done until all apps are updated to new authentication.
return Sessions.FirstOrDefault(i => string.Equals(i.DeviceId, info.DeviceId) &&
string.Equals(i.Client, info.AppName));
}
public Task SendMessageToUserSessions<T>(string userId, string name, T data,
CancellationToken cancellationToken)
{

View File

@@ -1,9 +1,12 @@
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Security;
using MediaBrowser.Controller.Session;
using MediaBrowser.Model.Events;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Session;
using System;
using System.Collections.Specialized;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
@@ -13,7 +16,7 @@ namespace MediaBrowser.Server.Implementations.Session
/// <summary>
/// Class SessionWebSocketListener
/// </summary>
public class SessionWebSocketListener : IWebSocketListener
public class SessionWebSocketListener : IWebSocketListener, IDisposable
{
/// <summary>
/// The _true task result
@@ -35,17 +38,75 @@ namespace MediaBrowser.Server.Implementations.Session
/// </summary>
private readonly IJsonSerializer _json;
private readonly IHttpServer _httpServer;
private readonly IServerManager _serverManager;
/// <summary>
/// Initializes a new instance of the <see cref="SessionWebSocketListener" /> class.
/// </summary>
/// <param name="sessionManager">The session manager.</param>
/// <param name="logManager">The log manager.</param>
/// <param name="json">The json.</param>
public SessionWebSocketListener(ISessionManager sessionManager, ILogManager logManager, IJsonSerializer json)
/// <param name="httpServer">The HTTP server.</param>
/// <param name="serverManager">The server manager.</param>
public SessionWebSocketListener(ISessionManager sessionManager, ILogManager logManager, IJsonSerializer json, IHttpServer httpServer, IServerManager serverManager)
{
_sessionManager = sessionManager;
_logger = logManager.GetLogger(GetType().Name);
_json = json;
_httpServer = httpServer;
_serverManager = serverManager;
httpServer.WebSocketConnecting += _httpServer_WebSocketConnecting;
serverManager.WebSocketConnected += _serverManager_WebSocketConnected;
}
void _serverManager_WebSocketConnected(object sender, GenericEventArgs<IWebSocketConnection> e)
{
var session = GetSession(e.Argument.QueryString);
if (session != null)
{
var controller = session.SessionController as WebSocketController;
if (controller == null)
{
controller = new WebSocketController(session, _logger, _sessionManager);
}
controller.AddWebSocket(e.Argument);
session.SessionController = controller;
}
else
{
_logger.Warn("Unable to determine session based on url: {0}", e.Argument.Url);
}
}
void _httpServer_WebSocketConnecting(object sender, WebSocketConnectingEventArgs e)
{
if (e.QueryString.AllKeys.Contains("api_key", StringComparer.OrdinalIgnoreCase))
{
var session = GetSession(e.QueryString);
if (session == null)
{
e.AllowConnection = false;
}
}
}
private SessionInfo GetSession(NameValueCollection queryString)
{
var token = queryString["api_key"];
return _sessionManager.GetSessionByAuthenticationToken(token);
}
public void Dispose()
{
_httpServer.WebSocketConnecting -= _httpServer_WebSocketConnecting;
_serverManager.WebSocketConnected -= _serverManager_WebSocketConnected;
}
/// <summary>