mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-06 18:24:26 +08:00
183 lines
4.9 KiB
ObjectPascal
183 lines
4.9 KiB
ObjectPascal
unit change_password;
|
|
|
|
{$mode delphi}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
SysUtils, Variants, Classes, Graphics,
|
|
Controls, Forms, Dialogs, StdCtrls, ExtCtrls,
|
|
Menus, Clipbrd, ComCtrls, Math, extra_controls;
|
|
|
|
type
|
|
TfrmPasswordChange = class(TExtForm)
|
|
lblHeading: TLabel;
|
|
lblPassword: TLabel;
|
|
lblRepeatPassword: TLabel;
|
|
editPassword: TEdit;
|
|
editRepeatPassword: TEdit;
|
|
btnCancel: TButton;
|
|
btnOK: TButton;
|
|
lblStatus: TLabel;
|
|
popupPassword: TPopupMenu;
|
|
N6characters1: TMenuItem;
|
|
N8characters1: TMenuItem;
|
|
N10characters1: TMenuItem;
|
|
N12characters1: TMenuItem;
|
|
N30characters1: TMenuItem;
|
|
menuDummy1: TMenuItem;
|
|
menuDummy2: TMenuItem;
|
|
menuDummy3: TMenuItem;
|
|
menuDummy4: TMenuItem;
|
|
menuDummy5: TMenuItem;
|
|
btnCopyToClipboard: TButton;
|
|
progressbarPasswordStrength: TProgressBar;
|
|
procedure editPasswordChange(Sender: TObject);
|
|
procedure FormShow(Sender: TObject);
|
|
procedure editPasswordKeyDown(Sender: TObject; var Key: Word;
|
|
Shift: TShiftState);
|
|
procedure menuPasswordClick(Sender: TObject);
|
|
procedure menuPasswordInsert(Sender: TObject);
|
|
procedure btnCopyToClipboardClick(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
private
|
|
{ Private-Deklarationen }
|
|
procedure CheckPasswordStrength;
|
|
public
|
|
{ Public-Deklarationen }
|
|
end;
|
|
|
|
var
|
|
frmPasswordChange: TfrmPasswordChange;
|
|
|
|
implementation
|
|
|
|
uses main, apphelpers;
|
|
|
|
{$R *.lfm}
|
|
|
|
|
|
procedure TfrmPasswordChange.FormCreate(Sender: TObject);
|
|
begin
|
|
HasSizeGrip := True;
|
|
end;
|
|
|
|
|
|
procedure TfrmPasswordChange.FormShow(Sender: TObject);
|
|
begin
|
|
// Manually trigger change event on password box
|
|
editPassword.OnChange(Sender);
|
|
end;
|
|
|
|
|
|
procedure TfrmPasswordChange.menuPasswordClick(Sender: TObject);
|
|
var
|
|
Parent, Item: TMenuItem;
|
|
PasswordLen, i: Integer;
|
|
begin
|
|
// Create menu items with random passwords
|
|
Parent := Sender as TMenuItem;
|
|
PasswordLen := MakeInt(Parent.Caption);
|
|
for i:=0 to 19 do begin
|
|
if Parent.Count > i then
|
|
Item := Parent[i]
|
|
else begin
|
|
Item := TMenuItem.Create(Parent);
|
|
Parent.Add(Item);
|
|
end;
|
|
Item.OnClick := menuPasswordInsert;
|
|
Item.Caption := GeneratePassword(PasswordLen);
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TfrmPasswordChange.menuPasswordInsert(Sender: TObject);
|
|
var
|
|
Item: TMenuItem;
|
|
begin
|
|
// Insert password from menu item
|
|
Item := Sender as TMenuItem;
|
|
editPassword.Text := Item.Caption;
|
|
editRepeatPassword.Text := editPassword.Text;
|
|
end;
|
|
|
|
|
|
procedure TfrmPasswordChange.btnCopyToClipboardClick(Sender: TObject);
|
|
var
|
|
OldImageIndex: Integer;
|
|
begin
|
|
// Copy new password to clipboard
|
|
Clipboard.TryAsText := editPassword.Text;
|
|
//OldImageIndex := btnCopyToClipboard.ImageIndex;
|
|
//btnCopyToClipboard.ImageIndex := 55;
|
|
//btnCopyToClipboard.Repaint;
|
|
//Sleep(500);
|
|
//btnCopyToClipboard.ImageIndex := OldImageIndex;
|
|
Beep;
|
|
end;
|
|
|
|
|
|
procedure TfrmPasswordChange.editPasswordChange(Sender: TObject);
|
|
var
|
|
PasswordsMatch: Boolean;
|
|
begin
|
|
// User has entered something on one or both password fields
|
|
btnOK.Enabled := False;
|
|
btnCopyToClipboard.Enabled := False;
|
|
progressbarPasswordStrength.Visible := False;
|
|
if Sender = editPassword then
|
|
editRepeatPassword.Modified := False;
|
|
|
|
if editPassword.Text = '' then begin
|
|
editPassword.PasswordChar := #0;
|
|
lblStatus.Caption := _('Please change your password')
|
|
end else begin
|
|
editPassword.PasswordChar := '*';
|
|
PasswordsMatch := editPassword.Text = editRepeatPassword.Text;
|
|
if editRepeatPassword.Modified and (not PasswordsMatch) then
|
|
lblStatus.Caption := _('Error: Passwords do not match!')
|
|
else begin
|
|
lblStatus.Caption := _('Password strength:');
|
|
btnOK.Enabled := PasswordsMatch;
|
|
btnCopyToClipboard.Enabled := True;
|
|
progressbarPasswordStrength.Visible := True;
|
|
CheckPasswordStrength;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TfrmPasswordChange.editPasswordKeyDown(Sender: TObject; var Key: Word;
|
|
Shift: TShiftState);
|
|
begin
|
|
editPassword.OnChange(Sender);
|
|
end;
|
|
|
|
|
|
procedure TfrmPasswordChange.CheckPasswordStrength;
|
|
var
|
|
i, Distance, LastOrd: Integer;
|
|
p: String;
|
|
begin
|
|
// Simple password-strength checker
|
|
// Calculates the distance between all character codes, and give it a bonus for longer passwords
|
|
p := editPassword.Text;
|
|
Distance := 0;
|
|
LastOrd := -1;
|
|
for i:=1 to Length(p) do begin
|
|
if LastOrd > -1 then
|
|
Inc(Distance, Abs(LastOrd - Ord(p[i])));
|
|
LastOrd := Ord(p[i]);
|
|
end;
|
|
Inc(Distance, Length(p)*10);
|
|
progressbarPasswordStrength.Position := Round(progressbarPasswordStrength.Max / 500 * Distance);
|
|
{case progressbarPasswordStrength.Position of
|
|
0..20: progressbarPasswordStrength.State := pbsError;
|
|
21..50: progressbarPasswordStrength.State := pbsPaused;
|
|
51..100: progressbarPasswordStrength.State := pbsNormal;
|
|
end;}
|
|
end;
|
|
|
|
|
|
end.
|