瀏覽代碼

Enable nullable reference types for MediaBrowser.Common

Bond_009 4 年之前
父節點
當前提交
91c2a57b28
共有 43 個文件被更改,包括 78 次插入64 次删除
  1. 3 2
      Jellyfin.Api/Auth/BaseAuthorizationHandler.cs
  2. 6 0
      Jellyfin.Api/Controllers/ConfigurationController.cs
  3. 2 0
      MediaBrowser.Common/Configuration/ConfigurationStore.cs
  4. 1 0
      MediaBrowser.Common/Configuration/ConfigurationUpdateEventArgs.cs
  5. 2 0
      MediaBrowser.Common/Configuration/IApplicationPaths.cs
  6. 0 1
      MediaBrowser.Common/Cryptography/PasswordHash.cs
  7. 2 2
      MediaBrowser.Common/Events/EventHelper.cs
  8. 0 2
      MediaBrowser.Common/Extensions/BaseExtensions.cs
  9. 0 2
      MediaBrowser.Common/Extensions/CopyToExtensions.cs
  10. 1 1
      MediaBrowser.Common/Extensions/HttpContextExtensions.cs
  11. 0 2
      MediaBrowser.Common/Extensions/MethodNotAllowedException.cs
  12. 0 2
      MediaBrowser.Common/Extensions/ProcessExtensions.cs
  13. 0 1
      MediaBrowser.Common/Extensions/RateLimitExceededException.cs
  14. 0 2
      MediaBrowser.Common/Extensions/ResourceNotFoundException.cs
  15. 0 2
      MediaBrowser.Common/Extensions/ShuffleExtensions.cs
  16. 1 1
      MediaBrowser.Common/Extensions/SplitStringExtensions.cs
  17. 0 2
      MediaBrowser.Common/Extensions/StreamExtensions.cs
  18. 2 0
      MediaBrowser.Common/IApplicationHost.cs
  19. 10 4
      MediaBrowser.Common/Json/Converters/JsonCommaDelimitedArrayConverter.cs
  20. 2 2
      MediaBrowser.Common/Json/Converters/JsonCommaDelimitedArrayConverterFactory.cs
  21. 3 3
      MediaBrowser.Common/Json/Converters/JsonNullableStructConverterFactory.cs
  22. 12 6
      MediaBrowser.Common/Json/Converters/JsonOmdbNotAvailableStringConverter.cs
  23. 10 3
      MediaBrowser.Common/Json/Converters/JsonPipeDelimitedArrayConverter.cs
  24. 2 2
      MediaBrowser.Common/Json/Converters/JsonPipeDelimitedArrayConverterFactory.cs
  25. 4 4
      MediaBrowser.Common/Json/Converters/JsonStringConverter.cs
  26. 1 1
      MediaBrowser.Common/Json/Converters/JsonVersionConverter.cs
  27. 1 0
      MediaBrowser.Common/MediaBrowser.Common.csproj
  28. 0 1
      MediaBrowser.Common/Net/INetworkManager.cs
  29. 0 1
      MediaBrowser.Common/Net/IPHost.cs
  30. 0 1
      MediaBrowser.Common/Net/IPNetAddress.cs
  31. 0 1
      MediaBrowser.Common/Net/IPObject.cs
  32. 2 0
      MediaBrowser.Common/Plugins/BasePlugin.cs
  33. 2 0
      MediaBrowser.Common/Plugins/BasePluginOfT.cs
  34. 2 0
      MediaBrowser.Common/Plugins/IPlugin.cs
  35. 0 2
      MediaBrowser.Common/Plugins/IPluginManager.cs
  36. 0 1
      MediaBrowser.Common/Plugins/LocalPlugin.cs
  37. 0 2
      MediaBrowser.Common/Plugins/PluginManifest.cs
  38. 2 2
      MediaBrowser.Common/Progress/ActionableProgress.cs
  39. 1 1
      MediaBrowser.Common/Progress/SimpleProgress.cs
  40. 1 3
      MediaBrowser.Common/Providers/ProviderIdParsers.cs
  41. 0 2
      MediaBrowser.Common/Updates/IInstallationManager.cs
  42. 2 0
      MediaBrowser.Common/Updates/InstallationEventArgs.cs
  43. 1 0
      MediaBrowser.Common/Updates/InstallationFailedEventArgs.cs

