Skip to content

Commit 01c0470

Browse files
Replaced BouncyCastle lib with System.Security.Cryptography.Algorithms (#121)
* Removed Portable.BouncyCastle & code refactored for native .net library * try catch for publish
1 parent 475725c commit 01c0470

File tree

17 files changed

+167
-213
lines changed

17 files changed

+167
-213
lines changed

.pubnub.yml

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
name: c-sharp
2-
version: "5.3.0"
2+
version: "5.4.0"
33
schema: 1
44
scm: github.com/pubnub/c-sharp
55
changelog:
6+
- date: 2021-12-16
7+
version: v5.4.0
8+
changes:
9+
- type: bug
10+
text: "Replaced BouncyCastle lib with System.Security.Cryptography.Algorithms."
11+
- type: bug
12+
text: "Added try/catch for publish operation to catch exceptions."
613
- date: 2021-11-16
714
version: v5.3.0
815
changes:
@@ -614,7 +621,7 @@ features:
614621
- QUERY-PARAM
615622
supported-platforms:
616623
-
617-
version: Pubnub 'C#' 5.3.0
624+
version: Pubnub 'C#' 5.4.0
618625
platforms:
619626
- Windows 10 and up
620627
- Windows Server 2008 and up
@@ -624,7 +631,7 @@ supported-platforms:
624631
- .Net Framework 4.5
625632
- .Net Framework 4.6.1+
626633
-
627-
version: PubnubPCL 'C#' 5.3.0
634+
version: PubnubPCL 'C#' 5.4.0
628635
platforms:
629636
- Xamarin.Android
630637
- Xamarin.iOS
@@ -643,7 +650,7 @@ supported-platforms:
643650
- .Net Standard 2.1
644651
- .Net Core
645652
-
646-
version: PubnubUWP 'C#' 5.3.0
653+
version: PubnubUWP 'C#' 5.4.0
647654
platforms:
648655
- Windows Phone 10
649656
- Universal Windows Apps
@@ -667,7 +674,7 @@ sdks:
667674
distribution-type: source
668675
distribution-repository: Github
669676
package-name: Pubnub
670-
location: https://github.com/pubnub/c-sharp/releases/tag/v5.3.0.0
677+
location: https://github.com/pubnub/c-sharp/releases/tag/v5.4.0.0
671678
requires:
672679
-
673680
name: ".Net"
@@ -964,7 +971,7 @@ sdks:
964971
distribution-type: source
965972
distribution-repository: GitHub
966973
package-name: PubNubPCL
967-
location: https://github.com/pubnub/c-sharp/releases/tag/v5.3.0.0
974+
location: https://github.com/pubnub/c-sharp/releases/tag/v5.4.0.0
968975
requires:
969976
-
970977
name: ".Net Core"
@@ -1337,7 +1344,7 @@ sdks:
13371344
distribution-type: source
13381345
distribution-repository: Github
13391346
package-name: PubnubUWP
1340-
location: https://github.com/pubnub/c-sharp/releases/tag/v5.3.0.0
1347+
location: https://github.com/pubnub/c-sharp/releases/tag/v5.4.0.0
13411348
requires:
13421349
-
13431350
name: "Universal Windows Platform Development"

CHANGELOG

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
v5.4.0 - December 16 2021
2+
-----------------------------
3+
- Fixed: replaced BouncyCastle lib with System.Security.Cryptography.Algorithms.
4+
- Fixed: added try/catch for publish operation to catch exceptions.
5+
16
v5.3.0 - November 16 2021
27
-----------------------------
38
- Added: added RevokeToken feature.

src/Api/PubnubApi/EndPoint/PubSub/PublishOperation.cs

Lines changed: 105 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -205,67 +205,81 @@ internal void Publish(string channel, object message, bool storeInHistory, int t
205205
return;
206206
}
207207

208-
string requestMethodName = (this.httpPost) ? "POST" : "GET";
209-
IUrlRequestBuilder urlBuilder = new UrlRequestBuilder(config, jsonLibrary, unit, pubnubLog, pubnubTelemetryMgr, (PubnubInstance != null && !string.IsNullOrEmpty(PubnubInstance.InstanceId) && PubnubTokenMgrCollection.ContainsKey(PubnubInstance.InstanceId)) ? PubnubTokenMgrCollection[PubnubInstance.InstanceId] : null, (PubnubInstance != null) ? PubnubInstance.InstanceId : "");
210-
211-
Uri request = urlBuilder.BuildPublishRequest(requestMethodName, "", channel, message, storeInHistory, ttl, metaData, null, externalQueryParam);
212-
213208
RequestState<PNPublishResult> requestState = new RequestState<PNPublishResult>();
214-
requestState.Channels = new [] { channel };
215-
requestState.ResponseType = PNOperationType.PNPublishOperation;
216-
requestState.PubnubCallback = callback;
217-
requestState.Reconnect = false;
218-
requestState.EndPointOperation = this;
209+
try
210+
{
211+
string requestMethodName = (this.httpPost) ? "POST" : "GET";
212+
IUrlRequestBuilder urlBuilder = new UrlRequestBuilder(config, jsonLibrary, unit, pubnubLog, pubnubTelemetryMgr, (PubnubInstance != null && !string.IsNullOrEmpty(PubnubInstance.InstanceId) && PubnubTokenMgrCollection.ContainsKey(PubnubInstance.InstanceId)) ? PubnubTokenMgrCollection[PubnubInstance.InstanceId] : null, (PubnubInstance != null) ? PubnubInstance.InstanceId : "");
219213

220-
string json = "";
214+
Uri request = urlBuilder.BuildPublishRequest(requestMethodName, "", channel, message, storeInHistory, ttl, metaData, null, externalQueryParam);
221215

222-
if (this.httpPost)
223-
{
224-
requestState.UsePostMethod = true;
225-
string postMessage = JsonEncodePublishMsg(message);
226-
byte[] postData = Encoding.UTF8.GetBytes(postMessage);
227-
UrlProcessRequest<PNPublishResult>(request, requestState, false, postData).ContinueWith(r =>
216+
requestState.Channels = new[] { channel };
217+
requestState.ResponseType = PNOperationType.PNPublishOperation;
218+
requestState.PubnubCallback = callback;
219+
requestState.Reconnect = false;
220+
requestState.EndPointOperation = this;
221+
222+
string json = "";
223+
224+
if (this.httpPost)
228225
{
229-
json = r.Result.Item1;
230-
}, TaskContinuationOptions.ExecuteSynchronously).Wait();
231-
}
232-
else
233-
{
234-
UrlProcessRequest<PNPublishResult>(request, requestState, false).ContinueWith(r =>
226+
requestState.UsePostMethod = true;
227+
string postMessage = JsonEncodePublishMsg(message);
228+
byte[] postData = Encoding.UTF8.GetBytes(postMessage);
229+
UrlProcessRequest<PNPublishResult>(request, requestState, false, postData).ContinueWith(r =>
230+
{
231+
json = r.Result.Item1;
232+
}, TaskContinuationOptions.ExecuteSynchronously).Wait();
233+
}
234+
else
235235
{
236-
json = r.Result.Item1;
237-
}, TaskContinuationOptions.ExecuteSynchronously).Wait();
238-
}
239-
240-
if (!string.IsNullOrEmpty(json))
241-
{
242-
List<object> result = ProcessJsonResponse(requestState, json);
236+
UrlProcessRequest<PNPublishResult>(request, requestState, false).ContinueWith(r =>
237+
{
238+
json = r.Result.Item1;
239+
}, TaskContinuationOptions.ExecuteSynchronously).Wait();
240+
}
243241

244-
if (result != null && result.Count >= 3)
242+
if (!string.IsNullOrEmpty(json))
245243
{
246-
int publishStatus;
247-
Int32.TryParse(result[0].ToString(), out publishStatus);
248-
if (publishStatus == 1)
244+
List<object> result = ProcessJsonResponse(requestState, json);
245+
246+
if (result != null && result.Count >= 3)
249247
{
250-
ProcessResponseCallbacks(result, requestState);
248+
int publishStatus;
249+
Int32.TryParse(result[0].ToString(), out publishStatus);
250+
if (publishStatus == 1)
251+
{
252+
ProcessResponseCallbacks(result, requestState);
253+
}
254+
else
255+
{
256+
PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(400, result[1].ToString());
257+
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse<PNPublishResult>(PNOperationType.PNPublishOperation, category, requestState, 400, new PNException(json));
258+
if (requestState.PubnubCallback != null)
259+
{
260+
requestState.PubnubCallback.OnResponse(default(PNPublishResult), status);
261+
}
262+
}
251263
}
252264
else
253265
{
254-
PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(400, result[1].ToString());
255-
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse<PNPublishResult>(PNOperationType.PNPublishOperation, category, requestState, 400, new PNException(json));
256-
if (requestState.PubnubCallback != null)
257-
{
258-
requestState.PubnubCallback.OnResponse(default(PNPublishResult), status);
259-
}
266+
ProcessResponseCallbacks(result, requestState);
260267
}
261268
}
262-
else
269+
270+
CleanUp();
271+
}
272+
catch (Exception ex)
273+
{
274+
int statusCode = PNStatusCodeHelper.GetHttpStatusCode(ex.ToString());
275+
PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, ex.ToString());
276+
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNPublishOperation, category, requestState, statusCode, new PNException(ex.ToString()));
277+
if (requestState.PubnubCallback != null)
263278
{
264-
ProcessResponseCallbacks(result, requestState);
279+
requestState.PubnubCallback.OnResponse(default(PNPublishResult), status);
265280
}
266-
}
267281

