Merge pull request #5982 from Bond-009/nullable

This commit is contained in:
Bond-009 2021-05-06 23:33:41 +02:00 committed by GitHub
commit a4a3f598af
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
44 changed files with 145 additions and 165 deletions

View File

@ -77,8 +77,9 @@ namespace Jellyfin.Api.Auth
return false; return false;
} }
var ip = _httpContextAccessor.HttpContext.GetNormalizedRemoteIp(); var isInLocalNetwork = _httpContextAccessor.HttpContext != null
var isInLocalNetwork = _networkManager.IsInLocalNetwork(ip); && _networkManager.IsInLocalNetwork(_httpContextAccessor.HttpContext.GetNormalizedRemoteIp());
// User cannot access remotely and user is remote // User cannot access remotely and user is remote
if (!user.HasPermission(PermissionKind.EnableRemoteAccess) && !isInLocalNetwork) if (!user.HasPermission(PermissionKind.EnableRemoteAccess) && !isInLocalNetwork)
{ {

View File

@ -1,3 +1,4 @@
using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Net.Mime; using System.Net.Mime;
using System.Text.Json; using System.Text.Json;
@ -94,6 +95,11 @@ namespace Jellyfin.Api.Controllers
{ {
var configurationType = _configurationManager.GetConfigurationType(key); var configurationType = _configurationManager.GetConfigurationType(key);
var configuration = await JsonSerializer.DeserializeAsync(Request.Body, configurationType, _serializerOptions).ConfigureAwait(false); var configuration = await JsonSerializer.DeserializeAsync(Request.Body, configurationType, _serializerOptions).ConfigureAwait(false);
if (configuration == null)
{
throw new ArgumentException("Body doesn't contain a valid configuration");
}
_configurationManager.SaveConfiguration(key, configuration); _configurationManager.SaveConfiguration(key, configuration);
return NoContent(); return NoContent();
} }

View File

@ -1,3 +1,5 @@
#nullable disable
using System; using System;
namespace MediaBrowser.Common.Configuration namespace MediaBrowser.Common.Configuration

View File

@ -1,3 +1,4 @@
#nullable disable
#pragma warning disable CS1591 #pragma warning disable CS1591
using System; using System;

View File

@ -1,3 +1,5 @@
#nullable disable
namespace MediaBrowser.Common.Configuration namespace MediaBrowser.Common.Configuration
{ {
/// <summary> /// <summary>

View File

@ -1,5 +1,4 @@
#pragma warning disable CS1591 #pragma warning disable CS1591
#nullable enable
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;

View File

@ -17,7 +17,7 @@ namespace MediaBrowser.Common.Events
/// <param name="sender">The sender.</param> /// <param name="sender">The sender.</param>
/// <param name="args">The <see cref="EventArgs" /> instance containing the event data.</param> /// <param name="args">The <see cref="EventArgs" /> instance containing the event data.</param>
/// <param name="logger">The logger.</param> /// <param name="logger">The logger.</param>
public static void QueueEventIfNotNull(EventHandler handler, object sender, EventArgs args, ILogger logger) public static void QueueEventIfNotNull(EventHandler? handler, object sender, EventArgs args, ILogger logger)
{ {
if (handler != null) if (handler != null)
{ {
@ -43,7 +43,7 @@ namespace MediaBrowser.Common.Events
/// <param name="sender">The sender.</param> /// <param name="sender">The sender.</param>
/// <param name="args">The args.</param> /// <param name="args">The args.</param>
/// <param name="logger">The logger.</param> /// <param name="logger">The logger.</param>
public static void QueueEventIfNotNull<T>(EventHandler<T> handler, object sender, T args, ILogger logger) public static void QueueEventIfNotNull<T>(EventHandler<T>? handler, object sender, T args, ILogger logger)
{ {
if (handler != null) if (handler != null)
{ {

View File

@ -1,5 +1,3 @@
#nullable enable
using System; using System;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;

View File

@ -1,5 +1,3 @@
#nullable enable
using System.Collections.Generic; using System.Collections.Generic;
namespace MediaBrowser.Common.Extensions namespace MediaBrowser.Common.Extensions

View File

@ -17,7 +17,7 @@ namespace MediaBrowser.Common.Extensions
{ {
return (context.Connection.LocalIpAddress == null return (context.Connection.LocalIpAddress == null
&& context.Connection.RemoteIpAddress == null) && context.Connection.RemoteIpAddress == null)
|| context.Connection.LocalIpAddress.Equals(context.Connection.RemoteIpAddress); || Equals(context.Connection.LocalIpAddress, context.Connection.RemoteIpAddress);
} }
/// <summary> /// <summary>

View File

@ -1,5 +1,3 @@
#nullable enable
using System; using System;
namespace MediaBrowser.Common.Extensions namespace MediaBrowser.Common.Extensions

View File

@ -1,5 +1,3 @@
#nullable enable
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Threading; using System.Threading;

View File

@ -1,4 +1,3 @@
#nullable enable
#pragma warning disable CS1591 #pragma warning disable CS1591
using System; using System;

View File

@ -1,5 +1,3 @@
#nullable enable
using System; using System;
namespace MediaBrowser.Common.Extensions namespace MediaBrowser.Common.Extensions

View File

@ -1,5 +1,3 @@
#nullable enable
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;

View File

@ -21,7 +21,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
*/ */
#nullable enable
#pragma warning disable CS1591 #pragma warning disable CS1591
#pragma warning disable CA1034 #pragma warning disable CA1034
using System; using System;

View File

@ -1,5 +1,3 @@
#nullable enable
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;

View File

@ -1,3 +1,5 @@
#nullable disable
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;

View File

@ -9,67 +9,16 @@ namespace MediaBrowser.Common.Json.Converters
/// Convert comma delimited string to array of type. /// Convert comma delimited string to array of type.
/// </summary> /// </summary>
/// <typeparam name="T">Type to convert to.</typeparam> /// <typeparam name="T">Type to convert to.</typeparam>
public class JsonCommaDelimitedArrayConverter<T> : JsonConverter<T[]> public sealed class JsonCommaDelimitedArrayConverter<T> : JsonDelimitedArrayConverter<T>
{ {
private readonly TypeConverter _typeConverter;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="JsonCommaDelimitedArrayConverter{T}"/> class. /// Initializes a new instance of the <see cref="JsonCommaDelimitedArrayConverter{T}"/> class.
/// </summary> /// </summary>
public JsonCommaDelimitedArrayConverter() public JsonCommaDelimitedArrayConverter() : base()
{ {
_typeConverter = TypeDescriptor.GetConverter(typeof(T));
} }
/// <inheritdoc /> /// <inheritdoc />
public override T[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) protected override char Delimiter => ',';
{
if (reader.TokenType == JsonTokenType.String)
{
var stringEntries = reader.GetString().Split(',', StringSplitOptions.RemoveEmptyEntries);
if (stringEntries.Length == 0)
{
return Array.Empty<T>();
}
var parsedValues = new object[stringEntries.Length];
var convertedCount = 0;
for (var i = 0; i < stringEntries.Length; i++)
{
try
{
parsedValues[i] = _typeConverter.ConvertFrom(stringEntries[i].Trim());
convertedCount++;
}
catch (FormatException)
{
// TODO log when upgraded to .Net6
// https://github.com/dotnet/runtime/issues/42975
// _logger.LogDebug(e, "Error converting value.");
}
}
var typedValues = new T[convertedCount];
var typedValueIndex = 0;
for (var i = 0; i < stringEntries.Length; i++)
{
if (parsedValues[i] != null)
{
typedValues.SetValue(parsedValues[i], typedValueIndex);
typedValueIndex++;
}
}
return typedValues;
}
return JsonSerializer.Deserialize<T[]>(ref reader, options);
}
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, T[] value, JsonSerializerOptions options)
{
throw new NotImplementedException();
}
} }
} }

View File

@ -19,10 +19,10 @@ namespace MediaBrowser.Common.Json.Converters
} }
/// <inheritdoc /> /// <inheritdoc />
public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options) public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options)
{ {
var structType = typeToConvert.GetElementType() ?? typeToConvert.GenericTypeArguments[0]; var structType = typeToConvert.GetElementType() ?? typeToConvert.GenericTypeArguments[0];
return (JsonConverter)Activator.CreateInstance(typeof(JsonCommaDelimitedArrayConverter<>).MakeGenericType(structType)); return (JsonConverter?)Activator.CreateInstance(typeof(JsonCommaDelimitedArrayConverter<>).MakeGenericType(structType));
} }
} }
} }

View File

@ -0,0 +1,81 @@
using System;
using System.ComponentModel;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace MediaBrowser.Common.Json.Converters
{
/// <summary>
/// Convert delimited string to array of type.
/// </summary>
/// <typeparam name="T">Type to convert to.</typeparam>
public abstract class JsonDelimitedArrayConverter<T> : JsonConverter<T[]?>
{
private readonly TypeConverter _typeConverter;
/// <summary>
/// Initializes a new instance of the <see cref="JsonDelimitedArrayConverter{T}"/> class.
/// </summary>
protected JsonDelimitedArrayConverter()
{
_typeConverter = TypeDescriptor.GetConverter(typeof(T));
}
/// <summary>
/// Gets the array delimiter.
/// </summary>
protected virtual char Delimiter { get; }
/// <inheritdoc />
public override T[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
{
// GetString can't return null here because we already handled it above
var stringEntries = reader.GetString()?.Split(Delimiter, StringSplitOptions.RemoveEmptyEntries);
if (stringEntries == null || stringEntries.Length == 0)
{
return Array.Empty<T>();
}
var parsedValues = new object[stringEntries.Length];
var convertedCount = 0;
for (var i = 0; i < stringEntries.Length; i++)
{
try
{
parsedValues[i] = _typeConverter.ConvertFrom(stringEntries[i].Trim());
convertedCount++;
}
catch (FormatException)
{
// TODO log when upgraded to .Net6
// https://github.com/dotnet/runtime/issues/42975
// _logger.LogDebug(e, "Error converting value.");
}
}
var typedValues = new T[convertedCount];
var typedValueIndex = 0;
for (var i = 0; i < stringEntries.Length; i++)
{
if (parsedValues[i] != null)
{
typedValues.SetValue(parsedValues[i], typedValueIndex);
typedValueIndex++;
}
}
return typedValues;
}
return JsonSerializer.Deserialize<T[]>(ref reader, options);
}
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, T[]? value, JsonSerializerOptions options)
{
throw new NotImplementedException();
}
}
}