+ 3 - 2
Jellyfin.Api/Auth/BaseAuthorizationHandler.cs

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

+ 6 - 0
Jellyfin.Api/Controllers/ConfigurationController.cs

@@ -1,3 +1,4 @@
+using System;
 using System.ComponentModel.DataAnnotations;
 using System.Net.Mime;
 using System.Text.Json;
@@ -94,6 +95,11 @@ namespace Jellyfin.Api.Controllers
         {
             var configurationType = _configurationManager.GetConfigurationType(key);
             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);
             return NoContent();
         }

+ 2 - 0
MediaBrowser.Common/Configuration/ConfigurationStore.cs

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

+ 1 - 0
MediaBrowser.Common/Configuration/ConfigurationUpdateEventArgs.cs

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

+ 2 - 0
MediaBrowser.Common/Configuration/IApplicationPaths.cs

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

+ 0 - 1
MediaBrowser.Common/Cryptography/PasswordHash.cs

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

+ 2 - 2
MediaBrowser.Common/Events/EventHelper.cs

@@ -17,7 +17,7 @@ namespace MediaBrowser.Common.Events
         /// <param name="sender">The sender.</param>
         /// <param name="args">The <see cref="EventArgs" /> instance containing the event data.</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)
             {
@@ -43,7 +43,7 @@ namespace MediaBrowser.Common.Events
         /// <param name="sender">The sender.</param>
         /// <param name="args">The args.</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)
             {

+ 0 - 2
MediaBrowser.Common/Extensions/BaseExtensions.cs

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

+ 0 - 2
MediaBrowser.Common/Extensions/CopyToExtensions.cs

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

+ 1 - 1
MediaBrowser.Common/Extensions/HttpContextExtensions.cs

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

+ 0 - 2
MediaBrowser.Common/Extensions/MethodNotAllowedException.cs

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

+ 0 - 2
MediaBrowser.Common/Extensions/ProcessExtensions.cs

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

+ 0 - 1
MediaBrowser.Common/Extensions/RateLimitExceededException.cs

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

+ 0 - 2
MediaBrowser.Common/Extensions/ResourceNotFoundException.cs

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

+ 0 - 2
MediaBrowser.Common/Extensions/ShuffleExtensions.cs

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

+ 1 - 1
MediaBrowser.Common/Extensions/SplitStringExtensions.cs

@@ -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
 SOFTWARE.
  */
-#nullable enable
+
 #pragma warning disable CS1591
 #pragma warning disable CA1034
 using System;

+ 0 - 2
MediaBrowser.Common/Extensions/StreamExtensions.cs

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

+ 2 - 0
MediaBrowser.Common/IApplicationHost.cs

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

+ 10 - 4
MediaBrowser.Common/Json/Converters/JsonCommaDelimitedArrayConverter.cs

@@ -9,7 +9,7 @@ namespace MediaBrowser.Common.Json.Converters
     /// Convert comma delimited string to array of type.
     /// </summary>
     /// <typeparam name="T">Type to convert to.</typeparam>
-    public class JsonCommaDelimitedArrayConverter<T> : JsonConverter<T[]>
+    public class JsonCommaDelimitedArrayConverter<T> : JsonConverter<T[]?>
     {
         private readonly TypeConverter _typeConverter;
 
@@ -22,11 +22,17 @@ namespace MediaBrowser.Common.Json.Converters
         }
 
         /// <inheritdoc />
-        public override T[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        public override T[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
         {
+            if (reader.TokenType == JsonTokenType.Null)
+            {
+                return null;
+            }
+
             if (reader.TokenType == JsonTokenType.String)
             {
-                var stringEntries = reader.GetString().Split(',', StringSplitOptions.RemoveEmptyEntries);
+                // GetString can't return null here because we already handled it above
+                var stringEntries = reader.GetString()!.Split(',', StringSplitOptions.RemoveEmptyEntries);
                 if (stringEntries.Length == 0)
                 {
                     return Array.Empty<T>();
@@ -67,7 +73,7 @@ namespace MediaBrowser.Common.Json.Converters
         }
 
         /// <inheritdoc />
-        public override void Write(Utf8JsonWriter writer, T[] value, JsonSerializerOptions options)
+        public override void Write(Utf8JsonWriter writer, T[]? value, JsonSerializerOptions options)
         {
             throw new NotImplementedException();
         }

+ 2 - 2
MediaBrowser.Common/Json/Converters/JsonCommaDelimitedArrayConverterFactory.cs

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

+ 3 - 3
MediaBrowser.Common/Json/Converters/JsonNullableStructConverterFactory.cs

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

+ 12 - 6
MediaBrowser.Common/Json/Converters/JsonOmdbNotAvailableStringConverter.cs

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

+ 10 - 3
MediaBrowser.Common/Json/Converters/JsonPipeDelimitedArrayConverter.cs

@@ -24,10 +24,16 @@ namespace MediaBrowser.Common.Json.Converters
         /// <inheritdoc />
         public override T[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
         {
+            if (reader.TokenType == JsonTokenType.Null)
+            {
+                return Array.Empty<T>();
+            }
+
             if (reader.TokenType == JsonTokenType.String)
             {
-                var stringEntries = reader.GetString()?.Split('|', StringSplitOptions.RemoveEmptyEntries);
-                if (stringEntries == null || stringEntries.Length == 0)
+                // GetString can't return null here because we already handled it above
+                var stringEntries = reader.GetString()!.Split('|', StringSplitOptions.RemoveEmptyEntries);
+                if (stringEntries.Length == 0)
                 {
                     return Array.Empty<T>();
                 }
@@ -63,7 +69,8 @@ namespace MediaBrowser.Common.Json.Converters
                 return typedValues;
             }
 
-            return JsonSerializer.Deserialize<T[]>(ref reader, options);
+            // can't return null here because we already handled it above
+            return JsonSerializer.Deserialize<T[]>(ref reader, options)!;
         }
 
         /// <inheritdoc />

+ 2 - 2
MediaBrowser.Common/Json/Converters/JsonPipeDelimitedArrayConverterFactory.cs

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

+ 4 - 4
MediaBrowser.Common/Json/Converters/JsonStringConverter.cs

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

+ 1 - 1
MediaBrowser.Common/Json/Converters/JsonVersionConverter.cs

@@ -14,7 +14,7 @@ namespace MediaBrowser.Common.Json.Converters
     {
         /// <inheritdoc />
         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 />
         public override void Write(Utf8JsonWriter writer, Version value, JsonSerializerOptions options)

+ 1 - 0
MediaBrowser.Common/MediaBrowser.Common.csproj

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

+ 0 - 1
MediaBrowser.Common/Net/INetworkManager.cs

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

+ 0 - 1
MediaBrowser.Common/Net/IPHost.cs

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

+ 0 - 1
MediaBrowser.Common/Net/IPNetAddress.cs

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

+ 0 - 1
MediaBrowser.Common/Net/IPObject.cs

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

+ 2 - 0
MediaBrowser.Common/Plugins/BasePlugin.cs

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

+ 2 - 0
MediaBrowser.Common/Plugins/BasePluginOfT.cs

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

+ 2 - 0
MediaBrowser.Common/Plugins/IPlugin.cs

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

+ 0 - 2
MediaBrowser.Common/Plugins/IPluginManager.cs

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

+ 0 - 1
MediaBrowser.Common/Plugins/LocalPlugin.cs

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

+ 0 - 2
MediaBrowser.Common/Plugins/PluginManifest.cs

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

+ 2 - 2
MediaBrowser.Common/Progress/ActionableProgress.cs

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

+ 1 - 1
MediaBrowser.Common/Progress/SimpleProgress.cs

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

+ 1 - 3
MediaBrowser.Common/Providers/ProviderIdParsers.cs

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

+ 0 - 2
MediaBrowser.Common/Updates/IInstallationManager.cs

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

+ 2 - 0
MediaBrowser.Common/Updates/InstallationEventArgs.cs

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

+ 1 - 0
MediaBrowser.Common/Updates/InstallationFailedEventArgs.cs

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