268-
CleanUp();
282+
}
269283
}
270284

271285
internal async Task<PNResult<PNPublishResult>> Publish(string channel, object message, bool storeInHistory, int ttl, Dictionary<string, object> metaData, Dictionary<string, object> externalQueryParam)
@@ -290,56 +304,66 @@ internal async Task<PNResult<PNPublishResult>> Publish(string channel, object me
290304
return ret;
291305
}
292306

293-
string requestMethodName = (this.httpPost) ? "POST" : "GET";
294-
IUrlRequestBuilder urlBuilder = new UrlRequestBuilder(config, jsonLibrary, unit, pubnubLog, pubnubTelemetryMgr, (PubnubInstance != null && !string.IsNullOrEmpty(PubnubInstance.InstanceId) && PubnubTokenMgrCollection.ContainsKey(PubnubInstance.InstanceId)) ? PubnubTokenMgrCollection[PubnubInstance.InstanceId] : null, (PubnubInstance != null) ? PubnubInstance.InstanceId : "");
295-
296-
Uri request = urlBuilder.BuildPublishRequest(requestMethodName, "", channel, message, storeInHistory, ttl, metaData, null, externalQueryParam);
297-
298307
RequestState<PNPublishResult> requestState = new RequestState<PNPublishResult>();
299-
requestState.Channels = new[] { channel };
300-
requestState.ResponseType = PNOperationType.PNPublishOperation;
301-
requestState.Reconnect = false;
302-
requestState.EndPointOperation = this;
308+
try
309+
{
310+
string requestMethodName = (this.httpPost) ? "POST" : "GET";
311+
IUrlRequestBuilder urlBuilder = new UrlRequestBuilder(config, jsonLibrary, unit, pubnubLog, pubnubTelemetryMgr, (PubnubInstance != null && !string.IsNullOrEmpty(PubnubInstance.InstanceId) && PubnubTokenMgrCollection.ContainsKey(PubnubInstance.InstanceId)) ? PubnubTokenMgrCollection[PubnubInstance.InstanceId] : null, (PubnubInstance != null) ? PubnubInstance.InstanceId : "");
303312

304-
Tuple<string, PNStatus> JsonAndStatusTuple;
313+
Uri request = urlBuilder.BuildPublishRequest(requestMethodName, "", channel, message, storeInHistory, ttl, metaData, null, externalQueryParam);
305314

306-
if (this.httpPost)
307-
{
308-
requestState.UsePostMethod = true;
309-
string postMessage = JsonEncodePublishMsg(message);
310-
byte[] postData = Encoding.UTF8.GetBytes(postMessage);
311-
JsonAndStatusTuple = await UrlProcessRequest(request, requestState, false, postData).ConfigureAwait(false);
312-
}
313-
else
314-
{
315-
JsonAndStatusTuple = await UrlProcessRequest(request, requestState, false).ConfigureAwait(false);
316-
}
317-
ret.Status = JsonAndStatusTuple.Item2;
318-
string json = JsonAndStatusTuple.Item1;
315+
requestState.Channels = new[] { channel };
316+
requestState.ResponseType = PNOperationType.PNPublishOperation;
317+
requestState.Reconnect = false;
318+
requestState.EndPointOperation = this;
319319

320-
if (!string.IsNullOrEmpty(json))
321-
{
322-
List<object> result = ProcessJsonResponse(requestState, json);
320+
Tuple<string, PNStatus> JsonAndStatusTuple;
321+
322+
if (this.httpPost)
323+
{
324+
requestState.UsePostMethod = true;
325+
string postMessage = JsonEncodePublishMsg(message);
326+
byte[] postData = Encoding.UTF8.GetBytes(postMessage);
327+
JsonAndStatusTuple = await UrlProcessRequest(request, requestState, false, postData).ConfigureAwait(false);
328+
}
329+
else
330+
{
331+
JsonAndStatusTuple = await UrlProcessRequest(request, requestState, false).ConfigureAwait(false);
332+
}
333+
ret.Status = JsonAndStatusTuple.Item2;
334+
string json = JsonAndStatusTuple.Item1;
323335

324-
if (result != null && result.Count >= 3)
336+
if (!string.IsNullOrEmpty(json))
325337
{
326-
int publishStatus;
327-
Int32.TryParse(result[0].ToString(), out publishStatus);
328-
if (publishStatus == 1)
338+
List<object> result = ProcessJsonResponse(requestState, json);
339+
340+
if (result != null && result.Count >= 3)
329341
{
330-
List<object> resultList = ProcessJsonResponse(requestState, json);
331-
if (resultList != null && resultList.Count > 0)
342+
int publishStatus;
343+
Int32.TryParse(result[0].ToString(), out publishStatus);
344+
if (publishStatus == 1)
332345
{
333-
ResponseBuilder responseBuilder = new ResponseBuilder(config, jsonLibrary, pubnubLog);
334-
PNPublishResult responseResult = responseBuilder.JsonToObject<PNPublishResult>(resultList, true);
335-
if (responseResult != null)
346+
List<object> resultList = ProcessJsonResponse(requestState, json);
347+
if (resultList != null && resultList.Count > 0)
336348
{
337-
ret.Result = responseResult;
349+
ResponseBuilder responseBuilder = new ResponseBuilder(config, jsonLibrary, pubnubLog);
350+
PNPublishResult responseResult = responseBuilder.JsonToObject<PNPublishResult>(resultList, true);
351+
if (responseResult != null)
352+
{
353+
ret.Result = responseResult;
354+
}
338355
}
339356
}
340357
}
341358
}
342359
}
360+
catch (Exception ex)
361+
{
362+
int statusCode = PNStatusCodeHelper.GetHttpStatusCode(ex.ToString());
363+
PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, ex.ToString());
364+
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNPublishOperation, category, requestState, statusCode, new PNException(ex.ToString()));
365+
ret.Status = status;
366+
}
343367

