QuickConnectService.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. using System;
  2. using MediaBrowser.Controller.Configuration;
  3. using MediaBrowser.Controller.Library;
  4. using MediaBrowser.Controller.Net;
  5. using MediaBrowser.Controller.QuickConnect;
  6. using MediaBrowser.Model.QuickConnect;
  7. using MediaBrowser.Model.Services;
  8. using Microsoft.Extensions.Logging;
  9. namespace MediaBrowser.Api.QuickConnect
  10. {
  11. [Route("/QuickConnect/Initiate", "GET", Summary = "Requests a new quick connect code")]
  12. public class Initiate : IReturn<QuickConnectResult>
  13. {
  14. [ApiMember(Name = "FriendlyName", Description = "Device friendly name", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
  15. public string FriendlyName { get; set; }
  16. }
  17. [Route("/QuickConnect/Connect", "GET", Summary = "Attempts to retrieve authentication information")]
  18. public class Connect : IReturn<QuickConnectResult>
  19. {
  20. [ApiMember(Name = "Secret", Description = "Quick connect secret", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
  21. public string Secret { get; set; }
  22. }
  23. [Route("/QuickConnect/Authorize", "POST", Summary = "Authorizes a pending quick connect request")]
  24. [Authenticated]
  25. public class Authorize : IReturn<bool>
  26. {
  27. [ApiMember(Name = "Code", Description = "Quick connect identifying code", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
  28. public string Code { get; set; }
  29. }
  30. [Route("/QuickConnect/Deauthorize", "POST", Summary = "Deletes all quick connect authorization tokens for the current user")]
  31. [Authenticated]
  32. public class Deauthorize : IReturn<int>
  33. {
  34. [ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
  35. public Guid UserId { get; set; }
  36. }
  37. [Route("/QuickConnect/Status", "GET", Summary = "Gets the current quick connect state")]
  38. public class QuickConnectStatus : IReturn<QuickConnectResult>
  39. {
  40. }
  41. [Route("/QuickConnect/Available", "POST", Summary = "Enables or disables quick connect")]
  42. [Authenticated(Roles = "Admin")]
  43. public class Available : IReturn<QuickConnectState>
  44. {
  45. [ApiMember(Name = "Status", Description = "New quick connect status", IsRequired = false, DataType = "QuickConnectState", ParameterType = "query", Verb = "GET")]
  46. public QuickConnectState Status { get; set; }
  47. }
  48. [Route("/QuickConnect/Activate", "POST", Summary = "Temporarily activates quick connect for the time period defined in the server configuration")]
  49. [Authenticated]
  50. public class Activate : IReturn<bool>
  51. {
  52. }
  53. public class QuickConnectService : BaseApiService
  54. {
  55. private IQuickConnect _quickConnect;
  56. private IUserManager _userManager;
  57. private IAuthorizationContext _authContext;
  58. public QuickConnectService(
  59. ILogger<QuickConnectService> logger,
  60. IServerConfigurationManager serverConfigurationManager,
  61. IHttpResultFactory httpResultFactory,
  62. IUserManager userManager,
  63. IAuthorizationContext authContext,
  64. IQuickConnect quickConnect)
  65. : base(logger, serverConfigurationManager, httpResultFactory)
  66. {
  67. _userManager = userManager;
  68. _quickConnect = quickConnect;
  69. _authContext = authContext;
  70. }
  71. public object Get(Initiate request)
  72. {
  73. return _quickConnect.TryConnect(request.FriendlyName);
  74. }
  75. public object Get(Connect request)
  76. {
  77. return _quickConnect.CheckRequestStatus(request.Secret);
  78. }
  79. public object Get(QuickConnectStatus request)
  80. {
  81. _quickConnect.ExpireRequests();
  82. return _quickConnect.State;
  83. }
  84. public object Post(Deauthorize request)
  85. {
  86. AssertCanUpdateUser(_authContext, _userManager, request.UserId, true);
  87. return _quickConnect.DeleteAllDevices(request.UserId);
  88. }
  89. public object Post(Authorize request)
  90. {
  91. return _quickConnect.AuthorizeRequest(Request, request.Code);
  92. }
  93. public object Post(Activate request)
  94. {
  95. if(_quickConnect.State == QuickConnectState.Unavailable)
  96. {
  97. return false;
  98. }
  99. string name = _authContext.GetAuthorizationInfo(Request).User.Username;
  100. Logger.LogInformation("{name} temporarily activated quick connect", name);
  101. _quickConnect.Activate();
  102. return true;
  103. }
  104. public object Post(Available request)
  105. {
  106. _quickConnect.SetEnabled(request.Status);
  107. return _quickConnect.State;
  108. }
  109. }
  110. }