home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 October / PCWorld_2000-10_cd2.bin / Borland / interbase / IBConsole_src.ZIP / ibconsole / frmuUser.pas < prev    next >
Pascal/Delphi Source File  |  2000-07-24  |  32KB  |  945 lines

  1. {
  2.  * The contents of this file are subject to the InterBase Public License
  3.  * Version 1.0 (the "License"); you may not use this file except in
  4.  * compliance with the License.
  5.  * 
  6.  * You may obtain a copy of the License at http://www.Inprise.com/IPL.html.
  7.  * 
  8.  * Software distributed under the License is distributed on an "AS IS"
  9.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  10.  * the License for the specific language governing rights and limitations
  11.  * under the License.  The Original Code was created by Inprise
  12.  * Corporation and its predecessors.
  13.  * 
  14.  * Portions created by Inprise Corporation are Copyright (C) Inprise
  15.  * Corporation. All Rights Reserved.
  16.  * 
  17.  * Contributor(s): ______________________________________.
  18. }
  19.  
  20. {****************************************************************
  21. *
  22. *  f r m u U s e r
  23. *
  24. ****************************************************************
  25. *  Author: The Client Server Factory Inc.
  26. *  Date:   March 1, 1999
  27. *
  28. *  Description:  This unit provides an interface for managing
  29. *                user accounts
  30. *
  31. *****************************************************************
  32. * Revisions:
  33. *
  34. *****************************************************************}
  35.  
  36. unit frmuUser;
  37.  
  38. interface
  39.  
  40. uses
  41.   Windows, SysUtils, Forms, ExtCtrls, StdCtrls, Classes, Controls, Dialogs,
  42.   IBServices, zluibcClasses, Graphics, Messages, frmuDlgClass, ActnList;
  43.  
  44. type
  45.   TfrmUserInfo = class(TDialog)
  46.     btnNew: TButton;
  47.     btnApply: TButton;
  48.     btnDelete: TButton;
  49.     btnClose: TButton;
  50.     btnCancel: TButton;
  51.     gbOptionalInfo: TGroupBox;
  52.     lblFName: TLabel;
  53.     lblMName: TLabel;
  54.     lblLName: TLabel;
  55.     edtLName: TEdit;
  56.     edtFName: TEdit;
  57.     edtMName: TEdit;
  58.     gbRequiredInfo: TGroupBox;
  59.     lblPassword: TLabel;
  60.     lblConfirmPassword: TLabel;
  61.     lblUserName: TLabel;
  62.     edtUsername: TEdit;
  63.     cbUsername: TComboBox;
  64.     edtPassword: TEdit;
  65.     edtConfirmPassword: TEdit;
  66.     ActionList1: TActionList;
  67.     NewUser: TAction;
  68.     ModifyUser: TAction;
  69.     DeleteUser: TAction;
  70.     function FormHelp(Command: Word; Data: Integer; var CallHelp: Boolean): Boolean;
  71.     procedure btnApplyClick(Sender: TObject);
  72.     procedure btnCancelClick(Sender: TObject);
  73.     procedure btnCloseClick(Sender: TObject);
  74.     procedure btnDeleteClick(Sender: TObject);
  75.     procedure btnNewClick(Sender: TObject);
  76.     procedure cbUsernameChange(Sender: TObject);
  77.     procedure cbUsernameClick(Sender: TObject);
  78.     procedure edtConfirmPasswordChange(Sender: TObject);
  79.     procedure edtFNameChange(Sender: TObject);
  80.     procedure edtLNameChange(Sender: TObject);
  81.     procedure edtMNameChange(Sender: TObject);
  82.     procedure edtPasswordChange(Sender: TObject);
  83.     procedure edtUsernameChange(Sender: TObject);
  84.     procedure FormCreate(Sender: TObject);
  85.     procedure DeleteUserUpdate(Sender: TObject);
  86.     procedure FormShow(Sender: TObject);
  87.   private
  88.     { Private declarations }
  89.     FConfirmPassword: string;
  90.     FCurrSelServer: TibcServerNode;
  91.     FPassword: string;
  92.     FSecurityService: TIBSecurityService;
  93.     FUserInfo : array of TUserInfo;
  94.     function GetUserInfo(): boolean;
  95.     function GetUserList(): boolean;
  96.     function VerifyInputData(): boolean;
  97.     procedure GetUsers(const idx: integer = -1);
  98.     procedure WMNCLButtonDown( var Message: TWMNCLBUTTONDOWN ); message WM_NCLBUTTONDOWN ;
  99.   public
  100.     { Public declarations }
  101.     AddNew: boolean;
  102.   end;
  103.  
  104.   function UserInfo(var CurrSelServer: TibcServerNode;
  105.     const CurrSelUser: string;
  106.     const AddNew: boolean = false): boolean;
  107.  
  108. implementation
  109.  
  110. uses
  111.   IB, frmuMessage, zluGlobal, zluContextHelp, zluUtility, frmuMain, IBErrorCodes;
  112.  
  113. {$R *.DFM}
  114.  
  115. const
  116.   DUMMY_PASSWORD = 'TheyKilledKennyAgain';
  117.  
  118.  
  119. {****************************************************************
  120. *
  121. *  U s e r I n f o ( )
  122. *
  123. ****************************************************************
  124. *  Author: The Client Server Factory Inc.
  125. *  Date:   March 1, 1999
  126. *
  127. *  Input:  CurrSelServer - The currently selected server
  128. *          CurrSelUser   - The currently selected username if any,
  129. *                          else ''
  130. *
  131. *  Return: Boolean - Indicates the success/failure of the operation
  132. *
  133. *  Description:  Creates an instance of TIBSecurityService, and establishes
  134. *                a connection to the server. If it is successful it also
  135. *                creates an instance of the User Information form
  136. *                Once the form is closed it returns control to the
  137. *                calling function.
  138. *
  139. *****************************************************************
  140. * Revisions:
  141. *
  142. *****************************************************************}
  143. function UserInfo(var CurrSelServer: TibcServerNode;
  144.   const CurrSelUser: string;
  145.   const AddNew: boolean = false): boolean;
  146. var
  147.   frmUserInfo: TfrmUserInfo;
  148.   lSecurityService: TIBSecurityService;
  149. begin
  150.   lSecurityService := TIBSecurityService.Create(nil);
  151.   try
  152.     try
  153.       // fill in security service details
  154.       lSecurityService.LoginPrompt := false;
  155.       lSecurityService.ServerName := CurrSelServer.Server.ServerName;
  156.       lSecurityService.Protocol := CurrSelServer.Server.Protocol;
  157.       lSecurityService.Params.Assign(CurrSelServer.Server.Params);
  158.       lSecurityService.Attach();       // attach to server
  159.     except
  160.       on E:EIBError do                 // if an exception occurs then trap it
  161.       begin                            // and show error message
  162.         DisplayMsg(ERR_SERVER_LOGIN, E.Message);
  163.         result := false;
  164.         if (E.IBErrorCode = isc_lost_db_connection) or
  165.            (E.IBErrorCode = isc_unavailable) or
  166.            (E.IBErrorCode = isc_network_error) then
  167.           frmMain.SetErrorState;
  168.         Exit;
  169.       end;
  170.     end;
  171.  
  172.     // if attached to server successfully
  173.     if lSecurityService.Active = true then
  174.     begin
  175.       // create an instance of the user info form
  176.       frmUserInfo := TfrmUserInfo.Create(Application);
  177.       try
  178.         frmUserInfo.FSecurityService := lSecurityService;
  179.         frmUserInfo.FCurrSelServer := CurrSelServer;
  180.         frmUserInfo.GetUserList();     // get a list of users in security database
  181.         frmUserInfo.GetUsers;
  182.         frmUserInfo.cbUsername.Hint := frmUserInfo.cbUsername.Text;
  183.  
  184.         // if there is a valid user
  185.         if CurrSelUser <> '' then
  186.         begin
  187.           // show user along with user info
  188.           frmUserInfo.cbUsername.ItemIndex := frmUserInfo.cbUsername.Items.IndexOf(CurrSelUser);
  189.           frmUserInfo.cbUsernameClick(frmUserInfo);
  190.  
  191.           if UpperCase(CurrSelUser) = 'SYSDBA' then
  192.             frmUserInfo.btnDelete.Enabled := false;
  193.         end;
  194.         frmUserInfo.AddNew := AddNew;
  195.         frmUserInfo.ShowModal;
  196.         Application.ProcessMessages;
  197.       finally
  198.         // deallocate memory
  199.         frmUserInfo.Free;
  200.       end;
  201.       result := true;
  202.     end
  203.     else
  204.       result := false;
  205.   finally
  206.     // if attached to server then detach
  207.     if lSecurityService.Active then
  208.       lSecurityService.Detach();
  209.     // deallocate memory
  210.     lSecurityService.Free();
  211.   end;
  212. end;
  213.  
  214. function TfrmUserInfo.FormHelp(Command: Word; Data: Integer;
  215.   var CallHelp: Boolean): Boolean;
  216. begin
  217.   CallHelp := False;
  218.   // call WinHelp and show server security topic
  219.   Result := WinHelp(WindowHandle,CONTEXT_HELP_FILE,HELP_CONTEXT,SERVER_SECURITY);
  220. end;
  221.  
  222. {****************************************************************
  223. *
  224. *  b t n A p p l y C l i c k ( )
  225. *
  226. ****************************************************************
  227. *  Author: The Client Server Factory Inc.
  228. *  Date:   March 1, 1999
  229. *
  230. *  Input:  Sender - The object initiating the event
  231. *
  232. *  Return: None
  233. *
  234. *  Description:  Adds/Modifies a user in the security database
  235. *                depending on the current mode (insert/edit)
  236. *                which is determined by the visibility of edtUsername
  237. *
  238. *****************************************************************
  239. * Revisions:
  240. *
  241. *****************************************************************}
  242. procedure TfrmUserInfo.btnApplyClick(Sender: TObject);
  243. var
  244.   lUserCount : Integer;
  245. begin
  246.   { Get the information first }
  247.   FPassword := edtPassword.Text;
  248.   FConfirmPassword := edtConfirmPassword.Text;
  249.   lUserCount := -1;  
  250.   // if all fields pass validity checks
  251.   if VerifyInputData() then
  252.   begin
  253.      Screen.Cursor := crHourGlass;     // change cursor to hourglass
  254.     try
  255.       // if not attached to server then attach
  256.       if not FSecurityService.Active then
  257.       begin
  258.         FSecurityService.Params.Clear;
  259.         FSecurityService.Params.Assign(FCurrSelServer.Server.Params);
  260.         FSecurityService.Attach();
  261.       end;
  262.  
  263.       // if attached to server
  264.       if FSecurityService.Active then
  265.       begin
  266.         // if the username edit box is visible
  267.         // then this is a new user being added to the security database
  268.         if edtUsername.Visible then
  269.         begin
  270.           // fill in security service details regarding user
  271.           FSecurityService.UserName := edtUsername.Text;
  272.           FSecurityService.Password := edtPassword.Text;
  273.           FSecurityService.FirstName := edtFName.Text;
  274.           FSecurityService.MiddleName := edtMName.Text;
  275.           FSecurityService.LastName := edtLName.Text;
  276.           try
  277.             // try adding user to security database
  278.             FSecurityService.AddUser();
  279.             while (FSecurityService.IsServiceRunning) and (not gApplShutdown) do
  280.             begin
  281.               Application.ProcessMessages;
  282.             end;
  283.                                                                               
  284.             // add to FUserInfo cache
  285.             // first find last user
  286.             lUserCount := 0;
  287.             while (lUserCount < Length(FUserInfo)) and (FUserInfo[lUserCount].Username <> '') do
  288.             begin
  289.               Inc(lUserCount);
  290.             end;
  291.  
  292.             // if count is less then length then a hole was found
  293.             // fill hole with new user infomation
  294.             if lUserCount < Length(FUserInfo) then
  295.             begin
  296.               FUserInfo[lUserCount].Username := UpperCase(edtUsername.Text);
  297.               FUserInfo[lUserCount].FirstName := edtFName.Text;
  298.               FUserInfo[lUserCount].MiddleName := edtMName.Text;
  299.               FUserInfo[lUserCount].LastName := edtLName.Text;
  300.             end
  301.             else                       // if no hole found then add to end
  302.             begin
  303.               if lUserCount >= Length(FUserInfo) then
  304.                 SetLength(FUserInfo, lUserCount + 10);
  305.  
  306.               FUserInfo[lUserCount].Username := UpperCase(edtUsername.Text);
  307.               FUserInfo[lUserCount].FirstName := edtFName.Text;
  308.               FUserInfo[lUserCount].MiddleName := edtMName.Text;
  309.               FUserInfo[lUserCount].LastName := edtLName.Text;
  310.             end;
  311.           except                       // if an exception occurs then trap it
  312.             on E:EIBError do           // and show error message
  313.             begin
  314.               DisplayMsg(ERR_ADD_USER, E.Message);
  315.               if (E.IBErrorCode = isc_lost_db_connection) or
  316.                  (E.IBErrorCode = isc_unavailable) or
  317.                  (E.IBErrorCode = isc_network_error) then
  318.                 frmMain.SetErrorState;
  319.               SetErrorState;
  320.               Screen.Cursor := crDefault;    // change cursor back to default              
  321.               exit;
  322.             end;
  323.           end;
  324.         end
  325.         else
  326.         begin
  327.           // if edit box isn't visible then the current
  328.           // user is being modified in the security database
  329.  
  330.           // use current username
  331.           FSecurityService.UserName := cbUsername.Text;
  332.  
  333.           // find index in list
  334.           lUserCount := cbUsername.Items.IndexOf(cbUsername.Text);
  335.  
  336.           // fill in security service details regarding user
  337.           if edtPassword.Text <> DUMMY_PASSWORD then
  338.             FSecurityService.Password := edtPassword.Text;
  339.  
  340.           // IBX cannot modify an existing field to blank so
  341.           // if field is blank make it a space
  342.           if edtFName.Text = '' then edtFName.Text := ' ';
  343.           if edtMName.Text = '' then edtMName.Text := ' ';
  344.           if edtLName.Text = '' then edtLName.Text := ' ';
  345.           FSecurityService.FirstName := edtFName.Text;
  346.           FSecurityService.MiddleName := edtMName.Text;
  347.           FSecurityService.LastName := edtLName.Text;
  348.           if edtFName.Text = ' ' then edtFName.Text := '';
  349.           if edtMName.Text = ' ' then edtMName.Text := '';
  350.           if edtLName.Text = ' ' then edtLName.Text := '';
  351.  
  352.           try
  353.             // try modifying the user in the security database
  354.             FSecurityService.ModifyUser();
  355.             while (FSecurityService.IsServiceRunning) and (not gApplShutdown) do
  356.             begin
  357.               Application.ProcessMessages;
  358.             end;
  359.  
  360.             // if the user being modified is currently connected
  361.             if FCurrSelServer.UserName = cbUsername.Text then
  362.             begin
  363.               // disconnect from the server
  364.               // and reconnect using the new user information
  365.               if edtPassword.Text <> DUMMY_PASSWORD then
  366.                 FCurrSelServer.Password := edtPassword.Text;
  367.               FCurrSelServer.Server.Detach();
  368.               FCurrSelServer.Server.Params.Clear;
  369.               FCurrSelServer.Server.Params.Add(Format('isc_spb_user_name=%s',[FCurrSelServer.UserName]));
  370.               FCurrSelServer.Server.Params.Add(Format('isc_spb_password=%s',[FCurrSelServer.Password]));
  371.               FCurrSelServer.Server.Attach();
  372.               Application.ProcessMessages;
  373.  
  374.               if FSecurityService.Active then
  375.                 FSecurityService.Detach();
  376.  
  377.               FSecurityService.Params.Clear;
  378.               FSecurityService.Params.Assign(FCurrSelServer.Server.Params);
  379.               FSecurityService.Attach();
  380.             end;
  381.  
  382.             FUserInfo[lUserCount].FirstName := edtFName.Text;
  383.             FUserInfo[lUserCount].MiddleName := edtMName.Text;
  384.             FUserInfo[lUserCount].LastName := edtLName.Text;
  385.  
  386.           except                       // if an exception occurs then trap it
  387.             on E:EIBError do           // and show error message
  388.             begin
  389.               DisplayMsg(ERR_MODIFY_USER, E.Message);
  390.               if (E.IBErrorCode = isc_lost_db_connection) or
  391.                  (E.IBErrorCode = isc_unavailable) or
  392.                  (E.IBErrorCode = isc_network_error) then
  393.                 frmMain.SetErrorState;
  394.               Screen.Cursor := crDefault;    // change cursor back to default
  395.               SetErrorState;
  396.               exit;
  397.             end;
  398.           end;
  399.         end;
  400.       end;
  401.     finally
  402.       begin
  403.         // change form back to the display user state
  404.         cbUserName.Visible := true;
  405.         edtUsername.Visible := false;
  406.         btnNew.Enabled := true;
  407.         btnApply.Enabled := false;
  408.         btnDelete.Enabled := true;
  409.         btnClose.Visible := true;
  410.         btnCancel.Visible := false;
  411.         lblUserName.FocusControl := cbUserName;
  412.         cbUserName.SetFocus;
  413.         GetUsers (lUserCount);
  414.         Screen.Cursor := crDefault;    // change cursor back to default
  415.       end;
  416.     end;
  417.   end;
  418. end;
  419.  
  420. procedure TfrmUserInfo.btnCancelClick(Sender: TObject);
  421. begin
  422.   // change form back to the display user state
  423.   cbUserName.Visible := true;
  424.   edtUsername.Visible := false;
  425.   btnNew.Enabled := true;
  426.   btnApply.Enabled := false;
  427.   btnDelete.Enabled := true;
  428.   btnClose.Visible := true;
  429.   btnCancel.Visible := false;
  430.   lblUserName.FocusControl := cbUserName;
  431.   cbUserName.SetFocus;
  432.   //GetUserList;
  433.   GetUsers;
  434. end;
  435.  
  436. procedure TfrmUserInfo.btnCloseClick(Sender: TObject);
  437. begin
  438.   ModalResult := mrCancel;
  439. end;
  440.  
  441. {****************************************************************
  442. *
  443. *  b t n D e l e t e C l i c k ( )
  444. *
  445. ****************************************************************
  446. *  Author: The Client Server Factory Inc.
  447. *  Date:   March 1, 1999
  448. *
  449. *  Input:  Sender - The object initiating the event
  450. *
  451. *  Return: None
  452. *
  453. *  Description:  Deletes a user from the security database
  454. *                after confirmation from the user
  455. *
  456. *****************************************************************
  457. * Revisions:
  458. *
  459. *****************************************************************}
  460. procedure TfrmUserInfo.btnDeleteClick(Sender: TObject);
  461. var
  462.   lUserCount : Integer;
  463.   i          : Integer;
  464.   lConfirmed : Boolean;
  465. begin
  466.   lConfirmed := False;
  467.  
  468.   if not btnDelete.Enabled then
  469.     exit;
  470.   // show confirmation dialog
  471.   if cbUsername.Text = UpperCase(FCurrSelServer.UserName) then
  472.   begin
  473.     if MessageDlg(Format('The user you wish to delete is the same user you are logged into the server as.%sAre you sure that you want to delete user: %s?',
  474.         [#13#10,cbUsername.Text]),mtConfirmation, mbOkCancel, 0) = mrOK then
  475.       lConfirmed := True;
  476.   end
  477.   else
  478.   begin
  479.     if MessageDlg(Format('Are you sure that you want to delete user: %s?',
  480.         [cbUsername.Text]),mtConfirmation, mbOkCancel, 0) = mrOK then
  481.       lConfirmed := True;
  482.   end;
  483.  
  484.   if lConfirmed then
  485.   begin
  486.     // if the user chooses to proceed
  487.     try
  488.       Screen.Cursor := crHourGlass;    // change cursor to hourglass
  489.       try
  490.         // if security server is not attached
  491.         if not FSecurityService.Active then
  492.         begin
  493.           // attach to server
  494.           FSecurityService.Params.Clear;
  495.           FSecurityService.Params.Assign(FCurrSelServer.Server.Params);
  496.           FSecurityService.Attach();
  497.         end;
  498.  
  499.         // if security service is attached
  500.         if FSecurityService.Active then
  501.         begin
  502.           // delete user
  503.           FSecurityService.UserName := cbUsername.Text;
  504.           FSecurityService.DeleteUser();
  505.         end;
  506.  
  507.         while (FSecurityService.IsServiceRunning) and (not gApplShutdown) do
  508.         begin
  509.           Application.ProcessMessages;
  510.         end;
  511.  
  512.         // delete user from cache
  513.         i := cbUsername.Items.IndexOf(cbUsername.Text);
  514.         if i <> -1 then
  515.         begin
  516.           lUserCount := i;
  517.           while lUserCount < High(FUserInfo) do
  518.           begin
  519.             FUserInfo[lUserCount] := FUserInfo[lUserCount+1];
  520.             Inc(lUserCount);
  521.           end;
  522.         end;
  523.       except                           // if an exception occurs then trap it
  524.         on E:EIBError do               // and display an error message
  525.         begin
  526.           DisplayMsg(ERR_DELETE_USER, E.Message);
  527.           if (E.IBErrorCode = isc_lost_db_connection) or
  528.              (E.IBErrorCode = isc_unavailable) or
  529.              (E.IBErrorCode = isc_network_error) then
  530.             frmMain.SetErrorState;
  531.           SetErrorState;
  532.           Screen.Cursor := crDefault;    // change cursor back to default          
  533.           exit;
  534.         end;
  535.       end;
  536.     finally
  537.       begin
  538.         GetUsers;
  539.         Screen.Cursor := crDefault;    // change hour glass to default
  540.       end;
  541.     end;
  542.   end;
  543. end;
  544.  
  545. {****************************************************************
  546. *
  547. *  b t n N e w C l i c k ( )
  548. *
  549. ****************************************************************
  550. *  Author: The Client Server Factory Inc.
  551. *  Date:   March 1, 1999
  552. *
  553. *  Input:  Sender - The object initiating the event
  554. *
  555. *  Return: None
  556. *
  557. *  Description:  Initializes the forms controls in order to receive
  558. *                new user information
  559. *
  560. *****************************************************************
  561. * Revisions:
  562. *
  563. *****************************************************************}
  564. procedure TfrmUserInfo.btnNewClick(Sender: TObject);
  565. begin
  566.   // change form to the add user state
  567.   cbUsername.Visible := false;
  568.   edtUsername.Visible := true;
  569.   edtUserName.Text := '';
  570.   edtPassword.Text := '';
  571.   edtConfirmPassword.Text := '';
  572.   edtFName.Text := '';
  573.   edtMName.Text := '';
  574.   edtLName.Text := '';
  575.   cbUsername.Enabled := true;
  576.   cbUserName.Color := clWhite;
  577.   edtPassword.Enabled := true;
  578.   edtPassword.Color := clWhite;
  579.   edtConfirmPassword.Enabled := true;
  580.   edtConfirmPassword.Color := clWhite;
  581.   edtFName.Enabled := true;
  582.   edtFName.Color := clWhite;
  583.   edtMName.Enabled := true;
  584.   edtMName.Color := clWhite;
  585.   edtLName.Enabled := true;
  586.   edtLName.Color := clWhite;
  587.   btnNew.Enabled := false;
  588.   btnApply.Enabled := false;
  589.   btnDelete.Enabled := false;
  590.   btnCancel.Visible := true;
  591.   btnClose.Visible := false;
  592.   lblUserName.FocusControl := edtUserName;
  593.   edtUserName.SetFocus;
  594. end;
  595.  
  596. procedure TfrmUserInfo.cbUsernameChange(Sender: TObject);
  597. begin
  598.   if UpperCase (cbUserName.Text) = 'SYSDBA' then
  599.     btnDelete.Enabled := false
  600.   else
  601.     btnDelete.Enabled := true;
  602.   cbUsername.Hint := cbUsername.Text;  // assign current name in combo to hint
  603. end;
  604.  
  605. procedure TfrmUserInfo.cbUsernameClick(Sender: TObject);
  606. begin
  607.   if GetUserInfo() then                // get user info
  608.   begin                                // if info was returned
  609.     btnNew.Enabled := true;            // change form to display user state
  610.     btnApply.Enabled := false;
  611.     btnDelete.Enabled := true;
  612.     btnCancel.Visible := false;
  613.     btnClose.Visible := true;
  614.   end
  615.   else                                 // otherwise change form to display
  616.   begin                                // user state and
  617.     btnNew.Enabled := true;
  618.     btnApply.Enabled := false;
  619.     btnDelete.Enabled := false;        // disable the delete buttom
  620.     btnCancel.Visible := false;
  621.     btnClose.Visible := true;
  622.   end;
  623. end;
  624.  
  625. procedure TfrmUserInfo.edtConfirmPasswordChange(Sender: TObject);
  626. begin
  627.   if edtConfirmPassword.Text = DUMMY_PASSWORD then
  628.     exit;                              // set confirm password
  629.   FConfirmPassword := edtConfirmPassword.Text;
  630.   if (edtUsername.Text <> '') and (edtPassword.Text <> '') and
  631.     (edtConfirmPassword.Text <> '') then
  632.     btnApply.Enabled := true;          // enable the password if username changes
  633. end;
  634.  
  635. procedure TfrmUserInfo.edtFNameChange(Sender: TObject);
  636. begin
  637.   btnApply.Enabled := true;            // enable the apply button if first name changes
  638. end;
  639.  
  640. procedure TfrmUserInfo.edtLNameChange(Sender: TObject);
  641. begin
  642.   btnApply.Enabled := true;            // enable the apply button if last name changes
  643. end;
  644.  
  645. procedure TfrmUserInfo.edtMNameChange(Sender: TObject);
  646. begin
  647.   btnApply.Enabled := true;            // enable the apply button if middle name changes
  648. end;
  649.  
  650. procedure TfrmUserInfo.edtPasswordChange(Sender: TObject);
  651. begin
  652.   if edtPassword.GetTextLen > 0 then
  653.     btnApply.Enabled := true;
  654. end;
  655.  
  656. procedure TfrmUserInfo.edtUsernameChange(Sender: TObject);
  657. begin
  658.   if edtUserName.GetTextLen > 0 then
  659.     btnApply.Enabled := true;
  660. end;
  661.  
  662. {****************************************************************
  663. *
  664. *  G e t U s e r I n f o ( )
  665. *
  666. ****************************************************************
  667. *  Author: The Client Server Factory Inc.
  668. *  Date:   March 1, 1999
  669. *
  670. *  Input:  None
  671. *
  672. *  Return: Boolean - Indicates the success/failure of the operation
  673. *
  674. *  Description:  Retrieves account information for a single user
  675. *
  676. *****************************************************************
  677. * Revisions:
  678. *
  679. *****************************************************************}
  680. function TfrmUserInfo.GetUserInfo(): boolean;
  681. var
  682.   lUserInfo: TUserInfo;
  683.   i : Integer;
  684. begin
  685.   Result := True;
  686.   try
  687.     Screen.Cursor := crHourGlass;
  688.     i := cbUsername.Items.IndexOf(cbUsername.Text);
  689.     if i <> -1 then
  690.     begin
  691.       lUserInfo := FUserInfo[i];
  692.       edtPassword.Text := DUMMY_PASSWORD;
  693.       FPassword := '';
  694.       edtConfirmPassword.text := DUMMY_PASSWORD;
  695.       FConfirmPassword := '';
  696.       edtFName.Text := lUserInfo.FirstName;
  697.       edtMName.Text := lUserInfo.MiddleName;
  698.       edtLName.Text := lUserInfo.LastName;
  699.     end
  700.     else
  701.       Result := False;
  702.   finally
  703.     Screen.Cursor := crDefault;      // change cursor to default
  704.   end;
  705. end;
  706.  
  707. {****************************************************************
  708. *
  709. *  G e t U s e r L i s t ( )
  710. *
  711. ****************************************************************
  712. *  Author: The Client Server Factory Inc.
  713. *  Date:   March 1, 1999
  714. *
  715. *  Input:  None
  716. *
  717. *  Return: Boolean - Indicates the success/failure of the operation
  718. *
  719. *  Description:  Retrieves a list of existing users in the security
  720. *                database and enables/disables the appropriate
  721. *                controls based on the success/failure of the operation
  722. *
  723. *****************************************************************
  724. * Revisions:
  725. *
  726. *****************************************************************}
  727. function TfrmUserInfo.GetUserList(): boolean;
  728. var
  729.   lUserCount: integer;
  730.   lPrevUsername : String;
  731. begin
  732.   result := true;
  733.   try
  734.     Screen.Cursor := crHourGlass;      // change cursor to hourglass
  735.  
  736.     cbUsername.Items.Clear;            // clear all items from combo box
  737.     try
  738.       // if security service isn't attached then attach
  739.       if not FSecurityService.Active then
  740.       begin
  741.         FSecurityService.Params.Clear;
  742.         FSecurityService.Params.Assign(FCurrSelServer.Server.Params);
  743.         FSecurityService.Attach();
  744.       end;
  745.  
  746.       // if security service is attached then get user info
  747.       if FSecurityService.Active then
  748.         FSecurityService.DisplayUsers();
  749.  
  750.       while (FSecurityService.IsServiceRunning) and (not gApplShutdown) do
  751.       begin
  752.         Application.ProcessMessages;
  753.       end;
  754.  
  755.       lUserCount := 0;
  756.       lPrevUsername := '';
  757.       FUserInfo[lUserCount] := FSecurityService.UserInfo[lUserCount];
  758.  
  759.       // go through list of users and add to combo box
  760.       while (FUserInfo[lUserCount].UserName <> '') and (FUserInfo[lUserCount].UserName <> lPrevUsername) do
  761.       begin
  762.         lPrevUsername := FUserInfo[lUserCount].UserName;
  763.         inc(lUserCount);
  764.  
  765.         if (lUserCount >= Length(FUserInfo)) then
  766.           SetLength(FUserInfo, (lUserCount + 10));
  767.  
  768.         if lPrevUsername <> FSecurityService.UserInfo[lUserCount].Username then
  769.           FUserInfo[lUserCount] := FSecurityService.UserInfo[lUserCount];
  770.       end;
  771.  
  772.     except                             // if an exception occurs then trap it
  773.       on E:EIBError do                 // and show error message
  774.       begin
  775.         DisplayMsg(ERR_GET_USERS, E.Message);
  776.         result := false;
  777.         if (E.IBErrorCode = isc_lost_db_connection) or
  778.            (E.IBErrorCode = isc_unavailable) or
  779.            (E.IBErrorCode = isc_network_error) then
  780.           frmMain.SetErrorState;
  781.         SetErrorState;
  782.       end;
  783.     end;
  784.   finally
  785.     Screen.Cursor := crDefault;        // change cursor to default
  786.   end;
  787. end;
  788.  
  789. {****************************************************************
  790. *
  791. *  V e r i f y I n p u t D a t a ( )
  792. *
  793. ****************************************************************
  794. *  Author: The Client Server Factory Inc.
  795. *  Date:   March 1, 1999
  796. *
  797. *  Input:  None
  798. *
  799. *  Return: Boolean - Indicates the success/failure of the operation
  800. *
  801. *  Description:  Performs some basic validation on data entered by
  802. *                the user
  803. *
  804. *****************************************************************
  805. * Revisions:
  806. *
  807. *****************************************************************}
  808. function TfrmUserInfo.VerifyInputData(): boolean;
  809. var
  810.   i: integer;
  811. begin
  812.   result := true;
  813.  
  814.   // if the form is in the add user state
  815.   if edtUsername.Visible then
  816.   begin
  817.     // check if any data was entered in the username edit box
  818.     if (edtUsername.Text = '') or (edtUsername.Text = ' ') then
  819.     begin                              // if not then show
  820.       DisplayMsg(ERR_USERNAME,'');     // error message
  821.       edtUsername.SetFocus;            // and give the control focus
  822.       result := false;
  823.       btnApply.Enabled := false;      
  824.       Exit;
  825.     end;
  826.  
  827.     // check if a password was supplied or if it's been changed from the dummy password
  828.     if (FPassword = '') or (FPassword = ' ') or (FPassword = DUMMY_PASSWORD) then
  829.     begin                              // if not then show
  830.       DisplayMsg(ERR_PASSWORD,'');     // error message
  831.       edtPassword.SetFocus;            // and give the control focus
  832.       result := false;
  833.       btnApply.Enabled := false;      
  834.       Exit;
  835.     end;
  836.   end;
  837.  
  838.   // check if the password and confirmation password are the same
  839.   i := CompareStr(FPassword,FConfirmPassword);
  840.   if i <> 0 then
  841.   begin                                // if not then show error message
  842.     DisplayMsg(ERR_PASSWORD_MISSMATCH,'');
  843.     edtPassword.Text := DUMMY_PASSWORD;
  844.     edtConfirmPassword.Text := DUMMY_PASSWORD;
  845.     edtPassword.SetFocus;       // and give the control focus
  846.     btnApply.Enabled := false;
  847.     result := false;
  848.   end;
  849. end;
  850.  
  851. procedure TfrmUserInfo.GetUsers(const idx: integer = -1);
  852. var
  853.   lUserCount : Integer;
  854. begin
  855.   try
  856.     lUserCount := 0;
  857.     cbUsername.Items.Clear;
  858.  
  859.     while (lUserCount <= High(FUserInfo)) and (FUserInfo[lUserCount].Username <> '') do
  860.     begin
  861.       cbUsername.Items.Add(FUserInfo[lUserCount].Username);
  862.       Inc(lUserCount);
  863.     end;
  864.  
  865.     if cbUsername.Items.Count > 0 then // if there are users then
  866.     begin                              // change form to display user state
  867.       btnDelete.Enabled := true;
  868.       cbUsername.Enabled := true;
  869.       cbUserName.Color := clWhite;
  870.       edtPassword.Enabled := true;
  871.       edtPassword.Color := clWhite;
  872.       edtConfirmPassword.Enabled := true;
  873.       edtConfirmPassword.Color := clWhite;
  874.       edtFName.Enabled := true;
  875.       edtFName.Color := clWhite;
  876.       edtMName.Enabled := true;
  877.       edtMName.Color := clWhite;
  878.       edtLName.Enabled := true;
  879.       edtLName.Color := clWhite;
  880.       if idx >= 0 then
  881.         cbUsername.ItemIndex := idx
  882.       else
  883.         cbUsername.ItemIndex := 0;      
  884.       cbUsernameClick(Self);
  885.     end
  886.     else                               // otherwise change form to display
  887.     begin                              // user state and disable the
  888.       btnDelete.Enabled := false;      // delete button
  889.       cbUsername.Enabled := false;     // also grey out user info fields
  890.       cbUserName.Color := clSilver;
  891.       edtPassword.Enabled := false;
  892.       edtPassword.Color := clSilver;
  893.       edtConfirmPassword.Enabled := false;
  894.       edtConfirmPassword.Color := clSilver;
  895.       edtFName.Enabled := false;
  896.       edtFName.Color := clSilver;
  897.       edtMName.Enabled := false;
  898.       edtMName.Color := clSilver;
  899.       edtLName.Enabled := false;
  900.       edtLName.Color := clSilver;
  901.       cbUsernameClick(Self);
  902.     end;
  903.   finally
  904.  
  905.   end;
  906. end;
  907.  
  908. procedure TfrmUserInfo.FormCreate(Sender: TObject);
  909. begin
  910.   inherited;
  911.   SetLength(FUserInfo, 10);
  912. end;
  913.  
  914. procedure TfrmUserInfo.WMNCLButtonDown( var Message: TWMNCLButtonDown );
  915. var
  916.   ScreenPt: TPoint;
  917.   ClientPt: TPoint;
  918. begin
  919.   ScreenPt.X := Message.XCursor;
  920.   ScreenPt.Y := Message.YCursor;
  921.   ClientPt := ScreenToClient( ScreenPt );
  922.   if( ClientPt.X > Width-45 )and (ClientPt.X < Width-29) then
  923.    begin
  924.     WinHelp(WindowHandle,CONTEXT_HELP_FILE,HELP_CONTEXT,SERVER_SECURITY);
  925.     Message.Result := 0;
  926.   end else
  927.    inherited;
  928. end;
  929.  
  930. procedure TfrmUserInfo.DeleteUserUpdate(Sender: TObject);
  931. begin
  932.   inherited;
  933.   (Sender as TAction).Enabled := (UpperCase(CbUserName.Text) = 'SYSDBA');
  934. end;
  935.  
  936. procedure TfrmUserInfo.FormShow(Sender: TObject);
  937. begin
  938.   inherited;
  939.   if AddNew then
  940.     btnNew.Click;
  941.   cbUserNameChange(Sender);
  942. end;
  943.  
  944. end.
  945.