View File

@ -18,10 +18,10 @@ namespace MediaBrowser.Common.Json.Converters
} }
/// <inheritdoc /> /// <inheritdoc />
public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options) public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options)
{ {
var structType = typeToConvert.GenericTypeArguments[0]; var structType = typeToConvert.GenericTypeArguments[0];
return (JsonConverter)Activator.CreateInstance(typeof(JsonNullableStructConverter<>).MakeGenericType(structType)); return (JsonConverter?)Activator.CreateInstance(typeof(JsonNullableStructConverter<>).MakeGenericType(structType));
} }
} }
} }

View File

@ -7,15 +7,21 @@ namespace MediaBrowser.Common.Json.Converters
/// <summary> /// <summary>
/// Converts a string <c>N/A</c> to <c>string.Empty</c>. /// Converts a string <c>N/A</c> to <c>string.Empty</c>.
/// </summary> /// </summary>
public class JsonOmdbNotAvailableStringConverter : JsonConverter<string> public class JsonOmdbNotAvailableStringConverter : JsonConverter<string?>
{ {
/// <inheritdoc /> /// <inheritdoc />
public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) public override string? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{ {
if (reader.TokenType == JsonTokenType.Null)
{
return null;
}
if (reader.TokenType == JsonTokenType.String) if (reader.TokenType == JsonTokenType.String)
{ {
var str = reader.GetString(); // GetString can't return null here because we already handled it above
if (str != null && str.Equals("N/A", StringComparison.OrdinalIgnoreCase)) var str = reader.GetString()!;
if (str.Equals("N/A", StringComparison.OrdinalIgnoreCase))
{ {
return null; return null;
} }
@ -23,11 +29,11 @@ namespace MediaBrowser.Common.Json.Converters
return str; return str;
} }
return JsonSerializer.Deserialize<string>(ref reader, options); return JsonSerializer.Deserialize<string?>(ref reader, options);
} }
/// <inheritdoc /> /// <inheritdoc />
public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) public override void Write(Utf8JsonWriter writer, string? value, JsonSerializerOptions options)
{ {
writer.WriteStringValue(value); writer.WriteStringValue(value);
} }

