aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api/QuickConnect/QuickConnectService.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Api/QuickConnect/QuickConnectService.cs')
-rw-r--r--MediaBrowser.Api/QuickConnect/QuickConnectService.cs145
1 files changed, 145 insertions, 0 deletions
diff --git a/MediaBrowser.Api/QuickConnect/QuickConnectService.cs b/MediaBrowser.Api/QuickConnect/QuickConnectService.cs
new file mode 100644
index 000000000..889a78839
--- /dev/null
+++ b/MediaBrowser.Api/QuickConnect/QuickConnectService.cs
@@ -0,0 +1,145 @@
+using System;
+using System.Collections.Generic;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
+using MediaBrowser.Controller.QuickConnect;
+using MediaBrowser.Model.QuickConnect;
+using MediaBrowser.Model.Services;
+using Microsoft.Extensions.Logging;
+
+namespace MediaBrowser.Api.QuickConnect
+{
+ [Route("/QuickConnect/Initiate", "GET", Summary = "Requests a new quick connect code")]
+ public class Initiate : IReturn<QuickConnectResult>
+ {
+ [ApiMember(Name = "FriendlyName", Description = "Device friendly name", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
+ public string FriendlyName { get; set; }
+ }
+
+ [Route("/QuickConnect/Connect", "GET", Summary = "Attempts to retrieve authentication information")]
+ public class Connect : IReturn<QuickConnectResult>
+ {
+ [ApiMember(Name = "Secret", Description = "Quick connect secret", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
+ public string Secret { get; set; }
+ }
+
+ [Route("/QuickConnect/List", "GET", Summary = "Lists all quick connect requests")]
+ [Authenticated]
+ public class QuickConnectList : IReturn<List<QuickConnectResultDto>>
+ {
+ }
+
+ [Route("/QuickConnect/Authorize", "POST", Summary = "Authorizes a pending quick connect request")]
+ [Authenticated]
+ public class Authorize : IReturn<QuickConnectResultDto>
+ {
+ [ApiMember(Name = "Lookup", Description = "Quick connect public lookup", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
+ public string Lookup { get; set; }
+ }
+
+ [Route("/QuickConnect/Deauthorize", "POST", Summary = "Deletes all quick connect authorization tokens for the current user")]
+ [Authenticated]
+ public class Deauthorize : IReturn<int>
+ {
+ [ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
+ public Guid UserId { get; set; }
+ }
+
+ [Route("/QuickConnect/Status", "GET", Summary = "Gets the current quick connect state")]
+ public class QuickConnectStatus : IReturn<QuickConnectResult>
+ {
+
+ }
+
+ [Route("/QuickConnect/Available", "POST", Summary = "Enables or disables quick connect")]
+ [Authenticated(Roles = "Admin")]
+ public class Available : IReturn<QuickConnectState>
+ {
+ [ApiMember(Name = "Status", Description = "New quick connect status", IsRequired = false, DataType = "QuickConnectState", ParameterType = "query", Verb = "GET")]
+ public QuickConnectState Status { get; set; }
+ }
+
+ [Route("/QuickConnect/Activate", "POST", Summary = "Temporarily activates quick connect for the time period defined in the server configuration")]
+ [Authenticated]
+ public class Activate : IReturn<QuickConnectState>
+ {
+ }
+
+ public class QuickConnectService : BaseApiService
+ {
+ private IQuickConnect _quickConnect;
+ private IUserManager _userManager;
+ private IAuthorizationContext _authContext;
+
+ public QuickConnectService(
+ ILogger<QuickConnectService> logger,
+ IServerConfigurationManager serverConfigurationManager,
+ IHttpResultFactory httpResultFactory,
+ IUserManager userManager,
+ IAuthorizationContext authContext,
+ IQuickConnect quickConnect)
+ : base(logger, serverConfigurationManager, httpResultFactory)
+ {
+ _userManager = userManager;
+ _quickConnect = quickConnect;
+ _authContext = authContext;
+ }
+
+ public object Get(Initiate request)
+ {
+ return _quickConnect.TryConnect(request.FriendlyName);
+ }
+
+ public object Get(Connect request)
+ {
+ return _quickConnect.CheckRequestStatus(request.Secret);
+ }
+
+ public object Get(QuickConnectList request)
+ {
+ return _quickConnect.GetCurrentRequests();
+ }
+
+ public object Get(QuickConnectStatus request)
+ {
+ return _quickConnect.State;
+ }
+
+ public object Post(Deauthorize request)
+ {
+ AssertCanUpdateUser(_authContext, _userManager, request.UserId, true);
+
+ return _quickConnect.DeleteAllDevices(request.UserId);
+ }
+
+ public object Post(Authorize request)
+ {
+ bool result = _quickConnect.AuthorizeRequest(Request, request.Lookup);
+
+ Logger.LogInformation("Result of authorizing quick connect {0}: {1}", request.Lookup[..10], result);
+
+ return result;
+ }
+
+ public object Post(Activate request)
+ {
+ if (_quickConnect.State == QuickConnectState.Available)
+ {
+ _quickConnect.SetEnabled(QuickConnectState.Active);
+
+ string name = _authContext.GetAuthorizationInfo(Request).User.Name;
+ Logger.LogInformation("{name} enabled quick connect", name);
+ }
+
+ return _quickConnect.State;
+ }
+
+ public object Post(Available request)
+ {
+ _quickConnect.SetEnabled(request.Status);
+
+ return _quickConnect.State;
+ }
+ }
+}