mirror of
https://github.com/xroche/httrack.git
synced 2026-07-14 12:50:52 +03:00
Compare commits
1 Commits
drop-swf-j
...
fix-test19
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b571ac8616 |
29
.github/workflows/ci.yml
vendored
29
.github/workflows/ci.yml
vendored
@@ -152,35 +152,6 @@ jobs:
|
|||||||
if: failure()
|
if: failure()
|
||||||
run: cat tests/test-suite.log 2>/dev/null || true
|
run: cat tests/test-suite.log 2>/dev/null || true
|
||||||
|
|
||||||
# Runtime smoke of the WebHTTrack launcher on macOS: it carries a Darwin-only
|
|
||||||
# browser path (open -W) and nothing else exercises htsserver. Install into a
|
|
||||||
# temp prefix, then check webhttrack brings up htsserver and serves the UI.
|
|
||||||
webhttrack-macos:
|
|
||||||
name: webhttrack smoke (macOS arm64)
|
|
||||||
runs-on: macos-14
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v6
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
|
|
||||||
- name: Install build dependencies
|
|
||||||
run: |
|
|
||||||
set -euo pipefail
|
|
||||||
brew install autoconf automake libtool autoconf-archive
|
|
||||||
|
|
||||||
- name: Build and install into a temp prefix
|
|
||||||
run: |
|
|
||||||
set -euo pipefail
|
|
||||||
ssl="$(brew --prefix openssl@3)"
|
|
||||||
autoreconf -fi
|
|
||||||
./configure CPPFLAGS="-I${ssl}/include" LDFLAGS="-L${ssl}/lib" \
|
|
||||||
--prefix="$RUNNER_TEMP/inst"
|
|
||||||
make -j"$(sysctl -n hw.ncpu)"
|
|
||||||
make install
|
|
||||||
|
|
||||||
- name: Smoke-test webhttrack
|
|
||||||
run: bash tests/webhttrack-smoke.sh "$RUNNER_TEMP/inst"
|
|
||||||
|
|
||||||
# Portability/hardening: 32-bit (i386) build on the x86-64 runner via multilib
|
# Portability/hardening: 32-bit (i386) build on the x86-64 runner via multilib
|
||||||
# -- no extra hardware. Exercises the 32-bit size_t/pointer ABI, where size
|
# -- no extra hardware. Exercises the 32-bit size_t/pointer ABI, where size
|
||||||
# and bounds math can truncate or wrap in ways 64-bit never reveals (the axis
|
# and bounds math can truncate or wrap in ways 64-bit never reveals (the axis
|
||||||
|
|||||||
1
README
1
README
@@ -40,6 +40,7 @@ These are the principals limits of HTTrack for that moment. Note that we did not
|
|||||||
that would have solved them.
|
that would have solved them.
|
||||||
|
|
||||||
- Several scripts generating complex filenames may not find them (ex: img.src='image'+a+Mobj.dst+'.gif')
|
- Several scripts generating complex filenames may not find them (ex: img.src='image'+a+Mobj.dst+'.gif')
|
||||||
|
- Some java classes may not find some files on them (class included)
|
||||||
- Cgi-bin links may not work properly in some cases (parameters needed). To avoid them: use filters like -*cgi-bin*
|
- Cgi-bin links may not work properly in some cases (parameters needed). To avoid them: use filters like -*cgi-bin*
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
14
configure.ac
14
configure.ac
@@ -64,6 +64,16 @@ AC_SUBST(LT_CV_OBJDIR,$lt_cv_objdir)
|
|||||||
# Export version info
|
# Export version info
|
||||||
AC_SUBST(VERSION_INFO)
|
AC_SUBST(VERSION_INFO)
|
||||||
|
|
||||||
|
# Versioned plugin name for dlopen() in hts_create_opt(); soname major is
|
||||||
|
# libtool's current - age, so this tracks VERSION_INFO bumps automatically.
|
||||||
|
HTS_SONAME_MAJOR=$((${VERSION_INFO%%:*} - ${VERSION_INFO##*:}))
|
||||||
|
case "$host_os" in
|
||||||
|
darwin*) HTS_LIBHTSJAVA_NAME="libhtsjava.$HTS_SONAME_MAJOR.dylib" ;;
|
||||||
|
*) HTS_LIBHTSJAVA_NAME="libhtsjava.so.$HTS_SONAME_MAJOR" ;;
|
||||||
|
esac
|
||||||
|
AC_DEFINE_UNQUOTED([HTS_LIBHTSJAVA_NAME], ["$HTS_LIBHTSJAVA_NAME"],
|
||||||
|
[Versioned libhtsjava runtime name, derived from VERSION_INFO])
|
||||||
|
|
||||||
### Default CFLAGS
|
### Default CFLAGS
|
||||||
DEFAULT_CFLAGS="-Wall -Wformat -Wformat-security \
|
DEFAULT_CFLAGS="-Wall -Wformat -Wformat-security \
|
||||||
-Wmultichar -Wwrite-strings -Wcast-qual -Wcast-align \
|
-Wmultichar -Wwrite-strings -Wcast-qual -Wcast-align \
|
||||||
@@ -109,8 +119,8 @@ case "$CFLAGS" in
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
# Force libc back into DT_NEEDED for libraries that reach it only through
|
# Force libc back into DT_NEEDED for libraries that reach it only through
|
||||||
# libhttrack (the libtest callbacks), but only with a GNU-style linker; Apple
|
# libhttrack (libhtsjava, the libtest callbacks), but only with a GNU-style
|
||||||
# ld rejects these flags and links libSystem unconditionally.
|
# linker; Apple ld rejects these flags and links libSystem unconditionally.
|
||||||
AX_CHECK_LINK_FLAG([-Wl,--push-state,--no-as-needed,-lc,--pop-state],
|
AX_CHECK_LINK_FLAG([-Wl,--push-state,--no-as-needed,-lc,--pop-state],
|
||||||
[LIBC_FORCE_LINK="-Wl,--push-state,--no-as-needed,-lc,--pop-state"])
|
[LIBC_FORCE_LINK="-Wl,--push-state,--no-as-needed,-lc,--pop-state"])
|
||||||
AC_SUBST([LIBC_FORCE_LINK])
|
AC_SUBST([LIBC_FORCE_LINK])
|
||||||
|
|||||||
5
debian/copyright
vendored
5
debian/copyright
vendored
@@ -7,8 +7,9 @@ Files: *
|
|||||||
Copyright: 1998-2026 Xavier Roche and other contributors
|
Copyright: 1998-2026 Xavier Roche and other contributors
|
||||||
License: GPL-3+
|
License: GPL-3+
|
||||||
Comment:
|
Comment:
|
||||||
htsbasenet.h links against the system OpenSSL library (originally by Eric
|
The engine includes contributions from Yann Philippot (src/htsjava.c,
|
||||||
Young); no OpenSSL/SSLeay code is bundled here.
|
src/htsjava.h). htsbasenet.h links against the system OpenSSL library
|
||||||
|
(originally by Eric Young); no OpenSSL/SSLeay code is bundled here.
|
||||||
|
|
||||||
Files: src/minizip/*
|
Files: src/minizip/*
|
||||||
Copyright: 1998-2010 Gilles Vollant
|
Copyright: 1998-2010 Gilles Vollant
|
||||||
|
|||||||
1
debian/libhttrack-dev.files
vendored
1
debian/libhttrack-dev.files
vendored
@@ -1,4 +1,5 @@
|
|||||||
usr/include/httrack
|
usr/include/httrack
|
||||||
usr/lib/*/libhttrack.{so}
|
usr/lib/*/libhttrack.{so}
|
||||||
|
usr/lib/*/libhtsjava.{so}
|
||||||
usr/share/httrack/libtest
|
usr/share/httrack/libtest
|
||||||
usr/lib/*/httrack/libtest
|
usr/lib/*/httrack/libtest
|
||||||
|
|||||||
1
debian/libhttrack3.files
vendored
1
debian/libhttrack3.files
vendored
@@ -1,2 +1,3 @@
|
|||||||
usr/lib/*/libhttrack.so.3*
|
usr/lib/*/libhttrack.so.3*
|
||||||
|
usr/lib/*/libhtsjava.so.3*
|
||||||
usr/share/httrack/templates
|
usr/share/httrack/templates
|
||||||
|
|||||||
@@ -609,9 +609,10 @@ most mirrors do work. We still are working to improve the mirror quality of HTTr
|
|||||||
<br>
|
<br>
|
||||||
|
|
||||||
</a><a NAME="Q2b">Q: <strong>Some Java applets do not work properly!</strong><br>
|
</a><a NAME="Q2b">Q: <strong>Some Java applets do not work properly!</strong><br>
|
||||||
A: <em>Java applets may not work in some cases, because HTTrack does not parse compiled class files to find
|
A: <em>Java applets may not work in some cases, for example if HTTrack failed to detect all included classes
|
||||||
the resources they load. Java applets often need to be online anyway, since remote files are fetched directly
|
or files called within the class file. Sometimes, Java applets need to be online, because remote files are
|
||||||
at runtime.<br>
|
directly caught. Finally, the site structure can be incompatible with the class (always try to keep the original site structure
|
||||||
|
when you want to get Java classes)<br>
|
||||||
If there is no way to make some classes work properly, you can exclude them with the filters.
|
If there is no way to make some classes work properly, you can exclude them with the filters.
|
||||||
They will be available, but only online.
|
They will be available, but only online.
|
||||||
</em>
|
</em>
|
||||||
|
|||||||
@@ -243,7 +243,7 @@ Build options:
|
|||||||
Spider options:
|
Spider options:
|
||||||
bN accept cookies in cookies.txt (0=do not accept,* 1=accept) (--cookies[=N])
|
bN accept cookies in cookies.txt (0=do not accept,* 1=accept) (--cookies[=N])
|
||||||
u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always) (--check-type[=N])
|
u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always) (--check-type[=N])
|
||||||
j *parse scripts (j0 don't parse) (--parse-java[=N])
|
j *parse Java Classes (j0 don't parse) (--parse-java[=N])
|
||||||
sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always) (--robots[=N])
|
sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always) (--robots[=N])
|
||||||
%h force HTTP/1.0 requests (reduce update features, only for old servers or proxies) (--http-10)
|
%h force HTTP/1.0 requests (reduce update features, only for old servers or proxies) (--http-10)
|
||||||
%B tolerant requests (accept bogus responses on some servers, but not standard!) (--tolerant)
|
%B tolerant requests (accept bogus responses on some servers, but not standard!) (--tolerant)
|
||||||
@@ -417,7 +417,7 @@ site. Specifically, the defauls are:
|
|||||||
X *purge old files after update (X0 keep delete)
|
X *purge old files after update (X0 keep delete)
|
||||||
bN accept cookies in cookies.txt (0=do not accept,* 1=accept)
|
bN accept cookies in cookies.txt (0=do not accept,* 1=accept)
|
||||||
u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always)
|
u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always)
|
||||||
j *parse scripts (j0 don't parse)
|
j *parse Java Classes (j0 don't parse)
|
||||||
sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always)
|
sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always)
|
||||||
C create/use a cache for updates and retries (C0 no cache,C1 cache is prioritary,* C2 test update before)
|
C create/use a cache for updates and retries (C0 no cache,C1 cache is prioritary,* C2 test update before)
|
||||||
f *log file mode
|
f *log file mode
|
||||||
@@ -497,9 +497,9 @@ about your browser retaining them.
|
|||||||
<p align=justify> This causes different document types to be analyzed
|
<p align=justify> This causes different document types to be analyzed
|
||||||
differently.
|
differently.
|
||||||
|
|
||||||
<pre><b><i> j *parse scripts (j0 don't parse) </i></b></pre>
|
<pre><b><i> j *parse Java Classes (j0 don't parse) </i></b></pre>
|
||||||
|
|
||||||
<p align=justify> This causes scripts to be parsed looking for
|
<p align=justify> This causes Java class files to be parsed looking for
|
||||||
URLs.
|
URLs.
|
||||||
|
|
||||||
<pre><b><i> sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always) </i></b></pre>
|
<pre><b><i> sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always) </i></b></pre>
|
||||||
@@ -1178,7 +1178,7 @@ accepted and sent back in order to allow access.
|
|||||||
Spider options:
|
Spider options:
|
||||||
bN accept cookies in cookies.txt (0=do not accept,* 1=accept)
|
bN accept cookies in cookies.txt (0=do not accept,* 1=accept)
|
||||||
u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always)
|
u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always)
|
||||||
j *parse scripts (j0 don't parse)
|
j *parse Java Classes (j0 don't parse)
|
||||||
sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always)
|
sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always)
|
||||||
%h force HTTP/1.0 requests (reduce update features, only for old servers or proxies)
|
%h force HTTP/1.0 requests (reduce update features, only for old servers or proxies)
|
||||||
%B tolerant requests (accept bogus responses on some servers, but not standard!)
|
%B tolerant requests (accept bogus responses on some servers, but not standard!)
|
||||||
@@ -2451,10 +2451,12 @@ work. We still are working to improve the mirror quality of HTTrack.
|
|||||||
|
|
||||||
<p align=justify><b>Q: Some Java applets do not work properly! </b>
|
<p align=justify><b>Q: Some Java applets do not work properly! </b>
|
||||||
|
|
||||||
<p align=justify> A: Java applets may not work in some cases, because
|
<p align=justify> A: Java applets may not work in some cases, for
|
||||||
HTTrack does not parse compiled class files to find the resources they
|
example if HTTrack failed to detect all included classes or files called
|
||||||
load. Java applets often need to be online anyway, since remote files
|
within the class file. Sometimes, Java applets need to be online,
|
||||||
are fetched directly at runtime.
|
because remote files are directly caught. Finally, the site structure
|
||||||
|
can be incompatible with the class (always try to keep the original site
|
||||||
|
structure when you want to get Java classes)
|
||||||
|
|
||||||
<p align=justify> If there is no way to make some classes work properly,
|
<p align=justify> If there is no way to make some classes work properly,
|
||||||
you can exclude them with the filters. They will be available, but only
|
you can exclude them with the filters. They will be available, but only
|
||||||
|
|||||||
@@ -764,9 +764,9 @@ check, * u1 check but /, u2 check always)
|
|||||||
<td width="78%">
|
<td width="78%">
|
||||||
|
|
||||||
|
|
||||||
<p>*parse scripts (j0 don t parse, bitmask: |1 parse
|
<p>*parse Java Classes (j0 don t parse, bitmask: |1 parse
|
||||||
default, |4 don t parse .js |8 don t be aggressive)
|
default, |2 don t parse .class |4 don t parse .js |8 don t
|
||||||
(--parse-java[=N])</p></td></tr>
|
be aggressive) (--parse-java[=N])</p></td></tr>
|
||||||
<tr valign="top" align="left">
|
<tr valign="top" align="left">
|
||||||
<td width="11%"></td>
|
<td width="11%"></td>
|
||||||
<td width="6%">
|
<td width="6%">
|
||||||
@@ -889,8 +889,8 @@ only) (--protocol[=N])</p></td></tr>
|
|||||||
<td width="78%">
|
<td width="78%">
|
||||||
|
|
||||||
|
|
||||||
<p>disable a specific external mime module (-%w
|
<p>disable a specific external mime module (-%w htsswf -%w
|
||||||
httrack-plugin) (--disable-module <param>)</p></td></tr>
|
htsjava) (--disable-module <param>)</p></td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<p style="margin-left:11%; margin-top: 1em"><b>Browser
|
<p style="margin-left:11%; margin-top: 1em"><b>Browser
|
||||||
@@ -2175,6 +2175,10 @@ Several scripts generating complex filenames may not find
|
|||||||
them (ex:
|
them (ex:
|
||||||
img.src=’image’+a+Mobj.dst+’.gif’)</small></p>
|
img.src=’image’+a+Mobj.dst+’.gif’)</small></p>
|
||||||
|
|
||||||
|
<p style="margin-left:11%; margin-top: 1em"><small>- Some
|
||||||
|
java classes may not find some files on them (class
|
||||||
|
included)</small></p>
|
||||||
|
|
||||||
<p style="margin-left:11%; margin-top: 1em"><small>-
|
<p style="margin-left:11%; margin-top: 1em"><small>-
|
||||||
Cgi-bin links may not work properly in some cases
|
Cgi-bin links may not work properly in some cases
|
||||||
(parameters needed). To avoid them: use filters like
|
(parameters needed). To avoid them: use filters like
|
||||||
|
|||||||
@@ -288,8 +288,8 @@ This option define whether the engine has to abandon a host if a timeout/"too sl
|
|||||||
&P extended parsing, attempt to parse all links (even in unknown tags or Javascript)
|
&P extended parsing, attempt to parse all links (even in unknown tags or Javascript)
|
||||||
This option activates the extended parsing, that attempt to find links in unknown Html code/javascript
|
This option activates the extended parsing, that attempt to find links in unknown Html code/javascript
|
||||||
|
|
||||||
j *parse scripts (j0 don't parse)
|
j *parse Java Classes (j0 don't parse)
|
||||||
This option defines whether the engine has to parse scripts or not to catch included files
|
This option define whether the engine has to parse java files or not to catch included files
|
||||||
|
|
||||||
I *make an index (I0 don't make)
|
I *make an index (I0 don't make)
|
||||||
This option define whether the engine has to generate an index.html on the top directory
|
This option define whether the engine has to generate an index.html on the top directory
|
||||||
|
|||||||
@@ -126,6 +126,7 @@ Note: the <i>Initialization</i>, <i>Main functions</i>, <i>Options handling</i>
|
|||||||
<li>the <tt>htsdefines.h</tt> prototype file, which describes callback function prototypes</li>
|
<li>the <tt>htsdefines.h</tt> prototype file, which describes callback function prototypes</li>
|
||||||
<li>the <tt>htsopt.h</tt> prototype file, which describes the full httrackp* structure</li>
|
<li>the <tt>htsopt.h</tt> prototype file, which describes the full httrackp* structure</li>
|
||||||
<li>the <tt>callbacks-example*.c</tt> files given in the httrack archive</li>
|
<li>the <tt>callbacks-example*.c</tt> files given in the httrack archive</li>
|
||||||
|
<li>the <tt>htsjava.c</tt> source file (the java class plugin ; overrides 'detect' and 'parse')</li>
|
||||||
<li>the example given at the end of this document</li>
|
<li>the example given at the end of this document</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|||||||
@@ -118,8 +118,8 @@ h4 { margin: 0; font-weight: bold; font-size: 1.18em; }
|
|||||||
<br>Avoid "never", because the local mirror could be bogus
|
<br>Avoid "never", because the local mirror could be bogus
|
||||||
</small><br><br>
|
</small><br><br>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<li>Parse scripts</li>
|
<li>Parse java files</li>
|
||||||
<br><small>Must the engine parse scripts to seek included filenames?
|
<br><small>Must the engine parse .java files (java classes) to seek included filenames?
|
||||||
<br>It is checked by default
|
<br>It is checked by default
|
||||||
</small><br><br>
|
</small><br><br>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|||||||
@@ -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 "12 July 2026" "httrack website copier"
|
.TH httrack 1 "07 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
|
||||||
@@ -224,7 +224,7 @@ explain which filter rule accepts or rejects a URL, then exit (\-\-why <param>)
|
|||||||
.IP \-u
|
.IP \-u
|
||||||
check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always) (\-\-check\-type[=N])
|
check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always) (\-\-check\-type[=N])
|
||||||
.IP \-j
|
.IP \-j
|
||||||
*parse scripts (j0 don't parse, bitmask: |1 parse default, |4 don't parse .js |8 don't be aggressive) (\-\-parse\-java[=N])
|
*parse Java Classes (j0 don't parse, bitmask: |1 parse default, |2 don't parse .class |4 don't parse .js |8 don't be aggressive) (\-\-parse\-java[=N])
|
||||||
.IP \-sN
|
.IP \-sN
|
||||||
follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always, 3=always (even strict rules)) (\-\-robots[=N])
|
follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always, 3=always (even strict rules)) (\-\-robots[=N])
|
||||||
.IP \-%h
|
.IP \-%h
|
||||||
@@ -248,7 +248,7 @@ can also be used to force a specific file type: \-\-assume foo.cgi=text/html
|
|||||||
.IP \-@iN
|
.IP \-@iN
|
||||||
internet protocol (0=both ipv6+ipv4, 4=ipv4 only, 6=ipv6 only) (\-\-protocol[=N])
|
internet protocol (0=both ipv6+ipv4, 4=ipv4 only, 6=ipv6 only) (\-\-protocol[=N])
|
||||||
.IP \-%w
|
.IP \-%w
|
||||||
disable a specific external mime module (\-%w httrack\-plugin) (\-\-disable\-module <param>)
|
disable a specific external mime module (\-%w htsswf \-%w htsjava) (\-\-disable\-module <param>)
|
||||||
.SS Browser ID:
|
.SS Browser ID:
|
||||||
.IP \-F
|
.IP \-F
|
||||||
user\-agent field sent in HTTP headers (\-F "user\-agent name") (\-\-user\-agent <param>)
|
user\-agent field sent in HTTP headers (\-F "user\-agent name") (\-\-user\-agent <param>)
|
||||||
@@ -514,6 +514,8 @@ that would have solved them.
|
|||||||
.SM
|
.SM
|
||||||
\- Several scripts generating complex filenames may not find them (ex: img.src='image'+a+Mobj.dst+'.gif')
|
\- Several scripts generating complex filenames may not find them (ex: img.src='image'+a+Mobj.dst+'.gif')
|
||||||
.SM
|
.SM
|
||||||
|
\- Some java classes may not find some files on them (class included)
|
||||||
|
.SM
|
||||||
\- Cgi\-bin links may not work properly in some cases (parameters needed). To avoid them: use filters like \-*cgi\-bin*
|
\- Cgi\-bin links may not work properly in some cases (parameters needed). To avoid them: use filters like \-*cgi\-bin*
|
||||||
.SH BUGS
|
.SH BUGS
|
||||||
Please reports bugs to
|
Please reports bugs to
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ httrack_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PIE)
|
|||||||
proxytrack_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PIE)
|
proxytrack_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PIE)
|
||||||
htsserver_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PIE)
|
htsserver_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PIE)
|
||||||
|
|
||||||
lib_LTLIBRARIES = libhttrack.la
|
lib_LTLIBRARIES = libhttrack.la libhtsjava.la
|
||||||
|
|
||||||
htsserver_SOURCES = htsserver.c htsserver.h htsweb.c htsweb.h
|
htsserver_SOURCES = htsserver.c htsserver.h htsweb.c htsweb.h
|
||||||
proxytrack_SOURCES = proxy/main.c \
|
proxytrack_SOURCES = proxy/main.c \
|
||||||
@@ -82,6 +82,14 @@ libhttrack_la_LIBADD = $(THREADS_LIBS) $(ZLIB_LIBS) $(OPENSSL_LIBS) $(DL_LIBS) $
|
|||||||
libhttrack_la_CFLAGS = $(AM_CFLAGS) -DLIBHTTRACK_EXPORTS -DZLIB_CONST
|
libhttrack_la_CFLAGS = $(AM_CFLAGS) -DLIBHTTRACK_EXPORTS -DZLIB_CONST
|
||||||
libhttrack_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(VERSION_INFO)
|
libhttrack_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(VERSION_INFO)
|
||||||
|
|
||||||
|
libhtsjava_la_SOURCES = htsjava.c htsjava.h
|
||||||
|
libhtsjava_la_LIBADD = $(THREADS_LIBS) $(DL_LIBS) libhttrack.la
|
||||||
|
# This thin JNI wrapper reaches libc only through libhttrack, so the direct
|
||||||
|
# libc edge is dropped from DT_NEEDED (library-not-linked-against-libc). Force
|
||||||
|
# libc back as a dependency; configure gates the flag since only a GNU-style
|
||||||
|
# linker accepts it (LIBC_FORCE_LINK is empty on e.g. macOS).
|
||||||
|
libhtsjava_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(VERSION_INFO) $(LIBC_FORCE_LINK)
|
||||||
|
|
||||||
EXTRA_DIST = httrack.h webhttrack \
|
EXTRA_DIST = httrack.h webhttrack \
|
||||||
coucal/murmurhash3.h.diff \
|
coucal/murmurhash3.h.diff \
|
||||||
coucal/murmurhash3.h.orig \
|
coucal/murmurhash3.h.orig \
|
||||||
@@ -111,6 +119,7 @@ EXTRA_DIST = httrack.h webhttrack \
|
|||||||
coucal/README.md \
|
coucal/README.md \
|
||||||
coucal/sample.c \
|
coucal/sample.c \
|
||||||
coucal/tests.c \
|
coucal/tests.c \
|
||||||
|
htsjava.vcproj \
|
||||||
httrack.dsp httrack.dsw httrack.vcproj \
|
httrack.dsp httrack.dsw httrack.vcproj \
|
||||||
libhttrack.dsp libhttrack.dsw libhttrack.vcproj \
|
libhttrack.dsp libhttrack.dsw libhttrack.vcproj \
|
||||||
webhttrack.dsp webhttrack.dsw webhttrack.vcproj
|
webhttrack.dsp webhttrack.dsw webhttrack.vcproj
|
||||||
|
|||||||
@@ -3875,6 +3875,7 @@ void voidf(void) {
|
|||||||
a = "| HTTrack Website Copier |" CRLF;
|
a = "| HTTrack Website Copier |" CRLF;
|
||||||
a = "|Code: Windows Interface Xavier Roche |" CRLF;
|
a = "|Code: Windows Interface Xavier Roche |" CRLF;
|
||||||
a = "| HTS/HTTrack Xavier Roche |" CRLF;
|
a = "| HTS/HTTrack Xavier Roche |" CRLF;
|
||||||
|
a = "| .class Parser Yann Philippot |" CRLF;
|
||||||
a = "| |" CRLF;
|
a = "| |" CRLF;
|
||||||
a = "|Tested on: Windows95,98,NT,2K |" CRLF;
|
a = "|Tested on: Windows95,98,NT,2K |" CRLF;
|
||||||
a = "| Linux PC |" CRLF;
|
a = "| Linux PC |" CRLF;
|
||||||
|
|||||||
@@ -1452,7 +1452,7 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) {
|
if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) {
|
||||||
HTS_PANIC_PRINTF
|
HTS_PANIC_PRINTF
|
||||||
("Option %w needs to be followed by a blank space, and a module name");
|
("Option %w needs to be followed by a blank space, and a module name");
|
||||||
printf("Example: -%%w httrack-plugin\n");
|
printf("Example: -%%w htsswf\n");
|
||||||
htsmain_free();
|
htsmain_free();
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ typedef struct t_hts_callbackarg t_hts_callbackarg;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Marks a symbol an external wrapper module exports back to the engine.
|
/* Marks a symbol an external wrapper module exports back to the engine.
|
||||||
Must override -fvisibility=hidden on ELF, or dlopen()ed plugins
|
Must override -fvisibility=hidden on ELF, or dlopen()ed plugins (htsjava)
|
||||||
hide their own hts_plug()/hts_unplug() entry points. */
|
hide their own hts_plug()/hts_unplug() entry points. */
|
||||||
#ifndef EXTERNAL_FUNCTION
|
#ifndef EXTERNAL_FUNCTION
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|||||||
@@ -121,18 +121,12 @@ int fa_strjoker_dual(int type, char **filters, int nfil, const char *nom1,
|
|||||||
return use1 ? jok1 : jok2;
|
return use1 ? jok1 : jok2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Real filters/URLs fit HTS_URLMAXSIZE*2; past it a hostile pattern recurses
|
|
||||||
O(len) deep or runs O(n^2*stars). Cap length (depth) and steps (work). */
|
|
||||||
#define STRJOKER_MAXLEN (HTS_URLMAXSIZE * 2)
|
|
||||||
#define STRJOKER_MAXSTEPS 2000000u
|
|
||||||
|
|
||||||
/* Failure memo for the recursive matcher: one bit per (chaine, joker) offset
|
/* Failure memo for the recursive matcher: one bit per (chaine, joker) offset
|
||||||
pair keeps star-heavy patterns polynomial instead of exponential (#501). */
|
pair keeps star-heavy patterns polynomial instead of exponential (#501). */
|
||||||
typedef struct strjoker_memo {
|
typedef struct strjoker_memo {
|
||||||
const char *chaine0, *joker0; /* offsets are relative to these bases */
|
const char *chaine0, *joker0; /* offsets are relative to these bases */
|
||||||
size_t stride; /* strlen(joker0) + 1 */
|
size_t stride; /* strlen(joker0) + 1 */
|
||||||
unsigned char *failed; /* failed-pair bitmap; NULL: no memo */
|
unsigned char *failed; /* failed-pair bitmap; NULL: no memo */
|
||||||
size_t *nsteps; /* shared work counter; NULL: unbounded (oracle) */
|
|
||||||
} strjoker_memo;
|
} strjoker_memo;
|
||||||
|
|
||||||
static const char *strjoker_impl(const strjoker_memo *memo, const char *chaine,
|
static const char *strjoker_impl(const strjoker_memo *memo, const char *chaine,
|
||||||
@@ -147,8 +141,6 @@ static const char *strjoker_rec(const strjoker_memo *memo, const char *chaine,
|
|||||||
size_t bit = 0;
|
size_t bit = 0;
|
||||||
const char *adr;
|
const char *adr;
|
||||||
|
|
||||||
if (memo->nsteps != NULL && ++*memo->nsteps > STRJOKER_MAXSTEPS)
|
|
||||||
return NULL; /* work budget spent: fail the match safely */
|
|
||||||
if (memo->failed) {
|
if (memo->failed) {
|
||||||
bit = (size_t) (chaine - memo->chaine0) * memo->stride +
|
bit = (size_t) (chaine - memo->chaine0) * memo->stride +
|
||||||
(size_t) (joker - memo->joker0);
|
(size_t) (joker - memo->joker0);
|
||||||
@@ -161,24 +153,22 @@ static const char *strjoker_rec(const strjoker_memo *memo, const char *chaine,
|
|||||||
return adr;
|
return adr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Match chaine against joker with a shared work budget *nsteps (a strjokerfind
|
// wildcard comparator: match chaine against joker (pattern), case-insensitive
|
||||||
sweep passes one counter, bounding the whole scan). */
|
// returns the address of the first matched letter past any leading joker
|
||||||
static const char *strjoker_bounded(const char *chaine, const char *joker,
|
// (ie. *[..]toto.. returns the address of toto within chaine), NULL on mismatch
|
||||||
LLint *size, int *size_flag,
|
HTS_INLINE const char *strjoker(const char *chaine, const char *joker,
|
||||||
size_t *nsteps) {
|
LLint *size, int *size_flag) {
|
||||||
strjoker_memo memo = {chaine, joker, 0, NULL, nsteps};
|
strjoker_memo memo = {chaine, joker, 0, NULL};
|
||||||
unsigned char stackbits[2048];
|
unsigned char stackbits[2048];
|
||||||
hts_boolean onheap = HTS_FALSE;
|
hts_boolean onheap = HTS_FALSE;
|
||||||
const char *adr;
|
const char *adr;
|
||||||
|
|
||||||
if (chaine != NULL && joker != NULL) {
|
if (chaine != NULL && joker != NULL) {
|
||||||
const size_t l1 = strlen(chaine), l2 = strlen(joker);
|
const size_t n1 = strlen(chaine) + 1;
|
||||||
|
|
||||||
if (l1 > STRJOKER_MAXLEN || l2 > STRJOKER_MAXLEN)
|
memo.stride = strlen(joker) + 1;
|
||||||
return NULL; /* beyond any real filter/URL: bound depth+work */
|
if (n1 <= (SIZE_MAX - 7) / memo.stride) { // overflow-safe bitmap size
|
||||||
memo.stride = l2 + 1;
|
const size_t bytes = (n1 * memo.stride + 7) / 8;
|
||||||
if (l1 + 1 <= (SIZE_MAX - 7) / memo.stride) { // overflow-safe bitmap size
|
|
||||||
const size_t bytes = ((l1 + 1) * memo.stride + 7) / 8;
|
|
||||||
|
|
||||||
if (bytes <= sizeof(stackbits)) {
|
if (bytes <= sizeof(stackbits)) {
|
||||||
memset(stackbits, 0, bytes);
|
memset(stackbits, 0, bytes);
|
||||||
@@ -195,16 +185,6 @@ static const char *strjoker_bounded(const char *chaine, const char *joker,
|
|||||||
return adr;
|
return adr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// wildcard comparator: match chaine against joker (pattern), case-insensitive
|
|
||||||
// returns the address of the first matched letter past any leading joker
|
|
||||||
// (ie. *[..]toto.. returns the address of toto within chaine), NULL on mismatch
|
|
||||||
HTS_INLINE const char *strjoker(const char *chaine, const char *joker,
|
|
||||||
LLint *size, int *size_flag) {
|
|
||||||
size_t nsteps = 0;
|
|
||||||
|
|
||||||
return strjoker_bounded(chaine, joker, size, size_flag, &nsteps);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Test-only oracle: the same matcher without the failure memo. */
|
/* Test-only oracle: the same matcher without the failure memo. */
|
||||||
const char *strjoker_nomemo(const char *chaine, const char *joker, LLint *size,
|
const char *strjoker_nomemo(const char *chaine, const char *joker, LLint *size,
|
||||||
int *size_flag) {
|
int *size_flag) {
|
||||||
@@ -451,18 +431,12 @@ static const char *strjoker_impl(const strjoker_memo *memo, const char *chaine,
|
|||||||
// d'un strcpy sur une variable ayant un nom en lettres et copiant une chaine de chiffres
|
// d'un strcpy sur une variable ayant un nom en lettres et copiant une chaine de chiffres
|
||||||
// ATTENTION!! Eviter les jokers en début, où gare au temps machine!
|
// ATTENTION!! Eviter les jokers en début, où gare au temps machine!
|
||||||
const char *strjokerfind(const char *chaine, const char *joker) {
|
const char *strjokerfind(const char *chaine, const char *joker) {
|
||||||
size_t nsteps = 0; /* one budget for the whole scan */
|
|
||||||
const char *adr;
|
const char *adr;
|
||||||
|
|
||||||
if (chaine != NULL && strlen(chaine) > STRJOKER_MAXLEN)
|
|
||||||
return NULL;
|
|
||||||
while(*chaine) {
|
while(*chaine) {
|
||||||
if ((adr = strjoker_bounded(chaine, joker, NULL, NULL,
|
if ((adr = strjoker(chaine, joker, NULL, NULL))) { // ok trouvé
|
||||||
&nsteps))) { // ok trouvé
|
|
||||||
return adr;
|
return adr;
|
||||||
}
|
}
|
||||||
if (nsteps > STRJOKER_MAXSTEPS) // scan budget spent: no match
|
|
||||||
return NULL;
|
|
||||||
chaine++;
|
chaine++;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
@@ -546,8 +546,8 @@ void help(const char *app, int more) {
|
|||||||
infomsg(" %Y explain which filter rule accepts or rejects a URL, then exit");
|
infomsg(" %Y explain which filter rule accepts or rejects a URL, then exit");
|
||||||
infomsg
|
infomsg
|
||||||
(" u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always)");
|
(" u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always)");
|
||||||
infomsg(" j *parse scripts (j0 don't parse, bitmask: |1 parse default, |4 "
|
infomsg
|
||||||
"don't parse .js |8 don't be aggressive)");
|
(" j *parse Java Classes (j0 don't parse, bitmask: |1 parse default, |2 don't parse .class |4 don't parse .js |8 don't be aggressive)");
|
||||||
infomsg
|
infomsg
|
||||||
(" sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always, 3=always (even strict rules))");
|
(" sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always, 3=always (even strict rules))");
|
||||||
infomsg
|
infomsg
|
||||||
@@ -571,7 +571,8 @@ void help(const char *app, int more) {
|
|||||||
(" can also be used to force a specific file type: --assume foo.cgi=text/html");
|
(" can also be used to force a specific file type: --assume foo.cgi=text/html");
|
||||||
infomsg
|
infomsg
|
||||||
(" @iN internet protocol (0=both ipv6+ipv4, 4=ipv4 only, 6=ipv6 only)");
|
(" @iN internet protocol (0=both ipv6+ipv4, 4=ipv4 only, 6=ipv6 only)");
|
||||||
infomsg(" %w disable a specific external mime module (-%w httrack-plugin)");
|
infomsg
|
||||||
|
(" %w disable a specific external mime module (-%w htsswf -%w htsjava)");
|
||||||
infomsg("");
|
infomsg("");
|
||||||
infomsg("Browser ID:");
|
infomsg("Browser ID:");
|
||||||
infomsg
|
infomsg
|
||||||
|
|||||||
517
src/htsjava.c
Normal file
517
src/htsjava.c
Normal file
@@ -0,0 +1,517 @@
|
|||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/*
|
||||||
|
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: Java classes parser */
|
||||||
|
/* Author: Yann Philippot */
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
|
||||||
|
/* Version: Oct/2000 */
|
||||||
|
/* Fixed: problems with class structure (10/2000) */
|
||||||
|
|
||||||
|
// htsjava.c - Parseur de classes java
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#if ( defined(_WIN32) ||defined(HAVE_SYS_TYPES_H) )
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Standard httrack module includes */
|
||||||
|
#include "httrack-library.h"
|
||||||
|
#include "htsopt.h"
|
||||||
|
#include "htsdefines.h"
|
||||||
|
|
||||||
|
/* Module structures */
|
||||||
|
#include "htsmodules.h"
|
||||||
|
|
||||||
|
/* We link to libhttrack, we can use its functions */
|
||||||
|
#include "httrack-library.h"
|
||||||
|
|
||||||
|
/* This file */
|
||||||
|
#include "htsjava.h"
|
||||||
|
|
||||||
|
/* calloct/freet wrappers */
|
||||||
|
#include "htssafe.h"
|
||||||
|
|
||||||
|
static int reverse_endian(void) {
|
||||||
|
int endian = 1;
|
||||||
|
|
||||||
|
return (*((char *) &endian) == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* big/little endian swap */
|
||||||
|
#define hts_swap16(A) ( (((A) & 0xFF)<<8) | (((A) & 0xFF00)>>8) )
|
||||||
|
#define hts_swap32(A) ( (( (hts_swap16(A)) & 0xFFFF)<<16) | (( (hts_swap16(A>>16)) & 0xFFFF)) )
|
||||||
|
|
||||||
|
/* Static definitions */
|
||||||
|
static RESP_STRUCT readtable(htsmoduleStruct * str, FILE * fp, RESP_STRUCT,
|
||||||
|
int *);
|
||||||
|
static unsigned short int readshort(FILE * fp);
|
||||||
|
static int tris(httrackp * opt, char *);
|
||||||
|
static char *printname(char[1024], char[1024]);
|
||||||
|
|
||||||
|
// ** HTS_xx sinon pas pris par VC++
|
||||||
|
#define HTS_CLASS 7
|
||||||
|
#define HTS_FIELDREF 9
|
||||||
|
#define HTS_METHODREF 10
|
||||||
|
#define HTS_STRING 8
|
||||||
|
#define HTS_INTEGER 3
|
||||||
|
#define HTS_FLOAT 4
|
||||||
|
#define HTS_LONG 5
|
||||||
|
#define HTS_DOUBLE 6
|
||||||
|
#define HTS_INTERFACE 11
|
||||||
|
#define HTS_NAMEANDTYPE 12
|
||||||
|
#define HTS_ASCIZ 1
|
||||||
|
#define HTS_UNICODE 2
|
||||||
|
|
||||||
|
#define JAVADEBUG 0
|
||||||
|
|
||||||
|
static const char *libName = "htsjava";
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define strcasecmp(a,b) stricmp(a,b)
|
||||||
|
#define strncasecmp(a,b,n) strnicmp(a,b,n)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int detect_mime(htsmoduleStruct * str) {
|
||||||
|
const char *savename = str->filename;
|
||||||
|
|
||||||
|
if (savename) {
|
||||||
|
int len = (int) strlen(savename);
|
||||||
|
|
||||||
|
if (len > 6 && strcasecmp(savename + len - 6, ".class") == 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int hts_detect_java(t_hts_callbackarg * carg, httrackp * opt,
|
||||||
|
htsmoduleStruct * str) {
|
||||||
|
/* Call parent functions if multiple callbacks are chained. */
|
||||||
|
if (CALLBACKARG_PREV_FUN(carg, detect) != NULL) {
|
||||||
|
if (CALLBACKARG_PREV_FUN(carg, detect)
|
||||||
|
(CALLBACKARG_PREV_CARG(carg), opt, str)) {
|
||||||
|
return 1; /* Found before us, let them have the priority */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check MIME */
|
||||||
|
if (detect_mime(str)) {
|
||||||
|
str->wrapper_name = libName; /* Our ID */
|
||||||
|
return 1; /* Known format, we take it */
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0; /* Unknown format */
|
||||||
|
}
|
||||||
|
|
||||||
|
static off_t fsize(const char *s) {
|
||||||
|
STRUCT_STAT st;
|
||||||
|
|
||||||
|
if (STAT(s, &st) == 0 && S_ISREG(st.st_mode)) {
|
||||||
|
return st.st_size;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int hts_parse_java(t_hts_callbackarg * carg, httrackp * opt,
|
||||||
|
htsmoduleStruct * str) {
|
||||||
|
/* The wrapper_name memebr has changed: not for us anymore */
|
||||||
|
if (str->wrapper_name == NULL || strcmp(str->wrapper_name, libName) != 0) {
|
||||||
|
/* Call parent functions if multiple callbacks are chained. */
|
||||||
|
if (CALLBACKARG_PREV_FUN(carg, parse) != NULL) {
|
||||||
|
return CALLBACKARG_PREV_FUN(carg, parse) (CALLBACKARG_PREV_CARG(carg),
|
||||||
|
opt, str);
|
||||||
|
}
|
||||||
|
strcpy(str->err_msg,
|
||||||
|
"unexpected error: bad wrapper_name and no previous wrapper");
|
||||||
|
return 0; /* Unexpected error */
|
||||||
|
} else {
|
||||||
|
if (detect_mime(str)) {
|
||||||
|
|
||||||
|
/* (Legacy code) */
|
||||||
|
char catbuff[CATBUFF_SIZE];
|
||||||
|
FILE *fpout;
|
||||||
|
JAVA_HEADER header;
|
||||||
|
RESP_STRUCT *tab;
|
||||||
|
const char *file = str->filename;
|
||||||
|
|
||||||
|
str->relativeToHtmlLink = 1;
|
||||||
|
|
||||||
|
#if JAVADEBUG
|
||||||
|
printf("fopen\n");
|
||||||
|
#endif
|
||||||
|
if ((fpout = FOPEN(fconv(catbuff, sizeof(catbuff), file), "r+b")) ==
|
||||||
|
NULL) {
|
||||||
|
sprintf(str->err_msg, "Unable to open file %s", file);
|
||||||
|
return 0; // une erreur..
|
||||||
|
}
|
||||||
|
#if JAVADEBUG
|
||||||
|
printf("fread\n");
|
||||||
|
#endif
|
||||||
|
if (fread(&header, 1, 10, fpout) != 10) { // pas complet..
|
||||||
|
fclose(fpout);
|
||||||
|
sprintf(str->err_msg, "File header too small (file len = " LLintP ")",
|
||||||
|
(LLint) fsize(file));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#if JAVADEBUG
|
||||||
|
printf("header\n");
|
||||||
|
#endif
|
||||||
|
// tester en tête
|
||||||
|
if (reverse_endian()) {
|
||||||
|
header.magic = hts_swap32(header.magic);
|
||||||
|
header.count = hts_swap16(header.count);
|
||||||
|
}
|
||||||
|
if (header.magic != 0xCAFEBABE) {
|
||||||
|
sprintf(str->err_msg, "non java file");
|
||||||
|
if (fpout) {
|
||||||
|
fclose(fpout);
|
||||||
|
fpout = NULL;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A constant-pool entry is >= 1 byte on disk; reject a count exceeding
|
||||||
|
the file size (hostile .class ~68 MB alloc DoS). */
|
||||||
|
if (!hts_count_fits(header.count, (LLint) fsize(file))) {
|
||||||
|
fclose(fpout);
|
||||||
|
sprintf(str->err_msg,
|
||||||
|
"Invalid constant pool count %u (file len " LLintP ")",
|
||||||
|
(unsigned) header.count, (LLint) fsize(file));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
tab = (RESP_STRUCT *) calloct(header.count, sizeof(RESP_STRUCT));
|
||||||
|
if (!tab) {
|
||||||
|
sprintf(str->err_msg, "Unable to alloc %d bytes",
|
||||||
|
(int) sizeof(RESP_STRUCT));
|
||||||
|
if (fpout) {
|
||||||
|
fclose(fpout);
|
||||||
|
fpout = NULL;
|
||||||
|
}
|
||||||
|
return 0; // erreur..
|
||||||
|
}
|
||||||
|
#if JAVADEBUG
|
||||||
|
printf("calchead\n");
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i = 1; i < header.count; i++) {
|
||||||
|
int err = 0; // ++
|
||||||
|
|
||||||
|
tab[i] = readtable(str, fpout, tab[i], &err);
|
||||||
|
if (!err) {
|
||||||
|
if ((tab[i].type == HTS_LONG) || (tab[i].type == HTS_DOUBLE))
|
||||||
|
i++; //2 element si double ou float
|
||||||
|
} else { // ++ une erreur est survenue!
|
||||||
|
if (strnotempty(str->err_msg) == 0)
|
||||||
|
strcpy(str->err_msg, "Internal readtable error");
|
||||||
|
freet(tab);
|
||||||
|
if (fpout) {
|
||||||
|
fclose(fpout);
|
||||||
|
fpout = NULL;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#if JAVADEBUG
|
||||||
|
printf("addfiles\n");
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
unsigned int Class;
|
||||||
|
unsigned int SClass;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
Class = readshort(fpout);
|
||||||
|
SClass = readshort(fpout);
|
||||||
|
|
||||||
|
for(i = 1; i < header.count; i++) {
|
||||||
|
|
||||||
|
if (tab[i].type == HTS_CLASS) {
|
||||||
|
|
||||||
|
if ((tab[i].index1 < header.count) && (tab[i].index1 >= 0)) {
|
||||||
|
|
||||||
|
if ((tab[i].index1 != SClass) && (tab[i].index1 != Class)
|
||||||
|
&& (tab[tab[i].index1].name[0] != '[')) {
|
||||||
|
|
||||||
|
if (!strstr(tab[tab[i].index1].name, "java/")) {
|
||||||
|
char BIGSTK tempo[1024];
|
||||||
|
|
||||||
|
tempo[0] = '\0';
|
||||||
|
|
||||||
|
snprintf(tempo, sizeof(tempo), "%s.class", tab[tab[i].index1].name);
|
||||||
|
#if JAVADEBUG
|
||||||
|
printf("add %s\n", tempo);
|
||||||
|
#endif
|
||||||
|
if (tab[tab[i].index1].file_position >= 0)
|
||||||
|
str->addLink(str, tempo); /* tab[tab[i].index1].file_position */
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
i = header.count; // exit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if JAVADEBUG
|
||||||
|
printf("end\n");
|
||||||
|
#endif
|
||||||
|
freet(tab);
|
||||||
|
if (fpout) {
|
||||||
|
fclose(fpout);
|
||||||
|
fpout = NULL;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
strcpy(str->err_msg, "bad MIME type");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0; /* Error */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
module entry point
|
||||||
|
*/
|
||||||
|
EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv);
|
||||||
|
EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv) {
|
||||||
|
/* Plug callback functions */
|
||||||
|
CHAIN_FUNCTION(opt, detect, hts_detect_java, NULL);
|
||||||
|
CHAIN_FUNCTION(opt, parse, hts_parse_java, NULL);
|
||||||
|
|
||||||
|
return 1; /* success */
|
||||||
|
}
|
||||||
|
|
||||||
|
// error: !=0 si erreur fatale
|
||||||
|
static RESP_STRUCT readtable(htsmoduleStruct * str, FILE * fp,
|
||||||
|
RESP_STRUCT trans, int *error) {
|
||||||
|
char rname[1024];
|
||||||
|
unsigned short int length;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
*error = 0; // pas d'erreur
|
||||||
|
trans.file_position = -1;
|
||||||
|
trans.type = (int) (unsigned char) fgetc(fp);
|
||||||
|
switch (trans.type) {
|
||||||
|
case HTS_CLASS:
|
||||||
|
strcpy(trans.name, "Class");
|
||||||
|
trans.index1 = readshort(fp);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HTS_FIELDREF:
|
||||||
|
strcpy(trans.name, "Field Reference");
|
||||||
|
trans.index1 = readshort(fp);
|
||||||
|
readshort(fp);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HTS_METHODREF:
|
||||||
|
strcpy(trans.name, "Method Reference");
|
||||||
|
trans.index1 = readshort(fp);
|
||||||
|
readshort(fp);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HTS_INTERFACE:
|
||||||
|
strcpy(trans.name, "Interface Method Reference");
|
||||||
|
trans.index1 = readshort(fp);
|
||||||
|
readshort(fp);
|
||||||
|
break;
|
||||||
|
case HTS_NAMEANDTYPE:
|
||||||
|
strcpy(trans.name, "Name and Type");
|
||||||
|
trans.index1 = readshort(fp);
|
||||||
|
readshort(fp);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HTS_STRING: // CONSTANT_String
|
||||||
|
strcpy(trans.name, "String");
|
||||||
|
trans.index1 = readshort(fp);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HTS_INTEGER:
|
||||||
|
strcpy(trans.name, "Integer");
|
||||||
|
for(j = 0; j < 4; j++)
|
||||||
|
fgetc(fp);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HTS_FLOAT:
|
||||||
|
strcpy(trans.name, "Float");
|
||||||
|
for(j = 0; j < 4; j++)
|
||||||
|
fgetc(fp);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HTS_LONG:
|
||||||
|
strcpy(trans.name, "Long");
|
||||||
|
for(j = 0; j < 8; j++)
|
||||||
|
fgetc(fp);
|
||||||
|
break;
|
||||||
|
case HTS_DOUBLE:
|
||||||
|
strcpy(trans.name, "Double");
|
||||||
|
for(j = 0; j < 8; j++)
|
||||||
|
fgetc(fp);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HTS_ASCIZ:
|
||||||
|
case HTS_UNICODE:
|
||||||
|
|
||||||
|
if (trans.type == HTS_ASCIZ)
|
||||||
|
strcpy(trans.name, "HTS_ASCIZ");
|
||||||
|
else
|
||||||
|
strcpy(trans.name, "HTS_UNICODE");
|
||||||
|
|
||||||
|
{
|
||||||
|
char BIGSTK buffer[1024];
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
p = &buffer[0];
|
||||||
|
|
||||||
|
trans.file_position = ftell(fp);
|
||||||
|
length = readshort(fp);
|
||||||
|
if (length < HTS_URLMAXSIZE) {
|
||||||
|
while(length > 0) {
|
||||||
|
*p++ = fgetc(fp);
|
||||||
|
|
||||||
|
length--;
|
||||||
|
}
|
||||||
|
*p = '\0';
|
||||||
|
|
||||||
|
if (tris(str->opt, buffer) == 1)
|
||||||
|
str->addLink(str, buffer); /* trans.file_position */
|
||||||
|
else if (tris(str->opt, buffer) == 2)
|
||||||
|
str->addLink(str, printname(rname, buffer));
|
||||||
|
|
||||||
|
strcpy(trans.name, buffer);
|
||||||
|
} else { // gros pb
|
||||||
|
while((length > 0) && (!feof(fp))) {
|
||||||
|
fgetc(fp);
|
||||||
|
length--;
|
||||||
|
}
|
||||||
|
if (!feof(fp)) {
|
||||||
|
trans.type = -1;
|
||||||
|
} else {
|
||||||
|
sprintf(str->err_msg, "Internal structure error (ASCII)");
|
||||||
|
*error = 1;
|
||||||
|
}
|
||||||
|
return (trans);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// on arrête tout
|
||||||
|
sprintf(str->err_msg, "Internal structure unknown (type %d)", trans.type);
|
||||||
|
*error = 1;
|
||||||
|
return (trans);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return (trans);
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned short int readshort(FILE * fp) {
|
||||||
|
unsigned short int valint;
|
||||||
|
|
||||||
|
if (fread(&valint, sizeof(valint), 1, fp) == 1) {
|
||||||
|
if (reverse_endian())
|
||||||
|
return hts_swap16(valint);
|
||||||
|
else
|
||||||
|
return valint;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static int tris(httrackp * opt, char *buffer) {
|
||||||
|
char catbuff[CATBUFF_SIZE];
|
||||||
|
|
||||||
|
//
|
||||||
|
// Java
|
||||||
|
if ((buffer[0] == '[') && buffer[1] == 'L' && (!strstr(buffer, "java/")))
|
||||||
|
return 2;
|
||||||
|
if (strstr(buffer, ".gif") || strstr(buffer, ".jpg")
|
||||||
|
|| strstr(buffer, ".jpeg") || strstr(buffer, ".au"))
|
||||||
|
return 1;
|
||||||
|
// Ajouts R.X: test type
|
||||||
|
// Autres fichiers
|
||||||
|
{
|
||||||
|
char type[256];
|
||||||
|
|
||||||
|
if (get_httptype_sized(opt, type, sizeof(type), buffer,
|
||||||
|
0)) // recognized type
|
||||||
|
return 1;
|
||||||
|
// ajout RX 05/2001
|
||||||
|
else if (is_dyntype(get_ext(catbuff, sizeof(catbuff), buffer))) // asp,cgi...
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *printname(char rname[1024], char name[1024]) {
|
||||||
|
char *p;
|
||||||
|
char *p1;
|
||||||
|
size_t j;
|
||||||
|
|
||||||
|
rname[0] = '\0';
|
||||||
|
//
|
||||||
|
|
||||||
|
p = &name[0];
|
||||||
|
|
||||||
|
if (*p != '[') {
|
||||||
|
return rname; // ""
|
||||||
|
}
|
||||||
|
p += 2;
|
||||||
|
p1 = rname;
|
||||||
|
for(j = 0; name[j] != '\0'; j++, p++) {
|
||||||
|
if (*p == '/')
|
||||||
|
*p1 = '.';
|
||||||
|
if (*p == ';') {
|
||||||
|
*p1 = '\0';
|
||||||
|
strcat(rname, ".class");
|
||||||
|
return rname;
|
||||||
|
} else
|
||||||
|
*p1 = *p;
|
||||||
|
p1++;
|
||||||
|
}
|
||||||
|
p1 -= 3;
|
||||||
|
*p1 = '\0';
|
||||||
|
return rname;
|
||||||
|
|
||||||
|
}
|
||||||
70
src/htsjava.h
Normal file
70
src/htsjava.h
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/*
|
||||||
|
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: Java classes parser .h */
|
||||||
|
/* Author: Yann Philippot */
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
|
||||||
|
#ifndef HTSJAVA_DEFH
|
||||||
|
#define HTSJAVA_DEFH
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifndef HTS_DEF_FWSTRUCT_JAVA_HEADER
|
||||||
|
#define HTS_DEF_FWSTRUCT_JAVA_HEADER
|
||||||
|
typedef struct JAVA_HEADER JAVA_HEADER;
|
||||||
|
#endif
|
||||||
|
/* 10-byte on-disk .class header image, fread() directly: fields need exact
|
||||||
|
widths (LP64's 8-byte 'unsigned long' magic never matched 0xCAFEBABE). */
|
||||||
|
struct JAVA_HEADER {
|
||||||
|
uint32_t magic;
|
||||||
|
uint16_t minor;
|
||||||
|
uint16_t major;
|
||||||
|
uint16_t count;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifndef HTS_DEF_FWSTRUCT_RESP_STRUCT
|
||||||
|
#define HTS_DEF_FWSTRUCT_RESP_STRUCT
|
||||||
|
typedef struct RESP_STRUCT RESP_STRUCT;
|
||||||
|
#endif
|
||||||
|
struct RESP_STRUCT {
|
||||||
|
int file_position;
|
||||||
|
//
|
||||||
|
unsigned int index1;
|
||||||
|
unsigned int type;
|
||||||
|
char name[1024];
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Library internal definictions */
|
||||||
|
#ifdef HTS_INTERNAL_BYTECODE
|
||||||
|
|
||||||
|
EXTERNAL_FUNCTION int hts_plug_java(httrackp * opt, const char *argv);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
373
src/htsjava.vcproj
Normal file
373
src/htsjava.vcproj
Normal file
@@ -0,0 +1,373 @@
|
|||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="9,00"
|
||||||
|
Name="htsjava"
|
||||||
|
ProjectGUID="{2F353408-2C6C-4D31-9AC0-08BDC064DF64}"
|
||||||
|
RootNamespace="htsjava"
|
||||||
|
Keyword="Win32Proj"
|
||||||
|
TargetFrameworkVersion="131072"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
<Platform
|
||||||
|
Name="x64"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
OutputDirectory="C:\temp\htsjava\Debug"
|
||||||
|
IntermediateDirectory="C:\temp\htsjava\Debug"
|
||||||
|
ConfigurationType="2"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="C:\Dev\openssl-1.0.1j\include"
|
||||||
|
PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE"
|
||||||
|
MinimalRebuild="true"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="1"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="true"
|
||||||
|
DebugInformationFormat="4"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
OutputFile="C:\temp\httrack\htsjava.dll"
|
||||||
|
LinkIncremental="2"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
ProgramDatabaseFile="$(OutDir)/htsjava.pdb"
|
||||||
|
SubSystem="2"
|
||||||
|
RandomizedBaseAddress="1"
|
||||||
|
DataExecutionPrevention="0"
|
||||||
|
ImportLibrary="$(OutDir)/htsjava.lib"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|x64"
|
||||||
|
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||||
|
ConfigurationType="2"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
TargetEnvironment="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="C:\Dev\openssl-1.0.1j\include"
|
||||||
|
PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE"
|
||||||
|
MinimalRebuild="true"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="1"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="true"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
OutputFile="C:\temp\httrack64\htsjava.dll"
|
||||||
|
LinkIncremental="2"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
ProgramDatabaseFile="$(OutDir)/htsjava.pdb"
|
||||||
|
SubSystem="2"
|
||||||
|
RandomizedBaseAddress="1"
|
||||||
|
DataExecutionPrevention="0"
|
||||||
|
ImportLibrary="$(OutDir)/htsjava.lib"
|
||||||
|
TargetMachine="17"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory="C:\temp\htsjava\Release"
|
||||||
|
IntermediateDirectory="C:\temp\htsjava\Release"
|
||||||
|
ConfigurationType="2"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalIncludeDirectories="C:\Dev\openssl-1.0.1j\include"
|
||||||
|
PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE"
|
||||||
|
RuntimeLibrary="0"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="true"
|
||||||
|
DebugInformationFormat="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
OutputFile="O:\HTTrack\httrack\htsjava.dll"
|
||||||
|
LinkIncremental="1"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
ProgramDatabaseFile="O:\HTTrack\httrack\htsjava.pdb"
|
||||||
|
SubSystem="2"
|
||||||
|
OptimizeReferences="2"
|
||||||
|
EnableCOMDATFolding="2"
|
||||||
|
RandomizedBaseAddress="1"
|
||||||
|
DataExecutionPrevention="0"
|
||||||
|
ImportLibrary="$(OutDir)/htsjava.lib"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
CommandLine=""C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\signtool.exe" sign /f "Z:\Mes Documents\certificats\httrack-com\httrack-signing-certificate.pfx" /t http://timestamp.verisign.com/scripts/timstamp.dll $(TargetPath)
"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|x64"
|
||||||
|
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||||
|
ConfigurationType="2"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
TargetEnvironment="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalIncludeDirectories="C:\Dev\openssl-1.0.1j\include"
|
||||||
|
PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE"
|
||||||
|
RuntimeLibrary="0"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="true"
|
||||||
|
DebugInformationFormat="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
OutputFile="O:\HTTrack\httrack\x64\htsjava.dll"
|
||||||
|
LinkIncremental="1"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
ProgramDatabaseFile="O:\HTTrack\httrack\x64\htsjava.pdb"
|
||||||
|
SubSystem="2"
|
||||||
|
OptimizeReferences="2"
|
||||||
|
EnableCOMDATFolding="2"
|
||||||
|
RandomizedBaseAddress="1"
|
||||||
|
DataExecutionPrevention="0"
|
||||||
|
ImportLibrary="$(OutDir)/htsjava.lib"
|
||||||
|
TargetMachine="17"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
CommandLine=""C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\signtool.exe" sign /f "Z:\Mes Documents\certificats\httrack-com\httrack-signing-certificate.pfx" /t http://timestamp.verisign.com/scripts/timstamp.dll $(TargetPath)
"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="htsjava.c"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="htsjava.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Resource Files"
|
||||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
|
||||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
||||||
|
>
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
||||||
20
src/htslib.c
20
src/htslib.c
@@ -1708,9 +1708,6 @@ void treathead(t_cookie * cookie, const char *adr, const char *fil, htsblk * ret
|
|||||||
#if DEBUG_COOK
|
#if DEBUG_COOK
|
||||||
printf("set-cookie detected\n");
|
printf("set-cookie detected\n");
|
||||||
#endif
|
#endif
|
||||||
/* Over-long host overflows the fail-safe domain[] copy (abort); drop it. */
|
|
||||||
if (adr && strlen(jump_identification_const(adr)) >= sizeof(domain))
|
|
||||||
return;
|
|
||||||
while(*a) {
|
while(*a) {
|
||||||
char *token_st, *token_end;
|
char *token_st, *token_end;
|
||||||
char *value_st, *value_end;
|
char *value_st, *value_end;
|
||||||
@@ -2578,11 +2575,6 @@ int ident_url_absolute(const char *url, lien_adrfil *adrfil) {
|
|||||||
// recopier adrfil->adresse www..
|
// recopier adrfil->adresse www..
|
||||||
strncatbuff(adrfil->adr, p, ((int) (q - p)));
|
strncatbuff(adrfil->adr, p, ((int) (q - p)));
|
||||||
// *( adrfil->adr+( ((int) q) - ((int) p) ) )=0; // faut arrêter la fumette!
|
// *( adrfil->adr+( ((int) q) - ((int) p) ) )=0; // faut arrêter la fumette!
|
||||||
|
|
||||||
// fil[] holds the path plus a possible leading '/' the top strlen() misses.
|
|
||||||
if (strlen(q) >= sizeof(adrfil->fil) - (q[0] != '/' ? 1 : 0))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
// recopier chemin /pub/..
|
// recopier chemin /pub/..
|
||||||
if (q[0] != '/') // page par défaut (/)
|
if (q[0] != '/') // page par défaut (/)
|
||||||
strcatbuff(adrfil->fil, "/");
|
strcatbuff(adrfil->fil, "/");
|
||||||
@@ -5926,7 +5918,17 @@ int multipleStringMatch(const char *s, const char *match) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
HTSEXT_API httrackp *hts_create_opt(void) {
|
HTSEXT_API httrackp *hts_create_opt(void) {
|
||||||
static const char *defaultModules[] = {"httrack-plugin", NULL};
|
#if ( defined(_WIN32) || defined(__ANDROID__) )
|
||||||
|
static const char *defaultModules[] = {
|
||||||
|
"htsswf", "htsjava", "httrack-plugin", NULL
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
#ifndef HTS_LIBHTSJAVA_NAME
|
||||||
|
#define HTS_LIBHTSJAVA_NAME "libhtsjava.so" /* non-autoconf fallback */
|
||||||
|
#endif
|
||||||
|
static const char *defaultModules[] = {"libhtsswf.so.1", HTS_LIBHTSJAVA_NAME,
|
||||||
|
"httrack-plugin", NULL};
|
||||||
|
#endif
|
||||||
httrackp *opt = malloc(sizeof(httrackp));
|
httrackp *opt = malloc(sizeof(httrackp));
|
||||||
|
|
||||||
/* default options */
|
/* default options */
|
||||||
|
|||||||
@@ -456,6 +456,13 @@ static HTS_INLINE HTS_UNUSED const char *htsbuff_str(const htsbuff *b) {
|
|||||||
return b->buf;
|
return b->buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** True if 'count' records of >= 1 byte each fit in 'available' bytes; guards
|
||||||
|
an attacker-controlled count driving a large allocation. */
|
||||||
|
static HTS_INLINE HTS_UNUSED hts_boolean hts_count_fits(size_t count,
|
||||||
|
LLint available) {
|
||||||
|
return (available >= 0 && (LLint) count <= available) ? HTS_TRUE : HTS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Thin aliases over the libc allocator/memcpy (historical "t" suffix); no
|
/* Thin aliases over the libc allocator/memcpy (historical "t" suffix); no
|
||||||
added bounds checking. freet() also NULLs the freed pointer and tolerates
|
added bounds checking. freet() also NULLs the freed pointer and tolerates
|
||||||
NULL. memcpybuff() despite the name is a raw memcpy: the caller owns the
|
NULL. memcpybuff() despite the name is a raw memcpy: the caller owns the
|
||||||
|
|||||||
@@ -740,40 +740,6 @@ static int st_filterdual(httrackp *opt, int argc, char **argv) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Length/work caps stop a hostile pattern stack-overflowing or hanging the
|
|
||||||
process (OSS-Fuzz 5060751291908096 / 5745936014573568). */
|
|
||||||
static int st_filterbounds(httrackp *opt, int argc, char **argv) {
|
|
||||||
const size_t big = 100000; /* well past the length cap */
|
|
||||||
const size_t stars = 900; /* star-heavy pattern, under the cap */
|
|
||||||
char *subj = malloct(big + 1);
|
|
||||||
char *pat = malloct(2 * stars + 2);
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
(void) opt;
|
|
||||||
(void) argc;
|
|
||||||
(void) argv;
|
|
||||||
memset(subj, 'a', big);
|
|
||||||
subj[big] = '\0';
|
|
||||||
/* '*' matches anything, but an over-length subject is refused by the cap */
|
|
||||||
assertf(strjoker(subj, "*", NULL, NULL) == NULL);
|
|
||||||
assertf(strjokerfind(subj, "*") == NULL);
|
|
||||||
/* within-cap star-heavy dead-end: the step budget keeps it bounded (a hang
|
|
||||||
would time the test out) */
|
|
||||||
for (i = 0; i < stars; i++) {
|
|
||||||
pat[2 * i] = '*';
|
|
||||||
pat[2 * i + 1] = 'a';
|
|
||||||
}
|
|
||||||
pat[2 * stars] = 'b'; /* never matches an all-'a' subject */
|
|
||||||
pat[2 * stars + 1] = '\0';
|
|
||||||
subj[stars] = '\0';
|
|
||||||
assertf(strjoker(subj, pat, NULL, NULL) == NULL);
|
|
||||||
assertf(strjokerfind(subj, pat) == NULL);
|
|
||||||
freet(pat);
|
|
||||||
freet(subj);
|
|
||||||
printf("filterbounds: OK\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int st_simplify(httrackp *opt, int argc, char **argv) {
|
static int st_simplify(httrackp *opt, int argc, char **argv) {
|
||||||
(void) opt;
|
(void) opt;
|
||||||
if (argc < 1) {
|
if (argc < 1) {
|
||||||
@@ -1300,30 +1266,6 @@ static int st_identurl(httrackp *opt, int argc, char **argv) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Regression for the one-byte fil[] overflow: a 2047-byte hostless "?"-URL used
|
|
||||||
to abort in strncat_safe_ when the missing leading '/' pushed fil to 2048. */
|
|
||||||
static int st_identabs(httrackp *opt, int argc, char **argv) {
|
|
||||||
lien_adrfil af;
|
|
||||||
const size_t len =
|
|
||||||
sizeof(af.fil) - 1; /* 2047: max URL the top guard admits */
|
|
||||||
char *url = malloct(len + 1);
|
|
||||||
|
|
||||||
(void) opt;
|
|
||||||
(void) argc;
|
|
||||||
(void) argv;
|
|
||||||
url[0] = '?';
|
|
||||||
memset(url + 1, 'a', len - 1);
|
|
||||||
url[len] = '\0';
|
|
||||||
assertf(ident_url_absolute(url, &af) == -1);
|
|
||||||
freet(url);
|
|
||||||
/* valid URLs still parse, so the guard is not over-rejecting */
|
|
||||||
assertf(ident_url_absolute("http://www.example.com/a/b/c.html?x=1", &af) ==
|
|
||||||
0);
|
|
||||||
assertf(ident_url_absolute("www.foo.com?bar=1", &af) == 0);
|
|
||||||
printf("identabs 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). */
|
||||||
@@ -1816,27 +1758,6 @@ static int st_cookies(httrackp *opt, int argc, char **argv) {
|
|||||||
http_cookie_header(&cookie, dom, "/", hdr, sizeof(hdr));
|
http_cookie_header(&cookie, dom, "/", hdr, sizeof(hdr));
|
||||||
if (strcmp(hdr, expected) != 0)
|
if (strcmp(hdr, expected) != 0)
|
||||||
err = 1;
|
err = 1;
|
||||||
|
|
||||||
/* A hostile over-long request host must not overflow domain[256] in
|
|
||||||
treathead's default-domain copy (that would abort the mirror). */
|
|
||||||
{
|
|
||||||
static t_cookie ck2;
|
|
||||||
htsblk r;
|
|
||||||
char host[600];
|
|
||||||
|
|
||||||
memset(&r, 0, sizeof(r));
|
|
||||||
memset(host, 'a', sizeof(host) - 1);
|
|
||||||
host[sizeof(host) - 1] = '\0';
|
|
||||||
ck2.max_len = (int) sizeof(ck2.data);
|
|
||||||
ck2.data[0] = '\0';
|
|
||||||
treathead(&ck2, host, "/", &r, "Set-Cookie: SID=1; path=/");
|
|
||||||
if (strnotempty(ck2.data)) // oversize-host cookie was not dropped
|
|
||||||
err = 1;
|
|
||||||
/* control: a normal host still yields a cookie through treathead */
|
|
||||||
treathead(&ck2, dom, "/", &r, "Set-Cookie: SID=1; path=/");
|
|
||||||
if (strstr(ck2.data, "SID") == NULL) // guard wrongly dropped a valid cookie
|
|
||||||
err = 1;
|
|
||||||
}
|
|
||||||
if (strstr(hdr, "$Version") != NULL || strstr(hdr, "$Path") != NULL)
|
if (strstr(hdr, "$Version") != NULL || strstr(hdr, "$Path") != NULL)
|
||||||
err = 1;
|
err = 1;
|
||||||
if (strstr(hdr, "junk") != NULL) // wrong-domain cookie leaked
|
if (strstr(hdr, "junk") != NULL) // wrong-domain cookie leaked
|
||||||
@@ -2580,6 +2501,21 @@ static int st_ftpuser(httrackp *opt, int argc, char **argv) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* hts_count_fits caps the .class constant-pool entry count to the file size,
|
||||||
|
rejecting the ~68 MB-per-file calloc DoS. */
|
||||||
|
static int st_java(httrackp *opt, int argc, char **argv) {
|
||||||
|
(void) opt;
|
||||||
|
(void) argc;
|
||||||
|
(void) argv;
|
||||||
|
assertf(hts_count_fits(10, 1000) == HTS_TRUE);
|
||||||
|
assertf(hts_count_fits(0, 10) == HTS_TRUE);
|
||||||
|
assertf(hts_count_fits(65535, 10) == HTS_FALSE);
|
||||||
|
assertf(hts_count_fits(1, 0) == HTS_FALSE);
|
||||||
|
assertf(hts_count_fits(1, -1) == HTS_FALSE);
|
||||||
|
printf("java constant-pool cap self-test OK\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
/* Registry: name -> handler, with a usage hint and a one-line description. */
|
/* Registry: name -> handler, with a usage hint and a one-line description. */
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
@@ -2601,8 +2537,6 @@ static const struct selftest_entry {
|
|||||||
"memoized vs unmemoized matcher differential", st_filtermemo},
|
"memoized vs unmemoized matcher differential", st_filtermemo},
|
||||||
{"filterdual", "<string1> <string2> <filter>...",
|
{"filterdual", "<string1> <string2> <filter>...",
|
||||||
"merged two-form filter verdict (fa_strjoker_dual)", st_filterdual},
|
"merged two-form filter verdict (fa_strjoker_dual)", st_filterdual},
|
||||||
{"filterbounds", "", "matcher length/work caps reject hostile patterns",
|
|
||||||
st_filterbounds},
|
|
||||||
{"simplify", "<path>", "collapse ./ and ../ in a path", st_simplify},
|
{"simplify", "<path>", "collapse ./ and ../ in a path", st_simplify},
|
||||||
{"stripquery", "", "--strip-query pattern/key stripping self-test",
|
{"stripquery", "", "--strip-query pattern/key stripping self-test",
|
||||||
st_stripquery},
|
st_stripquery},
|
||||||
@@ -2633,8 +2567,6 @@ static const struct selftest_entry {
|
|||||||
{"resolve", "<link> <adr> <fil>", "resolve a link against an origin",
|
{"resolve", "<link> <adr> <fil>", "resolve a link against an origin",
|
||||||
st_resolve},
|
st_resolve},
|
||||||
{"identurl", "<url>", "split an absolute URL into (adr, fil)", st_identurl},
|
{"identurl", "<url>", "split an absolute URL into (adr, fil)", st_identurl},
|
||||||
{"identabs", "", "ident_url_absolute one-byte fil[] overflow self-test",
|
|
||||||
st_identabs},
|
|
||||||
{"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:]",
|
||||||
@@ -2680,6 +2612,7 @@ static const struct selftest_entry {
|
|||||||
st_ftpline},
|
st_ftpline},
|
||||||
#endif
|
#endif
|
||||||
{"ftp-userpass", "", "ftp_split_userpass bounds URL userinfo", st_ftpuser},
|
{"ftp-userpass", "", "ftp_split_userpass bounds URL userinfo", st_ftpuser},
|
||||||
|
{"java", "", "java .class constant-pool count cap self-test", st_java},
|
||||||
};
|
};
|
||||||
|
|
||||||
static void list_selftests(void) {
|
static void list_selftests(void) {
|
||||||
|
|||||||
@@ -919,6 +919,9 @@ static void signal_handlers(void) {
|
|||||||
#ifdef SIGSEGV
|
#ifdef SIGSEGV
|
||||||
signal(SIGSEGV, sig_fatal); // segmentation violation
|
signal(SIGSEGV, sig_fatal); // segmentation violation
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef SIGSTKFLT
|
||||||
|
signal(SIGSTKFLT, sig_fatal); // stack fault
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// fin routines de détournement de SIGHUP & co
|
// fin routines de détournement de SIGHUP & co
|
||||||
|
|||||||
@@ -224,6 +224,14 @@ SOURCE=htsinthash.c
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=htsjava.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=htsjava.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=htslib.c
|
SOURCE=htslib.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|||||||
@@ -12,9 +12,10 @@ if test -n "${BROWSER}"; then
|
|||||||
fi
|
fi
|
||||||
# Patch for Darwin/Mac by Ross Williams
|
# Patch for Darwin/Mac by Ross Williams
|
||||||
if test "$(uname -s)" == "Darwin"; then
|
if test "$(uname -s)" == "Darwin"; then
|
||||||
# Darwin's 'open -W' launches the default browser and waits for it to quit.
|
# Darwin/Mac OS X uses a system 'open' command to find
|
||||||
# Keep it only as a fallback so a configured $BROWSER still wins the search.
|
# the default browser. The -W flag causes it to wait for
|
||||||
BROWSEREXEFALLBACK="/usr/bin/open -W"
|
# the browser to exit
|
||||||
|
BROWSEREXE="/usr/bin/open -W"
|
||||||
fi
|
fi
|
||||||
BINWD=$(dirname "$0")
|
BINWD=$(dirname "$0")
|
||||||
SRCHPATH=("$BINWD" /usr/local/bin /usr/share/bin /usr/bin /usr/lib/httrack /usr/local/lib/httrack /usr/local/share/httrack /opt/local/bin /sw/bin "${HOME}/usr/bin" "${HOME}/bin")
|
SRCHPATH=("$BINWD" /usr/local/bin /usr/share/bin /usr/bin /usr/lib/httrack /usr/local/lib/httrack /usr/local/share/httrack /opt/local/bin /sw/bin "${HOME}/usr/bin" "${HOME}/bin")
|
||||||
@@ -80,7 +81,6 @@ for i in "${SRCHBROWSEREXE[@]}"; do
|
|||||||
done
|
done
|
||||||
test -n "$BROWSEREXE" && break
|
test -n "$BROWSEREXE" && break
|
||||||
done
|
done
|
||||||
test -n "$BROWSEREXE" || BROWSEREXE="${BROWSEREXEFALLBACK}"
|
|
||||||
test -n "$BROWSEREXE" || ! log "Could not find any suitable browser" || exit 1
|
test -n "$BROWSEREXE" || ! log "Could not find any suitable browser" || exit 1
|
||||||
|
|
||||||
# "browse" command
|
# "browse" command
|
||||||
@@ -132,12 +132,12 @@ function cleanup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Cleanup in case of emergency
|
# Cleanup in case of emergency
|
||||||
trap "cleanup now; exit" HUP INT QUIT PIPE TERM
|
trap "cleanup now; exit" HUP INT QUIT ILL TRAP ABRT BUS FPE SEGV PIPE ALRM TERM STKFLT XCPU XFSZ
|
||||||
|
|
||||||
# Got SRVURL, launch browser
|
# Got SRVURL, launch browser
|
||||||
launch_browser "${BROWSEREXE}" "${SRVURL}"
|
launch_browser "${BROWSEREXE}" "${SRVURL}"
|
||||||
|
|
||||||
# That's all, folks!
|
# That's all, folks!
|
||||||
trap "" HUP INT QUIT PIPE TERM
|
trap "" HUP INT QUIT ILL TRAP ABRT BUS FPE SEGV PIPE ALRM TERM STKFLT XCPU XFSZ
|
||||||
cleanup
|
cleanup
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
@@ -192,6 +192,3 @@ test "$(with_timeout httrack -O /dev/null -#test=filter "$pat" "$subj")" == "$su
|
|||||||
# (guards against a single-backtrack-point matcher rewrite)
|
# (guards against a single-backtrack-point matcher rewrite)
|
||||||
match '*[aX]X*[a]Y' 'aXaXaY'
|
match '*[aX]X*[a]Y' 'aXaXaY'
|
||||||
nomatch '*[aX]X*[a]Y' 'aXbXaY'
|
nomatch '*[aX]X*[a]Y' 'aXbXaY'
|
||||||
|
|
||||||
# hostile patterns must not stack-overflow or hang: length + work caps
|
|
||||||
test "$(with_timeout httrack -O /dev/null -#test=filterbounds)" == "filterbounds: OK" || exit 1
|
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
# A 2047-byte hostless "?"-URL used to overflow fil[] by one byte and abort in
|
|
||||||
# strncat_safe_; the guard now returns -1 while valid URLs still parse.
|
|
||||||
test "$(httrack -O /dev/null -#test=identabs)" == "identabs self-test OK" || exit 1
|
|
||||||
7
tests/01_engine-java.test
Executable file
7
tests/01_engine-java.test
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# .class constant-pool count is capped to the file size (calloc DoS).
|
||||||
|
httrack -O /dev/null -#test=java run | grep -q "java constant-pool cap self-test OK"
|
||||||
26
tests/31_local-javaclass.test
Normal file
26
tests/31_local-javaclass.test
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# The java plugin must load (versioned dlopen name) and parse a .class
|
||||||
|
# constant pool: a resource named only inside Foo.class gets crawled.
|
||||||
|
set -e
|
||||||
|
|
||||||
|
: "${top_srcdir:=..}"
|
||||||
|
|
||||||
|
tmproot=$(mktemp -d)
|
||||||
|
trap 'rm -rf "$tmproot"' EXIT
|
||||||
|
mkdir "$tmproot/javaclass"
|
||||||
|
|
||||||
|
cat >"$tmproot/javaclass/index.html" <<'EOF'
|
||||||
|
<html><body><a href="Foo.class">applet</a></body></html>
|
||||||
|
EOF
|
||||||
|
printf 'GIF89a' >"$tmproot/javaclass/hello.gif"
|
||||||
|
# magic/minor/major, count=2, one CONSTANT_Utf8 "hello.gif", class/superclass
|
||||||
|
printf '\xCA\xFE\xBA\xBE\x00\x00\x00\x32\x00\x02\x01\x00\x09hello.gif\x00\x00\x00\x00' \
|
||||||
|
>"$tmproot/javaclass/Foo.class"
|
||||||
|
|
||||||
|
# --log-found first: a plugin-load failure (wrong soname, shadowing system
|
||||||
|
# libhtsjava) trips here on the banner suffix, not as an opaque "not found".
|
||||||
|
bash "$top_srcdir/tests/local-crawl.sh" --root "$tmproot" --errors 0 \
|
||||||
|
--log-found '\+libhtsjava' \
|
||||||
|
--found 'javaclass/Foo.class' \
|
||||||
|
--found 'javaclass/hello.gif' \
|
||||||
|
httrack 'BASEURL/javaclass/index.html'
|
||||||
@@ -44,9 +44,9 @@ TESTS = \
|
|||||||
01_engine-header.test \
|
01_engine-header.test \
|
||||||
01_engine-idna.test \
|
01_engine-idna.test \
|
||||||
01_engine-identurl.test \
|
01_engine-identurl.test \
|
||||||
01_engine-identabs.test \
|
|
||||||
01_engine-escape-room.test \
|
01_engine-escape-room.test \
|
||||||
01_engine-inplace-escape.test \
|
01_engine-inplace-escape.test \
|
||||||
|
01_engine-java.test \
|
||||||
01_engine-makeindex.test \
|
01_engine-makeindex.test \
|
||||||
01_engine-mime.test \
|
01_engine-mime.test \
|
||||||
01_engine-parse.test \
|
01_engine-parse.test \
|
||||||
@@ -102,6 +102,7 @@ TESTS = \
|
|||||||
28_local-pause.test \
|
28_local-pause.test \
|
||||||
29_local-redirect-fragment.test \
|
29_local-redirect-fragment.test \
|
||||||
30_local-fragment-link.test \
|
30_local-fragment-link.test \
|
||||||
|
31_local-javaclass.test \
|
||||||
32_local-cdispo.test \
|
32_local-cdispo.test \
|
||||||
33_local-delayed.test \
|
33_local-delayed.test \
|
||||||
34_local-maxtime.test \
|
34_local-maxtime.test \
|
||||||
|
|||||||
@@ -1,99 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Smoke-test an installed webhttrack: launch it with a stub browser and assert
|
|
||||||
# htsserver comes up and serves the web UI. Arg: the install prefix.
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
prefix="${1:?usage: webhttrack-smoke.sh <install-prefix>}"
|
|
||||||
wht="$prefix/bin/webhttrack"
|
|
||||||
test -x "$wht" || {
|
|
||||||
echo "no webhttrack at $wht" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
work="$(mktemp -d)"
|
|
||||||
# webhttrack backgrounds htsserver, which outlives it; reap any stray one (scoped
|
|
||||||
# to this prefix) so a lingering server can never hold the CI step open.
|
|
||||||
trap 'pkill -f "$prefix/bin/htsserver" 2>/dev/null || true; rm -rf "$work"' EXIT
|
|
||||||
export HOME="$work/home"
|
|
||||||
mkdir -p "$HOME/websites"
|
|
||||||
marker="$work/marker"
|
|
||||||
|
|
||||||
stubdir="$work/bin"
|
|
||||||
mkdir -p "$stubdir"
|
|
||||||
|
|
||||||
# On Darwin webhttrack hardcodes "open -W", which launches a real GUI browser and
|
|
||||||
# blocks headless. Shadow uname so it takes the generic path and picks the stub
|
|
||||||
# browser below; htsserver and webhttrack's path resolution still run for real.
|
|
||||||
cat >"$stubdir/uname" <<'EOF'
|
|
||||||
#!/bin/bash
|
|
||||||
[ "${1:-}" = "-s" ] && {
|
|
||||||
echo Linux
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
exec /usr/bin/uname "$@"
|
|
||||||
EOF
|
|
||||||
chmod +x "$stubdir/uname"
|
|
||||||
|
|
||||||
# Stub browser: webhttrack tries its browser-name list in order and runs the
|
|
||||||
# first it finds, so shadow the first entry, "x-www-browser". It fetches the
|
|
||||||
# server URL and records PASS only for the working UI: the brand string AND the
|
|
||||||
# step-2 form action, which a truncated/degraded template page would lack (the
|
|
||||||
# bare title alone is not enough). htsserver only lives until webhttrack exits,
|
|
||||||
# so the check has to happen here.
|
|
||||||
# -a: the UI is served ISO-8859-1, so grep must not treat it as binary.
|
|
||||||
cat >"$stubdir/x-www-browser" <<EOF
|
|
||||||
#!/bin/bash
|
|
||||||
echo "stub browser invoked with: \$1" >&2
|
|
||||||
if body="\$(curl -fsSL --max-time 20 "\$1")" && printf '%s' "\$body" | grep -qai httrack && printf '%s' "\$body" | grep -qaF step2.html; then
|
|
||||||
echo PASS >"$marker"
|
|
||||||
else
|
|
||||||
echo "FAIL: unexpected response from \$1" >"$marker"
|
|
||||||
fi
|
|
||||||
EOF
|
|
||||||
chmod +x "$stubdir/x-www-browser"
|
|
||||||
export PATH="$stubdir:$prefix/bin:$PATH"
|
|
||||||
|
|
||||||
echo "launching webhttrack"
|
|
||||||
"$wht" </dev/null >"$work/webhttrack.log" 2>&1 &
|
|
||||||
whpid=$!
|
|
||||||
|
|
||||||
# Bounded poll for the marker (macOS has no timeout(1)); teardown below kills
|
|
||||||
# webhttrack and reaps htsserver, so the run is bounded without a watchdog.
|
|
||||||
for i in $(seq 1 45); do
|
|
||||||
test -f "$marker" && {
|
|
||||||
echo "marker written after ${i}s"
|
|
||||||
break
|
|
||||||
}
|
|
||||||
kill -0 "$whpid" 2>/dev/null || {
|
|
||||||
echo "webhttrack exited on its own after ${i}s"
|
|
||||||
break
|
|
||||||
}
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
|
|
||||||
# Reap webhttrack and the htsserver it spawned. Confirm death with a bounded poll
|
|
||||||
# (not a blocking wait, which could hang on macOS); SIGKILL if it ignores TERM.
|
|
||||||
echo "tearing down"
|
|
||||||
kill "$whpid" 2>/dev/null || true
|
|
||||||
if pkill -f "$prefix/bin/htsserver" 2>/dev/null; then
|
|
||||||
echo "reaped a lingering htsserver"
|
|
||||||
else
|
|
||||||
echo "no lingering htsserver"
|
|
||||||
fi
|
|
||||||
for _ in $(seq 1 10); do
|
|
||||||
kill -0 "$whpid" 2>/dev/null || break
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
kill -9 "$whpid" 2>/dev/null || true
|
|
||||||
|
|
||||||
echo "--- webhttrack.log ---"
|
|
||||||
cat "$work/webhttrack.log" 2>/dev/null || true
|
|
||||||
echo "--- end ---"
|
|
||||||
echo "marker=[$(cat "$marker" 2>/dev/null || echo NONE)]"
|
|
||||||
|
|
||||||
if test "$(cat "$marker" 2>/dev/null || true)" = PASS; then
|
|
||||||
echo "webhttrack smoke: PASS"
|
|
||||||
else
|
|
||||||
echo "webhttrack smoke: FAIL" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
Reference in New Issue
Block a user