Session manager: Add checkbox option for users who want to be prompted for username + password rather than saving that to registry. Prompt window itself is called from within TMySQLConnection.SetActive.

This commit is contained in:
Ansgar Becker
2010-07-19 20:06:09 +00:00
parent 9c3488b457
commit 8c34a9e15a
9 changed files with 191 additions and 4 deletions

View File

@ -37,7 +37,8 @@ uses
mysql_connection in '..\..\source\mysql_connection.pas', mysql_connection in '..\..\source\mysql_connection.pas',
trigger_editor in '..\..\source\trigger_editor.pas' {frmTriggerEditor: TFrame}, trigger_editor in '..\..\source\trigger_editor.pas' {frmTriggerEditor: TFrame},
searchreplace in '..\..\source\searchreplace.pas' {frmSearchReplace}, searchreplace in '..\..\source\searchreplace.pas' {frmSearchReplace},
event_editor in '..\..\source\event_editor.pas' {frmEventEditor: TFrame}; event_editor in '..\..\source\event_editor.pas' {frmEventEditor: TFrame},
loginform in '..\..\source\loginform.pas' {frmLogin};
{$R ..\..\res\icon.RES} {$R ..\..\res\icon.RES}
{$R ..\..\res\version.RES} {$R ..\..\res\version.RES}

View File

@ -203,6 +203,9 @@
<Form>frmEventEditor</Form> <Form>frmEventEditor</Form>
<DesignClass>TFrame</DesignClass> <DesignClass>TFrame</DesignClass>
</DCCReference> </DCCReference>
<DCCReference Include="..\..\source\loginform.pas">
<Form>frmLogin</Form>
</DCCReference>
<RcCompile Include="..\..\res\updater.rc"> <RcCompile Include="..\..\res\updater.rc">
<Form>updater.res</Form> <Form>updater.res</Form>
</RcCompile> </RcCompile>

View File

@ -260,7 +260,7 @@ object connform: Tconnform
object editPassword: TEdit object editPassword: TEdit
Left = 101 Left = 101
Top = 92 Top = 92
Width = 197 Width = 126
Height = 21 Height = 21
Anchors = [akLeft, akTop, akRight] Anchors = [akLeft, akTop, akRight]
PasswordChar = '*' PasswordChar = '*'
@ -312,6 +312,16 @@ object connform: Tconnform
OnChange = Modification OnChange = Modification
OnDropDown = comboDatabasesDropDown OnDropDown = comboDatabasesDropDown
end end
object chkLoginPrompt: TCheckBox
Left = 233
Top = 94
Width = 65
Height = 17
Anchors = [akTop, akRight]
Caption = 'Prompt'
TabOrder = 9
OnClick = chkLoginPromptClick
end
end end
object tabSSHtunnel: TTabSheet object tabSSHtunnel: TTabSheet
Caption = 'SSH tunnel' Caption = 'SSH tunnel'

View File