View File

@ -9,67 +9,16 @@ namespace MediaBrowser.Common.Json.Converters
/// Convert Pipe delimited string to array of type. /// Convert Pipe delimited string to array of type.
/// </summary> /// </summary>
/// <typeparam name="T">Type to convert to.</typeparam> /// <typeparam name="T">Type to convert to.</typeparam>
public class JsonPipeDelimitedArrayConverter<T> : JsonConverter<T[]> public sealed class JsonPipeDelimitedArrayConverter<T> : JsonDelimitedArrayConverter<T>
{ {
private readonly TypeConverter _typeConverter;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="JsonPipeDelimitedArrayConverter{T}"/> class. /// Initializes a new instance of the <see cref="JsonPipeDelimitedArrayConverter{T}"/> class.
/// </summary> /// </summary>
public JsonPipeDelimitedArrayConverter() public JsonPipeDelimitedArrayConverter() : base()
{ {
_typeConverter = TypeDescriptor.GetConverter(typeof(T));
} }
/// <inheritdoc /> /// <inheritdoc />
public override T[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) protected override char Delimiter => '|';
{
if (reader.TokenType == JsonTokenType.String)
{
var stringEntries = reader.GetString()?.Split('|', StringSplitOptions.RemoveEmptyEntries);
if (stringEntries == null || stringEntries.Length == 0)
{
return Array.Empty<T>();
}
var parsedValues = new object[stringEntries.Length];
var convertedCount = 0;
for (var i = 0; i < stringEntries.Length; i++)
{
try
{
parsedValues[i] = _typeConverter.ConvertFrom(stringEntries[i].Trim());
convertedCount++;
}
catch (FormatException)
{
// TODO log when upgraded to .Net6
// https://github.com/dotnet/runtime/issues/42975
// _logger.LogDebug(e, "Error converting value.");
}
}
var typedValues = new T[convertedCount];
var typedValueIndex = 0;
for (var i = 0; i < stringEntries.Length; i++)
{
if (parsedValues[i] != null)
{
typedValues.SetValue(parsedValues[i], typedValueIndex);
typedValueIndex++;
}
}
return typedValues;
}
return JsonSerializer.Deserialize<T[]>(ref reader, options);
}
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, T[] value, JsonSerializerOptions options)
{
throw new NotImplementedException();
}
} }
} }

