mirror of
https://github.com/xroche/httrack.git
synced 2026-07-21 08:10:00 +03:00
Compare commits
36 Commits
codeql-ign
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1c8b93d9e7 | ||
|
|
d267aaf1bf | ||
|
|
226702fcab | ||
|
|
491774abda | ||
|
|
dbad05fcf0 | ||
|
|
db19089448 | ||
|
|
eb9e353f0b | ||
|
|
8a8fd7f9c0 | ||
|
|
1c1c0b1267 | ||
|
|
fe685d4117 | ||
|
|
f12d5e7434 | ||
|
|
e01e1b34de | ||
|
|
a67eb57def | ||
|
|
6634d48c21 | ||
|
|
a2c75b5316 | ||
|
|
6aabb3ba09 | ||
|
|
088f0711b8 | ||
|
|
ce481efeca | ||
|
|
7b68d7dc96 | ||
|
|
a47b7bee4d | ||
|
|
7be61d3111 | ||
|
|
3cc49b79c3 | ||
|
|
959deb0afb | ||
|
|
18bdc24d15 | ||
|
|
0b772ec6ba | ||
|
|
a0f2f89ec3 | ||
|
|
93ec06f404 | ||
|
|
bc67e74dea | ||
|
|
c7fcdebe46 | ||
|
|
eb46d8d469 | ||
|
|
9bc53d40d2 | ||
|
|
938a873e19 | ||
|
|
ed05faaaa8 | ||
|
|
5e56a913a5 | ||
|
|
29e868b2ca | ||
|
|
f1418bac3c |
6
.github/workflows/codeql.yml
vendored
6
.github/workflows/codeql.yml
vendored
@@ -46,6 +46,12 @@ jobs:
|
|||||||
# fopen's umask-controlled 0666 is intended for mirror/cache/log
|
# fopen's umask-controlled 0666 is intended for mirror/cache/log
|
||||||
# output; the one credential file (cookies.txt) is kept 0600 on Unix.
|
# output; the one credential file (cookies.txt) is kept 0600 on Unix.
|
||||||
config: |
|
config: |
|
||||||
|
paths-ignore:
|
||||||
|
# Demo callback samples, not part of libhttrack.
|
||||||
|
- libtest
|
||||||
|
# ProxyTrack: a separate legacy binary with no auth surface; its
|
||||||
|
# recv/cache-parse code trips taint queries by design.
|
||||||
|
- src/proxy
|
||||||
query-filters:
|
query-filters:
|
||||||
- exclude:
|
- exclude:
|
||||||
id: cpp/world-writable-file-creation
|
id: cpp/world-writable-file-creation
|
||||||
|
|||||||
29
.github/workflows/windows-build.yml
vendored
29
.github/workflows/windows-build.yml
vendored
@@ -149,25 +149,36 @@ jobs:
|
|||||||
export HTTPS_SUPPORT=yes BROTLI_ENABLED=yes ZSTD_ENABLED=yes
|
export HTTPS_SUPPORT=yes BROTLI_ENABLED=yes ZSTD_ENABLED=yes
|
||||||
export LC_ALL=C.UTF-8
|
export LC_ALL=C.UTF-8
|
||||||
|
|
||||||
# A wedged crawl must not eat the job's whole timeout budget.
|
# A wedged crawl must not eat the job's timeout budget. timeout(1)'s
|
||||||
watchdog=""
|
# signals can't reap a native httrack.exe (MSYS signals don't reach it),
|
||||||
command -v timeout >/dev/null && watchdog="timeout 600"
|
# so a hang orphaned processes that starved the runner; run_with_timeout
|
||||||
|
# TerminateProcess-es the whole tree. 600s clears the slowest multi-pass
|
||||||
|
# crawl (a few passes at --max-time=120 each).
|
||||||
|
. ./testlib.sh
|
||||||
|
|
||||||
pass=0 fail=0 skip=0 failed="" skipped=""
|
pass=0 fail=0 skip=0 failed="" skipped=""
|
||||||
for t in 00_runnable.test 01_engine-*.test 01_zlib-*.test \
|
for t in 00_runnable.test 01_engine-*.test 01_zlib-*.test \
|
||||||
*_local-*.test 13_crawl_proxy_https.test; do
|
*_local-*.test 13_crawl_proxy_https.test 58_watchdog.test \
|
||||||
|
60_crawl-log-salvage.test; do
|
||||||
rc=0
|
rc=0
|
||||||
# shellcheck disable=SC2086
|
run_with_timeout 600 bash "$t" >"$t.log" 2>&1 || rc=$?
|
||||||
$watchdog bash "$t" >"$t.log" 2>&1 || rc=$?
|
|
||||||
case "$rc" in
|
case "$rc" in
|
||||||
0) pass=$((pass + 1)); echo "PASS $t" ;;
|
0) pass=$((pass + 1)); echo "PASS $t" ;;
|
||||||
77) skip=$((skip + 1)) skipped="$skipped $t"; echo "SKIP $t" ;;
|
77) skip=$((skip + 1)) skipped="$skipped $t"; echo "SKIP $t" ;;
|
||||||
|
124)
|
||||||
|
fail=$((fail + 1)) failed="$failed $t"
|
||||||
|
echo "FAIL $t (timed out, tree killed)"
|
||||||
|
# Re-running a wedge traced would just hang again: salvage the
|
||||||
|
# killed crawl's own logs into the artifact instead.
|
||||||
|
dump_crawl_logs >>"$t.log"
|
||||||
|
tail -n 25 "$t.log" | sed 's/^/ /'
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
fail=$((fail + 1)) failed="$failed $t"
|
fail=$((fail + 1)) failed="$failed $t"
|
||||||
echo "FAIL $t (exit $rc)"
|
echo "FAIL $t (exit $rc)"
|
||||||
# These assert with `test "$(...)" == "..." || exit 1`, which
|
# These assert with `test "$(...)" == "..." || exit 1`, which
|
||||||
# says nothing at all on failure. Re-run traced.
|
# says nothing at all on failure. Re-run traced, still bounded.
|
||||||
bash -x "$t" >>"$t.log" 2>&1 || true
|
run_with_timeout 600 bash -x "$t" >>"$t.log" 2>&1 || true
|
||||||
tail -n 25 "$t.log" | sed 's/^/ /'
|
tail -n 25 "$t.log" | sed 's/^/ /'
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -177,7 +188,7 @@ jobs:
|
|||||||
|
|
||||||
# Every gate here exits 77, so an all-skipped suite would report green having
|
# Every gate here exits 77, so an all-skipped suite would report green having
|
||||||
# tested nothing: pin the skips, and floor the passes in case the glob empties.
|
# tested nothing: pin the skips, and floor the passes in case the glob empties.
|
||||||
expected_skips=" 48_local-crange-memresume.test" # pending #581
|
expected_skips=" 48_local-crange-memresume.test 71_local-crange-repaircache.test" # pending #581
|
||||||
[ "$pass" -ge 90 ] || { echo "::error::only $pass tests passed ($skip skipped)"; exit 1; }
|
[ "$pass" -ge 90 ] || { echo "::error::only $pass tests passed ($skip skipped)"; exit 1; }
|
||||||
[ "$skipped" = "$expected_skips" ] || { echo "::error::unexpected skips:$skipped"; exit 1; }
|
[ "$skipped" = "$expected_skips" ] || { echo "::error::unexpected skips:$skipped"; exit 1; }
|
||||||
[ "$fail" -eq 0 ] || { echo "::error::failing:$failed"; exit 1; }
|
[ "$fail" -eq 0 ] || { echo "::error::failing:$failed"; exit 1; }
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -43,3 +43,6 @@ Makefile
|
|||||||
|
|
||||||
# Python bytecode (tests/local-server.py).
|
# Python bytecode (tests/local-server.py).
|
||||||
__pycache__/
|
__pycache__/
|
||||||
|
|
||||||
|
# Per-checkout Claude Code rules (symlink into a local sandbox).
|
||||||
|
/CLAUDE.local.md
|
||||||
|
|||||||
35
AGENTS.md
35
AGENTS.md
@@ -19,6 +19,13 @@ the operational checklist: toolchain, invariants, and how to ship a change.
|
|||||||
(`request_queue_size`) so macOS/BSD don't drop connections under a parallel
|
(`request_queue_size`) so macOS/BSD don't drop connections under a parallel
|
||||||
`-c16` bigcrawl the way Python's default backlog of 5 did.
|
`-c16` bigcrawl the way Python's default backlog of 5 did.
|
||||||
Or run `sh build.sh` to do bootstrap + configure + make in one shot.
|
Or run `sh build.sh` to do bootstrap + configure + make in one shot.
|
||||||
|
- A `tests/NN_*.test` runs only if listed in `tests/Makefile.am`'s `TESTS`; an
|
||||||
|
unregistered file is silently skipped.
|
||||||
|
- `make check` prepends the build's `src/` to `PATH`, but a hand-run `.test` does
|
||||||
|
not — an installed `/usr/bin/httrack` then shadows your build. Run via `make
|
||||||
|
check`, or `PATH="<bld>/src:$PATH"` for a manual run.
|
||||||
|
- Give new `.test` scripts `set -e`: the older ones predate the rule, so several
|
||||||
|
`local-crawl.sh` calls with no `set -e` report PASS on any non-last failure.
|
||||||
|
|
||||||
## Hard invariants
|
## Hard invariants
|
||||||
- **Generated autotools files are NOT in git.** `configure`, every
|
- **Generated autotools files are NOT in git.** `configure`, every
|
||||||
@@ -31,15 +38,32 @@ the operational checklist: toolchain, invariants, and how to ship a change.
|
|||||||
- **Format only changed lines** with `git clang-format` (clang-format 19). Never
|
- **Format only changed lines** with `git clang-format` (clang-format 19). Never
|
||||||
reformat untouched code: the engine was formatted by an old tool and won't
|
reformat untouched code: the engine was formatted by an old tool and won't
|
||||||
round-trip.
|
round-trip.
|
||||||
- **Byte-safe edits.** Files with raw high bytes are ISO-8859-1 (French
|
- **Byte-safe edits.** A few tracked files carry raw ISO-8859-1 high bytes
|
||||||
comments). Edit them byte-wise (`perl -0pi`, `sed`), not through a tool that
|
(French comments): `src/htsconcat.c`, `lang/*.txt`, `html/contact.html`, and
|
||||||
re-encodes to UTF-8 and corrupts them.
|
the `fuzz/corpus/*` vectors. Edit those byte-wise (`perl -0pi`, `sed`), not
|
||||||
|
through a tool that re-encodes to UTF-8 and corrupts them. The rest of the tree
|
||||||
|
is UTF-8 and safe to edit normally.
|
||||||
|
|
||||||
## Security (HTTrack parses hostile input off the network)
|
## Security (HTTrack parses hostile input off the network)
|
||||||
- Bounds-check every copy. Overflow-safe form: put the untrusted value alone,
|
- Bounds-check every copy. Overflow-safe form: put the untrusted value alone,
|
||||||
`untrusted < limit - controlled` — never `controlled + untrusted < limit`,
|
`untrusted < limit - controlled` — never `controlled + untrusted < limit`,
|
||||||
which can wrap and pass.
|
which can wrap and pass.
|
||||||
|
|
||||||
|
## C conventions
|
||||||
|
- **Use the `*t` allocator wrappers, never raw libc** (`htssafe.h`):
|
||||||
|
`malloct`/`calloct`/`realloct`/`freet`/`strdupt`, in test and selftest code
|
||||||
|
too. `freet` NULLs its (lvalue) argument and tolerates NULL; `calloct(n, sz)`
|
||||||
|
keeps calloc's arg order. Only exception: storing or calling a libc symbol
|
||||||
|
itself (e.g. a resolver-backend function pointer).
|
||||||
|
- **Exported API is `HTSEXT_API`.** Everything else is hidden by
|
||||||
|
`-fvisibility=hidden` and free to change (check with `nm -D --defined-only
|
||||||
|
libhttrack.so`). Touching an installed-header struct (see `DevIncludes_DATA` in
|
||||||
|
`src/Makefile.am`) or an exported signature is an ABI break — flag and discuss,
|
||||||
|
bump the soname, and prefer keeping the old entry point beside a new one.
|
||||||
|
- **Windows ABI is free to break, POSIX is not.** The Windows DLL ships next to
|
||||||
|
the exe with no soname contract, so a `_WIN32`-only ABI change needs no
|
||||||
|
deprecation dance; POSIX/ELF keeps the flag-discuss-bump rules.
|
||||||
|
|
||||||
## Code & prose
|
## Code & prose
|
||||||
- Be terse. Comment the why, in English; translate French comments you touch.
|
- Be terse. Comment the why, in English; translate French comments you touch.
|
||||||
- Strip AI tells from prose (em-dash overuse, rule-of-three, filler, vague
|
- Strip AI tells from prose (em-dash overuse, rule-of-three, filler, vague
|
||||||
@@ -67,8 +91,9 @@ Before pushing, and when reviewing others, don't skim for bugs:
|
|||||||
- **Co-Authored-By is mandatory for AI-assisted commits.** Carry a
|
- **Co-Authored-By is mandatory for AI-assisted commits.** Carry a
|
||||||
`Co-Authored-By:` trailer naming the assistant. Attribute there, never in a
|
`Co-Authored-By:` trailer naming the assistant. Attribute there, never in a
|
||||||
PR-body footer.
|
PR-body footer.
|
||||||
- PRs land as a merge commit; every commit on the branch goes onto master, so
|
- PRs are squash-merged: one commit per PR lands on master, built from the PR
|
||||||
keep each commit message clean and meaningful.
|
title and description, so those are what the history keeps. The branch's
|
||||||
|
intermediate commits are not preserved.
|
||||||
|
|
||||||
## PR descriptions
|
## PR descriptions
|
||||||
- Plain concise prose; lead with what changed and why. No What/Why/How template.
|
- Plain concise prose; lead with what changed and why. No What/Why/How template.
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
/home/roche/git/httrack-works/CLAUDE.httrack.local.md
|
|
||||||
@@ -6,8 +6,8 @@ with an AI assistant? The operational checklist is [AGENTS.md](AGENTS.md).
|
|||||||
## Pull requests
|
## Pull requests
|
||||||
|
|
||||||
- One change per PR. Small diffs merge fast.
|
- One change per PR. Small diffs merge fast.
|
||||||
- PRs land as a merge commit, so the branch's commits go onto master as-is: keep
|
- PRs are squash-merged: one commit per PR goes onto master, built from the PR
|
||||||
each commit message clean and explain *why*.
|
title and description, so those are the history. Explain *why* there.
|
||||||
- Be terse in the PR title and description: name the problem, not the fix, don't
|
- Be terse in the PR title and description: name the problem, not the fix, don't
|
||||||
restate the diff, and calibrate length to the change.
|
restate the diff, and calibrate length to the change.
|
||||||
- Add or update tests for engine changes (`tests/`), and keep CI green.
|
- Add or update tests for engine changes (`tests/`), and keep CI green.
|
||||||
|
|||||||
12
configure.ac
12
configure.ac
@@ -1,6 +1,6 @@
|
|||||||
AC_PREREQ([2.71])
|
AC_PREREQ([2.71])
|
||||||
|
|
||||||
AC_INIT([httrack], [3.49.12], [roche+packaging@httrack.com], [httrack], [http://www.httrack.com/])
|
AC_INIT([httrack], [3.49.13], [roche+packaging@httrack.com], [httrack], [http://www.httrack.com/])
|
||||||
AC_COPYRIGHT([
|
AC_COPYRIGHT([
|
||||||
HTTrack Website Copier, Offline Browser for Windows and Unix
|
HTTrack Website Copier, Offline Browser for Windows and Unix
|
||||||
Copyright (C) 1998-2015 Xavier Roche and other contributors
|
Copyright (C) 1998-2015 Xavier Roche and other contributors
|
||||||
@@ -29,11 +29,13 @@ AC_CONFIG_SRCDIR(src/httrack.c)
|
|||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
AC_CONFIG_HEADERS(config.h)
|
AC_CONFIG_HEADERS(config.h)
|
||||||
AM_INIT_AUTOMAKE([subdir-objects])
|
AM_INIT_AUTOMAKE([subdir-objects])
|
||||||
# 3:4:0: 3.49.12 tail-appends one field (why_url) to httrackp and otherwise only
|
# 3:5:0: 3.49.13 leaves every installed struct layout and the exported symbol set
|
||||||
# deletes dead comments; no struct layout or exported signature broke vs 3.49.11,
|
# untouched vs 3.49.12; the 2 GB (_stat64) and UTF-8 export widenings are _WIN32-only,
|
||||||
# so it stays soname .so.3; bump revision.
|
# and INTsys widened on POSIX (#600) but sits in no installed struct. Stays soname
|
||||||
|
# .so.3; bump revision. x32 alone changes layout (LLint was 4 bytes there, #524), and
|
||||||
|
# is not a release architecture.
|
||||||
# (3:0:0 was the htsblk mime-buffer widening, the ABI break that moved .so.2 -> .so.3.)
|
# (3:0:0 was the htsblk mime-buffer widening, the ABI break that moved .so.2 -> .so.3.)
|
||||||
VERSION_INFO="3:4:0"
|
VERSION_INFO="3:5:0"
|
||||||
AM_MAINTAINER_MODE
|
AM_MAINTAINER_MODE
|
||||||
AC_USE_SYSTEM_EXTENSIONS
|
AC_USE_SYSTEM_EXTENSIONS
|
||||||
|
|
||||||
|
|||||||
15
debian/changelog
vendored
15
debian/changelog
vendored
@@ -1,3 +1,18 @@
|
|||||||
|
httrack (3.49.13-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* New upstream release: SOCKS5 and CONNECT proxy support, brotli and zstd
|
||||||
|
content decoding, --update data-loss fixes, and hardening of several
|
||||||
|
network-facing parsers; full list in history.txt.
|
||||||
|
* Add libbrotli-dev and libzstd-dev to Build-Depends for the new content
|
||||||
|
codings.
|
||||||
|
* libhttrack3 and libhttrack-dev no longer ship libhtsjava.so.3*: the
|
||||||
|
obsolete Java-applet parser was removed upstream. It was a dlopen plugin
|
||||||
|
with no reverse dependencies, so this is a plain file drop on upgrade;
|
||||||
|
libhttrack.so.3 itself is unchanged and needs no rename.
|
||||||
|
* Drop the htsjava attribution from debian/copyright.
|
||||||
|
|
||||||
|
-- Xavier Roche <xavier@debian.org> Fri, 17 Jul 2026 10:49:52 +0200
|
||||||
|
|
||||||
httrack (3.49.12-1) unstable; urgency=medium
|
httrack (3.49.12-1) unstable; urgency=medium
|
||||||
|
|
||||||
* New upstream release: security and crawl-correctness fixes (remote stack
|
* New upstream release: security and crawl-correctness fixes (remote stack
|
||||||
|
|||||||
25
history.txt
25
history.txt
@@ -4,6 +4,31 @@ HTTrack Website Copier release history:
|
|||||||
|
|
||||||
This file lists all changes and fixes that have been made for HTTrack
|
This file lists all changes and fixes that have been made for HTTrack
|
||||||
|
|
||||||
|
3.49-13
|
||||||
|
+ New: SOCKS5 proxy support, with scheme-aware -P URLs (socks5://, socks5h://, connect://) and plain HTTP tunneled through a CONNECT-only proxy (#563, #564)
|
||||||
|
+ New: decode brotli and zstd content codings, advertised over TLS only as browsers do (#556)
|
||||||
|
+ New: webhttrack exposes the engine options added since 3.49-2, among them --cookies-file, --pause and --strip-query (#587)
|
||||||
|
+ Fixed: files of 2 GB or more were mishandled on Windows and on every 32-bit build (#569)
|
||||||
|
+ Fixed: --update destroyed a good local copy when the re-fetch returned an HTTP error, was aborted by -M/-E, failed to decode, or came in short (#176, #521, #557, #562)
|
||||||
|
+ Fixed: a self-redirect cookie wall was dropped instead of being re-fetched with the cookie (#15)
|
||||||
|
+ Fixed: a stalled TLS handshake ignored --timeout, and synchronous DNS resolution could wedge a crawl past --max-time (#607, #613)
|
||||||
|
+ Fixed: -M metered saved bytes rather than received volume, and overshot its cap under a slow server (#77, #520)
|
||||||
|
+ Fixed: several network-facing overflows and denial-of-service paths in the Content-Range, chunked-transfer, cookie, filter and ProxyTrack cache parsers
|
||||||
|
+ Fixed: a failed connect did not fall back to the next address on Windows (#579)
|
||||||
|
+ Fixed: -P took an out-of-range port as a garbage port, and scanned past an IPv6 literal's closing bracket (#598, #602)
|
||||||
|
+ Fixed: reject a port outside 1..65535 wherever one is parsed (a crawled URL, the htsserver and proxytrack listen arguments, an ftp:// URL), instead of letting a bare sscanf wrap a huge value into a plausible port and silently use it (#614, #626)
|
||||||
|
+ Fixed: a configured proxy still resolved and dialed the origin itself (#592)
|
||||||
|
+ Fixed: ~/ in the -O base path was never expanded (#270)
|
||||||
|
+ Fixed: a non-ASCII -O output path was double-encoded on Windows once argv became UTF-8 (#621)
|
||||||
|
+ Fixed: files under a non-ASCII project path were saved to a mangled directory on Windows (#217)
|
||||||
|
+ Fixed: --build-top-index (-%i) and --protocol (-@i) were taken for the -i continue flag, wiping the URL list and exiting on the usage screen (#615)
|
||||||
|
+ Fixed: webhttrack ignored LC_ALL/LC_MESSAGES and picked the wrong Chinese and Portuguese (#95)
|
||||||
|
+ Fixed: webhttrack wrote its base path and httrack.ini to the filesystem root when $HOME was empty (#625)
|
||||||
|
+ Fixed: crawls on a non-default port were slowed by a per-request pre-resolve (#181)
|
||||||
|
+ Changed: Windows builds moved to Visual Studio 2022 and OpenSSL 3.x, the VS2008 project files are retired, and the binaries carry a version resource
|
||||||
|
+ Changed: removed the obsolete Java-applet (.class) parser and the dead SWF module remnants
|
||||||
|
+ Changed: multiple internal hardening, test and CI improvements (Windows and macOS crawl suites, HTML-parser fuzzing, parallel make check)
|
||||||
|
|
||||||
3.49-12
|
3.49-12
|
||||||
+ New: --why explains which filter rule accepts or rejects a given URL, then exits (#505)
|
+ New: --why explains which filter rule accepts or rejects a given URL, then exits (#505)
|
||||||
+ Fixed: links carrying raw UTF-8 bytes were fetched double-encoded and 404'd (#516)
|
+ Fixed: links carrying raw UTF-8 bytes were fetched double-encoded and 404'd (#516)
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ ${LANG_K3} : ${HTTRACK_WEB}
|
|||||||
|
|
||||||
<form>
|
<form>
|
||||||
<input type="button" value="OK" onClick="window.close();"
|
<input type="button" value="OK" onClick="window.close();"
|
||||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ function info(str) {
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/server/file.html" target="_blank"
|
<a href="/server/file.html" target="_blank"
|
||||||
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O1}
|
${LANG_O1}
|
||||||
@@ -85,7 +85,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/index.html" target="_blank"
|
<a href="/index.html" target="_blank"
|
||||||
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O5}
|
${LANG_O5}
|
||||||
@@ -118,20 +118,20 @@ ${do:end-if}
|
|||||||
<form action="${thisfile}" name="form">
|
<form action="${thisfile}" name="form">
|
||||||
<table width="100%">
|
<table width="100%">
|
||||||
<tr><td>${LANG_T2}</td><td>http://<input name="urladr"
|
<tr><td>${LANG_T2}</td><td>http://<input name="urladr"
|
||||||
onMouseOver="info('${html:LANG_T10}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_T10}' onMouseOver="info('${html:LANG_T10}'); return true" onMouseOut="info(' '); return true"
|
||||||
></td></tr>
|
></td></tr>
|
||||||
<tr><td colspan=2>
|
<tr><td colspan=2>
|
||||||
|
|
||||||
<table width="100%">
|
<table width="100%">
|
||||||
<th>${LANG_T4}</th>
|
<th>${LANG_T4}</th>
|
||||||
<tr><td>${LANG_T5}:</td><td><input name="urllogin"
|
<tr><td>${LANG_T5}:</td><td><input name="urllogin"
|
||||||
onMouseOver="info('${html:LANG_T12}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_T12}' onMouseOver="info('${html:LANG_T12}'); return true" onMouseOut="info(' '); return true"
|
||||||
></td></tr>
|
></td></tr>
|
||||||
<tr><td>${LANG_T6}:</td><td><input name="urlpass"
|
<tr><td>${LANG_T6}:</td><td><input name="urlpass"
|
||||||
onMouseOver="info('${html:LANG_T13}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_T13}' onMouseOver="info('${html:LANG_T13}'); return true" onMouseOut="info(' '); return true"
|
||||||
></td></tr>
|
></td></tr>
|
||||||
<tr><td>${LANG_T7}:</td><td><input type="button" value="${LANG_T8}" onClick="alert('not yet implemented!')"
|
<tr><td>${LANG_T7}:</td><td><input type="button" value="${LANG_T8}" onClick="alert('not yet implemented!')"
|
||||||
onMouseOver="info('${html:LANG_T14}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_T14}' onMouseOver="info('${html:LANG_T14}'); return true" onMouseOut="info(' '); return true"
|
||||||
></td></tr>
|
></td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ ${do:end-if}
|
|||||||
|
|
||||||
<tr><td>
|
<tr><td>
|
||||||
<input type="button" value="OK" onClick="if (do_add()) { window.close(); }"
|
<input type="button" value="OK" onClick="if (do_add()) { window.close(); }"
|
||||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ function info(str) {
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/server/file.html" target="_blank"
|
<a href="/server/file.html" target="_blank"
|
||||||
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O1}
|
${LANG_O1}
|
||||||
@@ -48,7 +48,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/index.html" target="_blank"
|
<a href="/index.html" target="_blank"
|
||||||
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O5}
|
${LANG_O5}
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ function info(str) {
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr><td class="tabCtrl" align="left">
|
<tr><td class="tabCtrl" align="left">
|
||||||
<a style="background:black;color: white" href="about.html" target="_new"
|
<a style="background:black;color: white" href="about.html" target="_new"
|
||||||
onMouseOver="info('${html:LANG_G21}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_G21}' onMouseOver="info('${html:LANG_G21}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${LANG_O16}...
|
${LANG_O16}...
|
||||||
</a>
|
</a>
|
||||||
@@ -67,7 +67,7 @@ ${LANG_O16}...
|
|||||||
<tr><td class="tabCtrl" align="left">
|
<tr><td class="tabCtrl" align="left">
|
||||||
<a style="background:black;color: white"
|
<a style="background:black;color: white"
|
||||||
href="http://www.httrack.com/update.php3?Product=HTTrack&Version=${HTTRACK_VERSIONID}&VersionStr=${HTTRACK_VERSION}&Platform=${HTS_PLATFORM}&LanguageId=${lang}" target="_new"
|
href="http://www.httrack.com/update.php3?Product=HTTrack&Version=${HTTRACK_VERSIONID}&VersionStr=${HTTRACK_VERSION}&Platform=${HTS_PLATFORM}&LanguageId=${lang}" target="_new"
|
||||||
onMouseOver="info('${html:LANG_O17}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_O17}' onMouseOver="info('${html:LANG_O17}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${LANG_O17}...
|
${LANG_O17}...
|
||||||
</a>
|
</a>
|
||||||
@@ -78,7 +78,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<tr><td class="tabCtrl" align="left">
|
<tr><td class="tabCtrl" align="left">
|
||||||
<a style="background:black;color: white"
|
<a style="background:black;color: white"
|
||||||
href="/index.html" target="_new"
|
href="/index.html" target="_new"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${LANG_P16}
|
${LANG_P16}
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ function info(str) {
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/server/file.html" target="_blank"
|
<a href="/server/file.html" target="_blank"
|
||||||
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O1}
|
${LANG_O1}
|
||||||
@@ -55,7 +55,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/index.html" target="_blank"
|
<a href="/index.html" target="_blank"
|
||||||
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O5}
|
${LANG_O5}
|
||||||
@@ -113,7 +113,7 @@ ${LANG_THANKYOU}!
|
|||||||
|
|
||||||
<tr><td align="right">
|
<tr><td align="right">
|
||||||
<input name="nextBtn" type="submit" value=" ${LANG_NEXT} >> "
|
<input name="nextBtn" type="submit" value=" ${LANG_NEXT} >> "
|
||||||
onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPNEXT}' onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt1.html" target="_blank"
|
<a href="/step9_opt1.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt1.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt1.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -107,16 +107,16 @@ ${do:end-if}
|
|||||||
<!-- checkboxes -->
|
<!-- checkboxes -->
|
||||||
<table border="0" width="100%" cellspacing="0">
|
<table border="0" width="100%" cellspacing="0">
|
||||||
<tr><td><input type="checkbox" name="parseall" ${checked:parseall}
|
<tr><td><input type="checkbox" name="parseall" ${checked:parseall}
|
||||||
onMouseOver="info('${html:LANG_I1}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I1}' onMouseOver="info('${html:LANG_I1}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I31}</td></tr>
|
> ${LANG_I31}</td></tr>
|
||||||
<tr><td><input type="checkbox" name="link" ${checked:link}
|
<tr><td><input type="checkbox" name="link" ${checked:link}
|
||||||
onMouseOver="info('${html:LANG_I2}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I2}' onMouseOver="info('${html:LANG_I2}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I32}</td></tr>
|
> ${LANG_I32}</td></tr>
|
||||||
<tr><td><input type="checkbox" name="testall" ${checked:testall}
|
<tr><td><input type="checkbox" name="testall" ${checked:testall}
|
||||||
onMouseOver="info('${html:LANG_I2b}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I2b}' onMouseOver="info('${html:LANG_I2b}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I32b}</td></tr>
|
> ${LANG_I32b}</td></tr>
|
||||||
<tr><td><input type="checkbox" name="htmlfirst" ${checked:htmlfirst}
|
<tr><td><input type="checkbox" name="htmlfirst" ${checked:htmlfirst}
|
||||||
onMouseOver="info('${html:LANG_I2c}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I2c}' onMouseOver="info('${html:LANG_I2c}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I32c}</td></tr>
|
> ${LANG_I32c}</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
@@ -125,12 +125,12 @@ ${do:end-if}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt7.html" target="_blank"
|
<a href="/step9_opt7.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt7.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt7.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -100,24 +100,25 @@ ${do:end-if}
|
|||||||
|
|
||||||
${LANG_PROXYTYPE}
|
${LANG_PROXYTYPE}
|
||||||
<select name="proxytype"
|
<select name="proxytype"
|
||||||
onMouseOver="info('${html:LANG_PROXYTYPETIP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_PROXYTYPETIP}' onMouseOver="info('${html:LANG_PROXYTYPETIP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
<option value=""${ztest:proxytype: selected:}>HTTP</option>
|
<option value=""${ztest:proxytype: selected:}>HTTP</option>
|
||||||
|
<option value="2"${test:proxytype::: selected}>HTTP (CONNECT tunnel)</option>
|
||||||
<option value="1"${test:proxytype:: selected}>SOCKS5</option>
|
<option value="1"${test:proxytype:: selected}>SOCKS5</option>
|
||||||
</select>
|
</select>
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
${LANG_IOPT10}:
|
${LANG_IOPT10}:
|
||||||
<input name="prox" value="${prox}" size="32"
|
<input name="prox" value="${prox}" size="32"
|
||||||
onMouseOver="info('${html:LANG_G14}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_G14}' onMouseOver="info('${html:LANG_G14}'); return true" onMouseOut="info(' '); return true"
|
||||||
>:
|
>:
|
||||||
<input name="portprox" value="${portprox}" size="4"
|
<input name="portprox" value="${portprox}" size="4"
|
||||||
onMouseOver="info('${html:LANG_G15}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_G15}' onMouseOver="info('${html:LANG_G15}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<input type="checkbox" name="ftpprox" ${checked:ftpprox}
|
<input type="checkbox" name="ftpprox" ${checked:ftpprox}
|
||||||
onMouseOver="info('${html:LANG_G15c}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_G15c}' onMouseOver="info('${html:LANG_G15c}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I47c}
|
> ${LANG_I47c}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
@@ -126,12 +127,12 @@ ${LANG_IOPT10}:
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt9.html" target="_blank"
|
<a href="/step9_opt9.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt9.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt9.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -112,97 +112,97 @@ ${LANG_W3}
|
|||||||
|
|
||||||
<td align="left">
|
<td align="left">
|
||||||
<input name="ext1" value="${ext1}"
|
<input name="ext1" value="${ext1}"
|
||||||
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
⇔
|
⇔
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
<input name="mime1" value="${mime1}"
|
<input name="mime1" value="${mime1}"
|
||||||
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<td align="left">
|
<td align="left">
|
||||||
<input name="ext2" value="${ext2}"
|
<input name="ext2" value="${ext2}"
|
||||||
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
⇔
|
⇔
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
<input name="mime2" value="${mime2}"
|
<input name="mime2" value="${mime2}"
|
||||||
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<td align="left">
|
<td align="left">
|
||||||
<input name="ext3" value="${ext3}"
|
<input name="ext3" value="${ext3}"
|
||||||
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
⇔
|
⇔
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
<input name="mime3" value="${mime3}"
|
<input name="mime3" value="${mime3}"
|
||||||
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<td align="left">
|
<td align="left">
|
||||||
<input name="ext4" value="${ext4}"
|
<input name="ext4" value="${ext4}"
|
||||||
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
⇔
|
⇔
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
<input name="mime4" value="${mime4}"
|
<input name="mime4" value="${mime4}"
|
||||||
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<td align="left">
|
<td align="left">
|
||||||
<input name="ext5" value="${ext5}"
|
<input name="ext5" value="${ext5}"
|
||||||
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
⇔
|
⇔
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
<input name="mime5" value="${mime5}"
|
<input name="mime5" value="${mime5}"
|
||||||
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<td align="left">
|
<td align="left">
|
||||||
<input name="ext6" value="${ext6}"
|
<input name="ext6" value="${ext6}"
|
||||||
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
⇔
|
⇔
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
<input name="mime6" value="${mime6}"
|
<input name="mime6" value="${mime6}"
|
||||||
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<td align="left">
|
<td align="left">
|
||||||
<input name="ext7" value="${ext7}"
|
<input name="ext7" value="${ext7}"
|
||||||
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
⇔
|
⇔
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
<input name="mime7" value="${mime7}"
|
<input name="mime7" value="${mime7}"
|
||||||
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<td align="left">
|
<td align="left">
|
||||||
<input name="ext8" value="${ext8}"
|
<input name="ext8" value="${ext8}"
|
||||||
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
⇔
|
⇔
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
<input name="mime8" value="${mime8}"
|
<input name="mime8" value="${mime8}"
|
||||||
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
@@ -217,12 +217,12 @@ ${LANG_W3}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt5.html" target="_blank"
|
<a href="/step9_opt5.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt5.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt5.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -101,20 +101,20 @@ ${do:end-if}
|
|||||||
${LANG_I33}
|
${LANG_I33}
|
||||||
<br>
|
<br>
|
||||||
<select name="build"
|
<select name="build"
|
||||||
onMouseOver="info('${html:LANG_I3}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I3}' onMouseOver="info('${html:LANG_I3}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${listid:build:LISTDEF_3}
|
${listid:build:LISTDEF_3}
|
||||||
</select>
|
</select>
|
||||||
<input type="button" value="${LANG_O2}"
|
<input type="button" value="${LANG_O2}"
|
||||||
onClick="form.build.selectedIndex=14; window.open('option2b.html', 'option2b', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480').wparent=document; form.submit();"
|
onClick="form.build.selectedIndex=14; window.open('option2b.html', 'option2b', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480').wparent=document; form.submit();"
|
||||||
onMouseOver="info('${html:LANG_I4}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I4}' onMouseOver="info('${html:LANG_I4}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
|
|
||||||
<!-- checkboxes -->
|
<!-- checkboxes -->
|
||||||
<table border="0" width="100%" cellspacing="0">
|
<table border="0" width="100%" cellspacing="0">
|
||||||
<tr><td>
|
<tr><td>
|
||||||
<select name="dos"
|
<select name="dos"
|
||||||
onMouseOver="info('${html:LANG_I8}\r\n${LANG_I8b}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I8} ${html:LANG_I8b}' onMouseOver="info('${html:LANG_I8}\r\n${LANG_I8b}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
<option value="0"${ztest:dos: selected::}> </option>
|
<option value="0"${ztest:dos: selected::}> </option>
|
||||||
<option value="1"${ztest:dos:: selected:}>${LANG_I37}</option>
|
<option value="1"${ztest:dos:: selected:}>${LANG_I37}</option>
|
||||||
@@ -122,19 +122,19 @@ ${listid:build:LISTDEF_3}
|
|||||||
</select>
|
</select>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<tr><td><input type="checkbox" name="errpage" ${checked:errpage}
|
<tr><td><input type="checkbox" name="errpage" ${checked:errpage}
|
||||||
onMouseOver="info('${html:LANG_I9}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I9}' onMouseOver="info('${html:LANG_I9}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I38}</td></tr>
|
> ${LANG_I38}</td></tr>
|
||||||
<tr><td><input type="checkbox" name="external" ${checked:external}
|
<tr><td><input type="checkbox" name="external" ${checked:external}
|
||||||
onMouseOver="info('${html:LANG_I29}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I29}' onMouseOver="info('${html:LANG_I29}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I56}</td></tr>
|
> ${LANG_I56}</td></tr>
|
||||||
<tr><td><input type="checkbox" name="hidepwd" ${checked:hidepwd}
|
<tr><td><input type="checkbox" name="hidepwd" ${checked:hidepwd}
|
||||||
onMouseOver="info('${html:LANG_I30}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I30}' onMouseOver="info('${html:LANG_I30}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I66}</td></tr>
|
> ${LANG_I66}</td></tr>
|
||||||
<tr><td><input type="checkbox" name="hidequery" ${checked:hidequery}
|
<tr><td><input type="checkbox" name="hidequery" ${checked:hidequery}
|
||||||
onMouseOver="info('${html:LANG_I30b}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I30b}' onMouseOver="info('${html:LANG_I30b}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I67}</td></tr>
|
> ${LANG_I67}</td></tr>
|
||||||
<tr><td><input type="checkbox" name="nopurge" ${checked:nopurge}
|
<tr><td><input type="checkbox" name="nopurge" ${checked:nopurge}
|
||||||
onMouseOver="info('${html:LANG_I1a}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I1a}' onMouseOver="info('${html:LANG_I1a}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I57}</td></tr>
|
> ${LANG_I57}</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
@@ -143,12 +143,12 @@ ${listid:build:LISTDEF_3}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt5.html" target="_blank"
|
<a href="/step9_opt5.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt5.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt5.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -107,12 +107,12 @@ ${LANG_Q3}
|
|||||||
${do:output-mode:html-urlescaped}
|
${do:output-mode:html-urlescaped}
|
||||||
onClick="if (confirm(str_replace(str_replace('${LANG_DIAL7}', '%20', ' '), '%0a', ' '))) { form.closeme.value=1; form.submit(); } return false;"
|
onClick="if (confirm(str_replace(str_replace('${LANG_DIAL7}', '%20', ' '), '%0a', ' '))) { form.closeme.value=1; form.submit(); } return false;"
|
||||||
${do:output-mode:}
|
${do:output-mode:}
|
||||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt10.html" target="_blank"
|
<a href="/step9_opt10.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt10.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt10.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -104,7 +104,7 @@ ${LANG_I40c}
|
|||||||
<!-- checkboxes -->
|
<!-- checkboxes -->
|
||||||
<table border="0" width="100%" cellspacing="0">
|
<table border="0" width="100%" cellspacing="0">
|
||||||
<tr><td><input type="checkbox" name="cache" ${checked:cache}
|
<tr><td><input type="checkbox" name="cache" ${checked:cache}
|
||||||
onMouseOver="info('${html:LANG_I5}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I5}' onMouseOver="info('${html:LANG_I5}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I34}</td></tr>
|
> ${LANG_I34}</td></tr>
|
||||||
</table>
|
</table>
|
||||||
<br>
|
<br>
|
||||||
@@ -112,7 +112,7 @@ ${LANG_I40c}
|
|||||||
${LANG_I39}
|
${LANG_I39}
|
||||||
<br>
|
<br>
|
||||||
<select name="filter"
|
<select name="filter"
|
||||||
onMouseOver="info('${html:LANG_I29}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I29}' onMouseOver="info('${html:LANG_I29}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${listid:filter:LISTDEF_4}
|
${listid:filter:LISTDEF_4}
|
||||||
</select>
|
</select>
|
||||||
@@ -121,7 +121,7 @@ ${listid:filter:LISTDEF_4}
|
|||||||
${LANG_I40}
|
${LANG_I40}
|
||||||
<br>
|
<br>
|
||||||
<select name="travel"
|
<select name="travel"
|
||||||
onMouseOver="info('${html:LANG_I11}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I11}' onMouseOver="info('${html:LANG_I11}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${listid:travel:LISTDEF_5}
|
${listid:travel:LISTDEF_5}
|
||||||
</select>
|
</select>
|
||||||
@@ -130,7 +130,7 @@ ${listid:travel:LISTDEF_5}
|
|||||||
${LANG_I40b}
|
${LANG_I40b}
|
||||||
<br>
|
<br>
|
||||||
<select name="travel2"
|
<select name="travel2"
|
||||||
onMouseOver="info('${html:LANG_I11b}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I11b}' onMouseOver="info('${html:LANG_I11b}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${listid:travel2:LISTDEF_6}
|
${listid:travel2:LISTDEF_6}
|
||||||
</select>
|
</select>
|
||||||
@@ -139,7 +139,7 @@ ${listid:travel2:LISTDEF_6}
|
|||||||
${LANG_I40e}
|
${LANG_I40e}
|
||||||
<br>
|
<br>
|
||||||
<select name="travel3"
|
<select name="travel3"
|
||||||
onMouseOver="info('${html:LANG_I11c}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I11c}' onMouseOver="info('${html:LANG_I11c}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${listid:travel3:LISTDEF_11}
|
${listid:travel3:LISTDEF_11}
|
||||||
</select>
|
</select>
|
||||||
@@ -148,7 +148,7 @@ ${listid:travel3:LISTDEF_11}
|
|||||||
<!-- checkboxes -->
|
<!-- checkboxes -->
|
||||||
<table border="0" width="100%" cellspacing="0">
|
<table border="0" width="100%" cellspacing="0">
|
||||||
<tr><td><input type="checkbox" name="windebug" ${checked:windebug}
|
<tr><td><input type="checkbox" name="windebug" ${checked:windebug}
|
||||||
onMouseOver="info('${html:LANG_I1h}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I1h}' onMouseOver="info('${html:LANG_I1h}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I40d}</td></tr>
|
> ${LANG_I40d}</td></tr>
|
||||||
</table>
|
</table>
|
||||||
<br>
|
<br>
|
||||||
@@ -158,12 +158,12 @@ ${listid:travel3:LISTDEF_11}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt3.html" target="_blank"
|
<a href="/step9_opt3.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt3.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt3.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -104,11 +104,11 @@ ${do:end-if}
|
|||||||
${LANG_I44}
|
${LANG_I44}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="connexion" value="${connexion}" size="4"
|
<input name="connexion" value="${connexion}" size="4"
|
||||||
onMouseOver="info('${html:LANG_I12}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I12}' onMouseOver="info('${html:LANG_I12}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr><tr><td></td><td>
|
</td></tr><tr><td></td><td>
|
||||||
<input type="checkbox" name="ka" ${checked:ka}
|
<input type="checkbox" name="ka" ${checked:ka}
|
||||||
onMouseOver="info('${html:LANG_I47f}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I47f}' onMouseOver="info('${html:LANG_I47f}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I47e}
|
> ${LANG_I47e}
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -116,11 +116,11 @@ ${LANG_I44}
|
|||||||
${LANG_I47d}
|
${LANG_I47d}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="timeout" value="${timeout}" size="4"
|
<input name="timeout" value="${timeout}" size="4"
|
||||||
onMouseOver="info('${html:LANG_I13}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I13}' onMouseOver="info('${html:LANG_I13}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr><tr><td></td><td>
|
</td></tr><tr><td></td><td>
|
||||||
<input type="checkbox" name="remt" ${checked:remt}
|
<input type="checkbox" name="remt" ${checked:remt}
|
||||||
onMouseOver="info('${html:LANG_I14}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I14}' onMouseOver="info('${html:LANG_I14}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I45}
|
> ${LANG_I45}
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -128,7 +128,7 @@ ${LANG_I47d}
|
|||||||
${LANG_I48}
|
${LANG_I48}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="retry" value="${retry}" size="4"
|
<input name="retry" value="${retry}" size="4"
|
||||||
onMouseOver="info('${html:LANG_I17}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I17}' onMouseOver="info('${html:LANG_I17}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -136,11 +136,11 @@ ${LANG_I48}
|
|||||||
${LANG_I46}
|
${LANG_I46}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="rate" value="${rate}" size="4"
|
<input name="rate" value="${rate}" size="4"
|
||||||
onMouseOver="info('${html:LANG_I15}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I15}' onMouseOver="info('${html:LANG_I15}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr><tr><td></td><td>
|
</td></tr><tr><td></td><td>
|
||||||
<input type="checkbox" name="rems" ${checked:rems}
|
<input type="checkbox" name="rems" ${checked:rems}
|
||||||
onMouseOver="info('${html:LANG_I16}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I16}' onMouseOver="info('${html:LANG_I16}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I47}
|
> ${LANG_I47}
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -151,12 +151,12 @@ ${LANG_I46}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt2.html" target="_blank"
|
<a href="/step9_opt2.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt2.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt2.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -104,7 +104,7 @@ ${do:end-if}
|
|||||||
${LANG_G32}
|
${LANG_G32}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="depth" value="${depth}" size="4"
|
<input name="depth" value="${depth}" size="4"
|
||||||
onMouseOver="info('${html:LANG_I1g}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I1g}' onMouseOver="info('${html:LANG_I1g}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -112,7 +112,7 @@ ${LANG_G32}
|
|||||||
${LANG_G32b}
|
${LANG_G32b}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="depth2" value="${depth2}" size="4"
|
<input name="depth2" value="${depth2}" size="4"
|
||||||
onMouseOver="info('${html:LANG_I1g2}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I1g2}' onMouseOver="info('${html:LANG_I1g2}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -120,7 +120,7 @@ ${LANG_G32b}
|
|||||||
${LANG_I50}
|
${LANG_I50}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="maxhtml" value="${maxhtml}" size="4"
|
<input name="maxhtml" value="${maxhtml}" size="4"
|
||||||
onMouseOver="info('${html:LANG_I18}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I18}' onMouseOver="info('${html:LANG_I18}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -128,7 +128,7 @@ ${LANG_I50}
|
|||||||
${LANG_I50b}
|
${LANG_I50b}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="othermax" value="${othermax}" size="4"
|
<input name="othermax" value="${othermax}" size="4"
|
||||||
onMouseOver="info('${html:LANG_I19}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I19}' onMouseOver="info('${html:LANG_I19}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -136,7 +136,7 @@ ${LANG_I50b}
|
|||||||
${LANG_I51}
|
${LANG_I51}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="sizemax" value="${sizemax}" size="4"
|
<input name="sizemax" value="${sizemax}" size="4"
|
||||||
onMouseOver="info('${html:LANG_I20}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I20}' onMouseOver="info('${html:LANG_I20}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -144,7 +144,7 @@ ${LANG_I51}
|
|||||||
${LANG_I65}
|
${LANG_I65}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="pausebytes" value="${pausebytes}" size="4"
|
<input name="pausebytes" value="${pausebytes}" size="4"
|
||||||
onMouseOver="info('${html:LANG_I20b}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I20b}' onMouseOver="info('${html:LANG_I20b}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -152,7 +152,7 @@ ${LANG_I65}
|
|||||||
${LANG_PAUSEFILES}
|
${LANG_PAUSEFILES}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="pausefiles" value="${pausefiles}" size="8"
|
<input name="pausefiles" value="${pausefiles}" size="8"
|
||||||
onMouseOver="info('${html:LANG_PAUSEFILESTIP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_PAUSEFILESTIP}' onMouseOver="info('${html:LANG_PAUSEFILESTIP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -160,7 +160,7 @@ ${LANG_PAUSEFILES}
|
|||||||
${LANG_I52}
|
${LANG_I52}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="maxtime" value="${maxtime}" size="4"
|
<input name="maxtime" value="${maxtime}" size="4"
|
||||||
onMouseOver="info('${html:LANG_I21}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I21}' onMouseOver="info('${html:LANG_I21}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -168,7 +168,7 @@ ${LANG_I52}
|
|||||||
${LANG_I54}
|
${LANG_I54}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="maxrate" value="${maxrate}" size="4"
|
<input name="maxrate" value="${maxrate}" size="4"
|
||||||
onMouseOver="info('${html:LANG_I22}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I22}' onMouseOver="info('${html:LANG_I22}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -176,7 +176,7 @@ ${LANG_I54}
|
|||||||
${LANG_I64}
|
${LANG_I64}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="maxconn" value="${maxconn}" size="4"
|
<input name="maxconn" value="${maxconn}" size="4"
|
||||||
onMouseOver="info('${html:LANG_I22b}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I22b}' onMouseOver="info('${html:LANG_I22b}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -184,7 +184,7 @@ ${LANG_I64}
|
|||||||
${LANG_I64b}
|
${LANG_I64b}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="maxlinks" value="${maxlinks}" size="4"
|
<input name="maxlinks" value="${maxlinks}" size="4"
|
||||||
onMouseOver="info('${html:LANG_I22c}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I22c}' onMouseOver="info('${html:LANG_I22c}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -193,12 +193,12 @@ ${LANG_I64b}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt8.html" target="_blank"
|
<a href="/step9_opt8.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt8.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt8.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -104,7 +104,7 @@ ${do:end-if}
|
|||||||
${LANG_I43}
|
${LANG_I43}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="user" value="${user}" size="60"
|
<input name="user" value="${user}" size="60"
|
||||||
onMouseOver="info('${html:LANG_I23}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I23}' onMouseOver="info('${html:LANG_I23}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -112,7 +112,7 @@ ${LANG_I43}
|
|||||||
${LANG_I43b}
|
${LANG_I43b}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="footer" value="${footer}" size="60"
|
<input name="footer" value="${footer}" size="60"
|
||||||
onMouseOver="info('${html:LANG_I23b}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I23b}' onMouseOver="info('${html:LANG_I23b}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -123,12 +123,12 @@ ${LANG_I43b}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt4.html" target="_blank"
|
<a href="/step9_opt4.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt4.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt4.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -102,7 +102,7 @@ ${do:end-if}
|
|||||||
${LANG_B10}
|
${LANG_B10}
|
||||||
</tt>
|
</tt>
|
||||||
<textarea name="url2" cols="60" rows="8"
|
<textarea name="url2" cols="60" rows="8"
|
||||||
onMouseOver="info('${html:LANG_C3}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_C3}' onMouseOver="info('${html:LANG_C3}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${url2}</textarea>
|
>${url2}</textarea>
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
@@ -115,12 +115,12 @@ ${LANG_B13}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt6.html" target="_blank"
|
<a href="/step9_opt6.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt6.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt6.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -99,77 +99,77 @@ ${do:end-if}
|
|||||||
<input type="hidden" name="closeme" value="">
|
<input type="hidden" name="closeme" value="">
|
||||||
|
|
||||||
<input type="checkbox" name="cookies" ${checked:cookies}
|
<input type="checkbox" name="cookies" ${checked:cookies}
|
||||||
onMouseOver="info('${html:LANG_I1b}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I1b}' onMouseOver="info('${html:LANG_I1b}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I58}
|
> ${LANG_I58}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
${LANG_COOKIEFILE}
|
${LANG_COOKIEFILE}
|
||||||
<input name="cookiesfile" value="${cookiesfile}" size="40"
|
<input name="cookiesfile" value="${cookiesfile}" size="40"
|
||||||
onMouseOver="info('${html:LANG_COOKIEFILETIP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_COOKIEFILETIP}' onMouseOver="info('${html:LANG_COOKIEFILETIP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
${LANG_I59}
|
${LANG_I59}
|
||||||
<br>
|
<br>
|
||||||
<select name="checktype"
|
<select name="checktype"
|
||||||
onMouseOver="info('${html:LANG_I1c}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I1c}' onMouseOver="info('${html:LANG_I1c}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${listid:checktype:LISTDEF_7}
|
${listid:checktype:LISTDEF_7}
|
||||||
</select>
|
</select>
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="parsejava" ${checked:parsejava}
|
<input type="checkbox" name="parsejava" ${checked:parsejava}
|
||||||
onMouseOver="info('${html:LANG_I1d}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I1d}' onMouseOver="info('${html:LANG_I1d}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I60}
|
> ${LANG_I60}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
${LANG_I55}
|
${LANG_I55}
|
||||||
<br>
|
<br>
|
||||||
<select name="robots"
|
<select name="robots"
|
||||||
onMouseOver="info('${html:LANG_I28}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I28}' onMouseOver="info('${html:LANG_I28}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${listid:robots:LISTDEF_8}
|
${listid:robots:LISTDEF_8}
|
||||||
</select>
|
</select>
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="updhack" ${checked:updhack}
|
<input type="checkbox" name="updhack" ${checked:updhack}
|
||||||
onMouseOver="info('${html:LANG_I1k}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I1k}' onMouseOver="info('${html:LANG_I1k}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I62b}
|
> ${LANG_I62b}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="urlhack" ${checked:urlhack}
|
<input type="checkbox" name="urlhack" ${checked:urlhack}
|
||||||
onMouseOver="info('${html:LANG_I1k2}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I1k2}' onMouseOver="info('${html:LANG_I1k2}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I62b2}
|
> ${LANG_I62b2}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="keepwww" ${checked:keepwww}
|
<input type="checkbox" name="keepwww" ${checked:keepwww}
|
||||||
onMouseOver="info('${html:LANG_KEEPWWWTIP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_KEEPWWWTIP}' onMouseOver="info('${html:LANG_KEEPWWWTIP}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_KEEPWWW}
|
> ${LANG_KEEPWWW}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="keepslashes" ${checked:keepslashes}
|
<input type="checkbox" name="keepslashes" ${checked:keepslashes}
|
||||||
onMouseOver="info('${html:LANG_KEEPSLASHESTIP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_KEEPSLASHESTIP}' onMouseOver="info('${html:LANG_KEEPSLASHESTIP}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_KEEPSLASHES}
|
> ${LANG_KEEPSLASHES}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="keepqueryorder" ${checked:keepqueryorder}
|
<input type="checkbox" name="keepqueryorder" ${checked:keepqueryorder}
|
||||||
onMouseOver="info('${html:LANG_KEEPQUERYORDERTIP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_KEEPQUERYORDERTIP}' onMouseOver="info('${html:LANG_KEEPQUERYORDERTIP}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_KEEPQUERYORDER}
|
> ${LANG_KEEPQUERYORDER}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
${LANG_STRIPQUERY}
|
${LANG_STRIPQUERY}
|
||||||
<input name="stripquery" value="${stripquery}" size="40"
|
<input name="stripquery" value="${stripquery}" size="40"
|
||||||
onMouseOver="info('${html:LANG_STRIPQUERYTIP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_STRIPQUERYTIP}' onMouseOver="info('${html:LANG_STRIPQUERYTIP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="toler" ${checked:toler}
|
<input type="checkbox" name="toler" ${checked:toler}
|
||||||
onMouseOver="info('${html:LANG_I1i}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I1i}' onMouseOver="info('${html:LANG_I1i}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I62}
|
> ${LANG_I62}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="http10" ${checked:http10}
|
<input type="checkbox" name="http10" ${checked:http10}
|
||||||
onMouseOver="info('${html:LANG_I1j}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I1j}' onMouseOver="info('${html:LANG_I1j}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I63}
|
> ${LANG_I63}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
@@ -179,12 +179,12 @@ ${LANG_STRIPQUERY}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt9.html" target="_blank"
|
<a href="/step9_opt9.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt9.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt9.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -99,32 +99,32 @@ ${do:end-if}
|
|||||||
<input type="hidden" name="closeme" value="">
|
<input type="hidden" name="closeme" value="">
|
||||||
|
|
||||||
<input type="checkbox" name="cache2" ${checked:cache2}
|
<input type="checkbox" name="cache2" ${checked:cache2}
|
||||||
onMouseOver="info('${html:LANG_I1e}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I1e}' onMouseOver="info('${html:LANG_I1e}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I61}
|
> ${LANG_I61}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="norecatch" ${checked:norecatch}
|
<input type="checkbox" name="norecatch" ${checked:norecatch}
|
||||||
onMouseOver="info('${html:LANG_I5b}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I5b}' onMouseOver="info('${html:LANG_I5b}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I34b}
|
> ${LANG_I34b}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="logf" ${checked:logf}
|
<input type="checkbox" name="logf" ${checked:logf}
|
||||||
onMouseOver="info('${html:LANG_I7}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I7}' onMouseOver="info('${html:LANG_I7}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I36}
|
> ${LANG_I36}
|
||||||
<select name="logtype"
|
<select name="logtype"
|
||||||
onMouseOver="info('${html:LANG_I1f}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I1f}' onMouseOver="info('${html:LANG_I1f}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${listid:logtype:LISTDEF_9}
|
${listid:logtype:LISTDEF_9}
|
||||||
</select>
|
</select>
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="index" ${checked:index}
|
<input type="checkbox" name="index" ${checked:index}
|
||||||
onMouseOver="info('${html:LANG_I6}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I6}' onMouseOver="info('${html:LANG_I6}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I35}
|
> ${LANG_I35}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="index2" ${checked:index2}
|
<input type="checkbox" name="index2" ${checked:index2}
|
||||||
onMouseOver="info('${html:LANG_I6b}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_I6b}' onMouseOver="info('${html:LANG_I6b}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I35b}
|
> ${LANG_I35b}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
@@ -133,12 +133,12 @@ ${listid:logtype:LISTDEF_9}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ function no_refresh() {
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/server/file.html" target="_blank"
|
<a href="/server/file.html" target="_blank"
|
||||||
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O1}
|
${LANG_O1}
|
||||||
@@ -85,7 +85,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/index.html" target="_blank"
|
<a href="/index.html" target="_blank"
|
||||||
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O5}
|
${LANG_O5}
|
||||||
@@ -152,20 +152,20 @@ ${LANG_H20} ${info.currentjob}
|
|||||||
|
|
||||||
<table border="0" width="100%">
|
<table border="0" width="100%">
|
||||||
|
|
||||||
<tr><td>${info.state[0]}</td><td>${info.name[0]}</td><td>${info.file[0]}</td><td>${info.size[0]}/${info.sizetot[0]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[0]}'; form.submit()" onMouseOver="info('${html:LANG_H6}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[0]}</td><td>${info.name[0]}</td><td>${info.file[0]}</td><td>${info.size[0]}/${info.sizetot[0]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[0]}'; form.submit()" title='${html:LANG_H6}' onMouseOver="info('${html:LANG_H6}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[1]}</td><td>${info.name[1]}</td><td>${info.file[1]}</td><td>${info.size[1]}/${info.sizetot[1]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[1]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[1]}</td><td>${info.name[1]}</td><td>${info.file[1]}</td><td>${info.size[1]}/${info.sizetot[1]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[1]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[2]}</td><td>${info.name[2]}</td><td>${info.file[2]}</td><td>${info.size[2]}/${info.sizetot[2]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[2]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[2]}</td><td>${info.name[2]}</td><td>${info.file[2]}</td><td>${info.size[2]}/${info.sizetot[2]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[2]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[3]}</td><td>${info.name[3]}</td><td>${info.file[3]}</td><td>${info.size[3]}/${info.sizetot[3]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[3]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[3]}</td><td>${info.name[3]}</td><td>${info.file[3]}</td><td>${info.size[3]}/${info.sizetot[3]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[3]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[4]}</td><td>${info.name[4]}</td><td>${info.file[4]}</td><td>${info.size[4]}/${info.sizetot[4]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[4]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[4]}</td><td>${info.name[4]}</td><td>${info.file[4]}</td><td>${info.size[4]}/${info.sizetot[4]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[4]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[5]}</td><td>${info.name[5]}</td><td>${info.file[5]}</td><td>${info.size[5]}/${info.sizetot[5]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[5]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[5]}</td><td>${info.name[5]}</td><td>${info.file[5]}</td><td>${info.size[5]}/${info.sizetot[5]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[5]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[6]}</td><td>${info.name[6]}</td><td>${info.file[6]}</td><td>${info.size[6]}/${info.sizetot[6]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[6]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[6]}</td><td>${info.name[6]}</td><td>${info.file[6]}</td><td>${info.size[6]}/${info.sizetot[6]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[6]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[7]}</td><td>${info.name[7]}</td><td>${info.file[7]}</td><td>${info.size[7]}/${info.sizetot[7]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[7]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[7]}</td><td>${info.name[7]}</td><td>${info.file[7]}</td><td>${info.size[7]}/${info.sizetot[7]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[7]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[8]}</td><td>${info.name[8]}</td><td>${info.file[8]}</td><td>${info.size[8]}/${info.sizetot[8]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[8]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[8]}</td><td>${info.name[8]}</td><td>${info.file[8]}</td><td>${info.size[8]}/${info.sizetot[8]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[8]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[9]}</td><td>${info.name[9]}</td><td>${info.file[9]}</td><td>${info.size[9]}/${info.sizetot[9]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[9]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[9]}</td><td>${info.name[9]}</td><td>${info.file[9]}</td><td>${info.size[9]}/${info.sizetot[9]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[9]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[10]}</td><td>${info.name[10]}</td><td>${info.file[10]}</td><td>${info.size[10]}/${info.sizetot[10]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[10]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[10]}</td><td>${info.name[10]}</td><td>${info.file[10]}</td><td>${info.size[10]}/${info.sizetot[10]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[10]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[11]}</td><td>${info.name[11]}</td><td>${info.file[11]}</td><td>${info.size[11]}/${info.sizetot[11]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[11]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[11]}</td><td>${info.name[11]}</td><td>${info.file[11]}</td><td>${info.size[11]}/${info.sizetot[11]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[11]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[12]}</td><td>${info.name[12]}</td><td>${info.file[12]}</td><td>${info.size[12]}/${info.sizetot[12]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[12]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[12]}</td><td>${info.name[12]}</td><td>${info.file[12]}</td><td>${info.size[12]}/${info.sizetot[12]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[12]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[13]}</td><td>${info.name[13]}</td><td>${info.file[13]}</td><td>${info.size[13]}/${info.sizetot[13]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[13]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[13]}</td><td>${info.name[13]}</td><td>${info.file[13]}</td><td>${info.size[13]}/${info.sizetot[13]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[13]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
@@ -180,7 +180,7 @@ ${LANG_H20} ${info.currentjob}
|
|||||||
|
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="submit" value=" ${LANG_V4} "
|
<input type="submit" value=" ${LANG_V4} "
|
||||||
onMouseOver="disable_timer(); info('${LANG_D3}'); return true"
|
title='${html:LANG_D3}' onMouseOver="disable_timer(); info('${LANG_D3}'); return true"
|
||||||
onMouseOut="info(' '); enable_timer(); return true"
|
onMouseOut="info(' '); enable_timer(); return true"
|
||||||
onClick="if (do_confirm('${LANG_G1}')) { form.command.value='cancel'; form.submit(); } return false"
|
onClick="if (do_confirm('${LANG_G1}')) { form.command.value='cancel'; form.submit(); } return false"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ function info(str) {
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/server/file.html" target="_blank"
|
<a href="/server/file.html" target="_blank"
|
||||||
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_O1}' onMouseOver="info('${html:html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O1}
|
${LANG_O1}
|
||||||
@@ -64,7 +64,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/index.html" target="_blank"
|
<a href="/index.html" target="_blank"
|
||||||
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O5}
|
${LANG_O5}
|
||||||
@@ -93,7 +93,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step1.html" target="_blank"
|
<a href="/step1.html" target="_blank"
|
||||||
onClick="window.open('/step1.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step1.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -218,7 +218,7 @@ ${do:loadhash}
|
|||||||
|
|
||||||
${LANG_S11}
|
${LANG_S11}
|
||||||
<input name="projname" value="${projname}"
|
<input name="projname" value="${projname}"
|
||||||
onMouseOver="info('${html:html:LANG_S1}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_S1}' onMouseOver="info('${html:html:LANG_S1}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
@@ -233,7 +233,7 @@ ${do:loadhash}
|
|||||||
</select>
|
</select>
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="projcateg" value="${projcateg}"
|
<input name="projcateg" value="${projcateg}"
|
||||||
onMouseOver="info('${html:html:LANG_S5}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_S5}' onMouseOver="info('${html:html:LANG_S5}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
|
|
||||||
</td></tr></table>
|
</td></tr></table>
|
||||||
@@ -241,7 +241,7 @@ ${do:loadhash}
|
|||||||
<br>
|
<br>
|
||||||
${LANG_S12}
|
${LANG_S12}
|
||||||
<input name="path" value="${path}"
|
<input name="path" value="${path}"
|
||||||
onMouseOver="info('${html:html:LANG_S2}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_S2}' onMouseOver="info('${html:html:LANG_S2}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
<input type="button" value="refresh" onClick="form.redirect.value='step2.html'; form.submit()">
|
<input type="button" value="refresh" onClick="form.redirect.value='step2.html'; form.submit()">
|
||||||
|
|
||||||
@@ -250,11 +250,11 @@ ${do:loadhash}
|
|||||||
<tr><td>
|
<tr><td>
|
||||||
<table width="100%" border="0"><tr><td align="left">
|
<table width="100%" border="0"><tr><td align="left">
|
||||||
<input type="submit" value=" << ${LANG_PREVIOUS} " onClick="form.redirect.value='index.html'; form.submit()"
|
<input type="submit" value=" << ${LANG_PREVIOUS} " onClick="form.redirect.value='index.html'; form.submit()"
|
||||||
onMouseOver="info('${html:html:LANG_TIPPREV}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPPREV}' onMouseOver="info('${html:html:LANG_TIPPREV}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input name="nextBtn" type="submit" value=" ${LANG_NEXT} >> " onClick="return checkname();" default
|
<input name="nextBtn" type="submit" value=" ${LANG_NEXT} >> " onClick="return checkname();" default
|
||||||
onMouseOver="info('${html:html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPNEXT}' onMouseOver="info('${html:html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr></table>
|
</td></tr></table>
|
||||||
|
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ function do_check_child() {
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/server/file.html" target="_blank"
|
<a href="/server/file.html" target="_blank"
|
||||||
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O1}
|
${LANG_O1}
|
||||||
@@ -73,7 +73,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/index.html" target="_blank"
|
<a href="/index.html" target="_blank"
|
||||||
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O5}
|
${LANG_O5}
|
||||||
@@ -102,7 +102,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step2.html" target="_blank"
|
<a href="/step2.html" target="_blank"
|
||||||
onClick="window.open('/step2.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step2.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -118,7 +118,7 @@ ${do:end-if}
|
|||||||
<tr><td>
|
<tr><td>
|
||||||
${LANG_G31}
|
${LANG_G31}
|
||||||
<select name="todo"
|
<select name="todo"
|
||||||
onMouseOver="info('${html:LANG_G9}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_G9}' onMouseOver="info('${html:LANG_G9}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${listid:todo:LISTDEF_10}
|
${listid:todo:LISTDEF_10}
|
||||||
</select>
|
</select>
|
||||||
@@ -131,12 +131,12 @@ ${do:end-if}
|
|||||||
</td><td>
|
</td><td>
|
||||||
<input type="button" value="${LANG_G43}"
|
<input type="button" value="${LANG_G43}"
|
||||||
onClick="doOpenWindow()"
|
onClick="doOpenWindow()"
|
||||||
onMouseOver="info('${html:LANG_G24b}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_G24b}' onMouseOver="info('${html:LANG_G24b}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr></table>
|
</td></tr></table>
|
||||||
<br>
|
<br>
|
||||||
<textarea name="urls" cols="50" rows="8"
|
<textarea name="urls" cols="50" rows="8"
|
||||||
onMouseOver="info('${html:LANG_G11}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_G11}' onMouseOver="info('${html:LANG_G11}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${do:output-mode:html}
|
${do:output-mode:html}
|
||||||
${urls}
|
${urls}
|
||||||
@@ -150,7 +150,7 @@ ${do:output-mode:}
|
|||||||
${LANG_URLLIST}:
|
${LANG_URLLIST}:
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="filelist" value="${filelist}" size="40"
|
<input name="filelist" value="${filelist}" size="40"
|
||||||
onMouseOver="info('${html:LANG_G24c}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_G24c}' onMouseOver="info('${html:LANG_G24c}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr></table>
|
</td></tr></table>
|
||||||
|
|
||||||
@@ -161,7 +161,7 @@ ${do:output-mode:}
|
|||||||
${LANG_G41}
|
${LANG_G41}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input type="button" value="${LANG_G40}" onClick="window.open('option1.html', 'option1', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
<input type="button" value="${LANG_G40}" onClick="window.open('option1.html', 'option1', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_G24}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_G24}' onMouseOver="info('${html:LANG_G24}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr></table>
|
</td></tr></table>
|
||||||
|
|
||||||
@@ -170,11 +170,11 @@ ${do:output-mode:}
|
|||||||
<tr><td align="right">
|
<tr><td align="right">
|
||||||
<table width="100%" border="0"><tr><td align="left">
|
<table width="100%" border="0"><tr><td align="left">
|
||||||
<input type="submit" value=" << ${LANG_PREVIOUS} " onClick="form.redirect.value='step2.html'; form.submit()"
|
<input type="submit" value=" << ${LANG_PREVIOUS} " onClick="form.redirect.value='step2.html'; form.submit()"
|
||||||
onMouseOver="info('${html:LANG_TIPPREV}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPPREV}' onMouseOver="info('${html:LANG_TIPPREV}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input name="nextBtn" type="submit" value=" ${LANG_NEXT} >> "
|
<input name="nextBtn" type="submit" value=" ${LANG_NEXT} >> "
|
||||||
onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPNEXT}' onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr></table>
|
</td></tr></table>
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ function info(str) {
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/server/file.html" target="_blank"
|
<a href="/server/file.html" target="_blank"
|
||||||
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O1}
|
${LANG_O1}
|
||||||
@@ -55,7 +55,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/index.html" target="_blank"
|
<a href="/index.html" target="_blank"
|
||||||
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O5}
|
${LANG_O5}
|
||||||
@@ -84,7 +84,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step3.html" target="_blank"
|
<a href="/step3.html" target="_blank"
|
||||||
onClick="window.open('/step3.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step3.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -192,7 +192,7 @@ ${do:end-if}
|
|||||||
${test:logtype:::--extra-log:--debug-log}
|
${test:logtype:::--extra-log:--debug-log}
|
||||||
${test:index:--index=0:}
|
${test:index:--index=0:}
|
||||||
${test:index2:--search-index=0:--search-index}
|
${test:index2:--search-index=0:--search-index}
|
||||||
${test:prox:--proxy "}${do:if-not-empty:prox}${test:proxytype:socks5\3A//}${do:end-if}${do:output-mode:html}${prox}${test:prox:\3A}${portprox}${test:prox:"}
|
${test:prox:--proxy "}${do:if-not-empty:prox}${test:proxytype::socks5:connect}${test:proxytype:\3A//}${do:end-if}${do:output-mode:html}${prox}${test:prox:\3A}${portprox}${test:prox:"}
|
||||||
${test:ftpprox:--httpproxy-ftp=0:--httpproxy-ftp}
|
${test:ftpprox:--httpproxy-ftp=0:--httpproxy-ftp}
|
||||||
</textarea>
|
</textarea>
|
||||||
|
|
||||||
@@ -298,11 +298,11 @@ ${do:output-mode:}
|
|||||||
</td></tr><tr><td>
|
</td></tr><tr><td>
|
||||||
<table width="100%" border="0"><tr><td align="left">
|
<table width="100%" border="0"><tr><td align="left">
|
||||||
<input type="submit" value=" << ${LANG_PREVIOUS} " onClick="form.command.value=''; form.redirect.value='step3.html'; form.submit()"
|
<input type="submit" value=" << ${LANG_PREVIOUS} " onClick="form.command.value=''; form.redirect.value='step3.html'; form.submit()"
|
||||||
onMouseOver="info('${html:LANG_TIPPREV}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPPREV}' onMouseOver="info('${html:LANG_TIPPREV}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input name="nextBtn" type="submit" value=" ${LANG_J9} >> "
|
<input name="nextBtn" type="submit" value=" ${LANG_J9} >> "
|
||||||
onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
title='${html:LANG_TIPNEXT}' onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr></table>
|
</td></tr></table>
|
||||||
|
|
||||||
|
|||||||
2
lang.def
2
lang.def
@@ -1009,7 +1009,7 @@ A fatal error has occurred during this mirror
|
|||||||
LANG_PROXYTYPE
|
LANG_PROXYTYPE
|
||||||
Proxy type:
|
Proxy type:
|
||||||
LANG_PROXYTYPETIP
|
LANG_PROXYTYPETIP
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
LANG_COOKIEFILE
|
LANG_COOKIEFILE
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
LANG_COOKIEFILETIP
|
LANG_COOKIEFILETIP
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ pt:7
|
|||||||
ro:25
|
ro:25
|
||||||
ru:8
|
ru:8
|
||||||
sk:20
|
sk:20
|
||||||
si:24
|
sl:24
|
||||||
sv:17
|
sv:17
|
||||||
tr:10
|
tr:10
|
||||||
uk:22
|
uk:22
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
Ôàòàëíà ãðåøêà ïðè ñúçäàâàíåòî íà òîçè îãëåäàëåí ñàéò
|
Ôàòàëíà ãðåøêà ïðè ñúçäàâàíåòî íà òîçè îãëåäàëåí ñàéò
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Òèï íà ïðîêñè:
|
Òèï íà ïðîêñè:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Ïðîòîêîë íà ïðîêñè: HTTP èëè SOCKS5 (ñòàíäàðòíèÿò ïîðò íà SOCKS5 å 1080).
|
Ïðîòîêîë íà ïðîêñè. HTTP: ñòàíäàðòíî ïðîêñè. HTTP (CONNECT òóíåë): èçïðàùà âñÿêà çàÿâêà ïðåç CONNECT òóíåë, çà ïðîêñè ïîääúðæàùè ñàìî CONNECT êàòî HTTPTunnelPort íà Tor. SOCKS5: ïîðò ïî ïîäðàçáèðàíå 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Çàðåæäàíå íà 'áèñêâèòêè' îò ôàéë:
|
Çàðåæäàíå íà 'áèñêâèòêè' îò ôàéë:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
Ha ocurrido un error fatal durante esta copia
|
Ha ocurrido un error fatal durante esta copia
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Tipo de proxy:
|
Tipo de proxy:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Protocolo del proxy: HTTP o SOCKS5 (el puerto SOCKS5 predeterminado es 1080).
|
Protocolo del proxy. HTTP: proxy estándar. HTTP (túnel CONNECT): envía cada petición a través de un túnel CONNECT, para proxys que solo admiten CONNECT como el HTTPTunnelPort de Tor. SOCKS5: puerto predeterminado 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Cargar cookies desde un archivo:
|
Cargar cookies desde un archivo:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
|
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Typ proxy:
|
Typ proxy:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Protokol proxy: HTTP nebo SOCKS5 (výchozí port SOCKS5 je 1080).
|
Protokol proxy. HTTP: standardní proxy. HTTP (tunel CONNECT): odešle každý požadavek pøes tunel CONNECT, pro proxy podporující jen CONNECT jako HTTPTunnelPort v Toru. SOCKS5: výchozí port 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Naèíst cookies ze souboru:
|
Naèíst cookies ze souboru:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
這鏡像發生了不可回復的錯誤
|
這鏡像發生了不可回復的錯誤
|
||||||
Proxy type:
|
Proxy type:
|
||||||
proxy 類型:
|
proxy 類型:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
proxy 協定: HTTP 或 SOCKS5 (SOCKS5 的預設連接埠為 1080)。
|
代理協定。HTTP:標準代理。HTTP(CONNECT 隧道):透過 CONNECT 隧道傳送每個請求,用於僅支援 CONNECT 的代理,例如 Tor 的 HTTPTunnelPort。SOCKS5:預設連接埠 1080。
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
從檔案載入 cookies:
|
從檔案載入 cookies:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
|
|
||||||
Proxy type:
|
Proxy type:
|
||||||
代理类型:
|
代理类型:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
代理协议: HTTP 或 SOCKS5 (SOCKS5 的默认端口为 1080)。
|
代理协议。HTTP:标准代理。HTTP(CONNECT 隧道):通过 CONNECT 隧道发送每个请求,用于仅支持 CONNECT 的代理,例如 Tor 的 HTTPTunnelPort。SOCKS5:默认端口 1080。
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
从文件加载 cookies:
|
从文件加载 cookies:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -932,8 +932,8 @@ A fatal error has occurred during this mirror
|
|||||||
Tijekom ovog zrcaljenja je nastala fatalna pogreška
|
Tijekom ovog zrcaljenja je nastala fatalna pogreška
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Vrsta posrednika:
|
Vrsta posrednika:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Protokol posrednika: HTTP ili SOCKS5 (zadani port za SOCKS5 je 1080).
|
Protokol posrednika. HTTP: standardni posrednik. HTTP (CONNECT tunel): ¹alje svaki zahtjev kroz CONNECT tunel, za posrednike koji podr¾avaju samo CONNECT poput Torovog HTTPTunnelPorta. SOCKS5: zadani port 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Uèitati kolaèiæe iz datoteke:
|
Uèitati kolaèiæe iz datoteke:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -978,8 +978,8 @@ HTTrack: could not save profile for '%s'!
|
|||||||
HTTrack: kunne ikke gemme profil for '%s'!
|
HTTrack: kunne ikke gemme profil for '%s'!
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Proxytype:
|
Proxytype:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Proxyprotokol: HTTP eller SOCKS5 (SOCKS5 bruger som standard port 1080).
|
Proxyprotokol. HTTP: standardproxy. HTTP (CONNECT-tunnel): sender hver forespørgsel gennem en CONNECT-tunnel, til proxyer der kun understøtter CONNECT som Tors HTTPTunnelPort. SOCKS5: standardport 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Indlæs cookies fra fil:
|
Indlæs cookies fra fil:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
Fataler Fehler während der Webseiten-Kopie
|
Fataler Fehler während der Webseiten-Kopie
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Proxy-Typ:
|
Proxy-Typ:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Proxy-Protokoll: HTTP oder SOCKS5 (Standardport von SOCKS5 ist 1080).
|
Proxy-Protokoll. HTTP: normaler Proxy. HTTP (CONNECT-Tunnel): sendet jede Anfrage durch einen CONNECT-Tunnel, für Proxys, die nur CONNECT unterstützen, wie Tors HTTPTunnelPort. SOCKS5: Standardport 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Cookies aus Datei laden:
|
Cookies aus Datei laden:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
|
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Proxy tüüp:
|
Proxy tüüp:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Proxy protokoll: HTTP või SOCKS5 (SOCKS5 vaikeport on 1080).
|
Puhverserveri protokoll. HTTP: tavaline puhverserver. HTTP (CONNECT-tunnel): saadab iga päringu läbi CONNECT-tunneli, ainult CONNECT-it toetavate puhverserverite jaoks nagu Tori HTTPTunnelPort. SOCKS5: vaikeport 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Lae küpsised failist:
|
Lae küpsised failist:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -978,8 +978,8 @@ HTTrack: could not save profile for '%s'!
|
|||||||
HTTrack: could not save profile for '%s'!
|
HTTrack: could not save profile for '%s'!
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,11 +930,10 @@ Server terminated
|
|||||||
Palvelin lopetettu
|
Palvelin lopetettu
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
Tällä peilillä tapahtui vakava virhe
|
Tällä peilillä tapahtui vakava virhe
|
||||||
|
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Välityspalvelimen tyyppi:
|
Välityspalvelimen tyyppi:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Välityspalvelimen protokolla: HTTP tai SOCKS5 (SOCKS5:n oletusportti on 1080).
|
Välityspalvelimen protokolla. HTTP: tavallinen välityspalvelin. HTTP (CONNECT-tunneli): lähettää jokaisen pyynnön CONNECT-tunnelin kautta, vain CONNECT-yhteyksiä tukeville välityspalvelimille kuten Torin HTTPTunnelPort. SOCKS5: oletusportti 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Lataa evästeet tiedostosta:
|
Lataa evästeet tiedostosta:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -978,8 +978,8 @@ Default referer URL
|
|||||||
Champ referer par défaut
|
Champ referer par défaut
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Type de proxy :
|
Type de proxy :
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Protocole du proxy : HTTP ou SOCKS5 (le port SOCKS5 par défaut est 1080).
|
Protocole du proxy. HTTP : proxy standard. HTTP (tunnel CONNECT) : envoie chaque requête via un tunnel CONNECT, pour les proxys acceptant uniquement CONNECT comme le HTTPTunnelPort de Tor. SOCKS5 : port par défaut 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Charger les cookies depuis un fichier :
|
Charger les cookies depuis un fichier :
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -932,8 +932,8 @@ A fatal error has occurred during this mirror
|
|||||||
Ένα καταστροφικό σφάλμα προκλήθηκε κατά την αντιγραφή αυτού του τόπου
|
Ένα καταστροφικό σφάλμα προκλήθηκε κατά την αντιγραφή αυτού του τόπου
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Τύπος proxy:
|
Τύπος proxy:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Πρωτόκολλο proxy: HTTP ή SOCKS5 (η προεπιλεγμένη θύρα του SOCKS5 είναι 1080).
|
Πρωτόκολλο διαμεσολαβητή. HTTP: τυπικός διαμεσολαβητής. HTTP (σήραγγα CONNECT): στέλνει κάθε αίτημα μέσω σήραγγας CONNECT, για διαμεσολαβητές που υποστηρίζουν μόνο CONNECT όπως το HTTPTunnelPort του Tor. SOCKS5: προεπιλεγμένη θύρα 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Φόρτωση cookies από αρχείο:
|
Φόρτωση cookies από αρχείο:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -374,7 +374,7 @@ Create error logging and report files
|
|||||||
Crea file di log per segnalare errori e informazioni
|
Crea file di log per segnalare errori e informazioni
|
||||||
Generate DOS 8-3 filenames ONLY
|
Generate DOS 8-3 filenames ONLY
|
||||||
Genera solo nomi di file in formato 8.3
|
Genera solo nomi di file in formato 8.3
|
||||||
Generate ISO 9660 filenames ONLY for CDROM medias
|
Generate ISO9660 filenames ONLY for CDROM medias
|
||||||
Genera nomi di file in formato ISO9660 per i CDROM
|
Genera nomi di file in formato ISO9660 per i CDROM
|
||||||
Do not create HTML error pages
|
Do not create HTML error pages
|
||||||
Non generare pagine d'errore HTML
|
Non generare pagine d'errore HTML
|
||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
Si è verificato un errore fatale durante la copia
|
Si è verificato un errore fatale durante la copia
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Tipo di proxy:
|
Tipo di proxy:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Protocollo del proxy: HTTP o SOCKS5 (la porta SOCKS5 predefinita è 1080).
|
Protocollo del proxy. HTTP: proxy standard. HTTP (tunnel CONNECT): invia ogni richiesta attraverso un tunnel CONNECT, per proxy che supportano solo CONNECT come l'HTTPTunnelPort di Tor. SOCKS5: porta predefinita 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Carica i cookie da un file:
|
Carica i cookie da un file:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
|
|
||||||
Proxy type:
|
Proxy type:
|
||||||
プロキシの種類:
|
プロキシの種類:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
プロキシのプロトコル: HTTP または SOCKS5 (SOCKS5 の既定ポートは 1080)。
|
プロキシのプロトコル。HTTP: 標準のプロキシ。HTTP (CONNECT トンネル): すべてのリクエストを CONNECT トンネル経由で送信します。Tor の HTTPTunnelPort のような CONNECT のみのプロキシ用です。SOCKS5: 既定ポート 1080。
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
クッキーをファイルから読み込む:
|
クッキーをファイルから読み込む:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
Íàñòàíà ôàòàëíà ãðåøêà ïðè îâî¼ mirror
|
Íàñòàíà ôàòàëíà ãðåøêà ïðè îâî¼ mirror
|
||||||
Proxy type:
|
Proxy type:
|
||||||
ÂØß ÝÐ ßàÞÚáØ:
|
ÂØß ÝÐ ßàÞÚáØ:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
¿àÞâÞÚÞÛ ÝÐ ßàÞÚáØ: HTTP ØÛØ SOCKS5 (áâÐÝÔÐàÔÝÐâÐ ßÞàâÐ ÝÐ SOCKS5 Õ 1080).
|
¿àÞâÞÚÞÛ ÝÐ ßàÞÚáØ. HTTP: áâÐÝÔÐàÔÕÝ ßàÞÚáØ. HTTP (âãÝÕÛ CONNECT): ÓÞ ØáßàÐüÐ áÕÚÞÕ ÑÐàÐúÕ ßàÕÚã âãÝÕÛ CONNECT, ×Ð ßàÞÚáØ èâÞ ßÞÔÔàÖãÒÐÐâ áÐÜÞ CONNECT ÚÐÚÞ HTTPTunnelPort ÝÐ Tor. SOCKS5: áâÐÝÔÐàÔÝÐ ßÞàâÐ 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
²çØâÐø ÚÞÛÐçØúÐ ÞÔ ÔÐâÞâÕÚÐ:
|
²çØâÐø ÚÞÛÐçØúÐ ÞÔ ÔÐâÞâÕÚÐ:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
Végzetes hiba történt a tükrözés közben
|
Végzetes hiba történt a tükrözés közben
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Proxy típusa:
|
Proxy típusa:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Proxy protokoll: HTTP vagy SOCKS5 (a SOCKS5 alapértelmezett portja 1080).
|
Proxy protokoll. HTTP: szabványos proxy. HTTP (CONNECT alagút): minden kérést CONNECT alagúton keresztül küld, a csak CONNECT-et támogató proxykhoz, mint a Tor HTTPTunnelPortja. SOCKS5: alapértelmezett port 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Sütik betöltése fájlból:
|
Sütik betöltése fájlból:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
Een fatale fout is opgetreden tijdens deze spiegeling
|
Een fatale fout is opgetreden tijdens deze spiegeling
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Proxytype:
|
Proxytype:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Proxyprotocol: HTTP of SOCKS5 (standaardpoort van SOCKS5 is 1080).
|
Proxyprotocol. HTTP: standaardproxy. HTTP (CONNECT-tunnel): stuurt elke aanvraag via een CONNECT-tunnel, voor proxy's die alleen CONNECT ondersteunen zoals Tors HTTPTunnelPort. SOCKS5: standaardpoort 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Cookies uit bestand laden:
|
Cookies uit bestand laden:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
|
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Proxytype:
|
Proxytype:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Proxyprotokoll: HTTP eller SOCKS5 (SOCKS5 bruker som standard port 1080).
|
Proxyprotokoll. HTTP: standard proxy. HTTP (CONNECT-tunnel): sender hver forespørsel gjennom en CONNECT-tunnel, for proxyer som bare støtter CONNECT som Tors HTTPTunnelPort. SOCKS5: standardport 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Last inn cookies fra fil:
|
Last inn cookies fra fil:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
Podczas tworzenia lustra wydarzyl sie fatalny blad.
|
Podczas tworzenia lustra wydarzyl sie fatalny blad.
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Typ proxy:
|
Typ proxy:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Protokó³ proxy: HTTP lub SOCKS5 (domy¶lny port SOCKS5 to 1080).
|
Protokó³ proxy. HTTP: standardowe proxy. HTTP (tunel CONNECT): wysy³a ka¿de ¿±danie przez tunel CONNECT, dla proxy obs³uguj±cych tylko CONNECT, jak HTTPTunnelPort w Torze. SOCKS5: port domy¶lny 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Wczytaj ciasteczka z pliku:
|
Wczytaj ciasteczka z pliku:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -918,7 +918,7 @@ normal\nextended\ndebug
|
|||||||
normal\nextendido\ncorrigir
|
normal\nextendido\ncorrigir
|
||||||
Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download
|
Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download
|
||||||
Copiar site(s) da Web\nCopiar site(s) interativos da Web (perguntas)\nReceber arquivos específicos\nCopiar todas as páginas do site (alternação múltipla)\nTestar links nas páginas (testar indicador)\n* Retomar download interrompido\n* Atualizar download existente
|
Copiar site(s) da Web\nCopiar site(s) interativos da Web (perguntas)\nReceber arquivos específicos\nCopiar todas as páginas do site (alternação múltipla)\nTestar links nas páginas (testar indicador)\n* Retomar download interrompido\n* Atualizar download existente
|
||||||
Relative URL / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL
|
Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL
|
||||||
URI Relativa / URL Absoluta (padrão)\nURL Absoluta / URL Absoluta\nURI Absoluta / URL Absoluta\nURL Original / URL Original
|
URI Relativa / URL Absoluta (padrão)\nURL Absoluta / URL Absoluta\nURI Absoluta / URL Absoluta\nURL Original / URL Original
|
||||||
Open Source offline browser
|
Open Source offline browser
|
||||||
Abrir origem offline no navegador
|
Abrir origem offline no navegador
|
||||||
@@ -978,8 +978,8 @@ HTTrack: could not save profile for '%s'!
|
|||||||
HTTrack: não foi possível salvar o perfil para '%s'!
|
HTTrack: não foi possível salvar o perfil para '%s'!
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Tipo de proxy:
|
Tipo de proxy:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Protocolo do proxy: HTTP ou SOCKS5 (a porta SOCKS5 padrão é 1080).
|
Protocolo do proxy. HTTP: proxy padrão. HTTP (túnel CONNECT): envia cada requisição através de um túnel CONNECT, para proxies que só suportam CONNECT como o HTTPTunnelPort do Tor. SOCKS5: porta padrão 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Carregar cookies de um arquivo:
|
Carregar cookies de um arquivo:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
|
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Tipo de proxy:
|
Tipo de proxy:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Protocolo do proxy: HTTP ou SOCKS5 (a porta SOCKS5 predefinida é 1080).
|
Protocolo do proxy. HTTP: proxy padrão. HTTP (túnel CONNECT): envia cada pedido através de um túnel CONNECT, para proxies que só suportam CONNECT como o HTTPTunnelPort do Tor. SOCKS5: porta predefinida 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Carregar cookies de um ficheiro:
|
Carregar cookies de um ficheiro:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
A survenit o eroare fatală în timpul acestei clonări.
|
A survenit o eroare fatală în timpul acestei clonări.
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Tip proxy:
|
Tip proxy:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Protocol proxy: HTTP sau SOCKS5 (portul SOCKS5 implicit este 1080).
|
Protocol proxy. HTTP: proxy standard. HTTP (tunel CONNECT): trimite fiecare cerere printr-un tunel CONNECT, pentru proxy care accepta doar CONNECT precum HTTPTunnelPort al lui Tor. SOCKS5: port implicit 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Încarca cookies dintr-un fisier:
|
Încarca cookies dintr-un fisier:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
Âî âðåìÿ òåêóùåé çàêà÷êè ïðîèçîøëà ôàòàëüíàÿ îøèáêà
|
Âî âðåìÿ òåêóùåé çàêà÷êè ïðîèçîøëà ôàòàëüíàÿ îøèáêà
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Òèï ïðîêñè:
|
Òèï ïðîêñè:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Ïðîòîêîë ïðîêñè: HTTP èëè SOCKS5 (ïî óìîë÷àíèþ SOCKS5 èñïîëüçóåò ïîðò 1080).
|
Ïðîòîêîë ïðîêñè. HTTP: îáû÷íûé ïðîêñè. HTTP (òóííåëü CONNECT): îòïðàâëÿåò êàæäûé çàïðîñ ÷åðåç òóííåëü CONNECT, äëÿ ïðîêñè, ïîääåðæèâàþùèõ òîëüêî CONNECT, íàïðèìåð HTTPTunnelPort â Tor. SOCKS5: ïîðò ïî óìîë÷àíèþ 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Çàãðóçèòü cookies èç ôàéëà:
|
Çàãðóçèòü cookies èç ôàéëà:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
|
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Typ proxy:
|
Typ proxy:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Protokol proxy: HTTP alebo SOCKS5 (predvolený port SOCKS5 je 1080).
|
Protokol proxy. HTTP: ¹tandardné proxy. HTTP (tunel CONNECT): odo¹le ka¾dú po¾iadavku cez tunel CONNECT, pre proxy podporujúce len CONNECT ako HTTPTunnelPort v Tore. SOCKS5: predvolený port 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Naèíta» cookies zo súboru:
|
Naèíta» cookies zo súboru:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ Slovenian
|
|||||||
LANGUAGE_FILE
|
LANGUAGE_FILE
|
||||||
Slovenian
|
Slovenian
|
||||||
LANGUAGE_ISO
|
LANGUAGE_ISO
|
||||||
si
|
sl
|
||||||
LANGUAGE_AUTHOR
|
LANGUAGE_AUTHOR
|
||||||
Jadran Rudec,iur.\r\njrudec@email.si \r\n
|
Jadran Rudec,iur.\r\njrudec@email.si \r\n
|
||||||
LANGUAGE_CHARSET
|
LANGUAGE_CHARSET
|
||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
|
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Vrsta proxyja:
|
Vrsta proxyja:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Protokol proxy: HTTP ali SOCKS5 (privzeta vrata SOCKS5 so 1080).
|
Protokol proxy. HTTP: standardni proxy. HTTP (tunel CONNECT): poslje vsako zahtevo skozi tunel CONNECT, za posrednike, ki podpirajo samo CONNECT, kot je HTTPTunnelPort v Toru. SOCKS5: privzeta vrata 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Nalozi piskotke iz datoteke:
|
Nalozi piskotke iz datoteke:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
|
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Proxytyp:
|
Proxytyp:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Proxyprotokoll: HTTP eller SOCKS5 (SOCKS5 använder som standard port 1080).
|
Proxyprotokoll. HTTP: standardproxy. HTTP (CONNECT-tunnel): skickar varje begäran genom en CONNECT-tunnel, för proxyservrar som bara stöder CONNECT som Tors HTTPTunnelPort. SOCKS5: standardport 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Läs in cookies från fil:
|
Läs in cookies från fil:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
Bu yansýlama iþlemi sýrasýnda ölümcül bir hata oluþtu
|
Bu yansýlama iþlemi sýrasýnda ölümcül bir hata oluþtu
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Proxy türü:
|
Proxy türü:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Proxy protokolü: HTTP veya SOCKS5 (SOCKS5 varsayýlan portu 1080).
|
Proxy protokolü. HTTP: standart proxy. HTTP (CONNECT tüneli): her isteði bir CONNECT tüneli üzerinden gönderir; Tor'un HTTPTunnelPort gibi yalnýzca CONNECT destekleyen proxy'ler için. SOCKS5: varsayýlan baðlantý noktasý 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Çerezleri dosyadan yükle:
|
Çerezleri dosyadan yükle:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
|
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Òèï ïðîêñ³:
|
Òèï ïðîêñ³:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Ïðîòîêîë ïðîêñ³: HTTP àáî SOCKS5 (çà çàìîâ÷óâàííÿì SOCKS5 âèêîðèñòîâóº ïîðò 1080).
|
Ïðîòîêîë ïðîêñ³. HTTP: ñòàíäàðòíèé ïðîêñ³. HTTP (òóíåëü CONNECT): íàäñèëຠêîæåí çàïèò ÷åðåç òóíåëü CONNECT, äëÿ ïðîêñ³, ùî ï³äòðèìóþòü ëèøå CONNECT, ÿê-îò HTTPTunnelPort ó Tor. SOCKS5: ïîðò çà çàìîâ÷óâàííÿì 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Çàâàíòàæèòè cookies ç ôàéëó:
|
Çàâàíòàæèòè cookies ç ôàéëó:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -930,8 +930,8 @@ A fatal error has occurred during this mirror
|
|||||||
Joriy ko’chirish vaqtida jiddiy xatolik yuz berdi
|
Joriy ko’chirish vaqtida jiddiy xatolik yuz berdi
|
||||||
Proxy type:
|
Proxy type:
|
||||||
Proksi turi:
|
Proksi turi:
|
||||||
Proxy protocol: HTTP, or SOCKS5 (SOCKS5 default port is 1080).
|
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
||||||
Proksi protokoli: HTTP yoki SOCKS5 (SOCKS5 ning standart porti 1080).
|
Proksi protokoli. HTTP: oddiy proksi. HTTP (CONNECT tuneli): har bir so'rovni CONNECT tuneli orqali yuboradi; faqat CONNECT'ni qo'llab-quvvatlaydigan proksilar uchun, masalan Tor HTTPTunnelPort. SOCKS5: standart port 1080.
|
||||||
Load cookies from file:
|
Load cookies from file:
|
||||||
Fayldan cookies yuklamoq:
|
Fayldan cookies yuklamoq:
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
Preload cookies from a Netscape cookies.txt file before crawling.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" This file is generated by man/makeman.sh; do not edit by hand.
|
.\" This file is generated by man/makeman.sh; do not edit by hand.
|
||||||
.\" SPDX-License-Identifier: GPL-3.0-or-later
|
.\" SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
.TH httrack 1 "14 July 2026" "httrack website copier"
|
.TH httrack 1 "16 July 2026" "httrack website copier"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
httrack \- offline browser : copy websites to a local directory
|
httrack \- offline browser : copy websites to a local directory
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -135,7 +135,7 @@ continue an interrupted mirror using the cache (\-\-continue)
|
|||||||
mirror ALL links located in the first level pages (mirror links) (\-\-mirrorlinks)
|
mirror ALL links located in the first level pages (mirror links) (\-\-mirrorlinks)
|
||||||
.SS Proxy options:
|
.SS Proxy options:
|
||||||
.IP \-P
|
.IP \-P
|
||||||
proxy use (\-P [socks5://][user:pass@]proxy:port) (\-\-proxy <param>)
|
proxy use (\-P [socks5://|connect://][user:pass@]proxy:port) (\-\-proxy <param>)
|
||||||
.IP \-%f
|
.IP \-%f
|
||||||
*use proxy for ftp (f0 don't use) (\-\-httpproxy\-ftp[=N])
|
*use proxy for ftp (f0 don't use) (\-\-httpproxy\-ftp[=N])
|
||||||
.IP \-%b
|
.IP \-%b
|
||||||
@@ -165,7 +165,7 @@ pause transfer if N bytes reached, and wait until lock file is deleted (\-\-max\
|
|||||||
.IP \-cN
|
.IP \-cN
|
||||||
number of multiple connections (*c8) (\-\-sockets[=N])
|
number of multiple connections (*c8) (\-\-sockets[=N])
|
||||||
.IP \-TN
|
.IP \-TN
|
||||||
timeout, number of seconds after a non\-responding link is shutdown (\-\-timeout[=N])
|
timeout, number of seconds after a non\-responding link is shutdown; also bounds host name resolution (\-\-timeout[=N])
|
||||||
.IP \-RN
|
.IP \-RN
|
||||||
number of retries, in case of timeout or non\-fatal errors (*R1) (\-\-retries[=N])
|
number of retries, in case of timeout or non\-fatal errors (*R1) (\-\-retries[=N])
|
||||||
.IP \-JN
|
.IP \-JN
|
||||||
|
|||||||
@@ -46,9 +46,11 @@ htsserver_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PIE)
|
|||||||
|
|
||||||
lib_LTLIBRARIES = libhttrack.la
|
lib_LTLIBRARIES = libhttrack.la
|
||||||
|
|
||||||
htsserver_SOURCES = htsserver.c htsserver.h htsweb.c htsweb.h
|
htsserver_SOURCES = htsserver.c htsserver.h htsweb.c htsweb.h \
|
||||||
|
htsurlport.c htsurlport.h
|
||||||
proxytrack_SOURCES = proxy/main.c \
|
proxytrack_SOURCES = proxy/main.c \
|
||||||
proxy/proxytrack.c proxy/store.c \
|
proxy/proxytrack.c proxy/store.c \
|
||||||
|
htsurlport.c htsurlport.h \
|
||||||
coucal/coucal.c htsmd5.c md5.c \
|
coucal/coucal.c htsmd5.c md5.c \
|
||||||
minizip/ioapi.c minizip/mztools.c minizip/unzip.c minizip/zip.c
|
minizip/ioapi.c minizip/mztools.c minizip/unzip.c minizip/zip.c
|
||||||
|
|
||||||
@@ -58,7 +60,7 @@ whttrackrun_SCRIPTS = webhttrack
|
|||||||
libhttrack_la_SOURCES = htscore.c htsparse.c htsback.c htscache.c \
|
libhttrack_la_SOURCES = htscore.c htsparse.c htsback.c htscache.c \
|
||||||
htscache_selftest.c htsdns_selftest.c htsselftest.c \
|
htscache_selftest.c htsdns_selftest.c htsselftest.c \
|
||||||
htscatchurl.c htsfilters.c htsftp.c htshash.c coucal/coucal.c \
|
htscatchurl.c htsfilters.c htsftp.c htshash.c coucal/coucal.c \
|
||||||
htshelp.c htslib.c htscoremain.c \
|
htshelp.c htslib.c htsurlport.c htscoremain.c \
|
||||||
htsname.c htsrobots.c htstools.c htswizard.c \
|
htsname.c htsrobots.c htstools.c htswizard.c \
|
||||||
htsalias.c htsthread.c htsindex.c htsbauth.c \
|
htsalias.c htsthread.c htsindex.c htsbauth.c \
|
||||||
htsmd5.c htscodec.c htsproxy.c htszlib.c htswrap.c htsconcat.c \
|
htsmd5.c htscodec.c htsproxy.c htszlib.c htswrap.c htsconcat.c \
|
||||||
@@ -69,7 +71,7 @@ libhttrack_la_SOURCES = htscore.c htsparse.c htsback.c htscache.c \
|
|||||||
htsbasenet.h htsbauth.h htscache.h htscache_selftest.h htsdns_selftest.h htsselftest.h htscatchurl.h \
|
htsbasenet.h htsbauth.h htscache.h htscache_selftest.h htsdns_selftest.h htsselftest.h htscatchurl.h \
|
||||||
htsconfig.h htscore.h htsparse.h htscoremain.h htsdefines.h \
|
htsconfig.h htscore.h htsparse.h htscoremain.h htsdefines.h \
|
||||||
htsfilters.h htsftp.h htsglobal.h htshash.h coucal/coucal.h \
|
htsfilters.h htsftp.h htsglobal.h htshash.h coucal/coucal.h \
|
||||||
htshelp.h htsindex.h htslib.h htsmd5.h \
|
htshelp.h htsindex.h htslib.h htsurlport.h htsmd5.h \
|
||||||
htsmodules.h htsname.h htsnet.h htssniff.h \
|
htsmodules.h htsname.h htsnet.h htssniff.h \
|
||||||
htsopt.h htsrobots.h htsthread.h \
|
htsopt.h htsrobots.h htsthread.h \
|
||||||
htstools.h htswizard.h htswrap.h htscodec.h htsproxy.h htszlib.h \
|
htstools.h htswizard.h htswrap.h htscodec.h htsproxy.h htszlib.h \
|
||||||
|
|||||||
@@ -567,24 +567,29 @@ int optinclude_file(const char *name, int *argc, char **argv, char *x_argvblk,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get home directory, '.' if failed */
|
/* Get home directory, '.' if unset or empty */
|
||||||
/* example: /home/smith */
|
/* example: /home/smith */
|
||||||
const char *hts_gethome(void) {
|
const char *hts_gethome(void) {
|
||||||
const char *home = getenv("HOME");
|
const char *home = getenv("HOME");
|
||||||
|
|
||||||
if (home)
|
/* An empty $HOME would expand ~/foo into the absolute /foo */
|
||||||
return home;
|
return strnotempty(home) ? home : ".";
|
||||||
else
|
|
||||||
return ".";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert ~/foo into /home/smith/foo */
|
/* Convert ~/foo into /home/smith/foo (~user/ left alone: no getpwnam here) */
|
||||||
void expand_home(String * str) {
|
void expand_home(String * str) {
|
||||||
if (StringSub(*str, 1) == '~') {
|
if (StringNotEmpty(*str) && StringSub(*str, 0) == '~' &&
|
||||||
|
(StringLength(*str) == 1 || StringSub(*str, 1) == '/')) {
|
||||||
char BIGSTK tempo[HTS_URLMAXSIZE * 2];
|
char BIGSTK tempo[HTS_URLMAXSIZE * 2];
|
||||||
|
const char *const home = hts_gethome();
|
||||||
|
const size_t homelen = strlen(home);
|
||||||
|
const size_t taillen = StringLength(*str) - 1;
|
||||||
|
|
||||||
strcpybuff(tempo, hts_gethome());
|
/* Leave untouched rather than abort() in strcatbuff on a huge $HOME */
|
||||||
strcatbuff(tempo, StringBuff(*str) + 1);
|
if (taillen < sizeof(tempo) && homelen < sizeof(tempo) - taillen) {
|
||||||
StringCopy(*str, tempo);
|
strcpybuff(tempo, home);
|
||||||
|
strcatbuff(tempo, StringBuff(*str) + 1);
|
||||||
|
StringCopy(*str, tempo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2696,9 +2696,12 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
int dispo = 0;
|
int dispo = 0;
|
||||||
|
|
||||||
// probe the resolved address list once per fresh connect (cache hit:
|
// probe the resolved address list once per fresh connect (cache hit:
|
||||||
// the host was resolved when this connect was opened)
|
// the host was resolved when this connect was opened). Not under a
|
||||||
|
// proxy: the socket dials the proxy, so resolving the origin here leaks
|
||||||
|
// its DNS and lets a proxy-connect failure fall back to dialing it
|
||||||
|
// direct.
|
||||||
if (cf->addr_count < 0 && back[i].r.soc != INVALID_SOCKET &&
|
if (cf->addr_count < 0 && back[i].r.soc != INVALID_SOCKET &&
|
||||||
!back[i].r.is_file) {
|
!back[i].r.is_file && !back[i].r.req.proxy.active) {
|
||||||
SOCaddr scratch[HTS_MAXADDRNUM];
|
SOCaddr scratch[HTS_MAXADDRNUM];
|
||||||
|
|
||||||
cf->addr_count = hts_dns_resolve_all(opt, back[i].url_adr, scratch,
|
cf->addr_count = hts_dns_resolve_all(opt, back[i].url_adr, scratch,
|
||||||
@@ -2754,6 +2757,28 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// plain http tunneled through a CONNECT-only proxy (#564)
|
||||||
|
if (back[i].r.req.proxy.active &&
|
||||||
|
hts_proxy_is_connect(back[i].r.req.proxy.name) &&
|
||||||
|
!back[i].r.keep_alive
|
||||||
|
#if HTS_USEOPENSSL
|
||||||
|
&& !back[i].r.ssl
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
|
const int timeout = back[i].timeout > 0 ? back[i].timeout : 30;
|
||||||
|
|
||||||
|
if (!http_proxy_tunnel(opt, &back[i].r, back[i].url_adr, timeout)) {
|
||||||
|
if (!strnotempty(back[i].r.msg))
|
||||||
|
strcpybuff(back[i].r.msg, "proxy CONNECT failed");
|
||||||
|
deletehttp(&back[i].r);
|
||||||
|
back[i].r.soc = INVALID_SOCKET;
|
||||||
|
back[i].r.statuscode = STATUSCODE_NON_FATAL;
|
||||||
|
back[i].status = STATUS_READY;
|
||||||
|
back_set_finished(sback, i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if HTS_USEOPENSSL
|
#if HTS_USEOPENSSL
|
||||||
/* SSL mode */
|
/* SSL mode */
|
||||||
if (back[i].r.ssl) {
|
if (back[i].r.ssl) {
|
||||||
@@ -2791,6 +2816,9 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
if (SSL_set_fd(back[i].r.ssl_con, (int) back[i].r.soc) == 1) {
|
if (SSL_set_fd(back[i].r.ssl_con, (int) back[i].r.soc) == 1) {
|
||||||
SSL_set_connect_state(back[i].r.ssl_con);
|
SSL_set_connect_state(back[i].r.ssl_con);
|
||||||
back[i].status = STATUS_SSL_WAIT_HANDSHAKE; /* handshake wait */
|
back[i].status = STATUS_SSL_WAIT_HANDSHAKE; /* handshake wait */
|
||||||
|
// the handshake gets its own timeout window, as connect does
|
||||||
|
if (back[i].timeout > 0)
|
||||||
|
back[i].timeout_refresh = time_local();
|
||||||
} else
|
} else
|
||||||
back[i].r.statuscode = STATUSCODE_SSL_HANDSHAKE;
|
back[i].r.statuscode = STATUSCODE_SSL_HANDSHAKE;
|
||||||
} else
|
} else
|
||||||
@@ -2850,6 +2878,11 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
}
|
}
|
||||||
#if HTS_USEOPENSSL
|
#if HTS_USEOPENSSL
|
||||||
else if (back[i].status == STATUS_SSL_WAIT_HANDSHAKE) { // wait for SSL handshake
|
else if (back[i].status == STATUS_SSL_WAIT_HANDSHAKE) { // wait for SSL handshake
|
||||||
|
// a peer that never speaks TLS must be reaped by --timeout too (#607)
|
||||||
|
if (!gestion_timeout)
|
||||||
|
if (back[i].timeout > 0)
|
||||||
|
gestion_timeout = 1;
|
||||||
|
|
||||||
/* SSL mode */
|
/* SSL mode */
|
||||||
if (back[i].r.ssl) {
|
if (back[i].r.ssl) {
|
||||||
int conn_code;
|
int conn_code;
|
||||||
@@ -3310,16 +3343,26 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
back[i].chunk_blocksize = -1; /* ending */
|
back[i].chunk_blocksize = -1; /* ending */
|
||||||
back[i].r.totalsize += chunk_size; // noter taille
|
back[i].r.totalsize += chunk_size; // noter taille
|
||||||
if (back[i].r.adr != NULL || !back[i].r.is_write) { // Not to disk
|
if (back[i].r.adr != NULL || !back[i].r.is_write) { // Not to disk
|
||||||
back[i].r.adr =
|
// totalsize sums attacker-declared chunk sizes; past
|
||||||
(char *) realloct(back[i].r.adr,
|
// 2GB the (size_t) cast below truncates on 32-bit and
|
||||||
(size_t) back[i].r.totalsize + 1);
|
// under-allocates. Mark the chunk invalid so the shared
|
||||||
if (!back[i].r.adr) {
|
// error path tears the transfer down.
|
||||||
if (cache->log != NULL) {
|
if (back[i].r.totalsize > INT32_MAX) {
|
||||||
hts_log_print(opt, LOG_ERROR,
|
hts_log_print(opt, LOG_WARNING,
|
||||||
"not enough memory (" LLintP
|
"Chunked resource too large for %s%s",
|
||||||
") for %s%s",
|
back[i].url_adr, back[i].url_fil);
|
||||||
(LLint) back[i].r.totalsize,
|
chunk_size = -1;
|
||||||
back[i].url_adr, back[i].url_fil);
|
} else {
|
||||||
|
back[i].r.adr = (char *) realloct(
|
||||||
|
back[i].r.adr, (size_t) back[i].r.totalsize + 1);
|
||||||
|
if (!back[i].r.adr) {
|
||||||
|
if (cache->log != NULL) {
|
||||||
|
hts_log_print(opt, LOG_ERROR,
|
||||||
|
"not enough memory (" LLintP
|
||||||
|
") for %s%s",
|
||||||
|
(LLint) back[i].r.totalsize,
|
||||||
|
back[i].url_adr, back[i].url_fil);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4230,6 +4273,8 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
strcpybuff(back[i].r.msg, "Connect Time Out");
|
strcpybuff(back[i].r.msg, "Connect Time Out");
|
||||||
else if (back[i].status == STATUS_WAIT_DNS)
|
else if (back[i].status == STATUS_WAIT_DNS)
|
||||||
strcpybuff(back[i].r.msg, "DNS Time Out");
|
strcpybuff(back[i].r.msg, "DNS Time Out");
|
||||||
|
else if (back[i].status == STATUS_SSL_WAIT_HANDSHAKE)
|
||||||
|
strcpybuff(back[i].r.msg, "SSL/TLS Handshake Time Out");
|
||||||
else
|
else
|
||||||
strcpybuff(back[i].r.msg, "Receive Time Out");
|
strcpybuff(back[i].r.msg, "Receive Time Out");
|
||||||
back[i].status = STATUS_READY; // terminé
|
back[i].status = STATUS_READY; // terminé
|
||||||
|
|||||||
@@ -373,7 +373,8 @@ char *hts_convertStringCPFromUTF8(const char *s, size_t size, UINT cp) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *hts_convertStringToUTF8(const char *s, size_t size, const char *charset) {
|
HTSEXT_API char *hts_convertStringToUTF8(const char *s, size_t size,
|
||||||
|
const char *charset) {
|
||||||
const UINT cp = hts_getCodepage(charset);
|
const UINT cp = hts_getCodepage(charset);
|
||||||
|
|
||||||
return hts_convertStringCPToUTF8(s, size, cp);
|
return hts_convertStringCPToUTF8(s, size, cp);
|
||||||
@@ -554,7 +555,8 @@ static char *hts_convertStringCharset(const char *s, size_t size,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *hts_convertStringToUTF8(const char *s, size_t size, const char *charset) {
|
HTSEXT_API char *hts_convertStringToUTF8(const char *s, size_t size,
|
||||||
|
const char *charset) {
|
||||||
/* Empty string ? */
|
/* Empty string ? */
|
||||||
if (size == 0) {
|
if (size == 0) {
|
||||||
return strdup("");
|
return strdup("");
|
||||||
|
|||||||
@@ -51,8 +51,8 @@ typedef unsigned int hts_UCS4;
|
|||||||
* Convert the string "s" from charset "charset" to UTF-8.
|
* Convert the string "s" from charset "charset" to UTF-8.
|
||||||
* Return NULL upon error.
|
* Return NULL upon error.
|
||||||
**/
|
**/
|
||||||
extern char *hts_convertStringToUTF8(const char *s, size_t size,
|
HTSEXT_API char *hts_convertStringToUTF8(const char *s, size_t size,
|
||||||
const char *charset);
|
const char *charset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert the string "s" from UTF-8 to charset "charset".
|
* Convert the string "s" from UTF-8 to charset "charset".
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ HTSEXT_API int hts_main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int hts_main_internal(int argc, char **argv, httrackp * opt);
|
static int hts_main_internal(int argc, char **argv, httrackp * opt);
|
||||||
|
static hts_boolean cmdl_shortopt_has(const char *s, char c);
|
||||||
|
|
||||||
// Main, récupère les paramètres et appelle le robot
|
// Main, récupère les paramètres et appelle le robot
|
||||||
HTSEXT_API int hts_main2(int argc, char **argv, httrackp * opt) {
|
HTSEXT_API int hts_main2(int argc, char **argv, httrackp * opt) {
|
||||||
@@ -304,12 +305,12 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
hts_get_version_info(opt));
|
hts_get_version_info(opt));
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
if (strncmp(tmp_argv[0], "--", 2)) { /* pas */
|
if (strncmp(tmp_argv[0], "--", 2)) { /* not a long option */
|
||||||
if ((strchr(tmp_argv[0], 'q') != NULL))
|
if (cmdl_shortopt_has(tmp_argv[0], 'q'))
|
||||||
opt->quiet = 1; // ne pas poser de questions! (nohup par exemple)
|
opt->quiet = HTS_TRUE; // never ask questions (nohup)
|
||||||
if ((strchr(tmp_argv[0], 'i') != NULL)) { // doit.log!
|
if (cmdl_shortopt_has(tmp_argv[0], 'i')) { // doit.log!
|
||||||
argv_url = -1; /* forcer */
|
argv_url = -1;
|
||||||
opt->quiet = 1;
|
opt->quiet = HTS_TRUE;
|
||||||
}
|
}
|
||||||
} else if (strcmp(tmp_argv[0] + 2, "quiet") == 0) {
|
} else if (strcmp(tmp_argv[0] + 2, "quiet") == 0) {
|
||||||
opt->quiet = 1; // ne pas poser de questions! (nohup par exemple)
|
opt->quiet = 1; // ne pas poser de questions! (nohup par exemple)
|
||||||
@@ -424,25 +425,10 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
|
|
||||||
} // for
|
} // for
|
||||||
|
|
||||||
// Convert path to UTF-8
|
// path_html is already UTF-8 (argv is UTF-8 on Windows via
|
||||||
#ifdef _WIN32
|
// hts_argv_utf8), so no re-encoding.
|
||||||
{
|
|
||||||
char *const path =
|
|
||||||
hts_convertStringSystemToUTF8(StringBuff(opt->path_html),
|
|
||||||
(int) StringLength(opt->path_html));
|
|
||||||
if (path != NULL) {
|
|
||||||
StringCopy(opt->path_html_utf8, path);
|
|
||||||
free(path);
|
|
||||||
} else {
|
|
||||||
StringCopyN(opt->path_html_utf8, StringBuff(opt->path_html),
|
|
||||||
StringLength(opt->path_html));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// Assume UTF-8 filesystem.
|
|
||||||
StringCopyN(opt->path_html_utf8, StringBuff(opt->path_html),
|
StringCopyN(opt->path_html_utf8, StringBuff(opt->path_html),
|
||||||
StringLength(opt->path_html));
|
StringLength(opt->path_html));
|
||||||
#endif
|
|
||||||
|
|
||||||
/* if doit.log exists, or if new URL(s) defined,
|
/* if doit.log exists, or if new URL(s) defined,
|
||||||
then DO NOT load standard config files */
|
then DO NOT load standard config files */
|
||||||
@@ -2382,30 +2368,28 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
opt->errlog = stderr;
|
opt->errlog = stderr;
|
||||||
} else if (httrack_logmode >= 2) {
|
} else if (httrack_logmode >= 2) {
|
||||||
// deux fichiers log
|
// deux fichiers log
|
||||||
structcheck(StringBuff(opt->path_log));
|
// path_log holds UTF-8 bytes (argv is UTF-8): the ANSI file calls would
|
||||||
if (fexist
|
// read them as the codepage and drop the logs into a mangled twin (#630).
|
||||||
(fconcat
|
structcheck_utf8(StringBuff(opt->path_log));
|
||||||
(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-log.txt")))
|
if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt),
|
||||||
remove(fconcat
|
StringBuff(opt->path_log), "hts-log.txt")))
|
||||||
(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-log.txt"));
|
UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt),
|
||||||
if (fexist
|
StringBuff(opt->path_log), "hts-log.txt"));
|
||||||
(fconcat
|
if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt),
|
||||||
(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-err.txt")))
|
StringBuff(opt->path_log), "hts-err.txt")))
|
||||||
remove(fconcat
|
UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt),
|
||||||
(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-err.txt"));
|
StringBuff(opt->path_log), "hts-err.txt"));
|
||||||
|
|
||||||
/* Check FS directory structure created */
|
/* Check FS directory structure created */
|
||||||
structcheck(StringBuff(opt->path_log));
|
structcheck_utf8(StringBuff(opt->path_log));
|
||||||
|
|
||||||
opt->log =
|
opt->log = FOPEN(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt),
|
||||||
fopen(fconcat
|
StringBuff(opt->path_log), "hts-log.txt"),
|
||||||
(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-log.txt"),
|
"w");
|
||||||
"w");
|
|
||||||
if (httrack_logmode == 2)
|
if (httrack_logmode == 2)
|
||||||
opt->errlog =
|
opt->errlog = FOPEN(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt),
|
||||||
fopen(fconcat
|
StringBuff(opt->path_log), "hts-err.txt"),
|
||||||
(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-err.txt"),
|
"w");
|
||||||
"w");
|
|
||||||
else
|
else
|
||||||
opt->errlog = opt->log;
|
opt->errlog = opt->log;
|
||||||
if (opt->log == NULL) {
|
if (opt->log == NULL) {
|
||||||
@@ -2485,9 +2469,12 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
}
|
}
|
||||||
} */
|
} */
|
||||||
|
|
||||||
// vérifier existence de la structure
|
// vérifier existence de la structure (path_html/path_log are UTF-8, use
|
||||||
structcheck(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_html), "/"));
|
// the UTF-8 mkdir path)
|
||||||
structcheck(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "/"));
|
structcheck_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt),
|
||||||
|
StringBuff(opt->path_html), "/"));
|
||||||
|
structcheck_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt),
|
||||||
|
StringBuff(opt->path_log), "/"));
|
||||||
|
|
||||||
// reprise/update
|
// reprise/update
|
||||||
if (opt->cache) {
|
if (opt->cache) {
|
||||||
@@ -2807,6 +2794,32 @@ int check_path(String * s, char *defaultname) {
|
|||||||
return return_value;
|
return return_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Does the short-option cluster s carry c from the main option set (-i, -iC2,
|
||||||
|
-%Mi)? Walked as the parser does below: %, &, @ and # each take the letter
|
||||||
|
after them into another set, so the i of -%i is not the main-set -i. */
|
||||||
|
static hts_boolean cmdl_shortopt_has(const char *s, char c) {
|
||||||
|
const char *com;
|
||||||
|
|
||||||
|
if (s[0] != '-' || s[1] == '-')
|
||||||
|
return HTS_FALSE;
|
||||||
|
for (com = s + 1; *com != '\0'; com++) {
|
||||||
|
switch (*com) {
|
||||||
|
case '%':
|
||||||
|
case '&':
|
||||||
|
case '@':
|
||||||
|
case '#':
|
||||||
|
if (*(com + 1) != '\0')
|
||||||
|
com++; /* skip the other set's letter */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (*com == c)
|
||||||
|
return HTS_TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return HTS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
// détermine si l'argument est une option
|
// détermine si l'argument est une option
|
||||||
int cmdl_opt(char *s) {
|
int cmdl_opt(char *s) {
|
||||||
if (s[0] == '-') { // c'est peut être une option
|
if (s[0] == '-') { // c'est peut être une option
|
||||||
|
|||||||
@@ -63,9 +63,14 @@ typedef struct mock_host {
|
|||||||
int gai_err; /* non-zero: getaddrinfo returns this */
|
int gai_err; /* non-zero: getaddrinfo returns this */
|
||||||
int naddr;
|
int naddr;
|
||||||
mock_addr addr[6];
|
mock_addr addr[6];
|
||||||
int calls; /* times the backend resolved this host */
|
int calls; /* times the backend resolved this host */
|
||||||
|
int slow_ms; /* non-zero: block this long, as a black-hole resolver would */
|
||||||
} mock_host;
|
} mock_host;
|
||||||
|
|
||||||
|
/* Long enough to outlast the 1s --timeout the bounded resolve is checked
|
||||||
|
against, short enough to keep the self-test quick. */
|
||||||
|
#define MOCK_SLOW_MS 3000
|
||||||
|
|
||||||
static mock_host mock_hosts[] = {
|
static mock_host mock_hosts[] = {
|
||||||
{"v4only.test", 0, 1, {{AF_INET, {1, 2, 3, 4}}}, 0},
|
{"v4only.test", 0, 1, {{AF_INET, {1, 2, 3, 4}}}, 0},
|
||||||
{"v6only.test", 0, 1, {{AF_INET6, {0x20, 0x01, 0x0d, 0xb8, [15] = 1}}}, 0},
|
{"v6only.test", 0, 1, {{AF_INET6, {0x20, 0x01, 0x0d, 0xb8, [15] = 1}}}, 0},
|
||||||
@@ -95,8 +100,15 @@ static mock_host mock_hosts[] = {
|
|||||||
{AF_INET, {10, 0, 0, 6}}},
|
{AF_INET, {10, 0, 0, 6}}},
|
||||||
0},
|
0},
|
||||||
{"nodns.test", EAI_NONAME, 0, {{0}}, 0},
|
{"nodns.test", EAI_NONAME, 0, {{0}}, 0},
|
||||||
|
/* resolves, but only well after --timeout: the #606 wedge */
|
||||||
|
{"slow.test", 0, 1, {{AF_INET, {127, 0, 0, 9}}}, 0, MOCK_SLOW_MS},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Serializes mock_host bookkeeping: a timed-out resolve is abandoned, so its
|
||||||
|
worker is still inside the backend while the test reads the counters. */
|
||||||
|
static htsmutex mock_lock = HTSMUTEX_INIT;
|
||||||
|
static int mock_finished = 0; /* backend calls that have returned */
|
||||||
|
|
||||||
static mock_host *mock_find(const char *name) {
|
static mock_host *mock_find(const char *name) {
|
||||||
for (size_t i = 0; i < sizeof(mock_hosts) / sizeof(mock_hosts[0]); i++) {
|
for (size_t i = 0; i < sizeof(mock_hosts) / sizeof(mock_hosts[0]); i++) {
|
||||||
if (strcmp(mock_hosts[i].name, name) == 0)
|
if (strcmp(mock_hosts[i].name, name) == 0)
|
||||||
@@ -106,8 +118,34 @@ static mock_host *mock_find(const char *name) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void mock_reset_calls(void) {
|
static void mock_reset_calls(void) {
|
||||||
|
hts_mutexlock(&mock_lock);
|
||||||
for (size_t i = 0; i < sizeof(mock_hosts) / sizeof(mock_hosts[0]); i++)
|
for (size_t i = 0; i < sizeof(mock_hosts) / sizeof(mock_hosts[0]); i++)
|
||||||
mock_hosts[i].calls = 0;
|
mock_hosts[i].calls = 0;
|
||||||
|
mock_finished = 0;
|
||||||
|
hts_mutexrelease(&mock_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mock_read_calls(const char *name) {
|
||||||
|
int calls;
|
||||||
|
|
||||||
|
hts_mutexlock(&mock_lock);
|
||||||
|
calls = mock_find(name)->calls;
|
||||||
|
hts_mutexrelease(&mock_lock);
|
||||||
|
return calls;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wait for n backend calls to return, ordering their writes against ours. */
|
||||||
|
static void mock_wait_finished(int n) {
|
||||||
|
for (;;) {
|
||||||
|
hts_boolean done;
|
||||||
|
|
||||||
|
hts_mutexlock(&mock_lock);
|
||||||
|
done = (mock_finished >= n) ? HTS_TRUE : HTS_FALSE;
|
||||||
|
hts_mutexrelease(&mock_lock);
|
||||||
|
if (done)
|
||||||
|
break;
|
||||||
|
Sleep(10);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Build one addrinfo node owning its sockaddr (freed by mock_freeaddrinfo). */
|
/* Build one addrinfo node owning its sockaddr (freed by mock_freeaddrinfo). */
|
||||||
@@ -133,10 +171,10 @@ static struct addrinfo *mock_mkai(const mock_addr *a) {
|
|||||||
return ai;
|
return ai;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int HTS_RESOLVER_CALL mock_getaddrinfo(const char *node,
|
static int HTS_RESOLVER_CALL mock_getaddrinfo_(const char *node,
|
||||||
const char *service,
|
const char *service,
|
||||||
const struct addrinfo *hints,
|
const struct addrinfo *hints,
|
||||||
struct addrinfo **res) {
|
struct addrinfo **res) {
|
||||||
mock_host *const h = mock_find(node);
|
mock_host *const h = mock_find(node);
|
||||||
const int want = (hints != NULL) ? hints->ai_family : PF_UNSPEC;
|
const int want = (hints != NULL) ? hints->ai_family : PF_UNSPEC;
|
||||||
struct addrinfo *head = NULL, *tail = NULL;
|
struct addrinfo *head = NULL, *tail = NULL;
|
||||||
@@ -145,7 +183,11 @@ static int HTS_RESOLVER_CALL mock_getaddrinfo(const char *node,
|
|||||||
*res = NULL;
|
*res = NULL;
|
||||||
if (h == NULL)
|
if (h == NULL)
|
||||||
return EAI_NONAME;
|
return EAI_NONAME;
|
||||||
|
hts_mutexlock(&mock_lock);
|
||||||
h->calls++; /* a real backend hit; a cached host skips this */
|
h->calls++; /* a real backend hit; a cached host skips this */
|
||||||
|
hts_mutexrelease(&mock_lock);
|
||||||
|
if (h->slow_ms != 0)
|
||||||
|
Sleep(h->slow_ms);
|
||||||
if (h->gai_err != 0)
|
if (h->gai_err != 0)
|
||||||
return h->gai_err;
|
return h->gai_err;
|
||||||
for (int i = 0; i < h->naddr; i++) {
|
for (int i = 0; i < h->naddr; i++) {
|
||||||
@@ -165,6 +207,18 @@ static int HTS_RESOLVER_CALL mock_getaddrinfo(const char *node,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int HTS_RESOLVER_CALL mock_getaddrinfo(const char *node,
|
||||||
|
const char *service,
|
||||||
|
const struct addrinfo *hints,
|
||||||
|
struct addrinfo **res) {
|
||||||
|
const int ret = mock_getaddrinfo_(node, service, hints, res);
|
||||||
|
|
||||||
|
hts_mutexlock(&mock_lock);
|
||||||
|
mock_finished++;
|
||||||
|
hts_mutexrelease(&mock_lock);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static void HTS_RESOLVER_CALL mock_freeaddrinfo(struct addrinfo *res) {
|
static void HTS_RESOLVER_CALL mock_freeaddrinfo(struct addrinfo *res) {
|
||||||
while (res != NULL) {
|
while (res != NULL) {
|
||||||
struct addrinfo *const next = res->ai_next;
|
struct addrinfo *const next = res->ai_next;
|
||||||
@@ -348,6 +402,50 @@ int dns_selftests(httrackp *opt) {
|
|||||||
deletesoc(s);
|
deletesoc(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* A URL port outside 1..65535 must refuse the link, not fold into range and
|
||||||
|
connect elsewhere (#614). *addr_count discriminates: 0 only if refused
|
||||||
|
before the resolve, still 2 for one merely truncated or defaulted. */
|
||||||
|
{
|
||||||
|
/* an empty "dual.test:" means the default port (WHATWG, curl): keep it */
|
||||||
|
static const char *const good[] = {"dual.test:1", "dual.test:80",
|
||||||
|
"dual.test:8080", "dual.test:65535",
|
||||||
|
"dual.test:080", "dual.test:"};
|
||||||
|
/* 65616 and 4294967376 are load-bearing: both wrap to a plausible 80 */
|
||||||
|
static const char *const bad[] = {
|
||||||
|
"dual.test:0", "dual.test:65536", "dual.test:65616",
|
||||||
|
"dual.test:99999", "dual.test:2147483648", "dual.test:4294967296",
|
||||||
|
"dual.test:4294967376", "dual.test:-1", "dual.test:-23437",
|
||||||
|
"dual.test:80x", "dual.test:+80", "dual.test: 80",
|
||||||
|
"dual.test:0x50"};
|
||||||
|
size_t k;
|
||||||
|
|
||||||
|
for (k = 0; k < sizeof(good) / sizeof(good[0]); k++) {
|
||||||
|
htsblk r;
|
||||||
|
int count = -1;
|
||||||
|
T_SOC s;
|
||||||
|
|
||||||
|
hts_init_htsblk(&r);
|
||||||
|
s = newhttp_addr(opt, good[k], &r, -1, 0, 0, &count);
|
||||||
|
CHECK(count == 2); /* accepted: reached the resolve */
|
||||||
|
if (s != INVALID_SOCKET)
|
||||||
|
deletesoc(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (k = 0; k < sizeof(bad) / sizeof(bad[0]); k++) {
|
||||||
|
htsblk r;
|
||||||
|
int count = -1;
|
||||||
|
T_SOC s;
|
||||||
|
|
||||||
|
hts_init_htsblk(&r);
|
||||||
|
s = newhttp_addr(opt, bad[k], &r, -1, 0, 0, &count);
|
||||||
|
CHECK(s == INVALID_SOCKET);
|
||||||
|
CHECK(count == 0); /* refused before resolving, not a failed connect */
|
||||||
|
CHECK(strstr(r.msg, "Invalid port") != NULL);
|
||||||
|
if (s != INVALID_SOCKET)
|
||||||
|
deletesoc(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Connect-fallback decision (consumer of the multi-address list): when a
|
/* Connect-fallback decision (consumer of the multi-address list): when a
|
||||||
stuck connect should abandon the current address for the next one. */
|
stuck connect should abandon the current address for the next one. */
|
||||||
{
|
{
|
||||||
@@ -370,6 +468,91 @@ int dns_selftests(httrackp *opt) {
|
|||||||
return failures;
|
return failures;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Probes how long acquiring opt->state.lock takes while a resolve is in
|
||||||
|
flight. hts_has_stopped() takes that same lock and mutates nothing, and the
|
||||||
|
API promises it stays callable from another thread during a mirror. */
|
||||||
|
typedef struct lock_probe {
|
||||||
|
httrackp *opt;
|
||||||
|
htsmutex lock;
|
||||||
|
hts_boolean done;
|
||||||
|
TStamp blocked_ms;
|
||||||
|
} lock_probe;
|
||||||
|
|
||||||
|
static void lock_probe_thread(void *arg) {
|
||||||
|
lock_probe *const p = (lock_probe *) arg;
|
||||||
|
TStamp start;
|
||||||
|
|
||||||
|
Sleep(MOCK_SLOW_MS / 10); /* let the resolve get under way first */
|
||||||
|
start = mtime_local();
|
||||||
|
(void) hts_has_stopped(p->opt);
|
||||||
|
hts_mutexlock(&p->lock);
|
||||||
|
p->blocked_ms = mtime_local() - start;
|
||||||
|
p->done = HTS_TRUE;
|
||||||
|
hts_mutexrelease(&p->lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
int dns_timeout_selftests(httrackp *opt) {
|
||||||
|
SOCaddr addrs[HTS_MAXADDRNUM];
|
||||||
|
const char *err = NULL;
|
||||||
|
lock_probe probe;
|
||||||
|
TStamp start, elapsed;
|
||||||
|
int count;
|
||||||
|
|
||||||
|
failures = 0;
|
||||||
|
hts_dns_set_resolver_backend(&mock_backend);
|
||||||
|
IPV6_resolver = 0;
|
||||||
|
mock_reset_calls();
|
||||||
|
opt->timeout = 1; /* the bound under test */
|
||||||
|
|
||||||
|
memset(&probe, 0, sizeof(probe));
|
||||||
|
probe.opt = opt;
|
||||||
|
probe.lock = HTSMUTEX_INIT;
|
||||||
|
hts_mutexinit(&probe.lock);
|
||||||
|
CHECK(hts_newthread(lock_probe_thread, &probe) == 0);
|
||||||
|
|
||||||
|
start = mtime_local();
|
||||||
|
count = hts_dns_resolve_all(opt, "slow.test", addrs, HTS_MAXADDRNUM, &err);
|
||||||
|
elapsed = mtime_local() - start;
|
||||||
|
|
||||||
|
/* the resolve returns on opt->timeout, not when the resolver deigns to
|
||||||
|
answer: this is what lets --max-time and --timeout fire (#606). The bound
|
||||||
|
is derived from opt->timeout, never from the mock's sleep, or a resolve
|
||||||
|
that ignored opt->timeout would still pass under the mock. */
|
||||||
|
CHECK(elapsed < (TStamp) opt->timeout * 1000 + 500);
|
||||||
|
CHECK(count == 0); /* a timeout is reported as "does not resolve" */
|
||||||
|
|
||||||
|
/* state.lock is not held across the resolve; a concurrent stop query, which
|
||||||
|
the mirror API promises stays live, is not blocked behind it */
|
||||||
|
for (;;) {
|
||||||
|
hts_boolean done;
|
||||||
|
TStamp blocked;
|
||||||
|
|
||||||
|
hts_mutexlock(&probe.lock);
|
||||||
|
done = probe.done;
|
||||||
|
blocked = probe.blocked_ms;
|
||||||
|
hts_mutexrelease(&probe.lock);
|
||||||
|
if (done) {
|
||||||
|
CHECK(blocked < 500);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Sleep(20);
|
||||||
|
}
|
||||||
|
hts_mutexfree(&probe.lock);
|
||||||
|
|
||||||
|
/* a timeout is not an answer, so it must not be negative-cached: the host is
|
||||||
|
resolved again rather than written off for the rest of the crawl */
|
||||||
|
CHECK(mock_read_calls("slow.test") == 1);
|
||||||
|
count = hts_dns_resolve_all(opt, "slow.test", addrs, HTS_MAXADDRNUM, &err);
|
||||||
|
CHECK(count == 0);
|
||||||
|
CHECK(mock_read_calls("slow.test") == 2); /* re-resolved, not cached */
|
||||||
|
|
||||||
|
/* Both resolves were abandoned mid-backend; wait for their workers to leave
|
||||||
|
it before returning. The backend stays installed: an abandoned worker
|
||||||
|
still reads it (to free its addrinfo) after the last call returns. */
|
||||||
|
mock_wait_finished(2);
|
||||||
|
return failures;
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
int dns_selftests(httrackp *opt) {
|
int dns_selftests(httrackp *opt) {
|
||||||
|
|||||||
@@ -46,6 +46,12 @@ typedef struct httrackp httrackp;
|
|||||||
Returns the number of failed checks (0 == success). */
|
Returns the number of failed checks (0 == success). */
|
||||||
int dns_selftests(httrackp *opt);
|
int dns_selftests(httrackp *opt);
|
||||||
|
|
||||||
|
/* Drive a deliberately slow (mock) resolver, asserting that a resolve is
|
||||||
|
bounded by opt->timeout, does not hold opt->state.lock while it runs, and
|
||||||
|
does not cache a timeout as an answer (#606). Takes a few seconds.
|
||||||
|
Returns the number of failed checks (0 == success). */
|
||||||
|
int dns_timeout_selftests(httrackp *opt);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -248,7 +248,13 @@ int run_launch_ftp(FTPDownloadStruct * pStruct) {
|
|||||||
// port
|
// port
|
||||||
a = strchr(adr, ':'); // port
|
a = strchr(adr, ':'); // port
|
||||||
if (a) {
|
if (a) {
|
||||||
sscanf(a + 1, "%d", &port);
|
// folding a nonsense port into 1..65535 fetches one the link never named;
|
||||||
|
// an empty "host:" just means the default (#614)
|
||||||
|
if (a[1] != '\0' && !hts_parse_url_port(a + 1, &port)) {
|
||||||
|
snprintf(back->r.msg, sizeof(back->r.msg), "Invalid port: %s", a + 1);
|
||||||
|
back->r.statuscode = STATUSCODE_INVALID; // permanent, unlike a DNS miss
|
||||||
|
_HALT_FTP return 0;
|
||||||
|
}
|
||||||
strncatbuff(_adr, adr, (int) (a - adr));
|
strncatbuff(_adr, adr, (int) (a - adr));
|
||||||
} else
|
} else
|
||||||
strcpybuff(_adr, adr);
|
strcpybuff(_adr, adr);
|
||||||
|
|||||||
@@ -43,8 +43,8 @@ Please visit our Website: http://www.httrack.com
|
|||||||
configure.ac, decoupled from these). VERSION is the display form, VERSIONID
|
configure.ac, decoupled from these). VERSION is the display form, VERSIONID
|
||||||
the dotted numeric form, AFF_VERSION the short form shown in footers,
|
the dotted numeric form, AFF_VERSION the short form shown in footers,
|
||||||
LIB_VERSION the data/cache format generation. */
|
LIB_VERSION the data/cache format generation. */
|
||||||
#define HTTRACK_VERSION "3.49-12"
|
#define HTTRACK_VERSION "3.49-13"
|
||||||
#define HTTRACK_VERSIONID "3.49.12"
|
#define HTTRACK_VERSIONID "3.49.13"
|
||||||
#define HTTRACK_AFF_VERSION "3.x"
|
#define HTTRACK_AFF_VERSION "3.x"
|
||||||
#define HTTRACK_LIB_VERSION "2.0"
|
#define HTTRACK_LIB_VERSION "2.0"
|
||||||
|
|
||||||
@@ -323,11 +323,9 @@ typedef int64_t TStamp;
|
|||||||
#define LLintP "%" PRId64
|
#define LLintP "%" PRId64
|
||||||
|
|
||||||
/* Integer type for file offsets/sizes passed to the C library; INTsysP is its
|
/* Integer type for file offsets/sizes passed to the C library; INTsysP is its
|
||||||
printf conversion. FIXME: LFS_FLAG is a configure make variable, never a C
|
printf conversion. HTS_LFS is the large-file macro: LFS_FLAG is a configure
|
||||||
macro, so this test is dead and INTsys stays int on POSIX despite large-file
|
make variable carrying the -D flags, never itself defined. */
|
||||||
support (the real macro is HTS_LFS). Widening it there is an installed-header
|
#if defined(HTS_LFS) || defined(_MSC_VER)
|
||||||
type change, so it is left alone here. */
|
|
||||||
#if defined(LFS_FLAG) || defined(_MSC_VER)
|
|
||||||
typedef LLint INTsys;
|
typedef LLint INTsys;
|
||||||
|
|
||||||
#define INTsysP LLintP
|
#define INTsysP LLintP
|
||||||
|
|||||||
@@ -477,7 +477,7 @@ void help(const char *app, int more) {
|
|||||||
(" Y mirror ALL links located in the first level pages (mirror links)");
|
(" Y mirror ALL links located in the first level pages (mirror links)");
|
||||||
infomsg("");
|
infomsg("");
|
||||||
infomsg("Proxy options:");
|
infomsg("Proxy options:");
|
||||||
infomsg(" P proxy use (-P [socks5://][user:pass@]proxy:port)");
|
infomsg(" P proxy use (-P [socks5://|connect://][user:pass@]proxy:port)");
|
||||||
infomsg(" %f *use proxy for ftp (f0 don't use)");
|
infomsg(" %f *use proxy for ftp (f0 don't use)");
|
||||||
infomsg(" %b use this local hostname to make/send requests (-%b hostname)");
|
infomsg(" %b use this local hostname to make/send requests (-%b hostname)");
|
||||||
infomsg("");
|
infomsg("");
|
||||||
@@ -496,8 +496,8 @@ void help(const char *app, int more) {
|
|||||||
infomsg("");
|
infomsg("");
|
||||||
infomsg("Flow control:");
|
infomsg("Flow control:");
|
||||||
infomsg(" cN number of multiple connections (*c8)");
|
infomsg(" cN number of multiple connections (*c8)");
|
||||||
infomsg
|
infomsg(" TN timeout, number of seconds after a non-responding link is"
|
||||||
(" TN timeout, number of seconds after a non-responding link is shutdown");
|
" shutdown; also bounds host name resolution");
|
||||||
infomsg
|
infomsg
|
||||||
(" RN number of retries, in case of timeout or non-fatal errors (*R1)");
|
(" RN number of retries, in case of timeout or non-fatal errors (*R1)");
|
||||||
infomsg
|
infomsg
|
||||||
|
|||||||
244
src/htslib.c
244
src/htslib.c
@@ -65,6 +65,7 @@ Please visit our Website: http://www.httrack.com
|
|||||||
#endif /* _WIN32 */
|
#endif /* _WIN32 */
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
@@ -947,9 +948,10 @@ int http_sendhead(httrackp * opt, t_cookie * cookie, int mode,
|
|||||||
/* widths bound method[256], url[HTS_URLMAXSIZE*2], protocol[256] */
|
/* widths bound method[256], url[HTS_URLMAXSIZE*2], protocol[256] */
|
||||||
if (sscanf(line, "%255s %2047s %255s", method, url, protocol) == 3) {
|
if (sscanf(line, "%255s %2047s %255s", method, url, protocol) == 3) {
|
||||||
size_t ret;
|
size_t ret;
|
||||||
// absolute-URI for an http proxy; a socks tunnel takes origin-form
|
// http proxy: absolute-URI; socks/CONNECT tunnel: origin-form
|
||||||
if (retour->req.proxy.active &&
|
if (retour->req.proxy.active &&
|
||||||
!hts_proxy_is_socks(retour->req.proxy.name)) {
|
!hts_proxy_is_socks(retour->req.proxy.name) &&
|
||||||
|
!hts_proxy_is_connect(retour->req.proxy.name)) {
|
||||||
print_buffer(&bstr,
|
print_buffer(&bstr,
|
||||||
"%s http://%s%s %s\r\n", method, adr, url,
|
"%s http://%s%s %s\r\n", method, adr, url,
|
||||||
protocol);
|
protocol);
|
||||||
@@ -985,9 +987,10 @@ int http_sendhead(httrackp * opt, t_cookie * cookie, int mode,
|
|||||||
print_buffer(&bstr, "HEAD ");
|
print_buffer(&bstr, "HEAD ");
|
||||||
}
|
}
|
||||||
|
|
||||||
// an http proxy needs an absolute URI; a socks tunnel does not
|
// an http proxy needs an absolute URI; a socks or CONNECT tunnel does not
|
||||||
if (retour->req.proxy.active &&
|
if (retour->req.proxy.active &&
|
||||||
!hts_proxy_is_socks(retour->req.proxy.name) &&
|
!hts_proxy_is_socks(retour->req.proxy.name) &&
|
||||||
|
!hts_proxy_is_connect(retour->req.proxy.name) &&
|
||||||
(strncmp(adr, "https://", 8) != 0)) {
|
(strncmp(adr, "https://", 8) != 0)) {
|
||||||
if (!link_has_authority(adr)) { // default http
|
if (!link_has_authority(adr)) { // default http
|
||||||
#if HDEBUG
|
#if HDEBUG
|
||||||
@@ -1032,10 +1035,10 @@ int http_sendhead(httrackp * opt, t_cookie * cookie, int mode,
|
|||||||
if (xsend)
|
if (xsend)
|
||||||
print_buffer(&bstr, "%s", xsend); // éventuelles autres lignes
|
print_buffer(&bstr, "%s", xsend); // éventuelles autres lignes
|
||||||
|
|
||||||
// for https, auth rides the CONNECT (the tunneled GET would leak it); for
|
// https/connect://: auth rides the CONNECT; socks: the handshake
|
||||||
// socks, the handshake
|
|
||||||
if (retour->req.proxy.active &&
|
if (retour->req.proxy.active &&
|
||||||
!hts_proxy_is_socks(retour->req.proxy.name) &&
|
!hts_proxy_is_socks(retour->req.proxy.name) &&
|
||||||
|
!hts_proxy_is_connect(retour->req.proxy.name) &&
|
||||||
strncmp(adr, "https://", 8) != 0) {
|
strncmp(adr, "https://", 8) != 0) {
|
||||||
if (link_has_authorization(retour->req.proxy.name)) { // et hop, authentification proxy!
|
if (link_has_authorization(retour->req.proxy.name)) { // et hop, authentification proxy!
|
||||||
const char *a = jump_identification_const(retour->req.proxy.name);
|
const char *a = jump_identification_const(retour->req.proxy.name);
|
||||||
@@ -2164,15 +2167,18 @@ T_SOC newhttp_addr(httrackp *opt, const char *_iadr, htsblk *retour, int port,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (a != NULL) {
|
if (a != NULL) {
|
||||||
int i = -1;
|
// folding a nonsense port into 0..65535 crawls one neither the link nor
|
||||||
|
// a port filter named; an empty "host:" just means the default (#614)
|
||||||
iadr2[0] = '\0';
|
if (a[1] != '\0' && !hts_parse_url_port(a + 1, &port)) {
|
||||||
sscanf(a + 1, "%d", &i);
|
if (retour != NULL) {
|
||||||
if (i != -1) {
|
snprintf(retour->msg, sizeof(retour->msg), "Invalid port: %s",
|
||||||
port = (unsigned short int) i;
|
a + 1);
|
||||||
|
}
|
||||||
|
return INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
|
|
||||||
// adresse véritable (sans :xx)
|
iadr2[0] = '\0';
|
||||||
|
// the address itself, without the ":port"
|
||||||
strncatbuff(iadr2, iadr, (int) (a - iadr));
|
strncatbuff(iadr2, iadr, (int) (a - iadr));
|
||||||
resolve_host = iadr2;
|
resolve_host = iadr2;
|
||||||
}
|
}
|
||||||
@@ -3717,6 +3723,8 @@ const char *jump_protocol_const(const char *source) {
|
|||||||
source += p;
|
source += p;
|
||||||
else if ((p = strfield(source, "socks5:")))
|
else if ((p = strfield(source, "socks5:")))
|
||||||
source += p;
|
source += p;
|
||||||
|
else if ((p = strfield(source, "connect:")))
|
||||||
|
source += p;
|
||||||
// net_path
|
// net_path
|
||||||
if (strncmp(source, "//", 2) == 0)
|
if (strncmp(source, "//", 2) == 0)
|
||||||
source += 2;
|
source += 2;
|
||||||
@@ -3732,11 +3740,27 @@ hts_boolean hts_proxy_is_socks(const char *name) {
|
|||||||
: HTS_FALSE;
|
: HTS_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hts_boolean hts_proxy_is_connect(const char *name) {
|
||||||
|
if (name == NULL)
|
||||||
|
return HTS_FALSE;
|
||||||
|
return strfield(name, "connect:") ? HTS_TRUE : HTS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
// default proxy port for a -P argument, keyed on the scheme
|
// default proxy port for a -P argument, keyed on the scheme
|
||||||
static int proxy_default_port(const char *arg) {
|
static int proxy_default_port(const char *arg) {
|
||||||
return hts_proxy_is_socks(arg) ? 1080 : 8080;
|
return hts_proxy_is_socks(arg) ? 1080 : 8080;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// port "a" of -P argument "arg": digits fitting TCP's 1..65535, else the scheme
|
||||||
|
// default. Not sscanf("%d"): past INT_MAX it wraps to a garbage port (#602)
|
||||||
|
static int parse_proxy_port(const char *a, const char *arg) {
|
||||||
|
int port;
|
||||||
|
|
||||||
|
if (!hts_parse_url_port(a, &port))
|
||||||
|
return proxy_default_port(arg);
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
void hts_parse_proxy(const char *arg, char *name, size_t name_size, int *port) {
|
void hts_parse_proxy(const char *arg, char *name, size_t name_size, int *port) {
|
||||||
const char *authority = strstr(arg, "://");
|
const char *authority = strstr(arg, "://");
|
||||||
const char *a;
|
const char *a;
|
||||||
@@ -3744,18 +3768,15 @@ void hts_parse_proxy(const char *arg, char *name, size_t name_size, int *port) {
|
|||||||
|
|
||||||
if (name_size == 0)
|
if (name_size == 0)
|
||||||
return;
|
return;
|
||||||
// scan back to the port ':' (or userinfo '@'), but never past the authority,
|
// scan back to the port ':' (or userinfo '@'), never past the authority (a
|
||||||
// so a scheme's own colon is not read as a port separator; inspect a[-1] from
|
// scheme's own colon is not a port separator) nor into an IPv6 literal (']'
|
||||||
// one-past-end so no pointer below the string is ever formed
|
// stops it); inspect a[-1] from one-past-end so no pointer underflows
|
||||||
authority = (authority != NULL) ? authority + 3 : arg;
|
authority = (authority != NULL) ? authority + 3 : arg;
|
||||||
a = arg + strlen(arg);
|
a = arg + strlen(arg);
|
||||||
while (a > authority && a[-1] != ':' && a[-1] != '@')
|
while (a > authority && a[-1] != ':' && a[-1] != '@' && a[-1] != ']')
|
||||||
a--;
|
a--;
|
||||||
if (a > authority && a[-1] == ':') {
|
if (a > authority && a[-1] == ':') {
|
||||||
int p = -1;
|
*port = parse_proxy_port(a, arg);
|
||||||
|
|
||||||
sscanf(a, "%d", &p);
|
|
||||||
*port = (p > 0) ? p : proxy_default_port(arg);
|
|
||||||
namelen = (size_t) (a - 1 - arg);
|
namelen = (size_t) (a - 1 - arg);
|
||||||
} else {
|
} else {
|
||||||
*port = proxy_default_port(arg);
|
*port = proxy_default_port(arg);
|
||||||
@@ -5074,50 +5095,164 @@ HTSEXT_API int check_hostname_dns(const char *const hostname) {
|
|||||||
return hts_dns_resolve_nocache(hostname, &buffer) != NULL;
|
return hts_dns_resolve_nocache(hostname, &buffer) != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Needs locking
|
/* A resolve in flight. Refcounted: a timed-out resolve is abandoned, not
|
||||||
// Internal DNS cache. Fill out[0..count-1] with up to max addresses for _iadr,
|
cancelled, so the last of caller/worker to leave frees the job. */
|
||||||
// resolving (and caching the full list) on a miss. Returns the count.
|
typedef struct dns_resolve_job {
|
||||||
static int hts_dns_resolve_list_(httrackp *opt, const char *_iadr,
|
htsmutex lock;
|
||||||
SOCaddr *const out, const int max,
|
int refcount;
|
||||||
const char **error) {
|
hts_boolean done;
|
||||||
char BIGSTK iadr[HTS_URLMAXSIZE * 2];
|
char *hostname;
|
||||||
coucal cache = hts_cache(opt); // le cache dns
|
SOCaddr addr[HTS_MAXADDRNUM];
|
||||||
int count;
|
int count;
|
||||||
|
const char *error;
|
||||||
|
} dns_resolve_job;
|
||||||
|
|
||||||
|
/* Copy the first min(count, max) addresses of src into dest. */
|
||||||
|
static void dns_copy_addrs(SOCaddr *dest, SOCaddr *src, int count, int max) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < count && i < max; i++)
|
||||||
|
SOCaddr_copy_SOCaddr(dest[i], src[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dns_job_release(dns_resolve_job *job) {
|
||||||
|
hts_boolean last;
|
||||||
|
|
||||||
|
hts_mutexlock(&job->lock);
|
||||||
|
last = (--job->refcount == 0) ? HTS_TRUE : HTS_FALSE;
|
||||||
|
hts_mutexrelease(&job->lock);
|
||||||
|
if (last) {
|
||||||
|
hts_mutexfree(&job->lock);
|
||||||
|
freet(job->hostname);
|
||||||
|
freet(job);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Outlives a timed-out resolve, so it writes only the job: never opt (freed
|
||||||
|
before the thread wait at exit) nor the DNS cache. */
|
||||||
|
static void dns_resolve_thread(void *arg) {
|
||||||
|
dns_resolve_job *const job = (dns_resolve_job *) arg;
|
||||||
|
SOCaddr resolved[HTS_MAXADDRNUM];
|
||||||
|
const char *error = NULL;
|
||||||
|
const int count = hts_dns_resolve_nocache_list(job->hostname, resolved,
|
||||||
|
HTS_MAXADDRNUM, &error);
|
||||||
|
|
||||||
|
hts_mutexlock(&job->lock);
|
||||||
|
dns_copy_addrs(job->addr, resolved, count, HTS_MAXADDRNUM);
|
||||||
|
job->count = count;
|
||||||
|
job->error = error;
|
||||||
|
job->done = HTS_TRUE; /* published last: gates the caller's read of addr[] */
|
||||||
|
hts_mutexrelease(&job->lock);
|
||||||
|
dns_job_release(job);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Resolve hostname on a worker thread, giving up after timeout seconds.
|
||||||
|
Returns the address count, or -1 on timeout -- distinct from 0 ("does not
|
||||||
|
resolve"), which is a real answer and gets negative-cached. */
|
||||||
|
static int hts_dns_resolve_nocache_list_bounded(const char *hostname,
|
||||||
|
SOCaddr *const out,
|
||||||
|
const int max,
|
||||||
|
const int timeout,
|
||||||
|
const char **error) {
|
||||||
|
dns_resolve_job *job;
|
||||||
|
TStamp deadline;
|
||||||
|
int count = -1;
|
||||||
|
int poll_ms = 1;
|
||||||
|
|
||||||
|
if (timeout <= 0) /* no bound asked for (--timeout 0) */
|
||||||
|
return hts_dns_resolve_nocache_list(hostname, out, max, error);
|
||||||
|
|
||||||
|
job = calloct(1, sizeof(*job));
|
||||||
|
assertf(job != NULL);
|
||||||
|
hts_mutexinit(&job->lock);
|
||||||
|
job->hostname = strdupt(hostname);
|
||||||
|
job->refcount = 2; /* this caller + the worker */
|
||||||
|
if (hts_newthread(dns_resolve_thread, job) != 0) {
|
||||||
|
job->refcount = 1; /* no worker: fall back to resolving inline */
|
||||||
|
dns_job_release(job);
|
||||||
|
return hts_dns_resolve_nocache_list(hostname, out, max, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
deadline = mtime_local() + (TStamp) timeout * 1000;
|
||||||
|
for (;;) {
|
||||||
|
hts_boolean done;
|
||||||
|
|
||||||
|
hts_mutexlock(&job->lock);
|
||||||
|
done = job->done;
|
||||||
|
if (done) {
|
||||||
|
count = job->count;
|
||||||
|
dns_copy_addrs(out, job->addr, count, max);
|
||||||
|
if (error != NULL)
|
||||||
|
*error = job->error;
|
||||||
|
}
|
||||||
|
hts_mutexrelease(&job->lock);
|
||||||
|
if (done || mtime_local() >= deadline)
|
||||||
|
break;
|
||||||
|
Sleep(poll_ms);
|
||||||
|
if (poll_ms < 50) /* short first polls keep a fast resolve fast */
|
||||||
|
poll_ms *= 2;
|
||||||
|
}
|
||||||
|
dns_job_release(job);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
int hts_dns_resolve_all(httrackp *opt, const char *iadr, SOCaddr *out, int max,
|
||||||
|
const char **error) {
|
||||||
|
char BIGSTK host[HTS_URLMAXSIZE * 2];
|
||||||
|
SOCaddr resolved[HTS_MAXADDRNUM];
|
||||||
|
coucal cache;
|
||||||
|
int count, i;
|
||||||
|
|
||||||
assertf(opt != NULL);
|
assertf(opt != NULL);
|
||||||
assertf(_iadr != NULL);
|
|
||||||
assertf(out != NULL);
|
assertf(out != NULL);
|
||||||
|
if (!strnotempty(iadr) || max <= 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
strcpybuff(iadr, jump_identification_const(_iadr));
|
/* cache key and resolver input: identification and any ":port" stripped */
|
||||||
// couper éventuel :
|
strcpybuff(host, jump_identification_const(iadr));
|
||||||
{
|
{
|
||||||
char *a;
|
char *a;
|
||||||
|
|
||||||
if ((a = jump_toport(iadr)))
|
if ((a = jump_toport(host)))
|
||||||
*a = '\0';
|
*a = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get IP from the dns cache */
|
hts_mutexlock(&opt->state.lock);
|
||||||
count = hts_ghbn_all(cache, iadr, out, max);
|
cache = hts_cache(opt);
|
||||||
|
#if HTS_INET6 != 0
|
||||||
|
hts_resolver_check_env(); /* settle the backend before a worker reads it */
|
||||||
|
#endif
|
||||||
|
count = hts_ghbn_all(cache, host, out, max);
|
||||||
|
hts_mutexrelease(&opt->state.lock);
|
||||||
if (count >= 0) { // cache hit (0 == negative-cached)
|
if (count >= 0) { // cache hit (0 == negative-cached)
|
||||||
return count;
|
return count;
|
||||||
} else { // non présent dans le cache dns, tester
|
}
|
||||||
SOCaddr resolved[HTS_MAXADDRNUM];
|
|
||||||
t_dnscache *record;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
#if DEBUGDNS
|
#if DEBUGDNS
|
||||||
printf("resolving (not cached) %s\n", iadr);
|
printf("resolving (not cached) %s\n", host);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
count = hts_dns_resolve_nocache_list(iadr, resolved, HTS_MAXADDRNUM, error);
|
/* Resolve with no lock held: getaddrinfo can block for a long time, and
|
||||||
|
state.lock also gates the stop request (#606). */
|
||||||
|
count = hts_dns_resolve_nocache_list_bounded(host, resolved, HTS_MAXADDRNUM,
|
||||||
|
opt->timeout, error);
|
||||||
|
|
||||||
#if HTS_WIDE_DEBUG
|
#if HTS_WIDE_DEBUG
|
||||||
DEBUG_W("gethostbyname done\n");
|
DEBUG_W("gethostbyname done\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* attempt to store new entry (coucal owns it and dups the host key) */
|
if (count < 0) { /* timed out: no answer to cache, and none to report */
|
||||||
record = malloct(sizeof(t_dnscache));
|
if (error != NULL)
|
||||||
|
*error = "host name resolution timed out";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
hts_mutexlock(&opt->state.lock);
|
||||||
|
{ /* store the full list (coucal owns the record and dups the host key; a
|
||||||
|
concurrent resolve of the same host replaces, and frees, this one) */
|
||||||
|
t_dnscache *const record = malloct(sizeof(t_dnscache));
|
||||||
|
|
||||||
if (record != NULL) {
|
if (record != NULL) {
|
||||||
memset(record, 0, sizeof(*record));
|
memset(record, 0, sizeof(*record));
|
||||||
record->host_count = count;
|
record->host_count = count;
|
||||||
@@ -5127,28 +5262,13 @@ static int hts_dns_resolve_list_(httrackp *opt, const char *_iadr,
|
|||||||
memcpy(record->host_addr[i], &SOCaddr_sockaddr(resolved[i]),
|
memcpy(record->host_addr[i], &SOCaddr_sockaddr(resolved[i]),
|
||||||
record->host_length[i]);
|
record->host_length[i]);
|
||||||
}
|
}
|
||||||
coucal_add_pvoid(cache, iadr, record);
|
coucal_add_pvoid(cache, host, record);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copy result to caller (cache store may have failed; result still valid)
|
|
||||||
*/
|
|
||||||
for (i = 0; i < count && i < max; i++) {
|
|
||||||
SOCaddr_copy_SOCaddr(out[i], resolved[i]);
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
} // retour hp du cache
|
|
||||||
}
|
|
||||||
|
|
||||||
int hts_dns_resolve_all(httrackp *opt, const char *iadr, SOCaddr *out, int max,
|
|
||||||
const char **error) {
|
|
||||||
int count;
|
|
||||||
|
|
||||||
if (!strnotempty(iadr) || max <= 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
hts_mutexlock(&opt->state.lock);
|
|
||||||
count = hts_dns_resolve_list_(opt, iadr, out, max, error);
|
|
||||||
hts_mutexrelease(&opt->state.lock);
|
hts_mutexrelease(&opt->state.lock);
|
||||||
|
|
||||||
|
/* copy result to caller (cache store may have failed; result still valid) */
|
||||||
|
dns_copy_addrs(out, resolved, count, max);
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ typedef struct lien_adrfilsave lien_adrfilsave;
|
|||||||
|
|
||||||
/* définitions globales */
|
/* définitions globales */
|
||||||
#include "htsglobal.h"
|
#include "htsglobal.h"
|
||||||
|
#include "htsurlport.h"
|
||||||
|
|
||||||
/* basic net definitions */
|
/* basic net definitions */
|
||||||
#include "htsbase.h"
|
#include "htsbase.h"
|
||||||
@@ -210,6 +211,9 @@ int check_writeinput_t(T_SOC soc, int timeout);
|
|||||||
/* TRUE if this -P proxy name (which keeps its scheme) is a SOCKS5 proxy. */
|
/* TRUE if this -P proxy name (which keeps its scheme) is a SOCKS5 proxy. */
|
||||||
hts_boolean hts_proxy_is_socks(const char *name);
|
hts_boolean hts_proxy_is_socks(const char *name);
|
||||||
|
|
||||||
|
/* TRUE if this -P proxy name is a "connect://" CONNECT-only proxy (#564). */
|
||||||
|
hts_boolean hts_proxy_is_connect(const char *name);
|
||||||
|
|
||||||
void treathead(t_cookie * cookie, const char *adr, const char *fil, htsblk * retour,
|
void treathead(t_cookie * cookie, const char *adr, const char *fil, htsblk * retour,
|
||||||
char *rcvd);
|
char *rcvd);
|
||||||
void treatfirstline(htsblk * retour, const char *rcvd);
|
void treatfirstline(htsblk * retour, const char *rcvd);
|
||||||
@@ -219,7 +223,8 @@ LLint http_xfread1(htsblk * r, int bufl);
|
|||||||
/* Cached resolver: fill out[0..count-1] with up to max addresses for iadr (in
|
/* Cached resolver: fill out[0..count-1] with up to max addresses for iadr (in
|
||||||
resolver order), returning the count (0 = does not resolve, negative-cached).
|
resolver order), returning the count (0 = does not resolve, negative-cached).
|
||||||
Resolves once per host; later calls read the DNS cache. Must hold no lock
|
Resolves once per host; later calls read the DNS cache. Must hold no lock
|
||||||
(brackets opt->state.lock itself). */
|
(brackets opt->state.lock itself, never across the resolve). A miss resolves
|
||||||
|
on a worker thread bounded by opt->timeout; a timeout reports 0, uncached. */
|
||||||
int hts_dns_resolve_all(httrackp *opt, const char *iadr, SOCaddr *out, int max,
|
int hts_dns_resolve_all(httrackp *opt, const char *iadr, SOCaddr *out, int max,
|
||||||
const char **error);
|
const char **error);
|
||||||
HTS_INLINE SOCaddr *hts_dns_resolve2(httrackp *opt, const char *iadr,
|
HTS_INLINE SOCaddr *hts_dns_resolve2(httrackp *opt, const char *iadr,
|
||||||
|
|||||||
@@ -1532,8 +1532,30 @@ int url_savename(lien_adrfilsave *const afs,
|
|||||||
// last segment
|
// last segment
|
||||||
wsave[j++] = '/';
|
wsave[j++] = '/';
|
||||||
#define MAX_UTF8_SEQ_CHARS 4
|
#define MAX_UTF8_SEQ_CHARS 4
|
||||||
for(i = lastSeg; wsave[i] != '\0' && j < maxLen; i++) {
|
{
|
||||||
wsave[j++] = wsave[i];
|
// #623: the ".delayed" placeholder marker sits at the tail; cutting
|
||||||
|
// through it drops IS_DELAYED_EXT, so the file is never renamed to its
|
||||||
|
// final name. Reserve the trailing ".<id>.delayed" across the cut.
|
||||||
|
size_t markStart = wsaveLen;
|
||||||
|
if (IS_DELAYED_EXT(afs->save)) {
|
||||||
|
const size_t extDot = wsaveLen - strlen("." DELAYED_EXT);
|
||||||
|
size_t p = extDot; /* walk back over a dot-separated ".<hexid>" tag */
|
||||||
|
|
||||||
|
while (p > lastSeg && ((wsave[p - 1] >= '0' && wsave[p - 1] <= '9') ||
|
||||||
|
(wsave[p - 1] >= 'a' && wsave[p - 1] <= 'f')))
|
||||||
|
p--;
|
||||||
|
// keep the tag only if truly ".<hexid>.delayed"; else the bare marker
|
||||||
|
// (a wholly-hex base, e.g. a hashed #133 name, must not be absorbed)
|
||||||
|
markStart = (p > lastSeg && p < extDot && wsave[p - 1] == '.')
|
||||||
|
? p - 1
|
||||||
|
: extDot;
|
||||||
|
}
|
||||||
|
// head, bounded so the marker still fits, then the marker itself
|
||||||
|
for (i = lastSeg; i < markStart && j + (wsaveLen - markStart) < maxLen;
|
||||||
|
i++)
|
||||||
|
wsave[j++] = wsave[i];
|
||||||
|
for (i = markStart; i < wsaveLen && j < maxLen; i++)
|
||||||
|
wsave[j++] = wsave[i];
|
||||||
}
|
}
|
||||||
// terminating \0
|
// terminating \0
|
||||||
wsave[j++] = '\0';
|
wsave[j++] = '\0';
|
||||||
|
|||||||
@@ -315,6 +315,43 @@ static void escape_url_parens(char *const s, const size_t size) {
|
|||||||
strlcpybuff(s, buff, size);
|
strlcpybuff(s, buff, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Strip a default ":80" from lien's authority in place. Any spelling that
|
||||||
|
range-parses to 80 (":80", ":080") is dropped by its matched length, not a
|
||||||
|
hardcoded 3 chars; a value that merely wraps to 80 as an int (#614) stays. */
|
||||||
|
void hts_strip_default_port(char *lien, size_t size) {
|
||||||
|
char *a;
|
||||||
|
|
||||||
|
if (!link_has_authority(lien))
|
||||||
|
return;
|
||||||
|
a = strstr(lien, "//"); // "//" authority
|
||||||
|
if (a)
|
||||||
|
a += 2;
|
||||||
|
else
|
||||||
|
a = lien;
|
||||||
|
a = jump_toport(a);
|
||||||
|
if (a) { // port present
|
||||||
|
char *b = a + 1;
|
||||||
|
char saved;
|
||||||
|
int port;
|
||||||
|
hts_boolean is_default;
|
||||||
|
|
||||||
|
while (isdigit((unsigned char) *b))
|
||||||
|
b++;
|
||||||
|
saved = *b;
|
||||||
|
*b = '\0';
|
||||||
|
is_default = hts_parse_url_port(a + 1, &port) && port == 80;
|
||||||
|
*b = saved;
|
||||||
|
if (is_default) { // default port, strip it
|
||||||
|
char BIGSTK tempo[HTS_URLMAXSIZE * 2];
|
||||||
|
|
||||||
|
tempo[0] = '\0';
|
||||||
|
strncatbuff(tempo, lien, a - lien);
|
||||||
|
strcatbuff(tempo, b); // skip the whole matched :port
|
||||||
|
strlcpybuff(lien, tempo, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Main parser */
|
/* Main parser */
|
||||||
int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
||||||
char catbuff[CATBUFF_SIZE];
|
char catbuff[CATBUFF_SIZE];
|
||||||
@@ -2138,38 +2175,8 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
} while((b != a) && (b));
|
} while((b != a) && (b));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// éliminer les éventuels :80 (port par défaut!)
|
// drop a default :80 port from the authority
|
||||||
if (link_has_authority(lien)) {
|
hts_strip_default_port(lien, sizeof(lien));
|
||||||
char *a;
|
|
||||||
|
|
||||||
a = strstr(lien, "//"); // "//" authority
|
|
||||||
if (a)
|
|
||||||
a += 2;
|
|
||||||
else
|
|
||||||
a = lien;
|
|
||||||
a = jump_toport(a);
|
|
||||||
if (a) { // port
|
|
||||||
int port = 0;
|
|
||||||
int defport = 80;
|
|
||||||
char *b = a + 1;
|
|
||||||
|
|
||||||
#if HTS_USEOPENSSL
|
|
||||||
#endif
|
|
||||||
while(isdigit((unsigned char) *b)) {
|
|
||||||
port *= 10;
|
|
||||||
port += (int) (*b - '0');
|
|
||||||
b++;
|
|
||||||
}
|
|
||||||
if (port == defport) { // port 80, default - c'est débile
|
|
||||||
char BIGSTK tempo[HTS_URLMAXSIZE * 2];
|
|
||||||
|
|
||||||
tempo[0] = '\0';
|
|
||||||
strncatbuff(tempo, lien, a - lien);
|
|
||||||
strcatbuff(tempo, a + 3); // sauter :80
|
|
||||||
strcpybuff(lien, tempo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// filtrer les parazites (mailto & cie)
|
// filtrer les parazites (mailto & cie)
|
||||||
/*
|
/*
|
||||||
if (strfield(lien,"mailto:")) { // ne pas traiter
|
if (strfield(lien,"mailto:")) { // ne pas traiter
|
||||||
|
|||||||
@@ -106,6 +106,10 @@ struct htsmoduleStructExtended {
|
|||||||
*/
|
*/
|
||||||
int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre);
|
int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre);
|
||||||
|
|
||||||
|
/* Strip a default ":80" (any spelling) from an absolute link's authority, in
|
||||||
|
place into a buffer of the given size. */
|
||||||
|
void hts_strip_default_port(char *lien, size_t size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Check for 301,302.. errors ("moved") and handle them; re-isuue requests, make
|
Check for 301,302.. errors ("moved") and handle them; re-isuue requests, make
|
||||||
rediretc file, handle filters considerations..
|
rediretc file, handle filters considerations..
|
||||||
|
|||||||
@@ -90,12 +90,15 @@ int http_proxy_tunnel(httrackp *opt, htsblk *retour, const char *adr,
|
|||||||
if (soc == INVALID_SOCKET)
|
if (soc == INVALID_SOCKET)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// CONNECT needs an explicit host:port; default the https port
|
// CONNECT needs an explicit host:port; default :80 for http, :443 for https
|
||||||
authority[0] = '\0';
|
authority[0] = '\0';
|
||||||
if (portsep != NULL)
|
if (portsep != NULL)
|
||||||
strlcatbuff(authority, host, sizeof(authority)); // already host:port
|
strlcatbuff(authority, host, sizeof(authority)); // already host:port
|
||||||
else
|
else {
|
||||||
snprintf(authority, sizeof(authority), "%s:%d", host, 443);
|
const int defport = (strncmp(adr, "https://", 8) == 0) ? 443 : 80;
|
||||||
|
|
||||||
|
snprintf(authority, sizeof(authority), "%s:%d", host, defport);
|
||||||
|
}
|
||||||
|
|
||||||
// backstop: never let a stray CR/LF in the host smuggle a second line into
|
// backstop: never let a stray CR/LF in the host smuggle a second line into
|
||||||
// the CONNECT request (the host is already sanitized upstream)
|
// the CONNECT request (the host is already sanitized upstream)
|
||||||
@@ -132,7 +135,7 @@ int http_proxy_tunnel(httrackp *opt, htsblk *retour, const char *adr,
|
|||||||
}
|
}
|
||||||
strlcatbuff(req, H_CRLF, sizeof(req)); // end of request headers
|
strlcatbuff(req, H_CRLF, sizeof(req)); // end of request headers
|
||||||
|
|
||||||
// raw send: ssl is set, so sendc() would route to TLS
|
// raw send(): sendc() would route to TLS when ssl is set (https tunnel)
|
||||||
{
|
{
|
||||||
const char *p = req;
|
const char *p = req;
|
||||||
size_t remain = strlen(req);
|
size_t remain = strlen(req);
|
||||||
@@ -488,14 +491,11 @@ static int socks5_handshake_stream(httrackp *opt, socks5_stream *st,
|
|||||||
if ((unsigned char) host[i] < ' ')
|
if ((unsigned char) host[i] < ' ')
|
||||||
return socks5_fail(msg, msgsize, "SOCKS5: invalid origin host");
|
return socks5_fail(msg, msgsize, "SOCKS5: invalid origin host");
|
||||||
}
|
}
|
||||||
if (portsep != NULL) {
|
// the old range check ran after sscanf("%d") had wrapped a huge value into a
|
||||||
int p = -1;
|
// plausible port (#614). An empty "host:" stays refused here, unlike the
|
||||||
|
// direct path, as it was before #614.
|
||||||
sscanf(portsep + 1, "%d", &p);
|
if (portsep != NULL && !hts_parse_url_port(portsep + 1, &port))
|
||||||
if (p <= 0 || p > 65535)
|
return socks5_fail(msg, msgsize, "SOCKS5: invalid origin port");
|
||||||
return socks5_fail(msg, msgsize, "SOCKS5: invalid origin port");
|
|
||||||
port = p;
|
|
||||||
}
|
|
||||||
if (link_has_authorization(proxy_name)) {
|
if (link_has_authorization(proxy_name)) {
|
||||||
if (!socks5_credentials(opt, proxy_name, user, sizeof(user), &userlen, pass,
|
if (!socks5_credentials(opt, proxy_name, user, sizeof(user), &userlen, pass,
|
||||||
sizeof(pass), &passlen, msg, msgsize))
|
sizeof(pass), &passlen, msg, msgsize))
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ Please visit our Website: http://www.httrack.com
|
|||||||
#include "htscore.h"
|
#include "htscore.h"
|
||||||
#include "htsdefines.h"
|
#include "htsdefines.h"
|
||||||
#include "htslib.h"
|
#include "htslib.h"
|
||||||
|
#include "htsalias.h"
|
||||||
#include "htsparse.h"
|
#include "htsparse.h"
|
||||||
#include "htscache.h"
|
#include "htscache.h"
|
||||||
#include "htscache_selftest.h"
|
#include "htscache_selftest.h"
|
||||||
@@ -825,6 +826,21 @@ static int st_simplify(httrackp *opt, int argc, char **argv) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int st_expandhome(httrackp *opt, int argc, char **argv) {
|
||||||
|
String path = STRING_EMPTY;
|
||||||
|
|
||||||
|
(void) opt;
|
||||||
|
if (argc < 1) {
|
||||||
|
fprintf(stderr, "expandhome: needs a path\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
StringCopy(path, argv[0]);
|
||||||
|
expand_home(&path);
|
||||||
|
printf("expanded=%s\n", StringBuff(path));
|
||||||
|
StringFree(path);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int st_mime(httrackp *opt, int argc, char **argv) {
|
static int st_mime(httrackp *opt, int argc, char **argv) {
|
||||||
char mime[256];
|
char mime[256];
|
||||||
|
|
||||||
@@ -1365,9 +1381,12 @@ static int st_proxyurl(httrackp *opt, int argc, char **argv) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
hts_parse_proxy(argv[0], name, sizeof(name), &port);
|
hts_parse_proxy(argv[0], name, sizeof(name), &port);
|
||||||
// host= is what the connect actually resolves (scheme + user:pass stripped)
|
// host= is the resolved host (scheme/userinfo stripped); kind= the transport
|
||||||
printf("name=%s port=%d host=%s\n", name, port,
|
printf("name=%s port=%d host=%s kind=%s\n", name, port,
|
||||||
jump_identification_const(name));
|
jump_identification_const(name),
|
||||||
|
hts_proxy_is_socks(name) ? "socks"
|
||||||
|
: hts_proxy_is_connect(name) ? "connect"
|
||||||
|
: "http");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1450,6 +1469,25 @@ static int st_socks5(httrackp *opt, int argc, char **argv) {
|
|||||||
assertf(socks5_handshake_scripted(opt, "origin.test:8443", proxy, &io) == 1);
|
assertf(socks5_handshake_scripted(opt, "origin.test:8443", proxy, &io) == 1);
|
||||||
assertf(memcmp(io.sent + io.sent_len - 2, "\x20\xfb", 2) == 0);
|
assertf(memcmp(io.sent + io.sent_len - 2, "\x20\xfb", 2) == 0);
|
||||||
|
|
||||||
|
/* a bad origin port is refused before any byte goes out (#614). 4294967376 is
|
||||||
|
the case the old range check could not see: it overflowed the sscanf("%d")
|
||||||
|
into a plausible 80 and passed. 65616 would not prove anything here, since
|
||||||
|
it fits an int and the old check already caught it. */
|
||||||
|
{
|
||||||
|
static const char *const bad[] = {"origin.test:4294967376",
|
||||||
|
"origin.test:80x", "origin.test:+80",
|
||||||
|
"origin.test: 80", "origin.test:8.0"};
|
||||||
|
size_t k;
|
||||||
|
|
||||||
|
for (k = 0; k < sizeof(bad) / sizeof(bad[0]); k++) {
|
||||||
|
len = socks5_reply(script, 0x01, v4, sizeof(v4));
|
||||||
|
io.reply = script;
|
||||||
|
io.reply_len = len;
|
||||||
|
assertf(socks5_handshake_scripted(opt, bad[k], proxy, &io) == 0);
|
||||||
|
assertf(io.sent_len == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* credentials: split on the first colon of the escaped userinfo, so %3a stays
|
/* credentials: split on the first colon of the escaped userinfo, so %3a stays
|
||||||
inside the username and a colon in the password is not a delimiter */
|
inside the username and a colon in the password is not a delimiter */
|
||||||
{
|
{
|
||||||
@@ -1507,6 +1545,22 @@ static int st_socks5(httrackp *opt, int argc, char **argv) {
|
|||||||
assertf(io.sent_len == 0);
|
assertf(io.sent_len == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* the request is always ATYP=domain, which cannot carry an IPv6 literal: a
|
||||||
|
bracketed origin is rejected rather than sent as a bogus domain name. The
|
||||||
|
msg check pins the reason: a stricter host validator would also reject
|
||||||
|
these, but for the wrong cause. */
|
||||||
|
io.reply = script;
|
||||||
|
io.reply_len = len;
|
||||||
|
assertf(socks5_handshake_scripted(opt, "[::1]", proxy, &io) == 0);
|
||||||
|
assertf(io.sent_len == 0);
|
||||||
|
assertf(strstr(io.msg, "IPv6") != NULL);
|
||||||
|
io.reply = script;
|
||||||
|
io.reply_len = len;
|
||||||
|
assertf(socks5_handshake_scripted(opt, "[2001:db8::1]:8443", proxy, &io) ==
|
||||||
|
0);
|
||||||
|
assertf(io.sent_len == 0);
|
||||||
|
assertf(strstr(io.msg, "IPv6") != NULL);
|
||||||
|
|
||||||
printf("socks5 self-test OK\n");
|
printf("socks5 self-test OK\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1535,6 +1589,41 @@ static int st_identabs(httrackp *opt, int argc, char **argv) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Default-port strip (#627): a genuine 80 (any spelling) is removed by its
|
||||||
|
matched length, host preserved; a non-80 port or one that only wraps to 80 as
|
||||||
|
a 32-bit int (#614) is left intact. Guards the old bug where ":080"/":0080"
|
||||||
|
dropped a hardcoded 3 chars and glued the leftover digits onto the host. */
|
||||||
|
static int st_stripport(httrackp *opt, int argc, char **argv) {
|
||||||
|
static const struct {
|
||||||
|
const char *in, *out;
|
||||||
|
} cases[] = {
|
||||||
|
{"http://127.0.0.1:80/x", "http://127.0.0.1/x"},
|
||||||
|
{"http://127.0.0.1:080/x", "http://127.0.0.1/x"},
|
||||||
|
{"http://127.0.0.1:0080/x", "http://127.0.0.1/x"},
|
||||||
|
{"http://127.0.0.1:80", "http://127.0.0.1"},
|
||||||
|
{"http://127.0.0.1:0081/x", "http://127.0.0.1:0081/x"},
|
||||||
|
{"http://127.0.0.1:81/x", "http://127.0.0.1:81/x"},
|
||||||
|
{"http://127.0.0.1:8080/x", "http://127.0.0.1:8080/x"},
|
||||||
|
{"http://127.0.0.1:4294967376/x", "http://127.0.0.1:4294967376/x"},
|
||||||
|
{"http://127.0.0.1/x", "http://127.0.0.1/x"},
|
||||||
|
};
|
||||||
|
|
||||||
|
size_t k;
|
||||||
|
|
||||||
|
(void) opt;
|
||||||
|
(void) argc;
|
||||||
|
(void) argv;
|
||||||
|
for (k = 0; k < sizeof(cases) / sizeof(cases[0]); k++) {
|
||||||
|
char BIGSTK buff[HTS_URLMAXSIZE * 2];
|
||||||
|
|
||||||
|
strcpybuff(buff, cases[k].in);
|
||||||
|
hts_strip_default_port(buff, sizeof(buff));
|
||||||
|
assertf(strcmp(buff, cases[k].out) == 0);
|
||||||
|
}
|
||||||
|
printf("stripport self-test OK\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Extra args are key=value: adr= cdispo= statuscode= status= strip= urlhack=
|
/* Extra args are key=value: adr= cdispo= statuscode= status= strip= urlhack=
|
||||||
no-www= no-slash= no-query= n83= type=, plus repeatable prior=adr|fil|sav
|
no-www= no-slash= no-query= n83= type=, plus repeatable prior=adr|fil|sav
|
||||||
registering an already-crawled link (dedup/collision paths). */
|
registering an already-crawled link (dedup/collision paths). */
|
||||||
@@ -2057,6 +2146,52 @@ static int st_cache_corrupt(httrackp *opt, int argc, char **argv) {
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Drives unzRepair over a damaged local file header whose CRC field's high
|
||||||
|
16-bit word has bit 15 set. Before the READ_32 fix that shifted an int and
|
||||||
|
overflowed, so UBSan aborts here; after it, repair recovers the one entry. */
|
||||||
|
static int st_zip_repair_shift(httrackp *opt, int argc, char **argv) {
|
||||||
|
static const unsigned char zip[] = {
|
||||||
|
0x50, 0x4b, 0x03, 0x04, /* local file header signature */
|
||||||
|
0x14, 0x00, /* version needed */
|
||||||
|
0x00, 0x00, /* general purpose flag */
|
||||||
|
0x00, 0x00, /* method */
|
||||||
|
0x00, 0x00, /* time */
|
||||||
|
0x00, 0x00, /* date */
|
||||||
|
0x00, 0x00, 0xe8, 0x8a, /* crc: high word 0x8ae8, bit 15 set */
|
||||||
|
0x00, 0x00, 0x00, 0x00, /* compressed size */
|
||||||
|
0x00, 0x00, 0x00, 0x00, /* uncompressed size */
|
||||||
|
0x01, 0x00, /* filename length */
|
||||||
|
0x00, 0x00, /* extra field length */
|
||||||
|
0x61 /* filename "a" */
|
||||||
|
};
|
||||||
|
char in[HTS_URLMAXSIZE], out[HTS_URLMAXSIZE], tmp[HTS_URLMAXSIZE];
|
||||||
|
uLong nrec = 0, bytes = 0;
|
||||||
|
FILE *fp;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
(void) opt;
|
||||||
|
if (argc < 1) {
|
||||||
|
fprintf(stderr, "zip-repair-shift: needs a directory\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
snprintf(in, sizeof(in), "%s/damaged.zip", argv[0]);
|
||||||
|
snprintf(out, sizeof(out), "%s/repair.zip", argv[0]);
|
||||||
|
snprintf(tmp, sizeof(tmp), "%s/repair.tmp", argv[0]);
|
||||||
|
fp = fopen(in, "wb");
|
||||||
|
if (fp == NULL || fwrite(zip, 1, sizeof(zip), fp) != sizeof(zip)) {
|
||||||
|
if (fp != NULL)
|
||||||
|
fclose(fp);
|
||||||
|
fprintf(stderr, "zip-repair-shift: cannot write %s\n", in);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
err = unzRepair(in, out, tmp, &nrec, &bytes);
|
||||||
|
printf("zip-repair-shift: %s (recovered %lu entr%s)\n",
|
||||||
|
(err == Z_OK && nrec == 1) ? "OK" : "FAIL", (unsigned long) nrec,
|
||||||
|
nrec == 1 ? "y" : "ies");
|
||||||
|
return (err == Z_OK && nrec == 1) ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int st_cache_legacy(httrackp *opt, int argc, char **argv) {
|
static int st_cache_legacy(httrackp *opt, int argc, char **argv) {
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
@@ -2090,6 +2225,15 @@ static int st_dns(httrackp *opt, int argc, char **argv) {
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int st_dnstimeout(httrackp *opt, int argc, char **argv) {
|
||||||
|
const int err = dns_timeout_selftests(opt);
|
||||||
|
|
||||||
|
(void) argc;
|
||||||
|
(void) argv;
|
||||||
|
printf("dns-timeout-selftest: %s\n", err ? "FAIL" : "OK");
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
static int st_cookies(httrackp *opt, int argc, char **argv) {
|
static int st_cookies(httrackp *opt, int argc, char **argv) {
|
||||||
static t_cookie cookie;
|
static t_cookie cookie;
|
||||||
char hdr[1024];
|
char hdr[1024];
|
||||||
@@ -2414,6 +2558,45 @@ static int st_makeindex(httrackp *opt, int argc, char **argv) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// hts_buildtopindex takes a system-charset path but verif_backblue() below it
|
||||||
|
// expects utf-8, so on Windows a non-ASCII project dir gets the gifs written to
|
||||||
|
// a mangled twin (issues #216/#217). argv[0] is a writable dir.
|
||||||
|
static int st_topindex(httrackp *opt, int argc, char **argv) {
|
||||||
|
char projdir[HTS_URLMAXSIZE];
|
||||||
|
char path[HTS_URLMAXSIZE + 16]; /* projdir plus a basename */
|
||||||
|
#ifdef _WIN32
|
||||||
|
/* the GUI hands hts_buildtopindex an ANSI path; mimic it. CP1252 'cafe' */
|
||||||
|
static const char *const projName = "caf\xE9";
|
||||||
|
#else
|
||||||
|
/* POSIX system charset is UTF-8 */
|
||||||
|
static const char *const projName = "caf\xC3\xA9";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
assertf(argc >= 1);
|
||||||
|
snprintf(projdir, sizeof(projdir), "%s/%s", argv[0], projName);
|
||||||
|
|
||||||
|
/* structcheck(), not the utf-8 MKDIR family: same charset as buildtopindex */
|
||||||
|
snprintf(path, sizeof(path), "%s/", projdir);
|
||||||
|
assertf(structcheck(path) == 0);
|
||||||
|
|
||||||
|
/* returns 0 here: the dir holds no sub-project, only the gifs matter */
|
||||||
|
(void) hts_buildtopindex(opt, projdir, "");
|
||||||
|
|
||||||
|
/* the gifs must land in the project dir itself, not in a mangled sibling */
|
||||||
|
snprintf(path, sizeof(path), "%s/backblue.gif", projdir);
|
||||||
|
assertf(fexist(path));
|
||||||
|
|
||||||
|
/* raw unlink/rmdir: UNLINK is utf-8 on Windows, these paths aren't */
|
||||||
|
unlink(path);
|
||||||
|
snprintf(path, sizeof(path), "%s/fade.gif", projdir);
|
||||||
|
unlink(path);
|
||||||
|
snprintf(path, sizeof(path), "%s/index.html", projdir);
|
||||||
|
unlink(path);
|
||||||
|
rmdir(projdir);
|
||||||
|
printf("topindex self-test OK\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Each inplace_escape_*() must equal escape_*() on a copy. */
|
/* Each inplace_escape_*() must equal escape_*() on a copy. */
|
||||||
static int st_inplace_escape(httrackp *opt, int argc, char **argv) {
|
static int st_inplace_escape(httrackp *opt, int argc, char **argv) {
|
||||||
/* >255 bytes forces the helper's malloct path, not the stack buffer */
|
/* >255 bytes forces the helper's malloct path, not the stack buffer */
|
||||||
@@ -3051,6 +3234,7 @@ static const struct selftest_entry {
|
|||||||
{"filterbounds", "", "matcher length/work caps reject hostile patterns",
|
{"filterbounds", "", "matcher length/work caps reject hostile patterns",
|
||||||
st_filterbounds},
|
st_filterbounds},
|
||||||
{"simplify", "<path>", "collapse ./ and ../ in a path", st_simplify},
|
{"simplify", "<path>", "collapse ./ and ../ in a path", st_simplify},
|
||||||
|
{"expandhome", "<path>", "expand a leading ~/ into $HOME", st_expandhome},
|
||||||
{"stripquery", "", "--strip-query pattern/key stripping self-test",
|
{"stripquery", "", "--strip-query pattern/key stripping self-test",
|
||||||
st_stripquery},
|
st_stripquery},
|
||||||
{"urlhack", "", "-%u url-hack sub-flag (www/slash/query) self-test",
|
{"urlhack", "", "-%u url-hack sub-flag (www/slash/query) self-test",
|
||||||
@@ -3086,6 +3270,8 @@ static const struct selftest_entry {
|
|||||||
st_socks5},
|
st_socks5},
|
||||||
{"identabs", "", "ident_url_absolute one-byte fil[] overflow self-test",
|
{"identabs", "", "ident_url_absolute one-byte fil[] overflow self-test",
|
||||||
st_identabs},
|
st_identabs},
|
||||||
|
{"stripport", "", "default :80 port strip preserves host (#627)",
|
||||||
|
st_stripport},
|
||||||
{"header", "<raw-header-line> ...", "response header-line parsing",
|
{"header", "<raw-header-line> ...", "response header-line parsing",
|
||||||
st_header},
|
st_header},
|
||||||
{"headerlong", "[header-name:]",
|
{"headerlong", "[header-name:]",
|
||||||
@@ -3113,11 +3299,19 @@ static const struct selftest_entry {
|
|||||||
st_cache_legacy},
|
st_cache_legacy},
|
||||||
{"cache-corrupt", "<dir>", "cache read-side corruption self-test",
|
{"cache-corrupt", "<dir>", "cache read-side corruption self-test",
|
||||||
st_cache_corrupt},
|
st_cache_corrupt},
|
||||||
|
{"zip-repair-shift", "<dir>",
|
||||||
|
"cache zip-repair header read must not overflow a signed shift",
|
||||||
|
st_zip_repair_shift},
|
||||||
{"dns", "", "DNS resolver/cache self-test", st_dns},
|
{"dns", "", "DNS resolver/cache self-test", st_dns},
|
||||||
|
{"dnstimeout", "", "a slow DNS resolve is bounded and holds no lock",
|
||||||
|
st_dnstimeout},
|
||||||
{"cookies", "", "cookie request-header self-test", st_cookies},
|
{"cookies", "", "cookie request-header self-test", st_cookies},
|
||||||
{"useragent", "", "default User-Agent self-test", st_useragent},
|
{"useragent", "", "default User-Agent self-test", st_useragent},
|
||||||
{"makeindex", "[dir]", "hts_finish_makeindex footer/refresh self-test",
|
{"makeindex", "[dir]", "hts_finish_makeindex footer/refresh self-test",
|
||||||
st_makeindex},
|
st_makeindex},
|
||||||
|
{"topindex", "[dir]",
|
||||||
|
"hts_buildtopindex charset handling of a non-ASCII project dir",
|
||||||
|
st_topindex},
|
||||||
{"inplace-escape", "", "inplace_escape_* vs escape_* equivalence self-test",
|
{"inplace-escape", "", "inplace_escape_* vs escape_* equivalence self-test",
|
||||||
st_inplace_escape},
|
st_inplace_escape},
|
||||||
{"escape-room", "", "HT_ADD_HTMLESCAPED* reservation-factor self-test",
|
{"escape-room", "", "HT_ADD_HTMLESCAPED* reservation-factor self-test",
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ Please visit our Website: http://www.httrack.com
|
|||||||
|
|
||||||
#include "htsnet.h"
|
#include "htsnet.h"
|
||||||
#include "htslib.h"
|
#include "htslib.h"
|
||||||
|
#include "htscharset.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -749,7 +750,14 @@ int smallserver(T_SOC soc, char *url, char *method, char *data, char *path) {
|
|||||||
RUN THE SERVER
|
RUN THE SERVER
|
||||||
*/
|
*/
|
||||||
if (strcmp((char *) adrcd, "start") == 0) {
|
if (strcmp((char *) adrcd, "start") == 0) {
|
||||||
webhttrack_main((char *) adr + p);
|
/* POST body is in the form's charset, not the
|
||||||
|
UTF-8 argv the engine now assumes (#629). */
|
||||||
|
char *const cmdl = (char *) adr + p;
|
||||||
|
char *cmdlUtf8 = hts_convertStringToUTF8(
|
||||||
|
cmdl, strlen(cmdl), LANGSEL("LANGUAGE_CHARSET"));
|
||||||
|
|
||||||
|
webhttrack_main(cmdlUtf8 != NULL ? cmdlUtf8 : cmdl);
|
||||||
|
freet(cmdlUtf8);
|
||||||
} else {
|
} else {
|
||||||
commandRunning = 0;
|
commandRunning = 0;
|
||||||
commandEnd = 1;
|
commandEnd = 1;
|
||||||
|
|||||||
@@ -164,13 +164,12 @@ HTS_UNUSED static int linputsoc_t(T_SOC soc, char *s, int max, int timeout) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Same contract as hts_gethome(), which is hidden and out of reach from here */
|
||||||
static const char *gethomedir(void) {
|
static const char *gethomedir(void) {
|
||||||
const char *home = getenv("HOME");
|
const char *home = getenv("HOME");
|
||||||
|
|
||||||
if (home)
|
/* An empty $HOME would put the base path and httrack.ini at the root */
|
||||||
return home;
|
return strnotempty(home) ? home : ".";
|
||||||
else
|
|
||||||
return ".";
|
|
||||||
}
|
}
|
||||||
static int linput_cpp(FILE * fp, char *s, int max) {
|
static int linput_cpp(FILE * fp, char *s, int max) {
|
||||||
int rlen = 0;
|
int rlen = 0;
|
||||||
|
|||||||
@@ -896,7 +896,20 @@ HTSEXT_API int hts_buildtopindex(httrackp * opt, const char *path,
|
|||||||
if (fpo) {
|
if (fpo) {
|
||||||
find_handle h;
|
find_handle h;
|
||||||
|
|
||||||
verif_backblue(opt, concat(catbuff, sizeof(catbuff), rpath, "/")); // générer gif
|
// générer gif. verif_backblue() is utf-8, but our path is the system
|
||||||
|
// charset, so on Windows convert it or the gifs land in a mangled twin
|
||||||
|
// dir (#217). Elsewhere the system charset is already utf-8.
|
||||||
|
#ifdef _WIN32
|
||||||
|
{
|
||||||
|
const char *const base = concat(catbuff, sizeof(catbuff), rpath, "/");
|
||||||
|
char *const base_utf8 =
|
||||||
|
hts_convertStringSystemToUTF8(base, strlen(base));
|
||||||
|
verif_backblue(opt, base_utf8 != NULL ? base_utf8 : base);
|
||||||
|
free(base_utf8);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
verif_backblue(opt, concat(catbuff, sizeof(catbuff), rpath, "/"));
|
||||||
|
#endif
|
||||||
// Header
|
// Header
|
||||||
hts_template_format(fpo, toptemplate_header,
|
hts_template_format(fpo, toptemplate_header,
|
||||||
"<!-- Mirror and index made by HTTrack Website Copier/"
|
"<!-- Mirror and index made by HTTrack Website Copier/"
|
||||||
|
|||||||
50
src/htsurlport.c
Normal file
50
src/htsurlport.c
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/*
|
||||||
|
HTTrack Website Copier, Offline Browser for Windows and Unix
|
||||||
|
Copyright (C) 1998 Xavier Roche and other contributors
|
||||||
|
|
||||||
|
SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Ethical use: we kindly ask that you NOT use this software to harvest email
|
||||||
|
addresses or to collect any other private information about people. Doing so
|
||||||
|
would dishonor our work and waste the many hours we have spent on it.
|
||||||
|
|
||||||
|
Please visit our Website: http://www.httrack.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/* File: TCP port parser, shared by the engine, htsserver and */
|
||||||
|
/* proxytrack */
|
||||||
|
/* Author: Xavier Roche */
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
|
||||||
|
#include "htsurlport.h"
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
hts_boolean hts_parse_url_port(const char *a, int *port) {
|
||||||
|
char *end;
|
||||||
|
long p;
|
||||||
|
|
||||||
|
if (!isdigit((unsigned char) *a)) // strtol would eat a sign or leading space
|
||||||
|
return HTS_FALSE;
|
||||||
|
p = strtol(a, &end, 10);
|
||||||
|
if (*end != '\0' || p < 1 || p > 65535) // ERANGE lands out of range too
|
||||||
|
return HTS_FALSE;
|
||||||
|
*port = (int) p;
|
||||||
|
return HTS_TRUE;
|
||||||
|
}
|
||||||
45
src/htsurlport.h
Normal file
45
src/htsurlport.h
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/*
|
||||||
|
HTTrack Website Copier, Offline Browser for Windows and Unix
|
||||||
|
Copyright (C) 1998 Xavier Roche and other contributors
|
||||||
|
|
||||||
|
SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Ethical use: we kindly ask that you NOT use this software to harvest email
|
||||||
|
addresses or to collect any other private information about people. Doing so
|
||||||
|
would dishonor our work and waste the many hours we have spent on it.
|
||||||
|
|
||||||
|
Please visit our Website: http://www.httrack.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/* File: TCP port parser, shared by the engine, htsserver and */
|
||||||
|
/* proxytrack */
|
||||||
|
/* Author: Xavier Roche */
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
|
||||||
|
#ifndef HTSURLPORT_DEFH
|
||||||
|
#define HTSURLPORT_DEFH
|
||||||
|
|
||||||
|
#include "htsglobal.h"
|
||||||
|
|
||||||
|
/* Parse the port text "a" (after the ':', up to the end of the string): TRUE
|
||||||
|
and *port set for a bare decimal in 1..65535, else FALSE and *port left
|
||||||
|
alone. Not sscanf("%d"), which range-checks nothing and wraps past INT_MAX.
|
||||||
|
Its own file so proxytrack, which does not link the library, can share it. */
|
||||||
|
hts_boolean hts_parse_url_port(const char *a, int *port);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -63,7 +63,9 @@ Please visit our Website: http://www.httrack.com
|
|||||||
#include "md5.c"
|
#include "md5.c"
|
||||||
|
|
||||||
#include "htsserver.h"
|
#include "htsserver.h"
|
||||||
|
#include "htsurlport.h"
|
||||||
#include "htsweb.h"
|
#include "htsweb.h"
|
||||||
|
#include "htscharset.h"
|
||||||
|
|
||||||
#if USE_BEGINTHREAD==0
|
#if USE_BEGINTHREAD==0
|
||||||
#error fatal: no threads support
|
#error fatal: no threads support
|
||||||
@@ -155,6 +157,7 @@ int main(int argc, char *argv[]) {
|
|||||||
printf("Initializing the server..\n");
|
printf("Initializing the server..\n");
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
hts_argv_utf8(&argc, &argv);
|
||||||
{
|
{
|
||||||
WORD wVersionRequested; // requested version WinSock API
|
WORD wVersionRequested; // requested version WinSock API
|
||||||
WSADATA wsadata; // Windows Sockets API data
|
WSADATA wsadata; // Windows Sockets API data
|
||||||
@@ -257,8 +260,10 @@ int main(int argc, char *argv[]) {
|
|||||||
/* set commandline keys */
|
/* set commandline keys */
|
||||||
for(i = 2; i < argc; i += 2) {
|
for(i = 2; i < argc; i += 2) {
|
||||||
if (strcmp(argv[i], "--port") == 0 && i + 1 < argc) {
|
if (strcmp(argv[i], "--port") == 0 && i + 1 < argc) {
|
||||||
if (sscanf(argv[i + 1], "%d", &defaultPort) != 1 || defaultPort < 0
|
// the range check ran after sscanf("%d") had wrapped a huge value into a
|
||||||
|| defaultPort >= 65535) {
|
// plausible port, and listened there (#614). 0 (was the auto-pick) and
|
||||||
|
// 65535 (was refused, off by one) now both mean what they say.
|
||||||
|
if (!hts_parse_url_port(argv[i + 1], &defaultPort)) {
|
||||||
fprintf(stderr, "couldn't set the port number to %s\n", argv[i + 1]);
|
fprintf(stderr, "couldn't set the port number to %s\n", argv[i + 1]);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,6 +121,7 @@
|
|||||||
<ClCompile Include="htshelp.c" />
|
<ClCompile Include="htshelp.c" />
|
||||||
<ClCompile Include="htsindex.c" />
|
<ClCompile Include="htsindex.c" />
|
||||||
<ClCompile Include="htslib.c" />
|
<ClCompile Include="htslib.c" />
|
||||||
|
<ClCompile Include="htsurlport.c" />
|
||||||
<ClCompile Include="htsmd5.c" />
|
<ClCompile Include="htsmd5.c" />
|
||||||
<ClCompile Include="htsmodules.c" />
|
<ClCompile Include="htsmodules.c" />
|
||||||
<ClCompile Include="htsname.c" />
|
<ClCompile Include="htsname.c" />
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
#define READ_8(adr) ((unsigned char)*(adr))
|
#define READ_8(adr) ((unsigned char)*(adr))
|
||||||
#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) )
|
#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) )
|
||||||
#define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) )
|
#define READ_32(adr) ((uLong) READ_16(adr) | ((uLong) READ_16((adr) + 2) << 16))
|
||||||
|
|
||||||
#define WRITE_8(buff, n) do { \
|
#define WRITE_8(buff, n) do { \
|
||||||
*((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \
|
*((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \
|
||||||
|
|||||||
@@ -47,7 +47,9 @@ static void sig_brpipe(int code) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int scanHostPort(const char *str, char *host, int *port) {
|
// split a "host:port" listen argument; FALSE sends the caller to the usage
|
||||||
|
// screen. The port was unchecked, so a huge one wrapped into range (#614).
|
||||||
|
static hts_boolean scanHostPort(const char *str, char *host, int *port) {
|
||||||
char *pos = strrchr(str, ':');
|
char *pos = strrchr(str, ':');
|
||||||
|
|
||||||
if (pos != NULL) {
|
if (pos != NULL) {
|
||||||
@@ -56,12 +58,10 @@ static int scanHostPort(const char *str, char *host, int *port) {
|
|||||||
if (n < 256) {
|
if (n < 256) {
|
||||||
host[0] = '\0';
|
host[0] = '\0';
|
||||||
strncat(host, str, n);
|
strncat(host, str, n);
|
||||||
if (sscanf(pos + 1, "%d", port) == 1) {
|
return hts_parse_url_port(pos + 1, port);
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return HTS_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
|||||||
@@ -107,13 +107,12 @@ HTS_UNUSED static void proxytrack_print_log(const char *severity, const char *fo
|
|||||||
"<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
|
"<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
|
||||||
"<!-- End Disable IE Friendly HTTP Error Messages -->\r\n"
|
"<!-- End Disable IE Friendly HTTP Error Messages -->\r\n"
|
||||||
|
|
||||||
|
/* Same contract as hts_gethome(): proxytrack does not link libhttrack */
|
||||||
HTS_UNUSED static const char *gethomedir(void) {
|
HTS_UNUSED static const char *gethomedir(void) {
|
||||||
const char *home = getenv("HOME");
|
const char *home = getenv("HOME");
|
||||||
|
|
||||||
if (home)
|
/* An empty $HOME would resolve a relative path against the root */
|
||||||
return home;
|
return strnotempty(home) ? home : ".";
|
||||||
else
|
|
||||||
return ".";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
HTS_UNUSED static int linput(FILE * fp, char *s, int max) {
|
HTS_UNUSED static int linput(FILE * fp, char *s, int max) {
|
||||||
|
|||||||
@@ -99,6 +99,7 @@
|
|||||||
<ClCompile Include="proxy\main.c" />
|
<ClCompile Include="proxy\main.c" />
|
||||||
<ClCompile Include="proxy\proxytrack.c" />
|
<ClCompile Include="proxy\proxytrack.c" />
|
||||||
<ClCompile Include="proxy\store.c" />
|
<ClCompile Include="proxy\store.c" />
|
||||||
|
<ClCompile Include="htsurlport.c" />
|
||||||
<ClCompile Include="coucal\coucal.c" />
|
<ClCompile Include="coucal\coucal.c" />
|
||||||
<ClCompile Include="htsmd5.c" />
|
<ClCompile Include="htsmd5.c" />
|
||||||
<ClCompile Include="md5.c" />
|
<ClCompile Include="md5.c" />
|
||||||
|
|||||||
@@ -17,8 +17,8 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 3, 49, 12, 0
|
FILEVERSION 3, 49, 13, 0
|
||||||
PRODUCTVERSION 3, 49, 12, 0
|
PRODUCTVERSION 3, 49, 13, 0
|
||||||
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
|
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS VS_FF_DEBUG
|
FILEFLAGS VS_FF_DEBUG
|
||||||
@@ -35,12 +35,12 @@ BEGIN
|
|||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "Xavier Roche"
|
VALUE "CompanyName", "Xavier Roche"
|
||||||
VALUE "FileDescription", VER_FILE_DESCRIPTION
|
VALUE "FileDescription", VER_FILE_DESCRIPTION
|
||||||
VALUE "FileVersion", "3.49.12"
|
VALUE "FileVersion", "3.49.13"
|
||||||
VALUE "InternalName", VER_ORIGINAL_FILENAME
|
VALUE "InternalName", VER_ORIGINAL_FILENAME
|
||||||
VALUE "LegalCopyright", "Copyright (C) 1998-2026 Xavier Roche and other contributors. GNU GPL v3 or later."
|
VALUE "LegalCopyright", "Copyright (C) 1998-2026 Xavier Roche and other contributors. GNU GPL v3 or later."
|
||||||
VALUE "OriginalFilename", VER_ORIGINAL_FILENAME
|
VALUE "OriginalFilename", VER_ORIGINAL_FILENAME
|
||||||
VALUE "ProductName", "HTTrack Website Copier"
|
VALUE "ProductName", "HTTrack Website Copier"
|
||||||
VALUE "ProductVersion", "3.49-12"
|
VALUE "ProductVersion", "3.49-13"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|||||||
@@ -33,6 +33,19 @@ function log {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Map a POSIX locale ("zh_TW.UTF-8@euro") to its lang.indexes number, English (1) if unknown
|
||||||
|
function lang_index {
|
||||||
|
local locale=$1 indexes=$2 tag n t
|
||||||
|
tag=$(echo "${locale}" | cut -f1 -d'.' | cut -f1 -d'@' | tr '[:upper:]' '[:lower:]' | tr -cd 'a-z_')
|
||||||
|
# a few languages carry a region-specific entry (zh_tw, pt_br); else use the bare language
|
||||||
|
for t in "${tag}" "${tag%%_*}"; do
|
||||||
|
n=$(grep -E "^${t}:" "${indexes}" | cut -f2 -d':')
|
||||||
|
test -n "${n}" && break
|
||||||
|
done
|
||||||
|
test -n "${n}" || n=1
|
||||||
|
echo "${n}"
|
||||||
|
}
|
||||||
|
|
||||||
function launch_browser {
|
function launch_browser {
|
||||||
log "Launching $1"
|
log "Launching $1"
|
||||||
browser=$1
|
browser=$1
|
||||||
@@ -59,13 +72,11 @@ test -f "${DISTPATH}/lang.indexes" || ! log "Could not find ${DISTPATH}/lang.ind
|
|||||||
test -d "${DISTPATH}/lang" || ! log "Could not find ${DISTPATH}/lang" || exit 1
|
test -d "${DISTPATH}/lang" || ! log "Could not find ${DISTPATH}/lang" || exit 1
|
||||||
test -d "${DISTPATH}/html" || ! log "Could not find ${DISTPATH}/html" || exit 1
|
test -d "${DISTPATH}/html" || ! log "Could not find ${DISTPATH}/html" || exit 1
|
||||||
|
|
||||||
# Locale
|
# Locale: POSIX precedence, LC_ALL overrides LC_MESSAGES overrides LANG
|
||||||
HTSLANG="${LC_MESSAGES}"
|
HTSLANG="${LC_ALL}"
|
||||||
! test -n "${HTSLANG}" && HTSLANG="${LC_ALL}"
|
! test -n "${HTSLANG}" && HTSLANG="${LC_MESSAGES}"
|
||||||
! test -n "${HTSLANG}" && HTSLANG="${LANG}"
|
! test -n "${HTSLANG}" && HTSLANG="${LANG}"
|
||||||
HTSLANG="$(echo "$LANG" | cut -f1 -d'.' | cut -f1 -d'_')"
|
LANGN=$(lang_index "${HTSLANG}" "${DISTPATH}/lang.indexes")
|
||||||
LANGN=$(grep -E "^${HTSLANG}:" "${DISTPATH}/lang.indexes" | cut -f2 -d':')
|
|
||||||
! test -n "${LANGN}" && LANGN=1
|
|
||||||
|
|
||||||
# Find the browser
|
# Find the browser
|
||||||
# note: not all systems have sensible-browser or www-browser alternative
|
# note: not all systems have sensible-browser or www-browser alternative
|
||||||
|
|||||||
@@ -97,6 +97,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="htsserver.c" />
|
<ClCompile Include="htsserver.c" />
|
||||||
<ClCompile Include="htsweb.c" />
|
<ClCompile Include="htsweb.c" />
|
||||||
|
<ClCompile Include="htsurlport.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -54,6 +54,13 @@ refused() {
|
|||||||
! echo "FAIL: $1 (exit $RC)" || exit 1
|
! echo "FAIL: $1 (exit $RC)" || exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# assert continue mode was entered: it drops the URL list, so with no cache to
|
||||||
|
# resume the run ends on the usage screen rather than on any other error
|
||||||
|
continued() {
|
||||||
|
{ test "$RC" -ne 0 && grep -q 'usage:' "$1/.log"; } ||
|
||||||
|
! echo "FAIL: $2 (exit $RC)" || exit 1
|
||||||
|
}
|
||||||
|
|
||||||
# a value past the old 126/256 caps but within the cap is accepted, on both the
|
# a value past the old 126/256 caps but within the cap is accepted, on both the
|
||||||
# short and long form of each option
|
# short and long form of each option
|
||||||
long=$(nchars 900)
|
long=$(nchars 900)
|
||||||
@@ -102,4 +109,50 @@ for bad in nan nan:5 5:nan inf 10:5 99999; do
|
|||||||
refused "#185: invalid --pause '$bad' not refused cleanly"
|
refused "#185: invalid --pause '$bad' not refused cleanly"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# An option is not -i (continue) merely because its name contains an 'i' (#615).
|
||||||
|
# These used to wipe the URL given before them and exit on the usage screen.
|
||||||
|
run "$tmp/ord-bti" --build-top-index
|
||||||
|
accepted "$tmp/ord-bti" "#615: --build-top-index after the URL wiped the URL list"
|
||||||
|
run "$tmp/ord-bti-s" "-%i"
|
||||||
|
accepted "$tmp/ord-bti-s" "#615: -%i after the URL wiped the URL list"
|
||||||
|
run "$tmp/ord-proto" --protocol 2
|
||||||
|
accepted "$tmp/ord-proto" "#615: --protocol after the URL wiped the URL list"
|
||||||
|
run "$tmp/ord-proto-s" "-@i2"
|
||||||
|
accepted "$tmp/ord-proto-s" "#615: -@i2 after the URL wiped the URL list"
|
||||||
|
|
||||||
|
# %, &, @ and # take the letter after them into another option set, wherever
|
||||||
|
# they sit in the cluster, so the i of -q%i is not the main-set -i either.
|
||||||
|
run "$tmp/ord-qpi" "-q%i"
|
||||||
|
accepted "$tmp/ord-qpi" "#615: -q%i after the URL wiped the URL list"
|
||||||
|
run "$tmp/ord-qai" "-q@i"
|
||||||
|
accepted "$tmp/ord-qai" "#615: -q@i after the URL wiped the URL list"
|
||||||
|
|
||||||
|
# -%q only forces quiet mode, which nothing here can see: a run whose stdout is
|
||||||
|
# not a tty is quiet from the start (htscoremain.c:174). Just check it crawls.
|
||||||
|
run "$tmp/ord-iqs" "-%q"
|
||||||
|
accepted "$tmp/ord-iqs" "#615: -%q after the URL broke the crawl"
|
||||||
|
|
||||||
|
# The real -i still forces continue mode and drops the URL list, in every form:
|
||||||
|
# a fix that merely stopped looking for 'i' would pass the checks above.
|
||||||
|
run "$tmp/cont-s" -i
|
||||||
|
continued "$tmp/cont-s" "#615: -i after the URL no longer forces continue mode"
|
||||||
|
run "$tmp/cont-c" -iC2
|
||||||
|
continued "$tmp/cont-c" "#615: -iC2 after the URL no longer forces continue mode"
|
||||||
|
run "$tmp/cont-l" --continue
|
||||||
|
continued "$tmp/cont-l" "#615: --continue after the URL no longer forces continue mode"
|
||||||
|
run "$tmp/cont-u" --update
|
||||||
|
continued "$tmp/cont-u" "#615: --update after the URL no longer forces continue mode"
|
||||||
|
|
||||||
|
# ...including where another set's letter precedes it in the cluster.
|
||||||
|
run "$tmp/cont-pq" "-%qi"
|
||||||
|
continued "$tmp/cont-pq" "#615: -%qi after the URL no longer forces continue mode"
|
||||||
|
run "$tmp/cont-pm" "-%Mi"
|
||||||
|
continued "$tmp/cont-pm" "#615: -%Mi after the URL no longer forces continue mode"
|
||||||
|
|
||||||
|
# Placed before the URL these always worked; they must keep working.
|
||||||
|
run_only "$tmp/pre-bti" "-%i" "file://$tmp/index.html"
|
||||||
|
accepted "$tmp/pre-bti" "#615: -%i before the URL broke the crawl"
|
||||||
|
run_only "$tmp/pre-proto" "-@i2" "file://$tmp/index.html"
|
||||||
|
accepted "$tmp/pre-proto" "#615: -@i2 before the URL broke the crawl"
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
15
tests/01_engine-dnstimeout.test
Normal file
15
tests/01_engine-dnstimeout.test
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# A resolve against a deliberately slow mock getaddrinfo (no network) must
|
||||||
|
# return on --timeout, must not hold opt->state.lock meanwhile, and must not
|
||||||
|
# cache the timeout as an answer (#606).
|
||||||
|
# 'run' is an ignored placeholder argument.
|
||||||
|
out=$(httrack -#test=dnstimeout run)
|
||||||
|
|
||||||
|
test "$out" = "dns-timeout-selftest: OK" || {
|
||||||
|
echo "expected 'dns-timeout-selftest: OK', got: $out" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
53
tests/01_engine-expandhome.test
Normal file
53
tests/01_engine-expandhome.test
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
|
||||||
|
# SC2088: the literal, unexpanded '~' is the input under test.
|
||||||
|
# shellcheck disable=SC2088
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# ~ expansion for the -O base path (expand_home). $HOME is pinned so the cases
|
||||||
|
# cannot depend on the caller's, but MSYS rewrites it into a Windows path
|
||||||
|
# before the native httrack.exe reads it: ask the engine what it saw rather
|
||||||
|
# than hardcoding the value.
|
||||||
|
ask() {
|
||||||
|
HOME=HTSHOME httrack -O /dev/null -#test=expandhome "$1"
|
||||||
|
}
|
||||||
|
exp() {
|
||||||
|
test "$(ask "$1")" == "expanded=$2" || exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
home=$(ask '~')
|
||||||
|
home=${home#expanded=}
|
||||||
|
|
||||||
|
# or every case below is vacuous: '~' means expansion never fired, '.' means it
|
||||||
|
# fell back to the default without ever reading $HOME
|
||||||
|
test "$home" != '~' || exit 1
|
||||||
|
test "$home" != '.' || exit 1
|
||||||
|
|
||||||
|
exp '~' "$home"
|
||||||
|
exp '~/foo' "$home/foo"
|
||||||
|
exp '~/foo/bar/#' "$home/foo/bar/#"
|
||||||
|
exp '~/' "$home/"
|
||||||
|
exp '~/../x' "$home/../x"
|
||||||
|
|
||||||
|
# ~user/ needs getpwnam: left alone rather than mangled into $HOME + "user/"
|
||||||
|
exp '~smith/foo' '~smith/foo'
|
||||||
|
exp '~root' '~root'
|
||||||
|
|
||||||
|
# only a leading '~' expands; anything else is a literal path component
|
||||||
|
exp 'a~/x' 'a~/x'
|
||||||
|
exp './~/x' './~/x'
|
||||||
|
exp 'foo~bar' 'foo~bar'
|
||||||
|
|
||||||
|
# an unset or empty $HOME must not turn ~/foo into the absolute /foo
|
||||||
|
test "$(env -u HOME httrack -O /dev/null -#test=expandhome '~/foo')" == "expanded=./foo" || exit 1
|
||||||
|
test "$(HOME='' httrack -O /dev/null -#test=expandhome '~/foo')" == "expanded=./foo" || exit 1
|
||||||
|
|
||||||
|
# A $HOME past the 2 * HTS_URLMAXSIZE buffer is left alone: strcatbuff aborts
|
||||||
|
# rather than truncates. Only meaningful where the engine sees the value we set:
|
||||||
|
# MSYS rewrites HOME into a path of its own choosing, long or not.
|
||||||
|
if test "$home" = HTSHOME; then
|
||||||
|
long=$(printf '%04096d' 0 | tr '0' 'A')
|
||||||
|
test "$(HOME="$long" httrack -O /dev/null -#test=expandhome '~/foo')" == "expanded=~/foo" || exit 1
|
||||||
|
fi
|
||||||
@@ -5,40 +5,89 @@ set -euo pipefail
|
|||||||
|
|
||||||
# hts_parse_proxy splits a -P argument "[scheme://][user:pass@]host[:port]" into
|
# hts_parse_proxy splits a -P argument "[scheme://][user:pass@]host[:port]" into
|
||||||
# the proxy host string and port. -#test=proxyurl <arg> prints
|
# the proxy host string and port. -#test=proxyurl <arg> prints
|
||||||
# "name=.. port=.. host=..", where host= is what the connect resolves.
|
# "name=.. port=.. host=.. kind=..", where host= is what the connect resolves and
|
||||||
|
# kind= is the transport the scheme selects (http, socks or connect).
|
||||||
|
|
||||||
p() {
|
p() {
|
||||||
test "$(httrack -O /dev/null -#test=proxyurl "$1")" == "$2" || exit 1
|
test "$(httrack -O /dev/null -#test=proxyurl "$1")" == "$2" || exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# bare host, with and without an explicit port
|
# bare host, with and without an explicit port
|
||||||
p 'proxy.example.com:8080' 'name=proxy.example.com port=8080 host=proxy.example.com'
|
p 'proxy.example.com:8080' 'name=proxy.example.com port=8080 host=proxy.example.com kind=http'
|
||||||
p 'proxy.example.com' 'name=proxy.example.com port=8080 host=proxy.example.com'
|
p 'proxy.example.com' 'name=proxy.example.com port=8080 host=proxy.example.com kind=http'
|
||||||
|
|
||||||
# user:pass@ is kept in name (for proxy auth) and stripped from host
|
# user:pass@ is kept in name (for proxy auth) and stripped from host
|
||||||
p 'user:pass@proxy:3128' 'name=user:pass@proxy port=3128 host=proxy'
|
p 'user:pass@proxy:3128' 'name=user:pass@proxy port=3128 host=proxy kind=http'
|
||||||
p 'user:pass@proxy' 'name=user:pass@proxy port=8080 host=proxy'
|
p 'user:pass@proxy' 'name=user:pass@proxy port=8080 host=proxy kind=http'
|
||||||
|
|
||||||
# a scheme colon must not be read as a port: http://host with no port used to
|
# a scheme colon must not be read as a port: http://host with no port used to
|
||||||
# parse to name=http with a garbage port
|
# parse to name=http with a garbage port
|
||||||
p 'http://proxy:8080' 'name=http://proxy port=8080 host=proxy'
|
p 'http://proxy:8080' 'name=http://proxy port=8080 host=proxy kind=http'
|
||||||
p 'http://proxy' 'name=http://proxy port=8080 host=proxy'
|
p 'http://proxy' 'name=http://proxy port=8080 host=proxy kind=http'
|
||||||
|
|
||||||
# socks5/socks5h default to 1080 and resolve to the bare host
|
# socks5/socks5h default to 1080 and resolve to the bare host
|
||||||
p 'socks5://host:1080' 'name=socks5://host port=1080 host=host'
|
p 'socks5://host:1080' 'name=socks5://host port=1080 host=host kind=socks'
|
||||||
p 'socks5://host' 'name=socks5://host port=1080 host=host'
|
p 'socks5://host' 'name=socks5://host port=1080 host=host kind=socks'
|
||||||
p 'socks5h://host' 'name=socks5h://host port=1080 host=host'
|
p 'socks5h://host' 'name=socks5h://host port=1080 host=host kind=socks'
|
||||||
# explicit port wins over the 1080 default, with and without userinfo
|
# explicit port wins over the 1080 default, with and without userinfo
|
||||||
p 'socks5://host:9050' 'name=socks5://host port=9050 host=host'
|
p 'socks5://host:9050' 'name=socks5://host port=9050 host=host kind=socks'
|
||||||
p 'socks5://user:pass@host:9050' 'name=socks5://user:pass@host port=9050 host=host'
|
p 'socks5://user:pass@host:9050' 'name=socks5://user:pass@host port=9050 host=host kind=socks'
|
||||||
|
|
||||||
|
# connect:// is an http proxy driven with CONNECT for every request (#564); it
|
||||||
|
# defaults to the http 8080 port and resolves to the bare host
|
||||||
|
p 'connect://host' 'name=connect://host port=8080 host=host kind=connect'
|
||||||
|
p 'connect://host:8082' 'name=connect://host port=8082 host=host kind=connect'
|
||||||
|
p 'connect://user:pass@host:8082' 'name=connect://user:pass@host port=8082 host=host kind=connect'
|
||||||
|
# only the scheme selects connect mode: a host literally named "connect" is a
|
||||||
|
# plain http proxy, not a tunnel
|
||||||
|
p 'connect:8080' 'name=connect port=8080 host=connect kind=http'
|
||||||
|
p 'connect.example.com:3128' 'name=connect.example.com port=3128 host=connect.example.com kind=http'
|
||||||
|
|
||||||
# the split is byte-transparent: percent-escapes stay encoded (decoded later at
|
# the split is byte-transparent: percent-escapes stay encoded (decoded later at
|
||||||
# auth time), only structural ASCII ':'/'@' delimit, and the last '@' ends the
|
# auth time), only structural ASCII ':'/'@' delimit, and the last '@' ends the
|
||||||
# userinfo. So %40/%3A and UTF-8 bytes never mis-split host or port.
|
# userinfo. So %40/%3A and UTF-8 bytes never mis-split host or port.
|
||||||
p 'socks5://user:p%40ss@host:1080' 'name=socks5://user:p%40ss@host port=1080 host=host'
|
p 'socks5://user:p%40ss@host:1080' 'name=socks5://user:p%40ss@host port=1080 host=host kind=socks'
|
||||||
p 'socks5://us%3Aer:pass@host:1080' 'name=socks5://us%3Aer:pass@host port=1080 host=host'
|
p 'socks5://us%3Aer:pass@host:1080' 'name=socks5://us%3Aer:pass@host port=1080 host=host kind=socks'
|
||||||
p 'socks5://a@b:c@host:1080' 'name=socks5://a@b:c@host port=1080 host=host'
|
p 'socks5://a@b:c@host:1080' 'name=socks5://a@b:c@host port=1080 host=host kind=socks'
|
||||||
p 'socks5://naïve:pass@héllo:1080' 'name=socks5://naïve:pass@héllo port=1080 host=héllo'
|
p 'socks5://naïve:pass@héllo:1080' 'name=socks5://naïve:pass@héllo port=1080 host=héllo kind=socks'
|
||||||
|
|
||||||
|
# a bracketed IPv6 literal holds colons of its own: the backward scan must stop
|
||||||
|
# at the ']', or a portless literal parses to a truncated name and port=1
|
||||||
|
p 'http://[2001:db8::1]' 'name=http://[2001:db8::1] port=8080 host=[2001:db8::1] kind=http'
|
||||||
|
p 'http://[2001:db8::1]:3128' 'name=http://[2001:db8::1] port=3128 host=[2001:db8::1] kind=http'
|
||||||
|
p 'socks5://[::1]' 'name=socks5://[::1] port=1080 host=[::1] kind=socks'
|
||||||
|
p 'socks5://[::1]:1080' 'name=socks5://[::1] port=1080 host=[::1] kind=socks'
|
||||||
|
p 'socks5://user:pass@[::1]' 'name=socks5://user:pass@[::1] port=1080 host=[::1] kind=socks'
|
||||||
|
p 'socks5://user:pass@[::1]:9050' 'name=socks5://user:pass@[::1] port=9050 host=[::1] kind=socks'
|
||||||
|
p '[::1]' 'name=[::1] port=8080 host=[::1] kind=http'
|
||||||
|
p '[::1]:3128' 'name=[::1] port=3128 host=[::1] kind=http'
|
||||||
|
# the ']' only ends the scan: one outside a literal must eat neither the name nor
|
||||||
|
# the port. The last two discriminate: when a real port follows the ']', a
|
||||||
|
# truncating bug agrees by accident.
|
||||||
|
p 'http://user:p]ass@host:80' 'name=http://user:p]ass@host port=80 host=host kind=http'
|
||||||
|
p 'http://a]b:3128' 'name=http://a]b port=3128 host=a]b kind=http'
|
||||||
|
p 'http://a]b' 'name=http://a]b port=8080 host=a]b kind=http'
|
||||||
|
p 'http://a]b:c@host' 'name=http://a]b:c@host port=8080 host=host kind=http'
|
||||||
|
|
||||||
# a lone ':' must not underflow the backward scan
|
# a lone ':' must not underflow the backward scan
|
||||||
p ':' 'name= port=8080 host='
|
p ':' 'name= port=8080 host= kind=http'
|
||||||
|
|
||||||
|
# a port is *DIGIT in 1..65535, else the scheme default: sscanf("%d") used to
|
||||||
|
# wrap past INT_MAX and hand back a garbage port (#602)
|
||||||
|
p 'http://host:65535' 'name=http://host port=65535 host=host kind=http'
|
||||||
|
p 'http://host:1' 'name=http://host port=1 host=host kind=http'
|
||||||
|
p 'http://host:65536' 'name=http://host port=8080 host=host kind=http'
|
||||||
|
p 'http://host:2147483648' 'name=http://host port=8080 host=host kind=http'
|
||||||
|
p 'http://host:4294967296' 'name=http://host port=8080 host=host kind=http'
|
||||||
|
p 'http://host:99999999999999' 'name=http://host port=8080 host=host kind=http'
|
||||||
|
# discriminating: this one wrapped to a plausible 80, so range-checking the
|
||||||
|
# sscanf result instead of rejecting the overflow still passes everything above
|
||||||
|
p 'http://host:4294967376' 'name=http://host port=8080 host=host kind=http'
|
||||||
|
p 'http://host:999999999999999999999999999999' 'name=http://host port=8080 host=host kind=http'
|
||||||
|
p 'http://host:0' 'name=http://host port=8080 host=host kind=http'
|
||||||
|
p 'http://host:-1' 'name=http://host port=8080 host=host kind=http'
|
||||||
|
p 'http://host:80x' 'name=http://host port=8080 host=host kind=http'
|
||||||
|
p 'http://host: 80' 'name=http://host port=8080 host=host kind=http'
|
||||||
|
p 'http://host:' 'name=http://host port=8080 host=host kind=http'
|
||||||
|
# the fallback is the scheme's own default, not a hardcoded 8080
|
||||||
|
p 'socks5://host:99999999999999' 'name=socks5://host port=1080 host=host kind=socks'
|
||||||
|
|||||||
12
tests/01_engine-topindex.test
Executable file
12
tests/01_engine-topindex.test
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# hts_buildtopindex takes a system-charset path but verif_backblue below it
|
||||||
|
# expects utf-8, mangling a non-ASCII project dir on Windows (#216, #217).
|
||||||
|
dir=$(mktemp -d)
|
||||||
|
trap 'rm -rf "$dir"' EXIT
|
||||||
|
|
||||||
|
httrack -O /dev/null -#test=topindex "$dir" run |
|
||||||
|
grep -q "topindex self-test OK"
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user