Rework how we create the OAuth Pin !wip

pull/2372/head
Jamie Rees 6 years ago
parent cbf331cd09
commit 7bfc5ad632

@ -24,6 +24,6 @@ namespace Ombi.Api.Plex
Task<PlexMetadata> GetRecentlyAdded(string authToken, string uri, string sectionId); Task<PlexMetadata> GetRecentlyAdded(string authToken, string uri, string sectionId);
Task<OAuthPin> CreatePin(); Task<OAuthPin> CreatePin();
Task<OAuthPin> GetPin(int pinId); Task<OAuthPin> GetPin(int pinId);
Uri GetOAuthUrl(int pinId, string code, string applicationUrl, bool wizard); Task<Uri> GetOAuthUrl(int pinId, string code, string applicationUrl, bool wizard);
} }
} }

@ -16,14 +16,16 @@ namespace Ombi.Api.Plex
{ {
public class PlexApi : IPlexApi public class PlexApi : IPlexApi
{ {
public PlexApi(IApi api, ISettingsService<CustomizationSettings> settings) public PlexApi(IApi api, ISettingsService<CustomizationSettings> settings, ISettingsService<PlexSettings> p)
{ {
Api = api; Api = api;
_custom = settings; _custom = settings;
_plexSettings = p;
} }
private IApi Api { get; } private IApi Api { get; }
private readonly ISettingsService<CustomizationSettings> _custom; private readonly ISettingsService<CustomizationSettings> _custom;
private readonly ISettingsService<PlexSettings> _plexSettings;
private string _app; private string _app;
private string ApplicationName private string ApplicationName
@ -69,7 +71,7 @@ namespace Ombi.Api.Plex
}; };
var request = new Request(SignInUri, string.Empty, HttpMethod.Post); var request = new Request(SignInUri, string.Empty, HttpMethod.Post);
AddHeaders(request); await AddHeaders(request);
request.AddJsonBody(userModel); request.AddJsonBody(userModel);
var obj = await Api.Request<PlexAuthentication>(request); var obj = await Api.Request<PlexAuthentication>(request);
@ -80,14 +82,14 @@ namespace Ombi.Api.Plex
public async Task<PlexStatus> GetStatus(string authToken, string uri) public async Task<PlexStatus> GetStatus(string authToken, string uri)
{ {
var request = new Request(uri, string.Empty, HttpMethod.Get); var request = new Request(uri, string.Empty, HttpMethod.Get);
AddHeaders(request, authToken); await AddHeaders(request, authToken);
return await Api.Request<PlexStatus>(request); return await Api.Request<PlexStatus>(request);
} }
public async Task<PlexAccount> GetAccount(string authToken) public async Task<PlexAccount> GetAccount(string authToken)
{ {
var request = new Request(GetAccountUri, string.Empty, HttpMethod.Get); var request = new Request(GetAccountUri, string.Empty, HttpMethod.Get);
AddHeaders(request, authToken); await AddHeaders(request, authToken);
return await Api.Request<PlexAccount>(request); return await Api.Request<PlexAccount>(request);
} }
@ -95,7 +97,7 @@ namespace Ombi.Api.Plex
{ {
var request = new Request(ServerUri, string.Empty, HttpMethod.Get, ContentType.Xml); var request = new Request(ServerUri, string.Empty, HttpMethod.Get, ContentType.Xml);
AddHeaders(request, authToken); await AddHeaders(request, authToken);
return await Api.Request<PlexServer>(request); return await Api.Request<PlexServer>(request);
} }
@ -103,14 +105,14 @@ namespace Ombi.Api.Plex
public async Task<PlexContainer> GetLibrarySections(string authToken, string plexFullHost) public async Task<PlexContainer> GetLibrarySections(string authToken, string plexFullHost)
{ {
var request = new Request("library/sections", plexFullHost, HttpMethod.Get); var request = new Request("library/sections", plexFullHost, HttpMethod.Get);
AddHeaders(request, authToken); await AddHeaders(request, authToken);
return await Api.Request<PlexContainer>(request); return await Api.Request<PlexContainer>(request);
} }
public async Task<PlexContainer> GetLibrary(string authToken, string plexFullHost, string libraryId) public async Task<PlexContainer> GetLibrary(string authToken, string plexFullHost, string libraryId)
{ {
var request = new Request($"library/sections/{libraryId}/all", plexFullHost, HttpMethod.Get); var request = new Request($"library/sections/{libraryId}/all", plexFullHost, HttpMethod.Get);
AddHeaders(request, authToken); await AddHeaders(request, authToken);
return await Api.Request<PlexContainer>(request); return await Api.Request<PlexContainer>(request);
} }
@ -128,21 +130,21 @@ namespace Ombi.Api.Plex
public async Task<PlexMetadata> GetEpisodeMetaData(string authToken, string plexFullHost, int ratingKey) public async Task<PlexMetadata> GetEpisodeMetaData(string authToken, string plexFullHost, int ratingKey)
{ {
var request = new Request($"/library/metadata/{ratingKey}", plexFullHost, HttpMethod.Get); var request = new Request($"/library/metadata/{ratingKey}", plexFullHost, HttpMethod.Get);
AddHeaders(request, authToken); await AddHeaders(request, authToken);
return await Api.Request<PlexMetadata>(request); return await Api.Request<PlexMetadata>(request);
} }
public async Task<PlexMetadata> GetMetadata(string authToken, string plexFullHost, int itemId) public async Task<PlexMetadata> GetMetadata(string authToken, string plexFullHost, int itemId)
{ {
var request = new Request($"library/metadata/{itemId}", plexFullHost, HttpMethod.Get); var request = new Request($"library/metadata/{itemId}", plexFullHost, HttpMethod.Get);
AddHeaders(request, authToken); await AddHeaders(request, authToken);
return await Api.Request<PlexMetadata>(request); return await Api.Request<PlexMetadata>(request);
} }
public async Task<PlexMetadata> GetSeasons(string authToken, string plexFullHost, int ratingKey) public async Task<PlexMetadata> GetSeasons(string authToken, string plexFullHost, int ratingKey)
{ {
var request = new Request($"library/metadata/{ratingKey}/children", plexFullHost, HttpMethod.Get); var request = new Request($"library/metadata/{ratingKey}/children", plexFullHost, HttpMethod.Get);
AddHeaders(request, authToken); await AddHeaders(request, authToken);
return await Api.Request<PlexMetadata>(request); return await Api.Request<PlexMetadata>(request);
} }
@ -161,7 +163,7 @@ namespace Ombi.Api.Plex
request.AddQueryString("type", "4"); request.AddQueryString("type", "4");
AddLimitHeaders(request, start, retCount); AddLimitHeaders(request, start, retCount);
AddHeaders(request, authToken); await AddHeaders(request, authToken);
return await Api.Request<PlexContainer>(request); return await Api.Request<PlexContainer>(request);
} }
@ -174,8 +176,8 @@ namespace Ombi.Api.Plex
/// <returns></returns> /// <returns></returns>
public async Task<PlexFriends> GetUsers(string authToken) public async Task<PlexFriends> GetUsers(string authToken)
{ {
var request = new Request(string.Empty,FriendsUri, HttpMethod.Get, ContentType.Xml); var request = new Request(string.Empty, FriendsUri, HttpMethod.Get, ContentType.Xml);
AddHeaders(request, authToken); await AddHeaders(request, authToken);
return await Api.Request<PlexFriends>(request); return await Api.Request<PlexFriends>(request);
} }
@ -183,7 +185,7 @@ namespace Ombi.Api.Plex
public async Task<PlexMetadata> GetRecentlyAdded(string authToken, string uri, string sectionId) public async Task<PlexMetadata> GetRecentlyAdded(string authToken, string uri, string sectionId)
{ {
var request = new Request($"library/sections/{sectionId}/recentlyAdded", uri, HttpMethod.Get); var request = new Request($"library/sections/{sectionId}/recentlyAdded", uri, HttpMethod.Get);
AddHeaders(request, authToken); await AddHeaders(request, authToken);
AddLimitHeaders(request, 0, 50); AddLimitHeaders(request, 0, 50);
return await Api.Request<PlexMetadata>(request); return await Api.Request<PlexMetadata>(request);
@ -193,7 +195,7 @@ namespace Ombi.Api.Plex
{ {
var request = new Request($"api/v2/pins", "https://plex.tv/", HttpMethod.Post); var request = new Request($"api/v2/pins", "https://plex.tv/", HttpMethod.Post);
request.AddQueryString("strong", "true"); request.AddQueryString("strong", "true");
AddHeaders(request); await AddHeaders(request);
return await Api.Request<OAuthPin>(request); return await Api.Request<OAuthPin>(request);
} }
@ -201,15 +203,15 @@ namespace Ombi.Api.Plex
public async Task<OAuthPin> GetPin(int pinId) public async Task<OAuthPin> GetPin(int pinId)
{ {
var request = new Request($"api/v2/pins/{pinId}", "https://plex.tv/", HttpMethod.Get); var request = new Request($"api/v2/pins/{pinId}", "https://plex.tv/", HttpMethod.Get);
AddHeaders(request); await AddHeaders(request);
return await Api.Request<OAuthPin>(request); return await Api.Request<OAuthPin>(request);
} }
public Uri GetOAuthUrl(int pinId, string code, string applicationUrl, bool wizard) public async Task<Uri> GetOAuthUrl(int pinId, string code, string applicationUrl, bool wizard)
{ {
var request = new Request("auth#", "https://app.plex.tv", HttpMethod.Get); var request = new Request("auth#!?", "https://app.plex.tv", HttpMethod.Get);
AddHeaders(request); await AddHeaders(request);
var forwardUrl = wizard var forwardUrl = wizard
? new Request($"Wizard/OAuth/{pinId}", applicationUrl, HttpMethod.Get) ? new Request($"Wizard/OAuth/{pinId}", applicationUrl, HttpMethod.Get)
: new Request($"Login/OAuth/{pinId}", applicationUrl, HttpMethod.Get); : new Request($"Login/OAuth/{pinId}", applicationUrl, HttpMethod.Get);
@ -219,7 +221,13 @@ namespace Ombi.Api.Plex
request.AddQueryString("code", code); request.AddQueryString("code", code);
request.AddQueryString("context[device][product]", "Ombi"); request.AddQueryString("context[device][product]", "Ombi");
request.AddQueryString("context[device][environment]", "bundled"); request.AddQueryString("context[device][environment]", "bundled");
request.AddQueryString("clientID", $"OmbiV3"); request.AddQueryString("context[device][layout]", "desktop");
request.AddQueryString("context[device][platform]", "Web");
request.AddQueryString("context[device][devuce]", "Ombi (Web)");
var s = await GetSettings();
await CheckInstallId(s);
request.AddQueryString("clientID", s.InstallId.ToString("N"));
if (request.FullUri.Fragment.Equals("#")) if (request.FullUri.Fragment.Equals("#"))
{ {
@ -238,21 +246,25 @@ namespace Ombi.Api.Plex
/// </summary> /// </summary>
/// <param name="request"></param> /// <param name="request"></param>
/// <param name="authToken"></param> /// <param name="authToken"></param>
private void AddHeaders(Request request, string authToken) private async Task AddHeaders(Request request, string authToken)
{ {
request.AddHeader("X-Plex-Token", authToken); request.AddHeader("X-Plex-Token", authToken);
AddHeaders(request); await AddHeaders(request);
} }
/// <summary> /// <summary>
/// Adds the main required headers to the Plex Request /// Adds the main required headers to the Plex Request
/// </summary> /// </summary>
/// <param name="request"></param> /// <param name="request"></param>
private void AddHeaders(Request request) private async Task AddHeaders(Request request)
{ {
request.AddHeader("X-Plex-Client-Identifier", $"OmbiV3"); var s = await GetSettings();
await CheckInstallId(s);
request.AddHeader("X-Plex-Client-Identifier", s.InstallId.ToString("N"));
request.AddHeader("X-Plex-Product", ApplicationName); request.AddHeader("X-Plex-Product", ApplicationName);
request.AddHeader("X-Plex-Version", "3"); request.AddHeader("X-Plex-Version", "3");
request.AddHeader("X-Plex-Device", "Ombi (Web)");
request.AddHeader("X-Plex-Platform", "Web");
request.AddContentHeader("Content-Type", request.ContentType == ContentType.Json ? "application/json" : "application/xml"); request.AddContentHeader("Content-Type", request.ContentType == ContentType.Json ? "application/json" : "application/xml");
request.AddHeader("Accept", "application/json"); request.AddHeader("Accept", "application/json");
} }
@ -262,5 +274,19 @@ namespace Ombi.Api.Plex
request.AddHeader("X-Plex-Container-Start", from.ToString()); request.AddHeader("X-Plex-Container-Start", from.ToString());
request.AddHeader("X-Plex-Container-Size", to.ToString()); request.AddHeader("X-Plex-Container-Size", to.ToString());
} }
private async Task CheckInstallId(PlexSettings s)
{
if (s.InstallId == null || s.InstallId == Guid.Empty)
{
s.InstallId = Guid.NewGuid();
await _plexSettings.SaveSettingsAsync(s);
}
}
private PlexSettings _settings;
private async Task<PlexSettings> GetSettings()
{
return _settings ?? (_settings = await _plexSettings.GetSettingsAsync());
}
} }
} }

