📄 ssh_client.pas
字号:
end;
procedure TSSHClientFrame.rbPublicKeyClick(Sender: TObject);
begin
ShowPasswordAuth(False);
DisconnectAll;
end;
procedure TSSHClientFrame.edSSHUserNameChange(Sender: TObject);
begin
DisconnectAll;
end;
procedure TSSHClientFrame.cbPrivateKeyDropDown(Sender: TObject);
begin
ScFileStorage.Keys.GetKeyNames(cbPrivateKey.Items);
end;
procedure TSSHClientFrame.cbPrivateKeyChange(Sender: TObject);
begin
DisconnectAll;
end;
procedure TSSHClientFrame.btConnectDBClick(Sender: TObject);
begin
UniConnection.Connect;
end;
procedure TSSHClientFrame.btDisconnectDBClick(Sender: TObject);
begin
UniConnection.Disconnect;
end;
procedure TSSHClientFrame.UniConnectionAfterConnect(Sender: TObject);
begin
ShowDBButtons;
end;
procedure TSSHClientFrame.UniConnectionAfterDisconnect(Sender: TObject);
begin
ShowDBButtons;
UniConnection.IOHandler := nil;
ScSSHChannel.Disconnect;
end;
procedure TSSHClientFrame.UniTableAfterOpen(DataSet: TDataSet);
begin
btOpen.Enabled := False;
btClose.Enabled := True;
end;
procedure TSSHClientFrame.UniTableAfterClose(DataSet: TDataSet);
begin
btOpen.Enabled := not btConnectDB.Enabled and (cbTableName.Text <> '');
btClose.Enabled := False;
end;
procedure TSSHClientFrame.btOpenClick(Sender: TObject);
begin
UniTable.Open;
end;
procedure TSSHClientFrame.btCloseClick(Sender: TObject);
begin
UniTable.Close;
end;
procedure TSSHClientFrame.cbTableNameDropDown(Sender: TObject);
begin
if UniConnection.Connected then
UniConnection.GetTableNames(cbTableName.Items)
else
cbTableName.Items.Clear;
end;
procedure TSSHClientFrame.cbTableNameChange(Sender: TObject);
begin
UniTable.TableName := cbTableName.Text;
btOpen.Enabled := UniConnection.Connected and (cbTableName.Text <> '');
end;
{$IFDEF MSWINDOWS}
function TSSHClientFrame.SaveState: boolean;
var
Registry: TRegistry;
begin
Registry := TRegistry.Create;
try
with Registry do begin
OpenKey(KeyPath + '\' + TSSHClientFrame.ClassName, True);
WriteString('SSHHost', ScSSHClient.HostName);
WriteInteger('SSHPort', ScSSHClient.Port);
WriteString('SSHUserName', ScSSHClient.User);
WriteInteger('ListenPort', seListenPort.Value);
WriteString('Provider', cbProvider.Text);
WriteString('DBHost', edDBHost.Text);
WriteInteger('DBPort', seDBPort.Value);
WriteString('DBUserName', edDBUserName.Text);
WriteString('DBDatabase', cbDBDatabase.Text);
WriteBool('Silent randomization', cbRandomization.Checked);
end;
finally
Registry.Free;
end;
Result := True;
end;
function TSSHClientFrame.LoadState: boolean;
var
Registry: TRegistry;
begin
Result := False;
Registry := TRegistry.Create;
try
with Registry do begin
if OpenKey(KeyPath + '\' + TSSHClientFrame.ClassName, False) then begin
if ValueExists('SSHHost') then
ScSSHClient.HostName := ReadString('SSHHost');
if ValueExists('SSHPort') then
ScSSHClient.Port := ReadInteger('SSHPort');
if ValueExists('SSHUserName') then
ScSSHClient.User := ReadString('SSHUserName');
if ValueExists('ListenPort') then
seListenPort.Value := ReadInteger('ListenPort');
if ValueExists('Provider') then
cbProvider.Text := ReadString('Provider');
if ValueExists('DBHost') then
edDBHost.Text := ReadString('DBHost');
if ValueExists('DBPort') then
seDBPort.Value := ReadInteger('DBPort');
if ValueExists('DBUserName') then
edDBUserName.Text := ReadString('DBUserName');
if ValueExists('DBDatabase') then
cbDBDatabase.Text := ReadString('DBDatabase');
if ValueExists('Silent randomization') then
cbRandomization.Checked := ReadBool('Silent randomization');
Result := True;
end;
end;
finally
Registry.Free;
end;
end;
function TSSHClientFrame.KeyPath: string;
begin
Result := '\SOFTWARE\Devart\SecureBridge\Demos';
end;
{$ENDIF}
procedure TSSHClientFrame.btKeyGenClick(Sender: TObject);
var
msg: string;
OldCursor: TCursor;
Key: TScKey;
Algorithm: TScAsymmetricAlgorithm;
BitCount: integer;
begin
CheckRandomize;
OldCursor := Screen.Cursor;
try
Screen.Cursor := crHourGlass;
if cbPrivateKey.Text = '' then
cbPrivateKey.Text := 'client_key';
Key := ScFileStorage.Keys.FindKey(cbPrivateKey.Text);
if Key = nil then begin
Key := TScKey.Create(ScFileStorage.Keys);
Key.KeyName := cbPrivateKey.Text;
Algorithm := aaRSA;
BitCount := 1024;
end
else begin
Key.Ready := True;
Algorithm := Key.Algorithm;
BitCount := Key.BitCount;
end;
try
Key.Generate(Algorithm, BitCount);
Key.ExportTo(Key.KeyName + '.pub', True, '');
msg := 'The client key file has been generated into the current application directory.'#13#10 +
'To connect with authentication by key, you should pass the "' + Key.KeyName +
'.pub" file to the server and set the server to work with this file.';
MessageDlg(msg, mtInformation, [mbOk], 0);
except
on E: Exception do
MessageDlg('Cannot generate key: ' + E.Message, mtWarning, [mbOk], 0);
end;
finally
Screen.Cursor := OldCursor;
end;
end;
procedure TSSHClientFrame.ScSSHClientServerKeyValidate(Sender: TObject;
NewServerKey: TScKey; var Accept: Boolean);
var
Key: TScKey;
fp, msg: string;
begin
Key := ScFileStorage.Keys.FindKey(ScSSHClient.HostName);
if (Key = nil) or not Key.Ready then begin
NewServerKey.GetFingerPrint(haMD5, fp);
msg := 'The authenticity of server can not be established.'#13#10 +
'Fingerprint for the key received from server: ' + fp +'.'#13#10 +
'Key length: ' + IntToStr(NewServerKey.BitCount) +' bits.'#13#10 +
'Are you sure you want to continue connecting?';
if MessageDlg(msg, mtConfirmation, [mbOk, mbCancel], 0) = mrOk then begin
NewServerKey.KeyName := ScSSHClient.HostName;
ScFileStorage.Keys.Add(NewServerKey);
Accept := True;
end;
end;
end;
procedure TSSHClientFrame.cbDBDatabaseDropDown(Sender: TObject);
begin
UniConnection.GetDatabaseNames(cbDBDatabase.Items)
end;
procedure TSSHClientFrame.cbDBDatabaseChange(Sender: TObject);
begin
UniTable.Close;
UniConnection.Database := cbDBDatabase.Text;
cbTableName.Text := '';
end;
procedure TSSHClientFrame.UniConnectionBeforeConnect(Sender: TObject);
begin
if rbLocalPF.Checked then begin
UniConnection.IOHandler := nil;
ScSSHChannel.SourcePort := seListenPort.Value;
ScSSHChannel.DestPort := seDBPort.Value;
ScSSHChannel.DestHost := edDBHost.Text;
ScSSHChannel.Connect;
UniConnection.Server := 'localhost';
UniConnection.Port := ScSSHChannel.SourcePort;
end
else begin
UniConnection.IOHandler := CRSSHIOHandler;
UniConnection.Server := edDBHost.Text;
UniConnection.Port := seDBPort.Value;
end;
UniConnection.ProviderName := cbProvider.Text;
UniConnection.Username := edDBUserName.Text;
UniConnection.Password := edDBPassword.Text;
UniConnection.Database := cbDBDatabase.Text;
end;
procedure TSSHClientFrame.ScSSHClientBeforeConnect(Sender: TObject);
begin
CheckRandomize;
ScSSHClient.HostName := edSSHHost.Text;
if edSSHPort.Text <> '' then
ScSSHClient.Port := StrToInt(edSSHPort.Text);
ScSSHClient.User := edSSHUserName.Text;
if rbPassword.Checked then begin
ScSSHClient.Authentication := atPassword;
ScSSHClient.Password := edSSHPassword.Text;
end
else begin
ScSSHClient.Authentication := atPublicKey;
ScSSHClient.PrivateKeyName := cbPrivateKey.Text;
if ScFileStorage.Keys.FindKey(ScSSHClient.PrivateKeyName) = nil then
raise EScError.Create('Private key can not be empty');
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -