From b654228675cdd273d1cf1bc3d68fc213d1ac1cff Mon Sep 17 00:00:00 2001 From: Massimo Melina Date: Sat, 2 May 2020 19:04:16 +0200 Subject: [PATCH] first commit --- .gitignore | 13 + WindowsXP.manifest | 21 + alias.txt | 11 + classesLib.pas | 1213 +++++ copyright.txt | 6 + country.cache | 1 + data.RES | Bin 0 -> 173012 bytes data.rc | 12 + default.tpl | 1155 ++++ defs.inc | 11 + deprecated.txt | 18 + developer notes.txt | 29 + diffDlg.dfm | 27 + diffDlg.pas | 25 + dmBrowser.tpl | 40 + filelist.tpl | 11 + filepropDlg.dfm | 417 ++ filepropDlg.pas | 521 ++ folderKindDlg.dfm | 145 + folderKindDlg.pas | 34 + hfs.bdsproj | 184 + hfs.cfg | 43 + hfs.dfm | 16 + hfs.dof | 133 + hfs.dpr | 115 + hfs.dproj | 973 ++++ hfs.dproj.local | 34 + hfs.drc | 1505 +++++ hfs.dsk | 185 + hfs.events | 3 + hfs.identcache | Bin 0 -> 745 bytes hfs.otares | Bin 0 -> 96 bytes hfs.pas | 28 + hfs.res | Bin 0 -> 32856 bytes hfs.tpl | Bin 0 -> 55415 bytes hfs.vrc | Bin 0 -> 2072 bytes hfs_Icon.ico | Bin 0 -> 30246 bytes hfs_Icon1.ico | Bin 0 -> 30246 bytes hfs_Icon2.ico | Bin 0 -> 30246 bytes hslib.pas | 1689 ++++++ invertban.txt | 10 + ipsEverDlg.dfm | 63 + ipsEverDlg.pas | 60 + ipservices.txt | 2 + jquery.min.js | 7 + listSelectDlg.dfm | 54 + listSelectDlg.pas | 49 + longinputDlg.dfm | 78 + longinputDlg.pas | 44 + macros-log.html | 518 ++ main.dfm | 3449 ++++++++++++ main.pas | 12371 ++++++++++++++++++++++++++++++++++++++++++ monoLib.pas | 110 + newuserpassDlg.dfm | 73 + newuserpassDlg.pas | 90 + notes.txt | 62 + optionsDlg.dfm | 691 +++ optionsDlg.pas | 954 ++++ parserLib.pas | 247 + progFrmLib.pas | 203 + purgeDlg.dfm | 73 + purgeDlg.pas | 30 + recompile data.bat | 2 + runscriptDlg.dfm | 63 + runscriptDlg.pas | 47 + scriptLib.pas | 2588 +++++++++ shell.gif | Bin 0 -> 6046 bytes shellExtDlg.dfm | 61 + shellExtDlg.pas | 40 + todo.txt | 194 + traylib.pas | 216 + upload_disabled.txt | 5 + upload_how.txt | 10 + utillib.pas | 3128 +++++++++++ whatsnew.txt | 951 ++++ 75 files changed, 35161 insertions(+) create mode 100644 .gitignore create mode 100644 WindowsXP.manifest create mode 100644 alias.txt create mode 100644 classesLib.pas create mode 100644 copyright.txt create mode 100644 country.cache create mode 100644 data.RES create mode 100644 data.rc create mode 100644 default.tpl create mode 100644 defs.inc create mode 100644 deprecated.txt create mode 100644 developer notes.txt create mode 100644 diffDlg.dfm create mode 100644 diffDlg.pas create mode 100644 dmBrowser.tpl create mode 100644 filelist.tpl create mode 100644 filepropDlg.dfm create mode 100644 filepropDlg.pas create mode 100644 folderKindDlg.dfm create mode 100644 folderKindDlg.pas create mode 100644 hfs.bdsproj create mode 100644 hfs.cfg create mode 100644 hfs.dfm create mode 100644 hfs.dof create mode 100644 hfs.dpr create mode 100644 hfs.dproj create mode 100644 hfs.dproj.local create mode 100644 hfs.drc create mode 100644 hfs.dsk create mode 100644 hfs.events create mode 100644 hfs.identcache create mode 100644 hfs.otares create mode 100644 hfs.pas create mode 100644 hfs.res create mode 100644 hfs.tpl create mode 100644 hfs.vrc create mode 100644 hfs_Icon.ico create mode 100644 hfs_Icon1.ico create mode 100644 hfs_Icon2.ico create mode 100644 hslib.pas create mode 100644 invertban.txt create mode 100644 ipsEverDlg.dfm create mode 100644 ipsEverDlg.pas create mode 100644 ipservices.txt create mode 100644 jquery.min.js create mode 100644 listSelectDlg.dfm create mode 100644 listSelectDlg.pas create mode 100644 longinputDlg.dfm create mode 100644 longinputDlg.pas create mode 100644 macros-log.html create mode 100644 main.dfm create mode 100644 main.pas create mode 100644 monoLib.pas create mode 100644 newuserpassDlg.dfm create mode 100644 newuserpassDlg.pas create mode 100644 notes.txt create mode 100644 optionsDlg.dfm create mode 100644 optionsDlg.pas create mode 100644 parserLib.pas create mode 100644 progFrmLib.pas create mode 100644 purgeDlg.dfm create mode 100644 purgeDlg.pas create mode 100644 recompile data.bat create mode 100644 runscriptDlg.dfm create mode 100644 runscriptDlg.pas create mode 100644 scriptLib.pas create mode 100644 shell.gif create mode 100644 shellExtDlg.dfm create mode 100644 shellExtDlg.pas create mode 100644 todo.txt create mode 100644 traylib.pas create mode 100644 upload_disabled.txt create mode 100644 upload_how.txt create mode 100644 utillib.pas create mode 100644 whatsnew.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4f2fd81 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +tmp/ +__history/ +__recovery/ +win32/ +*.vfs +*.dcu +*.exe +*.map +hfs.ini +*.tmp +*.bak +*.*- +*.corrupted \ No newline at end of file diff --git a/WindowsXP.manifest b/WindowsXP.manifest new file mode 100644 index 0000000..84283b0 --- /dev/null +++ b/WindowsXP.manifest @@ -0,0 +1,21 @@ + + + +Windows Shell + + + + + + diff --git a/alias.txt b/alias.txt new file mode 100644 index 0000000..14e597b --- /dev/null +++ b/alias.txt @@ -0,0 +1,11 @@ +var length=length|var=$1 +cache=trim|{.set|#cache.tmp|{.from table|$1|$2.}.} {.if not|{.^#cache.tmp.}|{:{.set|#cache.tmp|{.dequote|$3.}.}{.set table|$1|$2={.^#cache.tmp.}.}:}.} {.^#cache.tmp.} {.set|#cache.tmp.} +is substring=pos|$1|$2 +set append=set|$1|$2|mode=append +123 if 2=if|$2|$1$2$3 +between=if|{.$1 < $3.}|{:{.and|{.$1 <= $2.}|{.$2 <= $3.}:}|{:{.and|{.$3 <= $2.}|{.$2 <= $1.}:} +between!=if|{.$1 < $3.}|{:{.and|{.$1 < $2.}|{.$2 < $3.}:}|{:{.and|{.$3 < $2.}|{.$2 < $1.}:} +file changed=if| {.{.filetime|$1.} > {.^#file changed.$1.}.}|{: {.set|#file changed.$1|{.filetime|$1.}.} {.if|$2|{:{.load|$1|var=$2.}:}.} 1:} +play system event=play +redirect=add header|Location: $1 +chop={.cut|{.calc|{.pos|$2|var=$1.}+{.length|$2.}.}||var=$1|remainder=#chop.tmp.}{.^#chop.tmp.} \ No newline at end of file diff --git a/classesLib.pas b/classesLib.pas new file mode 100644 index 0000000..05f060a --- /dev/null +++ b/classesLib.pas @@ -0,0 +1,1213 @@ +{ +Copyright (C) 2002-2012 Massimo Melina (www.rejetto.com) + +This file is part of HFS ~ HTTP File Server. + + HFS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + HFS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with HFS; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +} +{$INCLUDE defs.inc } +unit classesLib; + +interface + +uses + iniFiles, types, hslib, strUtils, sysUtils, classes, math; + +type + TfastStringAppend = class + protected + buff: string; + n: integer; + public + function length():integer; + function reset():string; + function get():string; + function append(s:string):integer; + end; + + PcachedIcon = ^TcachedIcon; + TcachedIcon = record + data: ansistring; + idx: integer; + time: Tdatetime; + end; + + TiconsCache = class + n: integer; + icons: array of TcachedIcon; + function get(data:ansistring):PcachedIcon; + procedure put(data:ansistring; idx:integer; time:Tdatetime); + procedure clear(); + procedure purge(olderThan:Tdatetime); + function idxOf(data:shortstring):integer; + end; + + TusersInVFS = class + protected + users: TstringDynArray; + pwds: array of TstringDynArray; + public + procedure reset(); + procedure track(usr, pwd:string); overload; + procedure drop(usr, pwd:string); overload; + function match(usr, pwd:string):boolean; overload; + function empty():boolean; + end; + + TarchiveStream = class(Tstream) + protected + pos, cachedTotal: int64; + cur: integer; + + procedure invalidate(); + procedure calculate(); virtual; abstract; + function getTotal():int64; + public + flist: array of record + src, // full path of the file on the disk + dst: ansistring; // full path of the file in the archive + firstByte, // offset of the file inside the archive + mtime, + size: int64; + data: Tobject; // extra data + end; + onDestroy: TNotifyEvent; + + constructor create; + destructor Destroy; override; + function addFile(src:ansistring; dst:ansistring=''; data:Tobject=NIL):boolean; virtual; + function count():integer; + procedure reset(); virtual; + property totalSize:int64 read getTotal; + property current:integer read cur; + end; // TarchiveStream + + TtarStreamWhere = (TW_HEADER, TW_FILE, TW_PAD); + + TtarStream = class(TarchiveStream) + protected + fs: TFileStream; + block: TStringStream; + lastSeekFake: int64; + where: TtarStreamWhere; + function fsInit():boolean; + procedure headerInit(); // fill block with header + procedure padInit(full:boolean=FALSE); // fill block with pad + function headerLengthForFilename(fn:ansistring):integer; + procedure calculate(); override; + public + fileNamesOEM: boolean; + constructor create; + destructor Destroy; override; + function Read(var Buffer; Count: Longint): Longint; override; + function Write(const Buffer; Count: Longint): Longint; override; + function Seek(const Offset: Int64; Origin: TSeekOrigin=soBeginning): Int64; override; + + procedure reset(); override; + end; // TtarStream + + Thasher = class(TstringList) + procedure loadFrom(path:string); + function getHashFor(fn:string):string; + end; + + TstringToIntHash = class(ThashedStringList) + constructor create; + function getInt(s:string):integer; + function getIntByIdx(idx:integer):integer; + function incInt(s:string):integer; + procedure setInt(s:string; int:integer); + end; + + PtplSection = ^TtplSection; + TtplSection = record + name, txt: string; + nolog, nourl, cache: boolean; + ts: Tdatetime; + end; + + Ttpl = class + protected + src: string; + lastExt, // cache for getTxtByExt() + last: record section:string; idx:integer; end; // cache for getIdx() + fileExts: TStringDynArray; + strTable: THashedStringList; + fUTF8: boolean; + fOver: Ttpl; + function getIdx(section:string):integer; + function getTxt(section:string):string; + function newSection(section:string):PtplSection; + procedure fromString(txt:string); + procedure setOver(v:Ttpl); + procedure updateUTF8(); + public + onChange: TNotifyEvent; + sections: array of TtplSection; + constructor create(txt:string=''; over:Ttpl=NIL); + destructor Destroy; override; + property txt[section:string]:string read getTxt; default; + property fullText:string read src write fromString; + property utf8:boolean read fUTF8; + property over:Ttpl read fOver write setOver; + function sectionExist(section:string):boolean; + function getTxtByExt(fileExt:string):string; + function getSection(section:string):PtplSection; + function getSections():TStringDynArray; + procedure appendString(txt:string); + function getStrByID(id:string):string; + function me():Ttpl; + end; // Ttpl + + TcachedTplObj = class + ts: Tdatetime; + tpl: Ttpl; + end; + + TcachedTpls = class(THashedStringList) + public + function getTplFor(fn:string):Ttpl; + destructor Destroy; override; + end; // TcachedTpls + + TperIp = class // for every different address, we have an object of this class. These objects are never freed until hfs is closed. + public + limiter: TspeedLimiter; + customizedLimiter: boolean; + constructor create(); + destructor Destroy; override; + end; + + Ttlv = class + protected + cur, bound: integer; + whole, lastValue: ansistring; + stack: array of integer; + stackTop: integer; + public + procedure parse(data:ansistring); + function pop(var value:ansistring):integer; + function down():boolean; + function up():boolean; + function getTotal():integer; + function getCursor():integer; + function getPerc():real; + function isOver():boolean; + function getTheRest():ansistring; + end; + +implementation + +uses + utilLib, main, windows, dateUtils, forms; + +constructor TperIp.create(); +begin +limiter:=TspeedLimiter.create(); +srv.limiters.add(limiter); +end; + +destructor TperIp.Destroy; +begin +srv.limiters.remove(limiter); +limiter.free; +end; + +//////////// TcachedTpls + +destructor TcachedTpls.Destroy; +var + i: integer; +begin +for i:=0 to count-1 do + objects[i].free; +end; + +function TcachedTpls.getTplFor(fn:string):Ttpl; +var + i: integer; + o: TcachedTplObj; + s: string; +begin +fn:=trim(lowercase(fn)); +i:=indexOf(fn); +if i >= 0 then + o:=objects[i] as TcachedTplObj +else + begin + o:=TcachedTplObj.create(); + if addObject(fn, o) > 100 then + delete(0); + end; +result:=o.tpl; +if getMtime(fn) = o.ts then exit; +o.ts:=getMtime(fn); +s:=loadTextFile(fn); +if o.tpl = NIL then + begin + result:=Ttpl.create(); + o.tpl:=result; + end; +o.tpl.fromString(s); +end; // getTplFor + +//////////// TusersInVFS + +function TusersInVFS.empty():boolean; +begin result:= users = NIL end; + +procedure TusersInVFS.reset(); +begin +users:=NIL; +pwds:=NIL; +end; // reset + +procedure TusersInVFS.track(usr, pwd: string); +var + i: integer; +begin +if usr = '' then exit; +i:=idxOf(usr, users); +if i < 0 then i:=addString(usr, users); +if i >= length(pwds) then setLength(pwds, i+1); +addString(pwd, pwds[i]); +end; // track + +procedure TusersInVFS.drop(usr, pwd: string); +var + i, j: integer; +begin +i:=idxOf(usr, users); +if i < 0 then exit; +j:=AnsiIndexStr(pwd, pwds[i]); +if j < 0 then exit; +removeString(pwds[i], j); +if assigned(pwds[i]) then exit; +// this username does not exist with any password +removeString(users, i); +while i+1 < length(pwds) do + begin + pwds[i]:=pwds[i+1]; + inc(i); + end; +setLength(pwds, i); +end; // drop + +function TusersInVFS.match(usr, pwd:string):boolean; +var + i: integer; +begin +result:=FALSE; +i:=idxOf(usr, users); +if i < 0 then exit; +result:= 0 <= AnsiIndexStr(pwd, pwds[i]); +end; // match + +//////////// TiconsCache + +function TiconsCache.idxOf(data:shortstring):integer; +var + b, e, c: integer; +begin +result:=0; +if n = 0 then exit; +// binary search +b:=0; +e:=n-1; + repeat + result:=(b+e) div 2; + c:=compareStr(data, icons[result].data); + if c = 0 then exit; + if c < 0 then e:=result-1; + if c > 0 then b:=result+1; + until b > e; +result:=b; +end; // idxOf + +function TiconsCache.get(data:ansistring):PcachedIcon; +var + i: integer; +begin +result:=NIL; +i:=idxOf(data); +if (i >= 0) and (i < n) and (icons[i].data = data) then + result:=@icons[i]; +end; // get + +procedure TiconsCache.put(data:ansistring; idx:integer; time:Tdatetime); +var + i, w: integer; +begin +if length(icons) <= n then setlength(icons, n+50); +w:=idxOf(data); +for i:=n downto w+1 do icons[i]:=icons[i-1]; // shift +icons[w].data:=data; +icons[w].idx:=idx; +icons[w].time:=time; +inc(n); +end; // put + +procedure TiconsCache.clear(); +begin +icons:=NIL; +n:=0; +end; // clear + +procedure TiconsCache.purge(olderThan:Tdatetime); +var + i, m: integer; +begin +exit; +m:=0; +for i:=0 to n-1 do + if icons[i].time < olderThan then dec(n) // this does not shorten the loop + else + begin + if m < i then icons[m]:=icons[i]; + inc(m); + end; +end; // purge + +//////////// TfastStringAppend + +function TfastStringAppend.length():integer; +begin result:=n end; + +function TfastStringAppend.get():string; +begin +setlength(buff, n); +result:=buff; +end; // get + +function TfastStringAppend.reset():string; +begin +result:=get(); +buff:=''; +n:=0; +end; // reset + +function TfastStringAppend.append(s:string):integer; +var + ls, lb: integer; +begin +ls:=system.length(s); +lb:=system.length(buff); +if n+ls > lb then setlength(buff, lb+ls+20000); +moveChars(s[1], buff[n+1], ls); +inc(n, ls); +result:=n; +end; // append + +//////////// TarchiveStream + +function TarchiveStream.getTotal():int64; +begin +if cachedTotal < 0 then calculate(); +result:=cachedTotal; +end; // getTotal + +function TarchiveStream.addFile(src:ansistring; dst:ansistring=''; data:Tobject=NIL):boolean; + + function getMtime(fh:Thandle):int64; + var + ctime, atime, mtime: Tfiletime; + st: TSystemTime; + begin + getFileTime(fh, @ctime, @atime, @mtime); + fileTimeToSystemTime(mtime, st); + result:=dateTimeToUnix(SystemTimeToDateTime(st)); + end; // getMtime + +var + i, fh: integer; +begin +result:=FALSE; +fh:=fileopen(src, fmOpenRead+fmShareDenyNone); +if fh = -1 then exit; +result:=TRUE; +if dst = '' then + dst:=extractFileName(src); +i:=length(flist); +setLength(flist, i+1); +flist[i].src:=src; +flist[i].dst:=dst; +flist[i].data:=data; +flist[i].size:=sizeOfFile(fh); +flist[i].mtime:=getMtime(fh); +flist[i].firstByte:=-1; +fileClose(fh); +invalidate(); +end; // addFile + +procedure TarchiveStream.invalidate(); +begin cachedTotal:=-1 end; + +constructor TarchiveStream.create; +begin +inherited; +reset(); +end; // create + +destructor TarchiveStream.destroy; +begin +if assigned(onDestroy) then onDestroy(self); +inherited; +end; // destroy + +procedure TarchiveStream.reset(); +begin +flist:=NIL; +cur:=0; +pos:=0; +invalidate(); +end; // reset + +function TarchiveStream.count():integer; +begin result:=length(flist) end; + +//////////// TtarStream + +constructor TtarStream.create; +begin +block:=TStringStream.create(''); +lastSeekFake:=-1; +where:=TW_HEADER; +fileNamesOEM:=FALSE; +inherited; +end; // create + +destructor TtarStream.destroy; +begin +freeAndNIL(fs); +inherited; +end; // destroy + +procedure TtarStream.reset(); +begin +inherited; +block.size:=0; +end; // reset + +function TtarStream.fsInit():boolean; +begin +if assigned(fs) and (fs.FileName = flist[cur].src) then + begin + result:=TRUE; + exit; + end; +result:=FALSE; +try + freeAndNIL(fs); + fs:=TfileStream.Create(flist[cur].src, fmOpenRead+fmShareDenyWrite); + result:=TRUE; +except + fs:=NIL; + end; +end; // fsInit + +procedure TtarStream.headerInit(); + + function num(i:int64; fieldLength:integer):ansistring; + const + CHARS : array [0..7] of ansichar = '01234567'; + var + d: integer; + begin + d:=fieldLength-1; + result:=ansistring(dupeString('0', d))+#0; + while d > 0 do + begin + result[d]:=CHARS[i and 7]; + dec(d); + i:=i shr 3; + if i = 0 then break; + end; + end; // num + + function str(s:ansistring; fieldLength:integer; fill:ansistring=#0):ansistring; + begin + setLength(s, min(length(s), fieldLength-1)); + result:=s+ansistring( dupeString(fill, fieldLength-length(s)) ); + end; // str + + function sum(s:ansistring):integer; + var + i: integer; + begin + result:=0; + for i:=1 to length(s) do + inc(result, ord(s[i])); + end; // sum + + procedure applyChecksum(var s:ansistring); + var + chk: ansistring; + begin + chk:=num(sum(s), 7)+' '; + chk[7]:=#0; + move(chk[1], s[100+24+12+12+1], length(chk)); + end; // applyChecksum + +const + FAKE_CHECKSUM = ' '; + USTAR = 'ustar'#0'00'; + PERM = '0100777'#0'0000000'#0'0000000'#0; // file mode, uid, gid +var + fn, s, pre: ansistring; +begin +fn:=ansistring(replaceStr(flist[cur].dst,'\','/')); +if fileNamesOEM then + CharToOem(pWideChar(string(fn)), pAnsiChar(fn)); +pre:=''; +if length(fn) >= 100 then + begin + pre:=str('././@LongLink', 100)+PERM + +num(length(fn)+1, 12)+num(flist[cur].mtime, 12) + +FAKE_CHECKSUM+'L'; + pre:=str(pre, 256)+str(#0+USTAR,256); + applyChecksum(pre); + pre:=pre+str(fn, 512); + end; +s:=str(fn, 100)+PERM + +num(flist[cur].size, 12) // file size + +num(flist[cur].mtime, 12) // mtime + +FAKE_CHECKSUM + +'0'+str('', 100) // link properties + +USTAR; +applyChecksum(s); +s:=str(s, 512); // pad +block.Size:=0; +block.WriteString(pre+s); +block.seek(0, soBeginning); +end; // headerInit + +function TtarStream.write(const Buffer; Count: Longint): Longint; +begin raise EWriteError.Create('write unsupproted') end; + +function gap512(i:int64):word; inline; +begin +result:=i and 511; +if result > 0 then result:=512-result; +end; // gap512 + +procedure TtarStream.padInit(full:boolean=FALSE); +begin +block.Size:=0; +block.WriteString(dupeString(#0, if_(full,512,gap512(pos)) )); +block.Seek(0, soBeginning); +end; // padInit + +function TtarStream.headerLengthForFilename(fn:ansistring):integer; +begin +result:=length(fn); +result:=512*if_(result<100, 1, 3+result div 512); +end; // headerLengthForFilename + +procedure TtarStream.calculate(); +var + pos: int64; + i: integer; +begin +pos:=0; +for i:=0 to length(flist)-1 do + with flist[i] do + begin + firstByte:=pos; + inc(pos, size+headerLengthForFilename(dst)); + inc(pos, gap512(pos)); + end; +inc(pos, 512); // last empty block +cachedTotal:=pos; +end; // calculate + +function TtarStream.seek(const Offset: Int64; Origin: TSeekOrigin): Int64; + + function left():int64; + begin result:=offset-pos end; + + procedure fineSeek(s:Tstream); + begin inc(pos, s.seek(left(), soBeginning)) end; + + function skipMoreThan(size:int64):boolean; + begin + result:=left() > size; + if result then inc(pos, size); + end; + +var + bak: int64; + prevCur: integer; +begin +{ The lastSeekFake trick is a way to fastly manage a sequence of + seek(0,soCurrent); seek(0,soEnd); seek(0,soBeginning); + such sequence called very often, while it is used to just read + the size of the stream, no real seeking requirement. +} +bak:=lastSeekFake; +lastSeekFake:=-1; +if (origin = soCurrent) and (offset <> 0) then + seek(pos+offset, soBeginning); +if origin = soEnd then + if offset < 0 then + seek(totalSize+offset, soBeginning) + else + begin + lastSeekFake:=pos; + pos:=totalsize; + end; +result:=pos; +if origin <> soBeginning then exit; +if bak >= 0 then + begin + pos:=bak; + exit; + end; + +// here starts the normal seeking algo + +prevCur:=cur; +cur:=0; // flist index +pos:=0; // current position in the file +block.size:=0; +while (left() > 0) and (cur < length(flist)) do + begin + // are we seeking inside this header? + if not skipMoreThan(headerLengthForFilename(flist[cur].dst)) then + begin + if (prevCur <> cur) or (where <> TW_HEADER) or eos(block) then + headerInit(); + fineSeek(block); + where:=TW_HEADER; + break; + end; + // are we seeking inside this file? + if not skipMoreThan(flist[cur].size) then + begin + if not fsInit() then + raise Exception.Create('TtarStream.seek: cannot open '+flist[cur].src); + fineSeek(fs); + where:=TW_FILE; + break; + end; + // are we seeking inside this pad? + if not skipMoreThan(gap512(pos)) then + begin + padInit(); + fineSeek(block); + where:=TW_PAD; + break; + end; + inc(cur); + end;//while +if left() > 0 then + begin + padInit(TRUE); + fineSeek(block); + end; +result:=pos; +end; // seek + +function TtarStream.read(var Buffer; Count: Longint): Longint; +var + p: Pbyte; + + procedure goForth(d: int64); + begin + dec(count, d); + inc(pos, d); + inc(p, d); + end; // goForth + + procedure goRead(s:Tstream); + begin goForth( s.read(p^, count) ) end; + +var + i, posBak: int64; +begin +posBak:=pos; +p:=@buffer; +while (count > 0) and (cur < length(flist)) do + case where of + TW_HEADER: + begin + if block.size = 0 then + headerInit(); + goRead(block); + if not eos(block) then continue; + where:=TW_FILE; + freeAndNIL(fs); // in case the same files appear twice in a row, we must be sure to reinitialize the reader stream + block.size:=0; + end; + TW_FILE: + begin + fsInit(); + if assigned(fs) then + goRead(fs); + { We reserved a fixed space for this file in the archive, but the file + may not exist anymore, or its size may be shorter than expected, + so we can't rely on eos(fs) to know if we are done in this section. + Lets calculate how far we are from the theoretical end of the file, + and decide after it. + } + i:=headerLengthForFilename(flist[cur].dst); + i:=flist[cur].firstByte+i+flist[cur].size-pos; + if count >= i then + where:=TW_PAD; + // In case the file is shorter, we pad the rest with NUL bytes + i:=min(count, max(0,i)); + fillChar(p^,i,0); + goForth(i); + end; + TW_PAD: + begin + if block.size = 0 then padInit(); + goRead(block); + if not eos(block) then continue; + where:=TW_HEADER; + block.size:=0; + inc(cur); + end; + end;//case + +// last empty block +if count > 0 then + begin + padInit(TRUE); + goRead(block); + end; +result:=pos-posBak; +end; // read + +//////////// Thasher + +procedure Thasher.loadFrom(path:string); +var + sr: TsearchRec; + s, l, h: string; +begin +if path='' then exit; +path:=includeTrailingPathDelimiter(lowercase(path)); +if findFirst(path+'*.md5', faAnyFile-faDirectory, sr) <> 0 then exit; + repeat + s:=loadTextfile(path+sr.name); + while s > '' do + begin + l:=chopline(s); + h:=trim(chop('*',l)); + if h = '' then break; + if l = '' then + // assume it is referring to the filename without the extention + l:=copy(sr.name, 1, length(sr.name)-4); + add(path+lowercase(l)+'='+h); + end; + until findnext(sr) <> 0; +sysutils.findClose(sr); +end; // loadFrom + +function Thasher.getHashFor(fn:string):string; +begin +try result:=values[lowercase(fn)] +except result:='' end +end; + +//////////// TstringToIntHash + +constructor TstringToIntHash.create; +begin +inherited create; +sorted:=TRUE; +duplicates:=dupIgnore; +end; // create + +function TstringToIntHash.getIntByIdx(idx:integer):integer; +begin if idx < 0 then result:=0 else result:=integer(objects[idx]) end; + +function TstringToIntHash.getInt(s:string):integer; +begin result:=getIntByIdx(indexOf(s)) end; + +procedure TstringToIntHash.setInt(s:string; int:integer); +begin +beginUpdate(); +objects[add(s)]:=Tobject(int); +endUpdate(); +end; // setInt + +function TstringToIntHash.incInt(s:string):integer; +var + i: integer; +begin +beginUpdate(); +i:=add(s); +result:=integer(objects[i]); +inc(result); +objects[i]:=Tobject(result); +endUpdate(); +end; // autoupdatedFiles_getCounter + +//////////// Ttpl + +constructor Ttpl.create(txt:string=''; over:Ttpl=NIL); +begin +fullText:=txt; +self.over:=over; +end; + +destructor Ttpl.destroy; +begin +freeAndNIL(strTable); +inherited; +end; // destroy + +function Ttpl.getStrByID(id:string):string; +begin +if strTable = NIL then + begin + strTable:=THashedStringList.create; + strTable.text:=txt['special:strings']; + end; +result:=strTable.values[id]; +if (result = '') and assigned(over) then + result:=over.getStrByID(id) +end; // getStrByID + +function Ttpl.getIdx(section:string):integer; +begin +if section <> last.section then + begin + last.section:=section; + for result:=0 to length(sections)-1 do + if sameText(sections[result].name, section) then + begin + last.idx:=result; + exit; + end; + last.idx:=-1; + end; +result:=last.idx +end; // getIdx + +function Ttpl.newSection(section:string):PtplSection; +var + i: integer; +begin +// add +i:=length(sections); +setLength(sections, i+1); +result:=@sections[i]; +result.name:=section; +// getIdx just filled 'last' with not-found, so we must update +last.section:=section; +last.idx:=i; +// manage file.EXT sections +if not ansiStartsText('file.', section) then exit; +i:=length(fileExts); +setLength(fileExts, i+2); +delete(section, 1, 4); +fileExts[i]:=section; +fileExts[i+1]:=str_(last.idx); +lastExt.section:=section; +lastExt.idx:=last.idx; +end; // newSection + +function Ttpl.sectionExist(section:string):boolean; +begin +result:=getIdx(section)>=0; +if not result and assigned(over) then + result:=over.sectionExist(section); +end; + +function Ttpl.getSection(section:string):PtplSection; +var + i: integer; +begin +result:=NIL; +i:=getIdx(section); +if i >= 0 then result:=@sections[i]; +if assigned(over) and ((result = NIL) or (trim(result.txt) = '')) then + result:=over.getSection(section); +end; // getSection + +function Ttpl.getTxt(section:string):string; +var + i: integer; +begin +i:=getIdx(section); +if i >= 0 then + result:=sections[i].txt +else if assigned(over) then + result:=over[section] +else + result:='' +end; // getTxt + +function Ttpl.getTxtByExt(fileExt:string):string; +var + i: integer; +begin +result:=''; +if (lastExt.section > '') and (fileExt = lastExt.section) then + begin + if lastExt.idx >= 0 then result:=sections[lastExt.idx].txt; + exit; + end; +i:=idxOf(fileExt, fileExts); +if (i < 0) and assigned(over) then + begin + result:=over.getTxtByExt(fileExt); + if result > '' then exit; + end; +lastExt.section:=fileExt; +lastExt.idx:=i; +if i < 0 then exit; +i:=int_(fileExts[i+1]); +lastExt.idx:=i; +result:=sections[i].txt; +end; // getTxtByExt + +procedure Ttpl.fromString(txt:string); +begin +src:=''; +sections:=NIL; +fileExts:=NIL; +last.section:=#255'null'; // '' is a valid (and often used) section name. This is a better null value. +freeAndNIL(strTable); // mod by mars + +appendString(txt); +end; // fromString + +procedure Ttpl.appendString(txt:string); +var + ptxt, bos: Pchar; + cur_section, next_section: string; + + function pred(p:pchar):pchar; inline; + begin + result:=p; + if p <> NIL then + dec(result); + end; + + function succ(p:pchar):pchar; inline; + begin + result:=p; + if p <> NIL then + inc(result); + end; + + procedure findNextSection(); + begin + // find start + bos:=ptxt; + repeat + if bos^ <> '[' then bos:=ansiStrPos(bos, #10'['); + if bos = NIL then exit; + if bos^ = #10 then inc(bos); + if getSectionAt(bos, next_section) then + exit; + inc(bos); + until false; + end; // findNextSection + + procedure saveInSection(); + var + ss: TStringDynArray; + s: string; + i, si: integer; + base: TtplSection; + till: pchar; + append: boolean; + sect, from: PtplSection; + begin + till:=pred(bos); + if till = NIL then till:=pred(strEnd(ptxt)); + if till^ = #10 then dec(till); + if till^ = #13 then dec(till); + + base.txt:=getStr(ptxt, till); + // there may be flags after | + s:=cur_section; + cur_section:=chop('|', s); + base.nolog:=ansiPos('no log', s) > 0; + base.nourl:=ansiPos('private', s) > 0; + base.cache:=ansiPos('cache', s) > 0; + base.ts:=now(); + + s:=cur_section; + append:=ansiStartsStr('+', s); + if append then + delete(s,1,1); + + // there may be several section names separated by = + ss:=split('=', s); + // handle the main section specific case + if ss = NIL then addString('', ss); + // assign to every name the same txt + for i:=0 to length(ss)-1 do + begin + s:=trim(ss[i]); + si:=getIdx(s); + from:=NIL; + if si < 0 then // not found + begin + if append then + from:=getSection(s); + sect:=newSection(s); + end + else + begin + sect:=@sections[si]; + if append then + from:=sect; + end; + if from<>NIL then + begin // inherit from it + sect.txt:=from.txt+base.txt; + sect.nolog:=from.nolog or base.nolog; + sect.nourl:=from.nourl or base.nourl; + continue; + end; + sect^:=base; + sect.name:=s; // restore this lost attribute + end; + end; // saveInSection + +const + BOM = #$EF#$BB#$BF; +var + first: boolean; +begin +// this is used by some unicode files. at the moment we just ignore it. +if ansiStartsStr(BOM, txt) then + delete(txt, 1, length(BOM)); + +if txt = '' then exit; +src:=src+txt; +cur_section:=''; +ptxt:=@txt[1]; +first:=TRUE; + repeat + findNextSection(); + if not first or (trim(getStr(ptxt, pred(bos))) > '') then + saveInSection(); + if bos = NIL then break; + cur_section:=next_section; + inc(bos, length(cur_section)); // get faster to the end of line + ptxt:=succ(ansiStrPos(bos, #10)); // get to the end of line (and then beyond) + first:=FALSE; + until ptxt = NIL; +updateUTF8(); +if assigned(onChange) then + onChange(self); +end; // appendString + +procedure Ttpl.setOver(v:Ttpl); +begin +fOver:=v; +updateUTF8(); +end; // setOver + +procedure Ttpl.updateUTF8(); +begin fUTF8:=assigned(over) and over.utf8 or utf8test(fullText) end; + +function Ttpl.getSections():TStringDynArray; +var + i: integer; +begin +i:=length(sections); +setLength(result, i); +for i:=0 to i-1 do + result[i]:=sections[i].name; +end; + +function Ttpl.me():Ttpl; +begin result:=self end; + + + +procedure Ttlv.parse(data:ansistring); +begin +whole:=data; +cur:=1; +bound:=length(data); +stackTop:=0; +end; // parse + +function Ttlv.pop(var value:ansistring):integer; +var + n: integer; +begin +result:=-1; +if isOver() then exit; // finished +result:=integer((@whole[cur])^); +n:=Pinteger(@whole[cur+4])^; +value:=copy(whole, cur+8, n); +lastValue:=value; +inc(cur, 8+n); +end; // pop + +function Ttlv.down():boolean; +begin +// do we have anything to recur on? +if (cur = 1) then + begin + result:=false; + exit; + end; +// push into the stack +if (stackTop = length(stack)) then // space over + setLength(stack, stackTop+10); // make space +stack[stackTop]:=cur; +inc(stackTop); +stack[stackTop]:=bound; +inc(stackTop); + +bound:=cur; +dec(cur, length(lastValue)); +result:=true; +end; // down + +function Ttlv.up():boolean; +begin +if stackTop = 0 then + begin + result:=false; + exit; + end; +dec(stackTop); +bound:=stack[stackTop]; +dec(stackTop); +cur:=stack[stackTop]; +result:=true; +end; // up + +function Ttlv.getTotal():integer; +begin result:=length(whole) end; + +function Ttlv.getCursor():integer; +begin result:=cur end; + +function Ttlv.getPerc():real; +begin +if length(whole) = 0 then result:=0 +else result:=cur/length(whole) +end; // getPerc + +function Ttlv.isOver():boolean; +begin result:=(cur+8 > bound) end; + +function Ttlv.getTheRest():ansistring; +begin result:=copy(whole, cur, bound-cur+1) end; + +end. diff --git a/copyright.txt b/copyright.txt new file mode 100644 index 0000000..7055b61 --- /dev/null +++ b/copyright.txt @@ -0,0 +1,6 @@ +HFS version %s, Copyright (C) 2002-2020 Massimo Melina (www.rejetto.com) +HFS comes with ABSOLUTELY NO WARRANTY; for details click Menu -> Web links -> License +This is FREE software, and you are welcome to redistribute it +under certain conditions. + +Build #%s diff --git a/country.cache b/country.cache new file mode 100644 index 0000000..c570154 --- /dev/null +++ b/country.cache @@ -0,0 +1 @@ +127.0.0.1=(Private Address) (XX) \ No newline at end of file diff --git a/data.RES b/data.RES new file mode 100644 index 0000000000000000000000000000000000000000..f882cec6d912d1c9dc9858db70a12e4369595cd3 GIT binary patch literal 173012 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 Z#XR6x1CTwSh#_39_Xe7@ctarF{{!n>tHl5S literal 0 HcmV?d00001 diff --git a/data.rc b/data.rc new file mode 100644 index 0000000..f3ce7e6 --- /dev/null +++ b/data.rc @@ -0,0 +1,12 @@ +1 24 "WindowsXP.manifest" +defaultTpl TEXT default.tpl +copyright TEXT copyright.txt +dmBrowserTpl TEXT dmBrowser.tpl +invertban TEXT invertban.txt +filelistTpl TEXT filelist.tpl +uploadDisabled TEXT upload_disabled.txt +uploadHowTo TEXT upload_how.txt +alias TEXT alias.txt +shell GIF shell.gif +IPservices TEXT ipservices.txt +jquery TEXT jquery.min.js diff --git a/default.tpl b/default.tpl new file mode 100644 index 0000000..d4610e1 --- /dev/null +++ b/default.tpl @@ -0,0 +1,1155 @@ +Welcome! This is the default template for HFS 2.4 +template revision TR3. + +Here below you'll find some options affecting the template. +Consider 1 is used for "yes", and 0 is used for "no". + +DO NOT EDIT this template just to change options. It's a very bad way to do it, and you'll pay for it! +Correct way: in Virtual file system, right click on home/root, properties, diff template, +put this text [+special:strings] +and following all the options you want to change, using the same syntax you see here. + +[+special:strings] + +option.newfolder=1 +option.move=1 +option.comment=1 +option.rename=1 +COMMENT with these you can disable some features of the template. Please note this is not about user permissions, this is global! + +[common-head] + + + + + + + + +[] +{.$common-head.} + {.!HFS.} %folder% + + + + + + +
+

WARNING: this template is only to be used with HFS 2.3 (and macros enabled)

+ {.$menu panel.} + {.$folder panel.} + {.$list panel.} +
+ + + + +[list panel] +{.if not| %number% |{: +
{.!{.if|{.length|{.?search.}.}|No results|No files.}.}
+:}|{: +
+ %list% +
+:}.} + + + +[menu panel] + + + + +[title-bar] + {.!title.} + + + + +[folder panel] + +{.if|%number%| +
+ %number-folders% {.!folders.}, %number-files% {.!files.}, {.add bytes|%total-size%.} +
+.} +{.123 if 2|
|{.commentNL|%folder-item-comment%.}|
.} + +[upload panel] + + +[search panel] +
+
+ {.!Search.} +
{.!this folder and sub-folders.} +
{.!this folder only.} +
{.!entire server.} + +
+
+ + + +[+special:strings] +title=HTTP File Server +max s dl msg=There is a limit on the number of simultaneous downloads on this server.
This limit has been reached. Retry later. +retry later=Please, retry later. +item folder=in folder +no files=No files in this folder +no results=No items match your search query +confirm=Are you sure? + +[icons.css|no log] +@font-face { font-family: 'fontello'; + src: url('data:application/x-font-woff;base64,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') format('woff'); +} +.fa { font-family: "fontello"; font-style: normal; font-weight: normal; } +.fa-asterisk::before { content:"\e800" } +.fa-check-circled::before { content:"\e801" } +.fa-user::before { content:"\e802" } +.fa-clock-o::before { content:"\e803" } +.fa-download::before { content:"\e804" } +.fa-ban::before { content:"\e805" } +.fa-edit::before { content:"\e806" } +.fa-check-square::before { content:"\e807" } +.fa-folder::before { content:"\e808" } +.fa-globe::before { content:"\e809" } +.fa-home::before { content:"\e80a" } +.fa-key::before { content:"\e80b" } +.fa-lock::before { content:"\e80c" } +.fa-refresh::before { content:"\e80d" } +.fa-retweet::before { content:"\e80e" } +.fa-search::before { content:"\e80f" } +.fa-star::before { content:"\e810" } +.fa-cancel-circled::before { content:"\e811"; } +.fa-truck::before { content:"\e812" } +.fa-upload::before { content:"\e813" } +.fa-bars::before { content:"\f0c9" } +.fa-coffee::before { content:"\f0f4" } +.fa-quote-left::before { content:"\f10d" } +.fa-file-archive-o::before { content:"\f1c6" } +.fa-trash::before { content:"\f1f8" } +.fa-user-circle::before { content:"\f2bd" } +.fa-lightbulb:before { content: '\f0eb' } +.fa-sort:before { content: '\f0dc' } +.fa-sort-alt-up:before { content: '\f160' } +.fa-sort-alt-down:before { content: '\f161' } + +[style.css|no log|cache] +/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none} + +{.$icons.css.} + +.pure-button { + background-color: #cde; padding: .5em 1em; color: #444; color: rgba(0,0,0,.8); border: 1px solid #999; border: transparent; text-decoration: none; box-sizing: border-box; + border-radius: 2px; display: inline-block; zoom: 1; white-space: nowrap; vertical-align: middle; text-align: center; cursor: pointer; user-select: none; +} +body { font-family:tahoma, verdana, arial, helvetica, sans; transition:background-color 1s ease; } +a { text-decoration:none; color:#26c; border:1px solid transparent; padding:0 0.1em; } +#folder-path { float:left; margin-bottom: 0.2em; } +#folder-path a { padding: .5em; } +#folder-path a:first-child { padding:.28em } #folder-path i.fa { font-size:135% } +button i.fa { font-size:110% } +.item { margin-bottom:.3em; padding:.3em .8em; border-top:1px solid #ddd; } +.item:hover { background:#f8f8f8; } +.item-props { float:right; font-size:90%; margin-left:12px; color:#777; margin-top:.2em; } +.item-link { float:left; word-break:break-word; /* fix long names without spaces on mobile */ } +.item img { vertical-align: text-bottom; margin:0 0.2em; } +.item .fa-lock { margin-right: 0.2em; } +.item .clearer { clear:both } +.comment { color:#666; padding:.1em .5em .2em; background-color: #f5f5f5; border-radius: 1em; margin-top: 0.1em; } +.comment>i { margin-right:0.5em; } +.item-size { margin-left:.3em } +.selector { float:left; width: 1.2em; height:1.2em; margin-right: .5em;} +.item-menu { padding:0.1em 0.3em; border-radius:0.6em; border: 1px outset; position: relative; top: -0.1em;} +.dialog-content .buttons { margin-top:1.5em } +.dialog-content .buttons button { margin:.5em auto; min-width: 9em; display:block; } +.dialog-content.error { background: #fcc; } +.dialog-content.error h2 { text-align:center } +.dialog-content.error button { background-color: #f77; color: white; } +#wrapper { max-width:60em; margin:auto; } /* not too wide or it will be harder to follow rows */ +#serverinfo { font-size:80%; text-align:center; margin: 1.5em 0 0.5em; } +#selection-panel { text-align:center; } +#selection-panel label { margin-right:0.8em } +#selection-panel button { vertical-align:baseline; } +#selection-panel .buttons { white-space:nowrap } + +.item-menu { display:none } +.can-comment .item-menu, +.can-rename .item-menu, +.can-delete .item-menu { display:inline-block; display:initial; } + +#folder-stats { font-size:90%; padding:.1em .3em; margin:.5em; float:right; } +#files,#nothing { clear:both } +#nothing { padding:1em } + +.dialog-overlay { background:rgba(0,0,0,.75); position:fixed; top:0; left:0; width:100%; height:100%; z-index:100; } +.dialog-content { position: absolute; top: 50%; left: 50%; + transform: translate(-50%, -50%); + -webkit-transform: translate(-50%, -50%); + -moz-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + -o-transform: translate(-50%, -50%); + background:#fff; border-radius: 1em; padding: 1em; text-align:center; min-width: 10em; +} +.ask input { border:1px solid rgba(0,0,0,0.5); padding: .2em; margin-top: .5em; } +.ask .close { float: right; font-size: 1.2em; color: red; position: relative; top: -0.4em; right: -0.3em; } + +#additional-panels input { color: #555; padding: .1em 0.3em; border-radius: 0.4em; } + +.additional-panel { position:relative; max-height: calc(100vh - 5em); text-align:left; margin: 0.5em 1em; padding: 0.5em 1em; border-radius: 1em; background-color:#555; border: 2px solid #aaa; color:#fff; line-height: 1.5em; display:inline-block; } +.additional-panel .close { position: absolute; right: -0.8em; top: -0.2em; color: #aaa; font-size: 130%; } + +body.dark-theme { background:#222; color:#aaa; } +body.dark-theme #title-bar { color:#bbb } +body.dark-theme a { color:#79b } +body.dark-theme a.pure-button { color:#444 } +body.dark-theme .item:hover { background:#111; } +body.dark-theme .pure-button { background:#89a; } +body.dark-theme .item .comment { background-color:#444; color:#888; } +body.dark-theme #foldercomment { background-color:#333; color:#999; } +body.dark-theme .dialog-overlay { background:rgba(100,100,100,.5) } +body.dark-theme .dialog-content { background:#222; color:#888; } +body.dark-theme input, +body.dark-theme textarea, +body.dark-theme select, +body.dark-theme #additional-panels input +{ background: #111; color: #aaa; } + +#msgs { display:none; } +#msgs li:first-child { font-weight:bold; } + +#menu-panel { position:fixed; top:0; left:0; width: 100%; background:#555; text-align:center; +position: -webkit-sticky; position: -moz-sticky; position: -ms-sticky; position: -o-sticky; position: sticky; margin-bottom:0.3em; +z-index:1; /* without this .item-menu will be over*/ } +#menu-panel button span { margin-left:.8em } +#user-panel button { padding:0.3em 0.6em; font-size:smaller; margin-left:1em; } +#user-panel span { position: relative; top: 0.1em; } +#menu-bar { padding:0.2em 0 } + +@media (min-width: 50em) { +#toggleTs { display: none } +} +@media (max-width: 50em) { +#menu-panel button { padding: .4em .6em; } +.additional-panel button span, +#menu-bar button span { display:none } /* icons only */ +#menu-bar i { font-size:120%; } /* bigger icons */ +#menu-bar button { width: 3em; max-width:10.7vw; padding: .4em 0; } +.hideTs .item-ts { display:none } +} + +#upload-panel { font-size: 88%;} +#upload-progress { margin-top:.5em; display:none; } +#upload-progress progress { width:10em; position:relative; top:.1em; } +#progress-text { position: absolute; color: #000; font-size: 80%; margin-left:.5em; z-index:1; } +#upload-results a { color:#b0c2d4; } +#upload-results>* { display:block; word-break: break-all; } +#upload-results>span { margin-left:.15em; } /* better alignment */ +#upload-results { max-height: calc(100vh - 11em); overflow: auto;} +#upload-panel>button { margin: auto; display: block; margin-top:.8em;} /* center it*/ + + +[file=folder=link|private] +
+ +
+ {.cut||-3|%item-modified%.} +[+file] + %item-size%B +[+file=folder=link] + {.if|{.get|is new.}|.} +[+file=folder] + +[+file=folder=link] +
+
+[+file=folder=link] + {.if| {.length|{.?search.}.} |{:{.123 if 2|
{.!item folder.} |{.breadcrumbs|{:%bread-name%/:}|from={.count substring|/|%folder%.}/breadcrumbs.}|
.}:} .} + {.123 if 2|
|{.commentNL|%item-comment%.}|
.} +
+ +[error-page] + + + + + + + + +%content% +
+
+HFS - %timestamp% +
+ + + +[not found] +

{.!Not found.}

+{.!go to root.} + +[overload] +

{.!Server Too Busy.}

+{.!The server is too busy to handle your request at this time. Retry later.} + +[max contemp downloads] +

{.!Download limit.}

+{.!max s dl msg.} +
({.disconnection reason.}) + +[unauthorized] +

{.!Unauthorized.}

+{.!Either your user name and password do not match, or you are not permitted to access this resource..} + +[deny] +

{.!Forbidden.}

+{.or|%reason%|{.!This resource is not accessible..}.} + +[ban] +

{.!You are banned.}

+%reason% + +[upload] + +[upload-file] + +[upload-results] +[{.cut|1|-1|%uploaded-files%.} +] + +[upload-success] +{ +"url":"%item-url%", +"name":"%item-name%", +"size":"%item-size%", +"speed":"%smart-speed%" +}, +{.if| {.length|%user%.} |{: + {.set item|{.force ansi|%folder%%item-name%.}|comment={.!uploaded by.} %user%.} +:}.} + +[upload-failed] +{ "err":"{.!%reason%.}", "name":"%item-name%" }, + +[progress|no log] + +
    +%progress-files% +
+ +[progress-nofiles] +{.!No file exchange in progress..} + +[progress-upload-file] +{.if not|{.{.?only.} = down.}|{: +
  • {.!Uploading.} %total% @ %speed-kb% KB/s +
    %filename% +
    {.!Time left.} %time-left%" +
    %perc%% +:}.} + +[progress-download-file] +{.if not|{.{.?only.} = up.}|{: +
  • {.!Downloading.} %total% @ %speed-kb% KB/s +
    %filename% +
    {.!Time left.} %time-left%" +
    %perc%% +:}.} + +[ajax.mkdir|no log] +{.check session.} +{.set|x|{.postvar|name.}.} +{.break|if={.pos|\|var=x.}{.pos|/|var=x.}|result=forbidden.} +{.break|if={.not|{.can mkdir.}.}|result=not authorized.} +{.set|x|{.force ansi|%folder%{.^x.}.}.} +{.break|if={.exists|{.^x.}.}|result=exists.} +{.break|if={.not|{.length|{.mkdir|{.^x.}.}.}.}|result=failed.} +{.add to log|{.!User.} %user% {.!created folder.} "{.^x.}".} +{.pipe|ok.} + +[ajax.rename|no log] +{.check session.} +{.break|if={.not|{.can rename.}.}|result=forbidden.} +{.break|if={.is file protected|{.postvar|from.}.}|result=forbidden.} +{.break|if={.is file protected|{.postvar|to.}.}|result=forbidden.} +{.set|x|{.force ansi|%folder%{.postvar|from.}.}.} +{.set|yn|{.force ansi|{.postvar|to.}.}.} +{.set|y|{.force ansi|%folder%.}{.^yn.}.} +{.break|if={.not|{.exists|{.^x.}.}.}|result=not found.} +{.break|if={.exists|{.^y.}.}|result=exists.} +{.set|comment| {.get item|{.^x.}|comment.} .} +{.set item|{.^x.}|comment=.} +{.break|if={.not|{.length|{.rename|{.^x.}|{.^yn.}.}.}.}|result=failed.} +{.set item|{.^x.}|resource={.filepath|{.get item|{.^x.}|resource.}.}{.^yn.}.} +{.set item|{.^x.}|name={.^yn.}.} +{.set item|{.^y.}|comment={.^comment.}.} +{.add to log|{.if|%user%|{.!User.} %user%|{.!Anonymous.}.} {.!renamed.} "{.^x.}" {.!to.} "{.^yn.}".} +{.pipe|ok.} + +[ajax.move|no log] +{.check session.} +{.set|dst|{.force ansi|{.postvar|dst.}.}.} +{.break|if={.not|{.and|{.can move.}|{.get|can delete.}|{.get|can upload|path={.^dst.}.}/and.}.} |result=forbidden.} +{.set|log|{.!Moving items to.} {.^dst.}.} +{.for each|fn|{.replace|:|{.no pipe||.}|{.force ansi|{.postvar|files.}.}.}|{: + {.break|if={.is file protected|var=fn.}|result=forbidden.} + {.set|x|{.force ansi|%folder%.}{.^fn.}.} + {.set|y|{.^dst.}/{.^fn.}.} + {.if not |{.exists|{.^x.}.}|{.^x.}: {.!not found.}|{: + {.if|{.exists|{.^y.}.}|{.^y.}: {.!already exists.}|{: + {.set|comment| {.get item|{.^x.}|comment.} .} + {.set item|{.^x.}|comment=.} {.comment| this must be done before moving, or it will fail.} + {.if|{.length|{.move|{.^x.}|{.^y.}.}.} |{: + {.move|{.^x.}.md5|{.^y.}.md5.} + {.set|log|{.chr|13.}{.^fn.}|mode=append.} + {.set item|{.^y.}|comment={.^comment.}.} + :} | {: + {.set|log|{.chr|13.}{.^fn.} (failed)|mode=append.} + {.maybe utf8|{.^fn.}.}: {.!not moved.} + :}/if.} + :}/if.} + :}.} + ; +:}.} +{.add to log|{.^log.}.} + +[ajax.comment|no log] +{.check session.} +{.break|if={.not|{.can comment.}.} |result=forbidden.} +{.for each|fn|{.replace|:|{.no pipe||.}|{.postvar|files.}.}|{: + {.break|if={.is file protected|var=fn.}|result=forbidden.} + {.set item|{.force ansi|%folder%{.^fn.}.}|comment={.force ansi|{.postvar|text.}.}.} +:}.} +{.pipe|ok.} + +[ajax.changepwd|no log] +{.check session.} +{.break|if={.not|{.can change pwd.}.} |result=forbidden.} +{.if|{.length|{.set account||password={.force ansi|{.postvar|new.}.}.}/length.}|ok|failed.} + +[special:alias] +check session=if|{.{.cookie|HFS_SID_.} != {.postvar|token.}.}|{:{.cookie|HFS_SID_|value=|expires=-1.} {.break|result=bad session.}:} +can mkdir=and|{.get|can upload.}|{.!option.newfolder.} +can comment=and|{.get|can upload.}|{.!option.comment.} +can rename=and|{.get|can delete.}|{.!option.rename.} +can delete=get|can delete +can change pwd=member of|can change password +can move=or|1|1 +escape attr=replace|"|"|$1 +commentNL=if|{.pos||$1.} +add bytes=switch|{.cut|-1||$1.}|,|0,1,2,3,4,5,6,7,8,9|$1 {.!Bytes.}|K,M,G,T|$1B + +[special:import] +{.new account|can change password|enabled=1|is group=1|notes=accounts members of this group will be allowed to change their password.} + +[lib.js|no log|cache] +//