@ -58,14 +58,14 @@ namespace Ombi.Core.Authentication
public async Task<Uri> GetOAuthUrl(int pinId, string code, string websiteAddress = null) public async Task<Uri> GetOAuthUrl(int pinId, string code, string websiteAddress = null)
{ {
var settings = await _customizationSettingsService.GetSettingsAsync(); var settings = await _customizationSettingsService.GetSettingsAsync();
var url = _api.GetOAuthUrl(pinId, code, settings.ApplicationUrl.IsNullOrEmpty() ? websiteAddress : settings.ApplicationUrl, false); var url = await _api.GetOAuthUrl(pinId, code, settings.ApplicationUrl.IsNullOrEmpty() ? websiteAddress : settings.ApplicationUrl, false);
return url; return url;
} }
public Uri GetWizardOAuthUrl(int pinId, string code, string websiteAddress) public async Task<Uri> GetWizardOAuthUrl(int pinId, string code, string websiteAddress)
{ {
var url = _api.GetOAuthUrl(pinId, code, websiteAddress, true); var url = await _api.GetOAuthUrl(pinId, code, websiteAddress, true);
return url; return url;
} }
} }

@ -10,7 +10,7 @@ namespace Ombi.Core.Authentication
Task<string> GetAccessTokenFromPin(int pinId); Task<string> GetAccessTokenFromPin(int pinId);
Task<OAuthPin> RequestPin(); Task<OAuthPin> RequestPin();
Task<Uri> GetOAuthUrl(int pinId, string code, string websiteAddress = null); Task<Uri> GetOAuthUrl(int pinId, string code, string websiteAddress = null);
Uri GetWizardOAuthUrl(int pinId, string code, string websiteAddress); Task<Uri> GetWizardOAuthUrl(int pinId, string code, string websiteAddress);
Task<PlexAccount> GetAccount(string accessToken); Task<PlexAccount> GetAccount(string accessToken);
} }
} }

