{*******************************************************}
{ }
{ IBAccess }
{ User manager dialog }
{ }
{ Author: }
{ Toni Martir }
{ http://www.ibaccess.org }
{ e-mail: toni@pala.com }
{ }
{ OpenSource license (MPL) }
{ }
{*******************************************************}
unit userman;
interface
uses
SysUtils, Classes, QForms,
diaser, Db, IBDatabase, IBServices, ibmanclx,
rpibdb,ibacutils,variants,
{$IFDEF MSWINDOWS}
registry,windows,
{$ENDIF}
IBSQL,ibacconst,dbclient, QControls, QGrids, QDBGrids, QStdCtrls,
QDialogs, QButtons;
type
TFUserman = class(TFService)
GType: TGroupBox;
RadioService: TRadioButton;
RadioCommandline: TRadioButton;
IbMan1: TIbManagerCLX;
IBSec: TIBSecurityService;
Label5: TLabel;
Erole: TEdit;
DBase: TIBDatabase;
Tran1: TIBTransaction;
IBSQL1: TIBSQL;
DMemtable: TClientdataset;
DataSource1: TDataSource;
GUsers: TGroupBox;
DBGrid1: TDBGrid;
BModi: TBitBtn;
BDelete: TBitBtn;
Bnew: TBitBtn;
DMemtableUSER_NAME: TStringField;
DMemtableFIRST_NAME: TStringField;
DMemtableMIDDLE_NAME: TStringField;
DMemtableLAST_NAME: TStringField;
DMemtableUID: TIntegerField;
DMemtableGID: TIntegerField;
procedure RadioCommandlineClick(Sender: TObject);
procedure BOKClick(Sender: TObject);
procedure BnewClick(Sender: TObject);
procedure BDeleteClick(Sender: TObject);
private
{ Private declarations }
procedure FillIBSecparams;
protected
procedure OnConChange(Sender:TObject);override;
public
{ Public declarations }
role:string;
end;
var
FUserman: TFUserman;
procedure ManageIBUsers(var username,password,role,server:string;var protocol:TRpIBXProtocol;dbconf:TRpDBIBconf);
implementation
uses ibnewus;
{$R *.xfm}
procedure ManageIBUsers(var username,password,role,server:string;var protocol:TRpIBXProtocol;dbconf:TRpDBIBconf);
var
dia:TFUserman;
begin
dia:=TFUserman.create(Application);
try
dia.Eusername.text:=username;
dia.EPassword.text:=password;
dia.Erole.text:=role;
dia.EServer.text:=server;
dia.dbconf:=dbconf;
dia.EServerChange(dia);
dia.comboprotocol.itemindex:=integer(protocol);
dia.Radiocommandline.checked:=ibmanclx.globalusecommandline;
dia.showmodal;
if dia.executed then
begin
username:=dia.USername;
password:=dia.Password;
role:=dia.role;
server:=dia.Server;
protocol:=dia.protocol;
end;
finally
dia.free;
end;
end;
procedure TFUserman.RadioCommandlineClick(Sender: TObject);
var
{$IFDEF MSWINDOWS}
reg:TRegistry;
{$ENDIF}
epath:string;
begin
inherited;
epath:='';
// try to find the user database
Label1.Visible:=RadioCommandline.checked;
EBase.Visible:=RadioCommandline.checked;
if Radiocommandline.checked then
begin
{$IFDEF MSWINDOWS}
reg:=TRegistry.create;
try
Reg.Access:=KEY_READ;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
if Length(Trim(EServer.text))>0 then
if Not reg.RegistryConnect('\\'+EServer.text) then
exit;
if Not reg.OpenKey('Software\InterBase Corp\InterBase\CurrentVersion',false) then
if Not reg.OpenKey('Software\Borland\InterBase\CurrentVersion',false) then
exit;
epath:=reg.ReadString('RootDirectory');
if Length(epath)<=0 then
exit;
if epath[length(epath)]='\' then
epath:=Copy(epath,1,Length(epath)-1);
epath:=epath+'\isc4.gdb';
EBase.text:=epath;
finally
reg.free;
end;
{$ENDIF}
{$IFDEF LINUX}
epath:='';
if Length(ibman1.servername)>3 then
begin
epath:=Copy(ibman1.servername,1,Length(ibman1.servername)-3);
epath:=epath+'isc4.gdb';
end;
EBase.text:=epath;
{$ENDIF}
end;
end;
procedure TFUserman.FillIBSecparams;
begin
IBSec.Params.clear;
IBSec.params.add('user_name='+EUsername.text);
IBSec.params.add('password='+EPassword.text);
if length(Trim(ERole.text))>0 then
IBSec.params.add('sql_role_name='+ERole.text);
IBSec.ServerName:=Trim(EServer.Text);
if Length(IBSec.ServerName)=0 then
begin
IBSec.protocol:=Local;
end
else
begin
IBSec.protocol:=TProtocol(ComboProtocol.itemindex);
end;
end;
procedure TFUserman.BOKClick(Sender: TObject);
var
sql:string;
i:integer;
begin
inherited;
role:=ERole.text;
if Radiocommandline.checked then
begin
dbase.connected:=False;
dbase.Params.clear;
dbase.sqldialect:=3;
dbase.databasename:=BuildIBDatabaseName((Length(Trim(EServer.text))>0),TRpIBXProtocol(ComboProtocol.ItemIndex),EServer.Text,EBase.text);
dbase.params.add('user_name='+EUsername.text);
dbase.params.add('password='+EPassword.text);
if Length(Trim(Erole.text))>0 then
dbase.params.add('sql_role_name='+ERole.text);
dbase.connected:=true;
try
DMemTable.Active:=False;
DMemTable.Createdataset;
DMemTable.disablecontrols;
try
sql:='SELECT USER_NAME,FIRST_NAME,'+
'MIDDLE_NAME,LAST_NAME,UID,GID '+
'FROM USERS '+
' ORDER BY USER_NAME';
FillDataset(IBSQL1,Tran1,sql,DMemtable,nil);
DMemTable.first;
finally
DMemTable.enablecontrols;
end;
finally
dbase.connected:=false;
end;
GUsers.Visible:=True;
end
else
begin
FillIBSecParams;
IBSec.Attach;
try
IBSec.DisplayUsers;
finally
try
IBSec.Detach;
except
end;
end;
DMemtable.close;
DMemtable.Createdataset;
DMemtable.disablecontrols;
try
for i:=0 to IBSec.UserInfoCount-1 do
begin
DMemTable.Append;
try
DMemTableUSER_NAME.Value:=IBSec.UserInfo[i].UserName;
DMemTableFIRST_NAME.Value:=IBSec.UserInfo[i].FirstName;
DMemTableMIDDLE_NAME.Value:=IBSec.UserInfo[i].mIDDLEName;
DMemTableLAST_NAME.Value:=IBSec.UserInfo[i].lASTnAME;
DMemTableUID.Value:=IBSec.UserInfo[i].UserID;
DMemTableGID.Value:=IBSec.UserInfo[i].groupid;
DMemtable.post;
except
DMemTable.cancel;
raise;
end;
end;
DMemTable.first;
finally
DMemTable.enablecontrols;
end;
GUsers.visible:=true;
end;
end;
procedure TFUserman.OnConChange(Sender:TObject);
begin
inherited;
Gusers.visible:=false;
end;
procedure TFUserman.BnewClick(Sender: TObject);
var
dia:TFIBNewUser;
uid,gid:variant;
begin
if sender=BMODI then
if DMemtable.eof and dmemtable.bof then
exit;
dia:=TFIBNewUser.create(Application);
try
if Sender=BModi then
begin
dia.EUsername.text:=DmemTableUSER_NAME.asstring;
dia.EFirstname.text:=DmemTableFIRST_NAME.asstring;
dia.EMiddlename.text:=DmemTableMIDDLE_NAME.asstring;
dia.ELastname.text:=DmemTableLAST_NAME.asstring;
if DMemTableUID.Isnull then
dia.EUserID.text:=''
else
Dia.EUserID.Text:=DMemTableUId.AsString;
if DMemTableGID.Isnull then
dia.EGroupID.text:=''
else
Dia.EGroupID.Text:=DMemTableGId.AsString;
end
else
dia.EUsername.text:='ANewUser';
dia.caption:=SRpNewuser;
if Sender=BModi then
begin
dia.ActiveControl:=dia.EPassword;
dia.EUsername.readonly:=true;
dia.caption:=SRpModifyuser;
end;
dia.showmodal;
if dia.docreate then
begin
if RadioCOmmandline.checked then
begin
ibman1.serverpath:=ibmanclx.globalserverpath;
ibman1.filename:=BuildIBDatabaseName((Length(Trim(EServer.text))>0),TRpIBXProtocol(ComboProtocol.ItemIndex),EServer.Text,EBase.text);
ibman1.username:=EUsername.text;
ibman1.password:=EPassword.text;
uid:=null;
gid:=null;
if Length(Dia.EUserId.Text)>0 then
uid:=StrToInt(dia.EUserId.text);
if Length(Dia.EGroupId.Text)>0 then
gid:=StrToInt(dia.EGroupId.text);
if Sender=BModi then
ibman1.ModifyUser(dia.EUsername.text,dia.epassword.text,
dia.efirstname.text,dia.emiddlename.text,dia.elastname.text,uid,gid)
else
ibman1.AddUser(dia.EUsername.text,dia.epassword.text,
dia.efirstname.text,dia.emiddlename.text,dia.elastname.text,uid,gid);
end
else
begin
FillIBSecparams;
IBSec.Username:=dia.EUsername.Text;
IBSec.Password:=dia.EPassword.text;
IBSec.FirstName:=dia.EFirstname.text;
IBSec.MiddleName:=dia.EMiddlename.text;
IBSec.LastName:=dia.ELastname.text;
if Length(dia.EUserID.text)>0 then
IBSec.UserID:=StrToInt(dia.EUserID.text)
else
IBSec.UserID:=0;
if Length(dia.EGroupID.text)>0 then
IBSec.GroupID:=StrToInt(dia.EGroupID.text)
else
IBSec.UserID:=0;
IBSec.Attach;
try
if sender=BModi then
IBSec.Modifyuser
else
IBSec.Adduser;
finally
try
IBSec.Detach;
except
end;
end;
end;
BOKClick(Self);
end
finally
dia.free;
end;
end;
procedure TFUserman.BDeleteClick(Sender: TObject);
begin
if DMemtable.eof and dmemtable.bof then
exit;
if RadioCOmmandline.checked then
begin
ibman1.serverpath:=ibmanclx.globalserverpath;
ibman1.filename:=BuildIBDatabaseName((Length(Trim(EServer.text))>0),TRpIBXProtocol(ComboProtocol.ItemIndex),EServer.Text,EBase.text);
ibman1.username:=EUsername.text;
ibman1.password:=EPassword.text;
ibman1.DeleteUser(DMemtableUSER_NAME.AsString);
end
else
begin
FillIBSecparams;
IBSec.Username:=DMemtableUSER_NAME.AsString;
IBSec.Attach;
try
IBSec.DeleteUser
finally
try
IBSec.Detach;
except
end;
end;
end;
BOKClick(Self);
end;
end.