Skip to content

Commit 8495795

Browse files
committed
Prevent IStreamSerializable types from being serialized using STJ
1 parent a7a5a18 commit 8495795

19 files changed

+79
-76
lines changed

src/Elastic.Clients.Elasticsearch/_Generated/Api/BulkRequest.g.cs

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -124,35 +124,6 @@ public sealed partial class BulkRequestParameters : Elastic.Transport.RequestPar
124124
public Elastic.Clients.Elasticsearch.WaitForActiveShards? WaitForActiveShards { get => Q<Elastic.Clients.Elasticsearch.WaitForActiveShards?>("wait_for_active_shards"); set => Q("wait_for_active_shards", value); }
125125
}
126126

127-
internal sealed partial class BulkRequestConverter : System.Text.Json.Serialization.JsonConverter<Elastic.Clients.Elasticsearch.BulkRequest>
128-
{
129-
public override Elastic.Clients.Elasticsearch.BulkRequest Read(ref System.Text.Json.Utf8JsonReader reader, System.Type typeToConvert, System.Text.Json.JsonSerializerOptions options)
130-
{
131-
reader.ValidateToken(System.Text.Json.JsonTokenType.StartObject);
132-
while (reader.Read() && reader.TokenType is System.Text.Json.JsonTokenType.PropertyName)
133-
{
134-
if (options.UnmappedMemberHandling is System.Text.Json.Serialization.JsonUnmappedMemberHandling.Skip)
135-
{
136-
reader.Skip();
137-
continue;
138-
}
139-
140-
throw new System.Text.Json.JsonException($"Unknown JSON property '{reader.GetString()}' for type '{typeToConvert.Name}'.");
141-
}
142-
143-
reader.ValidateToken(System.Text.Json.JsonTokenType.EndObject);
144-
return new Elastic.Clients.Elasticsearch.BulkRequest(Elastic.Clients.Elasticsearch.Serialization.JsonConstructorSentinel.Instance)
145-
{
146-
};
147-
}
148-
149-
public override void Write(System.Text.Json.Utf8JsonWriter writer, Elastic.Clients.Elasticsearch.BulkRequest value, System.Text.Json.JsonSerializerOptions options)
150-
{
151-
writer.WriteStartObject();
152-
writer.WriteEndObject();
153-
}
154-
}
155-
156127
/// <summary>
157128
/// <para>
158129
/// Bulk index or delete documents.
@@ -352,7 +323,6 @@ public override void Write(System.Text.Json.Utf8JsonWriter writer, Elastic.Clien
352323
/// Refer to the linked documentation for step-by-step instructions using the index settings API.
353324
/// </para>
354325
/// </summary>
355-
[System.Text.Json.Serialization.JsonConverter(typeof(Elastic.Clients.Elasticsearch.BulkRequestConverter))]
356326
public partial class BulkRequest : Elastic.Clients.Elasticsearch.Requests.PlainRequest<Elastic.Clients.Elasticsearch.BulkRequestParameters>
357327
{
358328
public BulkRequest(Elastic.Clients.Elasticsearch.IndexName? index) : base(r => r.Optional("index", index))
@@ -1443,4 +1413,4 @@ public Elastic.Clients.Elasticsearch.BulkRequestDescriptor<TDocument> RequestCon
14431413
Instance.RequestConfiguration = configurationSelector.Invoke(Instance.RequestConfiguration is null ? new Elastic.Transport.RequestConfigurationDescriptor() : new Elastic.Transport.RequestConfigurationDescriptor(Instance.RequestConfiguration)) ?? Instance.RequestConfiguration;
14441414
return this;
14451415
}
1446-
}
1416+
}

src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -123,19 +123,6 @@ public sealed partial class MultiSearchRequestParameters : Elastic.Transport.Req
123123
public bool? TypedKeys { get => Q<bool?>("typed_keys"); set => Q("typed_keys", value); }
124124
}
125125

