📄 absecurity.pas
字号:
Stream.ReadBuffer(iDWord, sizeof(iDWord));
Stream.Position := DWORD(Stream.Position) + iDWord * sizeof(TNodeData);
LoadFromStream(Stream);
Stream.Position := sizeof (C_VERSION) + sizeof(iDWord);
for i:= 0 to Pred(iDWord) do
begin
new(lpNodeData);
Stream.ReadBuffer(lpNodeData^, sizeof(TNodeData));
Items[lpNodeData^.AdditionalInfo.iItemIndex].Data := lpNodeData;
Items[lpNodeData^.AdditionalInfo.iItemIndex].ImageIndex := lpNodeData^.AdditionalInfo.iImageIndex;
Items[lpNodeData^.AdditionalInfo.iItemIndex].SelectedIndex := lpNodeData^.AdditionalInfo.iImageIndex;
end;
end;
procedure TabSecurityTemplate.SaveToStreamSecurity(Stream: TMemoryStream);
var
i: integer;
//lpNodeData: PNodeData;
iDWord: DWORD;
begin
Stream.position := 0;
Stream.WriteBuffer(C_VERSION, sizeof(C_VERSION));
iDWord := Items.Count;
Stream.WriteBuffer(iDWord, sizeof(iDWord));
for i:= 0 to Pred(Items.Count) do
begin
Items[i].Text := Trim(Items[i].Text);
{lpNodeData^}PNodeData(Items[i].Data)^.AdditionalInfo.iItemIndex := i;
{lpNodeData^}PNodeData(Items[i].Data)^.AdditionalInfo.iImageIndex := Items[i].ImageIndex;
Stream.WriteBuffer(PNodeData(Items[i].Data)^{lpNodeData^}, sizeof(TNodeData));
end;
SaveToStream(Stream);
end;
function TabSecurityTemplate.GetPasswordFromUserTreeNode(tnUser: TTreeNode): string;
begin
if Assigned(tnUser) then
Result := PNodeData(tnUser.Item[0].Data)^.sCaption
else
Result := '';
end;
function TabSecurityTemplate.GetUserPassword(sUserName: string): string;
var
i: integer;
begin
if Assigned(Items[0]) then
for i := 0 to Pred(Items.Count) do
if Items[i].Level = 0 then
if sUserName = Items[i].Text then
begin
Result := GetPasswordFromUserTreeNode(Items[i]);
exit;
end;
Result := '';
end;
procedure TabSecurityTemplate.AddUserToUserTemplate(tvSourceTemplate: TabSecurityTemplate; sUserName, sPassword: string; bGrantAll: boolean);
var
tnParent, tnPassword: TTreeNode;
lpNodeData: PNodeData;
begin
tnParent := Items.Add(nil, sUserName);
new(lpNodeData);
lpNodeData^.iId := 0;
lpNodeData^.sCaption := '';//sUserName;//'pass';//For test only
tnParent.Data := lpNodeData;
tnParent.ImageIndex := 0;
tnParent.SelectedIndex := 0;
tnPassword := Items.AddChild(tnParent, 'Password(********)');
new(lpNodeData);
lpNodeData^.iId := 0;
lpNodeData^.sCaption := sPassword;
tnPassword.Data := lpNodeData;
tnPassword.ImageIndex := 3;
tnPassword.SelectedIndex := 3;
tnParent := Items.AddChild(tnParent, 'Rights');
new(lpNodeData);
lpNodeData^.iId := 0;
lpNodeData^.sCaption := '';
tnParent.Data := lpNodeData;
tnParent.ImageIndex := 1;
tnParent.SelectedIndex := 1;
if tvSourceTemplate.Items.Count <> 0 then
BuildASecurityUser(tnParent, tvSourceTemplate.Items[0], bGrantAll);
end;
procedure TabSecurityTemplate.BuildASecurityUser(tnDest, tnSource: TTreeNode; bGrantAll: boolean);
var
tnDestChild, tnSourceChild: TTreeNode;
sText: string;
lpNodeData: PNodeData;
begin
tnSourceChild := tnSource.GetFirstChild;
while Assigned(tnSourceChild) do
begin
if PNodeData(tnSourceChild.Data)^.iID = 0 then
sText := {tnSourceChild.Text//}PNodeData(tnSourceChild.Data)^.sCaption
else
begin
if bGrantAll then
sText := {tnSourceChild.Text}PNodeData(tnSourceChild.Data)^.sCaption + C_YES
else
sText := {tnSourceChild.Text}PNodeData(tnSourceChild.Data)^.sCaption + C_NO;
end;
tnDestChild := Items.AddChild(tnDest, sText);
new(lpNodeData);
tnDestChild.Data := lpNodeData;
PNodeData(tnDestChild.Data)^ := PNodeData(tnSourceChild.Data)^;
PNodeData(tnDestChild.Data)^.bCheckOK := bGrantAll;
tnDestChild.ImageIndex := tnSourceChild.ImageIndex;
tnDestChild.SelectedIndex := tnSourceChild.SelectedIndex;
BuildASecurityUser(tnDestChild, tnSourceChild, bGrantAll);
tnSourceChild := tnSource.GetNextChild(tnSourceChild);
end;
end;
function TabSecurityTemplate.GetUserNodeByUserName(sUserName: string): TTreeNode;
var
i: integer;
begin
if Items.count > 0 then
for i := 0 to Pred(Items.Count) do
if Items[i].Level = 0 then
if sUserName = Items[i].Text then
begin
Result := Items[i];
exit;
end;
Result := nil;
end;
function TabSecurityTemplate.GetUserNodeForNode(tn: TTreeNode): TTreeNode;
begin
Result := tn;
while Assigned(Result) and (Result.Level > 0) do
Result := Result.Parent;
end;
function TabSecurityTemplate.GetUserNodeForSelected: TTreeNode;
begin
Result := GetUserNodeForNode(Selected);
end;
procedure TabSecurityTemplate.DeleteNode(tnUserNode: TTreeNode);
var
tnChild: TTreeNode;
begin
tnChild := tnUserNode.GetFirstChild;
while Assigned(tnChild) do
begin
if Integer(tnChild.Data) > 2048 then
begin
dispose(PNodeData(tnChild.Data));
tnChild.Data := nil;
end;
DeleteNode(tnChild);
tnChild := tnUserNode.GetFirstChild;//tnUserNode.GetNextChild(tnChild);
end;
if Integer(tnUserNode.Data) > 2048 then
dispose(PNodeData(tnUserNode.Data));
tnUserNode.Delete;
end;
function TabSecurityTemplate.GetNodeType(tn: TTreeNode; var sUser, sPassword: string): TNodeType;
begin
if tn.Level = 0 then
begin
if tn.Text = C_SUPERVISOR_NAME then
begin
Result := ntSupervisor;
sUser := C_SUPERVISOR_NAME;
sPassword := PNodeData(tn.Data)^.sCaption;
end
else
begin
Result := ntUserRegular;
sUser := tn.Text;
sPassword := PNodeData(tn.Data)^.sCaption;
end;
end
else if (tn.Level = 1) and (not tn.HasChildren) then
//else if (tn.Level = 1) and (not (Assigned(tn.Data) and (Integer(tn.Data) <= C_MAX_ID)) or ((Integer(tn.Data) >= C_MAX_ID) and (PNodeData(tn.Data)^.iID > 0))) then
begin
Result := ntPassword;
sPassword := PNodeData(tn.Data)^.sCaption;
sUser := tn.Parent.Text;
end
//else if not (tn.HasChildren) then
else if PNodeData(tn.Data)^.iID > 0 then
begin
if GetUserNodeForNode(tn).Text = C_SUPERVISOR_NAME then
Result := ntSupervisorLeave
else
Result := ntUserLeave;
end
else
Result := ntIntermediate;
end;
function TabSecurityTemplate.GetNodeTypeSecurityTemplate(tn: TTreeNode): TNodeType;
begin
if not Assigned(tn) then
Result := ntNone
else if tn.Level = 0 then
Result := ntUserRegular
else if PNodeData(tn.Data)^.iID > 0 then
Result := ntUserLeave
else
Result := ntIntermediate;
end;
function TabSecurityTemplate.GetSelectedNodeType(var sUser, sPassword: string): TNodeType;
begin
if Assigned(Selected) then
Result := GetNodeType(Selected, sUser, sPassword)
else
Result := ntNone;
end;
procedure TabSecurityTemplate.ClearTemplate;
var
i: integer;
begin
for i:= Pred(Items.Count) downto 0 do
//if Integer(Items[i].Data) > 2048 then
dispose(PNodeData(Items[i].Data));
Items.Clear;
end;
function TabSecurityTemplate.GenerateSecurityId: integer;
var
i: integer;
begin
Result := 0;
for i:= Pred(Items.Count) downto 0 do
if Result < PNodeData(Items[i].Data)^.iId then
Result := PNodeData(Items[i].Data)^.iId;
inc(Result);
end;
function TabSecurityTemplate.IsValidSecurityId(iID: integer): boolean;
var
i: integer;
begin
for i:= Pred(Items.Count) downto 0 do
if iID = PNodeData(Items[i].Data)^.iId then
begin
Result := false;
exit;
end;
Result := true
end;
//Class TabSecurityDialogs
constructor TabSecurityDialogs.Create{(AOwner: TComponent)};
begin
inherited;
(*
ffrUserTemplate := TForm.Create(nil);
ffrUserTemplate.Align := alClient;
ftvUserTemplate := TabSecurityTemplate.Create(nil);
ftvUserTemplate.Parent := ffrUserTemplate;
ftvUserTemplate.Align := alClient;
*)
end;
destructor TabSecurityDialogs.Destroy;
begin
inherited;
(*
ftvUserTemplate.Destroy;
ffrUserTemplate.Destroy;
*)
end;
function TabSecurityDialogs.Init(var sLogonName: string; var sPassword: string; bTrySilentInit: boolean; bRestrictToCheckOK: boolean): boolean;
var
dlgPassword: TDlgPassword;
procedure LoggedOn;
begin
Result := true;
sLogonName := dlgPassword.edtUserName.Text;
fSecurity.AddInLastUser(dlgPassword.edtUserName.Text);
sPassword := dlgPassword.edtPassword.Text;
end;
begin
dlgPassword := TDlgPassword.Create(nil);
try
dlgPassword.fbRestrictToCheckOK := bRestrictToCheckOK;
if length(sLogonName) > 0 then
dlgPassword.edtUserName.Text := sLogonName
else if fSecurity.flstLastUser.Count > 0 then
dlgPassword.edtUserName.Text := fSecurity.flstLastUser[Pred(fSecurity.flstLastUser.Count)]
else
dlgPassword.edtUserName.Text := C_SUPERVISOR_NAME;
dlgPassword.edtPassword.Text := sPassword;
dlgPassword.ftvUserTemplate := ftvUserTemplate;
dlgPassword.ftvSecurityTemplate := ftvSecurityTemplate;
if bTrySilentInit then
if dlgPassword.CheckUserPassword then
begin
LoggedOn;
exit;
end;
dlgPassword.edtUserName.Items.Assign(fSecurity.flstLastUser);
//v.1.5
case dlgPassword.ShowModal of
mrOK: LoggedOn;
mrCancel:
begin
if fSecurity.fbLoggedOn then
begin
if mrNo = MessageDlg('Do you want to keep the current logon? If no, all protected functionality will be disabled.', mtConfirmation, [mbYes, mbNo], 0) then
Result := false
else
begin
sLogonName := fSecurity.fsCurrentUser;
//sPassword := fSecurity.fsPassword;
Result := true;
end;
end
else
Result := false;
end;
else
Result := false;
end;
finally
dlgPassword.Destroy;
end;
end;
procedure TabSecurityDialogs.SetSecurityObject(SecurityObject: TabSecurity);
begin
fSecurity := SecurityObject;
ftvUserTemplate := SecurityObject.UserTemplate;
ftvSecurityTemplate := SecurityObject.ftvSecurityTemplate;
if ftvUserTemplate.Items.Count = 0 then
if soCreateSupervisorIfMissing in SecurityObject.Options then
ftvUserTemplate.AddUserToUserTemplate(ftvSecurityTemplate, 'Supervisor', '', true);//Test only
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -