Bug fix : 6x try / catch to resolve crashes caused by GemCard, etc.

This commit is contained in:
Milan Hanajik 2021-11-10 13:20:39 +01:00
parent ce74b0a3bb
commit 284feb73dc
4 changed files with 126 additions and 72 deletions

View File

@ -199,7 +199,8 @@ namespace GemCard
{
Disconnect(DISCONNECT.Unpower);
ReleaseContext();
try { ReleaseContext(); }
catch { }
}
#region ICard Members
@ -214,6 +215,8 @@ namespace GemCard
/// </summary>
/// <returns>A string array of the readers</returns>
public override string[] ListReaders()
{
try
{
EstablishContext(SCOPE.User);
@ -224,7 +227,7 @@ namespace GemCard
m_nLastError = SCardListReaders(m_hContext, null, szListReaders, out pchReaders);
if (m_nLastError == 0)
{
szListReaders = Marshal.AllocHGlobal((int) pchReaders);
szListReaders = Marshal.AllocHGlobal((int)pchReaders);
m_nLastError = SCardListReaders(m_hContext, null, szListReaders, out pchReaders);
if (m_nLastError == 0)
{
@ -232,7 +235,7 @@ namespace GemCard
int nbReaders = 0;
for (int nI = 0; nI < pchReaders; nI++)
{
caReadersData[nI] = (char) Marshal.ReadByte(szListReaders, nI);
caReadersData[nI] = (char)Marshal.ReadByte(szListReaders, nI);
if (caReadersData[nI] == 0)
nbReaders++;
@ -250,7 +253,7 @@ namespace GemCard
int nIdz = 0;
// Get the nJ string from the multi-string
while(nIdx < pchReaders - 1)
while (nIdx < pchReaders - 1)
{
caReader[nIdy] = caReadersData[nIdx];
if (caReader[nIdy] == 0)
@ -276,6 +279,11 @@ namespace GemCard
return sListReaders;
}
catch
{
return new string[0];
}
}
/// <summary>
/// Wraps the PCSC function

View File

@ -3,6 +3,7 @@
///
using System;
using System.Windows.Forms;
using log4net;
using TBF.Resources;
using GemCard;
using System.Drawing;
@ -17,6 +18,8 @@ namespace TBF.UI.Shared
/// </summary>
public partial class LoginDlgWithBenchSelection : Form
{
private static readonly ILog log = LogManager.GetLogger(typeof(LoginDlgWithBenchSelection));
public const string UseTheTagPassword = "UseTheTag0293578";
/// Private fields
@ -108,10 +111,16 @@ namespace TBF.UI.Shared
string[] cardReaders = card.ListReaders();
if (cardReaders != null)
{
foreach (var crd in cardReaders)
{
log.WarnFormat("SMART card reader found: {0}", crd);
}
foreach (var crd in cardReaders)
{
if (crd.Contains("NFC"))
{
log.ErrorFormat("SMART card reader selected: {0}", crd);
smartCardReader = crd; /// NFC smart card reader detected
break;
}
@ -240,15 +249,23 @@ namespace TBF.UI.Shared
void OnCardInserted(object sender, CardInsertedEventArgs args)
{
string tag = string.Empty;
try
{
BackColor = Color.Green;
card.Connect(smartCardReader, SHARE.Shared, PROTOCOL.T0orT1);
/// Read the serial number of the card
APDUResponse response = card.Transmit(new APDUCommand(0xFF, 0xCA, 0x00, 0x00, null, 7));
string tag = response.ToString();
tag = response.ToString();
card.Disconnect(DISCONNECT.Leave);
}
catch
{
tag = string.Empty;
}
if (testBenchComboBox.SelectedItem != null)
{
@ -281,7 +298,8 @@ namespace TBF.UI.Shared
{
if (!string.IsNullOrEmpty(smartCardReader))
{
card.StopCardEvents();
try { card.StopCardEvents(); }
catch { }
}
}
}

View File

@ -306,6 +306,9 @@ namespace Users.Forms
void OnCardInserted(object sender, CardInsertedEventArgs args)
{
string tag = string.Empty;
try
{
BackColor = Color.Green;
card.Connect(smartCardReader, SHARE.Shared, PROTOCOL.T0orT1);
@ -316,6 +319,11 @@ namespace Users.Forms
card.Disconnect(DISCONNECT.Leave);
}
catch
{
txtTag.Text = string.Empty;
}
}
void OnCardRemoved(object sender, CardRemovedEventArgs args)
@ -327,7 +335,8 @@ namespace Users.Forms
{
if (!string.IsNullOrEmpty(smartCardReader))
{
card.StopCardEvents();
try { card.StopCardEvents(); }
catch { }
}
}
}

View File

@ -3,6 +3,7 @@
///
using System;
using System.Windows.Forms;
using log4net;
using Common;
using GemCard;
using Users.Entities;
@ -17,6 +18,8 @@ namespace Users.Forms
/// </summary>
public partial class LoginDlg : Form
{
private static readonly ILog log = LogManager.GetLogger(typeof(LoginDlg));
/// Public readonly
public string UserName { get { return user; } }
@ -111,10 +114,16 @@ namespace Users.Forms
string[] cardReaders = card.ListReaders();
if (cardReaders != null)
{
foreach (var crd in cardReaders)
{
log.WarnFormat("SMART card reader found: {0}", crd);
}
foreach (var crd in cardReaders)
{
if (crd.Contains("NFC"))
{
log.ErrorFormat("SMART card reader selected: {0}", crd);
smartCardReader = crd; /// NFC smart card reader detected
break;
}
@ -278,15 +287,24 @@ namespace Users.Forms
void OnCardInserted(object sender, CardInsertedEventArgs args)
{
string tag = string.Empty;
try
{
BackColor = Color.Green;
card.Connect(smartCardReader, SHARE.Shared, PROTOCOL.T0orT1);
/// Read the serial number of the card
APDUResponse response = card.Transmit(new APDUCommand(0xFF, 0xCA, 0x00, 0x00, null, 7));
string tag = response.ToString();
tag = response.ToString();
card.Disconnect(DISCONNECT.Leave);
}
catch
{
tag = string.Empty;
}
DBSettings[] dbs = new DBSettings[] { GlobalData.RemoteUsersDB, GlobalData.LocalUsersDB };
bool authorized = false;
@ -336,7 +354,8 @@ namespace Users.Forms
{
if (!string.IsNullOrEmpty(smartCardReader))
{
card.StopCardEvents();
try { card.StopCardEvents(); }
catch { }
}
}
}