Compare commits

..

34 Commits

Author SHA1 Message Date
Massimo Melina
6ff458fb73
Merge pull request #41 from divinity76/patch-1
warning about Delphi 10.4 Community being incompatible
2025-01-22 22:25:18 +01:00
divinity76
0d71b9946a
warning about Delphi 10.4 Community being incompatible 2023-03-25 12:45:10 +01:00
Massimo Melina
140528bac8
Create README.md 2023-03-12 17:42:10 +01:00
Massimo Melina
29f6bac31c default speed limit 50MBps 2020-08-30 23:26:11 +02:00
Massimo Melina
e233f6d29a fix: search and archive recently broken 2020-08-23 13:45:47 +02:00
Massimo Melina
6e4dcf5b56 fix: avoid dupe files in archive in case of ?search=* 2020-08-04 21:16:37 +02:00
Massimo Melina
61f1a14be6 updated .lng 2020-08-02 18:31:17 +02:00
Massimo Melina
2d1187b6a3 tpl: moved archive button to "selection" sub-menu 2020-08-02 17:44:02 +02:00
Massimo Melina
ca7caab85d fix: account dialog recently broken 2020-08-02 17:43:13 +02:00
Massimo Melina
9e662960e1 usability: standard ok/cancel buttons for "ask" dialog 2020-08-02 13:10:38 +02:00
Massimo Melina
21349e5c04 experiental ?mode=thumb to append to jpg files 2020-08-01 20:46:46 +02:00
Massimo Melina
db2ad83c77 new tpl syntax [^section] will prepend to [section] 2020-08-01 20:46:07 +02:00
Massimo Melina
a47541286a fix: unicode support with {.exec|out.} 2020-07-27 23:29:23 +02:00
Massimo Melina
62c30c8de1 fix: a {.command.} resulting in an empty string could actually produce a false error 2020-07-27 23:27:52 +02:00
Massimo Melina
ad439fa65f fix: some headers were not customizable with {.add header.} 2020-07-27 12:17:49 +02:00
Massimo Melina
2d131f2c5f fix: malformed non-ascii post variables when not url-encoded 2020-07-27 11:37:18 +02:00
Massimo Melina
ba2df13122 removed jquery dependency from default tpl 2020-07-08 15:22:35 +02:00
Massimo Melina
da294807ca removed 'append macros log' option 2020-07-08 13:26:28 +02:00
Massimo Melina
6625f08419 Revert "apply 1 minute timeout to file listing"
This reverts commit d43983e9
2020-07-08 13:24:27 +02:00
Massimo Melina
d43983e986 apply 1 minute timeout to file listing 2020-06-29 00:03:38 +02:00
Massimo Melina
4b5bffbd83 fix: possible CSRF 2020-06-29 00:02:20 +02:00
Massimo Melina
cf3761b7ed fix: 2 resource strings with same name 2020-06-28 20:31:25 +02:00
Massimo Melina
b5dc45f214 smarter displaying of 'status' columns (details moved to tooltip) 2020-06-28 14:12:24 +02:00
Massimo Melina
b1a95cd319 introduced 1 minute timeout for archive's files list building 2020-06-28 13:57:53 +02:00
Massimo Melina
6c5139d552 optimization: avoid resetting the array length when unnecessary 2020-06-28 11:34:07 +02:00
Massimo Melina
863c667f1b fix: apply anti-dos also to archives 2020-06-27 20:46:11 +02:00
Massimo Melina
44f37f92cf prevent macros coming from commands convert, base64decode, decodeuri 2020-06-23 20:16:12 +02:00
Massimo Melina
308561090f fix: {.dialog||yesno.} was not working 2020-06-23 20:14:24 +02:00
Massimo Melina
26ddc2b126 fix: {.calc.} not working with very small numbers (because rendered with exponential syntax) 2020-06-16 23:14:45 +02:00
Massimo Melina
65d4a142e4 new 'init' section for events file, executed at each reload 2020-06-16 23:13:22 +02:00
Massimo Melina
07f5f2ca6b fix: {.disconnect.} and {.disconnection reason.} not working in event 'pre-filter-request' 2020-06-16 23:12:36 +02:00
Massimo Melina
cba235c7b0 fix: {.set table.} duplicating keys instead of updating values 2020-06-16 00:39:11 +02:00
Massimo Melina
9220d33aa4 trigger 'unauthorized' event for new login and url-auth. Also added 'login' event in case of success. 2020-06-16 00:37:31 +02:00
Massimo Melina
efa99e7cbc new 'public' section flag in place of 'private', inverting logic 2020-06-16 00:35:15 +02:00
13 changed files with 1523 additions and 1219 deletions

View File

