diff --git a/components/rx/rxfileutils.pas b/components/rx/rxfileutils.pas new file mode 100644 index 000000000..aea54e12a --- /dev/null +++ b/components/rx/rxfileutils.pas @@ -0,0 +1,131 @@ +unit rxFileUtils; + +{$mode objfpc}{$H+} + +interface + +uses + SysUtils; + +function GetFileOwnerUser(const SearchDomain, FileName:String):String; +procedure GetFileOwnerData(const SearchDomain, FileName:String;out UserName, DomainName:string); +implementation +uses +{$IFDEF WINDOWS} + Windows, +{$ELSE} +{$ENDIF} + FileUtil; + +{$IFDEF WINDOWS} +function LStrError(const Ernum: Longint; const UseUTF8: Boolean = False): string; +const + MAX_ERROR = 1024; +var + Tmp: string; + TmpW: widestring; +begin + Result := ' [' + IntToStr(Ernum) + ']: '; + if USEUtf8 then begin + SetLength(TmpW, MAX_ERROR); + SetLength(TmpW, FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM or + FORMAT_MESSAGE_IGNORE_INSERTS or + FORMAT_MESSAGE_ARGUMENT_ARRAY, + nil, Ernum, 0, @TmpW[1], MAX_ERROR, nil)); + Tmp := UTF8Encode(TmpW); + end else begin + SetLength(Tmp, MAX_ERROR); + SetLength(Tmp, FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or + FORMAT_MESSAGE_IGNORE_INSERTS or + FORMAT_MESSAGE_ARGUMENT_ARRAY, + nil, Ernum, 0, @Tmp[1], MAX_ERROR, nil)); + end; + if Length(Tmp) > 2 then + Delete(Tmp, Length(Tmp)-1, 2); + Result := Result + Tmp; +end; + +{ TODO -oalexs : In future need rewrite this code for fix mem leak } + +procedure GetFileNameOwner(const SearchDomain, FileName: String; out UserName, DomainName: string); +var + RCode, RC1:WINBOOL; + SDSize:DWORD; // Size of security descriptor + + FAccountName:PChar; // Account name + lngAccountLen:DWORD; // Length of account name + FDomainName:PChar; // Domain name + lngDomainLen:DWORD; // Length of domain name + + ptrUse:SID_NAME_USE; // Pointer to SID_NAME_USE + ptrOwner:PSID; + P:PByteArray; +begin + ptrOwner:=nil; + SDSize:=0; + P:=nil; + UserName:=''; + DomainName:=''; + + RCode := GetFileSecurity(PChar(FileName), OWNER_SECURITY_INFORMATION, nil, 0, @SDSize); + GetMem(P, SDSize); + FillChar(P^, SDSize, 0); + RCode := GetFileSecurity(PChar(FileName), OWNER_SECURITY_INFORMATION, Pointer(P), SDSize, @SDSize); + if not RCode then + raise Exception.Create(LStrError(GetLastError, true)); + + RCode := GetSecurityDescriptorOwner(Pointer(P), ptrOwner, @RC1); + if not RCode then + raise Exception.Create(LStrError(GetLastError, true)); + + lngAccountLen:=0; + lngDomainLen:=0; + RCode := LookupAccountSid(PChar(SearchDomain), ptrOwner, nil, lngAccountLen, nil, lngDomainLen, ptrUse); + //' Configure the strings' buffer sizes + GetMem(FAccountName, lngAccountLen); + FillChar(FAccountName^, lngAccountLen, 0); + GetMem(FDomainName, lngDomainLen); + FillChar(FDomainName^, lngDomainLen, 0); + + RCode:=LookupAccountSid(PChar(SearchDomain), ptrOwner, FAccountName, lngAccountLen, FDomainName, lngDomainLen, ptrUse); + + if not RCode then + raise Exception.Create(LStrError(GetLastError, true)); + + UserName:=FAccountName; + DomainName:=FDomainName; + + Freemem(P, SDSize); + Freemem(FAccountName, lngAccountLen); + Freemem(FDomainName, lngDomainLen); +end; +{$ELSE} +{$ENDIF} + +function GetFileOwnerUser(const SearchDomain, FileName: String): String; +var + S:string; +begin + {$IFDEF WINDOWS} + GetFileNameOwner(SearchDomain, FileName, Result, S); + Result:=UTF8Encode(Result); + {$ELSE} + Result:=''; + {$ENDIF} +end; + +procedure GetFileOwnerData(const SearchDomain, FileName: String; out UserName, + DomainName: string); +begin + {$IFDEF WINDOWS} + GetFileNameOwner(SearchDomain, FileName, UserName, DomainName); + UserName:=UTF8Encode(UserName); + DomainName:=UTF8Encode(DomainName); + {$ELSE} + UserName:=''; + DomainName:=''; + {$ENDIF} +end; + +end. + diff --git a/components/rx/rxnew.lpk b/components/rx/rxnew.lpk index dd44e86ca..90c02226a 100644 --- a/components/rx/rxnew.lpk +++ b/components/rx/rxnew.lpk @@ -26,7 +26,7 @@ translate to Lazarus by alexs in 2005 - 2009 - + @@ -245,6 +245,10 @@ translate to Lazarus by alexs in 2005 - 2009 + + + + diff --git a/components/rx/rxnew.pas b/components/rx/rxnew.pas index 733377238..1d87af1a8 100644 --- a/components/rx/rxnew.pas +++ b/components/rx/rxnew.pas @@ -16,7 +16,7 @@ uses rxdbgrid_findunit, rxdbgrid_columsunit, rxpopupunit, rxcustomchartpanel, rxsortmemds, AutoPanel, pickdate, rxiconv, rxceEditLookupFields, rxclock, rxspin, RxDBSpinEdit, RegisterRxDB, RxTimeEdit, RxDBTimeEdit, RxDBCtrls, - rxfilterby, rxconst, LazarusPackageIntf; + rxfilterby, rxconst, rxFileUtils, LazarusPackageIntf; implementation