tbf/Users/Forms/LoginDlg.cs

178 lines
5.0 KiB
C#

///
/// Copyright (c) 2017 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Users.Resources;
namespace Users.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 LoginDlg : Form
{
// Private fields
string user;
string password;
Config.Grp.GID requiredGroupMembership = Config.Grp.GID.Invalid;
bool noDatabase;
Config.Entities.LoginMethod method;
public string VersionString;
/// <summary>
/// Constructor.
/// </summary>
public LoginDlg()
{
InitializeComponent();
}
/// <summary>
/// Constructor with a predefined user.
/// </summary>
public LoginDlg(string predefinedUser)
: this()
{
user = predefinedUser;
userNameTextBox.Text = predefinedUser;
}
/// <summary>
/// Constructor with 'no Database' flag.
/// </summary>
public LoginDlg(bool noDatabase)
: this()
{
this.noDatabase = noDatabase;
}
/// <summary>
/// Constructor when a specific group membership is required.
/// </summary>
public LoginDlg(Config.Grp.GID requiredGroupMembership)
: this()
{
this.requiredGroupMembership = requiredGroupMembership;
}
/// <summary>
/// Constructor with a predefined user when a specific group membership is required.
/// </summary>
public LoginDlg(string predefinedUser, Config.Grp.GID requiredGroupMembership)
: this()
{
user = predefinedUser;
userNameTextBox.Text = predefinedUser;
this.requiredGroupMembership = requiredGroupMembership;
}
private void LoginDlg_Load(object sender, EventArgs e)
{
Localize();
if (user == null)
userNameTextBox.Select();
else
passwordTextBox.Select();
}
void Localize()
{
Text = Strings.User_Login + (string.IsNullOrEmpty(VersionString) ? "" : (" " + VersionString));
aliasLabel.Text = GetAliasLabel();
passwordLabel.Text = Strings.Password;
okButton.Text = Strings.OkBtnText;
cancelButton.Text = Strings.CancelBtnText;
}
string GetAliasLabel()
{
switch (method)
{
default:
case Config.Entities.LoginMethod.UserName: return Strings.User_name;
case Config.Entities.LoginMethod.FullName: return Strings.Full_name;
case Config.Entities.LoginMethod.Number: return Strings.User_code;
}
}
/// <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 = Config.Entities.User.IsPowerUser(user, password);
if (!authorized && !noDatabase)
{
Config.Entities.User loadedUser = Config.Entities.User.LoadUserByName(user);
if (loadedUser != null)
{
switch (method)
{
default:
case Config.Entities.LoginMethod.UserName:
authorized = (requiredGroupMembership == Config.Grp.GID.Invalid) ? loadedUser.Authorize(user, password) : loadedUser.Authorize(user, password, requiredGroupMembership);
break;
case Config.Entities.LoginMethod.FullName:
authorized = (requiredGroupMembership == Config.Grp.GID.Invalid) ? loadedUser.AuthorizeFullName(user, password) : loadedUser.AuthorizeFullName(user, password, requiredGroupMembership);
break;
case Config.Entities.LoginMethod.Number:
int number;
if (!int.TryParse(user, out number)) break;
authorized = (requiredGroupMembership == Config.Grp.GID.Invalid) ? loadedUser.AuthorizeNumber(number, password) : loadedUser.AuthorizeNumber(number, password, requiredGroupMembership);
break;
}
}
}
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)
{
if (requiredGroupMembership == Config.Grp.GID.Invalid)
{
Config.Entities.User.Unauthorize();
}
DialogResult = DialogResult.Cancel;
Close();
return;
}
private void aliasLabel_Click(object sender, EventArgs e)
{
method++;
if (method == Config.Entities.LoginMethod.Count)
method = 0;
aliasLabel.Text = GetAliasLabel();
}
}
}