318 lines
9.5 KiB
C#
318 lines
9.5 KiB
C#
///
|
|
/// Copyright (c) 2022 Sensus Slovensko a.s.
|
|
///
|
|
using System;
|
|
using System.Drawing;
|
|
using System.Windows.Forms;
|
|
using log4net;
|
|
using Common;
|
|
using GemCard;
|
|
using SharedDatabase.Entities;
|
|
using SharedDatabase.Resources;
|
|
|
|
namespace SharedDatabase.Forms
|
|
{
|
|
/// <summary>
|
|
/// Provides login dialog as well as user authorization using TBF.User.Authorize(...)
|
|
/// (i.e. when DialogResult is OK, user was authorized).
|
|
/// </summary>
|
|
public partial class PlainLoginDlg : Form
|
|
{
|
|
private static readonly ILog log = LogManager.GetLogger(typeof(PlainLoginDlg));
|
|
|
|
/// Public readonly
|
|
public string UserName { get { return user; } }
|
|
public string FullName { get { return fullName; } }
|
|
|
|
/// Private fields
|
|
string user;
|
|
string password;
|
|
GID[] requiredGroupMembership;
|
|
bool noDatabase;
|
|
Color oriBackColor;
|
|
string fullName; /// Description of the selected user
|
|
|
|
/// Smart card support, card S/N is used as user.Tag
|
|
CardNative card;
|
|
string smartCardReader;
|
|
|
|
public LoginMethod Method;
|
|
public string VersionString;
|
|
|
|
/// <summary>
|
|
/// Constructor.
|
|
/// </summary>
|
|
public PlainLoginDlg()
|
|
{
|
|
InitializeComponent();
|
|
|
|
this.Icon = Properties.Resources.TBF_icon;
|
|
|
|
oriBackColor = BackColor;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Constructor with a predefined user.
|
|
/// </summary>
|
|
public PlainLoginDlg(string predefinedUser, string prompt = null)
|
|
: this()
|
|
{
|
|
user = predefinedUser;
|
|
userNameTextBox.Text = predefinedUser;
|
|
if (prompt != null) Text = prompt;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Constructor with 'no Database' flag.
|
|
/// </summary>
|
|
public PlainLoginDlg(bool noDatabase, string prompt = null)
|
|
: this()
|
|
{
|
|
this.noDatabase = noDatabase;
|
|
if (prompt != null) Text = prompt;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Constructor when a specific group membership is required.
|
|
/// </summary>
|
|
public PlainLoginDlg(GID[] requiredGroupMembership, string prompt = null)
|
|
: this()
|
|
{
|
|
this.requiredGroupMembership = requiredGroupMembership;
|
|
if (prompt != null) Text = prompt;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Constructor with a predefined user when a specific group membership is required.
|
|
/// </summary>
|
|
public PlainLoginDlg(string predefinedUser, GID[] requiredGroupMembership, string prompt = null)
|
|
: this()
|
|
{
|
|
user = predefinedUser;
|
|
userNameTextBox.Text = predefinedUser;
|
|
this.requiredGroupMembership = requiredGroupMembership;
|
|
|
|
Text = (prompt != null) ? prompt : Strings.User_Login + (string.IsNullOrEmpty(VersionString) ? "" : (" " + VersionString));
|
|
}
|
|
|
|
private void LoginDlg_Load(object sender, EventArgs e)
|
|
{
|
|
Localize();
|
|
|
|
if (user == null)
|
|
userNameTextBox.Select();
|
|
else
|
|
passwordTextBox.Select();
|
|
|
|
///
|
|
/// Smart card reader detection
|
|
///
|
|
smartCardReader = null; /// null = No smart card reader detected
|
|
|
|
#if TURA_IPERL || TURA_IPERL_NEW || TURA_SPECIAL
|
|
try
|
|
{
|
|
card = new CardNative();
|
|
|
|
/// Find NFC smart card reader
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!string.IsNullOrEmpty(smartCardReader))
|
|
{
|
|
/// Reader found, initialize NFC smart card reader
|
|
|
|
card.OnCardInserted += delegate(object sndr, CardInsertedEventArgs args)
|
|
{
|
|
if (InvokeRequired) { Invoke(new EventHandler<CardInsertedEventArgs>(OnCardInserted), sndr, args); }
|
|
else OnCardInserted(sndr, args);
|
|
};
|
|
|
|
card.OnCardRemoved += delegate(object sndr, CardRemovedEventArgs args)
|
|
{
|
|
if (InvokeRequired) { Invoke(new EventHandler<CardRemovedEventArgs>(OnCardRemoved), sndr, args); }
|
|
else OnCardRemoved(sndr, args);
|
|
};
|
|
|
|
card.StartCardEvents(smartCardReader);
|
|
|
|
Text += " (NFC)";
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
smartCardReader = null;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void Localize()
|
|
{
|
|
userNameLabel.Text = Strings.User_name;
|
|
passwordLabel.Text = Strings.Password;
|
|
okButton.Text = Strings.OkBtnText;
|
|
cancelButton.Text = Strings.CancelBtnText;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Try to authorize the user when OK clicked.
|
|
/// </summary>
|
|
private void okButton_Click(object sender, EventArgs e)
|
|
{
|
|
user = userNameTextBox.Text;
|
|
password = passwordTextBox.Text;
|
|
|
|
bool authorized = Common.Utils.IsPowerUser(user, password);
|
|
if (authorized) fullName = "Power user";
|
|
|
|
if (!authorized && !noDatabase)
|
|
{
|
|
DBSettings[] dbs = new DBSettings[] { CurrentUser.RemoteUsersDB, CurrentUser.LocalUsersDB };
|
|
|
|
foreach (var db in dbs)
|
|
{
|
|
try
|
|
{
|
|
var usr1 = Entities.User.LoadUserByName(user, db);
|
|
|
|
if (usr1.IsMemberOf(requiredGroupMembership) && usr1.IsCorrectPassword(password))
|
|
{
|
|
authorized = true;
|
|
fullName = usr1.FullName;
|
|
break;
|
|
}
|
|
}
|
|
catch (Exception) { }
|
|
}
|
|
}
|
|
|
|
if (authorized)
|
|
{
|
|
DialogResult = DialogResult.OK;
|
|
Close();
|
|
return;
|
|
}
|
|
|
|
MessageBox.Show(Strings.Invalid_username_or_password, Strings.Error, MessageBoxButtons.OK);
|
|
DialogResult = DialogResult.None;
|
|
return;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Cancel clicked, do not try to authorize.
|
|
/// </summary>
|
|
private void cancelButton_Click(object sender, EventArgs e)
|
|
{
|
|
DialogResult = DialogResult.Cancel;
|
|
Close();
|
|
return;
|
|
}
|
|
|
|
private void userNameTextBox_KeyPress(object sender, KeyPressEventArgs e)
|
|
{
|
|
if (Convert.ToInt32(e.KeyChar) == 13)
|
|
{
|
|
passwordTextBox.Focus();
|
|
}
|
|
}
|
|
|
|
private void passwordTextBox_KeyPress(object sender, KeyPressEventArgs e)
|
|
{
|
|
if (Convert.ToInt32(e.KeyChar) == 13)
|
|
{
|
|
okButton_Click(sender, e);
|
|
}
|
|
}
|
|
|
|
|
|
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));
|
|
tag = response.ToString();
|
|
|
|
card.Disconnect(DISCONNECT.Leave);
|
|
}
|
|
catch
|
|
{
|
|
tag = string.Empty;
|
|
}
|
|
|
|
DBSettings[] dbs = new DBSettings[] { CurrentUser.RemoteUsersDB, CurrentUser.LocalUsersDB };
|
|
bool authorized = false;
|
|
AuthorizedAs authorizedAs = AuthorizedAs.RemoteUser;
|
|
///
|
|
foreach (var db in dbs)
|
|
{
|
|
try
|
|
{
|
|
Entities.User loadedUser = Entities.User.LoadUserByTag(tag, db);
|
|
if (loadedUser != null)
|
|
{
|
|
authorized = (tag == loadedUser.Tag && loadedUser.IsMemberOf(requiredGroupMembership));
|
|
|
|
if (authorized)
|
|
{
|
|
user = loadedUser.UserName;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception) { }
|
|
|
|
authorizedAs = AuthorizedAs.LocalUser;
|
|
}
|
|
|
|
if (authorized)
|
|
{
|
|
CurrentUser.AuthorizedAs = authorizedAs;
|
|
DialogResult = DialogResult.OK;
|
|
Close();
|
|
return;
|
|
}
|
|
|
|
MessageBox.Show(Strings.Invalid_username_or_password, Strings.Error, MessageBoxButtons.OK);
|
|
DialogResult = DialogResult.None;
|
|
return;
|
|
}
|
|
|
|
|
|
void OnCardRemoved(object sender, CardRemovedEventArgs args)
|
|
{
|
|
BackColor = oriBackColor;
|
|
}
|
|
|
|
private void PlainLoginDlg_FormClosing(object sender, FormClosingEventArgs e)
|
|
{
|
|
if (!string.IsNullOrEmpty(smartCardReader))
|
|
{
|
|
try { card.StopCardEvents(); }
|
|
catch { }
|
|
}
|
|
}
|
|
}
|
|
}
|