344368
return ret;
345369
}

src/Api/PubnubApi/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
[assembly: AssemblyProduct("Pubnub C# SDK")]
1212
[assembly: AssemblyCopyright("Copyright © 2021")]
1313
[assembly: AssemblyTrademark("")]
14-
[assembly: AssemblyVersion("5.3.0.0")]
15-
[assembly: AssemblyFileVersion("5.3.0.0")]
14+
[assembly: AssemblyVersion("5.4.0.0")]
15+
[assembly: AssemblyFileVersion("5.4.0.0")]
1616
// Setting ComVisible to false makes the types in this assembly not visible
1717
// to COM components. If you need to access a type in this assembly from
1818
// COM, set the ComVisible attribute to true on that type.

src/Api/PubnubApi/PubnubApi.csproj

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,16 @@
1313

1414
<PropertyGroup>
1515
<PackageId>Pubnub</PackageId>
16-
<PackageVersion>5.3.0.0</PackageVersion>
16+
<PackageVersion>5.4.0.0</PackageVersion>
1717
<Title>PubNub C# .NET - Web Data Push API</Title>
1818
<Authors>Pandu Masabathula</Authors>
1919
<Owners>PubNub</Owners>
2020
<PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
2121
<PackageIconUrl>http://pubnub.s3.amazonaws.com/2011/powered-by-pubnub/pubnub-icon-600x600.png</PackageIconUrl>
2222
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
2323
<RepositoryUrl>https://github.com/pubnub/c-sharp/</RepositoryUrl>
24-
<PackageReleaseNotes>Added RevokeToken feature.</PackageReleaseNotes>
24+
<PackageReleaseNotes>Replaced BouncyCastle lib with System.Security.Cryptography.Algorithms.
25+
Added try/catch for publish operation to catch exceptions.</PackageReleaseNotes>
2526
<PackageTags>Web Data Push Real-time Notifications ESB Message Broadcasting Distributed Computing</PackageTags>
2627
<!--<Summary>PubNub is a Massively Scalable Web Push Service for Web and Mobile Games. This is a cloud-based service for broadcasting messages to thousands of web and mobile clients simultaneously</Summary>-->
2728
<Description>PubNub is a Massively Scalable Web Push Service for Web and Mobile Games. This is a cloud-based service for broadcasting messages to thousands of web and mobile clients simultaneously</Description>
@@ -85,9 +86,6 @@
8586
</ItemGroup>
8687

