Skip to content

Commit 9cf7f01

Browse files
westey-mrojiCopilot
authored
.Net: VectorData connector bugfix release (#13928)
### Motivation and Context We need to release only a subset of connectors so creating a fork with only the fixes required. ### Description - Version update - Package release restriction - Fixes to release ### Contribution Checklist <!-- Before submitting this PR, please make sure: --> - [ ] The code builds clean without any errors or warnings - [ ] The PR follows the [SK Contribution Guidelines](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md) and the [pre-submission formatting script](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md#development-scripts) raises no violations - [ ] All unit tests pass, and I have added new tests where possible - [ ] I didn't break anyone 😄 --------- Co-authored-by: Shay Rojansky <roji@roji.org> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 14ea2fc commit 9cf7f01

9 files changed

Lines changed: 169 additions & 94 deletions

File tree

dotnet/Directory.Packages.props

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
<PackageVersion Include="Azure.AI.ContentSafety" Version="1.0.0" />
2525
<PackageVersion Include="Azure.AI.OpenAI" Version="2.9.0-beta.1" />
2626
<PackageVersion Include="Azure.AI.Projects" Version="2.0.0-beta.2" />
27-
<PackageVersion Include="Azure.Identity" Version="1.19.0" />
28-
<PackageVersion Include="Azure.Monitor.OpenTelemetry.Exporter" Version="1.5.0" />
27+
<PackageVersion Include="Azure.Identity" Version="1.21.0" />
28+
<PackageVersion Include="Azure.Monitor.OpenTelemetry.Exporter" Version="1.7.0" />
2929
<PackageVersion Include="Azure.Search.Documents" Version="11.7.0" />
3030
<PackageVersion Include="Community.OData.Linq" Version="2.1.0" />
3131
<PackageVersion Include="Dapr.Actors" Version="1.16.1" />
@@ -65,7 +65,7 @@
6565
<PackageVersion Include="Microsoft.Azure.Kusto.Data" Version="12.2.8" />
6666
<PackageVersion Include="Microsoft.Azure.WebJobs.Extensions.OpenApi" Version="1.5.1" />
6767
<PackageVersion Include="Microsoft.Azure.WebJobs.Extensions.Storage" Version="5.3.2" />
68-
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="10.0.4" />
68+
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="10.0.6" />
6969
<PackageVersion Include="Microsoft.Bcl.HashCode" Version="1.1.1" />
7070
<PackageVersion Include="Microsoft.Bcl.Memory" Version="10.0.4" />
7171
<PackageVersion Include="Microsoft.Bcl.Numerics" Version="10.0.2" />
@@ -92,38 +92,41 @@
9292
<PackageVersion Include="Npgsql" Version="8.0.7" />
9393
<PackageVersion Include="OData2Linq" Version="2.2.0" />
9494
<PackageVersion Include="OllamaSharp" Version="5.4.12" />
95-
<PackageVersion Include="OpenAI" Version="2.9.1" />
96-
<PackageVersion Include="OpenTelemetry.Exporter.Console" Version="1.14.0" />
97-
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.14.0" />
98-
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.14.0" />
99-
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.14.0" />
100-
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.14.0" />
101-
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.14.0" />
95+
<PackageVersion Include="OpenAI" Version="2.10.0" />
96+
<PackageVersion Include="OpenTelemetry" Version="1.15.3" />
97+
<PackageVersion Include="OpenTelemetry.Api" Version="1.15.3" />
98+
<PackageVersion Include="OpenTelemetry.Api.ProviderBuilderExtensions" Version="1.15.3" />
99+
<PackageVersion Include="OpenTelemetry.Exporter.Console" Version="1.15.3" />
100+
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.15.3" />
101+
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.15.3" />
102+
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.15.2" />
103+
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.15.1" />
104+
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.15.1" />
102105
<PackageVersion Include="PdfPig" Version="0.1.13" />
103106
<PackageVersion Include="Pinecone.Client" Version="3.1.0" />
104107
<PackageVersion Include="Prompty.Core" Version="0.2.3-beta" />
105-
<PackageVersion Include="Scriban" Version="6.6.0" />
108+
<PackageVersion Include="Scriban" Version="7.1.0" />
106109
<PackageVersion Include="PuppeteerSharp" Version="20.2.5" />
107110
<PackageVersion Include="System.Diagnostics.DiagnosticSource" Version="10.0.2" />
108111
<PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="8.15.0" />
109112
<PackageVersion Include="System.IO.Packaging" Version="10.0.2" />
110113
<PackageVersion Include="System.Linq.AsyncEnumerable" Version="10.0.4" />
111114
<PackageVersion Include="System.Memory.Data" Version="10.0.2" />
112115
<PackageVersion Include="System.Net.Http" Version="4.3.4" />
113-
<PackageVersion Include="System.Numerics.Tensors" Version="10.0.4" />
114-
<PackageVersion Include="System.Text.Json" Version="10.0.4" />
115-
<PackageVersion Include="System.ValueTuple" Version="4.6.1" />
116+
<PackageVersion Include="System.Numerics.Tensors" Version="10.0.6" />
117+
<PackageVersion Include="System.Text.Json" Version="10.0.6" />
118+
<PackageVersion Include="System.ValueTuple" Version="4.6.2" />
116119
<PackageVersion Include="System.Threading.Tasks.Extensions" Version="4.6.3" />
117120
<PackageVersion Include="A2A" Version="0.3.1-preview" />
118121
<PackageVersion Include="A2A.AspNetCore" Version="0.3.1-preview" />
119122
<PackageVersion Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
120123
<!-- Tokenizers -->
121124
<PackageVersion Include="Microsoft.ML.Tokenizers" Version="2.0.0" />
122125
<!-- Microsoft.Extensions.* -->
123-
<PackageVersion Include="Microsoft.Extensions.AI" Version="10.4.0" />
124-
<PackageVersion Include="Microsoft.Extensions.AI.Abstractions" Version="10.4.0" />
126+
<PackageVersion Include="Microsoft.Extensions.AI" Version="10.5.0" />
127+
<PackageVersion Include="Microsoft.Extensions.AI.Abstractions" Version="10.5.0" />
125128
<PackageVersion Include="Microsoft.Extensions.AI.AzureAIInference" Version="10.0.0-preview.1.25559.3" />
126-
<PackageVersion Include="Microsoft.Extensions.AI.OpenAI" Version="10.4.0" />
129+
<PackageVersion Include="Microsoft.Extensions.AI.OpenAI" Version="10.5.0" />
127130
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="10.0.2" />
128131
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.2" />
129132
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.2" />
@@ -139,7 +142,7 @@
139142
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="10.2.0" />
140143
<PackageVersion Include="Microsoft.Extensions.ServiceDiscovery" Version="10.2.0" />
141144
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.2" />
142-
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.4" />
145+
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.6" />
143146
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="10.0.2" />
144147
<PackageVersion Include="Microsoft.Extensions.Logging.Debug" Version="10.0.2" />
145148
<PackageVersion Include="Microsoft.Extensions.Options.DataAnnotations" Version="10.0.2" />
@@ -152,7 +155,7 @@
152155
<PackageVersion Include="Moq" Version="[4.18.4]" />
153156
<PackageVersion Include="FluentAssertions" Version="8.2.0" />
154157
<PackageVersion Include="System.Text.RegularExpressions" Version="4.3.1" />
155-
<PackageVersion Include="System.Threading.Channels" Version="10.0.4" />
158+
<PackageVersion Include="System.Threading.Channels" Version="10.0.6" />
156159
<PackageVersion Include="System.Threading.Tasks.Dataflow" Version="10.0.2" />
157160
<PackageVersion Include="xunit" Version="2.9.3" />
158161
<PackageVersion Include="xunit.abstractions" Version="2.0.3" />

dotnet/SK-release.slnf

Lines changed: 0 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -3,74 +3,8 @@
33
"path": "SK-dotnet.slnx",
44
"projects":
55
[
6-
"src\\SemanticKernel.Abstractions\\SemanticKernel.Abstractions.csproj",
7-
"src\\SemanticKernel.Core\\SemanticKernel.Core.csproj",
8-
"src\\SemanticKernel.MetaPackage\\SemanticKernel.MetaPackage.csproj",
9-
10-
"src\\Agents\\A2A\\Agents.A2A.csproj",
11-
"src\\Agents\\Abstractions\\Agents.Abstractions.csproj",
12-
"src\\Agents\\AzureAI\\Agents.AzureAI.csproj",
13-
"src\\Agents\\Bedrock\\Agents.Bedrock.csproj",
14-
"src\\Agents\\Copilot\\Agents.CopilotStudio.csproj",
15-
"src\\Agents\\Core\\Agents.Core.csproj",
16-
"src\\Agents\\Magentic\\Agents.Magentic.csproj",
17-
"src\\Agents\\OpenAI\\Agents.OpenAI.csproj",
18-
"src\\Agents\\Orchestration\\Agents.Orchestration.csproj",
19-
"src\\Agents\\Yaml\\Agents.Yaml.csproj",
20-
21-
"src\\Agents\\Runtime\\Abstractions\\Runtime.Abstractions.csproj",
22-
"src\\Agents\\Runtime\\Core\\Runtime.Core.csproj",
23-
"src\\Agents\\Runtime\\InProcess\\Runtime.InProcess.csproj",
24-
25-
"src\\Connectors\\Connectors.Amazon\\Connectors.Amazon.csproj",
26-
"src\\Connectors\\Connectors.AzureAIInference\\Connectors.AzureAIInference.csproj",
27-
"src\\Connectors\\Connectors.AzureOpenAI\\Connectors.AzureOpenAI.csproj",
28-
"src\\Connectors\\Connectors.Google\\Connectors.Google.csproj",
29-
"src\\Connectors\\Connectors.HuggingFace\\Connectors.HuggingFace.csproj",
30-
"src\\Connectors\\Connectors.MistralAI\\Connectors.MistralAI.csproj",
31-
"src\\Connectors\\Connectors.Ollama\\Connectors.Ollama.csproj",
32-
"src\\Connectors\\Connectors.Onnx\\Connectors.Onnx.csproj",
33-
"src\\Connectors\\Connectors.OpenAI\\Connectors.OpenAI.csproj",
34-
35-
"src\\VectorData\\AzureAISearch\\AzureAISearch.csproj",
36-
"src\\VectorData\\Chroma\\Chroma.csproj",
37-
"src\\VectorData\\CosmosMongoDB\\CosmosMongoDB.csproj",
38-
"src\\VectorData\\CosmosNoSql\\CosmosNoSql.csproj",
39-
"src\\VectorData\\InMemory\\InMemory.csproj",
40-
"src\\VectorData\\Milvus\\Milvus.csproj",
41-
"src\\VectorData\\MongoDB\\MongoDB.csproj",
42-
"src\\VectorData\\PgVector\\PgVector.csproj",
43-
"src\\VectorData\\Pinecone\\Pinecone.csproj",
44-
"src\\VectorData\\Qdrant\\Qdrant.csproj",
456
"src\\VectorData\\Redis\\Redis.csproj",
46-
"src\\VectorData\\SqliteVec\\SqliteVec.csproj",
477
"src\\VectorData\\SqlServer\\SqlServer.csproj",
48-
"src\\VectorData\\VectorData.Abstractions\\VectorData.Abstractions.csproj",
49-
"src\\VectorData\\Weaviate\\Weaviate.csproj",
50-
51-
"src\\Experimental\\Orchestration.Flow\\Experimental.Orchestration.Flow.csproj",
52-
53-
"src\\Experimental\\Process.Abstractions\\Process.Abstractions.csproj",
54-
"src\\Experimental\\Process.Core\\Process.Core.csproj",
55-
"src\\Experimental\\Process.LocalRuntime\\Process.LocalRuntime.csproj",
56-
"src\\Experimental\\Process.Runtime.Dapr\\Process.Runtime.Dapr.csproj",
57-
58-
"src\\Functions\\Functions.Grpc\\Functions.Grpc.csproj",
59-
"src\\Functions\\Functions.OpenApi.Extensions\\Functions.OpenApi.Extensions.csproj",
60-
"src\\Functions\\Functions.OpenApi\\Functions.OpenApi.csproj",
61-
"src\\Functions\\Functions.Prompty\\Functions.Prompty.csproj",
62-
"src\\Functions\\Functions.Yaml\\Functions.Yaml.csproj",
63-
64-
"src\\Extensions\\PromptTemplates.Handlebars\\PromptTemplates.Handlebars.csproj",
65-
"src\\Extensions\\PromptTemplates.Liquid\\PromptTemplates.Liquid.csproj",
66-
67-
"src\\Plugins\\Plugins.AI\\Plugins.AI.csproj",
68-
"src\\Plugins\\Plugins.Core\\Plugins.Core.csproj",
69-
"src\\Plugins\\Plugins.Document\\Plugins.Document.csproj",
70-
"src\\Plugins\\Plugins.Memory\\Plugins.Memory.csproj",
71-
"src\\Plugins\\Plugins.MsGraph\\Plugins.MsGraph.csproj",
72-
"src\\Plugins\\Plugins.StructuredData.EntityFramework\\Plugins.StructuredData.EntityFramework.csproj",
73-
"src\\Plugins\\Plugins.Web\\Plugins.Web.csproj"
748
]
759
}
7610
}

