Skip to content

Commit f178614

Browse files
SNOW-1640968 dispose disposable objects (#1014)
1 parent 8a22adb commit f178614

File tree

13 files changed

+267
-161
lines changed

13 files changed

+267
-161
lines changed

Snowflake.Data.Tests/UnitTests/ConcatenatedStreamTest.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
* Copyright (c) 2023 Snowflake Computing Inc. All rights reserved.
33
*/
44

5+
using Snowflake.Data.Tests.Util;
6+
using NUnit.Framework;
7+
using System;
8+
using System.IO;
9+
using System.Text;
10+
511
namespace Snowflake.Data.Tests.UnitTests
612
{
7-
using NUnit.Framework;
8-
using Snowflake.Data.Core;
9-
using System;
10-
using System.IO;
11-
using System.Text;
1213

1314
[TestFixture]
1415
class ConcatenatedStreamTest

Snowflake.Data.Tests/UnitTests/SFRemoteStorageClientTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -527,14 +527,14 @@ private void SetUpMockEncryptedFileForDownload()
527527

528528
// Get encrypted stream from file
529529
SFEncryptionMetadata encryptionMetadata = new SFEncryptionMetadata();
530-
Stream stream = EncryptionProvider.EncryptFile(
530+
StreamPair streamPair = EncryptionProvider.EncryptFile(
531531
t_downloadFileName,
532532
_fileMetadata.encryptionMaterial,
533533
encryptionMetadata,
534534
FileTransferConfiguration.FromFileMetadata(_fileMetadata));
535535

536536
// Set up the stream and metadata for decryption
537-
MockRemoteStorageClient.SetEncryptionData(stream, encryptionMetadata.iv, encryptionMetadata.key);
537+
MockRemoteStorageClient.SetEncryptionData(streamPair.MainStream, encryptionMetadata.iv, encryptionMetadata.key);
538538
}
539539

540540
[Test]
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using System.IO;
2+
using NUnit.Framework;
3+
using Moq;
4+
using Snowflake.Data.Core.FileTransfer;
5+
6+
namespace Snowflake.Data.Tests.UnitTests
7+
{
8+
[TestFixture]
9+
public class StreamPairTest
10+
{
11+
[Test]
12+
public void TestCloseBothStreams()
13+
{
14+
// arrange
15+
var mockedMainStream = new Mock<Stream>();
16+
var mockedHelperStream = new Mock<Stream>();
17+
18+
// act
19+
using (new StreamPair { MainStream = mockedMainStream.Object, HelperStream = mockedHelperStream.Object }) {}
20+
21+
// assert
22+
mockedMainStream.Verify(stream => stream.Close());
23+
mockedHelperStream.Verify(stream => stream.Close());
24+
}
25+
26+
[Test]
27+
public void TestCloseMainStreamOnlyWhenHelperStreamNotGiven()
28+
{
29+
// arrange
30+
var mockedMainStream = new Mock<Stream>();
31+
32+
// act
33+
using (new StreamPair { MainStream = mockedMainStream.Object }) {}
34+
35+
// assert
36+
mockedMainStream.Verify(stream => stream.Close());
37+
}
38+
}
39+
}

Snowflake.Data/Core/ConcatenatedStream.cs renamed to Snowflake.Data.Tests/Util/ConcatenatedStream.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
/*
2-
* Copyright (c) 2012-2019 Snowflake Computing Inc. All rights reserved.
2+
* Copyright (c) 2012-2024 Snowflake Computing Inc. All rights reserved.
33
*/
44

55
using System;
66
using System.Collections.Generic;
77
using System.IO;
88

9-
namespace Snowflake.Data.Core
9+
namespace Snowflake.Data.Tests.Util
1010
{
1111
/// <summary>
1212
/// Used to concat multiple streams without copying. Since we need to preappend '[' and append ']'

Snowflake.Data/Core/Authenticator/KeyPairAuthenticator.cs

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -100,36 +100,29 @@ private string GenerateJwtToken()
100100
{
101101
try
102102
{
103-
PemReader pr = null;
104-
if (null != pkPwd)
103+
using (PemReader pr = CreatePemReader(tr, pkPwd))
105104
{
106-
IPasswordFinder ipwdf = new PasswordFinder(pkPwd);
107-
pr = new PemReader(tr, ipwdf);
108-
}
109-
else
110-
{
111-
pr = new PemReader(tr);
112-
}
113-
114-
object key = pr.ReadObject();
115-
// Infer what the pem reader is sending back based on the object properties
116-
if (key.GetType().GetProperty("Private") != null)
117-
{
118-
// PKCS1 key
119-
keypair = (AsymmetricCipherKeyPair)key;
120-
rsaParams = DotNetUtilities.ToRSAParameters(
121-
keypair.Private as RsaPrivateCrtKeyParameters);
122-
}
123-
else
124-
{
125-
// PKCS8 key
126-
RsaPrivateCrtKeyParameters pk = (RsaPrivateCrtKeyParameters)key;
127-
rsaParams = DotNetUtilities.ToRSAParameters(pk);
128-
keypair = DotNetUtilities.GetRsaKeyPair(rsaParams);
129-
}
130-
if (keypair == null)
131-
{
132-
throw new Exception("Unknown error.");
105+
object key = pr.ReadObject();
106+
// Infer what the pem reader is sending back based on the object properties
107+
if (key.GetType().GetProperty("Private") != null)
108+
{
109+
// PKCS1 key
110+
keypair = (AsymmetricCipherKeyPair)key;
111+
rsaParams = DotNetUtilities.ToRSAParameters(
112+
keypair.Private as RsaPrivateCrtKeyParameters);
113+
}
114+
else
115+
{
116+
// PKCS8 key
117+
RsaPrivateCrtKeyParameters pk = (RsaPrivateCrtKeyParameters)key;
118+
rsaParams = DotNetUtilities.ToRSAParameters(pk);
119+
keypair = DotNetUtilities.GetRsaKeyPair(rsaParams);
120+
}
121+
122+
if (keypair == null)
123+
{
124+
throw new Exception("Unknown error.");
125+
}
133126
}
134127
}
135128
catch (Exception e)
@@ -207,6 +200,19 @@ private string GenerateJwtToken()
207200
return jwtToken;
208201
}
209202

203+
private PemReader CreatePemReader(TextReader textReader, string privateKeyPassword)
204+
{
205+
if (null != privateKeyPassword)
206+
{
207+
IPasswordFinder ipwdf = new PasswordFinder(privateKeyPassword);
208+
return new PemReader(textReader, ipwdf);
209+
}
210+
else
211+
{
212+
return new PemReader(textReader);
213+
}
214+
}
215+
210216
/// <summary>
211217
/// Helper class to handle the password for the certificate if there is one.
212218
/// </summary>

0 commit comments

Comments
 (0)