@ -1,4 +1,5 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using Ombi.Settings.Settings.Models.External; using Ombi.Settings.Settings.Models.External;
namespace Ombi.Core.Settings.Models.External namespace Ombi.Core.Settings.Models.External
@ -6,6 +7,10 @@ namespace Ombi.Core.Settings.Models.External
public sealed class PlexSettings : Ombi.Settings.Settings.Models.Settings public sealed class PlexSettings : Ombi.Settings.Settings.Models.Settings
{ {
public bool Enable { get; set; } public bool Enable { get; set; }
/// <summary>
/// This is the ClientId for OAuth
/// </summary>
public Guid InstallId { get; set; }
public List<PlexServers> Servers { get; set; } public List<PlexServers> Servers { get; set; }
} }

@ -195,7 +195,7 @@ namespace Ombi.Controllers.External
else else
{ {
var websiteAddress =$"{this.Request.Scheme}://{this.Request.Host}{this.Request.PathBase}"; var websiteAddress =$"{this.Request.Scheme}://{this.Request.Host}{this.Request.PathBase}";
url = _plexOAuthManager.GetWizardOAuthUrl(pin.id, pin.code, websiteAddress); url = await _plexOAuthManager.GetWizardOAuthUrl(pin.id, pin.code, websiteAddress);
} }
if (url == null) if (url == null)

@ -139,6 +139,10 @@ namespace Ombi.Controllers
[HttpPost("plex")] [HttpPost("plex")]
public async Task<bool> PlexSettings([FromBody]PlexSettings plex) public async Task<bool> PlexSettings([FromBody]PlexSettings plex)
{ {
if (plex.InstallId == null || plex.InstallId == Guid.Empty)
{
plex.InstallId = Guid.NewGuid();
}
var result = await Save(plex); var result = await Save(plex);
return result; return result;
} }

Loading…
Cancel
Save