dotnet/nuget/nuget-package.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project>
22
<PropertyGroup>
33
<!-- Central version prefix - applies to all nuget packages. -->
4-
<VersionPrefix>1.74.0</VersionPrefix>
4+
<VersionPrefix>1.74.1</VersionPrefix>
55
<PackageVersion Condition="'$(VersionSuffix)' != ''">$(VersionPrefix)-$(VersionSuffix)</PackageVersion>
66
<PackageVersion Condition="'$(VersionSuffix)' == ''">$(VersionPrefix)</PackageVersion>
77

dotnet/samples/Demos/TelemetryWithAppInsights/TelemetryWithAppInsights.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313

1414
<ItemGroup>
1515
<PackageReference Include="Azure.Identity" />
16+
<PackageReference Include="OpenTelemetry" />
17+
<PackageReference Include="OpenTelemetry.Api" />
18+
<PackageReference Include="OpenTelemetry.Api.ProviderBuilderExtensions" />
19+
<PackageReference Include="OpenTelemetry.Extensions.Hosting" />
1620
<PackageReference Include="Azure.Monitor.OpenTelemetry.Exporter" />
1721
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" />
1822
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" />

dotnet/src/SemanticKernel.Core/Functions/KernelFunctionFromMethod.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -720,7 +720,7 @@ private static (Func<KernelFunction, Kernel, KernelArguments, CancellationToken,
720720
return value;
721721
}
722722