@ -75,6 +75,7 @@ type
lblDownloadPlink: TLabel; lblDownloadPlink: TLabel;
comboDatabases: TComboBox; comboDatabases: TComboBox;
lblDatabase: TLabel; lblDatabase: TLabel;
chkLoginPrompt: TCheckBox;
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure btnOpenClick(Sender: TObject); procedure btnOpenClick(Sender: TObject);
procedure FormShow(Sender: TObject); procedure FormShow(Sender: TObject);
@ -107,6 +108,7 @@ type
procedure editHostChange(Sender: TObject); procedure editHostChange(Sender: TObject);
procedure lblDownloadPlinkClick(Sender: TObject); procedure lblDownloadPlinkClick(Sender: TObject);
procedure comboDatabasesDropDown(Sender: TObject); procedure comboDatabasesDropDown(Sender: TObject);
procedure chkLoginPromptClick(Sender: TObject);
private private
{ Private declarations } { Private declarations }
FLoaded: Boolean; FLoaded: Boolean;
@ -217,6 +219,7 @@ begin
MainReg.WriteString(REGNAME_HOST, editHost.Text); MainReg.WriteString(REGNAME_HOST, editHost.Text);
MainReg.WriteString(REGNAME_USER, editUsername.Text); MainReg.WriteString(REGNAME_USER, editUsername.Text);
MainReg.WriteString(REGNAME_PASSWORD, encrypt(editPassword.Text)); MainReg.WriteString(REGNAME_PASSWORD, encrypt(editPassword.Text));
MainReg.WriteBool(REGNAME_LOGINPROMPT, chkLoginPrompt.Checked);
MainReg.WriteString(REGNAME_PORT, IntToStr(updownPort.Position)); MainReg.WriteString(REGNAME_PORT, IntToStr(updownPort.Position));
MainReg.WriteInteger(REGNAME_NETTYPE, comboNetType.ItemIndex); MainReg.WriteInteger(REGNAME_NETTYPE, comboNetType.ItemIndex);
MainReg.WriteBool(REGNAME_COMPRESSED, chkCompressed.Checked); MainReg.WriteBool(REGNAME_COMPRESSED, chkCompressed.Checked);
@ -339,6 +342,7 @@ begin
Result.Hostname := editHost.Text; Result.Hostname := editHost.Text;
Result.Username := editUsername.Text; Result.Username := editUsername.Text;
Result.Password := editPassword.Text; Result.Password := editPassword.Text;
Result.LoginPrompt := chkLoginPrompt.Checked;
Result.Port := updownPort.Position; Result.Port := updownPort.Position;
Result.AllDatabases := comboDatabases.Text; Result.AllDatabases := comboDatabases.Text;
Result.SSHHost := editSSHHost.Text; Result.SSHHost := editSSHHost.Text;
@ -434,6 +438,7 @@ begin
editHost.Text := FOrgParams.Hostname; editHost.Text := FOrgParams.Hostname;
editUsername.Text := FOrgParams.Username; editUsername.Text := FOrgParams.Username;
editPassword.Text := FOrgParams.Password; editPassword.Text := FOrgParams.Password;
chkLoginPrompt.Checked := FOrgParams.LoginPrompt;
updownPort.Position := FOrgParams.Port; updownPort.Position := FOrgParams.Port;
chkCompressed.Checked := opCompress in FOrgParams.Options; chkCompressed.Checked := opCompress in FOrgParams.Options;
comboDatabases.Text := FOrgParams.AllDatabases; comboDatabases.Text := FOrgParams.AllDatabases;
@ -545,6 +550,21 @@ begin
Modification(Sender); Modification(Sender);
end; end;
procedure Tconnform.chkLoginPromptClick(Sender: TObject);
var
DoEnable: Boolean;
begin
// Disable password input if user wants to be prompted
DoEnable := not TCheckBox(Sender).Checked;
lblUsername.Enabled := DoEnable;
editUsername.Enabled := DoEnable;
lblPassword.Enabled := DoEnable;
editPassword.Enabled := DoEnable;
Modification(Sender);
end;
procedure Tconnform.comboDatabasesDropDown(Sender: TObject); procedure Tconnform.comboDatabasesDropDown(Sender: TObject);
var var
Connection: TMySQLConnection; Connection: TMySQLConnection;
@ -575,6 +595,7 @@ begin
if FLoaded then begin if FLoaded then begin
FSessionModified := (FOrgParams.Hostname <> editHost.Text) FSessionModified := (FOrgParams.Hostname <> editHost.Text)
or (FOrgParams.Username <> editUsername.Text) or (FOrgParams.Username <> editUsername.Text)
or (FOrgParams.LoginPrompt <> chkLoginPrompt.Checked)
or (FOrgParams.Port <> updownPort.Position) or (FOrgParams.Port <> updownPort.Position)
or ((opCompress in FOrgParams.Options) <> chkCompressed.Checked) or ((opCompress in FOrgParams.Options) <> chkCompressed.Checked)
or (FOrgParams.NetType <> TNetType(comboNetType.ItemIndex)) or (FOrgParams.NetType <> TNetType(comboNetType.ItemIndex))