126-
internal sealed partial class MultiSearchRequestConverter : System.Text.Json.Serialization.JsonConverter<Elastic.Clients.Elasticsearch.MultiSearchRequest>
127-
{
128-
public override Elastic.Clients.Elasticsearch.MultiSearchRequest Read(ref System.Text.Json.Utf8JsonReader reader, System.Type typeToConvert, System.Text.Json.JsonSerializerOptions options)
129-
{
130-
return new Elastic.Clients.Elasticsearch.MultiSearchRequest(Elastic.Clients.Elasticsearch.Serialization.JsonConstructorSentinel.Instance) { Searches = reader.ReadValue<System.Collections.Generic.ICollection<Elastic.Clients.Elasticsearch.Core.MSearch.SearchRequestItem>>(options, static System.Collections.Generic.ICollection<Elastic.Clients.Elasticsearch.Core.MSearch.SearchRequestItem> (ref System.Text.Json.Utf8JsonReader r, System.Text.Json.JsonSerializerOptions o) => r.ReadCollectionValue<Elastic.Clients.Elasticsearch.Core.MSearch.SearchRequestItem>(o, null)!) };
131-
}
132-
133-
public override void Write(System.Text.Json.Utf8JsonWriter writer, Elastic.Clients.Elasticsearch.MultiSearchRequest value, System.Text.Json.JsonSerializerOptions options)
134-
{
135-
writer.WriteValue(options, value.Searches, static (System.Text.Json.Utf8JsonWriter w, System.Text.Json.JsonSerializerOptions o, System.Collections.Generic.ICollection<Elastic.Clients.Elasticsearch.Core.MSearch.SearchRequestItem> v) => w.WriteCollectionValue<Elastic.Clients.Elasticsearch.Core.MSearch.SearchRequestItem>(o, v, null));
136-
}
137-
}
138-
139126
/// <summary>
140127
/// <para>
141128
/// Run multiple searches.
@@ -159,7 +146,6 @@ public override void Write(System.Text.Json.Utf8JsonWriter writer, Elastic.Clien
159146
/// When sending requests to this endpoint the <c>Content-Type</c> header should be set to <c>application/x-ndjson</c>.
160147
/// </para>
161148
/// </summary>
162-
[System.Text.Json.Serialization.JsonConverter(typeof(Elastic.Clients.Elasticsearch.MultiSearchRequestConverter))]
163149
public partial class MultiSearchRequest : Elastic.Clients.Elasticsearch.Requests.PlainRequest<Elastic.Clients.Elasticsearch.MultiSearchRequestParameters>
164150
{
165151
[System.Obsolete("The request contains additional required properties that must be initialized. Please use an alternative constructor to ensure all required values are properly set.")]
@@ -876,4 +862,4 @@ public Elastic.Clients.Elasticsearch.MultiSearchRequestDescriptor<TDocument> Req
876862
Instance.RequestConfiguration = configurationSelector.Invoke(Instance.RequestConfiguration is null ? new Elastic.Transport.RequestConfigurationDescriptor() : new Elastic.Transport.RequestConfigurationDescriptor(Instance.RequestConfiguration)) ?? Instance.RequestConfiguration;
877863
return this;
878864
}
879-
}
865+
}

src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchTemplateRequest.g.cs

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -62,19 +62,6 @@ public sealed partial class MultiSearchTemplateRequestParameters : Elastic.Trans
6262
public bool? TypedKeys { get => Q<bool?>("typed_keys"); set => Q("typed_keys", value); }
6363
}
6464

