2
0

QuickConnectController.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. using System.ComponentModel.DataAnnotations;
  2. using System.Threading.Tasks;
  3. using Jellyfin.Api.Constants;
  4. using Jellyfin.Api.Extensions;
  5. using Jellyfin.Api.Helpers;
  6. using MediaBrowser.Common.Extensions;
  7. using MediaBrowser.Controller.Authentication;
  8. using MediaBrowser.Controller.Net;
  9. using MediaBrowser.Controller.QuickConnect;
  10. using MediaBrowser.Model.QuickConnect;
  11. using Microsoft.AspNetCore.Authorization;
  12. using Microsoft.AspNetCore.Http;
  13. using Microsoft.AspNetCore.Mvc;
  14. namespace Jellyfin.Api.Controllers
  15. {
  16. /// <summary>
  17. /// Quick connect controller.
  18. /// </summary>
  19. public class QuickConnectController : BaseJellyfinApiController
  20. {
  21. private readonly IQuickConnect _quickConnect;
  22. private readonly IAuthorizationContext _authContext;
  23. /// <summary>
  24. /// Initializes a new instance of the <see cref="QuickConnectController"/> class.
  25. /// </summary>
  26. /// <param name="quickConnect">Instance of the <see cref="IQuickConnect"/> interface.</param>
  27. /// <param name="authContext">Instance of the <see cref="IAuthorizationContext"/> interface.</param>
  28. public QuickConnectController(IQuickConnect quickConnect, IAuthorizationContext authContext)
  29. {
  30. _quickConnect = quickConnect;
  31. _authContext = authContext;
  32. }
  33. /// <summary>
  34. /// Gets the current quick connect state.
  35. /// </summary>
  36. /// <response code="200">Quick connect state returned.</response>
  37. /// <returns>Whether Quick Connect is enabled on the server or not.</returns>
  38. [HttpGet("Enabled")]
  39. [ProducesResponseType(StatusCodes.Status200OK)]
  40. public ActionResult<bool> GetQuickConnectEnabled()
  41. {
  42. return _quickConnect.IsEnabled;
  43. }
  44. /// <summary>
  45. /// Initiate a new quick connect request.
  46. /// </summary>
  47. /// <response code="200">Quick connect request successfully created.</response>
  48. /// <response code="401">Quick connect is not active on this server.</response>
  49. /// <returns>A <see cref="QuickConnectResult"/> with a secret and code for future use or an error message.</returns>
  50. [HttpGet("Initiate")]
  51. [ProducesResponseType(StatusCodes.Status200OK)]
  52. public async Task<ActionResult<QuickConnectResult>> InitiateQuickConnect()
  53. {
  54. try
  55. {
  56. var auth = await _authContext.GetAuthorizationInfo(Request).ConfigureAwait(false);
  57. return _quickConnect.TryConnect(auth);
  58. }
  59. catch (AuthenticationException)
  60. {
  61. return Unauthorized("Quick connect is disabled");
  62. }
  63. }
  64. /// <summary>
  65. /// Attempts to retrieve authentication information.
  66. /// </summary>
  67. /// <param name="secret">Secret previously returned from the Initiate endpoint.</param>
  68. /// <response code="200">Quick connect result returned.</response>
  69. /// <response code="404">Unknown quick connect secret.</response>
  70. /// <returns>An updated <see cref="QuickConnectResult"/>.</returns>
  71. [HttpGet("Connect")]
  72. [ProducesResponseType(StatusCodes.Status200OK)]
  73. [ProducesResponseType(StatusCodes.Status404NotFound)]
  74. public ActionResult<QuickConnectResult> GetQuickConnectState([FromQuery, Required] string secret)
  75. {
  76. try
  77. {
  78. return _quickConnect.CheckRequestStatus(secret);
  79. }
  80. catch (ResourceNotFoundException)
  81. {
  82. return NotFound("Unknown secret");
  83. }
  84. catch (AuthenticationException)
  85. {
  86. return Unauthorized("Quick connect is disabled");
  87. }
  88. }
  89. /// <summary>
  90. /// Authorizes a pending quick connect request.
  91. /// </summary>
  92. /// <param name="code">Quick connect code to authorize.</param>
  93. /// <response code="200">Quick connect result authorized successfully.</response>
  94. /// <response code="403">Unknown user id.</response>
  95. /// <returns>Boolean indicating if the authorization was successful.</returns>
  96. [HttpPost("Authorize")]
  97. [Authorize(Policy = Policies.DefaultAuthorization)]
  98. [ProducesResponseType(StatusCodes.Status200OK)]
  99. [ProducesResponseType(StatusCodes.Status403Forbidden)]
  100. public async Task<ActionResult<bool>> AuthorizeQuickConnect([FromQuery, Required] string code)
  101. {
  102. var userId = User.GetUserId();
  103. if (userId.Equals(default))
  104. {
  105. return StatusCode(StatusCodes.Status403Forbidden, "Unknown user id");
  106. }
  107. try
  108. {
  109. return await _quickConnect.AuthorizeRequest(userId, code).ConfigureAwait(false);
  110. }
  111. catch (AuthenticationException)
  112. {
  113. return Unauthorized("Quick connect is disabled");
  114. }
  115. }
  116. }
  117. }