View File

@ -121,6 +121,7 @@ const
REGNAME_USER = 'User'; REGNAME_USER = 'User';
DEFAULT_USER = 'root'; DEFAULT_USER = 'root';
REGNAME_PASSWORD = 'Password'; REGNAME_PASSWORD = 'Password';
REGNAME_LOGINPROMPT = 'LoginPrompt';
REGNAME_PORT = 'Port'; REGNAME_PORT = 'Port';
DEFAULT_PORT = 3306; DEFAULT_PORT = 3306;
REGNAME_PLINKEXE = 'PlinkExecutable'; REGNAME_PLINKEXE = 'PlinkExecutable';

View File

@ -3044,6 +3044,7 @@ begin
Result.Hostname := GetRegValue(REGNAME_HOST, '', Session); Result.Hostname := GetRegValue(REGNAME_HOST, '', Session);
Result.Username := GetRegValue(REGNAME_USER, '', Session); Result.Username := GetRegValue(REGNAME_USER, '', Session);
Result.Password := decrypt(GetRegValue(REGNAME_PASSWORD, '', Session)); Result.Password := decrypt(GetRegValue(REGNAME_PASSWORD, '', Session));
Result.LoginPrompt := GetRegValue(REGNAME_LOGINPROMPT, False, Session);
Result.Port := StrToIntDef(GetRegValue(REGNAME_PORT, '', Session), DEFAULT_PORT); Result.Port := StrToIntDef(GetRegValue(REGNAME_PORT, '', Session), DEFAULT_PORT);
Result.AllDatabases := GetRegValue(REGNAME_DATABASES, '', Session); Result.AllDatabases := GetRegValue(REGNAME_DATABASES, '', Session);
Result.SSHHost := GetRegValue(REGNAME_SSHHOST, '', Session); Result.SSHHost := GetRegValue(REGNAME_SSHHOST, '', Session);

78
source/loginform.dfm Normal file
View File

@ -0,0 +1,78 @@
object frmLogin: TfrmLogin
Left = 0
Top = 0
BorderStyle = bsDialog
Caption = 'Login'
ClientHeight = 117
ClientWidth = 251
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
OnCreate = FormCreate
OnShow = FormShow
DesignSize = (
251
117)
PixelsPerInch = 96
TextHeight = 13
object lblPrompt: TLabel
Left = 8
Top = 8
Width = 44
Height = 13
Caption = 'lblPrompt'
end
object lblUsername: TLabel
Left = 8
Top = 33
Width = 52
Height = 13
Anchors = [akLeft, akBottom]
Caption = '&Username:'
FocusControl = editUsername
end
object lblPassword: TLabel
Left = 8
Top = 60
Width = 50
Height = 13
Anchors = [akLeft, akBottom]
Caption = '&Password:'
FocusControl = editPassword
end
object btnOK: TButton
Left = 168
Top = 84
Width = 75
Height = 25
Anchors = [akRight, akBottom]
Caption = 'Login'
Default = True
ModalResult = 1
TabOrder = 2
end
object editPassword: TEdit
Left = 72
Top = 57
Width = 171
Height = 21
Anchors = [akLeft, akRight, akBottom]
PasswordChar = '*'
TabOrder = 1
Text = 'editPassword'
end
object editUsername: TEdit
Left = 72
Top = 30
Width = 171
Height = 21
Anchors = [akLeft, akRight, akBottom]
TabOrder = 0
Text = 'editUsername'
end
end

61
source/loginform.pas Normal file
View File

@ -0,0 +1,61 @@
unit loginform;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfrmLogin = class(TForm)
btnOK: TButton;
editPassword: TEdit;
lblPrompt: TLabel;
editUsername: TEdit;
lblUsername: TLabel;
lblPassword: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure LoginPrompt(ACaption: String; var AUsername, APassword: String);
implementation
uses helpers;
{$R *.dfm}
{$I const.inc}
procedure LoginPrompt(ACaption: String; var AUsername, APassword: String);
var
frm: TfrmLogin;
begin
// Create login box and pass back user + pass
frm := TfrmLogin.Create(nil);
frm.lblPrompt.Caption := ACaption;
frm.editUsername.Text := AUsername;
frm.editPassword.Text := APassword;
frm.ShowModal;
AUsername := frm.editUsername.Text;
APassword := frm.editPassword.Text;
frm.Free;
end;
procedure TfrmLogin.FormCreate(Sender: TObject);
begin
InheritFont(Font);
Caption := APPNAME + ' - Login';
end;
procedure TfrmLogin.FormShow(Sender: TObject);
begin
editUsername.SetFocus;
end;
end.

View File

@ -151,6 +151,7 @@ type
FSSHHost, FSSHUser, FSSHPassword, FSSHPlinkExe, FSSHPrivateKey: String; FSSHHost, FSSHUser, FSSHPassword, FSSHPlinkExe, FSSHPrivateKey: String;
FPort, FSSHPort, FSSHLocalPort: Integer; FPort, FSSHPort, FSSHLocalPort: Integer;
FOptions: TMySQLClientOptions; FOptions: TMySQLClientOptions;
FLoginPrompt: Boolean;
public public
constructor Create; constructor Create;
published published
@ -159,6 +160,7 @@ type
property Port: Integer read FPort write FPort; property Port: Integer read FPort write FPort;
property Username: String read FUsername write FUsername; property Username: String read FUsername write FUsername;
property Password: String read FPassword write FPassword; property Password: String read FPassword write FPassword;
property LoginPrompt: Boolean read FLoginPrompt write FLoginPrompt;
property AllDatabases: String read FAllDatabases write FAllDatabases; property AllDatabases: String read FAllDatabases write FAllDatabases;
property StartupScriptFilename: String read FStartupScriptFilename write FStartupScriptFilename; property StartupScriptFilename: String read FStartupScriptFilename write FStartupScriptFilename;
property Options: TMySQLClientOptions read FOptions write FOptions; property Options: TMySQLClientOptions read FOptions write FOptions;
@ -369,7 +371,7 @@ type
implementation implementation
uses helpers; uses helpers, loginform;
@ -426,13 +428,22 @@ procedure TMySQLConnection.SetActive( Value: Boolean );
var var
Connected: PMYSQL; Connected: PMYSQL;
ClientFlags, FinalPort: Integer; ClientFlags, FinalPort: Integer;
Error, tmpdb, FinalHost, FinalSocket, PlinkCmd: String; Error, tmpdb, FinalHost, FinalSocket, PlinkCmd, UsernamePrompt, PasswordPrompt: String;
SSLResult: Byte; SSLResult: Byte;
UsingPass, Protocol, CurCharset: String; UsingPass, Protocol, CurCharset: String;
StartupInfo: TStartupInfo; StartupInfo: TStartupInfo;
ExitCode: LongWord; ExitCode: LongWord;
begin begin
if Value and (FHandle = nil) then begin if Value and (FHandle = nil) then begin
// Prompt for password
if FParameters.LoginPrompt then begin
UsernamePrompt := FParameters.Username;
PasswordPrompt := FParameters.Password;
LoginPrompt('Login to '+FParameters.Hostname+':', UsernamePrompt, PasswordPrompt);
FParameters.Username := UsernamePrompt;
FParameters.Password := PasswordPrompt;
end;
// Get handle // Get handle
FHandle := mysql_init(nil); FHandle := mysql_init(nil);