65-
internal sealed partial class MultiSearchTemplateRequestConverter : System.Text.Json.Serialization.JsonConverter<Elastic.Clients.Elasticsearch.MultiSearchTemplateRequest>
66-
{
67-
public override Elastic.Clients.Elasticsearch.MultiSearchTemplateRequest Read(ref System.Text.Json.Utf8JsonReader reader, System.Type typeToConvert, System.Text.Json.JsonSerializerOptions options)
68-
{
69-
return new Elastic.Clients.Elasticsearch.MultiSearchTemplateRequest(Elastic.Clients.Elasticsearch.Serialization.JsonConstructorSentinel.Instance) { SearchTemplates = reader.ReadValue<System.Collections.Generic.ICollection<Elastic.Clients.Elasticsearch.Core.MSearchTemplate.SearchTemplateRequestItem>>(options, static System.Collections.Generic.ICollection<Elastic.Clients.Elasticsearch.Core.MSearchTemplate.SearchTemplateRequestItem> (ref System.Text.Json.Utf8JsonReader r, System.Text.Json.JsonSerializerOptions o) => r.ReadCollectionValue<Elastic.Clients.Elasticsearch.Core.MSearchTemplate.SearchTemplateRequestItem>(o, null)!) };
70-
}
71-
72-
public override void Write(System.Text.Json.Utf8JsonWriter writer, Elastic.Clients.Elasticsearch.MultiSearchTemplateRequest value, System.Text.Json.JsonSerializerOptions options)
73-
{
74-
writer.WriteValue(options, value.SearchTemplates, static (System.Text.Json.Utf8JsonWriter w, System.Text.Json.JsonSerializerOptions o, System.Collections.Generic.ICollection<Elastic.Clients.Elasticsearch.Core.MSearchTemplate.SearchTemplateRequestItem> v) => w.WriteCollectionValue<Elastic.Clients.Elasticsearch.Core.MSearchTemplate.SearchTemplateRequestItem>(o, v, null));
75-
}
76-
}
77-
7865
/// <summary>
7966
/// <para>
8067
/// Run multiple templated searches.
@@ -94,7 +81,6 @@ public override void Write(System.Text.Json.Utf8JsonWriter writer, Elastic.Clien
9481
/// $ curl -H "Content-Type: application/x-ndjson" -XGET localhost:9200/_msearch/template --data-binary "@requests"; echo
9582
/// </code>
9683
/// </summary>
97-
[System.Text.Json.Serialization.JsonConverter(typeof(Elastic.Clients.Elasticsearch.MultiSearchTemplateRequestConverter))]
9884
public partial class MultiSearchTemplateRequest : Elastic.Clients.Elasticsearch.Requests.PlainRequest<Elastic.Clients.Elasticsearch.MultiSearchTemplateRequestParameters>
9985
{
10086
[System.Obsolete("The request contains additional required properties that must be initialized. Please use an alternative constructor to ensure all required values are properly set.")]
@@ -540,4 +526,4 @@ public Elastic.Clients.Elasticsearch.MultiSearchTemplateRequestDescriptor<TDocum
540526
Instance.RequestConfiguration = configurationSelector.Invoke(Instance.RequestConfiguration is null ? new Elastic.Transport.RequestConfigurationDescriptor() : new Elastic.Transport.RequestConfigurationDescriptor(Instance.RequestConfiguration)) ?? Instance.RequestConfiguration;
541527
return this;
542528
}
543-
}
529+
}

src/Elastic.Clients.Elasticsearch/_Shared/Api/BulkRequest.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
using Elastic.Clients.Elasticsearch.Serialization;
1313
using Elastic.Clients.Elasticsearch.Requests;
1414
using System.Runtime.InteropServices;
15+
using System.Text.Json.Serialization;
1516

1617
namespace Elastic.Clients.Elasticsearch;
1718

19+
[JsonConverter(typeof(JsonIncompatibleConverter))]
1820
public partial class BulkRequest : IStreamSerializable
1921
{
2022
private static readonly IRequestConfiguration RequestConfigSingleton = new RequestConfiguration

src/Elastic.Clients.Elasticsearch/_Shared/Api/MultiSearchRequest.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ public partial class MultiSearchResponse<TDocument>
2020
public int TotalResponses => Responses.Count > 0 ? Responses.Count : 0;
2121
}
2222

23-
public partial class MultiSearchRequest : IStreamSerializable
23+
[JsonConverter(typeof(JsonIncompatibleConverter))]
24+
public partial class MultiSearchRequest :
25+
IStreamSerializable
2426
{
2527
// Any request may contain aggregations so we force `typed_keys` in order to successfully
2628
// deserialize them.

src/Elastic.Clients.Elasticsearch/_Shared/Api/MultiSearchTemplateRequest.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ public partial class MultiSearchTemplateResponse<TDocument>
2020
public int TotalResponses => Responses.Count > 0 ? Responses.Count : 0;
2121
}
2222

