⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 absecurity.pas

📁 1. It is located in the root directory - SecurityBuilderDemo.exe. Leave password box blank and click
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  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 + -