View File

@ -19,10 +19,10 @@ namespace MediaBrowser.Common.Json.Converters
} }
/// <inheritdoc /> /// <inheritdoc />
public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options) public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options)
{ {
var structType = typeToConvert.GetElementType() ?? typeToConvert.GenericTypeArguments[0]; var structType = typeToConvert.GetElementType() ?? typeToConvert.GenericTypeArguments[0];
return (JsonConverter)Activator.CreateInstance(typeof(JsonPipeDelimitedArrayConverter<>).MakeGenericType(structType)); return (JsonConverter?)Activator.CreateInstance(typeof(JsonPipeDelimitedArrayConverter<>).MakeGenericType(structType));
} }
} }
} }

View File

@ -9,10 +9,10 @@ namespace MediaBrowser.Common.Json.Converters
/// <summary> /// <summary>
/// Converter to allow the serializer to read strings. /// Converter to allow the serializer to read strings.
/// </summary> /// </summary>
public class JsonStringConverter : JsonConverter<string> public class JsonStringConverter : JsonConverter<string?>
{ {
/// <inheritdoc /> /// <inheritdoc />
public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) public override string? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{ {
return reader.TokenType switch return reader.TokenType switch
{ {
@ -23,7 +23,7 @@ namespace MediaBrowser.Common.Json.Converters
} }
/// <inheritdoc /> /// <inheritdoc />
public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) public override void Write(Utf8JsonWriter writer, string? value, JsonSerializerOptions options)
{ {
writer.WriteStringValue(value); writer.WriteStringValue(value);
} }
@ -36,4 +36,4 @@ namespace MediaBrowser.Common.Json.Converters
return Encoding.UTF8.GetString(utf8Bytes); return Encoding.UTF8.GetString(utf8Bytes);
} }
} }
} }