23-
public partial class MultiSearchTemplateRequest : IStreamSerializable
23+
[JsonConverter(typeof(JsonIncompatibleConverter))]
24+
public partial class MultiSearchTemplateRequest :
25+
IStreamSerializable
2426
{
2527
internal override void BeforeRequest() => TypedKeys ??= true;
2628

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Licensed to Elasticsearch B.V under one or more agreements.
2+
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using System;
6+
using System.Text.Json;
7+
using System.Text.Json.Serialization;
8+
9+
namespace Elastic.Clients.Elasticsearch.Serialization;
10+
11+
/// <summary>
12+
/// A <see cref="JsonConverterFactory"/> implementation that is used to indicate that a type is not compatible with
13+
/// standard JSON serialization.
14+
/// </summary>
15+
internal sealed class JsonIncompatibleConverter :
16+
JsonConverterFactory
17+
{
18+
public override bool CanConvert(Type typeToConvert)
19+
{
20+
return true;
21+
}
22+
23+
public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options)
24+
{
25+
throw new NotSupportedException($"Type '{typeToConvert.FullName}' is not compatible with standard JSON serialization.");
26+
}
27+
}

src/Elastic.Clients.Elasticsearch/_Shared/Serialization/DefaultRequestResponseSerializer.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public override T Deserialize<T>(Stream stream)
6363
{
6464
if (typeof(IStreamSerializable).IsAssignableFrom(typeof(T)))
6565
{
66+
throw new NotSupportedException("Deserialization of 'IStreamSerializable' types is currently not supported.");
6667
}
6768

6869
return base.Deserialize<T>(stream);
@@ -72,6 +73,7 @@ public override T Deserialize<T>(Stream stream)
7273
{
7374
if (typeof(IStreamSerializable).IsAssignableFrom(type))
7475
{
76+
throw new NotSupportedException("Deserialization of 'IStreamSerializable' types is currently not supported.");
7577
}
7678

7779
return base.Deserialize(type, stream);
@@ -81,6 +83,7 @@ public override ValueTask<T> DeserializeAsync<T>(Stream stream, CancellationToke
8183
{
8284
if (typeof(IStreamSerializable).IsAssignableFrom(typeof(T)))
8385
{
86+
throw new NotSupportedException("Deserialization of 'IStreamSerializable' types is currently not supported.");
8487
}
8588

8689
return base.DeserializeAsync<T>(stream, cancellationToken);
@@ -90,6 +93,7 @@ public override ValueTask<T> DeserializeAsync<T>(Stream stream, CancellationToke
9093
{
9194
if (typeof(IStreamSerializable).IsAssignableFrom(type))
9295
{
96+
throw new NotSupportedException("Deserialization of 'IStreamSerializable' types is currently not supported.");
9397
}
9498

9599
return base.DeserializeAsync(type, stream, cancellationToken);

src/Elastic.Clients.Elasticsearch/_Shared/Types/Core/Bulk/BulkCreateOperation.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ namespace Elastic.Clients.Elasticsearch.Core.Bulk;
1717
/// Represents a bulk operation to create a document.
1818
/// </summary>
1919
/// <typeparam name="T">The type representing the document being created.</typeparam>
20+
[JsonConverter(typeof(JsonIncompatibleConverter))]
2021
public sealed class BulkCreateOperation<T> : BulkOperation
2122
{
2223
private static readonly System.Text.Json.JsonEncodedText PropDynamicTemplates = System.Text.Json.JsonEncodedText.Encode("dynamic_templates");

src/Elastic.Clients.Elasticsearch/_Shared/Types/Core/Bulk/BulkDeleteOperation.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
namespace Elastic.Clients.Elasticsearch.Core.Bulk;
1414

15+
[JsonConverter(typeof(JsonIncompatibleConverter))]
1516
public class BulkDeleteOperation :
1617
BulkOperation
1718
{

0 commit comments

Comments
 (0)