@ -1,3 +1,9 @@
# Obsolete
This is the repository of the old HFS.
I'm working on HFS 3 on another repository. Check it out!
https://github.com/rejetto/hfs
## Introduction ## Introduction
You can use HFS (HTTP File Server) to send and receive files. You can use HFS (HTTP File Server) to send and receive files.
It's different from classic file sharing because it uses web technology. It's different from classic file sharing because it uses web technology.
@ -9,6 +15,10 @@ The virtual file system will allow you to easily share even one single file.
Initially developed in 2002 with Delphi 6, now with Delphi 10.3.3 (Community Edition). Initially developed in 2002 with Delphi 6, now with Delphi 10.3.3 (Community Edition).
Icons are generated at http://fontello.com/ . Use fontello.json for further modifications. Icons are generated at http://fontello.com/ . Use fontello.json for further modifications.
For the default template we are targeting compatibility with Chrome 49 as it's the latest version running on Windows XP.
Warning: Delphi Community Edition 10.4 removed support for command-line compilation, and is thus unable to compile JEDI Code Library, and is thus unable to compile HFS2, ref [Community Edition no longer includes the command-line compilers](https://blogs.embarcadero.com/delphi-cbuilder-community-editions-now-available-in-version-10-4-2/#comment-1339) - meaning the last version of Community Edition cabale of compiling HFS2 is Delphi 10.3.x
## Libs used ## Libs used
- [ICS v8.64](http://www.overbyte.be) by François PIETTE - [ICS v8.64](http://www.overbyte.be) by François PIETTE
- [TRegExpr v0.952b](https://github.com/andgineer/TRegExpr/releases) by Andrey V. Sorokin - [TRegExpr v0.952b](https://github.com/andgineer/TRegExpr/releases) by Andrey V. Sorokin

View File

@ -27,6 +27,16 @@ uses
OverbyteIcsWSocket, OverbyteIcshttpProt; OverbyteIcsWSocket, OverbyteIcshttpProt;
type type
TantiDos = class
protected
accepted: boolean;
Paddress: string;
public
constructor create;
destructor Destroy; override;
function accept(conn:ThttpConn; address:string=''):boolean;
end;
TfastStringAppend = class TfastStringAppend = class
protected protected
buff: string; buff: string;
@ -89,6 +99,7 @@ type
constructor create; constructor create;
destructor Destroy; override; destructor Destroy; override;
function addFile(src:string; dst:string=''; data:Tobject=NIL):boolean; virtual; function addFile(src:string; dst:string=''; data:Tobject=NIL):boolean; virtual;
function contains(src:string):boolean;
function count():integer; function count():integer;
procedure reset(); virtual; procedure reset(); virtual;
property totalSize:int64 read getTotal; property totalSize:int64 read getTotal;
@ -139,7 +150,7 @@ type
PtplSection = ^TtplSection; PtplSection = ^TtplSection;
TtplSection = record TtplSection = record
name, txt: string; name, txt: string;
nolog, nourl, noList, cache: boolean; nolog, public, noList, cache: boolean;
ts: Tdatetime; ts: Tdatetime;
end; end;
@ -221,6 +232,70 @@ implementation
uses uses
utilLib, main, windows, dateUtils, forms; utilLib, main, windows, dateUtils, forms;
const folderConcurrents: integer = 0;
const MAX_CONCURRENTS = 3;
const ip2availability: Tdictionary<string,Tdatetime> = NIL;
constructor TantiDos.create();
begin
accepted:=FALSE;
end;
function TantiDos.accept(conn:ThttpConn; address:string=''):boolean;
procedure reject();
resourcestring
MSG_ANTIDOS_REPLY = 'Please wait, server busy';
begin
conn.reply.mode:=HRM_OVERLOAD;
conn.addHeader(ansistring('Refresh: '+intToStr(1+random(2)))); // random for less collisions
conn.reply.body:=UTF8Encode(MSG_ANTIDOS_REPLY);
end;
begin
if address= '' then
address:=conn.address;
if ip2availability = NIL then
ip2availability:=Tdictionary<string,Tdatetime>.create();
try
if ip2availability[address] > now() then // this specific address has to wait?
begin
reject();
exit(FALSE);
end;
except
end;
if folderConcurrents >= MAX_CONCURRENTS then // max number of concurrent folder loading, others are postponed
begin
reject();
exit(FALSE);
end;
inc(folderConcurrents);
Paddress:=address;
ip2availability.AddOrSetValue(address, now()+1/HOURS);
accepted:=TRUE;
Result:=TRUE;
end;
destructor TantiDos.Destroy;
var
pair: Tpair<string,Tdatetime>;
t: Tdatetime;
begin
if not accepted then
exit;
t:=now();
if folderConcurrents = MAX_CONCURRENTS then // serving multiple addresses at max capacity, let's give a grace period for others
ip2availability[Paddress]:=t + 1/SECONDS
else
ip2availability.Remove(Paddress);
dec(folderConcurrents);
// purge leftovers
for pair in ip2availability do
if pair.Value < t then
ip2availability.Remove(pair.Key);
end;
class function ThttpClient.createURL(url:string):ThttpClient; class function ThttpClient.createURL(url:string):ThttpClient;
begin begin
if startsText('https://', url) if startsText('https://', url)
@ -450,6 +525,16 @@ if cachedTotal < 0 then calculate();
result:=cachedTotal; result:=cachedTotal;
end; // getTotal end; // getTotal
function TarchiveStream.contains(src:string):boolean;
var
i: integer;
begin
for i:=0 to Length(flist)-1 do
if flist[i].src = src then
exit(TRUE);
result:=FALSE;
end;
function TarchiveStream.addFile(src:string; dst:string=''; data:Tobject=NIL):boolean; function TarchiveStream.addFile(src:string; dst:string=''; data:Tobject=NIL):boolean;
function getMtime(fh:Thandle):int64; function getMtime(fh:Thandle):int64;
@ -774,10 +859,12 @@ var
var var
i, posBak: int64; i, posBak: int64;
n: integer;
begin begin
posBak:=pos; posBak:=pos;
p:=@buffer; p:=@buffer;
while (count > 0) and (cur < length(flist)) do n:=length(flist);
while (count > 0) and (cur < n) do
case where of case where of
TW_HEADER: TW_HEADER:
begin begin
@ -1020,8 +1107,8 @@ var
begin begin
if f='no log' then if f='no log' then
base.nolog:=TRUE base.nolog:=TRUE
else if f='private' then else if f='public' then
base.nourl:=TRUE base.public:=TRUE
else if f='no list' then else if f='no list' then
base.noList:=TRUE base.noList:=TRUE
else if f='cache' then else if f='cache' then
@ -1051,7 +1138,7 @@ var
ss: TStringDynArray; ss: TStringDynArray;
s, si: string; s, si: string;
till: pchar; till: pchar;
append: boolean; append, prepend, add: boolean;
sect, from: PtplSection; sect, from: PtplSection;
begin begin
till:=pred(bos); till:=pred(bos);
@ -1067,8 +1154,10 @@ var
if not parseFlagsAndAcceptSection(ss) then if not parseFlagsAndAcceptSection(ss) then
exit; exit;
append:=ansiStartsStr('+', cur_section); prepend:=startsStr('^', cur_section);
if append then append:=startsStr('+', cur_section);
add:=prepend or append;
if add then
delete(cur_section,1,1); delete(cur_section,1,1);
// there may be several section names separated by = // there may be several section names separated by =
@ -1084,18 +1173,21 @@ var
from:=NIL; from:=NIL;
if sect = NIL then // not found if sect = NIL then // not found
begin begin
if append then if add then
from:=getSection(s); from:=getSection(s);
sect:=newSection(s); sect:=newSection(s);
end end
else else
if append then if add then
from:=sect; from:=sect;
if from<>NIL then if from<>NIL then
begin // inherit from it begin // inherit from it
sect.txt:=from.txt+base.txt; if append then
sect.txt:=from.txt+base.txt
else
sect.txt:=base.txt+CRLF+from.txt;
sect.nolog:=from.nolog or base.nolog; sect.nolog:=from.nolog or base.nolog;
sect.nourl:=from.nourl or base.nourl; sect.public:=from.public or base.public;
sect.noList:=from.noList or base.noList; sect.noList:=from.noList or base.noList;
continue; continue;
end; end;

File diff suppressed because one or more lines are too long

View File

@ -1,3 +1,5 @@
{$A+,B-,C+,E-,F-,G+,H+,I-,J+,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,X+,Y+,Z1}
{$DEFINE NOT STABLE } {$DEFINE NOT STABLE }
{$IFDEF STABLE } {$IFDEF STABLE }
{$ASSERTIONS OFF} {$ASSERTIONS OFF}

View File

@ -206,9 +206,10 @@
</Platforms> </Platforms>
<ModelSupport>False</ModelSupport> <ModelSupport>False</ModelSupport>
<Deployment Version="3"> <Deployment Version="3">
<DeployFile LocalName="hfs.exe" Configuration="Release" Class="ProjectOutput"> <DeployFile LocalName="hfs.dpr" Configuration="Release" Class="ProjectFile">
<Platform Name="Win32"> <Platform Name="Win32">
<RemoteName>hfs.exe</RemoteName> <RemoteDir>.\</RemoteDir>
<Enabled>false</Enabled>
<Overwrite>true</Overwrite> <Overwrite>true</Overwrite>
</Platform> </Platform>
</DeployFile> </DeployFile>
@ -218,16 +219,15 @@
<Overwrite>true</Overwrite> <Overwrite>true</Overwrite>
</Platform> </Platform>
</DeployFile> </DeployFile>
<DeployFile LocalName="hfs.dpr" Configuration="Debug" Class="ProjectFile"> <DeployFile LocalName="hfs.exe" Configuration="Release" Class="ProjectOutput">
<Platform Name="Win32"> <Platform Name="Win32">
<RemoteDir>.\</RemoteDir> <RemoteName>hfs.exe</RemoteName>
<Overwrite>true</Overwrite> <Overwrite>true</Overwrite>
</Platform> </Platform>
</DeployFile> </DeployFile>
<DeployFile LocalName="hfs.dpr" Configuration="Release" Class="ProjectFile"> <DeployFile LocalName="hfs.dpr" Configuration="Debug" Class="ProjectFile">
<Platform Name="Win32"> <Platform Name="Win32">
<RemoteDir>.\</RemoteDir> <RemoteDir>.\</RemoteDir>
<Enabled>false</Enabled>
<Overwrite>true</Overwrite> <Overwrite>true</Overwrite>
</Platform> </Platform>
</DeployFile> </DeployFile>

640
hfs.drc
View File

@ -8,272 +8,273 @@
resources were bound to the produced executable. resources were bound to the produced executable.
*/ */
#define main_MSG_NUM_ADDR_DL 64656 #define main_MSG_NUM_ADDR 64656
#define main_MSG_MAX_LINES 64657 #define main_MSG_NUM_ADDR_DL 64657
#define main_MSG_APACHE_LOG_FMT 64658 #define main_MSG_MAX_LINES 64658
#define main_MSG_APACHE_LOG_FMT_LONG 64659 #define main_MSG_APACHE_LOG_FMT 64659
#define main_MSG_ICONS_ADDED 64660 #define main_MSG_APACHE_LOG_FMT_LONG 64660
#define main_MSG_DDNS_DISABLED 64661 #define main_MSG_ICONS_ADDED 64661
#define main_MSG_MD5_WARN 64662 #define main_MSG_DDNS_DISABLED 64662
#define main_MSG_AUTO_MD5 64663 #define main_MSG_MD5_WARN 64663
#define main_MSG_AUTO_MD5_LONG 64664 #define main_MSG_AUTO_MD5 64664
#define main_MSG_UPL_HOWTO 64665 #define main_MSG_AUTO_MD5_LONG 64665
#define main_MSG_EDIT_RES 64672 #define main_MSG_UPL_HOWTO 64666
#define main_MSG_TPL_USE_MACROS 64673 #define main_MSG_EVENTS_HLP 64672
#define main_REMOVE_SHELL 64674 #define main_MSG_EDIT_RES 64673
#define main_S_OFF 64675 #define main_MSG_TPL_USE_MACROS 64674
#define main_S_ON 64676 #define main_REMOVE_SHELL 64675
#define main_LOG 64677 #define main_S_OFF 64676
#define main_MSG_RE_NOIP 64678 #define main_S_ON 64677
#define main_MSG_TRAY_DEF 64679 #define main_LOG 64678
#define main_MSG_CLEAN_START 64680 #define main_MSG_RE_NOIP 64679
#define main_MSG_RESTORE_BAK 64681 #define main_MSG_TRAY_DEF 64680
#define main_MSG_EXT_ADDR_FAIL 64682 #define main_MSG_CLEAN_START 64681
#define main_MSG_TO_EXPERT 64683 #define main_MSG_RESTORE_BAK 64682
#define main_MSG_DONT_LOG_HINT 64684 #define main_MSG_EXT_ADDR_FAIL 64683
#define main_MSG_DL_PERC 64685 #define main_MSG_TO_EXPERT 64684
#define main_MSG_UNINSTALL_WARN 64686 #define main_MSG_DONT_LOG_HINT 64685
#define main_MSG_NUM_ADDR 64687 #define main_MSG_DL_PERC 64686
#define main_MSG_SELF_6 64688 #define main_MSG_UNINSTALL_WARN 64687
#define main_MSG_SELF_7 64689 #define main_MSG_SELF_3 64688
#define main_MSG_RET_EXT 64690 #define main_MSG_SELF_6 64689
#define main_MSG_SELF_CANT_ON 64691 #define main_MSG_SELF_7 64690
#define main_MSG_SELF_CANT_LIST 64692 #define main_MSG_RET_EXT 64691
#define main_MSG_SELF_CANT_S 64693 #define main_MSG_SELF_CANT_ON 64692
#define main_MSG_SELF_ING 64694 #define main_MSG_SELF_CANT_LIST 64693
#define main_MSG_TEST_CANC 64695 #define main_MSG_SELF_CANT_S 64694
#define main_MSG_TEST_INET 64696 #define main_MSG_SELF_ING 64695
#define main_MSG_SELF_UNAV 64697 #define main_MSG_TEST_CANC 64696
#define main_MSG_SELF_NO_INET 64698 #define main_MSG_TEST_INET 64697
#define main_MSG_SELF_NO_ANSWER 64699 #define main_MSG_SELF_UNAV 64698
#define main_MSG_OPEN_BROW 64700 #define main_MSG_SELF_NO_INET 64699
#define main_MSG_OPEN_BROW_LONG 64701 #define main_MSG_SELF_NO_ANSWER 64700
#define main_MSG_HIDE_PORT 64702 #define main_MSG_OPEN_BROW 64701
#define main_MSG_EVENTS_HLP 64703 #define main_MSG_OPEN_BROW_LONG 64702
#define main_MSG_DISAB_FIND_EXT 64704 #define main_MSG_HIDE_PORT 64703
#define main_MSG_ENT_URL 64705 #define main_MSG_RESET_TOT 64704
#define main_MSG_ENT_URL_LONG 64706 #define main_MSG_DISAB_FIND_EXT 64705
#define main_MSG_ENT_USR 64707 #define main_MSG_ENT_URL 64706
#define main_MSG_ENT_PWD 64708 #define main_MSG_ENT_URL_LONG 64707
#define main_MSG_ENT_HOST 64709 #define main_MSG_ENT_USR 64708
#define main_MSG_ENT_HOST_LONG 64710 #define main_MSG_ENT_PWD 64709
#define main_MSG_HOST_FORM 64711 #define main_MSG_ENT_HOST 64710
#define main_MSG_MIN_SPACE 64712 #define main_MSG_ENT_HOST_LONG 64711
#define main_MSG_MIN_SPACE_LONG 64713 #define main_MSG_HOST_FORM 64712
#define main_MSG_REN_PART 64714 #define main_MSG_MIN_SPACE 64713
#define main_MSG_REN_PART_LONG 64715 #define main_MSG_MIN_SPACE_LONG 64714
#define main_MSG_SELF_BEFORE 64716 #define main_MSG_REN_PART 64715
#define main_MSG_SELF_OK 64717 #define main_MSG_REN_PART_LONG 64716
#define main_MSG_SELF_OK_PORT 64718 #define main_MSG_SELF_BEFORE 64717
#define main_MSG_SELF_3 64719 #define main_MSG_SELF_OK 64718
#define main_MSG_LOG_FILE_LONG 64720 #define main_MSG_SELF_OK_PORT 64719
#define main_MSG_SET_URL 64721 #define main_MSG_LOG_FILE 64720
#define main_MSG_SET_URL_LONG 64722 #define main_MSG_LOG_FILE_LONG 64721
#define main_MSG_REALM 64723 #define main_MSG_SET_URL 64722
#define main_MSG_REALM_LONG 64724 #define main_MSG_SET_URL_LONG 64723
#define main_MSG_INACT_TIMEOUT 64725 #define main_MSG_REALM 64724
#define main_MSG_INACT_TIMEOUT_LONG 64726 #define main_MSG_REALM_LONG 64725
#define main_MSG_CHANGES_LOST 64727 #define main_MSG_INACT_TIMEOUT 64726
#define main_MSG_FLAG_NEW 64728 #define main_MSG_INACT_TIMEOUT_LONG 64727
#define main_MSG_FLAG_NEW_LONG 64729 #define main_MSG_CHANGES_LOST 64728
#define main_MSG_DONT_LOG_MASK 64730 #define main_MSG_FLAG_NEW 64729
#define main_MSG_DONT_LOG_MASK_LONG 64731 #define main_MSG_FLAG_NEW_LONG 64730
#define main_MSG_CUST_IP 64732 #define main_MSG_DONT_LOG_MASK 64731
#define main_MSG_CUST_IP_LONG 64733 #define main_MSG_DONT_LOG_MASK_LONG 64732
#define main_MSG_NO_EXT_IP 64734 #define main_MSG_CUST_IP 64733
#define main_MSG_RESET_TOT 64735 #define main_MSG_CUST_IP_LONG 64734
#define main_MSG_LOADING_VFS 64736 #define main_MSG_NO_EXT_IP 64735
#define main_MSG_VFS_OLD 64737 #define main_MSG_TENTH_SEC 64736
#define main_MSG_UNK_FK 64738 #define main_MSG_LOADING_VFS 64737
#define main_MSG_VIS_ONLY_ANON 64739 #define main_MSG_VFS_OLD 64738
#define main_MSG_AUTO_DISABLED 64740 #define main_MSG_UNK_FK 64739
#define main_MSG_CORRUPTED 64741 #define main_MSG_VIS_ONLY_ANON 64740
#define main_MSG_MACROS_FOUND 64742 #define main_MSG_AUTO_DISABLED 64741
#define main_MSG_UPD_INFO 64743 #define main_MSG_CORRUPTED 64742
#define main_MSG_NEWER 64744 #define main_MSG_MACROS_FOUND 64743
#define main_MSG_SRC_UPD 64745 #define main_MSG_UPD_INFO 64744
#define main_ARE_EXPERT 64746 #define main_MSG_NEWER 64745
#define main_ARE_EASY 64747 #define main_MSG_SRC_UPD 64746
#define main_SW2EXPERT 64748 #define main_ARE_EXPERT 64747
#define main_SW2EASY 64749 #define main_ARE_EASY 64748
#define main_MSG_DL_TIMEOUT_LONG 64750 #define main_SW2EXPERT 64749
#define main_MSG_LOG_FILE 64751 #define main_SW2EASY 64750
#define main_MSG_ZLIB 64752 #define main_MSG_DL_TIMEOUT_LONG 64751
#define main_MSG_BAKAVAILABLE 64753 #define main_MSG_NEWER_INCOMP 64752
#define main_MSG_CANT_LOAD_SAVE 64754 #define main_MSG_ZLIB 64753
#define main_MSG_OPEN_VFS 64755 #define main_MSG_BAKAVAILABLE 64754
#define main_LIMIT 64756 #define main_MSG_CANT_LOAD_SAVE 64755
#define main_TOP_SPEED 64757 #define main_MSG_OPEN_VFS 64756
#define main_MSG_MAX_BW 64758 #define main_LIMIT 64757
#define main_MSG_LIM0 64759 #define main_TOP_SPEED 64758
#define main_MSG_MAX_BW_1 64760 #define main_MSG_MAX_BW 64759
#define main_MSG_GRAPH_RATE_MENU 64761 #define main_MSG_LIM0 64760
#define main_MSG_MAX_CON_LONG 64762 #define main_MSG_MAX_BW_1 64761
#define main_MSG_WARN_CONN 64763 #define main_MSG_GRAPH_RATE_MENU 64762
#define main_MSG_WARN_ACT_DL 64764 #define main_MSG_MAX_CON_LONG 64763
#define main_MSG_MAX_CON_SING_LONG 64765 #define main_MSG_WARN_CONN 64764
#define main_MSG_GRAPH_RATE 64766 #define main_MSG_WARN_ACT_DL 64765
#define main_MSG_TENTH_SEC 64767 #define main_MSG_MAX_CON_SING_LONG 64766
#define main_MSG_CON_STATE_IDLE 64768 #define main_MSG_GRAPH_RATE 64767
#define main_MSG_CON_STATE_REQ 64769 #define main_MSG_VFS_DONT_CONS_DL_MASK 64768
#define main_MSG_CON_STATE_RCV 64770 #define main_MSG_VFS_INHERITED 64769
#define main_MSG_CON_STATE_THINK 64771 #define main_MSG_VFS_EXTERNAL 64770
#define main_MSG_CON_STATE_REP 64772 #define main_MSG_CON_HINT 64771
#define main_MSG_CON_STATE_SEND 64773 #define main_MSG_CON_STATE_IDLE 64772
#define main_MSG_CON_STATE_DISC 64774 #define main_MSG_CON_STATE_REQ 64773
#define main_MSG_CON_PAUSED 64775 #define main_MSG_CON_STATE_RCV 64774
#define main_MSG_CON_SENT 64776 #define main_MSG_CON_STATE_THINK 64775
#define main_MSG_CON_RECEIVED 64777 #define main_MSG_CON_STATE_REP 64776
#define main_MSG_TPL_RESET 64778 #define main_MSG_CON_STATE_SEND 64777
#define main_MSG_ALLO_REF 64779 #define main_MSG_CON_STATE_DISC 64778
#define main_MSG_ALLO_REF_LONG 64780 #define main_MSG_TPL_RESET 64779
#define main_MSG_BETTERSTOP 64781 #define main_MSG_ALLO_REF 64780
#define main_MSG_BADCRC 64782 #define main_MSG_ALLO_REF_LONG 64781
#define main_MSG_NEWER 64783 #define main_MSG_BETTERSTOP 64782
#define main_MSG_VFS_ARCABLE 64784 #define main_MSG_BADCRC 64783
#define main_MSG_VFS_DEF_MASK 64785 #define main_MSG_VFS_HIDE_EMPTY 64784
#define main_MSG_VFS_ACCESS 64786 #define main_MSG_VFS_NOT_BROW 64785
#define main_MSG_VFS_UPLOAD 64787 #define main_MSG_VFS_HIDE_EMPTY_FLD 64786
#define main_MSG_VFS_DELETE 64788 #define main_MSG_VFS_HIDE_EXT 64787
#define main_MSG_VFS_COMMENT 64789 #define main_MSG_VFS_ARCABLE 64788
#define main_MSG_VFS_REALM 64790 #define main_MSG_VFS_DEF_MASK 64789
#define main_MSG_VFS_DIFF_TPL 64791 #define main_MSG_VFS_ACCESS 64790
#define main_MSG_VFS_FILES_FLT 64792 #define main_MSG_VFS_UPLOAD 64791
#define main_MSG_VFS_FLD_FLT 64793 #define main_MSG_VFS_DELETE 64792
#define main_MSG_VFS_UPL_FLT 64794 #define main_MSG_VFS_COMMENT 64793
#define main_MSG_VFS_DONT_CONS_DL 64795 #define main_MSG_VFS_REALM 64794
#define main_MSG_VFS_DONT_CONS_DL_MASK 64796 #define main_MSG_VFS_DIFF_TPL 64795
#define main_MSG_VFS_INHERITED 64797 #define main_MSG_VFS_FILES_FLT 64796
#define main_MSG_VFS_EXTERNAL 64798 #define main_MSG_VFS_FLD_FLT 64797
#define main_MSG_CON_HINT 64799 #define main_MSG_VFS_UPL_FLT 64798
#define main_VFS_ITEMS 64800 #define main_MSG_VFS_DONT_CONS_DL 64799
#define main_MSG_ITEM_EXISTS 64801 #define main_IN_SPEED 64800
#define main_MSG_INSTALL_TPL 64802 #define main_BANS 64801
#define main_MSG_FOLDER_UPLOAD 64803 #define main_MEMORY 64802
#define main_MSG_VFS_DRAG_INVIT 64804 #define main_CUST_TPL 64803
#define main_MSG_VFS_URL 64805 #define main_VFS_ITEMS 64804
#define main_MSG_VFS_PATH 64806 #define main_MSG_ITEM_EXISTS 64805
#define main_MSG_VFS_SIZE 64807 #define main_MSG_INSTALL_TPL 64806
#define main_MSG_VFS_DLS 64808 #define main_MSG_FOLDER_UPLOAD 64807
#define main_MSG_VFS_INVISIBLE 64809 #define main_MSG_VFS_DRAG_INVIT 64808
#define main_MSG_VFS_DL_FORB 64810 #define main_MSG_VFS_URL 64809
#define main_MSG_VFS_DONT_LOG 64811 #define main_MSG_VFS_PATH 64810
#define main_MSG_VFS_HIDE_EMPTY 64812 #define main_MSG_VFS_SIZE 64811
#define main_MSG_VFS_NOT_BROW 64813 #define main_MSG_VFS_DLS 64812
#define main_MSG_VFS_HIDE_EMPTY_FLD 64814 #define main_MSG_VFS_INVISIBLE 64813
#define main_MSG_VFS_HIDE_EXT 64815 #define main_MSG_VFS_DL_FORB 64814
#define main_MSG_CHK_UPD_FAIL 64816 #define main_MSG_VFS_DONT_LOG 64815
#define main_MSG_CHK_UPD_HEAD 64817 #define main_MSG_UPD_DL 64816
#define main_MSG_CHK_UPD_VER 64818 #define main_MSG_UPDATE 64817
#define main_MSG_CHK_UPD_VER_EXT 64819 #define main_MSG_REQUESTING 64818
#define main_MSG_CHK_UPD_NONE 64820 #define main_MSG_CHK_UPD 64819
#define main_TO_CLIP 64821 #define main_MSG_CHK_UPD_FAIL 64820
#define main_ALREADY_CLIP 64822 #define main_MSG_CHK_UPD_HEAD 64821
#define main_MSG_NO_SPACE 64823 #define main_MSG_CHK_UPD_VER 64822
#define main_CONN 64824 #define main_MSG_CHK_UPD_VER_EXT 64823
#define main_TOT_IN 64825 #define main_MSG_CHK_UPD_NONE 64824
#define main_TOT_OUT 64826 #define main_TO_CLIP 64825
#define main_OUT_SPEED 64827 #define main_ALREADY_CLIP 64826
#define main_IN_SPEED 64828 #define main_MSG_NO_SPACE 64827
#define main_BANS 64829 #define main_CONN 64828
#define main_MEMORY 64830 #define main_TOT_IN 64829
#define main_CUST_TPL 64831 #define main_TOT_OUT 64830
#define main_AUTOSAVE 64832 #define main_OUT_SPEED 64831
#define main_SECONDS 64833 #define main_MSG_FILE_ADD_ABORT 64832
#define main_MSG_SPD_LIMIT_SING 64834 #define main_MSG_ADDING 64833
#define main_MSG_SPD_LIMIT 64835 #define main_MSG_INV_FILENAME 64834
#define main_MSG_AUTO_SAVE 64836 #define main_MSG_DELETE 64835
#define main_MSG_AUTO_SAVE_LONG 64837 #define main_AUTOSAVE 64836
#define main_MSG_MIN 64838 #define main_SECONDS 64837
#define main_MSG_BAN 64839 #define main_MSG_SPD_LIMIT_SING 64838
#define main_MSG_CANT_SAVE_OPT 64840 #define main_MSG_SPD_LIMIT 64839
#define main_MSG_UPD_SAVE_ERROR 64841 #define main_MSG_AUTO_SAVE 64840
#define main_MSG_UPD_REQ_ONLY1 64842 #define main_MSG_AUTO_SAVE_LONG 64841
#define main_MSG_UPD_WAIT 64843 #define main_MSG_MIN 64842
#define main_MSG_UPD_DL 64844 #define main_MSG_BAN 64843
#define main_MSG_UPDATE 64845 #define main_MSG_CANT_SAVE_OPT 64844
#define main_MSG_REQUESTING 64846 #define main_MSG_UPD_SAVE_ERROR 64845
#define main_MSG_CHK_UPD 64847 #define main_MSG_UPD_REQ_ONLY1 64846
#define main_MSG_LOG_UPL 64848 #define main_MSG_UPD_WAIT 64847
#define main_MSG_LOG_UPLOADED 64849 #define main_MSG_LOG_HEAD 64848
#define main_MSG_LOG_UPL_FAIL 64850 #define main_MSG_LOG_NOT_MOD 64849
#define main_MSG_LOG_DL 64851 #define main_MSG_LOG_REDIR 64850
#define main_MSG_LOGIN_FAILED 64852 #define main_MSG_LOG_NOT_SERVED 64851
#define main_MSG_MIN_DISK_REACHED 64853 #define main_MSG_LOG_UPL 64852
#define main_MSG_UPL_NAME_FORB 64854 #define main_MSG_LOG_UPLOADED 64853
#define main_MSG_UPL_CANT_CREATE 64855 #define main_MSG_LOG_UPL_FAIL 64854
#define main_FINGERPRINT 64856 #define main_MSG_LOG_DL 64855
#define main_NO_FINGERPRINT 64857 #define main_MSG_LOGIN_FAILED 64856
#define main_MSG_SAVE_VFS 64858 #define main_MSG_MIN_DISK_REACHED 64857
#define main_MSG_INP_COMMENT 64859 #define main_MSG_UPL_NAME_FORB 64858
#define main_MSG_FILE_ADD_ABORT 64860 #define main_MSG_UPL_CANT_CREATE 64859
#define main_MSG_ADDING 64861 #define main_FINGERPRINT 64860
#define main_MSG_INV_FILENAME 64862 #define main_NO_FINGERPRINT 64861
#define main_MSG_DELETE 64863 #define main_MSG_SAVE_VFS 64862
#define main_MSG_PORT_USED_BY 64864 #define main_MSG_INP_COMMENT 64863
#define main_MSG_PORT_BLOCKED 64865 #define main_MSG_BAN_CMT 64864
#define main_MSG_KICK_ALL 64866 #define main_MSG_BAN_CMT_LONG 64865
#define main_MSG_TPL_INCOMPATIBLE 64867 #define main_MSG_BREAK_DYN_DNS 64866
#define main_MSG_LOG_SERVER_START 64868 #define main_MSG_CANT_OPEN_PORT 64867
#define main_MSG_LOG_SERVER_STOP 64869 #define main_MSG_PORT_USED_BY 64868
#define main_MSG_LOG_CONNECTED 64870 #define main_MSG_PORT_BLOCKED 64869
#define main_MSG_LOG_DISC_SRV 64871 #define main_MSG_KICK_ALL 64870
#define main_MSG_LOG_DISC 64872 #define main_MSG_TPL_INCOMPATIBLE 64871
#define main_MSG_LOG_GOT 64873 #define main_MSG_LOG_SERVER_START 64872
#define main_MSG_LOG_BYTES_SENT 64874 #define main_MSG_LOG_SERVER_STOP 64873
#define main_MSG_LOG_SERVED 64875 #define main_MSG_LOG_CONNECTED 64874
#define main_MSG_LOG_HEAD 64876 #define main_MSG_LOG_DISC_SRV 64875
#define main_MSG_LOG_NOT_MOD 64877 #define main_MSG_LOG_DISC 64876
#define main_MSG_LOG_REDIR 64878 #define main_MSG_LOG_GOT 64877
#define main_MSG_LOG_NOT_SERVED 64879 #define main_MSG_LOG_BYTES_SENT 64878
#define main_MSG_DDNS_nohost 64880 #define main_MSG_LOG_SERVED 64879
#define main_MSG_DDNS_notyours 64881 #define main_MSG_DDNS_FAIL 64880
#define main_MSG_DDNS_numhost 64882 #define main_MSG_DDNS_REPLY_SIZE 64881
#define main_MSG_DDNS_abuse 64883 #define main_MSG_DDNS_badauth 64882
#define main_MSG_DDNS_dnserr 64884 #define main_MSG_DDNS_notfqdn 64883
#define main_MSG_DDNS_911 64885 #define main_MSG_DDNS_nohost 64884
#define main_MSG_DDNS_notdonator 64886 #define main_MSG_DDNS_notyours 64885
#define main_MSG_DDNS_badagent 64887 #define main_MSG_DDNS_numhost 64886
#define main_MSG_BAN_MASK 64888 #define main_MSG_DDNS_abuse 64887
#define main_MSG_IP_MASK_LONG 64889 #define main_MSG_DDNS_dnserr 64888
#define main_MSG_KICK_ADDR 64890 #define main_MSG_DDNS_911 64889
#define main_MSG_BAN_ALREADY 64891 #define main_MSG_DDNS_notdonator 64890
#define main_MSG_BAN_CMT 64892 #define main_MSG_DDNS_badagent 64891
#define main_MSG_BAN_CMT_LONG 64893 #define main_MSG_BAN_MASK 64892
#define main_MSG_BREAK_DYN_DNS 64894 #define main_MSG_IP_MASK_LONG 64893
#define main_MSG_CANT_OPEN_PORT 64895 #define main_MSG_KICK_ADDR 64894
#define main_MSG_NO_TEMP 64896 #define main_MSG_BAN_ALREADY 64895
#define main_MSG_ERROR_REGISTRY 64897 #define main_MSG_ADDRESSES_EXCEED 64896
#define main_MSG_MANY_ITEMS 64898 #define main_MSG_NO_TEMP 64897
#define main_MSG_ADD_TO_HFS 64899 #define main_MSG_ERROR_REGISTRY 64898
#define main_MSG_SINGLE_INSTANCE 64900 #define main_MSG_MANY_ITEMS 64899
#define main_MSG_COMM_ERROR 64901 #define main_MSG_ADD_TO_HFS 64900
#define main_MSG_DDNS_NO_REPLY 64902 #define main_MSG_SINGLE_INSTANCE 64901
#define main_MSG_DDNS_OK 64903 #define main_MSG_COMM_ERROR 64902
#define main_MSG_DDNS_UNK 64904 #define main_MSG_CON_PAUSED 64903
#define main_MSG_DDNS_ERR 64905 #define main_MSG_CON_SENT 64904
#define main_MSG_DDNS_REQ 64906 #define main_MSG_CON_RECEIVED 64905
#define main_MSG_DDNS_DOING 64907 #define main_MSG_DDNS_NO_REPLY 64906
#define main_MSG_DDNS_FAIL 64908 #define main_MSG_DDNS_OK 64907
#define main_MSG_DDNS_REPLY_SIZE 64909 #define main_MSG_DDNS_UNK 64908
#define main_MSG_DDNS_badauth 64910 #define main_MSG_DDNS_ERR 64909
#define main_MSG_DDNS_notfqdn 64911 #define main_MSG_DDNS_REQ 64910
#define main_MSG_MAX_SIM_ADDR 64912 #define main_MSG_DDNS_DOING 64911
#define main_MSG_MAX_SIM_ADDR_DL 64913 #define main_MSG_MAX_CON_SING 64912
#define main_MSG_MAX_SIM_DL_SING 64914 #define main_MSG_MAX_SIM_ADDR 64913
#define main_MSG_MAX_SIM_DL 64915 #define main_MSG_MAX_SIM_ADDR_DL 64914
#define main_MSG_SET_LIMIT 64916 #define main_MSG_MAX_SIM_DL_SING 64915
#define main_MSG_UNPROTECTED_LINKS 64917 #define main_MSG_MAX_SIM_DL 64916
#define main_MSG_SAME_NAME 64918 #define main_MSG_SET_LIMIT 64917
#define main_MSG_CONTINUE 64919 #define main_MSG_UNPROTECTED_LINKS 64918
#define main_MSG_PROCESSING 64920 #define main_MSG_SAME_NAME 64919
#define main_MSG_SPEED_KBS 64921 #define main_MSG_CONTINUE 64920
#define main_MSG_OPTIONS_SAVED 64922 #define main_MSG_PROCESSING 64921
#define main_MSG_SOME_LOCKED 64923 #define main_MSG_SPEED_KBS 64922
#define main_MSG_ITEM_LOCKED 64924 #define main_MSG_OPTIONS_SAVED 64923
#define main_MSG_INVALID_VALUE 64925 #define main_MSG_SOME_LOCKED 64924
#define main_MSG_EMPTY_NO_LIMIT 64926 #define main_MSG_ITEM_LOCKED 64925
#define main_MSG_ADDRESSES_EXCEED 64927 #define main_MSG_INVALID_VALUE 64926
#define main_MSG_EMPTY_NO_LIMIT 64927
#define JclResources_RsIntelCacheDescrF0 64928 #define JclResources_RsIntelCacheDescrF0 64928
#define JclResources_RsIntelCacheDescrF1 64929 #define JclResources_RsIntelCacheDescrF1 64929
#define JclResources_RsIntelCacheDescrFF 64930 #define JclResources_RsIntelCacheDescrFF 64930
@ -281,15 +282,15 @@
#define JclResources_RsOSVersionWinServer2012 64932 #define JclResources_RsOSVersionWinServer2012 64932
#define JclResources_RsOSVersionWin81 64933 #define JclResources_RsOSVersionWin81 64933
#define JclResources_RsOSVersionWinServer2012R2 64934 #define JclResources_RsOSVersionWinServer2012R2 64934
#define optionsDlg_MSG_INVERT_BAN 64935 #define classesLib_MSG_ANTIDOS_REPLY 64935
#define main_S_PORT_LABEL 64936 #define optionsDlg_MSG_INVERT_BAN 64936
#define main_S_PORT_ANY 64937 #define main_S_PORT_LABEL 64937
#define main_DISABLED 64938 #define main_S_PORT_ANY 64938
#define main_S_OK 64939 #define main_DISABLED 64939
#define main_MSG_MENU_VAL 64940 #define main_S_OK 64940
#define main_MSG_DL_TIMEOUT 64941 #define main_MSG_MENU_VAL 64941
#define main_MSG_MAX_CON 64942 #define main_MSG_DL_TIMEOUT 64942
#define main_MSG_MAX_CON_SING 64943 #define main_MSG_MAX_CON 64943
#define JclResources_RsIntelCacheDescrCA 64944 #define JclResources_RsIntelCacheDescrCA 64944
#define JclResources_RsIntelCacheDescrD0 64945 #define JclResources_RsIntelCacheDescrD0 64945
#define JclResources_RsIntelCacheDescrD1 64946 #define JclResources_RsIntelCacheDescrD1 64946
@ -884,6 +885,7 @@
#define System_SysConst_SDiskFull 65535 #define System_SysConst_SDiskFull 65535
STRINGTABLE STRINGTABLE
BEGIN BEGIN
main_MSG_NUM_ADDR, L"In this moment there are %d different addresses"
main_MSG_NUM_ADDR_DL, L"In this moment there are %d different addresses downloading" main_MSG_NUM_ADDR_DL, L"In this moment there are %d different addresses downloading"
main_MSG_MAX_LINES, L"Max lines on screen." main_MSG_MAX_LINES, L"Max lines on screen."
main_MSG_APACHE_LOG_FMT, L"Apache log file format" main_MSG_APACHE_LOG_FMT, L"Apache log file format"
@ -894,6 +896,7 @@ BEGIN
main_MSG_AUTO_MD5, L"Auto fingerprint" main_MSG_AUTO_MD5, L"Auto fingerprint"
main_MSG_AUTO_MD5_LONG, L"When you add files and no fingerprint is found, it is calculated.\rTo avoid long waitings, set a limit to file size (in KiloBytes).\rLeave empty to disable, and have no fingerprint created." main_MSG_AUTO_MD5_LONG, L"When you add files and no fingerprint is found, it is calculated.\rTo avoid long waitings, set a limit to file size (in KiloBytes).\rLeave empty to disable, and have no fingerprint created."
main_MSG_UPL_HOWTO, L"1. Add a folder (choose \"real folder\")\r\rYou should now see a RED folder in your virtual file sytem, inside HFS\r\r2. Right click on this folder\r3. Properties -> Permissions -> Upload\r4. Check on \"Anyone\"\r5. Ok\r\rNow anyone who has access to your HFS server can upload files to you." main_MSG_UPL_HOWTO, L"1. Add a folder (choose \"real folder\")\r\rYou should now see a RED folder in your virtual file sytem, inside HFS\r\r2. Right click on this folder\r3. Properties -> Permissions -> Upload\r4. Check on \"Anyone\"\r5. Ok\r\rNow anyone who has access to your HFS server can upload files to you."
main_MSG_EVENTS_HLP, L"For help on how to use this file please refer http://www.rejetto.com/wiki/?title=HFS:_Event_scripts"
main_MSG_EDIT_RES, L"Edit resource" main_MSG_EDIT_RES, L"Edit resource"
main_MSG_TPL_USE_MACROS, L"The current template is using macros.\rDo you want to cancel this action?" main_MSG_TPL_USE_MACROS, L"The current template is using macros.\rDo you want to cancel this action?"
main_REMOVE_SHELL, L"Remove from shell context menu" main_REMOVE_SHELL, L"Remove from shell context menu"
@ -909,7 +912,7 @@ BEGIN
main_MSG_DONT_LOG_HINT, L"Select the files/folder you don't want to be logged,\rthen right click and select \"Don't log\"." main_MSG_DONT_LOG_HINT, L"Select the files/folder you don't want to be logged,\rthen right click and select \"Don't log\"."
main_MSG_DL_PERC, L"Downloading %d%%" main_MSG_DL_PERC, L"Downloading %d%%"
main_MSG_UNINSTALL_WARN, L"Delete HFS and all settings?" main_MSG_UNINSTALL_WARN, L"Delete HFS and all settings?"
main_MSG_NUM_ADDR, L"In this moment there are %d different addresses" main_MSG_SELF_3, L"You may be behind a router or firewall."
main_MSG_SELF_6, L"You are behind a router.\rEnsure it is configured to forward port %s to your computer." main_MSG_SELF_6, L"You are behind a router.\rEnsure it is configured to forward port %s to your computer."
main_MSG_SELF_7, L"You may be behind a firewall.\rEnsure nothing is blocking HFS." main_MSG_SELF_7, L"You may be behind a firewall.\rEnsure nothing is blocking HFS."
main_MSG_RET_EXT, L"Retrieving external address..." main_MSG_RET_EXT, L"Retrieving external address..."
@ -925,7 +928,7 @@ BEGIN
main_MSG_OPEN_BROW, L"Open directly in browser" main_MSG_OPEN_BROW, L"Open directly in browser"
main_MSG_OPEN_BROW_LONG, L"\"Suggest\" the browser to open directly the specified files.\rOther files should pop up a save dialog." main_MSG_OPEN_BROW_LONG, L"\"Suggest\" the browser to open directly the specified files.\rOther files should pop up a save dialog."
main_MSG_HIDE_PORT, L"You should not use this option unless you really know its meaning.\rContinue?" main_MSG_HIDE_PORT, L"You should not use this option unless you really know its meaning.\rContinue?"
main_MSG_EVENTS_HLP, L"For help on how to use this file please refer http://www.rejetto.com/wiki/?title=HFS:_Event_scripts" main_MSG_RESET_TOT, L"Do you want to reset total in/out?"
main_MSG_DISAB_FIND_EXT, L"This option makes pointless the option \"Find external address at startup\", which has now been disabled for your convenience." main_MSG_DISAB_FIND_EXT, L"This option makes pointless the option \"Find external address at startup\", which has now been disabled for your convenience."
main_MSG_ENT_URL, L"Enter URL" main_MSG_ENT_URL, L"Enter URL"
main_MSG_ENT_URL_LONG, L"Enter URL for updating.\r%ip% will be translated to your external IP." main_MSG_ENT_URL_LONG, L"Enter URL for updating.\r%ip% will be translated to your external IP."
@ -941,7 +944,7 @@ BEGIN
main_MSG_SELF_BEFORE, L"Here you can test if your server does work on the Internet.\rIf you are not interested in serving files over the Internet, this is NOT for you.\r\rWe'll now perform a test involving network activity.\rIn order to complete this test, you may need to allow HFS's activity in your firewall, by clicking Allow on the warning prompt.\r\rWARNING: for the duration of the test, all ban rules and limits on the number of connections won't apply." main_MSG_SELF_BEFORE, L"Here you can test if your server does work on the Internet.\rIf you are not interested in serving files over the Internet, this is NOT for you.\r\rWe'll now perform a test involving network activity.\rIn order to complete this test, you may need to allow HFS's activity in your firewall, by clicking Allow on the warning prompt.\r\rWARNING: for the duration of the test, all ban rules and limits on the number of connections won't apply."
main_MSG_SELF_OK, L"The test is successful. The server should be working fine." main_MSG_SELF_OK, L"The test is successful. The server should be working fine."
main_MSG_SELF_OK_PORT, L"Port %s is not working, but another working port has been found and set: %s." main_MSG_SELF_OK_PORT, L"Port %s is not working, but another working port has been found and set: %s."
main_MSG_SELF_3, L"You may be behind a router or firewall." main_MSG_LOG_FILE, L"Log file"
main_MSG_LOG_FILE_LONG, L"This function does not save any previous information to the log file.\rInstead, it saves all information that appears in the log box in real-time (from when you click \"OK\", below).\rSpecify a filename for the log.\rIf you leave the filename blank, no log file is saved.\r\rHere are some symbols you can use in the filename to split the log:\r %d% -- day of the month (1..31)\r %m% -- month (1..12)\r %y% -- year (2000..)\r %dow% -- day of the week (0..6)\r %w% -- week of the year (1..53)\r %user% -- username surrounded by parenthesis" main_MSG_LOG_FILE_LONG, L"This function does not save any previous information to the log file.\rInstead, it saves all information that appears in the log box in real-time (from when you click \"OK\", below).\rSpecify a filename for the log.\rIf you leave the filename blank, no log file is saved.\r\rHere are some symbols you can use in the filename to split the log:\r %d% -- day of the month (1..31)\r %m% -- month (1..12)\r %y% -- year (2000..)\r %dow% -- day of the week (0..6)\r %w% -- week of the year (1..53)\r %user% -- username surrounded by parenthesis"
main_MSG_SET_URL, L"Set URL" main_MSG_SET_URL, L"Set URL"
main_MSG_SET_URL_LONG, L"Please insert an URL for the link\r\rDo not forget to specify http:// or whatever.\r%%ip%% will be translated to your address" main_MSG_SET_URL_LONG, L"Please insert an URL for the link\r\rDo not forget to specify http:// or whatever.\r%%ip%% will be translated to your address"
@ -957,7 +960,7 @@ BEGIN
main_MSG_CUST_IP, L"Custom IP addresses" main_MSG_CUST_IP, L"Custom IP addresses"
main_MSG_CUST_IP_LONG, L"Specify your addresses, each per line" main_MSG_CUST_IP_LONG, L"Specify your addresses, each per line"
main_MSG_NO_EXT_IP, L"Can't find external address\r( %s )" main_MSG_NO_EXT_IP, L"Can't find external address\r( %s )"
main_MSG_RESET_TOT, L"Do you want to reset total in/out?" main_MSG_TENTH_SEC, L"Tenths of second"
main_MSG_LOADING_VFS, L"Loading VFS" main_MSG_LOADING_VFS, L"Loading VFS"
main_MSG_VFS_OLD, L"This file is old and uses different settings.\rThe \"let browse\" folder option will be reset.\rRe-saving the file will update its format." main_MSG_VFS_OLD, L"This file is old and uses different settings.\rThe \"let browse\" folder option will be reset.\rRe-saving the file will update its format."
main_MSG_UNK_FK, L"This file has been created with a newer version.\rSome data was discarded because unknown.\rIf you save the file now, the discarded data will NOT be saved." main_MSG_UNK_FK, L"This file has been created with a newer version.\rSome data was discarded because unknown.\rIf you save the file now, the discarded data will NOT be saved."
@ -973,7 +976,7 @@ BEGIN
main_SW2EXPERT, L"Switch to Expert mode" main_SW2EXPERT, L"Switch to Expert mode"
main_SW2EASY, L"Switch to Easy mode" main_SW2EASY, L"Switch to Easy mode"
main_MSG_DL_TIMEOUT_LONG, L"Enter the number of MINUTES with no download after which the program automatically shuts down.\rLeave blank to get no timeout." main_MSG_DL_TIMEOUT_LONG, L"Enter the number of MINUTES with no download after which the program automatically shuts down.\rLeave blank to get no timeout."
main_MSG_LOG_FILE, L"Log file" main_MSG_NEWER_INCOMP, L"This file has been created with a newer and incompatible version."
main_MSG_ZLIB, L"This file is corrupted (ZLIB)." main_MSG_ZLIB, L"This file is corrupted (ZLIB)."
main_MSG_BAKAVAILABLE, L"This file is corrupted but a backup is available.\rContinue with backup?" main_MSG_BAKAVAILABLE, L"This file is corrupted but a backup is available.\rContinue with backup?"
main_MSG_CANT_LOAD_SAVE, L"Cannot load or save while adding files" main_MSG_CANT_LOAD_SAVE, L"Cannot load or save while adding files"
@ -989,7 +992,10 @@ BEGIN
main_MSG_WARN_ACT_DL, L"In this moment there are %d active downloads" main_MSG_WARN_ACT_DL, L"In this moment there are %d active downloads"
main_MSG_MAX_CON_SING_LONG, L"Max simultaneous connections to accept from a single IP address.\rMost people don't know this function well, and have problems. If you are unsure, please use the \"Max simultaneous downloads from a single IP address\"." main_MSG_MAX_CON_SING_LONG, L"Max simultaneous connections to accept from a single IP address.\rMost people don't know this function well, and have problems. If you are unsure, please use the \"Max simultaneous downloads from a single IP address\"."
main_MSG_GRAPH_RATE, L"Graph refresh rate" main_MSG_GRAPH_RATE, L"Graph refresh rate"
main_MSG_TENTH_SEC, L"Tenths of second" main_MSG_VFS_DONT_CONS_DL_MASK, L"Don't consider as download (mask): %s"
main_MSG_VFS_INHERITED, L" [inherited]"
main_MSG_VFS_EXTERNAL, L" [external]"
main_MSG_CON_HINT, L"Connection time: %s\rLast request time: %s\rAgent: %s"
main_MSG_CON_STATE_IDLE, L"idle" main_MSG_CON_STATE_IDLE, L"idle"
main_MSG_CON_STATE_REQ, L"requesting" main_MSG_CON_STATE_REQ, L"requesting"
main_MSG_CON_STATE_RCV, L"receiving" main_MSG_CON_STATE_RCV, L"receiving"
@ -997,15 +1003,15 @@ BEGIN
main_MSG_CON_STATE_REP, L"replying" main_MSG_CON_STATE_REP, L"replying"
main_MSG_CON_STATE_SEND, L"sending" main_MSG_CON_STATE_SEND, L"sending"
main_MSG_CON_STATE_DISC, L"disconnected" main_MSG_CON_STATE_DISC, L"disconnected"
main_MSG_CON_PAUSED, L"paused"
main_MSG_CON_SENT, L"%s / %s sent"
main_MSG_CON_RECEIVED, L"%s / %s received"
main_MSG_TPL_RESET, L"The template has been reset" main_MSG_TPL_RESET, L"The template has been reset"
main_MSG_ALLO_REF, L"Allowed referer" main_MSG_ALLO_REF, L"Allowed referer"
main_MSG_ALLO_REF_LONG, L"Leave empty to disable this feature.\rHere you can specify a mask.\rWhen a file is requested, if the mask doesn't match the \"Referer\" HTTP field, the request is rejected." main_MSG_ALLO_REF_LONG, L"Leave empty to disable this feature.\rHere you can specify a mask.\rWhen a file is requested, if the mask doesn't match the \"Referer\" HTTP field, the request is rejected."
main_MSG_BETTERSTOP, L"\rGoing on may lead to problems.\rIt is adviced to stop loading.\rStop?" main_MSG_BETTERSTOP, L"\rGoing on may lead to problems.\rIt is adviced to stop loading.\rStop?"
main_MSG_BADCRC, L"This file is corrupted (CRC)." main_MSG_BADCRC, L"This file is corrupted (CRC)."
main_MSG_NEWER, L"This file has been created with a newer and incompatible version." main_MSG_VFS_HIDE_EMPTY, L"Hidden if empty"
main_MSG_VFS_NOT_BROW, L"Not browsable"
main_MSG_VFS_HIDE_EMPTY_FLD, L"Hide empty folders"
main_MSG_VFS_HIDE_EXT, L"Hide extention"
main_MSG_VFS_ARCABLE, L"Archivable" main_MSG_VFS_ARCABLE, L"Archivable"
main_MSG_VFS_DEF_MASK, L"Default file mask: %s" main_MSG_VFS_DEF_MASK, L"Default file mask: %s"
main_MSG_VFS_ACCESS, L"Access for" main_MSG_VFS_ACCESS, L"Access for"
@ -1018,10 +1024,10 @@ BEGIN
main_MSG_VFS_FLD_FLT, L"Folders filter: %s" main_MSG_VFS_FLD_FLT, L"Folders filter: %s"
main_MSG_VFS_UPL_FLT, L"Upload filter: %s" main_MSG_VFS_UPL_FLT, L"Upload filter: %s"
main_MSG_VFS_DONT_CONS_DL, L"Don't consider as download" main_MSG_VFS_DONT_CONS_DL, L"Don't consider as download"
main_MSG_VFS_DONT_CONS_DL_MASK, L"Don't consider as download (mask): %s" main_IN_SPEED, L"In: %.1f KB/s"
main_MSG_VFS_INHERITED, L" [inherited]" main_BANS, L"Ban rules: %d"
main_MSG_VFS_EXTERNAL, L" [external]" main_MEMORY, L"Mem"
main_MSG_CON_HINT, L"Connection time: %s\rLast request time: %s\rAgent: %s" main_CUST_TPL, L"Customized template"
main_VFS_ITEMS, L"VFS: %d items" main_VFS_ITEMS, L"VFS: %d items"
main_MSG_ITEM_EXISTS, L"%s item(s) already exists:\r%s\r\rContinue?" main_MSG_ITEM_EXISTS, L"%s item(s) already exists:\r%s\r\rContinue?"
main_MSG_INSTALL_TPL, L"Install this template?" main_MSG_INSTALL_TPL, L"Install this template?"
@ -1034,10 +1040,10 @@ BEGIN
main_MSG_VFS_INVISIBLE, L"Invisible" main_MSG_VFS_INVISIBLE, L"Invisible"
main_MSG_VFS_DL_FORB, L"Download forbidden" main_MSG_VFS_DL_FORB, L"Download forbidden"
main_MSG_VFS_DONT_LOG, L"Don't log" main_MSG_VFS_DONT_LOG, L"Don't log"
main_MSG_VFS_HIDE_EMPTY, L"Hidden if empty" main_MSG_UPD_DL, L"Downloading new version..."
main_MSG_VFS_NOT_BROW, L"Not browsable" main_MSG_UPDATE, L"You are invited to use the new version.\r\rUpdate now?"
main_MSG_VFS_HIDE_EMPTY_FLD, L"Hide empty folders" main_MSG_REQUESTING, L"Requesting..."
main_MSG_VFS_HIDE_EXT, L"Hide extention" main_MSG_CHK_UPD, L"Checking for updates"
main_MSG_CHK_UPD_FAIL, L"Check update: failed" main_MSG_CHK_UPD_FAIL, L"Check update: failed"
main_MSG_CHK_UPD_HEAD, L"Check update: " main_MSG_CHK_UPD_HEAD, L"Check update: "
main_MSG_CHK_UPD_VER, L"new version found: %s" main_MSG_CHK_UPD_VER, L"new version found: %s"
@ -1050,10 +1056,10 @@ BEGIN
main_TOT_IN, L"Total In: %s" main_TOT_IN, L"Total In: %s"
main_TOT_OUT, L"Total Out: %s" main_TOT_OUT, L"Total Out: %s"
main_OUT_SPEED, L"Out: %.1f KB/s" main_OUT_SPEED, L"Out: %.1f KB/s"
main_IN_SPEED, L"In: %.1f KB/s" main_MSG_FILE_ADD_ABORT, L"File addition was aborted.\rThe list of files is incomplete."
main_BANS, L"Ban rules: %d" main_MSG_ADDING, L"Adding item #%d"
main_MEMORY, L"Mem" main_MSG_INV_FILENAME, L"Invalid filename"
main_CUST_TPL, L"Customized template" main_MSG_DELETE, L"Delete?"
main_AUTOSAVE, L"Auto save every: " main_AUTOSAVE, L"Auto save every: "
main_SECONDS, L"%d seconds" main_SECONDS, L"%d seconds"
main_MSG_SPD_LIMIT_SING, L"Speed limit for single address" main_MSG_SPD_LIMIT_SING, L"Speed limit for single address"
@ -1066,10 +1072,10 @@ BEGIN
main_MSG_UPD_SAVE_ERROR, L"Cannot save the update" main_MSG_UPD_SAVE_ERROR, L"Cannot save the update"
main_MSG_UPD_REQ_ONLY1, L"The auto-update feature cannot work because it requires the \"Only 1 instance\" option enabled.\r\rYour browser will now be pointed to the update, so you can install it manually." main_MSG_UPD_REQ_ONLY1, L"The auto-update feature cannot work because it requires the \"Only 1 instance\" option enabled.\r\rYour browser will now be pointed to the update, so you can install it manually."
main_MSG_UPD_WAIT, L"Waiting for last requests to be served, then we'll update" main_MSG_UPD_WAIT, L"Waiting for last requests to be served, then we'll update"
main_MSG_UPD_DL, L"Downloading new version..." main_MSG_LOG_HEAD, L"Served head"
main_MSG_UPDATE, L"You are invited to use the new version.\r\rUpdate now?" main_MSG_LOG_NOT_MOD, L"Not modified, use cache"
main_MSG_REQUESTING, L"Requesting..." main_MSG_LOG_REDIR, L"Redirected to %s"
main_MSG_CHK_UPD, L"Checking for updates" main_MSG_LOG_NOT_SERVED, L"Not served: %d - %s"
main_MSG_LOG_UPL, L"Uploading %s" main_MSG_LOG_UPL, L"Uploading %s"
main_MSG_LOG_UPLOADED, L"Fully uploaded %s - %s @ %sB/s" main_MSG_LOG_UPLOADED, L"Fully uploaded %s - %s @ %sB/s"
main_MSG_LOG_UPL_FAIL, L"Upload failed %s" main_MSG_LOG_UPL_FAIL, L"Upload failed %s"
@ -1082,10 +1088,10 @@ BEGIN
main_NO_FINGERPRINT, L"Create fingerprint on addition: disabled" main_NO_FINGERPRINT, L"Create fingerprint on addition: disabled"
main_MSG_SAVE_VFS, L"Your current file system is not saved.\rSave it?" main_MSG_SAVE_VFS, L"Your current file system is not saved.\rSave it?"
main_MSG_INP_COMMENT, L"Please insert a comment for \"%s\".\rYou should use HTML: <br> for break line." main_MSG_INP_COMMENT, L"Please insert a comment for \"%s\".\rYou should use HTML: <br> for break line."
main_MSG_FILE_ADD_ABORT, L"File addition was aborted.\rThe list of files is incomplete." main_MSG_BAN_CMT, L"Ban comment"
main_MSG_ADDING, L"Adding item #%d" main_MSG_BAN_CMT_LONG, L"A comment for this ban..."
main_MSG_INV_FILENAME, L"Invalid filename" main_MSG_BREAK_DYN_DNS, L"This option is NOT compatible with \"dynamic dns updater\".\rContinue?"
main_MSG_DELETE, L"Delete?" main_MSG_CANT_OPEN_PORT, L"Cannot open port."
main_MSG_PORT_USED_BY, L"It is already used by %s" main_MSG_PORT_USED_BY, L"It is already used by %s"
main_MSG_PORT_BLOCKED, L"Something is blocking, maybe your system firewall." main_MSG_PORT_BLOCKED, L"Something is blocking, maybe your system firewall."
main_MSG_KICK_ALL, L"There are %d connections open.\rDo you want to close them now?" main_MSG_KICK_ALL, L"There are %d connections open.\rDo you want to close them now?"
@ -1098,10 +1104,10 @@ BEGIN
main_MSG_LOG_GOT, L"Got %d bytes" main_MSG_LOG_GOT, L"Got %d bytes"
main_MSG_LOG_BYTES_SENT, L"%s bytes sent" main_MSG_LOG_BYTES_SENT, L"%s bytes sent"
main_MSG_LOG_SERVED, L"Served %s" main_MSG_LOG_SERVED, L"Served %s"
main_MSG_LOG_HEAD, L"Served head" main_MSG_DDNS_FAIL, L"DNS update failed: %s\rUser intervention is required."
main_MSG_LOG_NOT_MOD, L"Not modified, use cache" main_MSG_DDNS_REPLY_SIZE, L"%d bytes reply"
main_MSG_LOG_REDIR, L"Redirected to %s" main_MSG_DDNS_badauth, L"invalid user/password"
main_MSG_LOG_NOT_SERVED, L"Not served: %d - %s" main_MSG_DDNS_notfqdn, L"incomplete hostname, required form aaa.bbb.com"
main_MSG_DDNS_nohost, L"specified hostname does not exist" main_MSG_DDNS_nohost, L"specified hostname does not exist"
main_MSG_DDNS_notyours, L"specified hostname belongs to another username" main_MSG_DDNS_notyours, L"specified hostname belongs to another username"
main_MSG_DDNS_numhost, L"too many or too few hosts found" main_MSG_DDNS_numhost, L"too many or too few hosts found"
@ -1114,26 +1120,23 @@ BEGIN
main_MSG_IP_MASK_LONG, L"You can edit the address.\rMasks and ranges are allowed." main_MSG_IP_MASK_LONG, L"You can edit the address.\rMasks and ranges are allowed."
main_MSG_KICK_ADDR, L"There are %d open connections from this address.\rDo you want to kick them all now?" main_MSG_KICK_ADDR, L"There are %d open connections from this address.\rDo you want to kick them all now?"
main_MSG_BAN_ALREADY, L"This IP address is already banned" main_MSG_BAN_ALREADY, L"This IP address is already banned"
main_MSG_BAN_CMT, L"Ban comment" main_MSG_ADDRESSES_EXCEED, L"The following addresses exceed the limit:\r%s"
main_MSG_BAN_CMT_LONG, L"A comment for this ban..."
main_MSG_BREAK_DYN_DNS, L"This option is NOT compatible with \"dynamic dns updater\".\rContinue?"
main_MSG_CANT_OPEN_PORT, L"Cannot open port."
main_MSG_NO_TEMP, L"Cannot save temporary file" main_MSG_NO_TEMP, L"Cannot save temporary file"
main_MSG_ERROR_REGISTRY, L"Can't write to registry.\rYou may lack necessary rights." main_MSG_ERROR_REGISTRY, L"Can't write to registry.\rYou may lack necessary rights."
main_MSG_MANY_ITEMS, L"You are putting many files.\rTry using real folders instead of virtual folders.\rRead documentation or ask on the forum for help." main_MSG_MANY_ITEMS, L"You are putting many files.\rTry using real folders instead of virtual folders.\rRead documentation or ask on the forum for help."
main_MSG_ADD_TO_HFS, L"\"Add to HFS\" has been added to your Window's Explorer right-click menu." main_MSG_ADD_TO_HFS, L"\"Add to HFS\" has been added to your Window's Explorer right-click menu."
main_MSG_SINGLE_INSTANCE, L"Sorry, this feature only works with the \"Only 1 instance\" option enabled.\r\rYou can find this option under Menu -> Start/Exit\r(only in expert mode)" main_MSG_SINGLE_INSTANCE, L"Sorry, this feature only works with the \"Only 1 instance\" option enabled.\r\rYou can find this option under Menu -> Start/Exit\r(only in expert mode)"
main_MSG_COMM_ERROR, L"Network error. Request failed." main_MSG_COMM_ERROR, L"Network error. Request failed."
main_MSG_CON_PAUSED, L"paused"
main_MSG_CON_SENT, L"%s / %s sent"
main_MSG_CON_RECEIVED, L"%s / %s received"
main_MSG_DDNS_NO_REPLY, L"no reply" main_MSG_DDNS_NO_REPLY, L"no reply"
main_MSG_DDNS_OK, L"successful" main_MSG_DDNS_OK, L"successful"
main_MSG_DDNS_UNK, L"unknown reply: %s" main_MSG_DDNS_UNK, L"unknown reply: %s"
main_MSG_DDNS_ERR, L"error: %s" main_MSG_DDNS_ERR, L"error: %s"
main_MSG_DDNS_REQ, L"DNS update requested for %s: %s" main_MSG_DDNS_REQ, L"DNS update requested for %s: %s"
main_MSG_DDNS_DOING, L"Updating dynamic DNS..." main_MSG_DDNS_DOING, L"Updating dynamic DNS..."
main_MSG_DDNS_FAIL, L"DNS update failed: %s\rUser intervention is required." main_MSG_MAX_CON_SING, L"Max connections from single address"
main_MSG_DDNS_REPLY_SIZE, L"%d bytes reply"
main_MSG_DDNS_badauth, L"invalid user/password"
main_MSG_DDNS_notfqdn, L"incomplete hostname, required form aaa.bbb.com"
main_MSG_MAX_SIM_ADDR, L"Max simultaneous addresses" main_MSG_MAX_SIM_ADDR, L"Max simultaneous addresses"
main_MSG_MAX_SIM_ADDR_DL, L"Max simultaneous addresses downloading" main_MSG_MAX_SIM_ADDR_DL, L"Max simultaneous addresses downloading"
main_MSG_MAX_SIM_DL_SING, L"Max simultaneous downloads from single address" main_MSG_MAX_SIM_DL_SING, L"Max simultaneous downloads from single address"
@ -1149,7 +1152,6 @@ BEGIN
main_MSG_ITEM_LOCKED, L"The item is locked" main_MSG_ITEM_LOCKED, L"The item is locked"
main_MSG_INVALID_VALUE, L"Invalid value" main_MSG_INVALID_VALUE, L"Invalid value"
main_MSG_EMPTY_NO_LIMIT, L"Leave blank to get no limits." main_MSG_EMPTY_NO_LIMIT, L"Leave blank to get no limits."
main_MSG_ADDRESSES_EXCEED, L"The following addresses exceed the limit:\r%s"
JclResources_RsIntelCacheDescrF0, L"64-Byte Prefetching" JclResources_RsIntelCacheDescrF0, L"64-Byte Prefetching"
JclResources_RsIntelCacheDescrF1, L"128-Byte Prefetching" JclResources_RsIntelCacheDescrF1, L"128-Byte Prefetching"
JclResources_RsIntelCacheDescrFF, L"CPUID leaf 2 does not report cache descriptor information, use CPUID leaf 4 to query cache parameters" JclResources_RsIntelCacheDescrFF, L"CPUID leaf 2 does not report cache descriptor information, use CPUID leaf 4 to query cache parameters"
@ -1157,6 +1159,7 @@ BEGIN
JclResources_RsOSVersionWinServer2012, L"Windows Server 2012" JclResources_RsOSVersionWinServer2012, L"Windows Server 2012"
JclResources_RsOSVersionWin81, L"Windows 8.1" JclResources_RsOSVersionWin81, L"Windows 8.1"
JclResources_RsOSVersionWinServer2012R2, L"Windows Server 2012 R2" JclResources_RsOSVersionWinServer2012R2, L"Windows Server 2012 R2"
classesLib_MSG_ANTIDOS_REPLY, L"Please wait, server busy"
optionsDlg_MSG_INVERT_BAN, L"Normal behavior of the Ban is to prevent access to the addresses you specify (also called black-list).\rIf you want the opposite, to allow the addresses that you specify (white-list), enter all addresses in a single row preceded by a \\ character.\r\rLet say you want to allow all your 192.168 local network plus your office at 1.1.1.1.\rJust put this IP address mask: \\192.168.*;1.1.1.1\rThe opening \\ character inverts the logic, so everything else is banned.\r\rIf you want to know more about address masks, check the guide." optionsDlg_MSG_INVERT_BAN, L"Normal behavior of the Ban is to prevent access to the addresses you specify (also called black-list).\rIf you want the opposite, to allow the addresses that you specify (white-list), enter all addresses in a single row preceded by a \\ character.\r\rLet say you want to allow all your 192.168 local network plus your office at 1.1.1.1.\rJust put this IP address mask: \\192.168.*;1.1.1.1\rThe opening \\ character inverts the logic, so everything else is banned.\r\rIf you want to know more about address masks, check the guide."
main_S_PORT_LABEL, L"Port: %s" main_S_PORT_LABEL, L"Port: %s"
main_S_PORT_ANY, L"any" main_S_PORT_ANY, L"any"
@ -1165,7 +1168,6 @@ BEGIN
main_MSG_MENU_VAL, L" (%s)" main_MSG_MENU_VAL, L" (%s)"
main_MSG_DL_TIMEOUT, L"No downloads timeout" main_MSG_DL_TIMEOUT, L"No downloads timeout"
main_MSG_MAX_CON, L"Max connections" main_MSG_MAX_CON, L"Max connections"
main_MSG_MAX_CON_SING, L"Max connections from single address"
JclResources_RsIntelCacheDescrCA, L"Shared 2nd-Level TLB: 4 KByte pages, 4-way associative, 512 entries" JclResources_RsIntelCacheDescrCA, L"Shared 2nd-Level TLB: 4 KByte pages, 4-way associative, 512 entries"
JclResources_RsIntelCacheDescrD0, L"3rd-level cache: 512 KByte, 4-way set associative, 64 byte line size" JclResources_RsIntelCacheDescrD0, L"3rd-level cache: 512 KByte, 4-way set associative, 64 byte line size"
JclResources_RsIntelCacheDescrD1, L"3rd-level cache: 1 MByte, 4-way set associative, 64 byte line size" JclResources_RsIntelCacheDescrD1, L"3rd-level cache: 1 MByte, 4-way set associative, 64 byte line size"

554
hfs.lng
View File

@ -1,5 +1,5 @@
; Kryvich's Delphi Localizer Language File. ; Kryvich's Delphi Localizer Language File.
; Generated by K.D.L. Scanner, 6/5/2020 6:56:45 PM ; Generated by K.D.L. Scanner, 02/08/2020 18:30:32
Humanize=1 Humanize=1
HumanizedCR=\^ HumanizedCR=\^
@ -282,7 +282,6 @@ menu.Debug1.dumpTrafficChk.Caption=Dump traffic
menu.Debug1.Showcustomizedoptions1.Caption=Show customized options... menu.Debug1.Showcustomizedoptions1.Caption=Show customized options...
menu.Debug1.highSpeedChk.Caption=Experimental high speed handling menu.Debug1.highSpeedChk.Caption=Experimental high speed handling
menu.Debug1.macrosLogChk.Caption=Enable macros.log menu.Debug1.macrosLogChk.Caption=Enable macros.log
menu.Debug1.Appendmacroslog1.Caption=Append macros.log
menu.Debug1.Runscript1.Caption=Run script... menu.Debug1.Runscript1.Caption=Run script...
menu.Debug1.showMemUsageChk.Caption=Show memory usage menu.Debug1.showMemUsageChk.Caption=Show memory usage
menu.Debug1.noContentdispositionChk.Caption=No Content-disposition menu.Debug1.noContentdispositionChk.Caption=No Content-disposition
@ -452,281 +451,282 @@ Panel1.Button1.Caption=&Yes
Panel1.Button2.Caption=&No Panel1.Button2.Caption=&No
[ResourceStrings] [ResourceStrings]
64656_main_MSG_NUM_ADDR_DL=In this moment there are %d different addresses downloading 64656_main_MSG_NUM_ADDR=In this moment there are %d different addresses
64657_main_MSG_MAX_LINES=Max lines on screen. 64657_main_MSG_NUM_ADDR_DL=In this moment there are %d different addresses downloading
64658_main_MSG_APACHE_LOG_FMT=Apache log file format 64658_main_MSG_MAX_LINES=Max lines on screen.
64659_main_MSG_APACHE_LOG_FMT_LONG=Here you can specify how to format the log file complying Apache standard.\^Leave blank to get bare copy of screen on file.\^\^Example:\^ %h %l %u %t "%r" %>s %b 64659_main_MSG_APACHE_LOG_FMT=Apache log file format
64660_main_MSG_ICONS_ADDED=%d new icons added 64660_main_MSG_APACHE_LOG_FMT_LONG=Here you can specify how to format the log file complying Apache standard.\^Leave blank to get bare copy of screen on file.\^\^Example:\^ %h %l %u %t "%r" %>s %b
64661_main_MSG_DDNS_DISABLED=Dynamic DNS updater disabled 64661_main_MSG_ICONS_ADDED=%d new icons added
64662_main_MSG_MD5_WARN=This option creates an .md5 file for every new calculated fingerprint.\^Use with care to get not your disk invaded by these files. 64662_main_MSG_DDNS_DISABLED=Dynamic DNS updater disabled
64663_main_MSG_AUTO_MD5=Auto fingerprint 64663_main_MSG_MD5_WARN=This option creates an .md5 file for every new calculated fingerprint.\^Use with care to get not your disk invaded by these files.
64664_main_MSG_AUTO_MD5_LONG=When you add files and no fingerprint is found, it is calculated.\^To avoid long waitings, set a limit to file size (in KiloBytes).\^Leave empty to disable, and have no fingerprint created. 64664_main_MSG_AUTO_MD5=Auto fingerprint
64665_main_MSG_UPL_HOWTO=1. Add a folder (choose "real folder")\^\^You should now see a RED folder in your virtual file sytem, inside HFS\^\^2. Right click on this folder\^3. Properties -> Permissions -> Upload\^4. Check on "Anyone"\^5. Ok\^\^Now anyone who has access to your HFS server can upload files to you. 64665_main_MSG_AUTO_MD5_LONG=When you add files and no fingerprint is found, it is calculated.\^To avoid long waitings, set a limit to file size (in KiloBytes).\^Leave empty to disable, and have no fingerprint created.
64672_main_MSG_EDIT_RES=Edit resource 64666_main_MSG_UPL_HOWTO=1. Add a folder (choose "real folder")\^\^You should now see a RED folder in your virtual file sytem, inside HFS\^\^2. Right click on this folder\^3. Properties -> Permissions -> Upload\^4. Check on "Anyone"\^5. Ok\^\^Now anyone who has access to your HFS server can upload files to you.
64673_main_MSG_TPL_USE_MACROS=The current template is using macros.\^Do you want to cancel this action? 64672_main_MSG_EVENTS_HLP=For help on how to use this file please refer http://www.rejetto.com/wiki/?title=HFS:_Event_scripts
64674_main_REMOVE_SHELL=Remove from shell context menu 64673_main_MSG_EDIT_RES=Edit resource
64675_main_S_OFF=Switch OFF 64674_main_MSG_TPL_USE_MACROS=The current template is using macros.\^Do you want to cancel this action?
64676_main_S_ON{1}=Switch ON 64675_main_REMOVE_SHELL=Remove from shell context menu
64677_main_LOG=Log 64676_main_S_OFF=Switch OFF
64678_main_MSG_RE_NOIP=You are invited to re-insert your No-IP configuration, otherwise the updater won't work as expected. 64677_main_S_ON{1}=Switch ON
64679_main_MSG_TRAY_DEF=%ip%\^Uptime: %uptime%\^Downloads: %downloads% 64678_main_LOG=Log
64680_main_MSG_CLEAN_START=Clean start 64679_main_MSG_RE_NOIP=You are invited to re-insert your No-IP configuration, otherwise the updater won't work as expected.
64681_main_MSG_RESTORE_BAK=A file system backup has been created for a system shutdown.\^Do you want to restore this backup? 64680_main_MSG_TRAY_DEF=%ip%\^Uptime: %uptime%\^Downloads: %downloads%
64682_main_MSG_EXT_ADDR_FAIL=Search for external address failed 64681_main_MSG_CLEAN_START=Clean start
64683_main_MSG_TO_EXPERT=Switch to expert mode. 64682_main_MSG_RESTORE_BAK=A file system backup has been created for a system shutdown.\^Do you want to restore this backup?
64684_main_MSG_DONT_LOG_HINT=Select the files/folder you don't want to be logged,\^then right click and select "Don't log". 64683_main_MSG_EXT_ADDR_FAIL=Search for external address failed
64685_main_MSG_DL_PERC=Downloading %d%% 64684_main_MSG_TO_EXPERT=Switch to expert mode.
64686_main_MSG_UNINSTALL_WARN=Delete HFS and all settings? 64685_main_MSG_DONT_LOG_HINT=Select the files/folder you don't want to be logged,\^then right click and select "Don't log".
64687_main_MSG_NUM_ADDR=In this moment there are %d different addresses 64686_main_MSG_DL_PERC=Downloading %d%%
64688_main_MSG_SELF_6=You are behind a router.\^Ensure it is configured to forward port %s to your computer. 64687_main_MSG_UNINSTALL_WARN=Delete HFS and all settings?
64689_main_MSG_SELF_7=You may be behind a firewall.\^Ensure nothing is blocking HFS. 64688_main_MSG_SELF_3=You may be behind a router or firewall.
64690_main_MSG_RET_EXT=Retrieving external address... 64689_main_MSG_SELF_6=You are behind a router.\^Ensure it is configured to forward port %s to your computer.
64691_main_MSG_SELF_CANT_ON=Unable to switch the server on 64690_main_MSG_SELF_7=You may be behind a firewall.\^Ensure nothing is blocking HFS.
64692_main_MSG_SELF_CANT_LIST=Self test cannot be performed because HFS was configured to accept connections only on 127.0.0.1 64691_main_MSG_RET_EXT=Retrieving external address...
64693_main_MSG_SELF_CANT_S=Self test doesn't support HTTPS.\^It's likely it won't work. 64692_main_MSG_SELF_CANT_ON=Unable to switch the server on
64694_main_MSG_SELF_ING=Self testing... 64693_main_MSG_SELF_CANT_LIST=Self test cannot be performed because HFS was configured to accept connections only on 127.0.0.1
64695_main_MSG_TEST_CANC=Test cancelled 64694_main_MSG_SELF_CANT_S=Self test doesn't support HTTPS.\^It's likely it won't work.
64696_main_MSG_TEST_INET=Testing internet connection... 64695_main_MSG_SELF_ING=Self testing...
64697_main_MSG_SELF_UNAV=Sorry, the test is unavailable at the moment 64696_main_MSG_TEST_CANC=Test cancelled
64698_main_MSG_SELF_NO_INET=Your internet connection does not work 64697_main_MSG_TEST_INET=Testing internet connection...
64699_main_MSG_SELF_NO_ANSWER=The test failed: server does not answer. 64698_main_MSG_SELF_UNAV=Sorry, the test is unavailable at the moment
64700_main_MSG_OPEN_BROW=Open directly in browser 64699_main_MSG_SELF_NO_INET=Your internet connection does not work
64701_main_MSG_OPEN_BROW_LONG="Suggest" the browser to open directly the specified files.\^Other files should pop up a save dialog. 64700_main_MSG_SELF_NO_ANSWER=The test failed: server does not answer.
64702_main_MSG_HIDE_PORT=You should not use this option unless you really know its meaning.\^Continue? 64701_main_MSG_OPEN_BROW=Open directly in browser
64703_main_MSG_EVENTS_HLP=For help on how to use this file please refer http://www.rejetto.com/wiki/?title=HFS:_Event_scripts 64702_main_MSG_OPEN_BROW_LONG="Suggest" the browser to open directly the specified files.\^Other files should pop up a save dialog.
64704_main_MSG_DISAB_FIND_EXT=This option makes pointless the option "Find external address at startup", which has now been disabled for your convenience. 64703_main_MSG_HIDE_PORT=You should not use this option unless you really know its meaning.\^Continue?
64705_main_MSG_ENT_URL=Enter URL 64704_main_MSG_RESET_TOT=Do you want to reset total in/out?
64706_main_MSG_ENT_URL_LONG=Enter URL for updating.\^%ip% will be translated to your external IP. 64705_main_MSG_DISAB_FIND_EXT=This option makes pointless the option "Find external address at startup", which has now been disabled for your convenience.
64707_main_MSG_ENT_USR=Enter user 64706_main_MSG_ENT_URL=Enter URL
64708_main_MSG_ENT_PWD=Enter password 64707_main_MSG_ENT_URL_LONG=Enter URL for updating.\^%ip% will be translated to your external IP.
64709_main_MSG_ENT_HOST=Enter host 64708_main_MSG_ENT_USR=Enter user
64710_main_MSG_ENT_HOST_LONG=Enter domain (full form!) 64709_main_MSG_ENT_PWD=Enter password
64711_main_MSG_HOST_FORM=Please, enter it in the FULL form, with dots 64710_main_MSG_ENT_HOST=Enter host
64712_main_MSG_MIN_SPACE=Min disk space 64711_main_MSG_ENT_HOST_LONG=Enter domain (full form!)
64713_main_MSG_MIN_SPACE_LONG=The upload will fail if your disk has less than the specified amount of free MegaBytes. 64712_main_MSG_HOST_FORM=Please, enter it in the FULL form, with dots
64714_main_MSG_REN_PART=Rename partial uploads 64713_main_MSG_MIN_SPACE=Min disk space
64715_main_MSG_REN_PART_LONG=This string will be appended to the filename.\^\^If you need more control, enter a string with %name% in it, and this symbol will be replaced by the original filename. 64714_main_MSG_MIN_SPACE_LONG=The upload will fail if your disk has less than the specified amount of free MegaBytes.
64716_main_MSG_SELF_BEFORE=Here you can test if your server does work on the Internet.\^If you are not interested in serving files over the Internet, this is NOT for you.\^\^We'll now perform a test involving network activity.\^In order to complete this test, you may need to allow HFS's activity in your firewall, by clicking Allow on the warning prompt.\^\^WARNING: for the duration of the test, all ban rules and limits on the number of connections won't apply. 64715_main_MSG_REN_PART=Rename partial uploads
64717_main_MSG_SELF_OK=The test is successful. The server should be working fine. 64716_main_MSG_REN_PART_LONG=This string will be appended to the filename.\^\^If you need more control, enter a string with %name% in it, and this symbol will be replaced by the original filename.
64718_main_MSG_SELF_OK_PORT=Port %s is not working, but another working port has been found and set: %s. 64717_main_MSG_SELF_BEFORE=Here you can test if your server does work on the Internet.\^If you are not interested in serving files over the Internet, this is NOT for you.\^\^We'll now perform a test involving network activity.\^In order to complete this test, you may need to allow HFS's activity in your firewall, by clicking Allow on the warning prompt.\^\^WARNING: for the duration of the test, all ban rules and limits on the number of connections won't apply.
64719_main_MSG_SELF_3=You may be behind a router or firewall. 64718_main_MSG_SELF_OK=The test is successful. The server should be working fine.
64720_main_MSG_LOG_FILE_LONG=This function does not save any previous information to the log file.\^Instead, it saves all information that appears in the log box in real-time (from when you click "OK", below).\^Specify a filename for the log.\^If you leave the filename blank, no log file is saved.\^\^Here are some symbols you can use in the filename to split the log:\^ %d% -- day of the month (1..31)\^ %m% -- month (1..12)\^ %y% -- year (2000..)\^ %dow% -- day of the week (0..6)\^ %w% -- week of the year (1..53)\^ %user% -- username surrounded by parenthesis 64719_main_MSG_SELF_OK_PORT=Port %s is not working, but another working port has been found and set: %s.
64721_main_MSG_SET_URL=Set URL 64720_main_MSG_LOG_FILE=Log file
64722_main_MSG_SET_URL_LONG=Please insert an URL for the link\^\^Do not forget to specify http:// or whatever.\^%%ip%% will be translated to your address 64721_main_MSG_LOG_FILE_LONG=This function does not save any previous information to the log file.\^Instead, it saves all information that appears in the log box in real-time (from when you click "OK", below).\^Specify a filename for the log.\^If you leave the filename blank, no log file is saved.\^\^Here are some symbols you can use in the filename to split the log:\^ %d% -- day of the month (1..31)\^ %m% -- month (1..12)\^ %y% -- year (2000..)\^ %dow% -- day of the week (0..6)\^ %w% -- week of the year (1..53)\^ %user% -- username surrounded by parenthesis
64723_main_MSG_REALM=Login realm 64722_main_MSG_SET_URL=Set URL
64724_main_MSG_REALM_LONG=The realm string is shown on the user/pass dialog of the browser.\^Here you can customize the realm for the login button 64723_main_MSG_SET_URL_LONG=Please insert an URL for the link\^\^Do not forget to specify http:// or whatever.\^%%ip%% will be translated to your address
64725_main_MSG_INACT_TIMEOUT=Connection inactivity timeout 64724_main_MSG_REALM=Login realm
64726_main_MSG_INACT_TIMEOUT_LONG=The connection is kicked after a timeout.\^Specify in seconds.\^Leave blank to get no timeout. 64725_main_MSG_REALM_LONG=The realm string is shown on the user/pass dialog of the browser.\^Here you can customize the realm for the login button
64727_main_MSG_CHANGES_LOST=All changes will be lost\^Continue? 64726_main_MSG_INACT_TIMEOUT=Connection inactivity timeout
64728_main_MSG_FLAG_NEW=Flag new files 64727_main_MSG_INACT_TIMEOUT_LONG=The connection is kicked after a timeout.\^Specify in seconds.\^Leave blank to get no timeout.
64729_main_MSG_FLAG_NEW_LONG=Enter the number of MINUTES files stay flagged from their addition.\^Leave blank to disable. 64728_main_MSG_CHANGES_LOST=All changes will be lost\^Continue?
64730_main_MSG_DONT_LOG_MASK=Do not log address 64729_main_MSG_FLAG_NEW=Flag new files
64731_main_MSG_DONT_LOG_MASK_LONG=Any event from the following IP address mask will be not logged. 64730_main_MSG_FLAG_NEW_LONG=Enter the number of MINUTES files stay flagged from their addition.\^Leave blank to disable.
64732_main_MSG_CUST_IP=Custom IP addresses 64731_main_MSG_DONT_LOG_MASK=Do not log address
64733_main_MSG_CUST_IP_LONG=Specify your addresses, each per line 64732_main_MSG_DONT_LOG_MASK_LONG=Any event from the following IP address mask will be not logged.
64734_main_MSG_NO_EXT_IP=Can't find external address\^( %s ) 64733_main_MSG_CUST_IP=Custom IP addresses
64735_main_MSG_RESET_TOT=Do you want to reset total in/out? 64734_main_MSG_CUST_IP_LONG=Specify your addresses, each per line
64736_main_MSG_LOADING_VFS=Loading VFS 64735_main_MSG_NO_EXT_IP=Can't find external address\^( %s )
64737_main_MSG_VFS_OLD=This file is old and uses different settings.\^The "let browse" folder option will be reset.\^Re-saving the file will update its format. 64736_main_MSG_TENTH_SEC=Tenths of second
64738_main_MSG_UNK_FK=This file has been created with a newer version.\^Some data was discarded because unknown.\^If you save the file now, the discarded data will NOT be saved. 64737_main_MSG_LOADING_VFS=Loading VFS
64739_main_MSG_VIS_ONLY_ANON=This VFS file uses the "Visible only to anonymous users" feature.\^This feature is not available anymore.\^You can achieve similar results by restricting access to @anonymous,\^then enabling "List protected items only for allowed users". 64738_main_MSG_VFS_OLD=This file is old and uses different settings.\^The "let browse" folder option will be reset.\^Re-saving the file will update its format.
64740_main_MSG_AUTO_DISABLED=Because of the problems encountered in loading,\^automatic saving has been disabled\^until you save manually or load another one. 64739_main_MSG_UNK_FK=This file has been created with a newer version.\^Some data was discarded because unknown.\^If you save the file now, the discarded data will NOT be saved.
64741_main_MSG_CORRUPTED=This file does not contain valid data. 64740_main_MSG_VIS_ONLY_ANON=This VFS file uses the "Visible only to anonymous users" feature.\^This feature is not available anymore.\^You can achieve similar results by restricting access to @anonymous,\^then enabling "List protected items only for allowed users".
64742_main_MSG_MACROS_FOUND=!!!!!!!!! DANGER !!!!!!!!!\^This file contains macros.\^Don't accept macros from people you don't trust.\^\^Trust this file? 64741_main_MSG_AUTO_DISABLED=Because of the problems encountered in loading,\^automatic saving has been disabled\^until you save manually or load another one.
64743_main_MSG_UPD_INFO=Last stable version: %s\^\^Last untested version: %s\^ 64742_main_MSG_CORRUPTED=This file does not contain valid data.
64744_main_MSG_NEWER=There's a new version available online: %s 64743_main_MSG_MACROS_FOUND=!!!!!!!!! DANGER !!!!!!!!!\^This file contains macros.\^Don't accept macros from people you don't trust.\^\^Trust this file?
64745_main_MSG_SRC_UPD=Searching for updates... 64744_main_MSG_UPD_INFO=Last stable version: %s\^\^Last untested version: %s\^
64746_main_ARE_EXPERT{1}=You are in Expert mode 64745_main_MSG_NEWER=There's a new version available online: %s
64747_main_ARE_EASY=You are in Easy mode 64746_main_MSG_SRC_UPD=Searching for updates...
64748_main_SW2EXPERT=Switch to Expert mode 64747_main_ARE_EXPERT{1}=You are in Expert mode
64749_main_SW2EASY=Switch to Easy mode 64748_main_ARE_EASY=You are in Easy mode
64750_main_MSG_DL_TIMEOUT_LONG=Enter the number of MINUTES with no download after which the program automatically shuts down.\^Leave blank to get no timeout. 64749_main_SW2EXPERT=Switch to Expert mode
64751_main_MSG_LOG_FILE=Log file 64750_main_SW2EASY=Switch to Easy mode
64752_main_MSG_ZLIB=This file is corrupted (ZLIB). 64751_main_MSG_DL_TIMEOUT_LONG=Enter the number of MINUTES with no download after which the program automatically shuts down.\^Leave blank to get no timeout.
64753_main_MSG_BAKAVAILABLE=This file is corrupted but a backup is available.\^Continue with backup? 64752_main_MSG_NEWER_INCOMP=This file has been created with a newer and incompatible version.
64754_main_MSG_CANT_LOAD_SAVE=Cannot load or save while adding files 64753_main_MSG_ZLIB=This file is corrupted (ZLIB).
64755_main_MSG_OPEN_VFS=Open VFS file 64754_main_MSG_BAKAVAILABLE=This file is corrupted but a backup is available.\^Continue with backup?
64756_main_LIMIT{2}=Limit 64755_main_MSG_CANT_LOAD_SAVE=Cannot load or save while adding files
64757_main_TOP_SPEED=Top speed 64756_main_MSG_OPEN_VFS=Open VFS file
64758_main_MSG_MAX_BW=Max bandwidth (KB/s). 64757_main_LIMIT{2}=Limit
64759_main_MSG_LIM0=Zero is an effective limit.\^To disable instead, leave empty. 64758_main_TOP_SPEED=Top speed
64760_main_MSG_MAX_BW_1=Max bandwidth for single address (KB/s). 64759_main_MSG_MAX_BW=Max bandwidth (KB/s).
64761_main_MSG_GRAPH_RATE_MENU=Graph refresh rate: %d (tenths of second) 64760_main_MSG_LIM0=Zero is an effective limit.\^To disable instead, leave empty.
64762_main_MSG_MAX_CON_LONG=Max simultaneous connections to serve.\^Most people don't know this function well, and have problems. If you are unsure, please use the "Max simultaneous downloads". 64761_main_MSG_MAX_BW_1=Max bandwidth for single address (KB/s).
64763_main_MSG_WARN_CONN=In this moment there are %d active connections 64762_main_MSG_GRAPH_RATE_MENU=Graph refresh rate: %d (tenths of second)
64764_main_MSG_WARN_ACT_DL=In this moment there are %d active downloads 64763_main_MSG_MAX_CON_LONG=Max simultaneous connections to serve.\^Most people don't know this function well, and have problems. If you are unsure, please use the "Max simultaneous downloads".
64765_main_MSG_MAX_CON_SING_LONG=Max simultaneous connections to accept from a single IP address.\^Most people don't know this function well, and have problems. If you are unsure, please use the "Max simultaneous downloads from a single IP address". 64764_main_MSG_WARN_CONN=In this moment there are %d active connections
64766_main_MSG_GRAPH_RATE{1}=Graph refresh rate 64765_main_MSG_WARN_ACT_DL=In this moment there are %d active downloads
64767_main_MSG_TENTH_SEC=Tenths of second 64766_main_MSG_MAX_CON_SING_LONG=Max simultaneous connections to accept from a single IP address.\^Most people don't know this function well, and have problems. If you are unsure, please use the "Max simultaneous downloads from a single IP address".
64768_main_MSG_CON_STATE_IDLE=idle 64767_main_MSG_GRAPH_RATE{1}=Graph refresh rate
64769_main_MSG_CON_STATE_REQ=requesting 64768_main_MSG_VFS_DONT_CONS_DL_MASK=Don't consider as download (mask): %s
64770_main_MSG_CON_STATE_RCV=receiving 64769_main_MSG_VFS_INHERITED= [inherited]
64771_main_MSG_CON_STATE_THINK=thinking 64770_main_MSG_VFS_EXTERNAL= [external]
64772_main_MSG_CON_STATE_REP=replying 64771_main_MSG_CON_HINT=Connection time: %s\^Last request time: %s\^Agent: %s
64773_main_MSG_CON_STATE_SEND=sending 64772_main_MSG_CON_STATE_IDLE=idle
64774_main_MSG_CON_STATE_DISC=disconnected 64773_main_MSG_CON_STATE_REQ=requesting
64775_main_MSG_CON_PAUSED=paused 64774_main_MSG_CON_STATE_RCV=receiving
64776_main_MSG_CON_SENT=%s / %s sent 64775_main_MSG_CON_STATE_THINK=thinking
64777_main_MSG_CON_RECEIVED=%s / %s received 64776_main_MSG_CON_STATE_REP=replying
64778_main_MSG_TPL_RESET=The template has been reset 64777_main_MSG_CON_STATE_SEND=sending
64779_main_MSG_ALLO_REF=Allowed referer 64778_main_MSG_CON_STATE_DISC=disconnected
64780_main_MSG_ALLO_REF_LONG=Leave empty to disable this feature.\^Here you can specify a mask.\^When a file is requested, if the mask doesn't match the "Referer" HTTP field, the request is rejected. 64779_main_MSG_TPL_RESET=The template has been reset
64781_main_MSG_BETTERSTOP=\^Going on may lead to problems.\^It is adviced to stop loading.\^Stop? 64780_main_MSG_ALLO_REF=Allowed referer
64782_main_MSG_BADCRC=This file is corrupted (CRC). 64781_main_MSG_ALLO_REF_LONG=Leave empty to disable this feature.\^Here you can specify a mask.\^When a file is requested, if the mask doesn't match the "Referer" HTTP field, the request is rejected.
64744_main_MSG_NEWER{1}=This file has been created with a newer and incompatible version. 64782_main_MSG_BETTERSTOP=\^Going on may lead to problems.\^It is adviced to stop loading.\^Stop?
64784_main_MSG_VFS_ARCABLE=Archivable 64783_main_MSG_BADCRC=This file is corrupted (CRC).
64785_main_MSG_VFS_DEF_MASK=Default file mask: %s 64784_main_MSG_VFS_HIDE_EMPTY=Hidden if empty
64786_main_MSG_VFS_ACCESS=Access for 64785_main_MSG_VFS_NOT_BROW=Not browsable
64787_main_MSG_VFS_UPLOAD=Upload allowed for 64786_main_MSG_VFS_HIDE_EMPTY_FLD=Hide empty folders
64788_main_MSG_VFS_DELETE=Delete allowed for 64787_main_MSG_VFS_HIDE_EXT=Hide extention
64789_main_MSG_VFS_COMMENT=Comment: %s 64788_main_MSG_VFS_ARCABLE=Archivable
64790_main_MSG_VFS_REALM=Realm: %s 64789_main_MSG_VFS_DEF_MASK=Default file mask: %s
64791_main_MSG_VFS_DIFF_TPL=Diff template: %s 64790_main_MSG_VFS_ACCESS=Access for
64792_main_MSG_VFS_FILES_FLT=Files filter: %s 64791_main_MSG_VFS_UPLOAD=Upload allowed for
64793_main_MSG_VFS_FLD_FLT=Folders filter: %s 64792_main_MSG_VFS_DELETE=Delete allowed for
64794_main_MSG_VFS_UPL_FLT=Upload filter: %s 64793_main_MSG_VFS_COMMENT=Comment: %s
64795_main_MSG_VFS_DONT_CONS_DL=Don't consider as download 64794_main_MSG_VFS_REALM=Realm: %s
64796_main_MSG_VFS_DONT_CONS_DL_MASK=Don't consider as download (mask): %s 64795_main_MSG_VFS_DIFF_TPL=Diff template: %s
64797_main_MSG_VFS_INHERITED= [inherited] 64796_main_MSG_VFS_FILES_FLT=Files filter: %s
64798_main_MSG_VFS_EXTERNAL= [external] 64797_main_MSG_VFS_FLD_FLT=Folders filter: %s
64799_main_MSG_CON_HINT=Connection time: %s\^Last request time: %s\^Agent: %s 64798_main_MSG_VFS_UPL_FLT=Upload filter: %s
64800_main_VFS_ITEMS=VFS: %d items 64799_main_MSG_VFS_DONT_CONS_DL=Don't consider as download
64801_main_MSG_ITEM_EXISTS=%s item(s) already exists:\^%s\^\^Continue? 64800_main_IN_SPEED=In: %.1f KB/s
64802_main_MSG_INSTALL_TPL=Install this template? 64801_main_BANS=Ban rules: %d
64803_main_MSG_FOLDER_UPLOAD=Do you want ANYONE to be able to upload to this folder? 64802_main_MEMORY=Mem
64804_main_MSG_VFS_DRAG_INVIT=Drag your files here 64803_main_CUST_TPL=Customized template
64805_main_MSG_VFS_URL=URL: %s 64804_main_VFS_ITEMS=VFS: %d items
64806_main_MSG_VFS_PATH=Path: %s 64805_main_MSG_ITEM_EXISTS=%s item(s) already exists:\^%s\^\^Continue?
64807_main_MSG_VFS_SIZE=Size: %s 64806_main_MSG_INSTALL_TPL=Install this template?
64808_main_MSG_VFS_DLS=Downloads: %s 64807_main_MSG_FOLDER_UPLOAD=Do you want ANYONE to be able to upload to this folder?
64809_main_MSG_VFS_INVISIBLE=Invisible 64808_main_MSG_VFS_DRAG_INVIT=Drag your files here
64810_main_MSG_VFS_DL_FORB=Download forbidden 64809_main_MSG_VFS_URL=URL: %s
64811_main_MSG_VFS_DONT_LOG=Don't log 64810_main_MSG_VFS_PATH=Path: %s
64812_main_MSG_VFS_HIDE_EMPTY=Hidden if empty 64811_main_MSG_VFS_SIZE=Size: %s
64813_main_MSG_VFS_NOT_BROW=Not browsable 64812_main_MSG_VFS_DLS=Downloads: %s
64814_main_MSG_VFS_HIDE_EMPTY_FLD=Hide empty folders 64813_main_MSG_VFS_INVISIBLE=Invisible
64815_main_MSG_VFS_HIDE_EXT=Hide extention 64814_main_MSG_VFS_DL_FORB=Download forbidden
64816_main_MSG_CHK_UPD_FAIL=Check update: failed 64815_main_MSG_VFS_DONT_LOG=Don't log
64817_main_MSG_CHK_UPD_HEAD=Check update: 64816_main_MSG_UPD_DL=Downloading new version...
64818_main_MSG_CHK_UPD_VER=new version found: %s 64817_main_MSG_UPDATE=You are invited to use the new version.\^\^Update now?
64819_main_MSG_CHK_UPD_VER_EXT=Build #%s (current is #%s) 64818_main_MSG_REQUESTING=Requesting...
64820_main_MSG_CHK_UPD_NONE=no new version 64819_main_MSG_CHK_UPD=Checking for updates
64821_main_TO_CLIP=Copy to clipboard 64820_main_MSG_CHK_UPD_FAIL=Check update: failed
64822_main_ALREADY_CLIP=Already in clipboard 64821_main_MSG_CHK_UPD_HEAD=Check update:
64823_main_MSG_NO_SPACE=Out of space 64822_main_MSG_CHK_UPD_VER=new version found: %s
64824_main_CONN=Connections: %d 64823_main_MSG_CHK_UPD_VER_EXT=Build #%s (current is #%s)
64825_main_TOT_IN=Total In: %s 64824_main_MSG_CHK_UPD_NONE=no new version
64826_main_TOT_OUT{1}=Total Out: %s 64825_main_TO_CLIP=Copy to clipboard
64827_main_OUT_SPEED=Out: %.1f KB/s 64826_main_ALREADY_CLIP=Already in clipboard
64828_main_IN_SPEED=In: %.1f KB/s 64827_main_MSG_NO_SPACE=Out of space
64829_main_BANS=Ban rules: %d 64828_main_CONN=Connections: %d
64830_main_MEMORY=Mem 64829_main_TOT_IN=Total In: %s
64831_main_CUST_TPL=Customized template 64830_main_TOT_OUT{1}=Total Out: %s
64832_main_AUTOSAVE=Auto save every: 64831_main_OUT_SPEED=Out: %.1f KB/s
64833_main_SECONDS=%d seconds 64832_main_MSG_FILE_ADD_ABORT=File addition was aborted.\^The list of files is incomplete.
64834_main_MSG_SPD_LIMIT_SING=Speed limit for single address 64833_main_MSG_ADDING=Adding item #%d
64835_main_MSG_SPD_LIMIT=Speed limit 64834_main_MSG_INV_FILENAME=Invalid filename
64836_main_MSG_AUTO_SAVE=Auto-save %s 64835_main_MSG_DELETE=Delete?
64837_main_MSG_AUTO_SAVE_LONG=Auto-save %s.\^Specify in seconds.\^Leave blank to disable. 64836_main_AUTOSAVE=Auto save every:
64838_main_MSG_MIN=We don't accept less than %d 64837_main_SECONDS=%d seconds
64839_main_MSG_BAN=Your ban configuration may have been screwed up.\^Please verify it. 64838_main_MSG_SPD_LIMIT_SING=Speed limit for single address
64840_main_MSG_CANT_SAVE_OPT=Can't save options there.\^Should I try to save to user registry? 64839_main_MSG_SPD_LIMIT=Speed limit
64841_main_MSG_UPD_SAVE_ERROR=Cannot save the update 64840_main_MSG_AUTO_SAVE=Auto-save %s
64842_main_MSG_UPD_REQ_ONLY1=The auto-update feature cannot work because it requires the "Only 1 instance" option enabled.\^\^Your browser will now be pointed to the update, so you can install it manually. 64841_main_MSG_AUTO_SAVE_LONG=Auto-save %s.\^Specify in seconds.\^Leave blank to disable.
64843_main_MSG_UPD_WAIT=Waiting for last requests to be served, then we'll update 64842_main_MSG_MIN=We don't accept less than %d
64844_main_MSG_UPD_DL=Downloading new version... 64843_main_MSG_BAN=Your ban configuration may have been screwed up.\^Please verify it.
64845_main_MSG_UPDATE=You are invited to use the new version.\^\^Update now? 64844_main_MSG_CANT_SAVE_OPT=Can't save options there.\^Should I try to save to user registry?
64846_main_MSG_REQUESTING=Requesting... 64845_main_MSG_UPD_SAVE_ERROR=Cannot save the update
64847_main_MSG_CHK_UPD=Checking for updates 64846_main_MSG_UPD_REQ_ONLY1=The auto-update feature cannot work because it requires the "Only 1 instance" option enabled.\^\^Your browser will now be pointed to the update, so you can install it manually.
64848_main_MSG_LOG_UPL=Uploading %s 64847_main_MSG_UPD_WAIT=Waiting for last requests to be served, then we'll update
64849_main_MSG_LOG_UPLOADED=Fully uploaded %s - %s @ %sB/s 64848_main_MSG_LOG_HEAD=Served head
64850_main_MSG_LOG_UPL_FAIL=Upload failed %s 64849_main_MSG_LOG_NOT_MOD=Not modified, use cache
64851_main_MSG_LOG_DL=Fully downloaded - %s @ %sB/s - %s 64850_main_MSG_LOG_REDIR=Redirected to %s
64852_main_MSG_LOGIN_FAILED=Login failed 64851_main_MSG_LOG_NOT_SERVED=Not served: %d - %s
64853_main_MSG_MIN_DISK_REACHED=Minimum disk space reached. 64852_main_MSG_LOG_UPL=Uploading %s
64854_main_MSG_UPL_NAME_FORB=File name or extension forbidden. 64853_main_MSG_LOG_UPLOADED=Fully uploaded %s - %s @ %sB/s
64855_main_MSG_UPL_CANT_CREATE=Error creating file. 64854_main_MSG_LOG_UPL_FAIL=Upload failed %s
64856_main_FINGERPRINT=Create fingerprint on addition under %d KB 64855_main_MSG_LOG_DL=Fully downloaded - %s @ %sB/s - %s
64857_main_NO_FINGERPRINT=Create fingerprint on addition: disabled 64856_main_MSG_LOGIN_FAILED=Login failed
64858_main_MSG_SAVE_VFS=Your current file system is not saved.\^Save it? 64857_main_MSG_MIN_DISK_REACHED=Minimum disk space reached.
64859_main_MSG_INP_COMMENT=Please insert a comment for "%s".\^You should use HTML: <br> for break line. 64858_main_MSG_UPL_NAME_FORB=File name or extension forbidden.
64860_main_MSG_FILE_ADD_ABORT=File addition was aborted.\^The list of files is incomplete. 64859_main_MSG_UPL_CANT_CREATE=Error creating file.
64861_main_MSG_ADDING=Adding item #%d 64860_main_FINGERPRINT=Create fingerprint on addition under %d KB
64862_main_MSG_INV_FILENAME=Invalid filename 64861_main_NO_FINGERPRINT=Create fingerprint on addition: disabled
64863_main_MSG_DELETE=Delete? 64862_main_MSG_SAVE_VFS=Your current file system is not saved.\^Save it?
64864_main_MSG_PORT_USED_BY=It is already used by %s 64863_main_MSG_INP_COMMENT=Please insert a comment for "%s".\^You should use HTML: <br> for break line.
64865_main_MSG_PORT_BLOCKED=Something is blocking, maybe your system firewall. 64864_main_MSG_BAN_CMT=Ban comment
64866_main_MSG_KICK_ALL=There are %d connections open.\^Do you want to close them now? 64865_main_MSG_BAN_CMT_LONG=A comment for this ban...
64867_main_MSG_TPL_INCOMPATIBLE=The template you are trying to load is not compatible with current HFS version.\^HFS will now use default template.\^Ask on the forum if you need further help. 64866_main_MSG_BREAK_DYN_DNS=This option is NOT compatible with "dynamic dns updater".\^Continue?
64868_main_MSG_LOG_SERVER_START=Server start 64867_main_MSG_CANT_OPEN_PORT=Cannot open port.
64869_main_MSG_LOG_SERVER_STOP=Server stop 64868_main_MSG_PORT_USED_BY=It is already used by %s
64870_main_MSG_LOG_CONNECTED=Connected 64869_main_MSG_PORT_BLOCKED=Something is blocking, maybe your system firewall.
64871_main_MSG_LOG_DISC_SRV=Disconnected by server 64870_main_MSG_KICK_ALL=There are %d connections open.\^Do you want to close them now?
64872_main_MSG_LOG_DISC=Disconnected 64871_main_MSG_TPL_INCOMPATIBLE=The template you are trying to load is not compatible with current HFS version.\^HFS will now use default template.\^Ask on the forum if you need further help.
64873_main_MSG_LOG_GOT=Got %d bytes 64872_main_MSG_LOG_SERVER_START=Server start
64874_main_MSG_LOG_BYTES_SENT=%s bytes sent 64873_main_MSG_LOG_SERVER_STOP=Server stop
64875_main_MSG_LOG_SERVED=Served %s 64874_main_MSG_LOG_CONNECTED=Connected
64876_main_MSG_LOG_HEAD=Served head 64875_main_MSG_LOG_DISC_SRV=Disconnected by server
64877_main_MSG_LOG_NOT_MOD=Not modified, use cache 64876_main_MSG_LOG_DISC=Disconnected
64878_main_MSG_LOG_REDIR=Redirected to %s 64877_main_MSG_LOG_GOT=Got %d bytes
64879_main_MSG_LOG_NOT_SERVED=Not served: %d - %s 64878_main_MSG_LOG_BYTES_SENT=%s bytes sent
64880_main_MSG_DDNS_nohost=specified hostname does not exist 64879_main_MSG_LOG_SERVED=Served %s
64881_main_MSG_DDNS_notyours=specified hostname belongs to another username 64880_main_MSG_DDNS_FAIL=DNS update failed: %s\^User intervention is required.
64882_main_MSG_DDNS_numhost=too many or too few hosts found 64881_main_MSG_DDNS_REPLY_SIZE=%d bytes reply
64883_main_MSG_DDNS_abuse=specified hostname is blocked for update abuse 64882_main_MSG_DDNS_badauth=invalid user/password
64884_main_MSG_DDNS_dnserr=server error 64883_main_MSG_DDNS_notfqdn=incomplete hostname, required form aaa.bbb.com
64885_main_MSG_DDNS_911=server error 64884_main_MSG_DDNS_nohost=specified hostname does not exist
64886_main_MSG_DDNS_notdonator=an option specified requires payment 64885_main_MSG_DDNS_notyours=specified hostname belongs to another username
64887_main_MSG_DDNS_badagent=banned client 64886_main_MSG_DDNS_numhost=too many or too few hosts found
64888_main_MSG_BAN_MASK=Ban IP mask 64887_main_MSG_DDNS_abuse=specified hostname is blocked for update abuse
64889_main_MSG_IP_MASK_LONG=You can edit the address.\^Masks and ranges are allowed. 64888_main_MSG_DDNS_dnserr=server error
64890_main_MSG_KICK_ADDR=There are %d open connections from this address.\^Do you want to kick them all now? 64889_main_MSG_DDNS_911=server error
64891_main_MSG_BAN_ALREADY=This IP address is already banned 64890_main_MSG_DDNS_notdonator=an option specified requires payment
64892_main_MSG_BAN_CMT=Ban comment 64891_main_MSG_DDNS_badagent=banned client
64893_main_MSG_BAN_CMT_LONG=A comment for this ban... 64892_main_MSG_BAN_MASK=Ban IP mask
64894_main_MSG_BREAK_DYN_DNS=This option is NOT compatible with "dynamic dns updater".\^Continue? 64893_main_MSG_IP_MASK_LONG=You can edit the address.\^Masks and ranges are allowed.
64895_main_MSG_CANT_OPEN_PORT=Cannot open port. 64894_main_MSG_KICK_ADDR=There are %d open connections from this address.\^Do you want to kick them all now?
64896_main_MSG_NO_TEMP=Cannot save temporary file 64895_main_MSG_BAN_ALREADY=This IP address is already banned
64897_main_MSG_ERROR_REGISTRY=Can't write to registry.\^You may lack necessary rights. 64896_main_MSG_ADDRESSES_EXCEED=The following addresses exceed the limit:\^%s
64898_main_MSG_MANY_ITEMS=You are putting many files.\^Try using real folders instead of virtual folders.\^Read documentation or ask on the forum for help. 64897_main_MSG_NO_TEMP=Cannot save temporary file
64899_main_MSG_ADD_TO_HFS="Add to HFS" has been added to your Window's Explorer right-click menu. 64898_main_MSG_ERROR_REGISTRY=Can't write to registry.\^You may lack necessary rights.
64900_main_MSG_SINGLE_INSTANCE=Sorry, this feature only works with the "Only 1 instance" option enabled.\^\^You can find this option under Menu -> Start/Exit\^(only in expert mode) 64899_main_MSG_MANY_ITEMS=You are putting many files.\^Try using real folders instead of virtual folders.\^Read documentation or ask on the forum for help.
64901_main_MSG_COMM_ERROR=Network error. Request failed. 64900_main_MSG_ADD_TO_HFS="Add to HFS" has been added to your Window's Explorer right-click menu.
64902_main_MSG_DDNS_NO_REPLY=no reply 64901_main_MSG_SINGLE_INSTANCE=Sorry, this feature only works with the "Only 1 instance" option enabled.\^\^You can find this option under Menu -> Start/Exit\^(only in expert mode)
64903_main_MSG_DDNS_OK=successful 64902_main_MSG_COMM_ERROR=Network error. Request failed.
64904_main_MSG_DDNS_UNK=unknown reply: %s 64903_main_MSG_CON_PAUSED=paused
64905_main_MSG_DDNS_ERR=error: %s 64904_main_MSG_CON_SENT=%s / %s sent
64906_main_MSG_DDNS_REQ=DNS update requested for %s: %s 64905_main_MSG_CON_RECEIVED=%s / %s received
64907_main_MSG_DDNS_DOING=Updating dynamic DNS... 64906_main_MSG_DDNS_NO_REPLY=no reply
64908_main_MSG_DDNS_FAIL=DNS update failed: %s\^User intervention is required. 64907_main_MSG_DDNS_OK=successful
64909_main_MSG_DDNS_REPLY_SIZE=%d bytes reply 64908_main_MSG_DDNS_UNK=unknown reply: %s
64910_main_MSG_DDNS_badauth=invalid user/password 64909_main_MSG_DDNS_ERR=error: %s
64911_main_MSG_DDNS_notfqdn=incomplete hostname, required form aaa.bbb.com 64910_main_MSG_DDNS_REQ=DNS update requested for %s: %s
64912_main_MSG_MAX_SIM_ADDR{1}=Max simultaneous addresses 64911_main_MSG_DDNS_DOING=Updating dynamic DNS...
64913_main_MSG_MAX_SIM_ADDR_DL=Max simultaneous addresses downloading 64912_main_MSG_MAX_CON_SING=Max connections from single address
64914_main_MSG_MAX_SIM_DL_SING{2}=Max simultaneous downloads from single address 64913_main_MSG_MAX_SIM_ADDR{1}=Max simultaneous addresses
64915_main_MSG_MAX_SIM_DL=Max simultaneous downloads 64914_main_MSG_MAX_SIM_ADDR_DL=Max simultaneous addresses downloading
64916_main_MSG_SET_LIMIT=Set limit 64915_main_MSG_MAX_SIM_DL_SING{2}=Max simultaneous downloads from single address
64917_main_MSG_UNPROTECTED_LINKS=Links are NOT actually protected.\^The feature is there to be used with the "list protected items only..." option.\^Continue? 64916_main_MSG_MAX_SIM_DL=Max simultaneous downloads
64918_main_MSG_SAME_NAME=An item with the same name is already present in this folder.\^Continue? 64917_main_MSG_SET_LIMIT=Set limit
64919_main_MSG_CONTINUE=Continue? 64918_main_MSG_UNPROTECTED_LINKS=Links are NOT actually protected.\^The feature is there to be used with the "list protected items only..." option.\^Continue?
64920_main_MSG_PROCESSING=Processing... 64919_main_MSG_SAME_NAME=An item with the same name is already present in this folder.\^Continue?
64921_main_MSG_SPEED_KBS=%.1f kB/s 64920_main_MSG_CONTINUE=Continue?
64922_main_MSG_OPTIONS_SAVED=Options saved 64921_main_MSG_PROCESSING=Processing...
64923_main_MSG_SOME_LOCKED=Some items were not affected because locked 64922_main_MSG_SPEED_KBS=%.1f kB/s
64924_main_MSG_ITEM_LOCKED=The item is locked 64923_main_MSG_OPTIONS_SAVED=Options saved
64925_main_MSG_INVALID_VALUE=Invalid value 64924_main_MSG_SOME_LOCKED=Some items were not affected because locked
64926_main_MSG_EMPTY_NO_LIMIT=Leave blank to get no limits. 64925_main_MSG_ITEM_LOCKED=The item is locked
64927_main_MSG_ADDRESSES_EXCEED=The following addresses exceed the limit:\^%s 64926_main_MSG_INVALID_VALUE=Invalid value
64935_optionsDlg_MSG_INVERT_BAN=Normal behavior of the Ban is to prevent access to the addresses you specify (also called black-list).\^If you want the opposite, to allow the addresses that you specify (white-list), enter all addresses in a single row preceded by a \ character.\^\^Let say you want to allow all your 192.168 local network plus your office at 1.1.1.1.\^Just put this IP address mask: \192.168.*;1.1.1.1\^The opening \ character inverts the logic, so everything else is banned.\^\^If you want to know more about address masks, check the guide. 64927_main_MSG_EMPTY_NO_LIMIT=Leave blank to get no limits.
64936_main_S_PORT_LABEL=Port: %s 64935_classesLib_MSG_ANTIDOS_REPLY=Please wait, server busy
64937_main_S_PORT_ANY=any 64936_optionsDlg_MSG_INVERT_BAN=Normal behavior of the Ban is to prevent access to the addresses you specify (also called black-list).\^If you want the opposite, to allow the addresses that you specify (white-list), enter all addresses in a single row preceded by a \ character.\^\^Let say you want to allow all your 192.168 local network plus your office at 1.1.1.1.\^Just put this IP address mask: \192.168.*;1.1.1.1\^The opening \ character inverts the logic, so everything else is banned.\^\^If you want to know more about address masks, check the guide.
64938_main_DISABLED=disabled 64937_main_S_PORT_LABEL=Port: %s
64939_main_S_OK=Ok 64938_main_S_PORT_ANY=any
64940_main_MSG_MENU_VAL= (%s) 64939_main_DISABLED=disabled
64941_main_MSG_DL_TIMEOUT{1}=No downloads timeout 64940_main_S_OK=Ok
64942_main_MSG_MAX_CON=Max connections 64941_main_MSG_MENU_VAL= (%s)
64943_main_MSG_MAX_CON_SING=Max connections from single address 64942_main_MSG_DL_TIMEOUT{1}=No downloads timeout
64943_main_MSG_MAX_CON=Max connections
65046_OverbyteIcsHttpContCod_ERR_GETCODING_OVERRIDE=GetCoding must be overridden in %s 65046_OverbyteIcsHttpContCod_ERR_GETCODING_OVERRIDE=GetCoding must be overridden in %s
65088_OverbyteIcsCharsetUtils_sHebrewISOVisual=Hebrew (ISO-Visual) 65088_OverbyteIcsCharsetUtils_sHebrewISOVisual=Hebrew (ISO-Visual)
65089_OverbyteIcsCharsetUtils_sHebrewWindows=Hebrew (Windows) 65089_OverbyteIcsCharsetUtils_sHebrewWindows=Hebrew (Windows)

View File

@ -104,7 +104,7 @@ type
); );
body: ansistring; // specifies reply body according to bodyMode body: ansistring; // specifies reply body according to bodyMode
bodyFile: string; bodyFile: string;
bodyStream: Tstream; // note: the stream is automatically freed bodyStream: Tstream; // note: the stream is automatically freed
firstByte, lastByte: int64; // body interval for partial replies (206) firstByte, lastByte: int64; // body interval for partial replies (206)
realm, // this will appear in the authentication dialog realm, // this will appear in the authentication dialog
reason, // customized reason phrase reason, // customized reason phrase
@ -423,7 +423,7 @@ begin
repeat repeat
result:=posEx(ss, s, ofs); result:=posEx(ss, s, ofs);
if result = 0 then exit; if result = 0 then exit;
repeat repeat
qpos:=posEx(quote, s, ofs); qpos:=posEx(quote, s, ofs);
if qpos = 0 then exit; // there's no quoting, our result will fit if qpos = 0 then exit; // there's no quoting, our result will fit
@ -1599,7 +1599,7 @@ end; // initInputStream
function ThttpConn.sendNextChunk(max:integer=MAXINT):integer; function ThttpConn.sendNextChunk(max:integer=MAXINT):integer;
var var
n: int64; n, toSend: int64;
buf: ansistring; buf: ansistring;
begin begin
result:=0; result:=0;
@ -1611,7 +1611,8 @@ if (n = 0) or (bytesSentLastItem = 0) then n:=max;
if n > MAXIMUM_CHUNK_SIZE then n:=MAXIMUM_CHUNK_SIZE; if n > MAXIMUM_CHUNK_SIZE then n:=MAXIMUM_CHUNK_SIZE;
if n < MINIMUM_CHUNK_SIZE then n:=MINIMUM_CHUNK_SIZE; if n < MINIMUM_CHUNK_SIZE then n:=MINIMUM_CHUNK_SIZE;
if n > max then n:=max; if n > max then n:=max;
if n > bytesToSend then n:=bytesToSend; toSend:=bytesToSend;
if n > toSend then n:=toSend;
if n = 0 then exit; if n = 0 then exit;
setLength(buf, n); setLength(buf, n);
n:=stream.read(buf[1], n); n:=stream.read(buf[1], n);

View File

@ -2963,10 +2963,6 @@ object mainFrm: TmainFrm
AutoCheck = True AutoCheck = True
Caption = 'Enable macros.log' Caption = 'Enable macros.log'
end end
object Appendmacroslog1: TMenuItem
AutoCheck = True
Caption = 'Append macros.log'
end
object Runscript1: TMenuItem object Runscript1: TMenuItem
Caption = 'Run script...' Caption = 'Run script...'
OnClick = Runscript1Click OnClick = Runscript1Click

359
main.pas
View File

@ -17,7 +17,6 @@ This file is part of HFS ~ HTTP File Server.
along with HFS; if not, write to the Free Software along with HFS; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
} }
{$A+,B-,C+,E-,F-,G+,H+,I-,J+,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,X+,Y+,Z1}
{$INCLUDE defs.inc } {$INCLUDE defs.inc }
unit main; unit main;
@ -36,8 +35,8 @@ uses
HSlib, traylib, monoLib, progFrmLib, classesLib; HSlib, traylib, monoLib, progFrmLib, classesLib;
const const
VERSION = '2.4.0 RC4'; VERSION = '2.4.0 RC8';
VERSION_BUILD = '316'; VERSION_BUILD = '320';
VERSION_STABLE = {$IFDEF STABLE } TRUE {$ELSE} FALSE {$ENDIF}; VERSION_STABLE = {$IFDEF STABLE } TRUE {$ELSE} FALSE {$ENDIF};
CURRENT_VFS_FORMAT :integer = 1; CURRENT_VFS_FORMAT :integer = 1;
CRLF = #13#10; CRLF = #13#10;
@ -160,6 +159,9 @@ resourcestring
MSG_ENABLED = 'Option enabled'; MSG_ENABLED = 'Option enabled';
MSG_DISABLED = 'Option disabled'; MSG_DISABLED = 'Option disabled';
MSG_COMM_ERROR = 'Network error. Request failed.'; MSG_COMM_ERROR = 'Network error. Request failed.';
MSG_CON_PAUSED = 'paused';
MSG_CON_SENT = '%s / %s sent';
MSG_CON_RECEIVED = '%s / %s received';
type type
Pboolean = ^boolean; Pboolean = ^boolean;
@ -386,7 +388,7 @@ type
str:string; str:string;
int:integer; int:integer;
end; end;
TmainFrm = class(TForm) TmainFrm = class(TForm)
filemenu: TPopupMenu; filemenu: TPopupMenu;
newfolder1: TMenuItem; newfolder1: TMenuItem;
@ -669,7 +671,6 @@ type
Speedlimitforsingleaddress1: TMenuItem; Speedlimitforsingleaddress1: TMenuItem;
macrosLogChk: TMenuItem; macrosLogChk: TMenuItem;
Debug1: TMenuItem; Debug1: TMenuItem;
Appendmacroslog1: TMenuItem;
preventStandbyChk: TMenuItem; preventStandbyChk: TMenuItem;
titlePnl: TPanel; titlePnl: TPanel;
HTMLtemplate1: TMenuItem; HTMLtemplate1: TMenuItem;
@ -1366,8 +1367,10 @@ begin result:=reMatch(txt, '^'+quoteRegExprMetaChars(quoteIfAnyChar(' ',name)),
type type
TfileListing = class TfileListing = class
actualCount: integer;
public public
dir: array of Tfile; dir: array of Tfile;
timeout: TDateTime;
ignoreConnFilter: boolean; ignoreConnFilter: boolean;
constructor create(); constructor create();
destructor Destroy; override; destructor Destroy; override;
@ -1518,16 +1521,13 @@ end; // loadIon
function TfileListing.fromFolder(folder:Tfile; cd:TconnData; function TfileListing.fromFolder(folder:Tfile; cd:TconnData;
recursive:boolean=FALSE; limit:integer=-1; toSkip:integer=-1; doClear:boolean=TRUE):integer; recursive:boolean=FALSE; limit:integer=-1; toSkip:integer=-1; doClear:boolean=TRUE):integer;
var var
actualCount: integer;
seeProtected, noEmptyFolders, forArchive: boolean; seeProtected, noEmptyFolders, forArchive: boolean;
filesFilter, foldersFilter, urlFilesFilter, urlFoldersFilter: string; filesFilter, foldersFilter, urlFilesFilter, urlFoldersFilter: string;
procedure recurOn(f:Tfile); procedure recurOn(f:Tfile);
begin begin
if not f.isFolder() then exit; if not f.isFolder() then exit;
setLength(dir, actualCount);
toSkip:=fromFolder(f, cd, TRUE, limit, toSkip, FALSE); toSkip:=fromFolder(f, cd, TRUE, limit, toSkip, FALSE);
actualCount:=length(dir);
end; // recurOn end; // recurOn
procedure addToListing(f:Tfile); procedure addToListing(f:Tfile);
@ -1541,7 +1541,11 @@ var
else else
begin begin
if actualCount >= length(dir) then if actualCount >= length(dir) then
setLength(dir, actualCount+100); begin
setLength(dir, actualCount+1000);
if actualCount > 0 then
mainfrm.setStatusBarText(format('Listing files: %s',[dotted(actualCount)]));
end;
dir[actualCount]:=f; dir[actualCount]:=f;
inc(actualCount); inc(actualCount);
end; end;
@ -1660,6 +1664,8 @@ this would let us have "=" inside the names, but names cannot be assigned
repeat repeat
application.ProcessMessages(); application.ProcessMessages();
cd.lastActivityTime:=now(); cd.lastActivityTime:=now();
if (timeout > 0) and (cd.lastActivityTime > timeout) then
break;
// we don't list these entries // we don't list these entries
if (sr.name = '.') or (sr.name = '..') if (sr.name = '.') or (sr.name = '..')
or isCommentFile(sr.name) or isFingerprintFile(sr.name) or sameText(sr.name, DIFF_TPL_FILE) or isCommentFile(sr.name) or isFingerprintFile(sr.name) or sameText(sr.name, DIFF_TPL_FILE)
@ -1720,8 +1726,7 @@ this would let us have "=" inside the names, but names cannot be assigned
sr: TSearchRec; sr: TSearchRec;
n: Ttreenode; n: Ttreenode;
begin begin
{ this folder has been dinamically generated, thus the node is not actually // this folder has been dinamically generated, thus the node is not actually its own... skip
{ its own... skip }
if folder.isTemp() then exit; if folder.isTemp() then exit;
// include (valid) items from the VFS branch // include (valid) items from the VFS branch
@ -1786,7 +1791,8 @@ this would let us have "=" inside the names, but names cannot be assigned
begin begin
result:=toSkip; result:=toSkip;
if doClear then dir:=NIL; if doClear then
actualCount:=0;
if not folder.isFolder() if not folder.isFolder()
or not folder.accessFor(cd) or not folder.accessFor(cd)
@ -1804,7 +1810,6 @@ if assigned(cd) then
toSkip:=max(0, pred(strToIntDef(par('page'), 1))*limit); toSkip:=max(0, pred(strToIntDef(par('page'), 1))*limit);
end; end;
actualCount:=length(dir);
folder.getFiltersRecursively(filesFilter, foldersFilter); folder.getFiltersRecursively(filesFilter, foldersFilter);
if assigned(cd) and not ignoreConnFilter then if assigned(cd) and not ignoreConnFilter then
begin begin
@ -1828,7 +1833,10 @@ try
if folder.isRealFolder() and not (FA_HIDDENTREE in folder.flags) and allowedTo(folder) then if folder.isRealFolder() and not (FA_HIDDENTREE in folder.flags) and allowedTo(folder) then
includeFilesFromDisk(); includeFilesFromDisk();
includeItemsFromVFS(); includeItemsFromVFS();
finally setLength(dir, actualCount) end; finally
if doClear then
setLength(dir, actualCount)
end;
result:=toSkip; result:=toSkip;
end; // fromFolder end; // fromFolder
@ -2508,7 +2516,7 @@ begin
result:=FALSE; result:=FALSE;
if not isFolder() then exit; if not isFolder() then exit;
listing:=TfileListing.create(); listing:=TfileListing.create();
//** i fear it is not ok to use fromFolder() to know if the folder is empty, because it gives empty also for unallowed folders. //** i fear it is not ok to use fromFolder() to know if the folder is empty, because it gives empty also for unallowed folders.
listing.fromFolder( self, cd, FALSE, 1 ); listing.fromFolder( self, cd, FALSE, 1 );
result:= length(listing.dir) = 0; result:= length(listing.dir) = 0;
listing.free; listing.free;
@ -2611,7 +2619,7 @@ end; // fixTreeStructure
function Tfile.getParent():Tfile; function Tfile.getParent():Tfile;
begin begin
if node = NIL then if node = NIL then
exit(NIL); exit(NIL);
if node.data <> self then // the tree structure is unreliable, at least on DISPLAYCHANGE event. This will workaround it if node.data <> self then // the tree structure is unreliable, at least on DISPLAYCHANGE event. This will workaround it
fixTreeStructure(mainFrm.filesBox.Items[0]); fixTreeStructure(mainFrm.filesBox.Items[0]);
@ -2852,7 +2860,7 @@ result:='';
diff:=''; diff:='';
runPath:=''; runPath:='';
f:=self; f:=self;
if assigned(outInherited) then outInherited^:=FALSE; if assigned(outInherited) then outInherited^:=FALSE;
if assigned(outFromDisk) then outFromDisk^:=FALSE; if assigned(outFromDisk) then outFromDisk^:=FALSE;
first:=TRUE; first:=TRUE;
while assigned(f) do while assigned(f) do
@ -3093,7 +3101,7 @@ f:=self;
while assigned(f) do while assigned(f) do
begin begin
list:=f.accounts[FA_ACCESS]; // shortcut list:=f.accounts[FA_ACCESS]; // shortcut
if (username = '') and stringExists(USER_ANONYMOUS, list, TRUE) then break; if (username = '') and stringExists(USER_ANONYMOUS, list, TRUE) then break;
// first check in user/pass // first check in user/pass
if (f.user > '') and sameText(f.user, username) and (f.pwd = password) then break; if (f.user > '') and sameText(f.user, username) and (f.pwd = password) then break;
@ -3107,7 +3115,7 @@ while assigned(f) do
if assigned(a) and (a.pwd = password) and if assigned(a) and (a.pwd = password) and
(stringExists(USER_ANY_ACCOUNT, list, TRUE) or (findEnabledLinkedAccount(a, list, TRUE) <> NIL)) (stringExists(USER_ANY_ACCOUNT, list, TRUE) or (findEnabledLinkedAccount(a, list, TRUE) <> NIL))
then break; then break;
exit; exit;
end; end;
// there's a user/pass restriction, but the password didn't match (if we got this far). We didn't exit before to give accounts a chance. // there's a user/pass restriction, but the password didn't match (if we got this far). We didn't exit before to give accounts a chance.
@ -3212,7 +3220,7 @@ end; // getSafeHost
function nodeIsLocked(n:Ttreenode):boolean; function nodeIsLocked(n:Ttreenode):boolean;
begin begin
if (n = NIL) or (n.data = NIL) then if (n = NIL) or (n.data = NIL) then
exit(FALSE); exit(FALSE);
result:=nodeToFile(n).isLocked(); result:=nodeToFile(n).isLocked();
end; // nodeIsLocked end; // nodeIsLocked
@ -3274,7 +3282,7 @@ var
while i < length(parts) do while i < length(parts) do
begin begin
if parts[i] = '.' then if parts[i] = '.' then
goto REMOVE; // 10+ years have passed since the last time i used labels in pascal. It's a thrill. goto REMOVE; // 10+ years have passed since the last time i used labels in pascal. It's a thrill.
if parts[i] <> '..' then if parts[i] <> '..' then
begin begin
inc(i); inc(i);
@ -3605,59 +3613,21 @@ var
fast.append(s); fast.append(s);
end; // handleItem end; // handleItem
const ip2availability: Tdictionary<string,Tdatetime> = NIL;
const folderConcurrents: integer = 0;
const MAX_CONCURRENTS = 3;
procedure updateAvailability();
var
pair: Tpair<string,Tdatetime>;
t: Tdatetime;
begin
t:=now();
if folderConcurrents = MAX_CONCURRENTS then // serving multiple addresses at max capacity, let's give a grace period for others
ip2availability[cd.address]:=t + 1/SECONDS
else
ip2availability.Remove(cd.address);
dec(folderConcurrents);
// purge leftovers
for pair in ip2availability do
if pair.Value < t then
ip2availability.Remove(pair.Key);
end;
function available():boolean;
begin
if ip2availability = NIL then
ip2availability:=Tdictionary<string,Tdatetime>.create();
try
if ip2availability[cd.address] > now() then // this specific address has to wait?
exit(FALSE);
except
end;
if folderConcurrents >= MAX_CONCURRENTS then // max number of concurrent folder loading, others are postponed
exit(FALSE);
inc(folderConcurrents);
ip2availability.AddOrSetValue(cd.address, now()+1);
result:=TRUE;
end; // available
var var
i, n: integer; i, n: integer;
f: Tfile; f: Tfile;
useList: boolean; useList: boolean;
mainSection: PtplSection; mainSection: PtplSection;
antiDos: TantiDos;
begin begin
result:=''; result:='';
if (folder = NIL) or not folder.isFolder() then exit; if (folder = NIL) or not folder.isFolder() then exit;
if macrosLogChk.checked and not appendmacroslog1.checked then
resetLog();
diffTpl:=Ttpl.create(); diffTpl:=Ttpl.create();
folder.lock(); folder.lock();
try try
buildTime:=now(); buildTime:=now();
cd.conn.addHeader('Cache-Control: no-cache, no-store, must-revalidate, max-age=-1'); cd.conn.setHeaderIfNone('Cache-Control: no-cache, no-store, must-revalidate, max-age=-1');
recur:=shouldRecur(cd); recur:=shouldRecur(cd);
baseurl:=protoColon()+getSafeHost(cd)+folder.url(TRUE); baseurl:=protoColon()+getSafeHost(cd)+folder.url(TRUE);
@ -3677,12 +3647,9 @@ try
exit; exit;
useList:=not mainSection.noList; useList:=not mainSection.noList;
if useList and not available() then antiDos:=TantiDos.create();
begin if useList and not antiDos.accept(cd.conn, cd.address) then
cd.conn.reply.mode:=HRM_OVERLOAD; exit(cd.conn.reply.body);
cd.conn.addHeader('Refresh: '+intToStr(1+random(2))); // random for less collisions
exit('Please wait, server busy');
end;
fullEncode:=FALSE; fullEncode:=FALSE;
ofsRelUrl:=length(folder.url(fullEncode))+1; ofsRelUrl:=length(folder.url(fullEncode))+1;
@ -3792,8 +3759,7 @@ try
result:=replaceText(result, '%build-time%', result:=replaceText(result, '%build-time%',
floatToStrF((now()-buildTime)*SECONDS, ffFixed, 7,3) ); floatToStrF((now()-buildTime)*SECONDS, ffFixed, 7,3) );
finally finally
if useList then freeAndNIL(antiDos);
updateAvailability();
folder.unlock(); folder.unlock();
diffTpl.free; diffTpl.free;
end; end;
@ -4040,9 +4006,9 @@ if result then
conn.reply.mode:=HRM_NOT_MODIFIED; conn.reply.mode:=HRM_NOT_MODIFIED;
exit; exit;
end; end;
conn.addHeader('ETag: '+UTF8encode(etag)); conn.setHeaderIfNone('ETag: '+UTF8encode(etag));
if ts > '' then if ts > '' then
conn.addHeader('Last-Modified: '+UTF8encode(ts)); conn.setHeaderIfNone('Last-Modified: '+UTF8encode(ts));
end; // notModified end; // notModified
function notModified(conn:ThttpConn; f:string):boolean; overload; function notModified(conn:ThttpConn; f:string):boolean; overload;
@ -4974,7 +4940,7 @@ var
var s:ansistring; var s:ansistring;
begin begin
s:=ansistring(HSlib.encodeURL(data.lastFN)); s:=ansistring(HSlib.encodeURL(data.lastFN));
conn.addHeader( ansistring('Content-Disposition: '+if_(attach, 'attachment; ') conn.setHeaderIfNone( ansistring('Content-Disposition: '+if_(attach, 'attachment; ')
+'filename*=UTF-8'''''+s+'; filename='+s)); +'filename*=UTF-8'''''+s+'; filename='+s));
end; end;
@ -5046,11 +5012,24 @@ var
addString(getTill('#', data.postvars.valueFromIndex[i]), result) // omit #anchors addString(getTill('#', data.postvars.valueFromIndex[i]), result) // omit #anchors
end; // getFilesSelection end; // getFilesSelection
function possibleCSRF():boolean;
var s: string;
begin
s:= conn.getHeader('origin');
result:=(s > '') and not s.endsWith( conn.getHeader('Host'))
end; // possibleCSRF
procedure serveTar(); procedure serveTar();
var var
tar: TtarStream; tar: TtarStream;
nofolders, selection, itsAsearch: boolean; nofolders, selection, itsAsearch: boolean;
procedure addToTar(src,dst:string);
begin
if not selection or not tar.contains(src) then
tar.addFile(src, dst);
end;
procedure addFolder(f:Tfile; ignoreConnFilters:boolean=FALSE); procedure addFolder(f:Tfile; ignoreConnFilters:boolean=FALSE);
var var
i, ofs: integer; i, ofs: integer;
@ -5063,6 +5042,7 @@ var
listing:=TfileListing.create(); listing:=TfileListing.create();
try try
listing.ignoreConnFilter:=ignoreConnFilters; listing.ignoreConnFilter:=ignoreConnFilters;
listing.timeout:= now()+1/MINUTES;
listing.fromFolder( f, data, shouldRecur(data)); listing.fromFolder( f, data, shouldRecur(data));
fIsTemp:=f.isTemp(); fIsTemp:=f.isTemp();
ofs:=length(f.resource)-length(f.name)+1; ofs:=length(f.resource)-length(f.name)+1;
@ -5084,7 +5064,7 @@ var
else else
s:=fi.pathTill(f.parent); // we want the path to include also f, so stop at f.parent s:=fi.pathTill(f.parent); // we want the path to include also f, so stop at f.parent
tar.addFile(fi.resource, s); addToTar(fi.resource, s);
end end
finally listing.free end; finally listing.free end;
end; // addFolder end; // addFolder
@ -5098,10 +5078,10 @@ var
for s in getFilesSelection() do for s in getFilesSelection() do
begin begin
selection:=TRUE; selection:=TRUE;
if dirCrossing(s) then if dirCrossing(s) then
continue; continue;
ft:=findFilebyURL(s, f); ft:=findFilebyURL(s, f);
if ft = NIL then if ft = NIL then
continue; continue;
try try
if not ft.accessFor(data) then if not ft.accessFor(data) then
@ -5119,11 +5099,13 @@ var
t:=substr(s, lastDelimiter('\/', s)+1) t:=substr(s, lastDelimiter('\/', s)+1)
else else
t:=s; t:=s;
tar.addFile(ft.resource, t); addToTar(ft.resource, t);
finally freeIfTemp(ft) end; finally freeIfTemp(ft) end;
end; end;
end; // addSelection end; // addSelection
var
antiDos: TantiDos;
begin begin
if not f.hasRecursive(FA_ARCHIVABLE) then if not f.hasRecursive(FA_ARCHIVABLE) then
begin begin
@ -5139,38 +5121,46 @@ var
noFolders:=not stringExists(data.postVars.values['nofolders'], ['','0','false']); noFolders:=not stringExists(data.postVars.values['nofolders'], ['','0','false']);
itsAsearch:=data.urlvars.values['search'] > ''; itsAsearch:=data.urlvars.values['search'] > '';
tar:=TtarStream.create(); // this is freed by ThttpSrv antiDos:=TantiDos.create;
try try
tar.fileNamesOEM:=oemTarChk.checked; tar:=TtarStream.create();
addSelection(); try
if not selection then tar.fileNamesOEM:=oemTarChk.checked;
addFolder(f); addSelection();
if not selection then
if antiDos.accept(data.conn, data.address) then
addFolder(f)
else
exit;
if tar.count = 0 then if tar.count = 0 then
begin begin
tar.free; tar.free;
data.disconnectReason:='There is no file you are allowed to download'; data.disconnectReason:='There is no file you are allowed to download';
getPage('deny', data, f); getPage('deny', data, f);
exit; exit;
end;
data.fileXferStart:=now();
conn.reply.mode:=HRM_REPLY;
conn.reply.contentType:=DEFAULT_MIME;
conn.reply.bodyMode:=RBM_STREAM;
conn.reply.bodyStream:=tar; // it will be freed by ThttpSrv
if f.name = '' then exit; // can this really happen?
data.lastFN:=if_(f.name='/', 'home', f.name)
+'.'+if_(selection, 'selection', if_(itsAsearch, 'search', 'folder'))
+'.tar';
data.lastFN:=first(eventToFilename('archive name', [
'%archive-name%', data.lastFN,
'%mode%', if_(selection, 'selection','folder'),
'%archive-size%', intToStr(tar.size)
]), data.lastFN);
if not noContentdispositionChk.checked then
addContentDisposition();
except tar.free
end; end;
data.fileXferStart:=now(); finally freeAndNIL(antiDos)
conn.reply.mode:=HRM_REPLY; end;
conn.reply.contentType:=DEFAULT_MIME;
conn.reply.bodyMode:=RBM_STREAM;
conn.reply.bodyStream:=tar;
if f.name = '' then exit; // can this really happen?
data.lastFN:=if_(f.name='/', 'home', f.name)
+'.'+if_(selection, 'selection', if_(itsAsearch, 'search', 'folder'))
+'.tar';
data.lastFN:=first(eventToFilename('archive name', [
'%archive-name%', data.lastFN,
'%mode%', if_(selection, 'selection','folder'),
'%archive-size%', intToStr(tar.size)
]), data.lastFN);
if not noContentdispositionChk.checked then
addContentDisposition();
except tar.free end;
end; // serveTar end; // serveTar
procedure checkCurrentAddress(); procedure checkCurrentAddress();
@ -5245,10 +5235,10 @@ var
getPage('deny', data); getPage('deny', data);
exit; exit;
end; end;
if conn.reply.contentType = '' then if conn.reply.contentType = '' then
conn.reply.contentType:=ansistring(if_(trim(getTill('<', s))='', 'text/html', 'text/plain'))+'; charset=utf-8'; conn.reply.contentType:=ansistring(if_(trim(getTill('<', s))='', 'text/html', 'text/plain'))+'; charset=utf-8';
if conn.reply.mode = HRM_IGNORE then if conn.reply.mode = HRM_IGNORE then
conn.reply.mode:=HRM_REPLY; conn.reply.mode:=HRM_REPLY;
conn.reply.bodyMode:=RBM_STRING; conn.reply.bodyMode:=RBM_STRING;
conn.reply.body:=UTF8encode(s); conn.reply.body:=UTF8encode(s);
@ -5262,7 +5252,9 @@ var
begin begin
if (conn.request.method <> HM_POST) if (conn.request.method <> HM_POST)
or (data.postVars.values['action'] <> 'delete') or (data.postVars.values['action'] <> 'delete')
or not accountAllowed(FA_DELETE, data, f) then exit; or not accountAllowed(FA_DELETE, data, f)
or possibleCSRF()
then exit;
doneRes:=NIL; doneRes:=NIL;
errors:=NIL; errors:=NIL;
@ -5344,14 +5336,38 @@ var
except end; except end;
if data.session.ttl < 0 then if data.session.ttl < 0 then
exit('expired'); exit('expired');
data.account:=acc; data.account:=acc;
data.session.user:=acc.user; data.session.user:=acc.user;
data.user:=acc.user; data.user:=acc.user;
data.pwd:=acc.pwd; data.pwd:=acc.pwd;
data.session.redirect:='.'; data.session.redirect:='.';
runEventScript('login')
end; //urlAuth end; //urlAuth
function thumb():Boolean;
var
b: rawbytestring;
s, e: integer;
begin
if mode <> 'thumb' then
exit(FALSE);
result:=TRUE;
b:=loadFile(f.resource, 0, 96*KILO);
s:= pos(rawbytestring(#$FF#$D8#$FF), b, 2);
if s > 0 then
e:=pos(rawbytestring(#$FF#$D9), b, s);
if (s=0) or (e=0) then
begin
data.conn.reply.mode:=HRM_NOT_FOUND;
exit;
end;
conn.reply.contentType:='image/jpeg';
conn.reply.mode:=HRM_REPLY;
conn.reply.bodyMode:=RBM_STRING;
conn.reply.body:=Copy(b, s, e-s+2);
end;
var var
b: boolean; b: boolean;
s: string; s: string;
@ -5409,6 +5425,13 @@ var
end; end;
runEventScript('pre-filter-request'); runEventScript('pre-filter-request');
if conn.disconnectedByServer then
exit;
if data.disconnectReason > '' then
begin
getPage('deny', data);
exit;
end;
if (length(conn.request.user) > 100) or anycharIn('/\:?*<>|', conn.request.user) then if (length(conn.request.user) > 100) or anycharIn('/\:?*<>|', conn.request.user) then
begin begin
@ -5463,12 +5486,17 @@ var
end end
else else
s:='bad password'; //TODO shouldn't this change http code? s:='bad password'; //TODO shouldn't this change http code?
if s='ok' then
runEventScript('login')
else
runEventScript('unauthorized');
replyWithString(s); replyWithString(s);
exit; exit;
end; end;
s:=urlAuth(); s:=urlAuth();
if s > '' then if s > '' then
begin begin
runEventScript('unauthorized');
conn.reply.mode:=HRM_DENY; conn.reply.mode:=HRM_DENY;
replyWithString(s); replyWithString(s);
exit; exit;
@ -5538,7 +5566,7 @@ var
url:=chop(lastDelimiter('/', urlCmd)+1, 0, urlCmd); url:=chop(lastDelimiter('/', urlCmd)+1, 0, urlCmd);
// we know an urlCmd must begin with ~ // we know an urlCmd must begin with ~
// favicon is handled as an urlCmd: we provide HFS icon. // favicon is handled as an urlCmd: we provide HFS icon.
// an non-existent ~file will be detected a hundred lines below. // a non-existent ~file will be detected a hundred lines below.
if ansiStartsStr('~', urlCmd) or (urlCmd = 'favicon.ico') then if ansiStartsStr('~', urlCmd) or (urlCmd = 'favicon.ico') then
f:=findFileByURL(url); f:=findFileByURL(url);
end; end;
@ -5613,16 +5641,16 @@ var
s:=''; s:='';
if (s > '') and f.isFolder() and not ansiStartsText('special:', s) then if (s > '') and f.isFolder() and not ansiStartsText('special:', s) then
with tplFromFile(f) do // temporarily builds from diff tpls with tplFromFile(f) do // temporarily builds from diff tpls
try try
section:=getsection(s); section:=getsection(s);
if assigned(section) and not section.nourl then // it has to exist and be accessible if assigned(section) and section.public then // it has to exist and be accessible
begin begin
if not section.cache if not section.cache
or not notModified(conn, s+floatToStr(section.ts), '') then or not notModified(conn, s+floatToStr(section.ts), '') then
getPage(s, data, f, me()); getPage(s, data, f, me());
exit; exit;
end; end;
finally free finally free
end; end;
if f.isFolder() and not (FA_BROWSABLE in f.flags) if f.isFolder() and not (FA_BROWSABLE in f.flags)
@ -5699,6 +5727,9 @@ var
if notModified(conn, f) then // calling notModified before limitsExceededOnDownload makes possible for [download] to manipualate headers set here if notModified(conn, f) then // calling notModified before limitsExceededOnDownload makes possible for [download] to manipualate headers set here
exit; exit;
if thumb() then
Exit;
data.countAsDownload:=f.shouldCountAsDownload(); data.countAsDownload:=f.shouldCountAsDownload();
if data.countAsDownload and limitsExceededOnDownload() then if data.countAsDownload and limitsExceededOnDownload() then
exit; exit;
@ -5714,7 +5745,7 @@ var
conn.addHeader('ETag: '+getEtag(f.resource)); conn.addHeader('ETag: '+getEtag(f.resource));
except end; except end;
} }
data.fileXferStart:=now(); data.fileXferStart:=now();
if data.countAsDownload and (flashOn = 'download') then flash(); if data.countAsDownload and (flashOn = 'download') then flash();
@ -5983,7 +6014,7 @@ case event of
refreshConn(data); refreshConn(data);
end; end;
HE_POST_VAR: data.postVars.add(conn.post.varname+'='+conn.post.data); HE_POST_VAR: data.postVars.add(conn.post.varname+'='+UTF8toString(conn.post.data));
HE_POST_VARS: HE_POST_VARS:
if conn.post.mode = PM_URLENCODED then if conn.post.mode = PM_URLENCODED then
urlToStrings(conn.post.data, data.postVars); urlToStrings(conn.post.data, data.postVars);
@ -6209,7 +6240,7 @@ if f.isFile() and fingerprintsChk.checked and (autoFingerprint > 0) then
end; end;
except except
end; end;
if (f.resource = '') or not f.isVirtualFolder() then exit; if (f.resource = '') or not f.isVirtualFolder() then exit;
// virtual folders must be run at addition-time // virtual folders must be run at addition-time
if findFirst(f.resource+'\*',faAnyfile, sr) <> 0 then exit; if findFirst(f.resource+'\*',faAnyfile, sr) <> 0 then exit;
@ -6944,7 +6975,7 @@ var
// account properties are separated by pipes // account properties are separated by pipes
t:=chop('|',s); t:=chop('|',s);
p:=chop(':',t); // get property name p:=chop(':',t); // get property name
if p = '' then if p = '' then
continue; continue;
if p = 'login' then if p = 'login' then
begin begin
@ -6953,15 +6984,15 @@ var
a.user:=chop(':',t); a.user:=chop(':',t);
a.pwd:=t; a.pwd:=t;
end end
else if p = 'enabled' then else if p = 'enabled' then
a.enabled:=yes(t) a.enabled:=yes(t)
else if p = 'no-limits' then else if p = 'no-limits' then
a.noLimits:=yes(t) a.noLimits:=yes(t)
else if p = 'group' then else if p = 'group' then
a.group:=yes(t) a.group:=yes(t)
else if p = 'redir' then else if p = 'redir' then
a.redir:=t a.redir:=t
else if p = 'link' then else if p = 'link' then
a.link:=split(':',t) a.link:=split(':',t)
else if p = 'notes' then else if p = 'notes' then
a.notes:=UTF8ToString(unzipCfgProp(ansistring(t))) a.notes:=UTF8ToString(unzipCfgProp(ansistring(t)))
@ -7278,7 +7309,7 @@ end; // setcfg
function loadCfg(var ini,tpl:string):boolean; function loadCfg(var ini,tpl:string):boolean;
// until 2.2 the template could be kept in the registry, so we need to move it now. // until 2.2 the template could be kept in the registry, so we need to move it now.
// returns true if the registry source can be deleted // returns true if the registry source can be deleted
function moveLegacyTpl(tpl:string):boolean; function moveLegacyTpl(tpl:string):boolean;
begin begin
@ -7854,7 +7885,12 @@ finally freeAndNIL(info) end;
end; // autoCheckUpdates end; // autoCheckUpdates
procedure loadEvents(); procedure loadEvents();
begin eventScripts.fullText:=loadTextFile(cfgpath+EVENTSCRIPTS_FILE) end; begin
if not newMtime(cfgpath+EVENTSCRIPTS_FILE, eventScriptsLast) then
exit;
eventScripts.fullText:=loadTextFile(cfgpath+EVENTSCRIPTS_FILE);
runEventScript('init');
end;
procedure Tmainfrm.updateCopyBtn(); procedure Tmainfrm.updateCopyBtn();
resourcestring resourcestring
@ -7994,7 +8030,7 @@ var
if not stringExists(defaultIP, getPossibleAddresses()) then if not stringExists(defaultIP, getPossibleAddresses()) then
// previous address not available anymore (it happens using dial-up) // previous address not available anymore (it happens using dial-up)
findSimilarIP(defaultIP); findSimilarIP(defaultIP);
if searchbetteripChk.checked if searchbetteripChk.checked
and not stringExists(defaultIP, customIPs) // we don't mess with custom IPs and not stringExists(defaultIP, customIPs) // we don't mess with custom IPs
and isLocalIP(defaultIP) then // we prefer non-local addresses and isLocalIP(defaultIP) then // we prefer non-local addresses
@ -8082,10 +8118,10 @@ var
if userSocketBuffer > 0 then if userSocketBuffer > 0 then
data.conn.sndBuf:=userSocketBuffer data.conn.sndBuf:=userSocketBuffer
else else if highSpeedChk.checked then
begin begin
size:=minmax(8192, MEGA, round(data.averageSpeed)); size:=minmax(8192, MEGA, round(data.averageSpeed));
if highSpeedChk.checked and (safeDiv(0.0+size, data.conn.sndbuf, 2) > 2) then if safeDiv(0.0+size, data.conn.sndbuf, 2) > 2 then
data.conn.sndBuf:=size; data.conn.sndBuf:=size;
end; end;
end; end;
@ -8111,9 +8147,7 @@ var
updateCopyBtn(); updateCopyBtn();
keepTplUpdated(); keepTplUpdated();
updateCurrentCFG(); updateCurrentCFG();
loadEvents();
if newMtime(cfgpath+EVENTSCRIPTS_FILE, eventScriptsLast) then
loadEvents();
if assigned(runScriptFrm) and runScriptFrm.visible if assigned(runScriptFrm) and runScriptFrm.visible
and runScriptFrm.autorunChk.checked and newMtime(tempScriptFilename, runScriptLast) then and runScriptFrm.autorunChk.checked and newMtime(tempScriptFilename, runScriptLast) then
@ -8603,7 +8637,7 @@ try
kind:=if_(res = mrYes, 'virtual', 'real'); kind:=if_(res = mrYes, 'virtual', 'real');
end; end;
if kind = 'virtual' then if kind = 'virtual' then
include(f.flags, FA_VIRTUAL); include(f.flags, FA_VIRTUAL);
end; end;
@ -8832,10 +8866,30 @@ procedure TmainFrm.appEventsShowHint(var HintStr: String; var CanShow: Boolean;
MSG_CON_HINT = 'Connection time: %s'#13'Last request time: %s'#13'Agent: %s'; MSG_CON_HINT = 'Connection time: %s'#13'Last request time: %s'#13'Agent: %s';
var var
cd: TconnData; cd: TconnData;
st: string;
begin begin
cd:=pointedConnection(); cd:=pointedConnection();
if assigned(cd) then if assigned(cd) then
result:=format(MSG_CON_HINT, [dateTimeToStr(cd.time), dateTimeToStr(cd.requestTime), first(cd.agent,'<unknown>')]) begin
if isSendingFile(cd) then
st:=format(MSG_CON_SENT, [
dotted(cd.conn.bytesSentLastItem),
dotted(cd.conn.bytesPartial)
])
else if isReceivingFile(cd) then
st:=format(MSG_CON_received, [
dotted(cd.conn.bytesPosted),
dotted(cd.conn.post.length)
])
else
st:='';
result:=format(MSG_CON_HINT, [
dateTimeToStr(cd.time),
dateTimeToStr(cd.requestTime),
first(cd.agent,'<unknown>')
])+nonEmptyConcat(#13,st);
end
else else
result:=if_(HintsForNewcomersChk.checked, 'This box shows info about current connections'); result:=if_(HintsForNewcomersChk.checked, 'This box shows info about current connections');
end; end;
@ -9116,10 +9170,6 @@ var
end; end;
function getStatus():string; function getStatus():string;
resourcestring
MSG_CON_PAUSED = 'paused';
MSG_CON_SENT = '%s / %s sent';
MSG_CON_RECEIVED = '%s / %s received';
begin begin
if isSendingFile(data) then if isSendingFile(data) then
begin begin
@ -9127,16 +9177,16 @@ var
result:=MSG_CON_PAUSED result:=MSG_CON_PAUSED
else else
result:=format(MSG_CON_SENT, [ result:=format(MSG_CON_SENT, [
dotted(data.conn.bytesSentLastItem), smartsize(data.conn.bytesSentLastItem),
dotted(data.conn.bytesPartial) smartsize(data.conn.bytesPartial)
]); ]);
exit; exit;
end; end;
if isReceivingFile(data) then if isReceivingFile(data) then
begin begin
result:=format(MSG_CON_received, [ result:=format(MSG_CON_received, [
dotted(data.conn.bytesPosted), smartsize(data.conn.bytesPosted),
dotted(data.conn.post.length) smartsize(data.conn.post.length)
]); ]);
exit; exit;
end; end;
@ -9193,7 +9243,7 @@ end;
function TmainFrm.appEventsHelp(Command: Word; Data: Integer; var CallHelp: Boolean): Boolean; function TmainFrm.appEventsHelp(Command: Word; Data: Integer; var CallHelp: Boolean): Boolean;
begin begin
callHelp:=FALSE; // avoid exception to be thrown callHelp:=FALSE; // avoid exception to be thrown
result:=FALSE; result:=FALSE;
end; end;
procedure TmainFrm.appEventsMinimize(Sender: TObject); procedure TmainFrm.appEventsMinimize(Sender: TObject);
@ -9215,7 +9265,7 @@ if userInteraction.disabled then exit;
case ev of case ev of
TE_RCLICK: TE_RCLICK:
begin begin
setForegroundWindow(handle); // application.bringToFront() will act up when the window is minimized: the popped up menu will stay up forever setForegroundWindow(handle); // application.bringToFront() will act up when the window is minimized: the popped up menu will stay up forever
with mouse.cursorPos do with mouse.cursorPos do
menu.popup(x,y); menu.popup(x,y);
end; end;
@ -9566,7 +9616,7 @@ resourcestring
+#13'It is adviced to stop loading.' +#13'It is adviced to stop loading.'
+#13'Stop?'; +#13'Stop?';
MSG_BADCRC = 'This file is corrupted (CRC).'; MSG_BADCRC = 'This file is corrupted (CRC).';
MSG_NEWER='This file has been created with a newer and incompatible version.'; MSG_NEWER_INCOMP='This file has been created with a newer and incompatible version.';
MSG_ZLIB = 'This file is corrupted (ZLIB).'; MSG_ZLIB = 'This file is corrupted (ZLIB).';
MSG_BAKAVAILABLE = 'This file is corrupted but a backup is available.'#13'Continue with backup?'; MSG_BAKAVAILABLE = 'This file is corrupted but a backup is available.'#13'Continue with backup?';
@ -9653,7 +9703,7 @@ while not tlv.isOver() do
after.resetLetBrowse:=TRUE; after.resetLetBrowse:=TRUE;
end; end;
if (int_(data) > CURRENT_VFS_FORMAT) if (int_(data) > CURRENT_VFS_FORMAT)
and (msgDlg(MSG_NEWER+MSG_BETTERSTOP, MB_ICONERROR+MB_YESNO) = IDYES) then and (msgDlg(MSG_NEWER_INCOMP+MSG_BETTERSTOP, MB_ICONERROR+MB_YESNO) = IDYES) then
exit; exit;
end; end;
FK_CRC: FK_CRC:
@ -9927,7 +9977,7 @@ var
i: integer; i: integer;
begin begin
if mi.shortcut = sc then mi.click(); if mi.shortcut = sc then mi.click();
for i:=0 to mi.count-1 do resendShortcut(mi.items[i], sc); for i:=0 to mi.count-1 do resendShortcut(mi.items[i], sc);
end; end;
procedure TmainFrm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure TmainFrm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
@ -11284,7 +11334,7 @@ if i = sbarIdxs.banStatus then BannedIPaddresses1Click(NIL);
if i = sbarIdxs.customTpl then Edit1Click(NIL); if i = sbarIdxs.customTpl then Edit1Click(NIL);
if i = sbarIdxs.oos then Minimumdiskspace1Click(NIL); if i = sbarIdxs.oos then Minimumdiskspace1Click(NIL);
if i = sbarIdxs.out then Speedlimit1Click(NIL); if i = sbarIdxs.out then Speedlimit1Click(NIL);
if i = sbarIdxs.notSaved then Savefilesystem1Click(NIL); if i = sbarIdxs.notSaved then Savefilesystem1Click(NIL);
end; end;
procedure TmainFrm.sbarMouseDown(Sender: TObject; Button: TMouseButton; procedure TmainFrm.sbarMouseDown(Sender: TObject; Button: TMouseButton;
@ -11300,7 +11350,7 @@ resourcestring
MSG_DISAB_FIND_EXT = 'This option makes pointless the option "Find external address at startup", which has now been disabled for your convenience.'; MSG_DISAB_FIND_EXT = 'This option makes pointless the option "Find external address at startup", which has now been disabled for your convenience.';
begin begin
dyndns.url:=url; dyndns.url:=url;
if url = '' then exit; if url = '' then exit;
// this function is called when setting any dyndns service. // this function is called when setting any dyndns service.
// calling it from somewhere else may make the following test unsuitable // calling it from somewhere else may make the following test unsuitable
if mainfrm.findExtOnStartupChk.checked then if mainfrm.findExtOnStartupChk.checked then
@ -11507,7 +11557,7 @@ resourcestring
http.agent:=HFS_HTTP_AGENT; http.agent:=HFS_HTTP_AGENT;
try http.get() try http.get()
except // a redirection will result in an exception except // a redirection will result in an exception
if (http.statusCode < 300) or (http.statusCode >= 400) then exit; if (http.statusCode < 300) or (http.statusCode >= 400) then exit;
result:=TRUE; result:=TRUE;
host:=http.hostname; host:=http.hostname;
port:=http.ctrlSocket.Port; port:=http.ctrlSocket.Port;
@ -11850,7 +11900,6 @@ if menu.items.find(logmenu.items.caption) = NIL then
SwitchON1.imageIndex:=if_(srv.active, 11, 4); SwitchON1.imageIndex:=if_(srv.active, 11, 4);
SwitchON1.caption:=if_(srv.active, S_OFF, S_ON); SwitchON1.caption:=if_(srv.active, S_OFF, S_ON);
Appendmacroslog1.Enabled:=macrosLogChk.checked;
stopSpidersChk.Enabled:=not fileExistsByURL('/robots.txt'); stopSpidersChk.Enabled:=not fileExistsByURL('/robots.txt');
Showbandwidthgraph1.visible:=not graphBox.visible; Showbandwidthgraph1.visible:=not graphBox.visible;
if bakShellMenuText='' then if bakShellMenuText='' then
@ -12075,7 +12124,7 @@ tray:=TmyTrayicon.create(self);
DragAcceptFiles(handle, true); DragAcceptFiles(handle, true);
caption:=format('HFS ~ HTTP File Server %s', [VERSION]); caption:=format('HFS ~ HTTP File Server %s', [VERSION]);
application.Title:=format('HFS %s', [VERSION]); application.Title:=format('HFS %s', [VERSION]);
setSpeedLimit(-1); setSpeedLimit(50000);
setSpeedLimitIP(-1); setSpeedLimitIP(-1);
setGraphRate(10); setGraphRate(10);
setMaxConnections(0); setMaxConnections(0);
@ -12118,7 +12167,7 @@ and only1instanceChk.checked and not mono.master then
if not cfgLoaded then if not cfgLoaded then
setTplText(); setTplText();
processParams_before(params); processParams_before(params);
if not quitASAP then if not quitASAP then
@ -12263,7 +12312,7 @@ end; // purgeFilesCB
procedure TmainFrm.Properties1Click(Sender: TObject); procedure TmainFrm.Properties1Click(Sender: TObject);
begin begin
if selectedFile = NIL then exit; if selectedFile = NIL then exit;
filepropFrm:=TfilepropFrm.Create(mainFrm); filepropFrm:=TfilepropFrm.Create(mainFrm);
try try
@ -12461,7 +12510,7 @@ while current > '' do
'dynamic-dns-user', 'dynamic-dns-host', 'ips-ever', 'ips-ever-connected', 'dynamic-dns-user', 'dynamic-dns-host', 'ips-ever', 'ips-ever-connected',
'icon-masks-user-images', 'last-external-address', 'last-dialog-folder']) 'icon-masks-user-images', 'last-external-address', 'last-dialog-folder'])
then continue; then continue;
defV:=default.values[k]; defV:=default.values[k];
if defV = v then continue; if defV = v then continue;
if k = 'dynamic-dns-updater' then if k = 'dynamic-dns-updater' then
@ -12707,7 +12756,7 @@ for I := 0 to Form.ControlCount-1 do
else if Ctrl is TEdit then else if Ctrl is TEdit then
Edit := TEdit(Ctrl); Edit := TEdit(Ctrl);
end; end;
Edit.SetBounds(Prompt.Left, Prompt.Top + Prompt.Height + 5, max(200, Prompt.Width), Edit.Height); Edit.SetBounds(Prompt.Left, Prompt.Top + Prompt.Height + 5, max(200, Prompt.Width), Edit.Height);
Form.ClientWidth := (Edit.Left * 2) + Edit.Width; Form.ClientWidth := (Edit.Left * 2) + Edit.Width;
ButtonTop := Edit.Top + Edit.Height + 15; ButtonTop := Edit.Top + Edit.Height + 15;

View File

@ -161,16 +161,18 @@ var
procedure deprecatedMacro(what:string=''; instead:string=''); procedure deprecatedMacro(what:string=''; instead:string='');
begin mainfrm.add2log('WARNING, deprecated macro: '+first(what, name)+nonEmptyConcat(' - Use instead: ',instead), NIL, clRed) end; begin mainfrm.add2log('WARNING, deprecated macro: '+first(what, name)+nonEmptyConcat(' - Use instead: ',instead), NIL, clRed) end;
procedure unsatisfied(b:boolean=TRUE);
begin
if b then
macroError('cannot be used here')
end;
function satisfied(p:pointer):boolean; function satisfied(p:pointer):boolean;
begin begin
result:=assigned(p); result:=assigned(p);
if not result then unsatisfied(not result);
macroError('cannot be used here');
end; end;
procedure unsatisfied(b:boolean=TRUE);
begin if b then macroError('cannot be used here') end;
function parEx(idx:integer; name:string=''; doTrim:boolean=TRUE):string; overload; function parEx(idx:integer; name:string=''; doTrim:boolean=TRUE):string; overload;
var var
i: integer; i: integer;
@ -262,9 +264,9 @@ var
result:=staticVars; result:=staticVars;
delete(varname,1,length(G_VAR_PREFIX)); delete(varname,1,length(G_VAR_PREFIX));
end end
else if satisfied(md.cd) then else if assigned(md.cd) then
result:=md.cd.vars result:=md.cd.vars
else if satisfied(md.tempVars) then else if assigned(md.tempVars) then
result:=md.tempVars result:=md.tempVars
else else
raise Exception.create('no namespace available'); raise Exception.create('no namespace available');
@ -293,7 +295,7 @@ var
if not satisfied(space) then exit; if not satisfied(space) then exit;
i:=space.indexOfName(varname); i:=space.indexOfName(varname);
if i < 0 then if i < 0 then
if value = '' then exit // all is good the way it is if value = '' then exit(TRUE) // all is good the way it is
else i:=space.add(varname+'='+value) else i:=space.add(varname+'='+value)
else else
if value > '' then // in case of empty value, there's no need to assign, because we are going to delete it (after we cleared the bound object) if value > '' then // in case of empty value, there's no need to assign, because we are going to delete it (after we cleared the bound object)
@ -660,8 +662,11 @@ var
procedure inc_(v:integer=+1); procedure inc_(v:integer=+1);
begin begin
result:=''; try
try setVar(p, intToStr(strToIntDef(getVar(p),0)+v*parI(1,1))) except end; setVar(p, intToStr(strToIntDef(getVar(p),0)+v*parI(1,1)));
result:='';
except
end;
end; // inc_ end; // inc_
procedure convert(); procedure convert();
@ -688,7 +693,9 @@ var
result:=''; result:='';
for c in UTF8encode(s) do for c in UTF8encode(s) do
result:=result+intToHex(ord(c)); result:=result+intToHex(ord(c));
end end;
if isFalse(par('macros')) then
result:=noMacrosAllowed(result);
end; // convert end; // convert
procedure encodeuri(); procedure encodeuri();
@ -950,9 +957,9 @@ var
i: integer; i: integer;
begin begin
code:=macroDequote(par(pars.count-1)); code:=macroDequote(par(pars.count-1));
lines:=TStringList.create();
with TfastStringAppend.create do with TfastStringAppend.create do
try try
lines:=TStringList.create();
lines.text:= getVar(par('var')); lines.text:= getVar(par('var'));
for line in lines do for line in lines do
begin begin
@ -1225,20 +1232,20 @@ var
'information=64' 'information=64'
); );
var var
i, j, code: integer; code: integer;
decode: TStringDynArray; decode: TStringDynArray;
s: string; s, d: string;
buttons, icon: boolean; buttons, icon: boolean;
begin begin
decode:=split(' ',par(1)); decode:=split(' ',par(1));
code:=0; code:=0;
for i:=0 to length(decode)-1 do for d in decode do
for j:=1 to length(STR2CODE) do for s in STR2CODE do
begin if startsStr(d+'=', s) then
s:=STR2CODE[j]; begin
if ansiStartsStr(decode[i], s) then inc(code, strToIntDef(substr(s, 2+d.length), 0));
inc(code, strToIntDef(substr(s, 1+pos('=',s)), 0)); Break
end; end;
buttons:=code AND 15 > 0; buttons:=code AND 15 > 0;
icon:=code SHR 4 > 0; icon:=code SHR 4 > 0;
if not icon and buttons then if not icon and buttons then
@ -1367,19 +1374,20 @@ var
if not satisfied(space) then exit; if not satisfied(space) then exit;
// set the table variable as text // set the table variable as text
v:=par(1); v:=par(1);
space.values[p]:=nonEmptyConcat('', space.values[p], CRLF)+v;
// access the table object // access the table object
i:=space.indexOfName(p); i:=space.indexOfName(p);
h:=space.objects[i] as THashedStringList; if i < 0 then
if h = NIL then
begin begin
h:=ThashedStringList.create(); h:=ThashedStringList.create();
space.objects[i]:=h; space.AddPair(p, v, h);
end; end
else
h:=space.objects[i] as THashedStringList;
// fill the object // fill the object
k:=chop('=',v); k:=chop('=',v);
v:=macroDequote(v); v:=macroDequote(v);
h.values[k]:=v; h.values[k]:=v;
space.values[p]:=h.text;
end; // setTable end; // setTable
procedure disconnect(); procedure disconnect();
@ -1958,10 +1966,7 @@ try
begin begin
try try
if isFalse(parEx('if')) then if isFalse(parEx('if')) then
begin exit('');
result:='';
exit;
end;
except end; except end;
result:=md.cd.disconnectReason; // return the previous state result:=md.cd.disconnectReason; // return the previous state
if pars.count > 0 then md.cd.disconnectReason:=p; if pars.count > 0 then md.cd.disconnectReason:=p;
@ -1998,7 +2003,11 @@ try
if name = 'base64' then if name = 'base64' then
result:=string(base64encode(UTF8encode(p))); result:=string(base64encode(UTF8encode(p)));
if name = 'base64decode' then if name = 'base64decode' then
begin
result:=utf8ToString(base64decode(ansistring(p))); result:=utf8ToString(base64decode(ansistring(p)));
if isFalse(par('macros')) then
result:=noMacrosAllowed(result);
end;
if name = 'md5' then if name = 'md5' then
result:=strMD5(p); result:=strMD5(p);
if name = 'sha1' then if name = 'sha1' then
@ -2077,7 +2086,7 @@ try
encodeuri(); encodeuri();
if name = 'decodeuri' then if name = 'decodeuri' then
result:=decodeURL(ansistring(p)); result:=noMacrosAllowed(decodeURL(ansistring(p)));
if name = 'set cfg' then if name = 'set cfg' then
trueIf(mainfrm.setcfg(p)); trueIf(mainfrm.setcfg(p));

View File

@ -29,12 +29,15 @@ document: {.if|var}
document: {.exec|out|timeout|exitcode.} document: {.exec|out|timeout|exitcode.}
document: [+section] document: [+section]
document: {.set item|diff template.} document: {.set item|diff template.}
document: {.add header|overwrite=0.}
document: {.calc| ][ } document: {.calc| ][ }
document: single line diff templates (file path) document: single line diff templates (file path)
document: {.disconnection reason|if=XXX.} document: {.disconnection reason|if=XXX.}
document: %url% document: %url%
document: commands returning white space: add folder, save, set account, exec, mkdir, chdir, delete, rename, move copy, set document: commands returning white space: add folder, save, set account, exec, mkdir, chdir, delete, rename, move copy, set
document: dir, disk free, filetime, file changed, load tpl, sha256, for line document: pipe, base64, base64decode, dir, disk free, filetime, file changed, load tpl, sha256, for line
document {.convert|macros|dec|hex.}
document: new event [login]
+ event to filter logging http://www.rejetto.com/forum/index.php/topic,9784.0.html + event to filter logging http://www.rejetto.com/forum/index.php/topic,9784.0.html
- wrong browser http://www.rejetto.com/forum/index.php/topic,9710.0.html - wrong browser http://www.rejetto.com/forum/index.php/topic,9710.0.html
solution: solution:
@ -52,8 +55,7 @@ document: dir, disk free, filetime, file changed, load tpl, sha256, for line
? in getPage() many %symbols% are translated in a way incompatible with {.section.} ? in getPage() many %symbols% are translated in a way incompatible with {.section.}
? Windows Script Interfaces ? Windows Script Interfaces
? {.image|src=file|width=x|dst=outfile.} ? {.image|src=file|width=x|dst=outfile.}
+ replace /~imgXX with ?mode=icon&id=XX + user input through {.dialog.} or similar
+ user input through {.dialog.}
+ show missing files in VFS http://www.rejetto.com/forum/index.php/topic,8203.new.html + show missing files in VFS http://www.rejetto.com/forum/index.php/topic,8203.new.html
* {.cache.} should be able to work on a simple variable * {.cache.} should be able to work on a simple variable
+ plugins system http://www.rejetto.com/wiki/index.php/HFS:_plugins_design + plugins system http://www.rejetto.com/wiki/index.php/HFS:_plugins_design
@ -91,12 +93,12 @@ document: dir, disk free, filetime, file changed, load tpl, sha256, for line
+ an updated hint on virtual folders, to explain how to get upload working + an updated hint on virtual folders, to explain how to get upload working
- requesting a non-existant file inside an unauthorized folder, apache replies 401, hfs 404. try to comply. - requesting a non-existant file inside an unauthorized folder, apache replies 401, hfs 404. try to comply.
+ make %list% available in every page + make %list% available in every page
+ support for ALT+F4 with option "Minimize to tray clicking the close button" www.rejetto.com/forum/?topic=6351 + support for ALT+F4 with option "Minimize to tray clicking the close button" www.rejetto.com/forum/?topic=6351
+ replace and delete icons http://www.rejetto.com/forum/index.php?topic=6317.msg1038157#msg1038157 + replace and delete icons http://www.rejetto.com/forum/index.php?topic=6317.msg1038157#msg1038157
? currently the delete permission is only inside a folder. you can't mark a file or delete the marked folder. is this ok? ? currently the delete permission is only inside a folder. you can't mark a file or delete the marked folder. is this ok?
+ when a link is protected (no access for this user) it may be displayed as a link to the %item-name%, then 401, and if login is successful provide a redirection + when a link is protected (no access for this user) it may be displayed as a link to the %item-name%, then 401, and if login is successful provide a redirection
+ change folder/link/generic-file icons (via GUI, without editing the template) + change folder/link/generic-file icons (via GUI, without editing the template)
+ a way to get bigger icons (client side) + a way to get bigger icons (client side)
+ be able to produce rss http://www.rejetto.com/forum/index.php?topic=5846.msg1035481#msg1035481 + be able to produce rss http://www.rejetto.com/forum/index.php?topic=5846.msg1035481#msg1035481
* better warning message http://www.rejetto.com/forum/index.php?topic=5795.msg1034406#msg1034406 * better warning message http://www.rejetto.com/forum/index.php?topic=5795.msg1034406#msg1034406
? on the fly files compression www.rejetto.com/forum/?topic=5492 ? on the fly files compression www.rejetto.com/forum/?topic=5492
@ -104,7 +106,7 @@ document: dir, disk free, filetime, file changed, load tpl, sha256, for line
? auto-removing folders www.rejetto.com/forum/?topic=3149 ? auto-removing folders www.rejetto.com/forum/?topic=3149
+ last-access-time for files www.rejetto.com/forum/?topic=5266 + last-access-time for files www.rejetto.com/forum/?topic=5266
+ expiration time for account www.rejetto.com/forum/?topic=5409 + expiration time for account www.rejetto.com/forum/?topic=5409
+ warn the user if there's no useful IP address http://www.rejetto.com/forum/index.php?topic=3193.msg1031371#msg1031371 + warn the user if there's no useful IP address http://www.rejetto.com/forum/index.php?topic=3193.msg1031371#msg1031371
+ GUI suggestions www.rejetto.com/forum/?topic=5334 + GUI suggestions www.rejetto.com/forum/?topic=5334
+ {.cookie.} http://www.rejetto.com/forum/index.php?topic=5349.0 + {.cookie.} http://www.rejetto.com/forum/index.php?topic=5349.0
+ restrict access to -> ip mask www.rejetto.com/forum/?topic=5244 + restrict access to -> ip mask www.rejetto.com/forum/?topic=5244
@ -125,37 +127,37 @@ document: dir, disk free, filetime, file changed, load tpl, sha256, for line
+ per-folder no-limit + per-folder no-limit
+ windows auth (NLTM? seems to be available in ICS) www.rejetto.com/forum/?topic=3762 + windows auth (NLTM? seems to be available in ICS) www.rejetto.com/forum/?topic=3762
+ more stats www.rejetto.com/forum/?topic=4968 + more stats www.rejetto.com/forum/?topic=4968
+ to disable single ban rules + to disable single ban rules
+ ban by hostname + ban by hostname
+ edit comments for real folders www.rejetto.com/forum/?topic=4667 + edit comments for real folders www.rejetto.com/forum/?topic=4667
+ a way to pass ini commands through the command line + a way to pass ini commands through the command line
+ create folders via command line www.rejetto.com/forum/?topic=3955 + create folders via command line www.rejetto.com/forum/?topic=3955
? support mp3ToIon www.rejetto.com/forum/?topic=4600 ? support mp3ToIon www.rejetto.com/forum/?topic=4600
+ download only for <account-list> + download only for <account-list>
+ account: see all transfers in ~progress http://www.rejetto.com/forum/index.php/topic,9325.msg1053416/topicseen.html#msg1053416 + account: see all transfers in ~progress http://www.rejetto.com/forum/index.php/topic,9325.msg1053416/topicseen.html#msg1053416
+ limit account to a host mask + limit account to a host mask
+ tray icons for uploads + tray icons for uploads
+ MAC filter + MAC filter
+ if robots.txt does not exist, an option "don't be listed on search engines" + if robots.txt does not exist, an option "don't be listed on search engines"
+ menu -> limits -> temporarily disable all limits + menu -> limits -> temporarily disable all limits
+ menu -> limits -> max speed for each address + menu -> limits -> max speed for each address
+ option to display counter for folders as number of accesses instead of total access to files in it + option to display counter for folders as number of accesses instead of total access to files in it
+ autodisabling accounts www.rejetto.com/forum/?topic=5379 + autodisabling accounts www.rejetto.com/forum/?topic=5379
+ on update, propose a link to the "what's new" page + on update, propose a link to the "what's new" page
+ add special folder (expert mode): let you specify a special folder, like documents, or manually enter a path (useful for relative paths), or GUID + add special folder (expert mode): let you specify a special folder, like documents, or manually enter a path (useful for relative paths), or GUID
+ logs rotation (hfs always append) + logs rotation (hfs always append)
+ double address bar, one for LAN and one for the Internet + double address bar, one for LAN and one for the Internet
+ per user diff-tpl (apply both folder and user diff-tpl.s, and let the user decide priority, default:user,folder) + per user diff-tpl (apply both folder and user diff-tpl.s, and let the user decide priority, default:user,folder)
+ "Folder image mask", a file mask indicating the external file that should be used as icon (~img_folder) + "Folder image mask", a file mask indicating the external file that should be used as icon (~img_folder)
+ to be able to add icons from multi-icon files (like shell32.dll) + to be able to add icons from multi-icon files (like shell32.dll)
+ installer (saving to registry, and making ini-file the new default, don't ask for shell menu) + installer (saving to registry, and making ini-file the new default, don't ask for shell menu)
+ support unicode filenames (FindFirstFileW. Cannot be done because widgets don't support unicode) + support unicode filenames (FindFirstFileW. Cannot be done because widgets don't support unicode)
* show "(home)" instead of "/" in VFS * show "(home)" instead of "/" in VFS
+ show updateinfo notice also in autocheck + show updateinfo notice also in autocheck
+ top 10 downloaded files + top 10 downloaded files
+ after the self test fails, and a router problem is detected, prompt a wizard for portforwad.com (extract routers list) + after the self test fails, and a router problem is detected, prompt a wizard for portforwad.com (extract routers list)
+ export vfs map as txt/html + export vfs map as txt/html
+ specific message for each disabled account + specific message for each disabled account
+ search for files including meta information (id3 tag) www.rejetto.com/forum/?topic=5312 + search for files including meta information (id3 tag) www.rejetto.com/forum/?topic=5312
+ multiupload using flash + multiupload using flash
? support shortcut to folders in real-folders ? support shortcut to folders in real-folders
@ -183,7 +185,7 @@ document: dir, disk free, filetime, file changed, load tpl, sha256, for line
* stop using /~commands and move all of them in the standard ?name=value form * stop using /~commands and move all of them in the standard ?name=value form
VER 3 VER 3
+ new kind of folder (no more real/virtual folders) + new kind of folder (no more real/virtual folders)
VER 3.5 VER 3.5
+ search for files + search for files

View File

@ -2220,7 +2220,7 @@ const
var var
sa : TSecurityAttributes; sa : TSecurityAttributes;
ReadPipe,WritePipe : THandle; ReadPipe,WritePipe : THandle;
start : TStartUpInfoA; start : TStartUpInfoW;
ProcessInfo : TProcessInformation; ProcessInfo : TProcessInformation;
Buffer : Pansichar; Buffer : Pansichar;
TotalBytesRead, TotalBytesRead,
@ -2251,7 +2251,7 @@ else
timeout:=now()+timeout/SECONDS; timeout:=now()+timeout/SECONDS;
// Create a Console Child Process with redirected input and output // Create a Console Child Process with redirected input and output
try try
if CreateProcessA(nil, PansiChar(ansistring(DosApp)), @sa, @sa, true, CREATE_NO_WINDOW or NORMAL_PRIORITY_CLASS, nil, nil, start, ProcessInfo) then if CreateProcess(nil, PChar(dosApp), @sa, @sa, true, CREATE_NO_WINDOW or NORMAL_PRIORITY_CLASS, nil, nil, start, ProcessInfo) then
repeat repeat
result:=TRUE; result:=TRUE;
// wait for end of child process // wait for end of child process
@ -2261,16 +2261,22 @@ try
// so that the pipe is not blocked by an overflow. New information // so that the pipe is not blocked by an overflow. New information
// can be written from the console app to the pipe only if there is // can be written from the console app to the pipe only if there is
// enough buffer space. // enough buffer space.
if not PeekNamedPipe(ReadPipe, @Buffer[TotalBytesRead], ReadBuffer, if not PeekNamedPipe(ReadPipe, @Buffer[TotalBytesRead], ReadBuffer, @BytesRead, @TotalBytesAvail, @BytesLeftThisMessage )
@BytesRead, @TotalBytesAvail, @BytesLeftThisMessage ) then or (BytesRead > 0) and not ReadFile(ReadPipe, Buffer[TotalBytesRead], BytesRead, BytesRead, nil ) then
break break;
else if BytesRead > 0 then
ReadFile(ReadPipe, Buffer[TotalBytesRead], BytesRead, BytesRead, nil );
inc(TotalBytesRead, BytesRead); inc(TotalBytesRead, BytesRead);
until (Apprunning <> WAIT_TIMEOUT) or (now() >= timeout); until (Apprunning <> WAIT_TIMEOUT) or (now() >= timeout);
Buffer[TotalBytesRead]:= #0; if IsTextUnicode(Buffer, TotalBytesRead, NIL) then
OemToCharA(PansiChar(Buffer),Buffer); begin
output:=string(ansistrings.strPas(Buffer)); Pchar(@Buffer[TotalBytesRead])^:= #0;
output:=pchar(Buffer)
end
else
begin
Buffer[TotalBytesRead]:= #0;
OemToCharA(Buffer,Buffer);
output:=string(ansistrings.strPas(Buffer));
end;
finally finally
GetExitCodeProcess(ProcessInfo.hProcess, exitcode); GetExitCodeProcess(ProcessInfo.hProcess, exitcode);
TerminateProcess(ProcessInfo.hProcess, 0); TerminateProcess(ProcessInfo.hProcess, 0);
@ -2576,7 +2582,8 @@ var
i:=mImp+dir; i:=mImp+dir;
repeat repeat
j:=i+dir; j:=i+dir;
if (j > 0) and (j <= length(s)) and charInSet(s[j], ['0'..'9','.']) then if (j > 0) and (j <= length(s))
and (charInSet(s[j], ['0'..'9','.','E']) or (j>1) and charInSet(s[j],['+','-']) and (s[j-1]='E')) then
i:=j i:=j
else else
break; break;
@ -2606,6 +2613,7 @@ begin
end; end;
if (i = 1) // a starting operator is not an operator if (i = 1) // a starting operator is not an operator
or (s[i-1]='E') // exponential syntax
or (v <= mImpV) // left-to-right precedence or (v <= mImpV) // left-to-right precedence
then continue; then continue;
// we got a better one, record it // we got a better one, record it