View File

@ -14,7 +14,7 @@ namespace MediaBrowser.Common.Json.Converters
{ {
/// <inheritdoc /> /// <inheritdoc />
public override Version Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) public override Version Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> new Version(reader.GetString()); => new Version(reader.GetString()!); // Will throw ArgumentNullException on null
/// <inheritdoc /> /// <inheritdoc />
public override void Write(Utf8JsonWriter writer, Version value, JsonSerializerOptions options) public override void Write(Utf8JsonWriter writer, Version value, JsonSerializerOptions options)

View File

@ -33,6 +33,7 @@
<GenerateAssemblyInfo>false</GenerateAssemblyInfo> <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<GenerateDocumentationFile>true</GenerateDocumentationFile> <GenerateDocumentationFile>true</GenerateDocumentationFile>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors> <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<Nullable>enable</Nullable>
<AnalysisMode>AllEnabledByDefault</AnalysisMode> <AnalysisMode>AllEnabledByDefault</AnalysisMode>
<CodeAnalysisRuleSet>../jellyfin.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>../jellyfin.ruleset</CodeAnalysisRuleSet>
<PublishRepositoryUrl>true</PublishRepositoryUrl> <PublishRepositoryUrl>true</PublishRepositoryUrl>

View File

@ -1,4 +1,3 @@
#nullable enable
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;

View File

@ -1,4 +1,3 @@
#nullable enable
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;

View File

@ -1,4 +1,3 @@
#nullable enable
using System; using System;
using System.Net; using System.Net;
using System.Net.Sockets; using System.Net.Sockets;

View File

@ -1,4 +1,3 @@
#nullable enable
using System; using System;
using System.Net; using System.Net;
using System.Net.Sockets; using System.Net.Sockets;

View File

@ -1,3 +1,5 @@
#nullable disable
using System; using System;
using System.IO; using System.IO;
using System.Reflection; using System.Reflection;

View File

@ -1,4 +1,6 @@
#nullable disable
#pragma warning disable SA1649 // File name should match first type name #pragma warning disable SA1649 // File name should match first type name
using System; using System;
using System.IO; using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;

View File

@ -1,3 +1,5 @@
#nullable disable
using System; using System;
using MediaBrowser.Model.Plugins; using MediaBrowser.Model.Plugins;

View File

@ -1,5 +1,3 @@
#nullable enable
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;

View File

@ -1,4 +1,3 @@
#nullable enable
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using MediaBrowser.Model.Plugins; using MediaBrowser.Model.Plugins;

View File

@ -1,5 +1,3 @@
#nullable enable
using System; using System;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using MediaBrowser.Model.Plugins; using MediaBrowser.Model.Plugins;

View File

@ -14,9 +14,9 @@ namespace MediaBrowser.Common.Progress
/// <summary> /// <summary>
/// The _actions. /// The _actions.
/// </summary> /// </summary>
private Action<T> _action; private Action<T>? _action;
public event EventHandler<T> ProgressChanged; public event EventHandler<T>? ProgressChanged;
/// <summary> /// <summary>
/// Registers the action. /// Registers the action.

View File

@ -7,7 +7,7 @@ namespace MediaBrowser.Common.Progress
{ {
public class SimpleProgress<T> : IProgress<T> public class SimpleProgress<T> : IProgress<T>
{ {
public event EventHandler<T> ProgressChanged; public event EventHandler<T>? ProgressChanged;
public void Report(T value) public void Report(T value)
{ {

View File

@ -1,6 +1,4 @@
#nullable enable using System;
using System;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
namespace MediaBrowser.Common.Providers namespace MediaBrowser.Common.Providers

View File

@ -1,5 +1,3 @@
#nullable enable
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;

View File

@ -1,3 +1,5 @@
#nullable disable
using System; using System;
using MediaBrowser.Model.Updates; using MediaBrowser.Model.Updates;

View File

@ -1,3 +1,4 @@
#nullable disable
#pragma warning disable CS1591 #pragma warning disable CS1591
using System; using System;