723-
if (converter is not null && value is not JsonElement or JsonDocument or JsonNode)
723+
if (converter is not null && value is not JsonElement)
724724
{
725725
try
726726
{

dotnet/src/VectorData/Redis/RedisFilterTranslator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,8 +258,8 @@ private void TranslateAny(Expression source, LambdaExpression lambda)
258258

259259
private static string SanitizeStringConstant(string value)
260260
#if NET
261-
=> value.Replace("\"", "\\\"", StringComparison.Ordinal);
261+
=> value.Replace("\\", "\\\\", StringComparison.Ordinal).Replace("\"", "\\\"", StringComparison.Ordinal);
262262
#else
263-
=> value.Replace("\"", "\\\"");
263+
=> value.Replace("\\", "\\\\").Replace("\"", "\\\"");
264264
#endif
265265
}

dotnet/src/VectorData/SqlServer/SqlServerCommandBuilder.cs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ internal static List<SqlCommand> CreateTable(
3131
if (ifNotExists)
3232
{
3333
sb.Append("IF OBJECT_ID(N'");
34-
sb.AppendTableName(schema, tableName);
34+
sb.AppendTableNameInsideLiteral(schema, tableName);
3535
sb.AppendLine("', N'U') IS NULL");
3636
}
3737
sb.AppendLine("BEGIN");
@@ -125,22 +125,22 @@ internal static List<SqlCommand> CreateTable(
125125
// Full-text indexes require a unique index (we use the primary key)
126126
sb.AppendLine("DECLARE @pkIndexName NVARCHAR(128);");
127127
sb.Append("SELECT @pkIndexName = name FROM sys.indexes WHERE object_id = OBJECT_ID(N'");
128-
sb.AppendTableName(schema, tableName);
128+
sb.AppendTableNameInsideLiteral(schema, tableName);
129129
sb.AppendLine("') AND is_primary_key = 1;");
130130

131131
sb.AppendLine("DECLARE @ftSql NVARCHAR(MAX);");
132132
sb.Append("SET @ftSql = N'CREATE FULLTEXT INDEX ON ");
133-
sb.AppendTableName(schema, tableName).Append(" (");
133+
sb.AppendTableNameInsideLiteral(schema, tableName).Append(" (");
134134
for (int i = 0; i < fullTextProperties.Count; i++)
135135
{
136-
sb.AppendIdentifier(fullTextProperties[i].StorageName);
136+
sb.AppendIdentifierInsideLiteral(fullTextProperties[i].StorageName);
137137
if (i < fullTextProperties.Count - 1)
138138
{
139139
sb.Append(',');
140140
}
141141
}
142142
sb.Append(") KEY INDEX ' + QUOTENAME(@pkIndexName) + N' ON ");
143-
sb.AppendIdentifier(catalogName).AppendLine("';");
143+
sb.AppendIdentifierInsideLiteral(catalogName).AppendLine("';");
144144
sb.AppendLine("EXEC sp_executesql @ftSql;");
145145
}
146146

@@ -864,6 +864,30 @@ internal static StringBuilder AppendIdentifier(this StringBuilder sb, string ide
864864
return sb;
865865
}
866866

867+
/// <summary>
868+
/// Same as <see cref="AppendTableName"/>, but for use inside a SQL string literal (N'...'),
869+
/// where single quotes must be escaped by doubling them.
870+
/// </summary>
871+
internal static StringBuilder AppendTableNameInsideLiteral(this StringBuilder sb, string? schema, string tableName)
872+
{
873+
int start = sb.Length;
874+
sb.AppendTableName(schema, tableName);
875+
sb.Replace("'", "''", start, sb.Length - start);
876+
return sb;
877+
}
878+
879+
/// <summary>
880+
/// Same as <see cref="AppendIdentifier"/>, but for use inside a SQL string literal (N'...'),
881+
/// where single quotes must be escaped by doubling them.
882+
/// </summary>
883+
internal static StringBuilder AppendIdentifierInsideLiteral(this StringBuilder sb, string identifier)
884+
{
885+
int start = sb.Length;
886+
sb.AppendIdentifier(identifier);
887+
sb.Replace("'", "''", start, sb.Length - start);
888+
return sb;
889+
}
890+
867891
private static StringBuilder AppendIdentifiers(this StringBuilder sb,
868892
IEnumerable<PropertyModel> properties,
869893
string? prefix = null,

dotnet/test/VectorData/Redis.UnitTests/RedisFilterTranslatorTests.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,58 @@ public void Equal_with_double_quote_in_value()
108108
Assert.Equal("""@Name:{"foo\"bar"}""", result);
109109
}
110110

111+
[Fact]
112+
public void Equal_with_backslash_in_value()
113+
{
114+
var result = Translate<TestRecord>(r => r.Name == "foo\\bar");
115+
Assert.Equal("""@Name:{"foo\\bar"}""", result);
116+
}
117+
118+
[Fact]
119+
public void Equal_with_single_backslash()
120+
{
121+
var result = Translate<TestRecord>(r => r.Name == "\\");
122+
Assert.Equal("""@Name:{"\\"}""", result);
123+
}
124+
125+
[Fact]
126+
public void Equal_with_backslash_quote_injection_attempt()
127+
{
128+
// Input: \" which should NOT break out of the quoted string
129+
var result = Translate<TestRecord>(r => r.Name == "\\\"");
130+
Assert.Equal("""@Name:{"\\\""}""", result);
131+
}
132+
133+
[Fact]
134+
public void Equal_with_backslash_quote_wildcard_injection()
135+
{
136+
// The specific attack payload: \" | * | \"
137+
var result = Translate<TestRecord>(r => r.Name == "\\\" | * | \\\"");
138+
Assert.Equal("""@Name:{"\\\" | * | \\\""}""", result);
139+
}
140+
141+
[Fact]
142+
public void Contains_with_backslash_in_value()
143+
{
144+
var result = Translate<TestRecord>(r => r.Tags.Contains("foo\\bar"));
145+
Assert.Equal("""@Tags:{"foo\\bar"}""", result);
146+
}
147+
148+
[Fact]
149+
public void Contains_with_backslash_quote_injection_attempt()
150+
{
151+
var result = Translate<TestRecord>(r => r.Tags.Contains("\\\""));
152+
Assert.Equal("""@Tags:{"\\\""}""", result);
153+
}
154+
155+
[Fact]
156+
public void Any_with_backslash_in_values()
157+
{
158+
var values = new[] { "a\\b", "c\\d" };
159+
var result = Translate<TestRecord>(r => r.Tags.Any(t => values.Contains(t)));
160+
Assert.Equal("""@Tags:{"a\\b" | "c\\d"}""", result);
161+
}
162+
111163
private static string Translate<TRecord>(Expression<Func<TRecord, bool>> filter)
112164
{
113165
var model = BuildModel();

0 commit comments

Comments
 (0)