8788
<ItemGroup Condition="'$(TargetFramework)' == 'net40'">
88-
<PackageReference Include="Portable.BouncyCastle" Version="1.8.1.2">
89-
<PrivateAssets>None</PrivateAssets>
90-
</PackageReference>
9189
<PackageReference Include="AsyncBridge.JetBrains" Version="0.1.1">
9290
<PrivateAssets>None</PrivateAssets>
9391
</PackageReference>
@@ -99,9 +97,6 @@
9997
</ItemGroup>
10098

10199
<ItemGroup Condition="'$(TargetFramework)' == 'net45'">
102-
<PackageReference Include="Portable.BouncyCastle" Version="1.8.1.2">
103-
<PrivateAssets>None</PrivateAssets>
104-
</PackageReference>
105100
<Reference Include="System" />
106101
<Reference Include="Microsoft.CSharp" />
107102
<PackageReference Include="System.ValueTuple" Version="4.4.0">
@@ -110,8 +105,8 @@
110105
</ItemGroup>
111106

112107
<ItemGroup Condition="'$(TargetFramework)' == 'net461'">
113-
<PackageReference Include="Portable.BouncyCastle" Version="1.8.1.2">
114-
<PrivateAssets>None</PrivateAssets>
108+
<PackageReference Include="System.Security.Cryptography.Algorithms">
109+
<Version>4.3.0</Version>
115110
</PackageReference>
116111
<Reference Include="System" />
117112
<Reference Include="Microsoft.CSharp" />

0 commit comments

Comments
 (0)