Allow non-conformant client user agents

This commit is contained in:
Jordan Brown
2019-01-11 14:52:28 -05:00
parent 8685d8a07b
commit f3ed1d1f0a
2 changed files with 11 additions and 10 deletions
+10 -9
View File
@@ -61,9 +61,14 @@ namespace Tgstation.Server.Api
public long? InstanceId { get; set; }
/// <summary>
/// The client's user agent
/// The client's user agent as a <see cref="ProductHeaderValue"/> if valid
/// </summary>
public ProductHeaderValue UserAgent { get; }
public ProductHeaderValue UserAgent => ProductInfoHeaderValue.TryParse(RawUserAgent, out var userAgent) ? userAgent.Product : null;
/// <summary>
/// The client's raw user agent
/// </summary>
public string RawUserAgent { get; }
/// <summary>
/// The client's API version
@@ -136,13 +141,9 @@ namespace Tgstation.Server.Api
if (!requestHeaders.Accept.Any(x => x.MediaType == jsonAccept.MediaType))
throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Client does not accept {0}!", ApplicationJson));
if (!requestHeaders.Headers.TryGetValue(HeaderNames.UserAgent, out var userAgentValues) || !ProductInfoHeaderValue.TryParse(userAgentValues.FirstOrDefault(), out var clientUserAgent))
if (!requestHeaders.Headers.TryGetValue(HeaderNames.UserAgent, out var userAgentValues) || userAgentValues.Count == 0)
throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Missing {0} headers!", HeaderNames.UserAgent));
// assure the client user agent has a name and version
if (String.IsNullOrWhiteSpace(clientUserAgent.Product.Name) || !Version.TryParse(clientUserAgent.Product.Version, out var clientVersion))
throw new InvalidOperationException("Malformed client user agent!");
// make sure the api header matches ours
if (!requestHeaders.Headers.TryGetValue(ApiVersionHeader, out var apiUserAgentHeaderValues) || !ProductInfoHeaderValue.TryParse(apiUserAgentHeaderValues.FirstOrDefault(), out var apiUserAgent) || apiUserAgent.Product.Name != AssemblyName.Name)
throw new InvalidOperationException("Missing API version!");
@@ -151,7 +152,7 @@ namespace Tgstation.Server.Api
throw new InvalidOperationException("Malformed API version!");
ApiVersion = apiVersion;
UserAgent = clientUserAgent.Product;
RawUserAgent = userAgentValues.First();
if (!requestHeaders.Headers.TryGetValue(HeaderNames.Authorization, out StringValues authorization))
throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Missing {0} header!", HeaderNames.Authorization));
@@ -204,7 +205,7 @@ namespace Tgstation.Server.Api
/// <param name="password">The value of <see cref="Password"/></param>
ApiHeaders(ProductHeaderValue userAgent, string token, string username, string password)
{
UserAgent = userAgent;
RawUserAgent = userAgent.ToString();
Token = token;
Username = username;
Password = password;
@@ -152,7 +152,7 @@ namespace Tgstation.Server.Host.Controllers
}
if (ApiHeaders != null)
Logger.LogDebug("Request made by User ID {0}. Api version: {1}. User-Agent: {2}. Type: {3}. Route {4}{5} to Instance {6}", AuthenticationContext?.User.Id.ToString(CultureInfo.InvariantCulture), ApiHeaders.ApiVersion, ApiHeaders.UserAgent, Request.Method, Request.Path, Request.QueryString, ApiHeaders.InstanceId);
Logger.LogDebug("Request made by User ID {0}. Api version: {1}. User-Agent: {2}. Type: {3}. Route {4}{5} to Instance {6}", AuthenticationContext?.User.Id.ToString(CultureInfo.InvariantCulture), ApiHeaders.ApiVersion, ApiHeaders.RawUserAgent, Request.Method, Request.Path, Request.QueryString, ApiHeaders.InstanceId);
try
{