2
0

QuickConnectController.cs 4.4 KB

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