mirror of
https://github.com/ysoftdevs/DependencyCheck.git
synced 2026-01-16 08:36:55 +01:00
Compare commits
1421 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f9ba0033f | ||
|
|
4d4672fc4d | ||
|
|
70859eb719 | ||
|
|
ae9daf7f33 | ||
|
|
ff0daa8d66 | ||
|
|
09f1a0ac92 | ||
|
|
e562be77f6 | ||
|
|
af7c6bc2a0 | ||
|
|
e49cbcf345 | ||
|
|
b4218ff0e8 | ||
|
|
4af174d27b | ||
|
|
203a7da23a | ||
|
|
9833ff20d1 | ||
|
|
638b3c0695 | ||
|
|
01ef2e1061 | ||
|
|
56aea8ad24 | ||
|
|
d530eddc57 | ||
|
|
1eab76aab8 | ||
|
|
167dbd7368 | ||
|
|
2594fb1c5f | ||
|
|
c57d21e9bc | ||
|
|
9c15bdfe41 | ||
|
|
64dedf892d | ||
|
|
d6fc456039 | ||
|
|
df606674db | ||
|
|
1e3a7ff4ba | ||
|
|
b53de8c69b | ||
|
|
0f3ffaf270 | ||
|
|
25238d5fb5 | ||
|
|
cf677bd70e | ||
|
|
42939e4922 | ||
|
|
7c4cc1334b | ||
|
|
ff4a1e0ac6 | ||
|
|
069e22049d | ||
|
|
135ed5c614 | ||
|
|
13d7d29630 | ||
|
|
889f315c0a | ||
|
|
5a0e280899 | ||
|
|
ccb5e234b3 | ||
|
|
2caccab85f | ||
|
|
085ab48f3f | ||
|
|
a28c2819fa | ||
|
|
40beec2e40 | ||
|
|
d136aeda84 | ||
|
|
fdd6c47cd5 | ||
|
|
c5a2b5b3d8 | ||
|
|
babe4739c5 | ||
|
|
49e8ee443c | ||
|
|
a5d8ce07d8 | ||
|
|
babc016b48 | ||
|
|
a5f378d755 | ||
|
|
ebf995537e | ||
|
|
49edb6c2e1 | ||
|
|
423f26852f | ||
|
|
f931412bee | ||
|
|
bef0657801 | ||
|
|
d79d5b5f33 | ||
|
|
4c5489efd3 | ||
|
|
d5753b9589 | ||
|
|
a841027d48 | ||
|
|
73bea8e63f | ||
|
|
bbc8bab4da | ||
|
|
019f6dfb8b | ||
|
|
3b6a2a2908 | ||
|
|
c2b757ad6f | ||
|
|
efeba40f2b | ||
|
|
018e4bc382 | ||
|
|
88924ea520 | ||
|
|
4461c2e4a4 | ||
|
|
1c4aceb0fb | ||
|
|
a5b396a60d | ||
|
|
efd96ed892 | ||
|
|
fe88785846 | ||
|
|
0dcb0fb325 | ||
|
|
0825843d0f | ||
|
|
8c4df134e4 | ||
|
|
dfed5067f3 | ||
|
|
2b78e8fdc1 | ||
|
|
63c7a9d926 | ||
|
|
6609481cc1 | ||
|
|
a37853def6 | ||
|
|
9f348cfa16 | ||
|
|
52293f2596 | ||
|
|
54d3a73282 | ||
|
|
ab2d3b70cb | ||
|
|
451df460f6 | ||
|
|
b4afa01887 | ||
|
|
2ea95f5bf9 | ||
|
|
22602f42f2 | ||
|
|
b2c5183043 | ||
|
|
9f6559c7fb | ||
|
|
ef04c16237 | ||
|
|
dd85bfd2ab | ||
|
|
7152a05bfd | ||
|
|
754c2fc9bf | ||
|
|
85ad0b881f | ||
|
|
db6c471cc6 | ||
|
|
300d990276 | ||
|
|
9c55b889cb | ||
|
|
735f76cc0b | ||
|
|
d1c27a4298 | ||
|
|
650f09bbc5 | ||
|
|
08bf16971a | ||
|
|
ccb149240e | ||
|
|
ae22719985 | ||
|
|
55c4d729bb | ||
|
|
429f0966f0 | ||
|
|
7a246b90b9 | ||
|
|
d2e7de5505 | ||
|
|
a9eab16502 | ||
|
|
d59cce8080 | ||
|
|
9390e71dd9 | ||
|
|
65992243fa | ||
|
|
c81b8b0171 | ||
|
|
0671d12628 | ||
|
|
a892c5e7b7 | ||
|
|
b5c21ffbf0 | ||
|
|
bb2b25cca5 | ||
|
|
b3867244ba | ||
|
|
6bf8d396e0 | ||
|
|
6394c1a7b4 | ||
|
|
ccd656845d | ||
|
|
2931e8454c | ||
|
|
112b158795 | ||
|
|
921001000f | ||
|
|
3e3a8e9f98 | ||
|
|
7440a039fd | ||
|
|
e73f9ab02f | ||
|
|
59815b858e | ||
|
|
7df7f59d93 | ||
|
|
e971bc1991 | ||
|
|
a3f0f12779 | ||
|
|
2a9c214593 | ||
|
|
3fc37f3e5e | ||
|
|
ebe4423e25 | ||
|
|
cfafb4a101 | ||
|
|
8d538a9977 | ||
|
|
cc2953d6a3 | ||
|
|
c888019068 | ||
|
|
56639d3965 | ||
|
|
09ff99823e | ||
|
|
5078e32dc7 | ||
|
|
ecaadff0d8 | ||
|
|
f2ad8cc7d1 | ||
|
|
c8d77eb213 | ||
|
|
fe3d9e8bf6 | ||
|
|
6c4171be75 | ||
|
|
4bbb466e43 | ||
|
|
c478415667 | ||
|
|
fc832b67c5 | ||
|
|
943a9ea97e | ||
|
|
2c7ab297d7 | ||
|
|
d8299f7db1 | ||
|
|
4deeb33f08 | ||
|
|
3bf4cf8c85 | ||
|
|
e0217fc6c3 | ||
|
|
62a3efa23a | ||
|
|
cc7ebe6d52 | ||
|
|
5d920e4b44 | ||
|
|
1264ea54a1 | ||
|
|
caa1d77d23 | ||
|
|
20a55b3342 | ||
|
|
8bfe67fc60 | ||
|
|
d42a1c6ab1 | ||
|
|
80a89ef6d1 | ||
|
|
1a0e605f0c | ||
|
|
573c8eb509 | ||
|
|
e676e3a14b | ||
|
|
af8c807ee0 | ||
|
|
dfaa5df965 | ||
|
|
32055ecdcc | ||
|
|
9db71c5f0c | ||
|
|
99856bf285 | ||
|
|
4d006b3e05 | ||
|
|
4e37165ba6 | ||
|
|
38a5834785 | ||
|
|
d6e1352869 | ||
|
|
bf1b7bd7a2 | ||
|
|
2306327057 | ||
|
|
2d389ba73f | ||
|
|
ce8d5bc635 | ||
|
|
8fdc2007e0 | ||
|
|
88a97769de | ||
|
|
589c761cb0 | ||
|
|
3e6787fd61 | ||
|
|
aff52ee3f5 | ||
|
|
4555b02592 | ||
|
|
e1d4599a93 | ||
|
|
1a1e141cb8 | ||
|
|
33218f41e8 | ||
|
|
8772cda47a | ||
|
|
512eb713e4 | ||
|
|
0f90d48c62 | ||
|
|
658860e396 | ||
|
|
7522dae557 | ||
|
|
e34e65a3ba | ||
|
|
5a001a2c32 | ||
|
|
13a03eb250 | ||
|
|
cd863b6cca | ||
|
|
83b182dda5 | ||
|
|
3b90d1a564 | ||
|
|
d724855dfc | ||
|
|
78008330fe | ||
|
|
e716aad224 | ||
|
|
aa0d7cb4e9 | ||
|
|
0cd43ce35c | ||
|
|
ac98c8e395 | ||
|
|
70a8fc09c6 | ||
|
|
5b00d05e2e | ||
|
|
28c1730a02 | ||
|
|
c54483d36f | ||
|
|
2dd02ff8cb | ||
|
|
46c5501b7a | ||
|
|
f154826749 | ||
|
|
96383ef985 | ||
|
|
ab4b19dbab | ||
|
|
cdc53ac570 | ||
|
|
143cc1912e | ||
|
|
0d90b676bc | ||
|
|
5fadbb3d25 | ||
|
|
0ec99a3e12 | ||
|
|
1efbc44cc4 | ||
|
|
735fcfeee2 | ||
|
|
4a77150566 | ||
|
|
180a420219 | ||
|
|
d12ba8f3ef | ||
|
|
f333ef76d9 | ||
|
|
af5ba6854e | ||
|
|
8b7ce06793 | ||
|
|
297a5e516f | ||
|
|
92b11526be | ||
|
|
299350f655 | ||
|
|
127eafc9b3 | ||
|
|
ad1ad3a997 | ||
|
|
82151c5b3f | ||
|
|
90457c89ff | ||
|
|
3f3ac86d38 | ||
|
|
aa126039e5 | ||
|
|
662815b1ee | ||
|
|
243c36849c | ||
|
|
52d5baaf3f | ||
|
|
89217f778e | ||
|
|
9bc9bc9169 | ||
|
|
6b73430473 | ||
|
|
5ca5bca3df | ||
|
|
89ab382a18 | ||
|
|
bad425c0d7 | ||
|
|
cdbbb1b94c | ||
|
|
0a9d8a9b22 | ||
|
|
e662041d06 | ||
|
|
155464bc87 | ||
|
|
06cd811ae4 | ||
|
|
1b2cd354db | ||
|
|
1b31268f59 | ||
|
|
b57ef7291f | ||
|
|
c3bf6aa3f8 | ||
|
|
d2fa14bbe2 | ||
|
|
9b6e55e90c | ||
|
|
afb07b651f | ||
|
|
e6806fdf2b | ||
|
|
e5ff2cff4e | ||
|
|
17d7d47b9a | ||
|
|
64e32061ab | ||
|
|
931110ba6c | ||
|
|
d90e7820cd | ||
|
|
824898dba5 | ||
|
|
761dd61ed4 | ||
|
|
89c63e6d87 | ||
|
|
a2361f9327 | ||
|
|
ea15205be8 | ||
|
|
0a45048535 | ||
|
|
1c51655ce3 | ||
|
|
7749f0da7c | ||
|
|
5695238f95 | ||
|
|
e1feeb7e21 | ||
|
|
84fecaf040 | ||
|
|
da77727673 | ||
|
|
f8c913a3e8 | ||
|
|
2024881ee1 | ||
|
|
35ed3a51e5 | ||
|
|
24b1c4d0a4 | ||
|
|
7ec2458fb5 | ||
|
|
175feaea23 | ||
|
|
dda6cf728b | ||
|
|
a7fd410b01 | ||
|
|
d281c36733 | ||
|
|
dc91e44c0a | ||
|
|
7967a858f4 | ||
|
|
2081407e38 | ||
|
|
976eabd527 | ||
|
|
b6d6a5de2b | ||
|
|
2d58cfe0ce | ||
|
|
9df8bdff5f | ||
|
|
c86b821951 | ||
|
|
4def086bf9 | ||
|
|
885c890d7d | ||
|
|
06060a6694 | ||
|
|
70667814f6 | ||
|
|
766b7a940c | ||
|
|
0c37586357 | ||
|
|
b4aa55ce1f | ||
|
|
109443ce77 | ||
|
|
5f38741831 | ||
|
|
c6f391501d | ||
|
|
d1f3105fbd | ||
|
|
8f88ca9d3d | ||
|
|
f9e4ca0cc2 | ||
|
|
5caf023677 | ||
|
|
35c2f4873c | ||
|
|
1ed7bab375 | ||
|
|
f0d1bfb777 | ||
|
|
42519ac843 | ||
|
|
8869e13385 | ||
|
|
8f9cbfe806 | ||
|
|
6481938626 | ||
|
|
9c7cc2acbf | ||
|
|
89a57d4ed3 | ||
|
|
732378592b | ||
|
|
19dc46660b | ||
|
|
4aad3471af | ||
|
|
533b455356 | ||
|
|
58807d9021 | ||
|
|
bc9458101c | ||
|
|
d49556bf3d | ||
|
|
b9003a2f02 | ||
|
|
6b303410d1 | ||
|
|
8cae2f24b1 | ||
|
|
0a04d753ea | ||
|
|
35402c7bd3 | ||
|
|
847a97f61c | ||
|
|
fac27a6120 | ||
|
|
2e24eda00d | ||
|
|
7a653abf22 | ||
|
|
ae09229107 | ||
|
|
be35f48bdd | ||
|
|
846173844e | ||
|
|
59c28d8e51 | ||
|
|
abdfa3ccf6 | ||
|
|
99ad6634c4 | ||
|
|
84556fb055 | ||
|
|
26e14e0151 | ||
|
|
3df2daa5cb | ||
|
|
c55efddc81 | ||
|
|
a59c8908f0 | ||
|
|
a421c5f952 | ||
|
|
37b0612d45 | ||
|
|
07bc94f9f6 | ||
|
|
82511880ac | ||
|
|
2f5cc6a8a4 | ||
|
|
f9a0f5e7a1 | ||
|
|
47b083eaca | ||
|
|
8fcf5ee760 | ||
|
|
f2006206d3 | ||
|
|
c32361a428 | ||
|
|
ac83c2bc3c | ||
|
|
32808c16e7 | ||
|
|
e4e2433396 | ||
|
|
8196b6e69e | ||
|
|
8dd49b6156 | ||
|
|
c4ab83a801 | ||
|
|
2c51b7b835 | ||
|
|
bab49d04b7 | ||
|
|
6963d66240 | ||
|
|
8cbf3ffc6b | ||
|
|
2a4693f6ed | ||
|
|
217256746c | ||
|
|
6c90225024 | ||
|
|
92d8a894e3 | ||
|
|
c89d619808 | ||
|
|
31dd4f6305 | ||
|
|
ff9715ede7 | ||
|
|
ffd1e383c2 | ||
|
|
2cc4f8c2fe | ||
|
|
6f513eb359 | ||
|
|
b235a5bb49 | ||
|
|
25f1912573 | ||
|
|
d24d6f6b52 | ||
|
|
afdb156c84 | ||
|
|
643d3600b8 | ||
|
|
9c51bff55b | ||
|
|
81c91b3877 | ||
|
|
3d365eb258 | ||
|
|
6857f6d8f8 | ||
|
|
81bd9991bb | ||
|
|
056fa9ded2 | ||
|
|
a3792c474b | ||
|
|
ec233dbb46 | ||
|
|
d89cd789ac | ||
|
|
69088e162d | ||
|
|
ec53bd4125 | ||
|
|
35a264d21c | ||
|
|
0372c2eccc | ||
|
|
08c7ffc6d9 | ||
|
|
e386f6ac20 | ||
|
|
60ab893888 | ||
|
|
f2d960c3eb | ||
|
|
fb88aeaeb9 | ||
|
|
94561de719 | ||
|
|
89ed18cea3 | ||
|
|
b996fa234b | ||
|
|
f6cd5cb4b2 | ||
|
|
6ac8caaf5f | ||
|
|
e5a4145e37 | ||
|
|
2c8b408bfb | ||
|
|
58c5c04feb | ||
|
|
b0d6070d28 | ||
|
|
3728594f73 | ||
|
|
dc2f1eabb2 | ||
|
|
eda08e7454 | ||
|
|
1bf4b6daa9 | ||
|
|
f757266282 | ||
|
|
0321823125 | ||
|
|
33d190afaa | ||
|
|
ff16c4f127 | ||
|
|
134728438e | ||
|
|
754bd68a87 | ||
|
|
bd32eeeaa2 | ||
|
|
1b9a3bd4bd | ||
|
|
584d369b0b | ||
|
|
0ebe052752 | ||
|
|
535863bc52 | ||
|
|
dd925cd92b | ||
|
|
5529de3d95 | ||
|
|
ce6b65adb8 | ||
|
|
9897109332 | ||
|
|
cfc851a99b | ||
|
|
380178ccc8 | ||
|
|
3227ddd9f9 | ||
|
|
336be63237 | ||
|
|
37c9b9e1f5 | ||
|
|
ebb3e02dcc | ||
|
|
352505c54f | ||
|
|
0c7998712e | ||
|
|
b9a20e7ac5 | ||
|
|
7ab89b900c | ||
|
|
9620956727 | ||
|
|
9b85768b7e | ||
|
|
5276e1863d | ||
|
|
0fc1a30a2c | ||
|
|
8609b98b1c | ||
|
|
c85514a17a | ||
|
|
d00bef5546 | ||
|
|
b905f46f98 | ||
|
|
cdd4765d38 | ||
|
|
d62793f4ad | ||
|
|
d83d325a49 | ||
|
|
e5baf99814 | ||
|
|
b4aeab3501 | ||
|
|
039bfd372d | ||
|
|
1a92de71d1 | ||
|
|
d8279e11aa | ||
|
|
b1b8584641 | ||
|
|
11e75df1a9 | ||
|
|
25fc2bfbea | ||
|
|
a93c84ff64 | ||
|
|
986a4182d9 | ||
|
|
d38a8b109b | ||
|
|
711d8c8c6b | ||
|
|
0d1d22aeff | ||
|
|
ac2231f0f3 | ||
|
|
21344dacfc | ||
|
|
ca22ba5bbc | ||
|
|
fc64c34214 | ||
|
|
c35bc2476d | ||
|
|
222826af95 | ||
|
|
db28db0bc7 | ||
|
|
931f7d47ea | ||
|
|
987ed1cefc | ||
|
|
3e9a77abfa | ||
|
|
3879eb6b3a | ||
|
|
5e5a2040fc | ||
|
|
eea44d7de2 | ||
|
|
3fcbf075fb | ||
|
|
b2641494cc | ||
|
|
c48a794aee | ||
|
|
e53906aea8 | ||
|
|
05a4a1670f | ||
|
|
4bd35852a5 | ||
|
|
be4d56f8d2 | ||
|
|
dfbcd616f2 | ||
|
|
dc0106348d | ||
|
|
f2666d4a30 | ||
|
|
4220e58d26 | ||
|
|
07de43981a | ||
|
|
fa352c1a8f | ||
|
|
e5d582b30b | ||
|
|
8fb14ffdf3 | ||
|
|
c16e85e7db | ||
|
|
25a72e3508 | ||
|
|
20411da67b | ||
|
|
81bfdc69dd | ||
|
|
5e2829fe49 | ||
|
|
2aba09f090 | ||
|
|
38e27309fb | ||
|
|
6b586684e6 | ||
|
|
773e280339 | ||
|
|
297a67cd00 | ||
|
|
ceb61ebe74 | ||
|
|
6c85e3502e | ||
|
|
690192300f | ||
|
|
3ba963f474 | ||
|
|
9b2cacc3a0 | ||
|
|
315a616293 | ||
|
|
3c56cd6738 | ||
|
|
a48ac013e8 | ||
|
|
258602ce1a | ||
|
|
c85b547502 | ||
|
|
d6266c36bf | ||
|
|
fdd7f30e9a | ||
|
|
3994ef3619 | ||
|
|
633028a63f | ||
|
|
013374e9db | ||
|
|
4358b47e91 | ||
|
|
6decc1ce30 | ||
|
|
8a3dba3064 | ||
|
|
27bcead1bc | ||
|
|
acb9c01776 | ||
|
|
79fd23d51b | ||
|
|
776614d211 | ||
|
|
b03a498cd7 | ||
|
|
b612926fb6 | ||
|
|
b67377f505 | ||
|
|
2033acbe2a | ||
|
|
e435cfc489 | ||
|
|
a3199a52af | ||
|
|
99be870ab9 | ||
|
|
9b2ecb4701 | ||
|
|
be7443a0a0 | ||
|
|
0de6557872 | ||
|
|
258e890056 | ||
|
|
d84bbad79a | ||
|
|
07e6477686 | ||
|
|
acde161412 | ||
|
|
8d8f9c6d26 | ||
|
|
c7507d9743 | ||
|
|
ff970fde56 | ||
|
|
2c4a997c64 | ||
|
|
5c787e0b69 | ||
|
|
41da8435cc | ||
|
|
84ecc4c664 | ||
|
|
d18a36af22 | ||
|
|
b3e766aa50 | ||
|
|
0cee54c51b | ||
|
|
41e436a183 | ||
|
|
743fc19fa3 | ||
|
|
76e8c66b1b | ||
|
|
4379ea63f0 | ||
|
|
00ae54b4b2 | ||
|
|
3a7fd7d271 | ||
|
|
94a0c98bfe | ||
|
|
c2b2b2698d | ||
|
|
9bb630bae6 | ||
|
|
c47b2f5b18 | ||
|
|
ecdc9a968d | ||
|
|
c041ff66e2 | ||
|
|
fe0e2d5c2d | ||
|
|
2cf3bca8de | ||
|
|
b2a817e17b | ||
|
|
d1ca951ffa | ||
|
|
b3932ae8c5 | ||
|
|
35223d5737 | ||
|
|
9d263f11e5 | ||
|
|
3f28b30e95 | ||
|
|
d797abdb1f | ||
|
|
3b3a940ee4 | ||
|
|
1b5b61b25e | ||
|
|
00d29b88df | ||
|
|
ab9bc9da74 | ||
|
|
b79f7b7ab8 | ||
|
|
9b34b5ca89 | ||
|
|
b486788993 | ||
|
|
563e9c51e1 | ||
|
|
6ab5e3ed4f | ||
|
|
43a6c81151 | ||
|
|
887a5d50a4 | ||
|
|
be68f8c3f7 | ||
|
|
86a4923157 | ||
|
|
f80ff31412 | ||
|
|
94acc82bf5 | ||
|
|
3c1a1fcca1 | ||
|
|
b3d08e4cb8 | ||
|
|
ab766ce85b | ||
|
|
bcb8245c61 | ||
|
|
c9e60d5c3a | ||
|
|
eb7c74eea7 | ||
|
|
40f5911ceb | ||
|
|
2a8809adbb | ||
|
|
39524c4064 | ||
|
|
c1cc2d6350 | ||
|
|
acb857f433 | ||
|
|
d343d92b17 | ||
|
|
43cb4716a9 | ||
|
|
6222561431 | ||
|
|
07b10e9e23 | ||
|
|
dffe8cef7a | ||
|
|
bb26626fd5 | ||
|
|
2f207de1a0 | ||
|
|
a69419ed04 | ||
|
|
be7c1ba914 | ||
|
|
461f6ad2c1 | ||
|
|
aff85cbfb8 | ||
|
|
c0ce4523fa | ||
|
|
65f8b3978d | ||
|
|
80ca3e114e | ||
|
|
330e803675 | ||
|
|
337e9ac3ef | ||
|
|
dfb78788f9 | ||
|
|
2dc560f583 | ||
|
|
7355400548 | ||
|
|
50b4630436 | ||
|
|
132d43f999 | ||
|
|
0627f20f5e | ||
|
|
40f329512b | ||
|
|
c196c08ada | ||
|
|
8f1e0d57bf | ||
|
|
c30c455a9f | ||
|
|
cd0e8e1c6b | ||
|
|
cbeb91f9a9 | ||
|
|
a3830989ba | ||
|
|
86427e2042 | ||
|
|
8f079de0aa | ||
|
|
651727c697 | ||
|
|
5c55f4d4bb | ||
|
|
c8502d3b7b | ||
|
|
22e3b9b544 | ||
|
|
f16db8298b | ||
|
|
cf4a32b260 | ||
|
|
b8d83c37d9 | ||
|
|
617f6bb8ef | ||
|
|
0c9f2bf5d2 | ||
|
|
eb9afecd66 | ||
|
|
2c1f2ae589 | ||
|
|
9387b09a19 | ||
|
|
f17f04f00a | ||
|
|
07f0192088 | ||
|
|
0fd19f0de8 | ||
|
|
e954fa6478 | ||
|
|
a0fdfc0f39 | ||
|
|
57a4372b65 | ||
|
|
c11cb38269 | ||
|
|
e4fd446946 | ||
|
|
714d8ac3ba | ||
|
|
f09293e077 | ||
|
|
389e8bc325 | ||
|
|
367f763ce5 | ||
|
|
3febed82f1 | ||
|
|
8a6371fe68 | ||
|
|
93937feb13 | ||
|
|
21e62d8597 | ||
|
|
88e8019858 | ||
|
|
cbe562a204 | ||
|
|
4dc40389a3 | ||
|
|
0552f10c38 | ||
|
|
c9ac7401e8 | ||
|
|
60625b9978 | ||
|
|
b4b53cfa4c | ||
|
|
f1e1d67f4e | ||
|
|
982641752f | ||
|
|
ba66cbbc95 | ||
|
|
750d13a300 | ||
|
|
3c69a87fc2 | ||
|
|
dbaddab07b | ||
|
|
1d58811680 | ||
|
|
4d78fe9ca4 | ||
|
|
56d3082696 | ||
|
|
8f573aba2f | ||
|
|
96633360d0 | ||
|
|
8ae7935cee | ||
|
|
68e860baad | ||
|
|
38ead3133f | ||
|
|
553d1f85c4 | ||
|
|
d9a985ff38 | ||
|
|
d3a2d2b248 | ||
|
|
575b8e5f62 | ||
|
|
37ff924c74 | ||
|
|
7ccbc4c77c | ||
|
|
27b7a60a8d | ||
|
|
dca731ffb8 | ||
|
|
0d56de99a7 | ||
|
|
ac5e11d327 | ||
|
|
9d315b0ff9 | ||
|
|
038fe84498 | ||
|
|
4fd59f2a19 | ||
|
|
f77c3bfdf7 | ||
|
|
dc7d941316 | ||
|
|
433cc1e32c | ||
|
|
c066a03683 | ||
|
|
562a8036bc | ||
|
|
53ac703f09 | ||
|
|
a2891d97d0 | ||
|
|
2bd5169f20 | ||
|
|
b3fd6d8c92 | ||
|
|
cea281b1d3 | ||
|
|
e85b2a8961 | ||
|
|
77b879d6bb | ||
|
|
9de3ae5cf2 | ||
|
|
b3a0dc3506 | ||
|
|
383731da4d | ||
|
|
67abb42652 | ||
|
|
edcc24bc12 | ||
|
|
a6836cab15 | ||
|
|
8f985737b0 | ||
|
|
6e2f102177 | ||
|
|
46a768339a | ||
|
|
f1dbbd62e9 | ||
|
|
8bb94889e0 | ||
|
|
da38e4e00c | ||
|
|
d8e8156b1c | ||
|
|
77a1b18673 | ||
|
|
9abd51f318 | ||
|
|
c7d51a29ac | ||
|
|
ac453ef32a | ||
|
|
db25493c04 | ||
|
|
8d4b4d3cd9 | ||
|
|
b05f13d82b | ||
|
|
438622d450 | ||
|
|
4f79efedc9 | ||
|
|
845fa89d0f | ||
|
|
29768576c8 | ||
|
|
4e659d799d | ||
|
|
10596bcb54 | ||
|
|
5ac6f4f7b3 | ||
|
|
957bb46e5c | ||
|
|
1042a537c1 | ||
|
|
2159b4b691 | ||
|
|
ce48e07e18 | ||
|
|
48dded02c6 | ||
|
|
b7d77042bf | ||
|
|
b4ea2569e3 | ||
|
|
42a9f864eb | ||
|
|
22e6de19c4 | ||
|
|
572a65d661 | ||
|
|
108ecb7e12 | ||
|
|
9c87d61528 | ||
|
|
dd903dd7e5 | ||
|
|
ae13cb2513 | ||
|
|
40f47ccd4e | ||
|
|
c344cd2a2b | ||
|
|
7601af24f0 | ||
|
|
0197eb0d08 | ||
|
|
a248967ae8 | ||
|
|
a4beb58b54 | ||
|
|
922cc942a4 | ||
|
|
f11b086381 | ||
|
|
e5eab69f65 | ||
|
|
961884ef12 | ||
|
|
5dbbf643a4 | ||
|
|
f937458c25 | ||
|
|
c617e62a16 | ||
|
|
343c886d54 | ||
|
|
824d85b2a0 | ||
|
|
0289fc5ce2 | ||
|
|
914a886bfe | ||
|
|
f65c30e975 | ||
|
|
48ac0049aa | ||
|
|
fea1117eae | ||
|
|
ace1a060db | ||
|
|
be6ad9c5e3 | ||
|
|
b2d51a2a9b | ||
|
|
74411d8656 | ||
|
|
332392b7ba | ||
|
|
e441414854 | ||
|
|
4b1d79e7f7 | ||
|
|
d7889e27e5 | ||
|
|
e65a68ce78 | ||
|
|
990f6d3730 | ||
|
|
84a62b3707 | ||
|
|
e18789b8d3 | ||
|
|
cb7be0e460 | ||
|
|
df825d0109 | ||
|
|
ce4baecb4b | ||
|
|
48907517e9 | ||
|
|
dde1d96058 | ||
|
|
b2f688a032 | ||
|
|
b4664f85f0 | ||
|
|
2725d32c33 | ||
|
|
c9f80db3c6 | ||
|
|
cb53ddf8a8 | ||
|
|
fdca41a71b | ||
|
|
d59ceee0f7 | ||
|
|
38b08835c2 | ||
|
|
dbbdb1bcbe | ||
|
|
b408e5d0d3 | ||
|
|
30f00508f5 | ||
|
|
75bb6aa966 | ||
|
|
eff206fb2b | ||
|
|
98da419c96 | ||
|
|
efe226045d | ||
|
|
35ba1532f4 | ||
|
|
476d732a3c | ||
|
|
21efc0c4a5 | ||
|
|
c20c6665fd | ||
|
|
cd497bfe9b | ||
|
|
25c42bee6d | ||
|
|
6d639385da | ||
|
|
fd1c0efedf | ||
|
|
5d2010aa73 | ||
|
|
d9333b2e93 | ||
|
|
3034306fcc | ||
|
|
0c7bae6fd7 | ||
|
|
855233f498 | ||
|
|
6b859a0478 | ||
|
|
2f37b658f1 | ||
|
|
3bd952e5c5 | ||
|
|
ae58c1fa99 | ||
|
|
dfb411cb6a | ||
|
|
449e3f5cc6 | ||
|
|
1b1fe17fca | ||
|
|
f3c457745e | ||
|
|
26f2e2b223 | ||
|
|
fcdd399eea | ||
|
|
c1d16782ab | ||
|
|
860434a1d5 | ||
|
|
38b493ee9d | ||
|
|
19dc560d56 | ||
|
|
bb10214db0 | ||
|
|
6a871c51a1 | ||
|
|
d7ff3050c2 | ||
|
|
8e0a0379d5 | ||
|
|
b7ceb90e61 | ||
|
|
c1935c83f6 | ||
|
|
62f08a2105 | ||
|
|
38d7f6e671 | ||
|
|
3c2c99c236 | ||
|
|
7694402ae4 | ||
|
|
7ed1d13221 | ||
|
|
47e89e35b2 | ||
|
|
3633759295 | ||
|
|
98bdb0479b | ||
|
|
1e40df227d | ||
|
|
caf0a709b8 | ||
|
|
daef951e59 | ||
|
|
73eab87dd9 | ||
|
|
1a2720649b | ||
|
|
1083cdb743 | ||
|
|
06eb8f9c10 | ||
|
|
31af15d267 | ||
|
|
12938df375 | ||
|
|
24d8dbcf64 | ||
|
|
2b7585357f | ||
|
|
5b659966c8 | ||
|
|
2834d6cac7 | ||
|
|
65dd4c873f | ||
|
|
8c834e634b | ||
|
|
f92430d092 | ||
|
|
b110e944c3 | ||
|
|
77eb5b5147 | ||
|
|
1fabdb9e2d | ||
|
|
e8682ac058 | ||
|
|
08603ad905 | ||
|
|
224b867737 | ||
|
|
0eb4ac5bcc | ||
|
|
876ca5927d | ||
|
|
98b4509014 | ||
|
|
c0013a0ba5 | ||
|
|
cc915e39c5 | ||
|
|
b569ad4ef5 | ||
|
|
6ab5388075 | ||
|
|
ded3079390 | ||
|
|
44fe358766 | ||
|
|
cee4b089c6 | ||
|
|
ba8bd4f95c | ||
|
|
c602072e5b | ||
|
|
76061c84aa | ||
|
|
cd01d3e923 | ||
|
|
ff23e7aba7 | ||
|
|
e61fb6f206 | ||
|
|
a6cab8fddc | ||
|
|
ec16d9abfc | ||
|
|
b5c67a47d1 | ||
|
|
a4c1e3b0bc | ||
|
|
b160d58d1b | ||
|
|
b6a4dfb424 | ||
|
|
5837718cf4 | ||
|
|
962e579434 | ||
|
|
63a249ecb0 | ||
|
|
3f40ca65f5 | ||
|
|
57668fc618 | ||
|
|
e82d14c973 | ||
|
|
8e9aa23c3c | ||
|
|
4687c7dcda | ||
|
|
5d857c731f | ||
|
|
eaec1205a1 | ||
|
|
e3d03c3d78 | ||
|
|
927fb013ff | ||
|
|
4deb14ccfb | ||
|
|
e04dba610b | ||
|
|
99a5dfee31 | ||
|
|
66842fca8e | ||
|
|
a47280f47b | ||
|
|
2808ca139c | ||
|
|
d87467aa88 | ||
|
|
382aad5119 | ||
|
|
93f94b65f1 | ||
|
|
bc66d4b0e7 | ||
|
|
ff044c831f | ||
|
|
cb85292f99 | ||
|
|
7c7722e8fc | ||
|
|
78cc6764bf | ||
|
|
0b540d6406 | ||
|
|
f1e0b7a94f | ||
|
|
611635a9a2 | ||
|
|
26c30b013b | ||
|
|
899f5231b5 | ||
|
|
0cfeee18c9 | ||
|
|
3e44835687 | ||
|
|
d5ac67071f | ||
|
|
6aee9ce92e | ||
|
|
6a268bfb68 | ||
|
|
63848e815f | ||
|
|
6640df18ac | ||
|
|
b9436c0cab | ||
|
|
c730f7931f | ||
|
|
ef6035b5be | ||
|
|
8502c0f048 | ||
|
|
acc4d5201a | ||
|
|
8248f31b20 | ||
|
|
39c1624d42 | ||
|
|
7eb82f2e84 | ||
|
|
df0d0d820a | ||
|
|
e0c0d8bc04 | ||
|
|
97619d8ba1 | ||
|
|
80df96fd0d | ||
|
|
579e76430d | ||
|
|
36dd7269e2 | ||
|
|
6596cb014f | ||
|
|
62ac63fd77 | ||
|
|
e6e8d96f12 | ||
|
|
f80464ea31 | ||
|
|
75b0c6f7a3 | ||
|
|
f95ce8c7b5 | ||
|
|
c991a3ccfd | ||
|
|
a1d612b1f6 | ||
|
|
d3cbd20c5e | ||
|
|
cff4f29ba4 | ||
|
|
dc08363360 | ||
|
|
a2aa8d9336 | ||
|
|
ab2bfa951c | ||
|
|
e871d37044 | ||
|
|
e32ee71bea | ||
|
|
3bc8823e54 | ||
|
|
a4b9dfaf1c | ||
|
|
c7c85ac676 | ||
|
|
1af445a390 | ||
|
|
4236a2e6f7 | ||
|
|
47e58942f8 | ||
|
|
f854ed50d6 | ||
|
|
2933a173a2 | ||
|
|
39c45cd329 | ||
|
|
93e6473828 | ||
|
|
2cf96bef52 | ||
|
|
3850ef4355 | ||
|
|
d29f989c22 | ||
|
|
0e31d503d0 | ||
|
|
8c2d552238 | ||
|
|
1b6cb61f8a | ||
|
|
b6e0fa9085 | ||
|
|
1f983d502e | ||
|
|
13637be1aa | ||
|
|
8f22740e07 | ||
|
|
03d5cc7521 | ||
|
|
c9f9e2b97d | ||
|
|
8ca4ede403 | ||
|
|
b50be86615 | ||
|
|
fe1a8f4425 | ||
|
|
dd472c1322 | ||
|
|
a636adec10 | ||
|
|
e3960445ae | ||
|
|
c631b7cd8a | ||
|
|
bb2bf12808 | ||
|
|
db95dfe208 | ||
|
|
86d052e51e | ||
|
|
fb55b9db17 | ||
|
|
ad3ad81c1e | ||
|
|
dccb84ded8 | ||
|
|
510c693871 | ||
|
|
8696df12ac | ||
|
|
d56e0b0eba | ||
|
|
29d77b2f2c | ||
|
|
4e131cd059 | ||
|
|
4c1f3948a3 | ||
|
|
c40ff67704 | ||
|
|
af6ac8bd4f | ||
|
|
70211a8407 | ||
|
|
4d6b83425b | ||
|
|
985396aaf9 | ||
|
|
d86c14d3a6 | ||
|
|
3bdb3a6b87 | ||
|
|
8dac57d4cf | ||
|
|
a91e7b9ed0 | ||
|
|
220b2c9a2a | ||
|
|
06bc8ed4a4 | ||
|
|
648863d21b | ||
|
|
3232e60467 | ||
|
|
da81ea4e57 | ||
|
|
42baec7c72 | ||
|
|
1accdfe2e6 | ||
|
|
f625653b30 | ||
|
|
2682187fa3 | ||
|
|
090f3fafa9 | ||
|
|
de81ed0c61 | ||
|
|
49465888b2 | ||
|
|
1555185d60 | ||
|
|
e5235bd714 | ||
|
|
1b4fe6135f | ||
|
|
9481b29d6b | ||
|
|
20115e6557 | ||
|
|
ee47136fb4 | ||
|
|
83dece68fc | ||
|
|
fce7083e28 | ||
|
|
5268375153 | ||
|
|
3598f59123 | ||
|
|
557f491a7e | ||
|
|
5aa876da72 | ||
|
|
7e7a66595b | ||
|
|
c429bdf139 | ||
|
|
22d22f3afa | ||
|
|
f5845908b9 | ||
|
|
138ce1c69a | ||
|
|
8366ec5831 | ||
|
|
383f0a7f43 | ||
|
|
22e5a5cafd | ||
|
|
8d6255aa55 | ||
|
|
8fd6f7add9 | ||
|
|
623c2cb9f1 | ||
|
|
259e87442d | ||
|
|
8655e025a2 | ||
|
|
aba2a9f504 | ||
|
|
9aa76bd088 | ||
|
|
10faef62fa | ||
|
|
6b291a5ce5 | ||
|
|
164f1dcfd4 | ||
|
|
b7d6d027d3 | ||
|
|
c4869f1917 | ||
|
|
79c31b5f54 | ||
|
|
89e99219d7 | ||
|
|
a9b6c68ce3 | ||
|
|
0563077fb9 | ||
|
|
e2f174e92e | ||
|
|
861bdb47ed | ||
|
|
9f9e2d12c4 | ||
|
|
03f504cadc | ||
|
|
182c7e827b | ||
|
|
61e0cfc979 | ||
|
|
3ea3f01394 | ||
|
|
fc5b8ca1e5 | ||
|
|
5d67b2f9dc | ||
|
|
bcf4fd9e93 | ||
|
|
5b5faad553 | ||
|
|
5299261d18 | ||
|
|
f852851886 | ||
|
|
20a4d9adb8 | ||
|
|
13997cd282 | ||
|
|
965429296b | ||
|
|
d9750ce4dc | ||
|
|
d0fb41e582 | ||
|
|
f7a83d5a60 | ||
|
|
fc52462df4 | ||
|
|
119804794f | ||
|
|
f23bd0b268 | ||
|
|
d6f61b4faf | ||
|
|
4e4b7a1c39 | ||
|
|
376bfb6799 | ||
|
|
12bdba9a9c | ||
|
|
33fa1e1350 | ||
|
|
94e1a4f793 | ||
|
|
2603d960b7 | ||
|
|
b8433c4ea7 | ||
|
|
fc30aeea61 | ||
|
|
01d6e1f14d | ||
|
|
3b4a65deaa | ||
|
|
2ec5ec78a9 | ||
|
|
6b416b8494 | ||
|
|
eac470e081 | ||
|
|
34ce50b7b5 | ||
|
|
6d85e7cdf7 | ||
|
|
23a47a6f63 | ||
|
|
d2bfcc6f0e | ||
|
|
7495392aa2 | ||
|
|
c4ddf84ba8 | ||
|
|
aad6c28e4d | ||
|
|
2bd03dada4 | ||
|
|
5fab16ad06 | ||
|
|
6a4d1ed44d | ||
|
|
db22159a89 | ||
|
|
029e0e5044 | ||
|
|
3f1ee0b1b8 | ||
|
|
8009794cca | ||
|
|
12ce96d802 | ||
|
|
53bd62b236 | ||
|
|
cd7362c654 | ||
|
|
788b5633cb | ||
|
|
46d106e6e2 | ||
|
|
8ffb91022e | ||
|
|
57c09d1772 | ||
|
|
0731ed2c7a | ||
|
|
19ecb67f2d | ||
|
|
d16123c276 | ||
|
|
f90b168fdd | ||
|
|
09f416efdf | ||
|
|
05f40f3451 | ||
|
|
d81206fe2e | ||
|
|
f166ef9313 | ||
|
|
14704f9b4d | ||
|
|
8381daeeb7 | ||
|
|
164ed75af2 | ||
|
|
1f7c64e279 | ||
|
|
a76bf03bc9 | ||
|
|
e50d7f7b95 | ||
|
|
45b1327c58 | ||
|
|
fe60421731 | ||
|
|
0404fe9044 | ||
|
|
8cf6c59ec7 | ||
|
|
7b817ff866 | ||
|
|
f087f70a2c | ||
|
|
b05752f430 | ||
|
|
c4cde366e8 | ||
|
|
33249fad21 | ||
|
|
f0dd28d4db | ||
|
|
c0e35aa9fa | ||
|
|
1fd633a23b | ||
|
|
9a65e26e71 | ||
|
|
f22cabc32a | ||
|
|
b97d57f00b | ||
|
|
5db3544683 | ||
|
|
96eee95596 | ||
|
|
ffb3243bb6 | ||
|
|
09f07902ef | ||
|
|
43583bbc2e | ||
|
|
2ebc713cbb | ||
|
|
65ecc0f3bb | ||
|
|
ebabc1117e | ||
|
|
672e59e657 | ||
|
|
882e11f558 | ||
|
|
1cd5acb972 | ||
|
|
464a6efd28 | ||
|
|
18c3c1f475 | ||
|
|
52de46aeb3 | ||
|
|
b80d088254 | ||
|
|
7d0d85aeb7 | ||
|
|
d19ef8322e | ||
|
|
840b4d7619 | ||
|
|
e4a36545d7 | ||
|
|
31fbc7389b | ||
|
|
19ec936d38 | ||
|
|
939c67d41c | ||
|
|
9614e4f115 | ||
|
|
c48150a792 | ||
|
|
60687502d1 | ||
|
|
2fab58759e | ||
|
|
a42c586bb2 | ||
|
|
a6b76b3494 | ||
|
|
a6eaf7fc84 | ||
|
|
97ba9b42eb | ||
|
|
e0a71f0373 | ||
|
|
b8875d7f1c | ||
|
|
67dfd9a942 | ||
|
|
db46b03d0c | ||
|
|
5672c86905 | ||
|
|
d5406270a5 | ||
|
|
0b3f5e408b | ||
|
|
2ce432ac77 | ||
|
|
6cb26b3fbb | ||
|
|
a9b5949191 | ||
|
|
6016370515 | ||
|
|
f3c026f278 | ||
|
|
8f218bd6d6 | ||
|
|
59fd89bf68 | ||
|
|
d27a6235f0 | ||
|
|
c23febbcf0 | ||
|
|
81e85a4d0d | ||
|
|
44ba1bc85b | ||
|
|
6244fe5a93 | ||
|
|
973335db56 | ||
|
|
4b2c4f88d3 | ||
|
|
bbd2ca0d68 | ||
|
|
a82c225841 | ||
|
|
f9a6852aaa | ||
|
|
fad704b692 | ||
|
|
e362632477 | ||
|
|
4558b49c1b | ||
|
|
4357d8788a | ||
|
|
78b7c24c15 | ||
|
|
127e9e9f74 | ||
|
|
1951ae1cce | ||
|
|
79e2fd4b52 | ||
|
|
2265a2c43d | ||
|
|
1e7e543ab0 | ||
|
|
9671a73bd6 | ||
|
|
5bbee94d68 | ||
|
|
9d7122d69c | ||
|
|
6b1270a4f9 | ||
|
|
3c8de2be3f | ||
|
|
5afb5f0e83 | ||
|
|
7f42d0df40 | ||
|
|
0df54c9021 | ||
|
|
41bc33f4ba | ||
|
|
dcc883fa27 | ||
|
|
492c5d01bf | ||
|
|
49eaca1290 | ||
|
|
ce43b586ad | ||
|
|
ae49cd6a26 | ||
|
|
6ad3897af8 | ||
|
|
53ddb067ea | ||
|
|
a9762170bc | ||
|
|
4d91403fd2 | ||
|
|
e1cd4a63d0 | ||
|
|
18f3874dab | ||
|
|
6efcee500d | ||
|
|
8c0532f363 | ||
|
|
fdb0d07ab8 | ||
|
|
58e30649a3 | ||
|
|
85feef3a60 | ||
|
|
fccd913a8a | ||
|
|
dd119edafe | ||
|
|
f6633fb16c | ||
|
|
d243bf4f48 | ||
|
|
92d306f777 | ||
|
|
0ea29b3d7c | ||
|
|
c8e6e8eb32 | ||
|
|
a6aae6292e | ||
|
|
e33100b075 | ||
|
|
84a229d286 | ||
|
|
ab32c42487 | ||
|
|
0dc3744859 | ||
|
|
d22eab4155 | ||
|
|
ea9bfec3c9 | ||
|
|
02b43a5d66 | ||
|
|
e0fc7952f4 | ||
|
|
66ec2c5d27 | ||
|
|
f5a78402a6 | ||
|
|
29bfd7325d | ||
|
|
318962c01f | ||
|
|
8ca49fafa1 | ||
|
|
656e783894 | ||
|
|
18c6d60a85 | ||
|
|
b202121c21 | ||
|
|
ea3672dd08 | ||
|
|
88037af7ef | ||
|
|
4bda5b619d | ||
|
|
a0645ea30f | ||
|
|
a3e4adb0af | ||
|
|
e18aedfabf | ||
|
|
44529a78d2 | ||
|
|
bb9025364b | ||
|
|
7c78283b46 | ||
|
|
f7d6ca5c11 | ||
|
|
172a341b40 | ||
|
|
09aef67808 | ||
|
|
a400312d3a | ||
|
|
1b01b35b03 | ||
|
|
2d0acaa8ae | ||
|
|
a31a73320b | ||
|
|
75da352806 | ||
|
|
61b0c9b1c1 | ||
|
|
2185fe0f4c | ||
|
|
4ee0977aa1 | ||
|
|
1ba44771bb | ||
|
|
9966eec1df | ||
|
|
dd444f5f76 | ||
|
|
a0a6089057 | ||
|
|
4be72fc989 | ||
|
|
033cbf696a | ||
|
|
805bc85ea9 | ||
|
|
0d057d500e | ||
|
|
7462500e20 | ||
|
|
3e06a4a7c5 | ||
|
|
e0684ab086 | ||
|
|
e7be883e2e | ||
|
|
8fe80a4507 | ||
|
|
68084c4567 | ||
|
|
9c27545f5f | ||
|
|
6da8af7680 | ||
|
|
1b7ce93623 | ||
|
|
5f6480527e | ||
|
|
4d7b4ce877 | ||
|
|
fd61f7d363 | ||
|
|
47cc3d7358 | ||
|
|
d180618634 | ||
|
|
b2b96426d7 | ||
|
|
5796d4b969 | ||
|
|
37957613df | ||
|
|
cb82f02eb4 | ||
|
|
3feccefee8 | ||
|
|
910b1dca85 | ||
|
|
d71c6f055b | ||
|
|
536f373b91 | ||
|
|
6987845228 | ||
|
|
2edd2bf763 | ||
|
|
2605761d76 | ||
|
|
391d261ca1 | ||
|
|
6a7531f1e6 | ||
|
|
fb294e8bea | ||
|
|
a1046488c3 | ||
|
|
8cef56265c | ||
|
|
ec30851247 | ||
|
|
7420c12b89 | ||
|
|
895c770c24 | ||
|
|
606070f449 | ||
|
|
ec41493d91 | ||
|
|
d551093199 | ||
|
|
f7f8b2da62 | ||
|
|
1378b630a6 | ||
|
|
9726d86ab0 | ||
|
|
c9364e7b94 | ||
|
|
1e6780a2e3 | ||
|
|
72855d4d7a | ||
|
|
c0359da930 | ||
|
|
b4f39b0bfc | ||
|
|
d7af145f3b | ||
|
|
b078d8477e | ||
|
|
02b64e1a4b | ||
|
|
f444825e42 | ||
|
|
9fa62ef388 | ||
|
|
e73ad07836 | ||
|
|
a680e79686 | ||
|
|
728c05262c | ||
|
|
23e08c1ca1 | ||
|
|
198d73acfa | ||
|
|
71e210b66c | ||
|
|
2f31c53fd4 | ||
|
|
9f661535e0 | ||
|
|
5b0d4bf8e6 | ||
|
|
a639264149 | ||
|
|
91ab257eb6 | ||
|
|
e24a62d621 | ||
|
|
ec9f4b2b61 | ||
|
|
b66c7da4b3 | ||
|
|
6544cc98d5 | ||
|
|
2dbef9e1fa | ||
|
|
a924e81adb | ||
|
|
1ded1b603e | ||
|
|
a3012a29c2 | ||
|
|
8fcd800aff | ||
|
|
4d414ea082 | ||
|
|
d5b2380bc2 | ||
|
|
d2853fafa9 | ||
|
|
0e5a207c44 | ||
|
|
d7744537ae | ||
|
|
9e79e9efb6 | ||
|
|
a04338d184 | ||
|
|
772b0ca2b0 | ||
|
|
13eb2b75d5 | ||
|
|
c800440e44 | ||
|
|
05f822380c | ||
|
|
7896c81e98 | ||
|
|
ea50569b2a | ||
|
|
7bce07aa0e | ||
|
|
5ef02290dd | ||
|
|
34d5ba7d35 | ||
|
|
55004e7832 | ||
|
|
4945446171 | ||
|
|
0e2d2408ca | ||
|
|
8b8707c36e | ||
|
|
3bd9caf113 | ||
|
|
f713a83abf | ||
|
|
b0e0f8c8bf | ||
|
|
c8623fd3a2 | ||
|
|
c6aad2c2d4 | ||
|
|
7ede87753b | ||
|
|
59bed5a0fa | ||
|
|
e59377d9a3 | ||
|
|
6274cfce4b | ||
|
|
9d624702f6 | ||
|
|
f9d8ff3f74 | ||
|
|
6c837f0639 | ||
|
|
03c9ce3589 | ||
|
|
1ac7cdacb0 | ||
|
|
ba93be1814 | ||
|
|
1404bbab9f | ||
|
|
a5f8ed6378 | ||
|
|
1b59212003 | ||
|
|
4142901dc6 | ||
|
|
4ba9431e6f | ||
|
|
5da83517a8 | ||
|
|
a7e95c2a4d | ||
|
|
ae7fbbb04f | ||
|
|
cc18ef9aa8 | ||
|
|
4202e8a7ba | ||
|
|
882ff8a325 | ||
|
|
1b29957731 | ||
|
|
5702543bc5 | ||
|
|
c810f0647a | ||
|
|
d366b67bee | ||
|
|
85286b3cf9 | ||
|
|
ae4b5464c7 | ||
|
|
dec2536e3e | ||
|
|
30ea512dcc | ||
|
|
f6cdf34b25 | ||
|
|
99818d038b | ||
|
|
c35ce8e195 | ||
|
|
2ae856b0dd | ||
|
|
e592598990 | ||
|
|
07af34fbd0 | ||
|
|
0b3e313260 | ||
|
|
21947de4e0 | ||
|
|
3cdd0baabb | ||
|
|
f851e62330 | ||
|
|
bea19ad8ce | ||
|
|
f5b48f5390 | ||
|
|
cc712b86d5 | ||
|
|
0cf6cfc2b0 | ||
|
|
6f19360da5 | ||
|
|
f216b4716f | ||
|
|
3bf638f7c6 | ||
|
|
5ec9a24c99 | ||
|
|
23caa1d0b5 | ||
|
|
36ecf7c7fd | ||
|
|
0027e75a45 | ||
|
|
4cd759bfa6 | ||
|
|
0f2752220a | ||
|
|
ce1ed46851 | ||
|
|
aa795ee7eb | ||
|
|
5c83671739 | ||
|
|
3fb9390040 | ||
|
|
965687186c | ||
|
|
83742437d6 | ||
|
|
a37e53769c | ||
|
|
084a389a02 | ||
|
|
7971c42814 | ||
|
|
c694461abc |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -7,6 +7,9 @@
|
|||||||
# Eclipse project files
|
# Eclipse project files
|
||||||
.classpath
|
.classpath
|
||||||
.project
|
.project
|
||||||
|
.settings
|
||||||
|
maven-eclipse.xml
|
||||||
|
.externalToolBuilders
|
||||||
# Netbeans configuration
|
# Netbeans configuration
|
||||||
nb-configuration.xml
|
nb-configuration.xml
|
||||||
/target/
|
/target/
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ Copyright (c) 2013 - Jeremy Long. All Rights Reserved.
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.owasp</groupId>
|
<groupId>org.owasp</groupId>
|
||||||
<artifactId>dependency-check-parent</artifactId>
|
<artifactId>dependency-check-parent</artifactId>
|
||||||
<version>1.2.5</version>
|
<version>1.2.9</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>dependency-check-ant</artifactId>
|
<artifactId>dependency-check-ant</artifactId>
|
||||||
@@ -68,7 +68,6 @@ Copyright (c) 2013 - Jeremy Long. All Rights Reserved.
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-resources-plugin</artifactId>
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
<version>2.6</version>
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<escapeWindowsPaths>false</escapeWindowsPaths>
|
<escapeWindowsPaths>false</escapeWindowsPaths>
|
||||||
</configuration>
|
</configuration>
|
||||||
@@ -191,10 +190,18 @@ Copyright (c) 2013 - Jeremy Long. All Rights Reserved.
|
|||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-shade-plugin</artifactId>
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
<version>2.1</version>
|
<version>2.3</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<transformers>
|
<transformers>
|
||||||
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
|
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
|
||||||
@@ -218,29 +225,13 @@ Copyright (c) 2013 - Jeremy Long. All Rights Reserved.
|
|||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-jar-plugin</artifactId>
|
|
||||||
<version>2.4</version>
|
|
||||||
<configuration>
|
|
||||||
<archive>
|
|
||||||
<manifest>
|
|
||||||
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
|
|
||||||
</manifest>
|
|
||||||
</archive>
|
|
||||||
<excludes>
|
|
||||||
<exclude>**/checkstyle*</exclude>
|
|
||||||
</excludes>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
<artifactId>cobertura-maven-plugin</artifactId>
|
<artifactId>cobertura-maven-plugin</artifactId>
|
||||||
<version>2.6</version>
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<instrumentation>
|
<!--instrumentation>
|
||||||
<ignoreTrivial>true</ignoreTrivial>
|
<ignoreTrivial>true</ignoreTrivial>
|
||||||
</instrumentation>
|
</instrumentation-->
|
||||||
<check>
|
<check>
|
||||||
<branchRate>85</branchRate>
|
<branchRate>85</branchRate>
|
||||||
<lineRate>85</lineRate>
|
<lineRate>85</lineRate>
|
||||||
@@ -269,7 +260,6 @@ Copyright (c) 2013 - Jeremy Long. All Rights Reserved.
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
<version>2.16</version>
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<systemProperties>
|
<systemProperties>
|
||||||
<property>
|
<property>
|
||||||
@@ -279,162 +269,139 @@ Copyright (c) 2013 - Jeremy Long. All Rights Reserved.
|
|||||||
</systemProperties>
|
</systemProperties>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
|
||||||
<version>3.1</version>
|
|
||||||
<configuration>
|
|
||||||
<showDeprecation>false</showDeprecation>
|
|
||||||
<source>1.6</source>
|
|
||||||
<target>1.6</target>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-site-plugin</artifactId>
|
|
||||||
<version>3.3</version>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.maven.doxia</groupId>
|
|
||||||
<artifactId>doxia-module-markdown</artifactId>
|
|
||||||
<version>1.5</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
<configuration>
|
|
||||||
<skipDeploy>true</skipDeploy>
|
|
||||||
<reportPlugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-project-info-reports-plugin</artifactId>
|
|
||||||
<version>2.7</version>
|
|
||||||
<reportSets>
|
|
||||||
<reportSet>
|
|
||||||
<reports>
|
|
||||||
<report>index</report>
|
|
||||||
<report>summary</report>
|
|
||||||
<report>license</report>
|
|
||||||
<report>help</report>
|
|
||||||
</reports>
|
|
||||||
</reportSet>
|
|
||||||
</reportSets>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-javadoc-plugin</artifactId>
|
|
||||||
<version>2.9.1</version>
|
|
||||||
<configuration>
|
|
||||||
<bottom>Copyright© 2012-14 Jeremy Long. All Rights Reserved.</bottom>
|
|
||||||
</configuration>
|
|
||||||
<reportSets>
|
|
||||||
<reportSet>
|
|
||||||
<id>default</id>
|
|
||||||
<reports>
|
|
||||||
<report>javadoc</report>
|
|
||||||
</reports>
|
|
||||||
</reportSet>
|
|
||||||
</reportSets>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
|
||||||
<artifactId>versions-maven-plugin</artifactId>
|
|
||||||
<version>2.1</version>
|
|
||||||
<reportSets>
|
|
||||||
<reportSet>
|
|
||||||
<reports>
|
|
||||||
<report>dependency-updates-report</report>
|
|
||||||
<report>plugin-updates-report</report>
|
|
||||||
</reports>
|
|
||||||
</reportSet>
|
|
||||||
</reportSets>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-jxr-plugin</artifactId>
|
|
||||||
<version>2.4</version>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
|
||||||
<artifactId>cobertura-maven-plugin</artifactId>
|
|
||||||
<version>2.6</version>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-surefire-report-plugin</artifactId>
|
|
||||||
<version>2.16</version>
|
|
||||||
<reportSets>
|
|
||||||
<reportSet>
|
|
||||||
<reports>
|
|
||||||
<report>report-only</report>
|
|
||||||
</reports>
|
|
||||||
</reportSet>
|
|
||||||
</reportSets>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
|
||||||
<artifactId>taglist-maven-plugin</artifactId>
|
|
||||||
<version>2.4</version>
|
|
||||||
<configuration>
|
|
||||||
<tagListOptions>
|
|
||||||
<tagClasses>
|
|
||||||
<tagClass>
|
|
||||||
<displayName>Todo Work</displayName>
|
|
||||||
<tags>
|
|
||||||
<tag>
|
|
||||||
<matchString>todo</matchString>
|
|
||||||
<matchType>ignoreCase</matchType>
|
|
||||||
</tag>
|
|
||||||
<tag>
|
|
||||||
<matchString>FIXME</matchString>
|
|
||||||
<matchType>exact</matchType>
|
|
||||||
</tag>
|
|
||||||
</tags>
|
|
||||||
</tagClass>
|
|
||||||
</tagClasses>
|
|
||||||
</tagListOptions>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
|
||||||
<version>2.11</version>
|
|
||||||
<configuration>
|
|
||||||
<enableRulesSummary>false</enableRulesSummary>
|
|
||||||
<configLocation>${basedir}/../src/main/config/checkstyle-checks.xml</configLocation>
|
|
||||||
<headerLocation>${basedir}/../src/main/config/checkstyle-header.txt</headerLocation>
|
|
||||||
<suppressionsLocation>${basedir}/../src/main/config/checkstyle-suppressions.xml</suppressionsLocation>
|
|
||||||
<suppressionsFileExpression>checkstyle.suppressions.file</suppressionsFileExpression>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-pmd-plugin</artifactId>
|
|
||||||
<version>3.0.1</version>
|
|
||||||
<configuration>
|
|
||||||
<targetJdk>1.6</targetJdk>
|
|
||||||
<linkXref>true</linkXref>
|
|
||||||
<sourceEncoding>utf-8</sourceEncoding>
|
|
||||||
<excludes>
|
|
||||||
<exclude>**/generated/*.java</exclude>
|
|
||||||
</excludes>
|
|
||||||
<rulesets>
|
|
||||||
<ruleset>../src/main/config/dcrules.xml</ruleset>
|
|
||||||
<ruleset>/rulesets/java/basic.xml</ruleset>
|
|
||||||
<ruleset>/rulesets/java/imports.xml</ruleset>
|
|
||||||
<ruleset>/rulesets/java/unusedcode.xml</ruleset>
|
|
||||||
</rulesets>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
|
||||||
<artifactId>findbugs-maven-plugin</artifactId>
|
|
||||||
<version>2.5.3</version>
|
|
||||||
</plugin>
|
|
||||||
</reportPlugins>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
<reporting>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-project-info-reports-plugin</artifactId>
|
||||||
|
<version>2.7</version>
|
||||||
|
<reportSets>
|
||||||
|
<reportSet>
|
||||||
|
<reports>
|
||||||
|
<report>index</report>
|
||||||
|
<report>summary</report>
|
||||||
|
<report>license</report>
|
||||||
|
<report>help</report>
|
||||||
|
</reports>
|
||||||
|
</reportSet>
|
||||||
|
</reportSets>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>2.9.1</version>
|
||||||
|
<configuration>
|
||||||
|
<bottom>Copyright© 2012-15 Jeremy Long. All Rights Reserved.</bottom>
|
||||||
|
</configuration>
|
||||||
|
<reportSets>
|
||||||
|
<reportSet>
|
||||||
|
<id>default</id>
|
||||||
|
<reports>
|
||||||
|
<report>javadoc</report>
|
||||||
|
</reports>
|
||||||
|
</reportSet>
|
||||||
|
</reportSets>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>versions-maven-plugin</artifactId>
|
||||||
|
<version>2.1</version>
|
||||||
|
<reportSets>
|
||||||
|
<reportSet>
|
||||||
|
<reports>
|
||||||
|
<report>dependency-updates-report</report>
|
||||||
|
<report>plugin-updates-report</report>
|
||||||
|
</reports>
|
||||||
|
</reportSet>
|
||||||
|
</reportSets>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-jxr-plugin</artifactId>
|
||||||
|
<version>2.4</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>cobertura-maven-plugin</artifactId>
|
||||||
|
<version>2.6</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-report-plugin</artifactId>
|
||||||
|
<version>2.16</version>
|
||||||
|
<reportSets>
|
||||||
|
<reportSet>
|
||||||
|
<reports>
|
||||||
|
<report>report-only</report>
|
||||||
|
</reports>
|
||||||
|
</reportSet>
|
||||||
|
</reportSets>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>taglist-maven-plugin</artifactId>
|
||||||
|
<version>2.4</version>
|
||||||
|
<configuration>
|
||||||
|
<tagListOptions>
|
||||||
|
<tagClasses>
|
||||||
|
<tagClass>
|
||||||
|
<displayName>Todo Work</displayName>
|
||||||
|
<tags>
|
||||||
|
<tag>
|
||||||
|
<matchString>todo</matchString>
|
||||||
|
<matchType>ignoreCase</matchType>
|
||||||
|
</tag>
|
||||||
|
<tag>
|
||||||
|
<matchString>FIXME</matchString>
|
||||||
|
<matchType>exact</matchType>
|
||||||
|
</tag>
|
||||||
|
</tags>
|
||||||
|
</tagClass>
|
||||||
|
</tagClasses>
|
||||||
|
</tagListOptions>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||||
|
<version>2.11</version>
|
||||||
|
<configuration>
|
||||||
|
<enableRulesSummary>false</enableRulesSummary>
|
||||||
|
<enableFilesSummary>false</enableFilesSummary>
|
||||||
|
<configLocation>${basedir}/../src/main/config/checkstyle-checks.xml</configLocation>
|
||||||
|
<headerLocation>${basedir}/../src/main/config/checkstyle-header.txt</headerLocation>
|
||||||
|
<suppressionsLocation>${basedir}/../src/main/config/checkstyle-suppressions.xml</suppressionsLocation>
|
||||||
|
<suppressionsFileExpression>checkstyle.suppressions.file</suppressionsFileExpression>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-pmd-plugin</artifactId>
|
||||||
|
<version>3.0.1</version>
|
||||||
|
<configuration>
|
||||||
|
<targetJdk>1.6</targetJdk>
|
||||||
|
<linkXref>true</linkXref>
|
||||||
|
<sourceEncoding>utf-8</sourceEncoding>
|
||||||
|
<excludes>
|
||||||
|
<exclude>**/generated/*.java</exclude>
|
||||||
|
</excludes>
|
||||||
|
<rulesets>
|
||||||
|
<ruleset>../src/main/config/dcrules.xml</ruleset>
|
||||||
|
<ruleset>/rulesets/java/basic.xml</ruleset>
|
||||||
|
<ruleset>/rulesets/java/imports.xml</ruleset>
|
||||||
|
<ruleset>/rulesets/java/unusedcode.xml</ruleset>
|
||||||
|
</rulesets>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>findbugs-maven-plugin</artifactId>
|
||||||
|
<version>2.5.3</version>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</reporting>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.owasp</groupId>
|
<groupId>org.owasp</groupId>
|
||||||
@@ -456,12 +423,12 @@ Copyright (c) 2013 - Jeremy Long. All Rights Reserved.
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.ant</groupId>
|
<groupId>org.apache.ant</groupId>
|
||||||
<artifactId>ant</artifactId>
|
<artifactId>ant</artifactId>
|
||||||
<version>1.9.3</version>
|
<version>1.9.4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.ant</groupId>
|
<groupId>org.apache.ant</groupId>
|
||||||
<artifactId>ant-testutil</artifactId>
|
<artifactId>ant-testutil</artifactId>
|
||||||
<version>1.9.3</version>
|
<version>1.9.4</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|||||||
@@ -98,8 +98,8 @@ public class DependencyCheckTask extends Task {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the path. If the path has not been initialized yet, this class is synchronized, and will instantiate the
|
* Returns the path. If the path has not been initialized yet, this class is synchronized, and will instantiate the path
|
||||||
* path object.
|
* object.
|
||||||
*
|
*
|
||||||
* @return the path
|
* @return the path
|
||||||
*/
|
*/
|
||||||
@@ -215,9 +215,9 @@ public class DependencyCheckTask extends Task {
|
|||||||
this.reportOutputDirectory = reportOutputDirectory;
|
this.reportOutputDirectory = reportOutputDirectory;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Specifies if the build should be failed if a CVSS score above a specified level is identified. The default is 11
|
* Specifies if the build should be failed if a CVSS score above a specified level is identified. The default is 11 which
|
||||||
* which means since the CVSS scores are 0-10, by default the build will never fail and the CVSS score is set to 11.
|
* means since the CVSS scores are 0-10, by default the build will never fail and the CVSS score is set to 11. The valid range
|
||||||
* The valid range for the fail build on CVSS is 0 to 11, where anything above 10 will not cause the build to fail.
|
* for the fail build on CVSS is 0 to 11, where anything above 10 will not cause the build to fail.
|
||||||
*/
|
*/
|
||||||
private float failBuildOnCVSS = 11;
|
private float failBuildOnCVSS = 11;
|
||||||
|
|
||||||
@@ -239,8 +239,8 @@ public class DependencyCheckTask extends Task {
|
|||||||
this.failBuildOnCVSS = failBuildOnCVSS;
|
this.failBuildOnCVSS = failBuildOnCVSS;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Sets whether auto-updating of the NVD CVE/CPE data is enabled. It is not recommended that this be turned to
|
* Sets whether auto-updating of the NVD CVE/CPE data is enabled. It is not recommended that this be turned to false. Default
|
||||||
* false. Default is true.
|
* is true.
|
||||||
*/
|
*/
|
||||||
private boolean autoUpdate = true;
|
private boolean autoUpdate = true;
|
||||||
|
|
||||||
@@ -262,8 +262,8 @@ public class DependencyCheckTask extends Task {
|
|||||||
this.autoUpdate = autoUpdate;
|
this.autoUpdate = autoUpdate;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* The report format to be generated (HTML, XML, VULN, ALL). This configuration option has no affect if using this
|
* The report format to be generated (HTML, XML, VULN, ALL). This configuration option has no affect if using this within the
|
||||||
* within the Site plugin unless the externalReport is set to true. Default is HTML.
|
* Site plugin unless the externalReport is set to true. Default is HTML.
|
||||||
*/
|
*/
|
||||||
private String reportFormat = "HTML";
|
private String reportFormat = "HTML";
|
||||||
|
|
||||||
@@ -322,8 +322,7 @@ public class DependencyCheckTask extends Task {
|
|||||||
* Set the value of proxyServer.
|
* Set the value of proxyServer.
|
||||||
*
|
*
|
||||||
* @param proxyUrl new value of proxyServer
|
* @param proxyUrl new value of proxyServer
|
||||||
* @deprecated use {@link org.owasp.dependencycheck.taskdefs.DependencyCheckTask#setProxyServer(java.lang.String)}
|
* @deprecated use {@link org.owasp.dependencycheck.taskdefs.DependencyCheckTask#setProxyServer(java.lang.String)} instead
|
||||||
* instead
|
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public void setProxyUrl(String proxyUrl) {
|
public void setProxyUrl(String proxyUrl) {
|
||||||
@@ -559,6 +558,28 @@ public class DependencyCheckTask extends Task {
|
|||||||
public void setNuspecAnalyzerEnabled(boolean nuspecAnalyzerEnabled) {
|
public void setNuspecAnalyzerEnabled(boolean nuspecAnalyzerEnabled) {
|
||||||
this.nuspecAnalyzerEnabled = nuspecAnalyzerEnabled;
|
this.nuspecAnalyzerEnabled = nuspecAnalyzerEnabled;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Whether or not the central analyzer is enabled.
|
||||||
|
*/
|
||||||
|
private boolean centralAnalyzerEnabled = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the value of centralAnalyzerEnabled.
|
||||||
|
*
|
||||||
|
* @return the value of centralAnalyzerEnabled
|
||||||
|
*/
|
||||||
|
public boolean isCentralAnalyzerEnabled() {
|
||||||
|
return centralAnalyzerEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the value of centralAnalyzerEnabled.
|
||||||
|
*
|
||||||
|
* @param centralAnalyzerEnabled new value of centralAnalyzerEnabled
|
||||||
|
*/
|
||||||
|
public void setCentralAnalyzerEnabled(boolean centralAnalyzerEnabled) {
|
||||||
|
this.centralAnalyzerEnabled = centralAnalyzerEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether or not the nexus analyzer is enabled.
|
* Whether or not the nexus analyzer is enabled.
|
||||||
@@ -742,8 +763,8 @@ public class DependencyCheckTask extends Task {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Additional ZIP File extensions to add analyze. This should be a comma-separated list of file extensions to treat
|
* Additional ZIP File extensions to add analyze. This should be a comma-separated list of file extensions to treat like ZIP
|
||||||
* like ZIP files.
|
* files.
|
||||||
*/
|
*/
|
||||||
private String zipExtensions;
|
private String zipExtensions;
|
||||||
|
|
||||||
@@ -958,8 +979,8 @@ public class DependencyCheckTask extends Task {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Takes the properties supplied and updates the dependency-check settings. Additionally, this sets the system
|
* Takes the properties supplied and updates the dependency-check settings. Additionally, this sets the system properties
|
||||||
* properties required to change the proxy server, port, and connection timeout.
|
* required to change the proxy server, port, and connection timeout.
|
||||||
*/
|
*/
|
||||||
private void populateSettings() {
|
private void populateSettings() {
|
||||||
Settings.initialize();
|
Settings.initialize();
|
||||||
@@ -1015,6 +1036,8 @@ public class DependencyCheckTask extends Task {
|
|||||||
Settings.setBoolean(Settings.KEYS.ANALYZER_JAR_ENABLED, jarAnalyzerEnabled);
|
Settings.setBoolean(Settings.KEYS.ANALYZER_JAR_ENABLED, jarAnalyzerEnabled);
|
||||||
//NUSPEC ANALYZER
|
//NUSPEC ANALYZER
|
||||||
Settings.setBoolean(Settings.KEYS.ANALYZER_NUSPEC_ENABLED, nuspecAnalyzerEnabled);
|
Settings.setBoolean(Settings.KEYS.ANALYZER_NUSPEC_ENABLED, nuspecAnalyzerEnabled);
|
||||||
|
//CENTRAL ANALYZER
|
||||||
|
Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, centralAnalyzerEnabled);
|
||||||
//NEXUS ANALYZER
|
//NEXUS ANALYZER
|
||||||
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, nexusAnalyzerEnabled);
|
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, nexusAnalyzerEnabled);
|
||||||
if (nexusUrl != null && !nexusUrl.isEmpty()) {
|
if (nexusUrl != null && !nexusUrl.isEmpty()) {
|
||||||
|
|||||||
@@ -46,17 +46,18 @@ Note, that specific analyzers will automatically disable themselves if no file
|
|||||||
types that they support are detected - so specifically disabling them may not
|
types that they support are detected - so specifically disabling them may not
|
||||||
be needed.
|
be needed.
|
||||||
|
|
||||||
Property | Description | Default Value
|
Property | Description | Default Value
|
||||||
------------------------|------------------------------------|------------------
|
------------------------|---------------------------------------------------------------------------|------------------
|
||||||
archiveAnalyzerEnabled | Sets whether the Archive Analyzer will be used. | true
|
archiveAnalyzerEnabled | Sets whether the Archive Analyzer will be used. | true
|
||||||
zipExtensions | A comma-separated list of additional file extensions to be treated like a ZIP file, the contents will be extracted and analyzed. |
|
zipExtensions | A comma-separated list of additional file extensions to be treated like a ZIP file, the contents will be extracted and analyzed. |
|
||||||
jarAnalyzer | Sets whether Jar Analyzer will be used. | true
|
jarAnalyzer | Sets whether the Jar Analyzer will be used. | true
|
||||||
nexusAnalyzerEnabled | Sets whether Nexus Analyzer will be used. | true
|
centralAnalyzerEnabled | Sets whether the Central Analyzer will be used. **Disabling this analyzer is not recommended as it could lead to false negatives (e.g. libraries that have vulnerabilities may not be reported correctly).** If this analyzer is being disabled there is a good chance you also want to disable the Nexus Analyzer (see below). | true
|
||||||
nexusUrl | Defines the Nexus URL. | https://repository.sonatype.org/service/local/
|
nexusAnalyzerEnabled | Sets whether Nexus Analyzer will be used. This analyzer is superceded by the Central Analyzer; however, you can configure this to run against a Nexus Pro installation. | true
|
||||||
|
nexusUrl | Defines the Nexus Pro URL. If not set the Nexus Analyzer will be disabled. |
|
||||||
nexusUsesProxy | Whether or not the defined proxy should be used when connecting to Nexus. | true
|
nexusUsesProxy | Whether or not the defined proxy should be used when connecting to Nexus. | true
|
||||||
nuspecAnalyzerEnabled | Sets whether or not the .NET Nuget Nuspec Analyzer will be used. | true
|
nuspecAnalyzerEnabled | Sets whether or not the .NET Nuget Nuspec Analyzer will be used. | true
|
||||||
assemblyAnalyzerEnabled | Sets whether or not the .NET Assembly Analyzer should be used. | true
|
assemblyAnalyzerEnabled | Sets whether or not the .NET Assembly Analyzer should be used. | true
|
||||||
pathToMono | The path to Mono for .NET assembly analysis on non-windows systems |
|
pathToMono | The path to Mono for .NET assembly analysis on non-windows systems. |
|
||||||
|
|
||||||
Advanced Configuration
|
Advanced Configuration
|
||||||
====================
|
====================
|
||||||
|
|||||||
@@ -30,6 +30,10 @@ import org.owasp.dependencycheck.utils.Settings;
|
|||||||
* @author Jeremy Long <jeremy.long@owasp.org>
|
* @author Jeremy Long <jeremy.long@owasp.org>
|
||||||
*/
|
*/
|
||||||
public class DependencyCheckTaskTest extends BuildFileTest {
|
public class DependencyCheckTaskTest extends BuildFileTest {
|
||||||
|
//TODO: The use of deprecated class BuildFileTestcan possibly
|
||||||
|
//be replaced with BuildFileRule. However, it currently isn't included in the ant-testutil jar.
|
||||||
|
//This should be fixed in ant-testutil 1.9.5, so we can check back once that has been released.
|
||||||
|
//Reference: http://mail-archives.apache.org/mod_mbox/ant-user/201406.mbox/%3C000001cf87ba$8949b690$9bdd23b0$@de%3E
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ Copyright (c) 2012 - Jeremy Long. All Rights Reserved.
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.owasp</groupId>
|
<groupId>org.owasp</groupId>
|
||||||
<artifactId>dependency-check-parent</artifactId>
|
<artifactId>dependency-check-parent</artifactId>
|
||||||
<version>1.2.5</version>
|
<version>1.2.9</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>dependency-check-cli</artifactId>
|
<artifactId>dependency-check-cli</artifactId>
|
||||||
@@ -60,27 +60,21 @@ Copyright (c) 2012 - Jeremy Long. All Rights Reserved.
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-jar-plugin</artifactId>
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
<version>2.4</version>
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<archive>
|
<archive>
|
||||||
<manifest>
|
<manifest>
|
||||||
<mainClass>org.owasp.dependencycheck.App</mainClass>
|
<mainClass>org.owasp.dependencycheck.App</mainClass>
|
||||||
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
|
|
||||||
</manifest>
|
</manifest>
|
||||||
</archive>
|
</archive>
|
||||||
<excludes>
|
|
||||||
<exclude>**/checkstyle*</exclude>
|
|
||||||
</excludes>
|
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
<artifactId>cobertura-maven-plugin</artifactId>
|
<artifactId>cobertura-maven-plugin</artifactId>
|
||||||
<version>2.6</version>
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<instrumentation>
|
<!--instrumentation>
|
||||||
<ignoreTrivial>true</ignoreTrivial>
|
<ignoreTrivial>true</ignoreTrivial>
|
||||||
</instrumentation>
|
</instrumentation-->
|
||||||
<check>
|
<check>
|
||||||
<branchRate>85</branchRate>
|
<branchRate>85</branchRate>
|
||||||
<lineRate>85</lineRate>
|
<lineRate>85</lineRate>
|
||||||
@@ -114,7 +108,6 @@ Copyright (c) 2012 - Jeremy Long. All Rights Reserved.
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
<version>2.16</version>
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<systemProperties>
|
<systemProperties>
|
||||||
<property>
|
<property>
|
||||||
@@ -133,165 +126,15 @@ Copyright (c) 2012 - Jeremy Long. All Rights Reserved.
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<version>3.1</version>
|
|
||||||
<configuration>
|
|
||||||
<showDeprecation>false</showDeprecation>
|
|
||||||
<source>1.6</source>
|
|
||||||
<target>1.6</target>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-site-plugin</artifactId>
|
|
||||||
<version>3.3</version>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.maven.doxia</groupId>
|
|
||||||
<artifactId>doxia-module-markdown</artifactId>
|
|
||||||
<version>1.5</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
<configuration>
|
|
||||||
<skipDeploy>true</skipDeploy>
|
|
||||||
<reportPlugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-project-info-reports-plugin</artifactId>
|
|
||||||
<version>2.7</version>
|
|
||||||
<reportSets>
|
|
||||||
<reportSet>
|
|
||||||
<reports>
|
|
||||||
<report>index</report>
|
|
||||||
<report>summary</report>
|
|
||||||
<report>license</report>
|
|
||||||
<report>help</report>
|
|
||||||
</reports>
|
|
||||||
</reportSet>
|
|
||||||
</reportSets>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-javadoc-plugin</artifactId>
|
|
||||||
<version>2.9.1</version>
|
|
||||||
<configuration>
|
|
||||||
<bottom>Copyright© 2012-14 Jeremy Long. All Rights Reserved.</bottom>
|
|
||||||
</configuration>
|
|
||||||
<reportSets>
|
|
||||||
<reportSet>
|
|
||||||
<id>default</id>
|
|
||||||
<reports>
|
|
||||||
<report>javadoc</report>
|
|
||||||
</reports>
|
|
||||||
</reportSet>
|
|
||||||
</reportSets>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
|
||||||
<artifactId>versions-maven-plugin</artifactId>
|
|
||||||
<version>2.1</version>
|
|
||||||
<reportSets>
|
|
||||||
<reportSet>
|
|
||||||
<reports>
|
|
||||||
<report>dependency-updates-report</report>
|
|
||||||
<report>plugin-updates-report</report>
|
|
||||||
</reports>
|
|
||||||
</reportSet>
|
|
||||||
</reportSets>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-jxr-plugin</artifactId>
|
|
||||||
<version>2.4</version>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
|
||||||
<artifactId>cobertura-maven-plugin</artifactId>
|
|
||||||
<version>2.6</version>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-surefire-report-plugin</artifactId>
|
|
||||||
<version>2.16</version>
|
|
||||||
<reportSets>
|
|
||||||
<reportSet>
|
|
||||||
<reports>
|
|
||||||
<report>report-only</report>
|
|
||||||
</reports>
|
|
||||||
</reportSet>
|
|
||||||
</reportSets>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
|
||||||
<artifactId>taglist-maven-plugin</artifactId>
|
|
||||||
<version>2.4</version>
|
|
||||||
<configuration>
|
|
||||||
<tagListOptions>
|
|
||||||
<tagClasses>
|
|
||||||
<tagClass>
|
|
||||||
<displayName>Todo Work</displayName>
|
|
||||||
<tags>
|
|
||||||
<tag>
|
|
||||||
<matchString>todo</matchString>
|
|
||||||
<matchType>ignoreCase</matchType>
|
|
||||||
</tag>
|
|
||||||
<tag>
|
|
||||||
<matchString>FIXME</matchString>
|
|
||||||
<matchType>exact</matchType>
|
|
||||||
</tag>
|
|
||||||
</tags>
|
|
||||||
</tagClass>
|
|
||||||
</tagClasses>
|
|
||||||
</tagListOptions>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
|
||||||
<version>2.11</version>
|
|
||||||
<configuration>
|
|
||||||
<enableRulesSummary>false</enableRulesSummary>
|
|
||||||
<configLocation>${basedir}/../src/main/config/checkstyle-checks.xml</configLocation>
|
|
||||||
<headerLocation>${basedir}/../src/main/config/checkstyle-header.txt</headerLocation>
|
|
||||||
<suppressionsLocation>${basedir}/../src/main/config/checkstyle-suppressions.xml</suppressionsLocation>
|
|
||||||
<suppressionsFileExpression>checkstyle.suppressions.file</suppressionsFileExpression>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-pmd-plugin</artifactId>
|
|
||||||
<version>3.1</version>
|
|
||||||
<configuration>
|
|
||||||
<targetJdk>1.6</targetJdk>
|
|
||||||
<linkXref>true</linkXref>
|
|
||||||
<sourceEncoding>utf-8</sourceEncoding>
|
|
||||||
<excludes>
|
|
||||||
<exclude>**/generated/*.java</exclude>
|
|
||||||
</excludes>
|
|
||||||
<rulesets>
|
|
||||||
<ruleset>../src/main/config/dcrules.xml</ruleset>
|
|
||||||
<ruleset>/rulesets/java/basic.xml</ruleset>
|
|
||||||
<ruleset>/rulesets/java/imports.xml</ruleset>
|
|
||||||
<ruleset>/rulesets/java/unusedcode.xml</ruleset>
|
|
||||||
</rulesets>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
|
||||||
<artifactId>findbugs-maven-plugin</artifactId>
|
|
||||||
<version>2.5.3</version>
|
|
||||||
</plugin>
|
|
||||||
</reportPlugins>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
<artifactId>appassembler-maven-plugin</artifactId>
|
<artifactId>appassembler-maven-plugin</artifactId>
|
||||||
<version>1.7</version>
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<programs>
|
<programs>
|
||||||
<program>
|
<program>
|
||||||
<mainClass>org.owasp.dependencycheck.App</mainClass>
|
<mainClass>org.owasp.dependencycheck.App</mainClass>
|
||||||
<name>dependency-check</name>
|
<id>dependency-check</id>
|
||||||
</program>
|
</program>
|
||||||
</programs>
|
</programs>
|
||||||
<assembleDirectory>${project.build.directory}/release</assembleDirectory>
|
<assembleDirectory>${project.build.directory}/release</assembleDirectory>
|
||||||
@@ -332,6 +175,137 @@ Copyright (c) 2012 - Jeremy Long. All Rights Reserved.
|
|||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
<reporting>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-project-info-reports-plugin</artifactId>
|
||||||
|
<version>2.7</version>
|
||||||
|
<reportSets>
|
||||||
|
<reportSet>
|
||||||
|
<reports>
|
||||||
|
<report>index</report>
|
||||||
|
<report>summary</report>
|
||||||
|
<report>license</report>
|
||||||
|
<report>help</report>
|
||||||
|
</reports>
|
||||||
|
</reportSet>
|
||||||
|
</reportSets>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>2.9.1</version>
|
||||||
|
<configuration>
|
||||||
|
<bottom>Copyright© 2012-15 Jeremy Long. All Rights Reserved.</bottom>
|
||||||
|
</configuration>
|
||||||
|
<reportSets>
|
||||||
|
<reportSet>
|
||||||
|
<id>default</id>
|
||||||
|
<reports>
|
||||||
|
<report>javadoc</report>
|
||||||
|
</reports>
|
||||||
|
</reportSet>
|
||||||
|
</reportSets>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>versions-maven-plugin</artifactId>
|
||||||
|
<version>2.1</version>
|
||||||
|
<reportSets>
|
||||||
|
<reportSet>
|
||||||
|
<reports>
|
||||||
|
<report>dependency-updates-report</report>
|
||||||
|
<report>plugin-updates-report</report>
|
||||||
|
</reports>
|
||||||
|
</reportSet>
|
||||||
|
</reportSets>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-jxr-plugin</artifactId>
|
||||||
|
<version>2.4</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>cobertura-maven-plugin</artifactId>
|
||||||
|
<version>2.6</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-report-plugin</artifactId>
|
||||||
|
<version>2.16</version>
|
||||||
|
<reportSets>
|
||||||
|
<reportSet>
|
||||||
|
<reports>
|
||||||
|
<report>report-only</report>
|
||||||
|
</reports>
|
||||||
|
</reportSet>
|
||||||
|
</reportSets>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>taglist-maven-plugin</artifactId>
|
||||||
|
<version>2.4</version>
|
||||||
|
<configuration>
|
||||||
|
<tagListOptions>
|
||||||
|
<tagClasses>
|
||||||
|
<tagClass>
|
||||||
|
<displayName>Todo Work</displayName>
|
||||||
|
<tags>
|
||||||
|
<tag>
|
||||||
|
<matchString>todo</matchString>
|
||||||
|
<matchType>ignoreCase</matchType>
|
||||||
|
</tag>
|
||||||
|
<tag>
|
||||||
|
<matchString>FIXME</matchString>
|
||||||
|
<matchType>exact</matchType>
|
||||||
|
</tag>
|
||||||
|
</tags>
|
||||||
|
</tagClass>
|
||||||
|
</tagClasses>
|
||||||
|
</tagListOptions>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||||
|
<version>2.11</version>
|
||||||
|
<configuration>
|
||||||
|
<enableRulesSummary>false</enableRulesSummary>
|
||||||
|
<enableFilesSummary>false</enableFilesSummary>
|
||||||
|
<configLocation>${basedir}/../src/main/config/checkstyle-checks.xml</configLocation>
|
||||||
|
<headerLocation>${basedir}/../src/main/config/checkstyle-header.txt</headerLocation>
|
||||||
|
<suppressionsLocation>${basedir}/../src/main/config/checkstyle-suppressions.xml</suppressionsLocation>
|
||||||
|
<suppressionsFileExpression>checkstyle.suppressions.file</suppressionsFileExpression>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-pmd-plugin</artifactId>
|
||||||
|
<version>3.1</version>
|
||||||
|
<configuration>
|
||||||
|
<targetJdk>1.6</targetJdk>
|
||||||
|
<linkXref>true</linkXref>
|
||||||
|
<sourceEncoding>utf-8</sourceEncoding>
|
||||||
|
<excludes>
|
||||||
|
<exclude>**/generated/*.java</exclude>
|
||||||
|
</excludes>
|
||||||
|
<rulesets>
|
||||||
|
<ruleset>../src/main/config/dcrules.xml</ruleset>
|
||||||
|
<ruleset>/rulesets/java/basic.xml</ruleset>
|
||||||
|
<ruleset>/rulesets/java/imports.xml</ruleset>
|
||||||
|
<ruleset>/rulesets/java/unusedcode.xml</ruleset>
|
||||||
|
</rulesets>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>findbugs-maven-plugin</artifactId>
|
||||||
|
<version>2.5.3</version>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</reporting>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>commons-cli</groupId>
|
<groupId>commons-cli</groupId>
|
||||||
|
|||||||
@@ -2,10 +2,8 @@
|
|||||||
<assembly
|
<assembly
|
||||||
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
|
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="
|
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2
|
||||||
http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2
|
http://maven.apache.org/xsd/assembly-1.1.2.xsd"
|
||||||
http://maven.apache.org/xsd/assembly-1.1.2.xsd
|
|
||||||
"
|
|
||||||
>
|
>
|
||||||
<id>release</id>
|
<id>release</id>
|
||||||
<formats>
|
<formats>
|
||||||
|
|||||||
@@ -21,15 +21,19 @@ import java.io.File;
|
|||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import org.apache.commons.cli.ParseException;
|
import org.apache.commons.cli.ParseException;
|
||||||
import org.owasp.dependencycheck.cli.CliParser;
|
|
||||||
import org.owasp.dependencycheck.data.nvdcve.CveDB;
|
import org.owasp.dependencycheck.data.nvdcve.CveDB;
|
||||||
import org.owasp.dependencycheck.data.nvdcve.DatabaseException;
|
import org.owasp.dependencycheck.data.nvdcve.DatabaseException;
|
||||||
import org.owasp.dependencycheck.data.nvdcve.DatabaseProperties;
|
import org.owasp.dependencycheck.data.nvdcve.DatabaseProperties;
|
||||||
import org.owasp.dependencycheck.dependency.Dependency;
|
import org.owasp.dependencycheck.dependency.Dependency;
|
||||||
|
import org.owasp.dependencycheck.org.apache.tools.ant.DirectoryScanner;
|
||||||
import org.owasp.dependencycheck.reporting.ReportGenerator;
|
import org.owasp.dependencycheck.reporting.ReportGenerator;
|
||||||
import org.owasp.dependencycheck.utils.LogUtils;
|
import org.owasp.dependencycheck.utils.LogUtils;
|
||||||
import org.owasp.dependencycheck.utils.Settings;
|
import org.owasp.dependencycheck.utils.Settings;
|
||||||
@@ -93,7 +97,11 @@ public class App {
|
|||||||
cli.printVersionInfo();
|
cli.printVersionInfo();
|
||||||
} else if (cli.isRunScan()) {
|
} else if (cli.isRunScan()) {
|
||||||
populateSettings(cli);
|
populateSettings(cli);
|
||||||
runScan(cli.getReportDirectory(), cli.getReportFormat(), cli.getApplicationName(), cli.getScanFiles());
|
try {
|
||||||
|
runScan(cli.getReportDirectory(), cli.getReportFormat(), cli.getApplicationName(), cli.getScanFiles(), cli.getExcludeList());
|
||||||
|
} catch (InvalidScanPathException ex) {
|
||||||
|
Logger.getLogger(App.class.getName()).log(Level.SEVERE, "An invalid scan path was detected; unable to scan '//*' paths");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
cli.printHelp();
|
cli.printHelp();
|
||||||
}
|
}
|
||||||
@@ -106,18 +114,71 @@ public class App {
|
|||||||
* @param outputFormat the output format of the report
|
* @param outputFormat the output format of the report
|
||||||
* @param applicationName the application name for the report
|
* @param applicationName the application name for the report
|
||||||
* @param files the files/directories to scan
|
* @param files the files/directories to scan
|
||||||
|
* @param excludes the patterns for files/directories to exclude
|
||||||
|
*
|
||||||
|
* @throws InvalidScanPathException thrown if the path to scan starts with "//"
|
||||||
*/
|
*/
|
||||||
private void runScan(String reportDirectory, String outputFormat, String applicationName, String[] files) {
|
private void runScan(String reportDirectory, String outputFormat, String applicationName, String[] files,
|
||||||
Engine scanner = null;
|
String[] excludes) throws InvalidScanPathException {
|
||||||
|
Engine engine = null;
|
||||||
try {
|
try {
|
||||||
scanner = new Engine();
|
engine = new Engine();
|
||||||
|
List<String> antStylePaths = new ArrayList<String>();
|
||||||
for (String file : files) {
|
if (excludes == null || excludes.length == 0) {
|
||||||
scanner.scan(file);
|
for (String file : files) {
|
||||||
|
if (file.contains("*") || file.contains("?")) {
|
||||||
|
antStylePaths.add(file);
|
||||||
|
} else {
|
||||||
|
engine.scan(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
antStylePaths = Arrays.asList(files);
|
||||||
}
|
}
|
||||||
|
|
||||||
scanner.analyzeDependencies();
|
final Set<File> paths = new HashSet<File>();
|
||||||
final List<Dependency> dependencies = scanner.getDependencies();
|
for (String file : antStylePaths) {
|
||||||
|
final DirectoryScanner scanner = new DirectoryScanner();
|
||||||
|
String include = file.replace('\\', '/');
|
||||||
|
File baseDir;
|
||||||
|
|
||||||
|
if (include.startsWith("//")) {
|
||||||
|
throw new InvalidScanPathException("Unable to scan paths specified by //");
|
||||||
|
} else if (include.startsWith("./")) {
|
||||||
|
baseDir = new File(".");
|
||||||
|
include = include.substring(2);
|
||||||
|
} else if (include.startsWith("/")) {
|
||||||
|
baseDir = new File("/");
|
||||||
|
include = include.substring(1);
|
||||||
|
} else if (include.contains("/")) {
|
||||||
|
final int pos = include.indexOf('/');
|
||||||
|
final String tmp = include.substring(0, pos);
|
||||||
|
if (tmp.contains("*") || tmp.contains("?")) {
|
||||||
|
baseDir = new File(".");
|
||||||
|
} else {
|
||||||
|
baseDir = new File(tmp);
|
||||||
|
include = include.substring(pos + 1);
|
||||||
|
}
|
||||||
|
} else { //no path info - must just be a file in the working directory
|
||||||
|
baseDir = new File(".");
|
||||||
|
}
|
||||||
|
scanner.setBasedir(baseDir);
|
||||||
|
scanner.setIncludes(include);
|
||||||
|
if (excludes != null && excludes.length > 0) {
|
||||||
|
scanner.addExcludes(excludes);
|
||||||
|
}
|
||||||
|
scanner.scan();
|
||||||
|
if (scanner.getIncludedFilesCount() > 0) {
|
||||||
|
for (String s : scanner.getIncludedFiles()) {
|
||||||
|
final File f = new File(baseDir, s);
|
||||||
|
paths.add(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
engine.scan(paths);
|
||||||
|
|
||||||
|
engine.analyzeDependencies();
|
||||||
|
final List<Dependency> dependencies = engine.getDependencies();
|
||||||
DatabaseProperties prop = null;
|
DatabaseProperties prop = null;
|
||||||
CveDB cve = null;
|
CveDB cve = null;
|
||||||
try {
|
try {
|
||||||
@@ -131,7 +192,7 @@ public class App {
|
|||||||
cve.close();
|
cve.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final ReportGenerator report = new ReportGenerator(applicationName, dependencies, scanner.getAnalyzers(), prop);
|
final ReportGenerator report = new ReportGenerator(applicationName, dependencies, engine.getAnalyzers(), prop);
|
||||||
try {
|
try {
|
||||||
report.generateReports(reportDirectory, outputFormat);
|
report.generateReports(reportDirectory, outputFormat);
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
@@ -145,8 +206,8 @@ public class App {
|
|||||||
LOGGER.log(Level.SEVERE, "Unable to connect to the dependency-check database; analysis has stopped");
|
LOGGER.log(Level.SEVERE, "Unable to connect to the dependency-check database; analysis has stopped");
|
||||||
LOGGER.log(Level.FINE, "", ex);
|
LOGGER.log(Level.FINE, "", ex);
|
||||||
} finally {
|
} finally {
|
||||||
if (scanner != null) {
|
if (engine != null) {
|
||||||
scanner.cleanup();
|
engine.cleanup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -172,6 +233,7 @@ public class App {
|
|||||||
final boolean archiveDisabled = cli.isArchiveDisabled();
|
final boolean archiveDisabled = cli.isArchiveDisabled();
|
||||||
final boolean assemblyDisabled = cli.isAssemblyDisabled();
|
final boolean assemblyDisabled = cli.isAssemblyDisabled();
|
||||||
final boolean nuspecDisabled = cli.isNuspecDisabled();
|
final boolean nuspecDisabled = cli.isNuspecDisabled();
|
||||||
|
final boolean centralDisabled = cli.isCentralDisabled();
|
||||||
final boolean nexusDisabled = cli.isNexusDisabled();
|
final boolean nexusDisabled = cli.isNexusDisabled();
|
||||||
final String nexusUrl = cli.getNexusUrl();
|
final String nexusUrl = cli.getNexusUrl();
|
||||||
final String databaseDriverName = cli.getDatabaseDriverName();
|
final String databaseDriverName = cli.getDatabaseDriverName();
|
||||||
@@ -237,6 +299,7 @@ public class App {
|
|||||||
Settings.setBoolean(Settings.KEYS.ANALYZER_NUSPEC_ENABLED, !nuspecDisabled);
|
Settings.setBoolean(Settings.KEYS.ANALYZER_NUSPEC_ENABLED, !nuspecDisabled);
|
||||||
Settings.setBoolean(Settings.KEYS.ANALYZER_ASSEMBLY_ENABLED, !assemblyDisabled);
|
Settings.setBoolean(Settings.KEYS.ANALYZER_ASSEMBLY_ENABLED, !assemblyDisabled);
|
||||||
|
|
||||||
|
Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, !centralDisabled);
|
||||||
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, !nexusDisabled);
|
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, !nexusDisabled);
|
||||||
if (nexusUrl != null && !nexusUrl.isEmpty()) {
|
if (nexusUrl != null && !nexusUrl.isEmpty()) {
|
||||||
Settings.setString(Settings.KEYS.ANALYZER_NEXUS_URL, nexusUrl);
|
Settings.setString(Settings.KEYS.ANALYZER_NEXUS_URL, nexusUrl);
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 2012 Jeremy Long. All Rights Reserved.
|
* Copyright (c) 2012 Jeremy Long. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
package org.owasp.dependencycheck.cli;
|
package org.owasp.dependencycheck;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
@@ -84,8 +84,8 @@ public final class CliParser {
|
|||||||
/**
|
/**
|
||||||
* Validates that the command line arguments are valid.
|
* Validates that the command line arguments are valid.
|
||||||
*
|
*
|
||||||
* @throws FileNotFoundException if there is a file specified by either the SCAN or CPE command line arguments that
|
* @throws FileNotFoundException if there is a file specified by either the SCAN or CPE command line arguments that does not
|
||||||
* does not exist.
|
* exist.
|
||||||
* @throws ParseException is thrown if there is an exception parsing the command line.
|
* @throws ParseException is thrown if there is an exception parsing the command line.
|
||||||
*/
|
*/
|
||||||
private void validateArgs() throws FileNotFoundException, ParseException {
|
private void validateArgs() throws FileNotFoundException, ParseException {
|
||||||
@@ -112,8 +112,8 @@ public final class CliParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validates whether or not the path(s) points at a file that exists; if the path(s) does not point to an existing
|
* Validates whether or not the path(s) points at a file that exists; if the path(s) does not point to an existing file a
|
||||||
* file a FileNotFoundException is thrown.
|
* FileNotFoundException is thrown.
|
||||||
*
|
*
|
||||||
* @param paths the paths to validate if they exists
|
* @param paths the paths to validate if they exists
|
||||||
* @param optType the option being validated (e.g. scan, out, etc.)
|
* @param optType the option being validated (e.g. scan, out, etc.)
|
||||||
@@ -134,14 +134,36 @@ public final class CliParser {
|
|||||||
* @throws FileNotFoundException is thrown if the path being validated does not exist.
|
* @throws FileNotFoundException is thrown if the path being validated does not exist.
|
||||||
*/
|
*/
|
||||||
private void validatePathExists(String path, String argumentName) throws FileNotFoundException {
|
private void validatePathExists(String path, String argumentName) throws FileNotFoundException {
|
||||||
if (!path.contains("*.")) {
|
if (path == null) {
|
||||||
final File f = new File(path);
|
isValid = false;
|
||||||
if (!f.exists()) {
|
final String msg = String.format("Invalid '%s' argument: null", argumentName);
|
||||||
isValid = false;
|
throw new FileNotFoundException(msg);
|
||||||
final String msg = String.format("Invalid '%s' argument: '%s'", argumentName, path);
|
} else if (!path.contains("*") && !path.contains("?")) {
|
||||||
throw new FileNotFoundException(msg);
|
File f = new File(path);
|
||||||
|
if ("o".equalsIgnoreCase(argumentName.substring(0, 1)) && !"ALL".equalsIgnoreCase(this.getReportFormat())) {
|
||||||
|
final String checkPath = path.toLowerCase();
|
||||||
|
if (checkPath.endsWith(".html") || checkPath.endsWith(".xml") || checkPath.endsWith(".htm")) {
|
||||||
|
if (f.getParentFile() == null) {
|
||||||
|
f = new File(".", path);
|
||||||
|
}
|
||||||
|
if (!f.getParentFile().isDirectory()) {
|
||||||
|
isValid = false;
|
||||||
|
final String msg = String.format("Invalid '%s' argument: '%s'", argumentName, path);
|
||||||
|
throw new FileNotFoundException(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!f.exists()) {
|
||||||
|
isValid = false;
|
||||||
|
final String msg = String.format("Invalid '%s' argument: '%s'", argumentName, path);
|
||||||
|
throw new FileNotFoundException(msg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} // else { // TODO add a validation for *.zip extensions rather then relying on the engine to validate it.
|
} else if (path.startsWith("//") || path.startsWith("\\\\")) {
|
||||||
|
isValid = false;
|
||||||
|
final String msg = String.format("Invalid '%s' argument: '%s'%nUnable to scan paths that start with '//'.", argumentName, path);
|
||||||
|
throw new FileNotFoundException(msg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -151,7 +173,6 @@ public final class CliParser {
|
|||||||
*/
|
*/
|
||||||
@SuppressWarnings("static-access")
|
@SuppressWarnings("static-access")
|
||||||
private Options createCommandLineOptions() {
|
private Options createCommandLineOptions() {
|
||||||
|
|
||||||
final Options options = new Options();
|
final Options options = new Options();
|
||||||
addStandardOptions(options);
|
addStandardOptions(options);
|
||||||
addAdvancedOptions(options);
|
addAdvancedOptions(options);
|
||||||
@@ -184,16 +205,22 @@ public final class CliParser {
|
|||||||
.create(ARGUMENT.APP_NAME_SHORT);
|
.create(ARGUMENT.APP_NAME_SHORT);
|
||||||
|
|
||||||
final Option path = OptionBuilder.withArgName("path").hasArg().withLongOpt(ARGUMENT.SCAN)
|
final Option path = OptionBuilder.withArgName("path").hasArg().withLongOpt(ARGUMENT.SCAN)
|
||||||
.withDescription("The path to scan - this option can be specified multiple times. To limit the scan"
|
.withDescription("The path to scan - this option can be specified multiple times. Ant style"
|
||||||
+ " to specific file types *.[ext] can be added to the end of the path.")
|
+ " paths are supported (e.g. path/**/*.jar).")
|
||||||
.create(ARGUMENT.SCAN_SHORT);
|
.create(ARGUMENT.SCAN_SHORT);
|
||||||
|
|
||||||
|
final Option excludes = OptionBuilder.withArgName("pattern").hasArg().withLongOpt(ARGUMENT.EXCLUDE)
|
||||||
|
.withDescription("Specify and exclusion pattern. This option can be specified multiple times"
|
||||||
|
+ " and it accepts Ant style excludsions.")
|
||||||
|
.create();
|
||||||
|
|
||||||
final Option props = OptionBuilder.withArgName("file").hasArg().withLongOpt(ARGUMENT.PROP)
|
final Option props = OptionBuilder.withArgName("file").hasArg().withLongOpt(ARGUMENT.PROP)
|
||||||
.withDescription("A property file to load.")
|
.withDescription("A property file to load.")
|
||||||
.create(ARGUMENT.PROP_SHORT);
|
.create(ARGUMENT.PROP_SHORT);
|
||||||
|
|
||||||
final Option out = OptionBuilder.withArgName("folder").hasArg().withLongOpt(ARGUMENT.OUT)
|
final Option out = OptionBuilder.withArgName("path").hasArg().withLongOpt(ARGUMENT.OUT)
|
||||||
.withDescription("The folder to write reports to. This defaults to the current directory.")
|
.withDescription("The folder to write reports to. This defaults to the current directory. "
|
||||||
|
+ "It is possible to set this to a specific file name if the format argument is not set to ALL.")
|
||||||
.create(ARGUMENT.OUT_SHORT);
|
.create(ARGUMENT.OUT_SHORT);
|
||||||
|
|
||||||
final Option outputFormat = OptionBuilder.withArgName("format").hasArg().withLongOpt(ARGUMENT.OUTPUT_FORMAT)
|
final Option outputFormat = OptionBuilder.withArgName("format").hasArg().withLongOpt(ARGUMENT.OUTPUT_FORMAT)
|
||||||
@@ -212,7 +239,11 @@ public final class CliParser {
|
|||||||
final OptionGroup og = new OptionGroup();
|
final OptionGroup og = new OptionGroup();
|
||||||
og.addOption(path);
|
og.addOption(path);
|
||||||
|
|
||||||
|
final OptionGroup exog = new OptionGroup();
|
||||||
|
exog.addOption(excludes);
|
||||||
|
|
||||||
options.addOptionGroup(og)
|
options.addOptionGroup(og)
|
||||||
|
.addOptionGroup(exog)
|
||||||
.addOption(out)
|
.addOption(out)
|
||||||
.addOption(outputFormat)
|
.addOption(outputFormat)
|
||||||
.addOption(appName)
|
.addOption(appName)
|
||||||
@@ -226,8 +257,8 @@ public final class CliParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds the advanced command line options to the given options collection. These are split out for purposes of being
|
* Adds the advanced command line options to the given options collection. These are split out for purposes of being able to
|
||||||
* able to display two different help messages.
|
* display two different help messages.
|
||||||
*
|
*
|
||||||
* @param options a collection of command line arguments
|
* @param options a collection of command line arguments
|
||||||
* @throws IllegalArgumentException thrown if there is an exception
|
* @throws IllegalArgumentException thrown if there is an exception
|
||||||
@@ -292,12 +323,17 @@ public final class CliParser {
|
|||||||
.withDescription("Disable the .NET Assembly Analyzer.")
|
.withDescription("Disable the .NET Assembly Analyzer.")
|
||||||
.create();
|
.create();
|
||||||
|
|
||||||
|
final Option disableCentralAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_CENTRAL)
|
||||||
|
.withDescription("Disable the Central Analyzer. If this analyzer is disabled it is likely you also want to disable "
|
||||||
|
+ "the Nexus Analyzer.")
|
||||||
|
.create();
|
||||||
|
|
||||||
final Option disableNexusAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_NEXUS)
|
final Option disableNexusAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_NEXUS)
|
||||||
.withDescription("Disable the Nexus Analyzer.")
|
.withDescription("Disable the Nexus Analyzer.")
|
||||||
.create();
|
.create();
|
||||||
|
|
||||||
final Option nexusUrl = OptionBuilder.withArgName("url").hasArg().withLongOpt(ARGUMENT.NEXUS_URL)
|
final Option nexusUrl = OptionBuilder.withArgName("url").hasArg().withLongOpt(ARGUMENT.NEXUS_URL)
|
||||||
.withDescription("The url to the Nexus Server.")
|
.withDescription("The url to the Nexus Pro Server. If not set the Nexus Analyzer will be disabled.")
|
||||||
.create();
|
.create();
|
||||||
|
|
||||||
final Option nexusUsesProxy = OptionBuilder.withArgName("true/false").hasArg().withLongOpt(ARGUMENT.NEXUS_USES_PROXY)
|
final Option nexusUsesProxy = OptionBuilder.withArgName("true/false").hasArg().withLongOpt(ARGUMENT.NEXUS_USES_PROXY)
|
||||||
@@ -329,6 +365,7 @@ public final class CliParser {
|
|||||||
.addOption(disableArchiveAnalyzer)
|
.addOption(disableArchiveAnalyzer)
|
||||||
.addOption(disableAssemblyAnalyzer)
|
.addOption(disableAssemblyAnalyzer)
|
||||||
.addOption(disableNuspecAnalyzer)
|
.addOption(disableNuspecAnalyzer)
|
||||||
|
.addOption(disableCentralAnalyzer)
|
||||||
.addOption(disableNexusAnalyzer)
|
.addOption(disableNexusAnalyzer)
|
||||||
.addOption(nexusUrl)
|
.addOption(nexusUrl)
|
||||||
.addOption(nexusUsesProxy)
|
.addOption(nexusUsesProxy)
|
||||||
@@ -337,8 +374,8 @@ public final class CliParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds the deprecated command line options to the given options collection. These are split out for purposes of not
|
* Adds the deprecated command line options to the given options collection. These are split out for purposes of not including
|
||||||
* including them in the help message. We need to add the deprecated options so as not to break existing scripts.
|
* them in the help message. We need to add the deprecated options so as not to break existing scripts.
|
||||||
*
|
*
|
||||||
* @param options a collection of command line arguments
|
* @param options a collection of command line arguments
|
||||||
* @throws IllegalArgumentException thrown if there is an exception
|
* @throws IllegalArgumentException thrown if there is an exception
|
||||||
@@ -425,6 +462,15 @@ public final class CliParser {
|
|||||||
return (line != null) && line.hasOption(ARGUMENT.DISABLE_NEXUS);
|
return (line != null) && line.hasOption(ARGUMENT.DISABLE_NEXUS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the disableCentral command line argument was specified.
|
||||||
|
*
|
||||||
|
* @return true if the disableCentral command line argument was specified; otherwise false
|
||||||
|
*/
|
||||||
|
public boolean isCentralDisabled() {
|
||||||
|
return (line != null) && line.hasOption(ARGUMENT.DISABLE_CENTRAL);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the url to the nexus server if one was specified.
|
* Returns the url to the nexus server if one was specified.
|
||||||
*
|
*
|
||||||
@@ -439,8 +485,7 @@ public final class CliParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the Nexus Analyzer should use the configured proxy to connect to Nexus; otherwise false is
|
* Returns true if the Nexus Analyzer should use the configured proxy to connect to Nexus; otherwise false is returned.
|
||||||
* returned.
|
|
||||||
*
|
*
|
||||||
* @return true if the Nexus Analyzer should use the configured proxy to connect to Nexus; otherwise false
|
* @return true if the Nexus Analyzer should use the configured proxy to connect to Nexus; otherwise false
|
||||||
*/
|
*/
|
||||||
@@ -479,7 +524,6 @@ public final class CliParser {
|
|||||||
options,
|
options,
|
||||||
"",
|
"",
|
||||||
true);
|
true);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -491,6 +535,15 @@ public final class CliParser {
|
|||||||
return line.getOptionValues(ARGUMENT.SCAN);
|
return line.getOptionValues(ARGUMENT.SCAN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the list of excluded file patterns specified by the 'exclude' argument.
|
||||||
|
*
|
||||||
|
* @return the excluded file patterns
|
||||||
|
*/
|
||||||
|
public String[] getExcludeList() {
|
||||||
|
return line.getOptionValues(ARGUMENT.EXCLUDE);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the directory to write the reports to specified on the command line.
|
* Returns the directory to write the reports to specified on the command line.
|
||||||
*
|
*
|
||||||
@@ -628,14 +681,13 @@ public final class CliParser {
|
|||||||
*/
|
*/
|
||||||
public void printVersionInfo() {
|
public void printVersionInfo() {
|
||||||
final String version = String.format("%s version %s",
|
final String version = String.format("%s version %s",
|
||||||
Settings.getString("application.name", "DependencyCheck"),
|
Settings.getString(Settings.KEYS.APPLICATION_VAME, "dependency-check"),
|
||||||
Settings.getString("application.version", "Unknown"));
|
Settings.getString(Settings.KEYS.APPLICATION_VERSION, "Unknown"));
|
||||||
System.out.println(version);
|
System.out.println(version);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the auto update feature has been disabled. If it has been disabled via the command line this will
|
* Checks if the auto update feature has been disabled. If it has been disabled via the command line this will return false.
|
||||||
* return false.
|
|
||||||
*
|
*
|
||||||
* @return if auto-update is allowed.
|
* @return if auto-update is allowed.
|
||||||
*/
|
*/
|
||||||
@@ -837,6 +889,10 @@ public final class CliParser {
|
|||||||
* Disables the Nuspec Analyzer.
|
* Disables the Nuspec Analyzer.
|
||||||
*/
|
*/
|
||||||
public static final String DISABLE_NUSPEC = "disableNuspec";
|
public static final String DISABLE_NUSPEC = "disableNuspec";
|
||||||
|
/**
|
||||||
|
* Disables the Central Analyzer.
|
||||||
|
*/
|
||||||
|
public static final String DISABLE_CENTRAL = "disableCentral";
|
||||||
/**
|
/**
|
||||||
* Disables the Nexus Analyzer.
|
* Disables the Nexus Analyzer.
|
||||||
*/
|
*/
|
||||||
@@ -877,5 +933,9 @@ public final class CliParser {
|
|||||||
* The CLI argument name for setting extra extensions.
|
* The CLI argument name for setting extra extensions.
|
||||||
*/
|
*/
|
||||||
public static final String ADDITIONAL_ZIP_EXTENSIONS = "zipExtensions";
|
public static final String ADDITIONAL_ZIP_EXTENSIONS = "zipExtensions";
|
||||||
|
/**
|
||||||
|
* Exclude path argument.
|
||||||
|
*/
|
||||||
|
public static final String EXCLUDE = "exclude";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of dependency-check-cli.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 Jeremy Long. All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.owasp.dependencycheck;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thrown if an invalid path is encountered.
|
||||||
|
*
|
||||||
|
* @author Jeremy Long <jeremy.long@owasp.org>
|
||||||
|
*/
|
||||||
|
class InvalidScanPathException extends Exception {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new InvalidScanPathException.
|
||||||
|
*/
|
||||||
|
public InvalidScanPathException() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new InvalidScanPathException.
|
||||||
|
*
|
||||||
|
* @param msg a message for the exception
|
||||||
|
*/
|
||||||
|
public InvalidScanPathException(String msg) {
|
||||||
|
super(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new InvalidScanPathException.
|
||||||
|
*
|
||||||
|
* @param ex the cause of the exception
|
||||||
|
*/
|
||||||
|
public InvalidScanPathException(Throwable ex) {
|
||||||
|
super(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new InvalidScanPathException.
|
||||||
|
*
|
||||||
|
* @param msg a message for the exception
|
||||||
|
* @param ex the cause of the exception
|
||||||
|
*/
|
||||||
|
public InvalidScanPathException(String msg, Throwable ex) {
|
||||||
|
super(msg, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
/**
|
|
||||||
* <html>
|
|
||||||
* <head>
|
|
||||||
* <title>org.owasp.dependencycheck.cli</title>
|
|
||||||
* </head>
|
|
||||||
* <body>
|
|
||||||
* Includes utility classes such as the CLI Parser,
|
|
||||||
* </body>
|
|
||||||
* </html>
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.owasp.dependencycheck.cli;
|
|
||||||
@@ -6,8 +6,9 @@ The following table lists the command line arguments:
|
|||||||
Short | Argument Name | Parameter | Description | Requirement
|
Short | Argument Name | Parameter | Description | Requirement
|
||||||
-------|-----------------------|-----------------|-------------|------------
|
-------|-----------------------|-----------------|-------------|------------
|
||||||
\-a | \-\-app | \<name\> | The name of the application being scanned. This is a required argument. | Required
|
\-a | \-\-app | \<name\> | The name of the application being scanned. This is a required argument. | Required
|
||||||
\-s | \-\-scan | \<path\> | The path to scan \- this option can be specified multiple times. It is also possible to specify specific file types that should be scanned by supplying a scan path of '[path]/[to]/[scan]/*.zip'. The wild card can only be used to denote any file-name with a specific extension. | Required
|
\-s | \-\-scan | \<path\> | The path to scan \- this option can be specified multiple times. It is also possible to specify Ant style paths (e.g. directory/**/*.jar). | Required
|
||||||
\-o | \-\-out | \<folder\> | The folder to write reports to. This defaults to the current directory. | Optional
|
| \-\-exclude | \<pattern\> | The path patterns to exclude from the scan \- this option can be specified multiple times. This accepts Ant style path patterns (e.g. **/exclude/**) . | Optional
|
||||||
|
\-o | \-\-out | \<path\> | The folder to write reports to. This defaults to the current directory. If the format is not set to ALL one could specify a specific file name. | Optional
|
||||||
\-f | \-\-format | \<format\> | The output format to write to (XML, HTML, VULN, ALL). The default is HTML. | Required
|
\-f | \-\-format | \<format\> | The output format to write to (XML, HTML, VULN, ALL). The default is HTML. | Required
|
||||||
\-l | \-\-log | \<file\> | The file path to write verbose logging information. | Optional
|
\-l | \-\-log | \<file\> | The file path to write verbose logging information. | Optional
|
||||||
\-n | \-\-noupdate | | Disables the automatic updating of the CPE data. | Optional
|
\-n | \-\-noupdate | | Disables the automatic updating of the CPE data. | Optional
|
||||||
@@ -18,26 +19,27 @@ Short | Argument Name | Parameter | Description | Requir
|
|||||||
|
|
||||||
Advanced Options
|
Advanced Options
|
||||||
================
|
================
|
||||||
Short | Argument Name | Parameter | Description | Default Value
|
Short | Argument Name | Parameter | Description | Default Value
|
||||||
-------|-----------------------|-----------------|-------------|---------------
|
-------|-----------------------|-----------------|-----------------------------------------------------------------------------|---------------
|
||||||
| \-\-disableArchive | | Sets whether the Archive Analyzer will be used. | false
|
\-P | \-\-propertyfile | \<file\> | Specifies a file that contains properties to use instead of applicaion defaults. |
|
||||||
|
| \-\-disableArchive | | Sets whether the Archive Analyzer will be used. | false
|
||||||
| \-\-zipExtensions | \<strings\> | A comma-separated list of additional file extensions to be treated like a ZIP file, the contents will be extracted and analyzed. |
|
| \-\-zipExtensions | \<strings\> | A comma-separated list of additional file extensions to be treated like a ZIP file, the contents will be extracted and analyzed. |
|
||||||
| \-\-disableJar | | Sets whether Jar Analyzer will be used. | false
|
| \-\-disableJar | | Sets whether the Jar Analyzer will be used. | false
|
||||||
| \-\-disableNexus | | Sets whether Nexus Analyzer will be used. | false
|
| \-\-disableCentral | | Sets whether the Central Analyzer will be used. **Disabling this analyzer is not recommended as it could lead to false negatives (e.g. libraries that have vulnerabilities may not be reported correctly).** If this analyzer is being disabled there is a good chance you also want to disable the Nexus Analyzer. | false
|
||||||
| \-\-disableNexus | | Disable the Nexus Analyzer. |
|
| \-\-disableNexus | | Sets whether the Nexus Analyzer will be used. Note, this has been superceded by the Central Analyzer. However, you can configure the Nexus URL to utilize an internally hosted Nexus Pro server. | false
|
||||||
| \-\-nexus | \<url\> | The url to the Nexus Server. | https://repository.sonatype.org/service/local/
|
| \-\-nexus | \<url\> | The url to the Nexus Pro Server. If not set the Nexus Analyzer will be disabled. |
|
||||||
| \-\-nexusUsesProxy | \<true\|false\> | Whether or not the defined proxy should be used when connecting to Nexus. | true
|
| \-\-nexusUsesProxy | \<true\|false\> | Whether or not the defined proxy should be used when connecting to Nexus. | true
|
||||||
| \-\-disableNuspec | | Sets whether or not the .NET Nuget Nuspec Analyzer will be used. | false
|
| \-\-disableNuspec | | Sets whether or not the .NET Nuget Nuspec Analyzer will be used. | false
|
||||||
| \-\-disableAssembly | | Sets whether or not the .NET Assembly Analyzer should be used. | false
|
| \-\-disableAssembly | | Sets whether or not the .NET Assembly Analyzer should be used. | false
|
||||||
| \-\-pathToMono | \<path\> | The path to Mono for .NET Assembly analysis on non-windows systems. |
|
| \-\-pathToMono | \<path\> | The path to Mono for .NET Assembly analysis on non-windows systems. |
|
||||||
| \-\-proxyserver | \<server\> | The proxy server to use when downloading resources. |
|
| \-\-proxyserver | \<server\> | The proxy server to use when downloading resources. |
|
||||||
| \-\-proxyport | \<port\> | The proxy port to use when downloading resources. |
|
| \-\-proxyport | \<port\> | The proxy port to use when downloading resources. |
|
||||||
| \-\-connectiontimeout | \<timeout\> | The connection timeout (in milliseconds) to use when downloading resources. |
|
| \-\-connectiontimeout | \<timeout\> | The connection timeout (in milliseconds) to use when downloading resources. |
|
||||||
| \-\-proxypass | \<pass\> | The proxy password to use when downloading resources. |
|
| \-\-proxypass | \<pass\> | The proxy password to use when downloading resources. |
|
||||||
| \-\-proxyuser | \<user\> | The proxy username to use when downloading resources. |
|
| \-\-proxyuser | \<user\> | The proxy username to use when downloading resources. |
|
||||||
| \-\-connectionString | \<connStr\> | The connection string to the database. |
|
| \-\-connectionString | \<connStr\> | The connection string to the database. |
|
||||||
| \-\-dbDriverName | \<driver\> | The database driver name. |
|
| \-\-dbDriverName | \<driver\> | The database driver name. |
|
||||||
| \-\-dbDriverPath | \<path\> | The path to the database driver; note, this does not need to be set unless the JAR is outside of the class path. |
|
| \-\-dbDriverPath | \<path\> | The path to the database driver; note, this does not need to be set unless the JAR is outside of the class path. |
|
||||||
| \-\-dbPassword | \<password\> | The password for connecting to the database. |
|
| \-\-dbPassword | \<password\> | The password for connecting to the database. |
|
||||||
| \-\-dbUser | \<user\> | The username used to connect to the database. |
|
| \-\-dbUser | \<user\> | The username used to connect to the database. |
|
||||||
\-d | \-\-data | \<path\> | The location of the data directory used to store persistent data. This option should generally not be set. |
|
\-d | \-\-data | \<path\> | The location of the data directory used to store persistent data. This option should generally not be set. |
|
||||||
|
|||||||
@@ -15,8 +15,9 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 2012 Jeremy Long. All Rights Reserved.
|
* Copyright (c) 2012 Jeremy Long. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
package org.owasp.dependencycheck.cli;
|
package org.owasp.dependencycheck;
|
||||||
|
|
||||||
|
import org.owasp.dependencycheck.CliParser;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
@@ -20,7 +20,7 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.owasp</groupId>
|
<groupId>org.owasp</groupId>
|
||||||
<artifactId>dependency-check-parent</artifactId>
|
<artifactId>dependency-check-parent</artifactId>
|
||||||
<version>1.2.5</version>
|
<version>1.2.9</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>dependency-check-core</artifactId>
|
<artifactId>dependency-check-core</artifactId>
|
||||||
@@ -93,7 +93,6 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-dependency-plugin</artifactId>
|
<artifactId>maven-dependency-plugin</artifactId>
|
||||||
<version>2.8</version>
|
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<phase>generate-resources</phase>
|
<phase>generate-resources</phase>
|
||||||
@@ -110,7 +109,6 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-jar-plugin</artifactId>
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
<version>2.4</version>
|
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<id>jar</id>
|
<id>jar</id>
|
||||||
@@ -127,24 +125,13 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
|
|||||||
</goals>
|
</goals>
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
<configuration>
|
|
||||||
<archive>
|
|
||||||
<manifest>
|
|
||||||
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
|
|
||||||
</manifest>
|
|
||||||
</archive>
|
|
||||||
<excludes>
|
|
||||||
<exclude>**/checkstyle*</exclude>
|
|
||||||
</excludes>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
<artifactId>cobertura-maven-plugin</artifactId>
|
<artifactId>cobertura-maven-plugin</artifactId>
|
||||||
<version>2.6</version>
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<instrumentation>
|
<instrumentation>
|
||||||
<ignoreTrivial>true</ignoreTrivial>
|
<!--ignoreTrivial>true</ignoreTrivial-->
|
||||||
<ignores>
|
<ignores>
|
||||||
<ignore>.*\$KEYS\.class</ignore>
|
<ignore>.*\$KEYS\.class</ignore>
|
||||||
<ignore>.*\$Element\.class</ignore>
|
<ignore>.*\$Element\.class</ignore>
|
||||||
@@ -192,7 +179,6 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
<version>2.16</version>
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<systemProperties>
|
<systemProperties>
|
||||||
<property>
|
<property>
|
||||||
@@ -213,200 +199,149 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-failsafe-plugin</artifactId>
|
<artifactId>maven-failsafe-plugin</artifactId>
|
||||||
<version>2.16</version>
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<systemProperties>
|
<systemProperties>
|
||||||
<property>
|
<property>
|
||||||
<name>data.directory</name>
|
<name>data.directory</name>
|
||||||
<value>${project.build.directory}/data</value>
|
<value>${project.build.directory}/data</value>
|
||||||
</property>
|
</property>
|
||||||
<property>
|
|
||||||
<name>temp.directory</name>
|
|
||||||
<value>${project.build.directory}/temp</value>
|
|
||||||
</property>
|
|
||||||
|
|
||||||
</systemProperties>
|
</systemProperties>
|
||||||
<includes>
|
|
||||||
<include>**/*IntegrationTest.java</include>
|
|
||||||
</includes>
|
|
||||||
</configuration>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<goals>
|
|
||||||
<goal>integration-test</goal>
|
|
||||||
<goal>verify</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-site-plugin</artifactId>
|
|
||||||
<version>3.3</version>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.maven.doxia</groupId>
|
|
||||||
<artifactId>doxia-module-markdown</artifactId>
|
|
||||||
<version>1.5</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
<configuration>
|
|
||||||
<skipDeploy>true</skipDeploy>
|
|
||||||
<reportPlugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-project-info-reports-plugin</artifactId>
|
|
||||||
<version>2.7</version>
|
|
||||||
<reportSets>
|
|
||||||
<reportSet>
|
|
||||||
<reports>
|
|
||||||
<report>index</report>
|
|
||||||
<report>summary</report>
|
|
||||||
<report>license</report>
|
|
||||||
<report>help</report>
|
|
||||||
</reports>
|
|
||||||
</reportSet>
|
|
||||||
</reportSets>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-javadoc-plugin</artifactId>
|
|
||||||
<version>2.9.1</version>
|
|
||||||
<configuration>
|
|
||||||
<bottom>Copyright© 2012-14 Jeremy Long. All Rights Reserved.</bottom>
|
|
||||||
</configuration>
|
|
||||||
<reportSets>
|
|
||||||
<reportSet>
|
|
||||||
<id>default</id>
|
|
||||||
<reports>
|
|
||||||
<report>javadoc</report>
|
|
||||||
</reports>
|
|
||||||
</reportSet>
|
|
||||||
</reportSets>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
|
||||||
<artifactId>versions-maven-plugin</artifactId>
|
|
||||||
<version>2.1</version>
|
|
||||||
<reportSets>
|
|
||||||
<reportSet>
|
|
||||||
<reports>
|
|
||||||
<report>dependency-updates-report</report>
|
|
||||||
<report>plugin-updates-report</report>
|
|
||||||
</reports>
|
|
||||||
</reportSet>
|
|
||||||
</reportSets>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-jxr-plugin</artifactId>
|
|
||||||
<version>2.4</version>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
|
||||||
<artifactId>cobertura-maven-plugin</artifactId>
|
|
||||||
<version>2.6</version>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-surefire-report-plugin</artifactId>
|
|
||||||
<version>2.16</version>
|
|
||||||
<reportSets>
|
|
||||||
<reportSet>
|
|
||||||
<reports>
|
|
||||||
<report>report-only</report>
|
|
||||||
</reports>
|
|
||||||
</reportSet>
|
|
||||||
<reportSet>
|
|
||||||
<id>integration-tests</id>
|
|
||||||
<reports>
|
|
||||||
<report>report-only</report>
|
|
||||||
<report>failsafe-report-only</report>
|
|
||||||
</reports>
|
|
||||||
</reportSet>
|
|
||||||
</reportSets>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
|
||||||
<artifactId>taglist-maven-plugin</artifactId>
|
|
||||||
<version>2.4</version>
|
|
||||||
<configuration>
|
|
||||||
<tagListOptions>
|
|
||||||
<tagClasses>
|
|
||||||
<tagClass>
|
|
||||||
<displayName>Todo Work</displayName>
|
|
||||||
<tags>
|
|
||||||
<tag>
|
|
||||||
<matchString>todo</matchString>
|
|
||||||
<matchType>ignoreCase</matchType>
|
|
||||||
</tag>
|
|
||||||
<tag>
|
|
||||||
<matchString>FIXME</matchString>
|
|
||||||
<matchType>exact</matchType>
|
|
||||||
</tag>
|
|
||||||
</tags>
|
|
||||||
</tagClass>
|
|
||||||
</tagClasses>
|
|
||||||
</tagListOptions>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
|
||||||
<version>2.11</version>
|
|
||||||
<configuration>
|
|
||||||
<enableRulesSummary>false</enableRulesSummary>
|
|
||||||
<configLocation>${basedir}/../src/main/config/checkstyle-checks.xml</configLocation>
|
|
||||||
<headerLocation>${basedir}/../src/main/config/checkstyle-header.txt</headerLocation>
|
|
||||||
<suppressionsLocation>${basedir}/../src/main/config/checkstyle-suppressions.xml</suppressionsLocation>
|
|
||||||
<suppressionsFileExpression>checkstyle.suppressions.file</suppressionsFileExpression>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-pmd-plugin</artifactId>
|
|
||||||
<version>3.1</version>
|
|
||||||
<configuration>
|
|
||||||
<targetJdk>1.6</targetJdk>
|
|
||||||
<linkXref>true</linkXref>
|
|
||||||
<sourceEncoding>utf-8</sourceEncoding>
|
|
||||||
<excludes>
|
|
||||||
<exclude>**/generated/*.java</exclude>
|
|
||||||
</excludes>
|
|
||||||
<rulesets>
|
|
||||||
<ruleset>../src/main/config/dcrules.xml</ruleset>
|
|
||||||
<ruleset>/rulesets/java/basic.xml</ruleset>
|
|
||||||
<ruleset>/rulesets/java/imports.xml</ruleset>
|
|
||||||
<ruleset>/rulesets/java/unusedcode.xml</ruleset>
|
|
||||||
</rulesets>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
|
||||||
<artifactId>findbugs-maven-plugin</artifactId>
|
|
||||||
<version>2.5.3</version>
|
|
||||||
</plugin>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
|
||||||
<artifactId>javancss-maven-plugin</artifactId>
|
|
||||||
<version>2.0</version>
|
|
||||||
</dependency>
|
|
||||||
</reportPlugins>
|
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<version>3.1</version>
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<showDeprecation>false</showDeprecation>
|
<compilerArgument>-Xlint:unchecked</compilerArgument>
|
||||||
<source>1.6</source>
|
|
||||||
<target>1.6</target>
|
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
<reporting>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>2.9.1</version>
|
||||||
|
<configuration>
|
||||||
|
<bottom>Copyright© 2012-15 Jeremy Long. All Rights Reserved.</bottom>
|
||||||
|
</configuration>
|
||||||
|
<reportSets>
|
||||||
|
<reportSet>
|
||||||
|
<id>default</id>
|
||||||
|
<reports>
|
||||||
|
<report>javadoc</report>
|
||||||
|
</reports>
|
||||||
|
</reportSet>
|
||||||
|
</reportSets>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>versions-maven-plugin</artifactId>
|
||||||
|
<version>2.1</version>
|
||||||
|
<reportSets>
|
||||||
|
<reportSet>
|
||||||
|
<reports>
|
||||||
|
<report>dependency-updates-report</report>
|
||||||
|
<report>plugin-updates-report</report>
|
||||||
|
</reports>
|
||||||
|
</reportSet>
|
||||||
|
</reportSets>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-jxr-plugin</artifactId>
|
||||||
|
<version>2.4</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>cobertura-maven-plugin</artifactId>
|
||||||
|
<version>2.6</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-report-plugin</artifactId>
|
||||||
|
<version>2.16</version>
|
||||||
|
<reportSets>
|
||||||
|
<reportSet>
|
||||||
|
<reports>
|
||||||
|
<report>report-only</report>
|
||||||
|
</reports>
|
||||||
|
</reportSet>
|
||||||
|
<reportSet>
|
||||||
|
<id>integration-tests</id>
|
||||||
|
<reports>
|
||||||
|
<report>report-only</report>
|
||||||
|
<report>failsafe-report-only</report>
|
||||||
|
</reports>
|
||||||
|
</reportSet>
|
||||||
|
</reportSets>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>taglist-maven-plugin</artifactId>
|
||||||
|
<version>2.4</version>
|
||||||
|
<configuration>
|
||||||
|
<tagListOptions>
|
||||||
|
<tagClasses>
|
||||||
|
<tagClass>
|
||||||
|
<displayName>Todo Work</displayName>
|
||||||
|
<tags>
|
||||||
|
<tag>
|
||||||
|
<matchString>todo</matchString>
|
||||||
|
<matchType>ignoreCase</matchType>
|
||||||
|
</tag>
|
||||||
|
<tag>
|
||||||
|
<matchString>FIXME</matchString>
|
||||||
|
<matchType>exact</matchType>
|
||||||
|
</tag>
|
||||||
|
</tags>
|
||||||
|
</tagClass>
|
||||||
|
</tagClasses>
|
||||||
|
</tagListOptions>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||||
|
<version>2.11</version>
|
||||||
|
<configuration>
|
||||||
|
<enableRulesSummary>false</enableRulesSummary>
|
||||||
|
<enableFilesSummary>false</enableFilesSummary>
|
||||||
|
<configLocation>${basedir}/../src/main/config/checkstyle-checks.xml</configLocation>
|
||||||
|
<headerLocation>${basedir}/../src/main/config/checkstyle-header.txt</headerLocation>
|
||||||
|
<suppressionsLocation>${basedir}/../src/main/config/checkstyle-suppressions.xml</suppressionsLocation>
|
||||||
|
<suppressionsFileExpression>checkstyle.suppressions.file</suppressionsFileExpression>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-pmd-plugin</artifactId>
|
||||||
|
<version>3.1</version>
|
||||||
|
<configuration>
|
||||||
|
<targetJdk>1.6</targetJdk>
|
||||||
|
<linkXref>true</linkXref>
|
||||||
|
<sourceEncoding>utf-8</sourceEncoding>
|
||||||
|
<excludes>
|
||||||
|
<exclude>**/generated/*.java</exclude>
|
||||||
|
</excludes>
|
||||||
|
<rulesets>
|
||||||
|
<ruleset>../src/main/config/dcrules.xml</ruleset>
|
||||||
|
<ruleset>/rulesets/java/basic.xml</ruleset>
|
||||||
|
<ruleset>/rulesets/java/imports.xml</ruleset>
|
||||||
|
<ruleset>/rulesets/java/unusedcode.xml</ruleset>
|
||||||
|
</rulesets>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>findbugs-maven-plugin</artifactId>
|
||||||
|
<version>2.5.3</version>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</reporting>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<!-- Note, to stay compatible with Jenkins installations only JARs compiled to 1.6 can be used -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.owasp</groupId>
|
<groupId>org.owasp</groupId>
|
||||||
<artifactId>dependency-check-utils</artifactId>
|
<artifactId>dependency-check-utils</artifactId>
|
||||||
@@ -415,24 +350,24 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
<artifactId>lucene-test-framework</artifactId>
|
<artifactId>lucene-test-framework</artifactId>
|
||||||
<version>4.3.1</version>
|
<version>${apache.lucene.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jmockit</groupId>
|
||||||
|
<artifactId>jmockit</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.code.findbugs</groupId>
|
<groupId>com.google.code.findbugs</groupId>
|
||||||
<artifactId>annotations</artifactId>
|
<artifactId>annotations</artifactId>
|
||||||
<version>2.0.1</version>
|
<version>3.0.0</version>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>commons-cli</groupId>
|
|
||||||
<artifactId>commons-cli</artifactId>
|
|
||||||
<version>1.2</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>commons-compress</artifactId>
|
<artifactId>commons-compress</artifactId>
|
||||||
<version>1.8.1</version>
|
<version>1.9</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>commons-io</groupId>
|
<groupId>commons-io</groupId>
|
||||||
@@ -442,76 +377,32 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>commons-lang</groupId>
|
<groupId>commons-lang</groupId>
|
||||||
<artifactId>commons-lang</artifactId>
|
<artifactId>commons-lang</artifactId>
|
||||||
<version>2.5</version>
|
<version>2.6</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
<artifactId>lucene-core</artifactId>
|
<artifactId>lucene-core</artifactId>
|
||||||
<version>4.5.1</version>
|
<version>${apache.lucene.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
<artifactId>lucene-analyzers-common</artifactId>
|
<artifactId>lucene-analyzers-common</artifactId>
|
||||||
<version>4.5.1</version>
|
<version>${apache.lucene.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.lucene</groupId>
|
<groupId>org.apache.lucene</groupId>
|
||||||
<artifactId>lucene-queryparser</artifactId>
|
<artifactId>lucene-queryparser</artifactId>
|
||||||
<version>4.5.1</version>
|
<version>${apache.lucene.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.velocity</groupId>
|
<groupId>org.apache.velocity</groupId>
|
||||||
<artifactId>velocity</artifactId>
|
<artifactId>velocity</artifactId>
|
||||||
<version>1.7</version>
|
<version>1.7</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.velocity</groupId>
|
|
||||||
<artifactId>velocity-tools</artifactId>
|
|
||||||
<version>2.0</version>
|
|
||||||
<!-- very limited use of the velocity-tools, not all of the dependencies are needed-->
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>commons-chain</groupId>
|
|
||||||
<artifactId>commons-chain</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>javax.servlet</groupId>
|
|
||||||
<artifactId>servlet-api</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>commons-validator</groupId>
|
|
||||||
<artifactId>commons-validator</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>dom4j</groupId>
|
|
||||||
<artifactId>dom4j</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>sslext</groupId>
|
|
||||||
<artifactId>sslext</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>org.apache.struts</groupId>
|
|
||||||
<artifactId>struts-core</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>antlr</groupId>
|
|
||||||
<artifactId>antlr</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>org.apache.struts</groupId>
|
|
||||||
<artifactId>struts-taglib</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>org.apache.struts</groupId>
|
|
||||||
<artifactId>struts-tiles</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.h2database</groupId>
|
<groupId>com.h2database</groupId>
|
||||||
<artifactId>h2</artifactId>
|
<artifactId>h2</artifactId>
|
||||||
<version>1.3.172</version>
|
<version>1.3.176</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jsoup</groupId>
|
<groupId>org.jsoup</groupId>
|
||||||
@@ -643,7 +534,7 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
<version>2.16</version>
|
<version>2.18.1</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<skip>true</skip>
|
<skip>true</skip>
|
||||||
</configuration>
|
</configuration>
|
||||||
@@ -651,7 +542,7 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-failsafe-plugin</artifactId>
|
<artifactId>maven-failsafe-plugin</artifactId>
|
||||||
<version>2.16</version>
|
<version>2.18.1</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<systemProperties>
|
<systemProperties>
|
||||||
<property>
|
<property>
|
||||||
@@ -751,7 +642,47 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
|
|||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.sun.jersey</groupId>
|
||||||
|
<artifactId>jersey-client</artifactId>
|
||||||
|
<version>1.11.1</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.sun.faces</groupId>
|
||||||
|
<artifactId>jsf-impl</artifactId>
|
||||||
|
<version>2.2.8-02</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.inject</groupId>
|
||||||
|
<artifactId>guice</artifactId>
|
||||||
|
<version>3.0</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.opensaml</groupId>
|
||||||
|
<artifactId>xmltooling</artifactId>
|
||||||
|
<version>1.4.1</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-webmvc</artifactId>
|
||||||
|
<version>3.2.12.RELEASE</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</profile>
|
</profile>
|
||||||
</profiles>
|
</profiles>
|
||||||
|
<properties>
|
||||||
|
<!-- new versions of lucene are compiled with JDK 1.7 and cannot be used ubiquitously in Jenkins
|
||||||
|
this, we cannot upgrade beyond 4.7.2 -->
|
||||||
|
<apache.lucene.version>4.7.2</apache.lucene.version>
|
||||||
|
</properties>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@@ -18,7 +18,6 @@
|
|||||||
package org.owasp.dependencycheck;
|
package org.owasp.dependencycheck;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.EnumMap;
|
import java.util.EnumMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@@ -32,8 +31,6 @@ import org.owasp.dependencycheck.analyzer.Analyzer;
|
|||||||
import org.owasp.dependencycheck.analyzer.AnalyzerService;
|
import org.owasp.dependencycheck.analyzer.AnalyzerService;
|
||||||
import org.owasp.dependencycheck.analyzer.FileTypeAnalyzer;
|
import org.owasp.dependencycheck.analyzer.FileTypeAnalyzer;
|
||||||
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
|
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
|
||||||
import org.owasp.dependencycheck.data.cpe.CpeMemoryIndex;
|
|
||||||
import org.owasp.dependencycheck.data.cpe.IndexException;
|
|
||||||
import org.owasp.dependencycheck.data.nvdcve.ConnectionFactory;
|
import org.owasp.dependencycheck.data.nvdcve.ConnectionFactory;
|
||||||
import org.owasp.dependencycheck.data.nvdcve.CveDB;
|
import org.owasp.dependencycheck.data.nvdcve.CveDB;
|
||||||
import org.owasp.dependencycheck.data.nvdcve.DatabaseException;
|
import org.owasp.dependencycheck.data.nvdcve.DatabaseException;
|
||||||
@@ -53,28 +50,30 @@ import org.owasp.dependencycheck.utils.Settings;
|
|||||||
*
|
*
|
||||||
* @author Jeremy Long <jeremy.long@owasp.org>
|
* @author Jeremy Long <jeremy.long@owasp.org>
|
||||||
*/
|
*/
|
||||||
public class Engine implements Serializable {
|
public class Engine {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The list of dependencies.
|
* The list of dependencies.
|
||||||
*/
|
*/
|
||||||
private List<Dependency> dependencies;
|
private List<Dependency> dependencies = new ArrayList<Dependency>();
|
||||||
/**
|
/**
|
||||||
* A Map of analyzers grouped by Analysis phase.
|
* A Map of analyzers grouped by Analysis phase.
|
||||||
*/
|
*/
|
||||||
private transient final EnumMap<AnalysisPhase, List<Analyzer>> analyzers;
|
private EnumMap<AnalysisPhase, List<Analyzer>> analyzers = new EnumMap<AnalysisPhase, List<Analyzer>>(AnalysisPhase.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Map of analyzers grouped by Analysis phase.
|
* A Map of analyzers grouped by Analysis phase.
|
||||||
*/
|
*/
|
||||||
private transient final Set<FileTypeAnalyzer> fileTypeAnalyzers;
|
private Set<FileTypeAnalyzer> fileTypeAnalyzers = new HashSet<FileTypeAnalyzer>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The ClassLoader to use when dynamically loading Analyzer and Update services.
|
* The ClassLoader to use when dynamically loading Analyzer and Update services.
|
||||||
*/
|
*/
|
||||||
private transient ClassLoader serviceClassLoader;
|
private ClassLoader serviceClassLoader = Thread.currentThread().getContextClassLoader();
|
||||||
/**
|
/**
|
||||||
* The Logger for use throughout the class.
|
* The Logger for use throughout the class.
|
||||||
*/
|
*/
|
||||||
private transient static final Logger LOGGER = Logger.getLogger(Engine.class.getName());
|
private static final Logger LOGGER = Logger.getLogger(Engine.class.getName());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new Engine.
|
* Creates a new Engine.
|
||||||
@@ -82,32 +81,27 @@ public class Engine implements Serializable {
|
|||||||
* @throws DatabaseException thrown if there is an error connecting to the database
|
* @throws DatabaseException thrown if there is an error connecting to the database
|
||||||
*/
|
*/
|
||||||
public Engine() throws DatabaseException {
|
public Engine() throws DatabaseException {
|
||||||
this(Thread.currentThread().getContextClassLoader());
|
initializeEngine();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new Engine.
|
||||||
|
*
|
||||||
|
* @param serviceClassLoader a reference the class loader being used
|
||||||
|
* @throws DatabaseException thrown if there is an error connecting to the database
|
||||||
|
*/
|
||||||
|
public Engine(ClassLoader serviceClassLoader) throws DatabaseException {
|
||||||
|
this.serviceClassLoader = serviceClassLoader;
|
||||||
|
initializeEngine();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new Engine using the specified classloader to dynamically load Analyzer and Update services.
|
* Creates a new Engine using the specified classloader to dynamically load Analyzer and Update services.
|
||||||
*
|
*
|
||||||
* @param serviceClassLoader the ClassLoader to use when dynamically loading Analyzer and Update services
|
|
||||||
* @throws DatabaseException thrown if there is an error connecting to the database
|
* @throws DatabaseException thrown if there is an error connecting to the database
|
||||||
*/
|
*/
|
||||||
public Engine(ClassLoader serviceClassLoader) throws DatabaseException {
|
protected final void initializeEngine() throws DatabaseException {
|
||||||
this.dependencies = new ArrayList<Dependency>();
|
|
||||||
this.analyzers = new EnumMap<AnalysisPhase, List<Analyzer>>(AnalysisPhase.class);
|
|
||||||
this.fileTypeAnalyzers = new HashSet<FileTypeAnalyzer>();
|
|
||||||
this.serviceClassLoader = serviceClassLoader;
|
|
||||||
|
|
||||||
ConnectionFactory.initialize();
|
ConnectionFactory.initialize();
|
||||||
|
|
||||||
boolean autoUpdate = true;
|
|
||||||
try {
|
|
||||||
autoUpdate = Settings.getBoolean(Settings.KEYS.AUTO_UPDATE);
|
|
||||||
} catch (InvalidSettingException ex) {
|
|
||||||
LOGGER.log(Level.FINE, "Invalid setting for auto-update; using true.");
|
|
||||||
}
|
|
||||||
if (autoUpdate) {
|
|
||||||
doUpdates();
|
|
||||||
}
|
|
||||||
loadAnalyzers();
|
loadAnalyzers();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,7 +116,9 @@ public class Engine implements Serializable {
|
|||||||
* Loads the analyzers specified in the configuration file (or system properties).
|
* Loads the analyzers specified in the configuration file (or system properties).
|
||||||
*/
|
*/
|
||||||
private void loadAnalyzers() {
|
private void loadAnalyzers() {
|
||||||
|
if (!analyzers.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (AnalysisPhase phase : AnalysisPhase.values()) {
|
for (AnalysisPhase phase : AnalysisPhase.values()) {
|
||||||
analyzers.put(phase, new ArrayList<Analyzer>());
|
analyzers.put(phase, new ArrayList<Analyzer>());
|
||||||
}
|
}
|
||||||
@@ -157,159 +153,200 @@ public class Engine implements Serializable {
|
|||||||
return dependencies;
|
return dependencies;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the dependencies.
|
||||||
|
*
|
||||||
|
* @param dependencies the dependencies
|
||||||
|
*/
|
||||||
public void setDependencies(List<Dependency> dependencies) {
|
public void setDependencies(List<Dependency> dependencies) {
|
||||||
this.dependencies = dependencies;
|
this.dependencies = dependencies;
|
||||||
//for (Dependency dependency: dependencies) {
|
|
||||||
// dependencies.add(dependency);
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scans an array of files or directories. If a directory is specified, it will be scanned recursively. Any
|
* Scans an array of files or directories. If a directory is specified, it will be scanned recursively. Any
|
||||||
* dependencies identified are added to the dependency collection.
|
* dependencies identified are added to the dependency collection.
|
||||||
*
|
*
|
||||||
* @since v0.3.2.5
|
* @param paths an array of paths to files or directories to be analyzed
|
||||||
|
* @return the list of dependencies scanned
|
||||||
*
|
*
|
||||||
* @param paths an array of paths to files or directories to be analyzed.
|
* @since v0.3.2.5
|
||||||
*/
|
*/
|
||||||
public void scan(String[] paths) {
|
public List<Dependency> scan(String[] paths) {
|
||||||
|
final List<Dependency> deps = new ArrayList<Dependency>();
|
||||||
for (String path : paths) {
|
for (String path : paths) {
|
||||||
final File file = new File(path);
|
final File file = new File(path);
|
||||||
scan(file);
|
final List<Dependency> d = scan(file);
|
||||||
|
if (d != null) {
|
||||||
|
deps.addAll(d);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return deps;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scans a given file or directory. If a directory is specified, it will be scanned recursively. Any dependencies
|
* Scans a given file or directory. If a directory is specified, it will be scanned recursively. Any dependencies
|
||||||
* identified are added to the dependency collection.
|
* identified are added to the dependency collection.
|
||||||
*
|
*
|
||||||
* @param path the path to a file or directory to be analyzed.
|
* @param path the path to a file or directory to be analyzed
|
||||||
|
* @return the list of dependencies scanned
|
||||||
*/
|
*/
|
||||||
public void scan(String path) {
|
public List<Dependency> scan(String path) {
|
||||||
if (path.matches("^.*[\\/]\\*\\.[^\\/:*|?<>\"]+$")) {
|
final File file = new File(path);
|
||||||
final String[] parts = path.split("\\*\\.");
|
return scan(file);
|
||||||
final String[] ext = new String[]{parts[parts.length - 1]};
|
|
||||||
final File dir = new File(path.substring(0, path.length() - ext[0].length() - 2));
|
|
||||||
if (dir.isDirectory()) {
|
|
||||||
final List<File> files = (List<File>) org.apache.commons.io.FileUtils.listFiles(dir, ext, true);
|
|
||||||
scan(files);
|
|
||||||
} else {
|
|
||||||
final String msg = String.format("Invalid file path provided to scan '%s'", path);
|
|
||||||
LOGGER.log(Level.SEVERE, msg);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
final File file = new File(path);
|
|
||||||
scan(file);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scans an array of files or directories. If a directory is specified, it will be scanned recursively. Any
|
* Scans an array of files or directories. If a directory is specified, it will be scanned recursively. Any
|
||||||
* dependencies identified are added to the dependency collection.
|
* dependencies identified are added to the dependency collection.
|
||||||
*
|
*
|
||||||
* @since v0.3.2.5
|
|
||||||
*
|
|
||||||
* @param files an array of paths to files or directories to be analyzed.
|
* @param files an array of paths to files or directories to be analyzed.
|
||||||
|
* @return the list of dependencies
|
||||||
|
*
|
||||||
|
* @since v0.3.2.5
|
||||||
*/
|
*/
|
||||||
public void scan(File[] files) {
|
public List<Dependency> scan(File[] files) {
|
||||||
|
final List<Dependency> deps = new ArrayList<Dependency>();
|
||||||
for (File file : files) {
|
for (File file : files) {
|
||||||
scan(file);
|
final List<Dependency> d = scan(file);
|
||||||
|
if (d != null) {
|
||||||
|
deps.addAll(d);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return deps;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scans a list of files or directories. If a directory is specified, it will be scanned recursively. Any
|
* Scans a list of files or directories. If a directory is specified, it will be scanned recursively. Any
|
||||||
* dependencies identified are added to the dependency collection.
|
* dependencies identified are added to the dependency collection.
|
||||||
*
|
*
|
||||||
* @since v0.3.2.5
|
* @param files a set of paths to files or directories to be analyzed
|
||||||
|
* @return the list of dependencies scanned
|
||||||
*
|
*
|
||||||
* @param files a set of paths to files or directories to be analyzed.
|
* @since v0.3.2.5
|
||||||
*/
|
*/
|
||||||
public void scan(Set<File> files) {
|
public List<Dependency> scan(Set<File> files) {
|
||||||
|
final List<Dependency> deps = new ArrayList<Dependency>();
|
||||||
for (File file : files) {
|
for (File file : files) {
|
||||||
scan(file);
|
final List<Dependency> d = scan(file);
|
||||||
|
if (d != null) {
|
||||||
|
deps.addAll(d);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return deps;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scans a list of files or directories. If a directory is specified, it will be scanned recursively. Any
|
* Scans a list of files or directories. If a directory is specified, it will be scanned recursively. Any
|
||||||
* dependencies identified are added to the dependency collection.
|
* dependencies identified are added to the dependency collection.
|
||||||
*
|
*
|
||||||
* @since v0.3.2.5
|
* @param files a set of paths to files or directories to be analyzed
|
||||||
|
* @return the list of dependencies scanned
|
||||||
*
|
*
|
||||||
* @param files a set of paths to files or directories to be analyzed.
|
* @since v0.3.2.5
|
||||||
*/
|
*/
|
||||||
public void scan(List<File> files) {
|
public List<Dependency> scan(List<File> files) {
|
||||||
|
final List<Dependency> deps = new ArrayList<Dependency>();
|
||||||
for (File file : files) {
|
for (File file : files) {
|
||||||
scan(file);
|
final List<Dependency> d = scan(file);
|
||||||
|
if (d != null) {
|
||||||
|
deps.addAll(d);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return deps;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scans a given file or directory. If a directory is specified, it will be scanned recursively. Any dependencies
|
* Scans a given file or directory. If a directory is specified, it will be scanned recursively. Any dependencies
|
||||||
* identified are added to the dependency collection.
|
* identified are added to the dependency collection.
|
||||||
*
|
*
|
||||||
|
* @param file the path to a file or directory to be analyzed
|
||||||
|
* @return the list of dependencies scanned
|
||||||
|
*
|
||||||
* @since v0.3.2.4
|
* @since v0.3.2.4
|
||||||
*
|
*
|
||||||
* @param file the path to a file or directory to be analyzed.
|
|
||||||
*/
|
*/
|
||||||
public void scan(File file) {
|
public List<Dependency> scan(File file) {
|
||||||
if (file.exists()) {
|
if (file.exists()) {
|
||||||
if (file.isDirectory()) {
|
if (file.isDirectory()) {
|
||||||
scanDirectory(file);
|
return scanDirectory(file);
|
||||||
} else {
|
} else {
|
||||||
scanFile(file);
|
final Dependency d = scanFile(file);
|
||||||
|
if (d != null) {
|
||||||
|
final List<Dependency> deps = new ArrayList<Dependency>();
|
||||||
|
deps.add(d);
|
||||||
|
return deps;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recursively scans files and directories. Any dependencies identified are added to the dependency collection.
|
* Recursively scans files and directories. Any dependencies identified are added to the dependency collection.
|
||||||
*
|
*
|
||||||
* @param dir the directory to scan.
|
* @param dir the directory to scan
|
||||||
|
* @return the list of Dependency objects scanned
|
||||||
*/
|
*/
|
||||||
protected void scanDirectory(File dir) {
|
protected List<Dependency> scanDirectory(File dir) {
|
||||||
final File[] files = dir.listFiles();
|
final File[] files = dir.listFiles();
|
||||||
|
final List<Dependency> deps = new ArrayList<Dependency>();
|
||||||
if (files != null) {
|
if (files != null) {
|
||||||
for (File f : files) {
|
for (File f : files) {
|
||||||
if (f.isDirectory()) {
|
if (f.isDirectory()) {
|
||||||
scanDirectory(f);
|
final List<Dependency> d = scanDirectory(f);
|
||||||
|
if (d != null) {
|
||||||
|
deps.addAll(d);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
scanFile(f);
|
final Dependency d = scanFile(f);
|
||||||
|
deps.add(d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return deps;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scans a specified file. If a dependency is identified it is added to the dependency collection.
|
* Scans a specified file. If a dependency is identified it is added to the dependency collection.
|
||||||
*
|
*
|
||||||
* @param file The file to scan.
|
* @param file The file to scan
|
||||||
|
* @return the scanned dependency
|
||||||
*/
|
*/
|
||||||
protected void scanFile(File file) {
|
protected Dependency scanFile(File file) {
|
||||||
if (!file.isFile()) {
|
if (!file.isFile()) {
|
||||||
final String msg = String.format("Path passed to scanFile(File) is not a file: %s. Skipping the file.", file.toString());
|
final String msg = String.format("Path passed to scanFile(File) is not a file: %s. Skipping the file.", file.toString());
|
||||||
LOGGER.log(Level.FINE, msg);
|
LOGGER.log(Level.FINE, msg);
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
final String fileName = file.getName();
|
final String fileName = file.getName();
|
||||||
final String extension = FileUtils.getFileExtension(fileName);
|
final String extension = FileUtils.getFileExtension(fileName);
|
||||||
|
Dependency dependency = null;
|
||||||
if (extension != null) {
|
if (extension != null) {
|
||||||
if (supportsExtension(extension)) {
|
if (supportsExtension(extension)) {
|
||||||
final Dependency dependency = new Dependency(file);
|
dependency = new Dependency(file);
|
||||||
dependencies.add(dependency);
|
dependencies.add(dependency);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
final String msg = String.format("No file extension found on file '%s'. The file was not analyzed.",
|
final String msg = String.format("No file extension found on file '%s'. The file was not analyzed.", file.toString());
|
||||||
file.toString());
|
LOGGER.log(Level.FINE, msg);
|
||||||
LOGGER.log(Level.FINEST, msg);
|
|
||||||
}
|
}
|
||||||
|
return dependency;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Runs the analyzers against all of the dependencies.
|
* Runs the analyzers against all of the dependencies.
|
||||||
*/
|
*/
|
||||||
public void analyzeDependencies() {
|
public void analyzeDependencies() {
|
||||||
|
boolean autoUpdate = true;
|
||||||
|
try {
|
||||||
|
autoUpdate = Settings.getBoolean(Settings.KEYS.AUTO_UPDATE);
|
||||||
|
} catch (InvalidSettingException ex) {
|
||||||
|
LOGGER.log(Level.FINE, "Invalid setting for auto-update; using true.");
|
||||||
|
}
|
||||||
|
if (autoUpdate) {
|
||||||
|
doUpdates();
|
||||||
|
}
|
||||||
|
|
||||||
//need to ensure that data exists
|
//need to ensure that data exists
|
||||||
try {
|
try {
|
||||||
ensureDataExists();
|
ensureDataExists();
|
||||||
@@ -338,7 +375,7 @@ public class Engine implements Serializable {
|
|||||||
final List<Analyzer> analyzerList = analyzers.get(phase);
|
final List<Analyzer> analyzerList = analyzers.get(phase);
|
||||||
|
|
||||||
for (Analyzer a : analyzerList) {
|
for (Analyzer a : analyzerList) {
|
||||||
initializeAnalyzer(a);
|
a = initializeAnalyzer(a);
|
||||||
|
|
||||||
/* need to create a copy of the collection because some of the
|
/* need to create a copy of the collection because some of the
|
||||||
* analyzers may modify it. This prevents ConcurrentModificationExceptions.
|
* analyzers may modify it. This prevents ConcurrentModificationExceptions.
|
||||||
@@ -393,8 +430,9 @@ public class Engine implements Serializable {
|
|||||||
* Initializes the given analyzer.
|
* Initializes the given analyzer.
|
||||||
*
|
*
|
||||||
* @param analyzer the analyzer to initialize
|
* @param analyzer the analyzer to initialize
|
||||||
|
* @return the initialized analyzer
|
||||||
*/
|
*/
|
||||||
private void initializeAnalyzer(Analyzer analyzer) {
|
protected Analyzer initializeAnalyzer(Analyzer analyzer) {
|
||||||
try {
|
try {
|
||||||
final String msg = String.format("Initializing %s", analyzer.getName());
|
final String msg = String.format("Initializing %s", analyzer.getName());
|
||||||
LOGGER.log(Level.FINE, msg);
|
LOGGER.log(Level.FINE, msg);
|
||||||
@@ -409,6 +447,7 @@ public class Engine implements Serializable {
|
|||||||
LOGGER.log(Level.FINEST, null, ex1);
|
LOGGER.log(Level.FINEST, null, ex1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return analyzer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -416,7 +455,7 @@ public class Engine implements Serializable {
|
|||||||
*
|
*
|
||||||
* @param analyzer the analyzer to close
|
* @param analyzer the analyzer to close
|
||||||
*/
|
*/
|
||||||
private void closeAnalyzer(Analyzer analyzer) {
|
protected void closeAnalyzer(Analyzer analyzer) {
|
||||||
final String msg = String.format("Closing Analyzer '%s'", analyzer.getName());
|
final String msg = String.format("Closing Analyzer '%s'", analyzer.getName());
|
||||||
LOGGER.log(Level.FINE, msg);
|
LOGGER.log(Level.FINE, msg);
|
||||||
try {
|
try {
|
||||||
@@ -430,6 +469,7 @@ public class Engine implements Serializable {
|
|||||||
* Cycles through the cached web data sources and calls update on all of them.
|
* Cycles through the cached web data sources and calls update on all of them.
|
||||||
*/
|
*/
|
||||||
private void doUpdates() {
|
private void doUpdates() {
|
||||||
|
LOGGER.info("Checking for updates");
|
||||||
final UpdateService service = new UpdateService(serviceClassLoader);
|
final UpdateService service = new UpdateService(serviceClassLoader);
|
||||||
final Iterator<CachedWebDataSource> iterator = service.getDataSources();
|
final Iterator<CachedWebDataSource> iterator = service.getDataSources();
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
@@ -439,10 +479,10 @@ public class Engine implements Serializable {
|
|||||||
} catch (UpdateException ex) {
|
} catch (UpdateException ex) {
|
||||||
LOGGER.log(Level.WARNING,
|
LOGGER.log(Level.WARNING,
|
||||||
"Unable to update Cached Web DataSource, using local data instead. Results may not include recent vulnerabilities.");
|
"Unable to update Cached Web DataSource, using local data instead. Results may not include recent vulnerabilities.");
|
||||||
LOGGER.log(Level.FINE,
|
LOGGER.log(Level.FINE, String.format("Unable to update details for %s", source.getClass().getName()), ex);
|
||||||
String.format("Unable to update details for %s", source.getClass().getName()), ex);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
LOGGER.info("Check for updates complete");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -478,6 +518,15 @@ public class Engine implements Serializable {
|
|||||||
return scan;
|
return scan;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the set of file type analyzers.
|
||||||
|
*
|
||||||
|
* @return the set of file type analyzers
|
||||||
|
*/
|
||||||
|
public Set<FileTypeAnalyzer> getFileTypeAnalyzers() {
|
||||||
|
return this.fileTypeAnalyzers;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks the CPE Index to ensure documents exists. If none exist a NoDataException is thrown.
|
* Checks the CPE Index to ensure documents exists. If none exist a NoDataException is thrown.
|
||||||
*
|
*
|
||||||
@@ -485,22 +534,16 @@ public class Engine implements Serializable {
|
|||||||
* @throws DatabaseException thrown if there is an exception opening the database
|
* @throws DatabaseException thrown if there is an exception opening the database
|
||||||
*/
|
*/
|
||||||
private void ensureDataExists() throws NoDataException, DatabaseException {
|
private void ensureDataExists() throws NoDataException, DatabaseException {
|
||||||
final CpeMemoryIndex cpe = CpeMemoryIndex.getInstance();
|
|
||||||
final CveDB cve = new CveDB();
|
final CveDB cve = new CveDB();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
cve.open();
|
cve.open();
|
||||||
cpe.open(cve);
|
if (!cve.dataExists()) {
|
||||||
} catch (IndexException ex) {
|
throw new NoDataException("No documents exist");
|
||||||
throw new NoDataException(ex.getMessage(), ex);
|
}
|
||||||
} catch (DatabaseException ex) {
|
} catch (DatabaseException ex) {
|
||||||
throw new NoDataException(ex.getMessage(), ex);
|
throw new NoDataException(ex.getMessage(), ex);
|
||||||
} finally {
|
} finally {
|
||||||
cve.close();
|
cve.close();
|
||||||
}
|
}
|
||||||
if (cpe.numDocs() <= 0) {
|
|
||||||
cpe.close();
|
|
||||||
throw new NoDataException("No documents exist");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -440,6 +440,52 @@ public class DependencyCheckScanAgent {
|
|||||||
this.showSummary = showSummary;
|
this.showSummary = showSummary;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether or not the Maven Central analyzer is enabled.
|
||||||
|
*/
|
||||||
|
private boolean centralAnalyzerEnabled = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the value of centralAnalyzerEnabled.
|
||||||
|
*
|
||||||
|
* @return the value of centralAnalyzerEnabled
|
||||||
|
*/
|
||||||
|
public boolean isCentralAnalyzerEnabled() {
|
||||||
|
return centralAnalyzerEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the value of centralAnalyzerEnabled.
|
||||||
|
*
|
||||||
|
* @param centralAnalyzerEnabled new value of centralAnalyzerEnabled
|
||||||
|
*/
|
||||||
|
public void setCentralAnalyzerEnabled(boolean centralAnalyzerEnabled) {
|
||||||
|
this.centralAnalyzerEnabled = centralAnalyzerEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The URL of Maven Central.
|
||||||
|
*/
|
||||||
|
private String centralUrl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the value of centralUrl.
|
||||||
|
*
|
||||||
|
* @return the value of centralUrl
|
||||||
|
*/
|
||||||
|
public String getCentralUrl() {
|
||||||
|
return centralUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the value of centralUrl.
|
||||||
|
*
|
||||||
|
* @param centralUrl new value of centralUrl
|
||||||
|
*/
|
||||||
|
public void setCentralUrl(String centralUrl) {
|
||||||
|
this.centralUrl = centralUrl;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether or not the nexus analyzer is enabled.
|
* Whether or not the nexus analyzer is enabled.
|
||||||
*/
|
*/
|
||||||
@@ -849,6 +895,10 @@ public class DependencyCheckScanAgent {
|
|||||||
if (suppressionFile != null && !suppressionFile.isEmpty()) {
|
if (suppressionFile != null && !suppressionFile.isEmpty()) {
|
||||||
Settings.setString(Settings.KEYS.SUPPRESSION_FILE, suppressionFile);
|
Settings.setString(Settings.KEYS.SUPPRESSION_FILE, suppressionFile);
|
||||||
}
|
}
|
||||||
|
Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, centralAnalyzerEnabled);
|
||||||
|
if (centralUrl != null && !centralUrl.isEmpty()) {
|
||||||
|
Settings.setString(Settings.KEYS.ANALYZER_CENTRAL_URL, centralUrl);
|
||||||
|
}
|
||||||
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, nexusAnalyzerEnabled);
|
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, nexusAnalyzerEnabled);
|
||||||
if (nexusUrl != null && !nexusUrl.isEmpty()) {
|
if (nexusUrl != null && !nexusUrl.isEmpty()) {
|
||||||
Settings.setString(Settings.KEYS.ANALYZER_NEXUS_URL, nexusUrl);
|
Settings.setString(Settings.KEYS.ANALYZER_NEXUS_URL, nexusUrl);
|
||||||
|
|||||||
@@ -41,16 +41,7 @@ public abstract class AbstractFileTypeAnalyzer extends AbstractAnalyzer implemen
|
|||||||
* enabled.
|
* enabled.
|
||||||
*/
|
*/
|
||||||
public AbstractFileTypeAnalyzer() {
|
public AbstractFileTypeAnalyzer() {
|
||||||
final String key = getAnalyzerEnabledSettingKey();
|
reset();
|
||||||
try {
|
|
||||||
enabled = Settings.getBoolean(key, true);
|
|
||||||
} catch (InvalidSettingException ex) {
|
|
||||||
String msg = String.format("Invalid setting for property '%s'", key);
|
|
||||||
LOGGER.log(Level.WARNING, msg);
|
|
||||||
LOGGER.log(Level.FINE, "", ex);
|
|
||||||
msg = String.format("%s has been disabled", getName());
|
|
||||||
LOGGER.log(Level.WARNING, msg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//</editor-fold>
|
//</editor-fold>
|
||||||
|
|
||||||
@@ -164,6 +155,23 @@ public abstract class AbstractFileTypeAnalyzer extends AbstractAnalyzer implemen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets the enabled flag on the analyzer.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public final void reset() {
|
||||||
|
final String key = getAnalyzerEnabledSettingKey();
|
||||||
|
try {
|
||||||
|
enabled = Settings.getBoolean(key, true);
|
||||||
|
} catch (InvalidSettingException ex) {
|
||||||
|
String msg = String.format("Invalid setting for property '%s'", key);
|
||||||
|
LOGGER.log(Level.WARNING, msg);
|
||||||
|
LOGGER.log(Level.FINE, "", ex);
|
||||||
|
msg = String.format("%s has been disabled", getName());
|
||||||
|
LOGGER.log(Level.WARNING, msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Analyzes a given dependency. If the dependency is an archive, such as a WAR or EAR, the contents are extracted,
|
* Analyzes a given dependency. If the dependency is an archive, such as a WAR or EAR, the contents are extracted,
|
||||||
* scanned, and added to the list of dependencies within the engine.
|
* scanned, and added to the list of dependencies within the engine.
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
static {
|
static {
|
||||||
final String additionalZipExt = Settings.getString(Settings.KEYS.ADDITIONAL_ZIP_EXTENSIONS);
|
final String additionalZipExt = Settings.getString(Settings.KEYS.ADDITIONAL_ZIP_EXTENSIONS);
|
||||||
if (additionalZipExt != null) {
|
if (additionalZipExt != null) {
|
||||||
final HashSet ext = new HashSet<String>(Arrays.asList(additionalZipExt));
|
final Set<String> ext = new HashSet<String>(Arrays.asList(additionalZipExt));
|
||||||
ZIPPABLES.addAll(ext);
|
ZIPPABLES.addAll(ext);
|
||||||
}
|
}
|
||||||
EXTENSIONS.addAll(ZIPPABLES);
|
EXTENSIONS.addAll(ZIPPABLES);
|
||||||
@@ -186,7 +186,7 @@ public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
if (tempFileLocation != null && tempFileLocation.exists()) {
|
if (tempFileLocation != null && tempFileLocation.exists()) {
|
||||||
LOGGER.log(Level.FINE, "Attempting to delete temporary files");
|
LOGGER.log(Level.FINE, "Attempting to delete temporary files");
|
||||||
final boolean success = FileUtils.delete(tempFileLocation);
|
final boolean success = FileUtils.delete(tempFileLocation);
|
||||||
if (!success && tempFileLocation != null & tempFileLocation.exists()) {
|
if (!success && tempFileLocation != null && tempFileLocation.exists() && tempFileLocation.list().length > 0) {
|
||||||
LOGGER.log(Level.WARNING, "Failed to delete some temporary files, see the log for more details");
|
LOGGER.log(Level.WARNING, "Failed to delete some temporary files, see the log for more details");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -221,9 +221,8 @@ public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
final String displayPath = String.format("%s%s",
|
final String displayPath = String.format("%s%s",
|
||||||
dependency.getFilePath(),
|
dependency.getFilePath(),
|
||||||
d.getActualFilePath().substring(tmpDir.getAbsolutePath().length()));
|
d.getActualFilePath().substring(tmpDir.getAbsolutePath().length()));
|
||||||
final String displayName = String.format("%s%s%s",
|
final String displayName = String.format("%s: %s",
|
||||||
dependency.getFileName(),
|
dependency.getFileName(),
|
||||||
File.separator,
|
|
||||||
d.getFileName());
|
d.getFileName());
|
||||||
d.setFilePath(displayPath);
|
d.setFilePath(displayPath);
|
||||||
d.setFileName(displayName);
|
d.setFileName(displayName);
|
||||||
@@ -339,7 +338,7 @@ public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
try {
|
try {
|
||||||
fis.close();
|
fis.close();
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
LOGGER.log(Level.FINEST, null, ex);
|
LOGGER.log(Level.FINE, null, ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -368,8 +367,10 @@ public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
final File file = new File(destination, entry.getName());
|
final File file = new File(destination, entry.getName());
|
||||||
final String ext = FileUtils.getFileExtension(file.getName());
|
final String ext = FileUtils.getFileExtension(file.getName());
|
||||||
if (engine.supportsExtension(ext)) {
|
if (engine.supportsExtension(ext)) {
|
||||||
|
final String extracting = String.format("Extracting '%s'", file.getPath());
|
||||||
|
LOGGER.fine(extracting);
|
||||||
BufferedOutputStream bos = null;
|
BufferedOutputStream bos = null;
|
||||||
FileOutputStream fos;
|
FileOutputStream fos = null;
|
||||||
try {
|
try {
|
||||||
final File parent = file.getParentFile();
|
final File parent = file.getParentFile();
|
||||||
if (!parent.isDirectory()) {
|
if (!parent.isDirectory()) {
|
||||||
@@ -381,7 +382,7 @@ public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
fos = new FileOutputStream(file);
|
fos = new FileOutputStream(file);
|
||||||
bos = new BufferedOutputStream(fos, BUFFER_SIZE);
|
bos = new BufferedOutputStream(fos, BUFFER_SIZE);
|
||||||
int count;
|
int count;
|
||||||
final byte data[] = new byte[BUFFER_SIZE];
|
final byte[] data = new byte[BUFFER_SIZE];
|
||||||
while ((count = input.read(data, 0, BUFFER_SIZE)) != -1) {
|
while ((count = input.read(data, 0, BUFFER_SIZE)) != -1) {
|
||||||
bos.write(data, 0, count);
|
bos.write(data, 0, count);
|
||||||
}
|
}
|
||||||
@@ -402,6 +403,13 @@ public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
LOGGER.log(Level.FINEST, null, ex);
|
LOGGER.log(Level.FINEST, null, ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (fos != null) {
|
||||||
|
try {
|
||||||
|
fos.close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
LOGGER.log(Level.FINEST, null, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -429,6 +437,8 @@ public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
* @throws ArchiveExtractionException thrown if there is an exception decompressing the file
|
* @throws ArchiveExtractionException thrown if there is an exception decompressing the file
|
||||||
*/
|
*/
|
||||||
private void decompressFile(CompressorInputStream inputStream, File outputFile) throws ArchiveExtractionException {
|
private void decompressFile(CompressorInputStream inputStream, File outputFile) throws ArchiveExtractionException {
|
||||||
|
final String msg = String.format("Decompressing '%s'", outputFile.getPath());
|
||||||
|
LOGGER.fine(msg);
|
||||||
FileOutputStream out = null;
|
FileOutputStream out = null;
|
||||||
try {
|
try {
|
||||||
out = new FileOutputStream(outputFile);
|
out = new FileOutputStream(outputFile);
|
||||||
|
|||||||
@@ -120,9 +120,11 @@ public class AssemblyAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
// Try evacuating the error stream
|
// Try evacuating the error stream
|
||||||
rdr = new BufferedReader(new InputStreamReader(proc.getErrorStream(), "UTF-8"));
|
rdr = new BufferedReader(new InputStreamReader(proc.getErrorStream(), "UTF-8"));
|
||||||
String line = null;
|
String line = null;
|
||||||
|
// CHECKSTYLE:OFF
|
||||||
while (rdr.ready() && (line = rdr.readLine()) != null) {
|
while (rdr.ready() && (line = rdr.readLine()) != null) {
|
||||||
LOGGER.log(Level.WARNING, "analyzer.AssemblyAnalyzer.grokassembly.stderr", line);
|
LOGGER.log(Level.WARNING, "analyzer.AssemblyAnalyzer.grokassembly.stderr", line);
|
||||||
}
|
}
|
||||||
|
// CHECKSTYLE:ON
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
doc = builder.parse(proc.getInputStream());
|
doc = builder.parse(proc.getInputStream());
|
||||||
|
|
||||||
@@ -233,9 +235,11 @@ public class AssemblyAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
final Process p = pb.start();
|
final Process p = pb.start();
|
||||||
// Try evacuating the error stream
|
// Try evacuating the error stream
|
||||||
rdr = new BufferedReader(new InputStreamReader(p.getErrorStream(), "UTF-8"));
|
rdr = new BufferedReader(new InputStreamReader(p.getErrorStream(), "UTF-8"));
|
||||||
|
// CHECKSTYLE:OFF
|
||||||
while (rdr.ready() && rdr.readLine() != null) {
|
while (rdr.ready() && rdr.readLine() != null) {
|
||||||
// We expect this to complain
|
// We expect this to complain
|
||||||
}
|
}
|
||||||
|
// CHECKSTYLE:ON
|
||||||
final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(p.getInputStream());
|
final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(p.getInputStream());
|
||||||
final XPath xpath = XPathFactory.newInstance().newXPath();
|
final XPath xpath = XPathFactory.newInstance().newXPath();
|
||||||
final String error = xpath.evaluate("/assembly/error", doc);
|
final String error = xpath.evaluate("/assembly/error", doc);
|
||||||
|
|||||||
@@ -51,8 +51,8 @@ import org.owasp.dependencycheck.utils.DependencyVersion;
|
|||||||
import org.owasp.dependencycheck.utils.DependencyVersionUtil;
|
import org.owasp.dependencycheck.utils.DependencyVersionUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CPEAnalyzer is a utility class that takes a project dependency and attempts to discern if there is an associated CPE.
|
* CPEAnalyzer is a utility class that takes a project dependency and attempts to discern if there is an associated CPE. It uses
|
||||||
* It uses the evidence contained within the dependency to search the Lucene index.
|
* the evidence contained within the dependency to search the Lucene index.
|
||||||
*
|
*
|
||||||
* @author Jeremy Long <jeremy.long@owasp.org>
|
* @author Jeremy Long <jeremy.long@owasp.org>
|
||||||
*/
|
*/
|
||||||
@@ -130,8 +130,8 @@ public class CPEAnalyzer implements Analyzer {
|
|||||||
* Opens the data source.
|
* Opens the data source.
|
||||||
*
|
*
|
||||||
* @throws IOException when the Lucene directory to be queried does not exist or is corrupt.
|
* @throws IOException when the Lucene directory to be queried does not exist or is corrupt.
|
||||||
* @throws DatabaseException when the database throws an exception. This usually occurs when the database is in use
|
* @throws DatabaseException when the database throws an exception. This usually occurs when the database is in use by another
|
||||||
* by another process.
|
* process.
|
||||||
*/
|
*/
|
||||||
public void open() throws IOException, DatabaseException {
|
public void open() throws IOException, DatabaseException {
|
||||||
LOGGER.log(Level.FINE, "Opening the CVE Database");
|
LOGGER.log(Level.FINE, "Opening the CVE Database");
|
||||||
@@ -161,8 +161,8 @@ public class CPEAnalyzer implements Analyzer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Searches the data store of CPE entries, trying to identify the CPE for the given dependency based on the evidence
|
* Searches the data store of CPE entries, trying to identify the CPE for the given dependency based on the evidence contained
|
||||||
* contained within. The dependency passed in is updated with any identified CPE values.
|
* within. The dependency passed in is updated with any identified CPE values.
|
||||||
*
|
*
|
||||||
* @param dependency the dependency to search for CPE entries on.
|
* @param dependency the dependency to search for CPE entries on.
|
||||||
* @throws CorruptIndexException is thrown when the Lucene index is corrupt.
|
* @throws CorruptIndexException is thrown when the Lucene index is corrupt.
|
||||||
@@ -176,24 +176,25 @@ public class CPEAnalyzer implements Analyzer {
|
|||||||
for (Confidence confidence : Confidence.values()) {
|
for (Confidence confidence : Confidence.values()) {
|
||||||
if (dependency.getVendorEvidence().contains(confidence)) {
|
if (dependency.getVendorEvidence().contains(confidence)) {
|
||||||
vendors = addEvidenceWithoutDuplicateTerms(vendors, dependency.getVendorEvidence(), confidence);
|
vendors = addEvidenceWithoutDuplicateTerms(vendors, dependency.getVendorEvidence(), confidence);
|
||||||
|
LOGGER.fine(String.format("vendor search: %s", vendors));
|
||||||
}
|
}
|
||||||
if (dependency.getProductEvidence().contains(confidence)) {
|
if (dependency.getProductEvidence().contains(confidence)) {
|
||||||
products = addEvidenceWithoutDuplicateTerms(products, dependency.getProductEvidence(), confidence);
|
products = addEvidenceWithoutDuplicateTerms(products, dependency.getProductEvidence(), confidence);
|
||||||
|
LOGGER.fine(String.format("product search: %s", products));
|
||||||
}
|
}
|
||||||
/* bug fix for #40 - version evidence is not showing up as "used" in the reports if there is no
|
|
||||||
* CPE identified. As such, we are "using" the evidence and ignoring the results. */
|
|
||||||
// if (dependency.getVersionEvidence().contains(confidence)) {
|
|
||||||
// addEvidenceWithoutDuplicateTerms("", dependency.getVersionEvidence(), confidence);
|
|
||||||
// }
|
|
||||||
if (!vendors.isEmpty() && !products.isEmpty()) {
|
if (!vendors.isEmpty() && !products.isEmpty()) {
|
||||||
final List<IndexEntry> entries = searchCPE(vendors, products, dependency.getProductEvidence().getWeighting(),
|
final List<IndexEntry> entries = searchCPE(vendors, products, dependency.getProductEvidence().getWeighting(),
|
||||||
dependency.getVendorEvidence().getWeighting());
|
dependency.getVendorEvidence().getWeighting());
|
||||||
|
if (entries == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
boolean identifierAdded = false;
|
boolean identifierAdded = false;
|
||||||
for (IndexEntry e : entries) {
|
for (IndexEntry e : entries) {
|
||||||
|
LOGGER.fine(String.format("Verifying entry: %s", e.toString()));
|
||||||
if (verifyEntry(e, dependency)) {
|
if (verifyEntry(e, dependency)) {
|
||||||
final String vendor = e.getVendor();
|
final String vendor = e.getVendor();
|
||||||
final String product = e.getProduct();
|
final String product = e.getProduct();
|
||||||
|
LOGGER.fine(String.format("identified vendor/product: %s/%s", vendor, product));
|
||||||
identifierAdded |= determineIdentifiers(dependency, vendor, product, confidence);
|
identifierAdded |= determineIdentifiers(dependency, vendor, product, confidence);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -205,9 +206,9 @@ public class CPEAnalyzer implements Analyzer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the text created by concatenating the text and the values from the EvidenceCollection (filtered for a
|
* Returns the text created by concatenating the text and the values from the EvidenceCollection (filtered for a specific
|
||||||
* specific confidence). This attempts to prevent duplicate terms from being added.<br/<br/> Note, if the evidence
|
* confidence). This attempts to prevent duplicate terms from being added.<br/<br/> Note, if the evidence is longer then 200
|
||||||
* is longer then 200 characters it will be truncated.
|
* characters it will be truncated.
|
||||||
*
|
*
|
||||||
* @param text the base text.
|
* @param text the base text.
|
||||||
* @param ec an EvidenceCollection
|
* @param ec an EvidenceCollection
|
||||||
@@ -242,49 +243,49 @@ public class CPEAnalyzer implements Analyzer {
|
|||||||
* version.</p>
|
* version.</p>
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* If either the vendorWeightings or productWeightings lists have been populated this data is used to add weighting
|
* If either the vendorWeightings or productWeightings lists have been populated this data is used to add weighting factors to
|
||||||
* factors to the search.</p>
|
* the search.</p>
|
||||||
*
|
*
|
||||||
* @param vendor the text used to search the vendor field
|
* @param vendor the text used to search the vendor field
|
||||||
* @param product the text used to search the product field
|
* @param product the text used to search the product field
|
||||||
* @param vendorWeightings a list of strings to use to add weighting factors to the vendor field
|
* @param vendorWeightings a list of strings to use to add weighting factors to the vendor field
|
||||||
* @param productWeightings Adds a list of strings that will be used to add weighting factors to the product search
|
* @param productWeightings Adds a list of strings that will be used to add weighting factors to the product search
|
||||||
* @return a list of possible CPE values
|
* @return a list of possible CPE values
|
||||||
* @throws CorruptIndexException when the Lucene index is corrupt
|
|
||||||
* @throws IOException when the Lucene index is not found
|
|
||||||
* @throws ParseException when the generated query is not valid
|
|
||||||
*/
|
*/
|
||||||
protected List<IndexEntry> searchCPE(String vendor, String product,
|
protected List<IndexEntry> searchCPE(String vendor, String product,
|
||||||
Set<String> vendorWeightings, Set<String> productWeightings)
|
Set<String> vendorWeightings, Set<String> productWeightings) {
|
||||||
throws CorruptIndexException, IOException, ParseException {
|
|
||||||
final ArrayList<IndexEntry> ret = new ArrayList<IndexEntry>(MAX_QUERY_RESULTS);
|
final List<IndexEntry> ret = new ArrayList<IndexEntry>(MAX_QUERY_RESULTS);
|
||||||
|
|
||||||
final String searchString = buildSearch(vendor, product, vendorWeightings, productWeightings);
|
final String searchString = buildSearch(vendor, product, vendorWeightings, productWeightings);
|
||||||
if (searchString == null) {
|
if (searchString == null) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
final TopDocs docs = cpe.search(searchString, MAX_QUERY_RESULTS);
|
final TopDocs docs = cpe.search(searchString, MAX_QUERY_RESULTS);
|
||||||
for (ScoreDoc d : docs.scoreDocs) {
|
for (ScoreDoc d : docs.scoreDocs) {
|
||||||
if (d.score >= 0.08) {
|
if (d.score >= 0.08) {
|
||||||
final Document doc = cpe.getDocument(d.doc);
|
final Document doc = cpe.getDocument(d.doc);
|
||||||
final IndexEntry entry = new IndexEntry();
|
final IndexEntry entry = new IndexEntry();
|
||||||
entry.setVendor(doc.get(Fields.VENDOR));
|
entry.setVendor(doc.get(Fields.VENDOR));
|
||||||
entry.setProduct(doc.get(Fields.PRODUCT));
|
entry.setProduct(doc.get(Fields.PRODUCT));
|
||||||
// if (d.score < 0.08) {
|
entry.setSearchScore(d.score);
|
||||||
// System.out.print(entry.getVendor());
|
if (!ret.contains(entry)) {
|
||||||
// System.out.print(":");
|
ret.add(entry);
|
||||||
// System.out.print(entry.getProduct());
|
}
|
||||||
// System.out.print(":");
|
|
||||||
// System.out.println(d.score);
|
|
||||||
// }
|
|
||||||
entry.setSearchScore(d.score);
|
|
||||||
if (!ret.contains(entry)) {
|
|
||||||
ret.add(entry);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
|
} catch (ParseException ex) {
|
||||||
|
final String msg = String.format("Unable to parse: %s", searchString);
|
||||||
|
LOGGER.log(Level.WARNING, "An error occured querying the CPE data. See the log for more details.");
|
||||||
|
LOGGER.log(Level.INFO, msg, ex);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
final String msg = String.format("IO Error with search string: %s", searchString);
|
||||||
|
LOGGER.log(Level.WARNING, "An error occured reading CPE data. See the log for more details.");
|
||||||
|
LOGGER.log(Level.INFO, msg, ex);
|
||||||
}
|
}
|
||||||
return ret;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -292,8 +293,8 @@ public class CPEAnalyzer implements Analyzer {
|
|||||||
* Builds a Lucene search string by properly escaping data and constructing a valid search query.</p>
|
* Builds a Lucene search string by properly escaping data and constructing a valid search query.</p>
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* If either the possibleVendor or possibleProducts lists have been populated this data is used to add weighting
|
* If either the possibleVendor or possibleProducts lists have been populated this data is used to add weighting factors to
|
||||||
* factors to the search string generated.</p>
|
* the search string generated.</p>
|
||||||
*
|
*
|
||||||
* @param vendor text to search the vendor field
|
* @param vendor text to search the vendor field
|
||||||
* @param product text to search the product field
|
* @param product text to search the product field
|
||||||
@@ -319,9 +320,8 @@ public class CPEAnalyzer implements Analyzer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method constructs a Lucene query for a given field. The searchText is split into separate words and if the
|
* This method constructs a Lucene query for a given field. The searchText is split into separate words and if the word is
|
||||||
* word is within the list of weighted words then an additional weighting is applied to the term as it is appended
|
* within the list of weighted words then an additional weighting is applied to the term as it is appended into the query.
|
||||||
* into the query.
|
|
||||||
*
|
*
|
||||||
* @param sb a StringBuilder that the query text will be appended to.
|
* @param sb a StringBuilder that the query text will be appended to.
|
||||||
* @param field the field within the Lucene index that the query is searching.
|
* @param field the field within the Lucene index that the query is searching.
|
||||||
@@ -392,8 +392,8 @@ public class CPEAnalyzer implements Analyzer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ensures that the CPE Identified matches the dependency. This validates that the product, vendor, and version
|
* Ensures that the CPE Identified matches the dependency. This validates that the product, vendor, and version information
|
||||||
* information for the CPE are contained within the dependencies evidence.
|
* for the CPE are contained within the dependencies evidence.
|
||||||
*
|
*
|
||||||
* @param entry a CPE entry.
|
* @param entry a CPE entry.
|
||||||
* @param dependency the dependency that the CPE entries could be for.
|
* @param dependency the dependency that the CPE entries could be for.
|
||||||
@@ -482,17 +482,19 @@ public class CPEAnalyzer implements Analyzer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves a list of CPE values from the CveDB based on the vendor and product passed in. The list is then
|
* Retrieves a list of CPE values from the CveDB based on the vendor and product passed in. The list is then validated to find
|
||||||
* validated to find only CPEs that are valid for the given dependency. It is possible that the CPE identified is a
|
* only CPEs that are valid for the given dependency. It is possible that the CPE identified is a best effort "guess" based on
|
||||||
* best effort "guess" based on the vendor, product, and version information.
|
* the vendor, product, and version information.
|
||||||
*
|
*
|
||||||
* @param dependency the Dependency being analyzed
|
* @param dependency the Dependency being analyzed
|
||||||
* @param vendor the vendor for the CPE being analyzed
|
* @param vendor the vendor for the CPE being analyzed
|
||||||
* @param product the product for the CPE being analyzed
|
* @param product the product for the CPE being analyzed
|
||||||
|
* @param currentConfidence the current confidence being used during analysis
|
||||||
* @return <code>true</code> if an identifier was added to the dependency; otherwise <code>false</code>
|
* @return <code>true</code> if an identifier was added to the dependency; otherwise <code>false</code>
|
||||||
* @throws UnsupportedEncodingException is thrown if UTF-8 is not supported
|
* @throws UnsupportedEncodingException is thrown if UTF-8 is not supported
|
||||||
*/
|
*/
|
||||||
private boolean determineIdentifiers(Dependency dependency, String vendor, String product, Confidence currentConfidence) throws UnsupportedEncodingException {
|
protected boolean determineIdentifiers(Dependency dependency, String vendor, String product,
|
||||||
|
Confidence currentConfidence) throws UnsupportedEncodingException {
|
||||||
final Set<VulnerableSoftware> cpes = cve.getCPEs(vendor, product);
|
final Set<VulnerableSoftware> cpes = cve.getCPEs(vendor, product);
|
||||||
DependencyVersion bestGuess = new DependencyVersion("-");
|
DependencyVersion bestGuess = new DependencyVersion("-");
|
||||||
Confidence bestGuessConf = null;
|
Confidence bestGuessConf = null;
|
||||||
@@ -590,8 +592,8 @@ public class CPEAnalyzer implements Analyzer {
|
|||||||
*/
|
*/
|
||||||
BEST_GUESS,
|
BEST_GUESS,
|
||||||
/**
|
/**
|
||||||
* The entire vendor/product group must be added (without a guess at version) because there is a CVE with a VS
|
* The entire vendor/product group must be added (without a guess at version) because there is a CVE with a VS that only
|
||||||
* that only specifies vendor/product.
|
* specifies vendor/product.
|
||||||
*/
|
*/
|
||||||
BROAD_MATCH
|
BROAD_MATCH
|
||||||
}
|
}
|
||||||
@@ -739,8 +741,7 @@ public class CPEAnalyzer implements Analyzer {
|
|||||||
//</editor-fold>
|
//</editor-fold>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Standard implementation of compareTo that compares identifier confidence, evidence confidence, and then the
|
* Standard implementation of compareTo that compares identifier confidence, evidence confidence, and then the identifier.
|
||||||
* identifier.
|
|
||||||
*
|
*
|
||||||
* @param o the IdentifierMatch to compare to
|
* @param o the IdentifierMatch to compare to
|
||||||
* @return the natural ordering of IdentifierMatch
|
* @return the natural ordering of IdentifierMatch
|
||||||
|
|||||||
@@ -0,0 +1,243 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of dependency-check-core.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 Jeremy Long. All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.owasp.dependencycheck.analyzer;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import org.owasp.dependencycheck.Engine;
|
||||||
|
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
|
||||||
|
import org.owasp.dependencycheck.data.central.CentralSearch;
|
||||||
|
import org.owasp.dependencycheck.data.nexus.MavenArtifact;
|
||||||
|
import org.owasp.dependencycheck.dependency.Confidence;
|
||||||
|
import org.owasp.dependencycheck.dependency.Dependency;
|
||||||
|
import org.owasp.dependencycheck.dependency.Evidence;
|
||||||
|
import org.owasp.dependencycheck.jaxb.pom.PomUtils;
|
||||||
|
import org.owasp.dependencycheck.utils.DownloadFailedException;
|
||||||
|
import org.owasp.dependencycheck.utils.Downloader;
|
||||||
|
import org.owasp.dependencycheck.utils.InvalidSettingException;
|
||||||
|
import org.owasp.dependencycheck.utils.Settings;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Analyzer which will attempt to locate a dependency, and the GAV information, by querying Central for the dependency's SHA-1
|
||||||
|
* digest.
|
||||||
|
*
|
||||||
|
* @author colezlaw
|
||||||
|
*/
|
||||||
|
public class CentralAnalyzer extends AbstractFileTypeAnalyzer {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The logger.
|
||||||
|
*/
|
||||||
|
private static final Logger LOGGER = Logger.getLogger(CentralAnalyzer.class.getName());
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the analyzer.
|
||||||
|
*/
|
||||||
|
private static final String ANALYZER_NAME = "Central Analyzer";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The phase in which this analyzer runs.
|
||||||
|
*/
|
||||||
|
private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The types of files on which this will work.
|
||||||
|
*/
|
||||||
|
private static final Set<String> SUPPORTED_EXTENSIONS = newHashSet("jar");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The analyzer should be disabled if there are errors, so this is a flag to determine if such an error has occurred.
|
||||||
|
*/
|
||||||
|
private boolean errorFlag = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The searcher itself.
|
||||||
|
*/
|
||||||
|
private CentralSearch searcher;
|
||||||
|
/**
|
||||||
|
* Utility to read POM files.
|
||||||
|
*/
|
||||||
|
private PomUtils pomUtil = new PomUtils();
|
||||||
|
/**
|
||||||
|
* Field indicating if the analyzer is enabled.
|
||||||
|
*/
|
||||||
|
private final boolean enabled = checkEnabled();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether to enable this analyzer or not.
|
||||||
|
*
|
||||||
|
* @return whether the analyzer should be enabled
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if this analyzer is enabled.
|
||||||
|
*
|
||||||
|
* @return <code>true</code> if the analyzer is enabled; otherwise <code>false</code>
|
||||||
|
*/
|
||||||
|
private boolean checkEnabled() {
|
||||||
|
boolean retval = false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (Settings.getBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED)) {
|
||||||
|
if (!Settings.getBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED)
|
||||||
|
|| NexusAnalyzer.DEFAULT_URL.equals(Settings.getString(Settings.KEYS.ANALYZER_NEXUS_URL))) {
|
||||||
|
LOGGER.fine("Enabling the Central analyzer");
|
||||||
|
retval = true;
|
||||||
|
} else {
|
||||||
|
LOGGER.info("Nexus analyzer is enabled, disabling the Central Analyzer");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
LOGGER.info("Central analyzer disabled");
|
||||||
|
}
|
||||||
|
} catch (InvalidSettingException ise) {
|
||||||
|
LOGGER.warning("Invalid setting. Disabling the Central analyzer");
|
||||||
|
}
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the analyzer once before any analysis is performed.
|
||||||
|
*
|
||||||
|
* @throws Exception if there's an error during initialization
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void initializeFileTypeAnalyzer() throws Exception {
|
||||||
|
LOGGER.fine("Initializing Central analyzer");
|
||||||
|
LOGGER.fine(String.format("Central analyzer enabled: %s", isEnabled()));
|
||||||
|
if (isEnabled()) {
|
||||||
|
final String searchUrl = Settings.getString(Settings.KEYS.ANALYZER_CENTRAL_URL);
|
||||||
|
LOGGER.fine(String.format("Central Analyzer URL: %s", searchUrl));
|
||||||
|
searcher = new CentralSearch(new URL(searchUrl));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the analyzer's name.
|
||||||
|
*
|
||||||
|
* @return the name of the analyzer
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return ANALYZER_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the key used in the properties file to to reference the analyzer's enabled property.
|
||||||
|
*
|
||||||
|
* @return the analyzer's enabled property setting key.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected String getAnalyzerEnabledSettingKey() {
|
||||||
|
return Settings.KEYS.ANALYZER_CENTRAL_ENABLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the analysis phase under which the analyzer runs.
|
||||||
|
*
|
||||||
|
* @return the phase under which the analyzer runs
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public AnalysisPhase getAnalysisPhase() {
|
||||||
|
return ANALYSIS_PHASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the extensions for which this Analyzer runs.
|
||||||
|
*
|
||||||
|
* @return the extensions for which this Analyzer runs
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Set<String> getSupportedExtensions() {
|
||||||
|
return SUPPORTED_EXTENSIONS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs the analysis.
|
||||||
|
*
|
||||||
|
* @param dependency the dependency to analyze
|
||||||
|
* @param engine the engine
|
||||||
|
* @throws AnalysisException when there's an exception during analysis
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void analyzeFileType(Dependency dependency, Engine engine) throws AnalysisException {
|
||||||
|
if (errorFlag || !isEnabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
final List<MavenArtifact> mas = searcher.searchSha1(dependency.getSha1sum());
|
||||||
|
final Confidence confidence = mas.size() > 1 ? Confidence.HIGH : Confidence.HIGHEST;
|
||||||
|
for (MavenArtifact ma : mas) {
|
||||||
|
LOGGER.fine(String.format("Central analyzer found artifact (%s) for dependency (%s)", ma.toString(), dependency.getFileName()));
|
||||||
|
dependency.addAsEvidence("central", ma, confidence);
|
||||||
|
boolean pomAnalyzed = false;
|
||||||
|
for (Evidence e : dependency.getVendorEvidence()) {
|
||||||
|
if ("pom".equals(e.getSource())) {
|
||||||
|
pomAnalyzed = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!pomAnalyzed && ma.getPomUrl() != null) {
|
||||||
|
File pomFile = null;
|
||||||
|
try {
|
||||||
|
final File baseDir = Settings.getTempDirectory();
|
||||||
|
pomFile = File.createTempFile("pom", ".xml", baseDir);
|
||||||
|
if (!pomFile.delete()) {
|
||||||
|
final String msg = String.format("Unable to fetch pom.xml for %s from Central; "
|
||||||
|
+ "this could result in undetected CPE/CVEs.", dependency.getFileName());
|
||||||
|
LOGGER.warning(msg);
|
||||||
|
LOGGER.fine("Unable to delete temp file");
|
||||||
|
}
|
||||||
|
LOGGER.fine(String.format("Downloading %s", ma.getPomUrl()));
|
||||||
|
Downloader.fetchFile(new URL(ma.getPomUrl()), pomFile);
|
||||||
|
pomUtil.analyzePOM(dependency, pomFile);
|
||||||
|
|
||||||
|
} catch (DownloadFailedException ex) {
|
||||||
|
final String msg = String.format("Unable to download pom.xml for %s from Central; "
|
||||||
|
+ "this could result in undetected CPE/CVEs.", dependency.getFileName());
|
||||||
|
LOGGER.warning(msg);
|
||||||
|
} finally {
|
||||||
|
if (pomFile != null && !FileUtils.deleteQuietly(pomFile)) {
|
||||||
|
pomFile.deleteOnExit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} catch (IllegalArgumentException iae) {
|
||||||
|
LOGGER.info(String.format("invalid sha1-hash on %s", dependency.getFileName()));
|
||||||
|
} catch (FileNotFoundException fnfe) {
|
||||||
|
LOGGER.fine(String.format("Artifact not found in repository: '%s", dependency.getFileName()));
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
LOGGER.log(Level.FINE, "Could not connect to Central search", ioe);
|
||||||
|
errorFlag = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -36,9 +36,9 @@ import org.owasp.dependencycheck.utils.LogUtils;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* This analyzer ensures dependencies that should be grouped together, to remove excess noise from the report, are
|
* This analyzer ensures dependencies that should be grouped together, to remove excess noise from the report, are grouped. An
|
||||||
* grouped. An example would be Spring, Spring Beans, Spring MVC, etc. If they are all for the same version and have the
|
* example would be Spring, Spring Beans, Spring MVC, etc. If they are all for the same version and have the same relative path
|
||||||
* same relative path then these should be grouped into a single dependency under the core/main library.</p>
|
* then these should be grouped into a single dependency under the core/main library.</p>
|
||||||
* <p>
|
* <p>
|
||||||
* Note, this grouping only works on dependencies with identified CVE entries</p>
|
* Note, this grouping only works on dependencies with identified CVE entries</p>
|
||||||
*
|
*
|
||||||
@@ -55,7 +55,7 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
|
|||||||
/**
|
/**
|
||||||
* A pattern for obtaining the first part of a filename.
|
* A pattern for obtaining the first part of a filename.
|
||||||
*/
|
*/
|
||||||
private static final Pattern STARTING_TEXT_PATTERN = Pattern.compile("^[a-zA-Z]*");
|
private static final Pattern STARTING_TEXT_PATTERN = Pattern.compile("^[a-zA-Z0-9]*");
|
||||||
/**
|
/**
|
||||||
* a flag indicating if this analyzer has run. This analyzer only runs once.
|
* a flag indicating if this analyzer has run. This analyzer only runs once.
|
||||||
*/
|
*/
|
||||||
@@ -91,8 +91,8 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
|
|||||||
//</editor-fold>
|
//</editor-fold>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Analyzes a set of dependencies. If they have been found to have the same base path and the same set of
|
* Analyzes a set of dependencies. If they have been found to have the same base path and the same set of identifiers they are
|
||||||
* identifiers they are likely related. The related dependencies are bundled into a single reportable item.
|
* likely related. The related dependencies are bundled into a single reportable item.
|
||||||
*
|
*
|
||||||
* @param ignore this analyzer ignores the dependency being analyzed
|
* @param ignore this analyzer ignores the dependency being analyzed
|
||||||
* @param engine the engine that is scanning the dependencies
|
* @param engine the engine that is scanning the dependencies
|
||||||
@@ -107,30 +107,34 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
|
|||||||
//for (Dependency nextDependency : engine.getDependencies()) {
|
//for (Dependency nextDependency : engine.getDependencies()) {
|
||||||
while (mainIterator.hasNext()) {
|
while (mainIterator.hasNext()) {
|
||||||
final Dependency dependency = mainIterator.next();
|
final Dependency dependency = mainIterator.next();
|
||||||
if (mainIterator.hasNext()) {
|
if (mainIterator.hasNext() && !dependenciesToRemove.contains(dependency)) {
|
||||||
final ListIterator<Dependency> subIterator = engine.getDependencies().listIterator(mainIterator.nextIndex());
|
final ListIterator<Dependency> subIterator = engine.getDependencies().listIterator(mainIterator.nextIndex());
|
||||||
while (subIterator.hasNext()) {
|
while (subIterator.hasNext()) {
|
||||||
final Dependency nextDependency = subIterator.next();
|
final Dependency nextDependency = subIterator.next();
|
||||||
if (hashesMatch(dependency, nextDependency)) {
|
if (hashesMatch(dependency, nextDependency)) {
|
||||||
if (isCore(dependency, nextDependency)) {
|
if (firstPathIsShortest(dependency.getFilePath(), nextDependency.getFilePath())) {
|
||||||
mergeDependencies(dependency, nextDependency, dependenciesToRemove);
|
mergeDependencies(dependency, nextDependency, dependenciesToRemove);
|
||||||
} else {
|
} else {
|
||||||
mergeDependencies(nextDependency, dependency, dependenciesToRemove);
|
mergeDependencies(nextDependency, dependency, dependenciesToRemove);
|
||||||
|
break; //since we merged into the next dependency - skip forward to the next in mainIterator
|
||||||
}
|
}
|
||||||
} else if (isShadedJar(dependency, nextDependency)) {
|
} else if (isShadedJar(dependency, nextDependency)) {
|
||||||
if (dependency.getFileName().toLowerCase().endsWith("pom.xml")) {
|
if (dependency.getFileName().toLowerCase().endsWith("pom.xml")) {
|
||||||
dependenciesToRemove.add(dependency);
|
mergeDependencies(nextDependency, dependency, dependenciesToRemove);
|
||||||
|
nextDependency.getRelatedDependencies().remove(dependency);
|
||||||
|
break;
|
||||||
} else {
|
} else {
|
||||||
dependenciesToRemove.add(nextDependency);
|
mergeDependencies(dependency, nextDependency, dependenciesToRemove);
|
||||||
|
nextDependency.getRelatedDependencies().remove(nextDependency);
|
||||||
}
|
}
|
||||||
} else if (cpeIdentifiersMatch(dependency, nextDependency)
|
} else if (cpeIdentifiersMatch(dependency, nextDependency)
|
||||||
&& hasSameBasePath(dependency, nextDependency)
|
&& hasSameBasePath(dependency, nextDependency)
|
||||||
&& fileNameMatch(dependency, nextDependency)) {
|
&& fileNameMatch(dependency, nextDependency)) {
|
||||||
|
|
||||||
if (isCore(dependency, nextDependency)) {
|
if (isCore(dependency, nextDependency)) {
|
||||||
mergeDependencies(dependency, nextDependency, dependenciesToRemove);
|
mergeDependencies(dependency, nextDependency, dependenciesToRemove);
|
||||||
} else {
|
} else {
|
||||||
mergeDependencies(nextDependency, dependency, dependenciesToRemove);
|
mergeDependencies(nextDependency, dependency, dependenciesToRemove);
|
||||||
|
break; //since we merged into the next dependency - skip forward to the next in mainIterator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -138,9 +142,7 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
|
|||||||
}
|
}
|
||||||
//removing dependencies here as ensuring correctness and avoiding ConcurrentUpdateExceptions
|
//removing dependencies here as ensuring correctness and avoiding ConcurrentUpdateExceptions
|
||||||
// was difficult because of the inner iterator.
|
// was difficult because of the inner iterator.
|
||||||
for (Dependency d : dependenciesToRemove) {
|
engine.getDependencies().removeAll(dependenciesToRemove);
|
||||||
engine.getDependencies().remove(d);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,10 +150,10 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
|
|||||||
* Adds the relatedDependency to the dependency's related dependencies.
|
* Adds the relatedDependency to the dependency's related dependencies.
|
||||||
*
|
*
|
||||||
* @param dependency the main dependency
|
* @param dependency the main dependency
|
||||||
* @param relatedDependency a collection of dependencies to be removed from the main analysis loop, this is the
|
* @param relatedDependency a collection of dependencies to be removed from the main analysis loop, this is the source of
|
||||||
* source of dependencies to remove
|
* dependencies to remove
|
||||||
* @param dependenciesToRemove a collection of dependencies that will be removed from the main analysis loop, this
|
* @param dependenciesToRemove a collection of dependencies that will be removed from the main analysis loop, this function
|
||||||
* function adds to this collection
|
* adds to this collection
|
||||||
*/
|
*/
|
||||||
private void mergeDependencies(final Dependency dependency, final Dependency relatedDependency, final Set<Dependency> dependenciesToRemove) {
|
private void mergeDependencies(final Dependency dependency, final Dependency relatedDependency, final Set<Dependency> dependenciesToRemove) {
|
||||||
dependency.addRelatedDependency(relatedDependency);
|
dependency.addRelatedDependency(relatedDependency);
|
||||||
@@ -160,12 +162,14 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
|
|||||||
dependency.addRelatedDependency(i.next());
|
dependency.addRelatedDependency(i.next());
|
||||||
i.remove();
|
i.remove();
|
||||||
}
|
}
|
||||||
|
if (dependency.getSha1sum().equals(relatedDependency.getSha1sum())) {
|
||||||
|
dependency.addAllProjectReferences(relatedDependency.getProjectReferences());
|
||||||
|
}
|
||||||
dependenciesToRemove.add(relatedDependency);
|
dependenciesToRemove.add(relatedDependency);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempts to trim a maven repo to a common base path. This is typically
|
* Attempts to trim a maven repo to a common base path. This is typically [drive]\[repo_location]\repository\[path1]\[path2].
|
||||||
* [drive]\[repo_location]\repository\[path1]\[path2].
|
|
||||||
*
|
*
|
||||||
* @param path the path to trim
|
* @param path the path to trim
|
||||||
* @return a string representing the base path.
|
* @return a string representing the base path.
|
||||||
@@ -201,25 +205,8 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
|
|||||||
|| dependency2 == null || dependency2.getFileName() == null) {
|
|| dependency2 == null || dependency2.getFileName() == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
String fileName1 = dependency1.getFileName();
|
final String fileName1 = dependency1.getActualFile().getName();
|
||||||
String fileName2 = dependency2.getFileName();
|
final String fileName2 = dependency2.getActualFile().getName();
|
||||||
|
|
||||||
//update to deal with archive analyzer, the starting name maybe the same
|
|
||||||
// as this is incorrectly looking at the starting path
|
|
||||||
final File one = new File(fileName1);
|
|
||||||
final File two = new File(fileName2);
|
|
||||||
final String oneParent = one.getParent();
|
|
||||||
final String twoParent = two.getParent();
|
|
||||||
if (oneParent != null) {
|
|
||||||
if (oneParent.equals(twoParent)) {
|
|
||||||
fileName1 = one.getName();
|
|
||||||
fileName2 = two.getName();
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else if (twoParent != null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//version check
|
//version check
|
||||||
final DependencyVersion version1 = DependencyVersionUtil.parseVersion(fileName1);
|
final DependencyVersion version1 = DependencyVersionUtil.parseVersion(fileName1);
|
||||||
@@ -267,9 +254,11 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
|
|||||||
}
|
}
|
||||||
if (cpeCount1 > 0 && cpeCount1 == cpeCount2) {
|
if (cpeCount1 > 0 && cpeCount1 == cpeCount2) {
|
||||||
for (Identifier i : dependency1.getIdentifiers()) {
|
for (Identifier i : dependency1.getIdentifiers()) {
|
||||||
matches |= dependency2.getIdentifiers().contains(i);
|
if ("cpe".equals(i.getType())) {
|
||||||
if (!matches) {
|
matches |= dependency2.getIdentifiers().contains(i);
|
||||||
break;
|
if (!matches) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -318,8 +307,8 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is likely a very broken attempt at determining if the 'left' dependency is the 'core' library in comparison
|
* This is likely a very broken attempt at determining if the 'left' dependency is the 'core' library in comparison to the
|
||||||
* to the 'right' library.
|
* 'right' library.
|
||||||
*
|
*
|
||||||
* @param left the dependency to test
|
* @param left the dependency to test
|
||||||
* @param right the dependency to test against
|
* @param right the dependency to test against
|
||||||
@@ -338,6 +327,10 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
|
|||||||
|| !rightName.contains("core") && leftName.contains("core")
|
|| !rightName.contains("core") && leftName.contains("core")
|
||||||
|| !rightName.contains("kernel") && leftName.contains("kernel")) {
|
|| !rightName.contains("kernel") && leftName.contains("kernel")) {
|
||||||
returnVal = true;
|
returnVal = true;
|
||||||
|
// } else if (leftName.matches(".*struts2\\-core.*") && rightName.matches(".*xwork\\-core.*")) {
|
||||||
|
// returnVal = true;
|
||||||
|
// } else if (rightName.matches(".*struts2\\-core.*") && leftName.matches(".*xwork\\-core.*")) {
|
||||||
|
// returnVal = false;
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* considered splitting the names up and comparing the components,
|
* considered splitting the names up and comparing the components,
|
||||||
@@ -372,13 +365,12 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines if the jar is shaded and the created pom.xml identified the same CPE as the jar - if so, the pom.xml
|
* Determines if the jar is shaded and the created pom.xml identified the same CPE as the jar - if so, the pom.xml dependency
|
||||||
* dependency should be removed.
|
* should be removed.
|
||||||
*
|
*
|
||||||
* @param dependency a dependency to check
|
* @param dependency a dependency to check
|
||||||
* @param nextDependency another dependency to check
|
* @param nextDependency another dependency to check
|
||||||
* @return true if on of the dependencies is a pom.xml and the identifiers between the two collections match;
|
* @return true if on of the dependencies is a pom.xml and the identifiers between the two collections match; otherwise false
|
||||||
* otherwise false
|
|
||||||
*/
|
*/
|
||||||
private boolean isShadedJar(Dependency dependency, Dependency nextDependency) {
|
private boolean isShadedJar(Dependency dependency, Dependency nextDependency) {
|
||||||
final String mainName = dependency.getFileName().toLowerCase();
|
final String mainName = dependency.getFileName().toLowerCase();
|
||||||
@@ -390,4 +382,43 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines which path is shortest; if path lengths are equal then we use compareTo of the string method to determine if the
|
||||||
|
* first path is smaller.
|
||||||
|
*
|
||||||
|
* @param left the first path to compare
|
||||||
|
* @param right the second path to compare
|
||||||
|
* @return <code>true</code> if the leftPath is the shortest; otherwise <code>false</code>
|
||||||
|
*/
|
||||||
|
protected boolean firstPathIsShortest(String left, String right) {
|
||||||
|
final String leftPath = left.replace('\\', '/');
|
||||||
|
final String rightPath = right.replace('\\', '/');
|
||||||
|
|
||||||
|
final int leftCount = countChar(leftPath, '/');
|
||||||
|
final int rightCount = countChar(rightPath, '/');
|
||||||
|
if (leftCount == rightCount) {
|
||||||
|
return leftPath.compareTo(rightPath) <= 0;
|
||||||
|
} else {
|
||||||
|
return leftCount < rightCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Counts the number of times the character is present in the string.
|
||||||
|
*
|
||||||
|
* @param string the string to count the characters in
|
||||||
|
* @param c the character to count
|
||||||
|
* @return the number of times the character is present in the string
|
||||||
|
*/
|
||||||
|
private int countChar(String string, char c) {
|
||||||
|
int count = 0;
|
||||||
|
final int max = string.length();
|
||||||
|
for (int i = 0; i < max; i++) {
|
||||||
|
if (c == string.charAt(i)) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,12 +93,17 @@ public class FalsePositiveAnalyzer extends AbstractAnalyzer {
|
|||||||
addFalseNegativeCPEs(dependency);
|
addFalseNegativeCPEs(dependency);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes inaccurate matches on springframework CPEs.
|
||||||
|
*
|
||||||
|
* @param dependency the dependency to test for and remove known inaccurate CPE matches
|
||||||
|
*/
|
||||||
private void removeBadSpringMatches(Dependency dependency) {
|
private void removeBadSpringMatches(Dependency dependency) {
|
||||||
String mustContain = null;
|
String mustContain = null;
|
||||||
for (Identifier i : dependency.getIdentifiers()) {
|
for (Identifier i : dependency.getIdentifiers()) {
|
||||||
if ("maven".contains(i.getType())) {
|
if ("maven".contains(i.getType())) {
|
||||||
if (i.getValue() != null && i.getValue().startsWith("org.springframework.")) {
|
if (i.getValue() != null && i.getValue().startsWith("org.springframework.")) {
|
||||||
int endPoint = i.getValue().indexOf(":", 19);
|
final int endPoint = i.getValue().indexOf(":", 19);
|
||||||
if (endPoint >= 0) {
|
if (endPoint >= 0) {
|
||||||
mustContain = i.getValue().substring(19, endPoint).toLowerCase();
|
mustContain = i.getValue().substring(19, endPoint).toLowerCase();
|
||||||
break;
|
break;
|
||||||
@@ -107,9 +112,9 @@ public class FalsePositiveAnalyzer extends AbstractAnalyzer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mustContain != null) {
|
if (mustContain != null) {
|
||||||
Iterator<Identifier> itr = dependency.getIdentifiers().iterator();
|
final Iterator<Identifier> itr = dependency.getIdentifiers().iterator();
|
||||||
while (itr.hasNext()) {
|
while (itr.hasNext()) {
|
||||||
Identifier i = itr.next();
|
final Identifier i = itr.next();
|
||||||
if ("cpe".contains(i.getType())
|
if ("cpe".contains(i.getType())
|
||||||
&& i.getValue() != null
|
&& i.getValue() != null
|
||||||
&& i.getValue().startsWith("cpe:/a:springsource:")
|
&& i.getValue().startsWith("cpe:/a:springsource:")
|
||||||
@@ -117,7 +122,6 @@ public class FalsePositiveAnalyzer extends AbstractAnalyzer {
|
|||||||
itr.remove();
|
itr.remove();
|
||||||
//dependency.getIdentifiers().remove(i);
|
//dependency.getIdentifiers().remove(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class FileNameAnalyzer extends AbstractAnalyzer implements Analyzer {
|
|||||||
public void analyze(Dependency dependency, Engine engine) throws AnalysisException {
|
public void analyze(Dependency dependency, Engine engine) throws AnalysisException {
|
||||||
|
|
||||||
//strip any path information that may get added by ArchiveAnalyzer, etc.
|
//strip any path information that may get added by ArchiveAnalyzer, etc.
|
||||||
final File f = new File(dependency.getFileName());
|
final File f = dependency.getActualFile();
|
||||||
String fileName = f.getName();
|
String fileName = f.getName();
|
||||||
|
|
||||||
//remove file extension
|
//remove file extension
|
||||||
|
|||||||
@@ -31,4 +31,9 @@ public interface FileTypeAnalyzer extends Analyzer {
|
|||||||
* @return whether or not the specified file extension is supported by this analyzer.
|
* @return whether or not the specified file extension is supported by this analyzer.
|
||||||
*/
|
*/
|
||||||
boolean supportsExtension(String extension);
|
boolean supportsExtension(String extension);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets the analyzers state.
|
||||||
|
*/
|
||||||
|
void reset();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package org.owasp.dependencycheck.analyzer;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import org.owasp.dependencycheck.Engine;
|
import org.owasp.dependencycheck.Engine;
|
||||||
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
|
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
|
||||||
@@ -64,8 +65,8 @@ public class HintAnalyzer extends AbstractAnalyzer implements Analyzer {
|
|||||||
//</editor-fold>
|
//</editor-fold>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The HintAnalyzer uses knowledge about a dependency to add additional information to help in identification of
|
* The HintAnalyzer uses knowledge about a dependency to add additional information to help in identification of identifiers
|
||||||
* identifiers or vulnerabilities.
|
* or vulnerabilities.
|
||||||
*
|
*
|
||||||
* @param dependency The dependency being analyzed
|
* @param dependency The dependency being analyzed
|
||||||
* @param engine The scanning engine
|
* @param engine The scanning engine
|
||||||
@@ -84,24 +85,39 @@ public class HintAnalyzer extends AbstractAnalyzer implements Analyzer {
|
|||||||
Confidence.HIGH);
|
Confidence.HIGH);
|
||||||
|
|
||||||
final Evidence springTest3 = new Evidence("Manifest",
|
final Evidence springTest3 = new Evidence("Manifest",
|
||||||
|
"Implementation-Title",
|
||||||
|
"spring-core",
|
||||||
|
Confidence.HIGH);
|
||||||
|
|
||||||
|
final Evidence springTest4 = new Evidence("Manifest",
|
||||||
"Bundle-Vendor",
|
"Bundle-Vendor",
|
||||||
"SpringSource",
|
"SpringSource",
|
||||||
Confidence.HIGH);
|
Confidence.HIGH);
|
||||||
|
|
||||||
Set<Evidence> evidence = dependency.getProductEvidence().getEvidence();
|
final Evidence springTest5 = new Evidence("jar",
|
||||||
if (evidence.contains(springTest1) || evidence.contains(springTest2)) {
|
"package name",
|
||||||
dependency.getProductEvidence().addEvidence("hint analyzer", "product", "springsource_spring_framework", Confidence.HIGH);
|
"springframework",
|
||||||
|
Confidence.LOW);
|
||||||
|
|
||||||
|
//springsource/vware problem
|
||||||
|
final Set<Evidence> product = dependency.getProductEvidence().getEvidence();
|
||||||
|
final Set<Evidence> vendor = dependency.getVendorEvidence().getEvidence();
|
||||||
|
|
||||||
|
if (product.contains(springTest1) || product.contains(springTest2) || product.contains(springTest3)
|
||||||
|
|| (dependency.getFileName().contains("spring") && (product.contains(springTest5) || vendor.contains(springTest5)))) {
|
||||||
|
dependency.getProductEvidence().addEvidence("hint analyzer", "product", "springsource spring framework", Confidence.HIGH);
|
||||||
dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "SpringSource", Confidence.HIGH);
|
dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "SpringSource", Confidence.HIGH);
|
||||||
dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "vmware", Confidence.HIGH);
|
dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "vmware", Confidence.HIGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
evidence = dependency.getVendorEvidence().getEvidence();
|
if (vendor.contains(springTest4)) {
|
||||||
if (evidence.contains(springTest3)) {
|
|
||||||
dependency.getProductEvidence().addEvidence("hint analyzer", "product", "springsource_spring_framework", Confidence.HIGH);
|
dependency.getProductEvidence().addEvidence("hint analyzer", "product", "springsource_spring_framework", Confidence.HIGH);
|
||||||
dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "vmware", Confidence.HIGH);
|
dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "vmware", Confidence.HIGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//sun/oracle problem
|
||||||
final Iterator<Evidence> itr = dependency.getVendorEvidence().iterator();
|
final Iterator<Evidence> itr = dependency.getVendorEvidence().iterator();
|
||||||
final ArrayList<Evidence> newEntries = new ArrayList<Evidence>();
|
final List<Evidence> newEntries = new ArrayList<Evidence>();
|
||||||
while (itr.hasNext()) {
|
while (itr.hasNext()) {
|
||||||
final Evidence e = itr.next();
|
final Evidence e = itr.next();
|
||||||
if ("sun".equalsIgnoreCase(e.getValue(false))) {
|
if ("sun".equalsIgnoreCase(e.getValue(false))) {
|
||||||
|
|||||||
@@ -46,13 +46,6 @@ import java.util.logging.Level;
|
|||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import javax.xml.bind.JAXBContext;
|
|
||||||
import javax.xml.bind.JAXBElement;
|
|
||||||
import javax.xml.bind.JAXBException;
|
|
||||||
import javax.xml.bind.Unmarshaller;
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
|
||||||
import javax.xml.parsers.SAXParser;
|
|
||||||
import javax.xml.parsers.SAXParserFactory;
|
|
||||||
import javax.xml.transform.sax.SAXSource;
|
import javax.xml.transform.sax.SAXSource;
|
||||||
import org.jsoup.Jsoup;
|
import org.jsoup.Jsoup;
|
||||||
import org.owasp.dependencycheck.Engine;
|
import org.owasp.dependencycheck.Engine;
|
||||||
@@ -60,7 +53,7 @@ import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
|
|||||||
import org.owasp.dependencycheck.dependency.Confidence;
|
import org.owasp.dependencycheck.dependency.Confidence;
|
||||||
import org.owasp.dependencycheck.dependency.Dependency;
|
import org.owasp.dependencycheck.dependency.Dependency;
|
||||||
import org.owasp.dependencycheck.dependency.EvidenceCollection;
|
import org.owasp.dependencycheck.dependency.EvidenceCollection;
|
||||||
import org.owasp.dependencycheck.jaxb.pom.MavenNamespaceFilter;
|
import org.owasp.dependencycheck.jaxb.pom.PomUtils;
|
||||||
import org.owasp.dependencycheck.jaxb.pom.generated.License;
|
import org.owasp.dependencycheck.jaxb.pom.generated.License;
|
||||||
import org.owasp.dependencycheck.jaxb.pom.generated.Model;
|
import org.owasp.dependencycheck.jaxb.pom.generated.Model;
|
||||||
import org.owasp.dependencycheck.jaxb.pom.generated.Organization;
|
import org.owasp.dependencycheck.jaxb.pom.generated.Organization;
|
||||||
@@ -68,9 +61,6 @@ import org.owasp.dependencycheck.utils.FileUtils;
|
|||||||
import org.owasp.dependencycheck.utils.NonClosingStream;
|
import org.owasp.dependencycheck.utils.NonClosingStream;
|
||||||
import org.owasp.dependencycheck.utils.Settings;
|
import org.owasp.dependencycheck.utils.Settings;
|
||||||
import org.xml.sax.InputSource;
|
import org.xml.sax.InputSource;
|
||||||
import org.xml.sax.SAXException;
|
|
||||||
import org.xml.sax.XMLFilter;
|
|
||||||
import org.xml.sax.XMLReader;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to load a JAR file and collect information that can be used to determine the associated CPE.
|
* Used to load a JAR file and collect information that can be used to determine the associated CPE.
|
||||||
@@ -158,24 +148,18 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
* A pattern to detect HTML within text.
|
* A pattern to detect HTML within text.
|
||||||
*/
|
*/
|
||||||
private static final Pattern HTML_DETECTION_PATTERN = Pattern.compile("\\<[a-z]+.*/?\\>", Pattern.CASE_INSENSITIVE);
|
private static final Pattern HTML_DETECTION_PATTERN = Pattern.compile("\\<[a-z]+.*/?\\>", Pattern.CASE_INSENSITIVE);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The unmarshaller used to parse the pom.xml from a JAR file.
|
* The POM Utility for parsing POM files.
|
||||||
*/
|
*/
|
||||||
private Unmarshaller pomUnmarshaller;
|
private PomUtils pomUtils = null;
|
||||||
//</editor-fold>
|
//</editor-fold>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new JarAnalyzer.
|
* Constructs a new JarAnalyzer.
|
||||||
*/
|
*/
|
||||||
public JarAnalyzer() {
|
public JarAnalyzer() {
|
||||||
try {
|
pomUtils = new PomUtils();
|
||||||
//final JAXBContext jaxbContext = JAXBContext.newInstance("org.owasp.dependencycheck.jaxb.pom.generated");
|
|
||||||
final JAXBContext jaxbContext = JAXBContext.newInstance(Model.class);
|
|
||||||
pomUnmarshaller = jaxbContext.createUnmarshaller();
|
|
||||||
} catch (JAXBException ex) { //guess we will just have a null pointer exception later...
|
|
||||||
LOGGER.log(Level.SEVERE, "Unable to load parser. See the log for more details.");
|
|
||||||
LOGGER.log(Level.FINE, null, ex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//<editor-fold defaultstate="collapsed" desc="All standard implmentation details of Analyzer">
|
//<editor-fold defaultstate="collapsed" desc="All standard implmentation details of Analyzer">
|
||||||
@@ -243,7 +227,7 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
@Override
|
@Override
|
||||||
public void analyzeFileType(Dependency dependency, Engine engine) throws AnalysisException {
|
public void analyzeFileType(Dependency dependency, Engine engine) throws AnalysisException {
|
||||||
try {
|
try {
|
||||||
final ArrayList<ClassNameInformation> classNames = collectClassNames(dependency);
|
final List<ClassNameInformation> classNames = collectClassNames(dependency);
|
||||||
final String fileName = dependency.getFileName().toLowerCase();
|
final String fileName = dependency.getFileName().toLowerCase();
|
||||||
if (classNames.isEmpty()
|
if (classNames.isEmpty()
|
||||||
&& (fileName.endsWith("-sources.jar")
|
&& (fileName.endsWith("-sources.jar")
|
||||||
@@ -262,8 +246,8 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempts to find a pom.xml within the JAR file. If found it extracts information and adds it to the evidence.
|
* Attempts to find a pom.xml within the JAR file. If found it extracts information and adds it to the evidence. This will
|
||||||
* This will attempt to interpolate the strings contained within the pom.properties if one exists.
|
* attempt to interpolate the strings contained within the pom.properties if one exists.
|
||||||
*
|
*
|
||||||
* @param dependency the dependency being analyzed
|
* @param dependency the dependency being analyzed
|
||||||
* @param classes a collection of class name information
|
* @param classes a collection of class name information
|
||||||
@@ -271,7 +255,7 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
* @throws AnalysisException is thrown if there is an exception parsing the pom
|
* @throws AnalysisException is thrown if there is an exception parsing the pom
|
||||||
* @return whether or not evidence was added to the dependency
|
* @return whether or not evidence was added to the dependency
|
||||||
*/
|
*/
|
||||||
protected boolean analyzePOM(Dependency dependency, ArrayList<ClassNameInformation> classes, Engine engine) throws AnalysisException {
|
protected boolean analyzePOM(Dependency dependency, List<ClassNameInformation> classes, Engine engine) throws AnalysisException {
|
||||||
boolean foundSomething = false;
|
boolean foundSomething = false;
|
||||||
final JarFile jar;
|
final JarFile jar;
|
||||||
try {
|
try {
|
||||||
@@ -293,13 +277,23 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
LOGGER.log(Level.FINE, msg, ex);
|
LOGGER.log(Level.FINE, msg, ex);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
File externalPom = null;
|
||||||
if (pomEntries.isEmpty()) {
|
if (pomEntries.isEmpty()) {
|
||||||
return false;
|
String pomPath = dependency.getActualFilePath();
|
||||||
|
pomPath = pomPath.substring(0, pomPath.lastIndexOf('.')) + ".pom";
|
||||||
|
externalPom = new File(pomPath);
|
||||||
|
if (externalPom.isFile()) {
|
||||||
|
pomEntries.add(pomPath);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for (String path : pomEntries) {
|
for (String path : pomEntries) {
|
||||||
Properties pomProperties = null;
|
Properties pomProperties = null;
|
||||||
try {
|
try {
|
||||||
pomProperties = retrievePomProperties(path, jar);
|
if (externalPom == null) {
|
||||||
|
pomProperties = retrievePomProperties(path, jar);
|
||||||
|
}
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
LOGGER.log(Level.FINEST, "ignore this, failed reading a non-existent pom.properties", ex);
|
LOGGER.log(Level.FINEST, "ignore this, failed reading a non-existent pom.properties", ex);
|
||||||
}
|
}
|
||||||
@@ -313,11 +307,11 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
final String displayPath = String.format("%s%s%s",
|
final String displayPath = String.format("%s%s%s",
|
||||||
dependency.getFilePath(),
|
dependency.getFilePath(),
|
||||||
File.separator,
|
File.separator,
|
||||||
path); //.replaceAll("[\\/]", File.separator));
|
path);
|
||||||
final String displayName = String.format("%s%s%s",
|
final String displayName = String.format("%s%s%s",
|
||||||
dependency.getFileName(),
|
dependency.getFileName(),
|
||||||
File.separator,
|
File.separator,
|
||||||
path); //.replaceAll("[\\/]", File.separator));
|
path);
|
||||||
|
|
||||||
newDependency.setFileName(displayName);
|
newDependency.setFileName(displayName);
|
||||||
newDependency.setFilePath(displayPath);
|
newDependency.setFilePath(displayPath);
|
||||||
@@ -325,7 +319,11 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
engine.getDependencies().add(newDependency);
|
engine.getDependencies().add(newDependency);
|
||||||
Collections.sort(engine.getDependencies());
|
Collections.sort(engine.getDependencies());
|
||||||
} else {
|
} else {
|
||||||
pom = retrievePom(path, jar);
|
if (externalPom == null) {
|
||||||
|
pom = retrievePom(path, jar);
|
||||||
|
} else {
|
||||||
|
pom = pomUtils.readPom(externalPom);
|
||||||
|
}
|
||||||
foundSomething |= setPomEvidence(dependency, pom, pomProperties, classes);
|
foundSomething |= setPomEvidence(dependency, pom, pomProperties, classes);
|
||||||
}
|
}
|
||||||
} catch (AnalysisException ex) {
|
} catch (AnalysisException ex) {
|
||||||
@@ -410,7 +408,7 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
fos = new FileOutputStream(file);
|
fos = new FileOutputStream(file);
|
||||||
bos = new BufferedOutputStream(fos, BUFFER_SIZE);
|
bos = new BufferedOutputStream(fos, BUFFER_SIZE);
|
||||||
int count;
|
int count;
|
||||||
final byte data[] = new byte[BUFFER_SIZE];
|
final byte[] data = new byte[BUFFER_SIZE];
|
||||||
while ((count = input.read(data, 0, BUFFER_SIZE)) != -1) {
|
while ((count = input.read(data, 0, BUFFER_SIZE)) != -1) {
|
||||||
bos.write(data, 0, count);
|
bos.write(data, 0, count);
|
||||||
}
|
}
|
||||||
@@ -432,7 +430,7 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
final InputStreamReader reader = new InputStreamReader(fis, "UTF-8");
|
final InputStreamReader reader = new InputStreamReader(fis, "UTF-8");
|
||||||
final InputSource xml = new InputSource(reader);
|
final InputSource xml = new InputSource(reader);
|
||||||
final SAXSource source = new SAXSource(xml);
|
final SAXSource source = new SAXSource(xml);
|
||||||
model = readPom(source);
|
model = pomUtils.readPom(source);
|
||||||
} catch (FileNotFoundException ex) {
|
} catch (FileNotFoundException ex) {
|
||||||
final String msg = String.format("Unable to parse pom '%s' in jar '%s' (File Not Found)", path, jar.getName());
|
final String msg = String.format("Unable to parse pom '%s' in jar '%s' (File Not Found)", path, jar.getName());
|
||||||
LOGGER.log(Level.WARNING, msg);
|
LOGGER.log(Level.WARNING, msg);
|
||||||
@@ -502,7 +500,7 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
final InputStreamReader reader = new InputStreamReader(stream, "UTF-8");
|
final InputStreamReader reader = new InputStreamReader(stream, "UTF-8");
|
||||||
final InputSource xml = new InputSource(reader);
|
final InputSource xml = new InputSource(reader);
|
||||||
final SAXSource source = new SAXSource(xml);
|
final SAXSource source = new SAXSource(xml);
|
||||||
model = readPom(source);
|
model = pomUtils.readPom(source);
|
||||||
} catch (SecurityException ex) {
|
} catch (SecurityException ex) {
|
||||||
final String msg = String.format("Unable to parse pom '%s' in jar '%s'; invalid signature", path, jar.getName());
|
final String msg = String.format("Unable to parse pom '%s' in jar '%s'; invalid signature", path, jar.getName());
|
||||||
LOGGER.log(Level.WARNING, msg);
|
LOGGER.log(Level.WARNING, msg);
|
||||||
@@ -523,49 +521,17 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
return model;
|
return model;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves the specified POM from a jar file and converts it to a Model.
|
|
||||||
*
|
|
||||||
* @param source the SAXSource input stream to read the POM from
|
|
||||||
* @return returns the POM object
|
|
||||||
* @throws AnalysisException is thrown if there is an exception extracting or parsing the POM
|
|
||||||
* {@link org.owasp.dependencycheck.jaxb.pom.generated.Model} object
|
|
||||||
*/
|
|
||||||
private Model readPom(SAXSource source) throws AnalysisException {
|
|
||||||
Model model = null;
|
|
||||||
try {
|
|
||||||
final XMLFilter filter = new MavenNamespaceFilter();
|
|
||||||
final SAXParserFactory spf = SAXParserFactory.newInstance();
|
|
||||||
final SAXParser sp = spf.newSAXParser();
|
|
||||||
final XMLReader xr = sp.getXMLReader();
|
|
||||||
filter.setParent(xr);
|
|
||||||
final JAXBElement<Model> el = pomUnmarshaller.unmarshal(source, Model.class);
|
|
||||||
model = el.getValue();
|
|
||||||
} catch (SecurityException ex) {
|
|
||||||
throw new AnalysisException(ex);
|
|
||||||
} catch (ParserConfigurationException ex) {
|
|
||||||
throw new AnalysisException(ex);
|
|
||||||
} catch (SAXException ex) {
|
|
||||||
throw new AnalysisException(ex);
|
|
||||||
} catch (JAXBException ex) {
|
|
||||||
throw new AnalysisException(ex);
|
|
||||||
} catch (Throwable ex) {
|
|
||||||
throw new AnalysisException(ex);
|
|
||||||
}
|
|
||||||
return model;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets evidence from the pom on the supplied dependency.
|
* Sets evidence from the pom on the supplied dependency.
|
||||||
*
|
*
|
||||||
* @param dependency the dependency to set data on
|
* @param dependency the dependency to set data on
|
||||||
* @param pom the information from the pom
|
* @param pom the information from the pom
|
||||||
* @param pomProperties the pom properties file (null if none exists)
|
* @param pomProperties the pom properties file (null if none exists)
|
||||||
* @param classes a collection of ClassNameInformation - containing data about the fully qualified class names
|
* @param classes a collection of ClassNameInformation - containing data about the fully qualified class names within the JAR
|
||||||
* within the JAR file being analyzed
|
* file being analyzed
|
||||||
* @return true if there was evidence within the pom that we could use; otherwise false
|
* @return true if there was evidence within the pom that we could use; otherwise false
|
||||||
*/
|
*/
|
||||||
private boolean setPomEvidence(Dependency dependency, Model pom, Properties pomProperties, ArrayList<ClassNameInformation> classes) {
|
private boolean setPomEvidence(Dependency dependency, Model pom, Properties pomProperties, List<ClassNameInformation> classes) {
|
||||||
boolean foundSomething = false;
|
boolean foundSomething = false;
|
||||||
boolean addAsIdentifier = true;
|
boolean addAsIdentifier = true;
|
||||||
if (pom == null) {
|
if (pom == null) {
|
||||||
@@ -583,9 +549,6 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
final String originalGroupID = groupid;
|
final String originalGroupID = groupid;
|
||||||
|
|
||||||
if (groupid != null && !groupid.isEmpty()) {
|
if (groupid != null && !groupid.isEmpty()) {
|
||||||
if (groupid.startsWith("org.") || groupid.startsWith("com.")) {
|
|
||||||
groupid = groupid.substring(4);
|
|
||||||
}
|
|
||||||
foundSomething = true;
|
foundSomething = true;
|
||||||
dependency.getVendorEvidence().addEvidence("pom", "groupid", groupid, Confidence.HIGHEST);
|
dependency.getVendorEvidence().addEvidence("pom", "groupid", groupid, Confidence.HIGHEST);
|
||||||
dependency.getProductEvidence().addEvidence("pom", "groupid", groupid, Confidence.LOW);
|
dependency.getProductEvidence().addEvidence("pom", "groupid", groupid, Confidence.LOW);
|
||||||
@@ -689,17 +652,17 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Analyzes the path information of the classes contained within the JarAnalyzer to try and determine possible
|
* Analyzes the path information of the classes contained within the JarAnalyzer to try and determine possible vendor or
|
||||||
* vendor or product names. If any are found they are stored in the packageVendor and packageProduct hashSets.
|
* product names. If any are found they are stored in the packageVendor and packageProduct hashSets.
|
||||||
*
|
*
|
||||||
* @param classNames a list of class names
|
* @param classNames a list of class names
|
||||||
* @param dependency a dependency to analyze
|
* @param dependency a dependency to analyze
|
||||||
* @param addPackagesAsEvidence a flag indicating whether or not package names should be added as evidence.
|
* @param addPackagesAsEvidence a flag indicating whether or not package names should be added as evidence.
|
||||||
*/
|
*/
|
||||||
protected void analyzePackageNames(ArrayList<ClassNameInformation> classNames,
|
protected void analyzePackageNames(List<ClassNameInformation> classNames,
|
||||||
Dependency dependency, boolean addPackagesAsEvidence) {
|
Dependency dependency, boolean addPackagesAsEvidence) {
|
||||||
final HashMap<String, Integer> vendorIdentifiers = new HashMap<String, Integer>();
|
final Map<String, Integer> vendorIdentifiers = new HashMap<String, Integer>();
|
||||||
final HashMap<String, Integer> productIdentifiers = new HashMap<String, Integer>();
|
final Map<String, Integer> productIdentifiers = new HashMap<String, Integer>();
|
||||||
analyzeFullyQualifiedClassNames(classNames, vendorIdentifiers, productIdentifiers);
|
analyzeFullyQualifiedClassNames(classNames, vendorIdentifiers, productIdentifiers);
|
||||||
|
|
||||||
final int classCount = classNames.size();
|
final int classCount = classNames.size();
|
||||||
@@ -741,7 +704,7 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
* @return whether evidence was identified parsing the manifest
|
* @return whether evidence was identified parsing the manifest
|
||||||
* @throws IOException if there is an issue reading the JAR file
|
* @throws IOException if there is an issue reading the JAR file
|
||||||
*/
|
*/
|
||||||
protected boolean parseManifest(Dependency dependency, ArrayList<ClassNameInformation> classInformation) throws IOException {
|
protected boolean parseManifest(Dependency dependency, List<ClassNameInformation> classInformation) throws IOException {
|
||||||
boolean foundSomething = false;
|
boolean foundSomething = false;
|
||||||
JarFile jar = null;
|
JarFile jar = null;
|
||||||
try {
|
try {
|
||||||
@@ -898,18 +861,17 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a description to the given dependency. If the description contains one of the following strings beyond 100
|
* Adds a description to the given dependency. If the description contains one of the following strings beyond 100 characters,
|
||||||
* characters, then the description used will be trimmed to that position:
|
* then the description used will be trimmed to that position:
|
||||||
* <ul><li>"such as"</li><li>"like "</li><li>"will use "</li><li>"* uses "</li></ul>
|
* <ul><li>"such as"</li><li>"like "</li><li>"will use "</li><li>"* uses "</li></ul>
|
||||||
*
|
*
|
||||||
* @param dependency a dependency
|
* @param dependency a dependency
|
||||||
* @param description the description
|
* @param description the description
|
||||||
* @param source the source of the evidence
|
* @param source the source of the evidence
|
||||||
* @param key the "name" of the evidence
|
* @param key the "name" of the evidence
|
||||||
* @return if the description is trimmed, the trimmed version is returned; otherwise the original description is
|
* @return if the description is trimmed, the trimmed version is returned; otherwise the original description is returned
|
||||||
* returned
|
|
||||||
*/
|
*/
|
||||||
private String addDescription(Dependency dependency, String description, String source, String key) {
|
public static String addDescription(Dependency dependency, String description, String source, String key) {
|
||||||
if (dependency.getDescription() == null) {
|
if (dependency.getDescription() == null) {
|
||||||
dependency.setDescription(description);
|
dependency.setDescription(description);
|
||||||
}
|
}
|
||||||
@@ -1014,12 +976,11 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* A utility function that will interpolate strings based on values given in the properties file. It will also
|
* A utility function that will interpolate strings based on values given in the properties file. It will also interpolate the
|
||||||
* interpolate the strings contained within the properties file so that properties can reference other
|
* strings contained within the properties file so that properties can reference other properties.</p>
|
||||||
* properties.</p>
|
|
||||||
* <p>
|
* <p>
|
||||||
* <b>Note:</b> if there is no property found the reference will be removed. In other words, if the interpolated
|
* <b>Note:</b> if there is no property found the reference will be removed. In other words, if the interpolated string will
|
||||||
* string will be replaced with an empty string.
|
* be replaced with an empty string.
|
||||||
* </p>
|
* </p>
|
||||||
* <p>
|
* <p>
|
||||||
* Example:</p>
|
* Example:</p>
|
||||||
@@ -1039,13 +1000,13 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
* @param properties a collection of properties that may be referenced within the text.
|
* @param properties a collection of properties that may be referenced within the text.
|
||||||
* @return the interpolated text.
|
* @return the interpolated text.
|
||||||
*/
|
*/
|
||||||
protected String interpolateString(String text, Properties properties) {
|
public static String interpolateString(String text, Properties properties) {
|
||||||
Properties props = properties;
|
final Properties props = properties;
|
||||||
if (text == null) {
|
if (text == null) {
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
if (props == null) {
|
if (props == null) {
|
||||||
props = new Properties();
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
final int pos = text.indexOf("${");
|
final int pos = text.indexOf("${");
|
||||||
@@ -1083,14 +1044,14 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cycles through an enumeration of JarEntries, contained within the dependency, and returns a list of the class
|
* Cycles through an enumeration of JarEntries, contained within the dependency, and returns a list of the class names. This
|
||||||
* names. This does not include core Java package names (i.e. java.* or javax.*).
|
* does not include core Java package names (i.e. java.* or javax.*).
|
||||||
*
|
*
|
||||||
* @param dependency the dependency being analyzed
|
* @param dependency the dependency being analyzed
|
||||||
* @return an list of fully qualified class names
|
* @return an list of fully qualified class names
|
||||||
*/
|
*/
|
||||||
private ArrayList<ClassNameInformation> collectClassNames(Dependency dependency) {
|
private List<ClassNameInformation> collectClassNames(Dependency dependency) {
|
||||||
final ArrayList<ClassNameInformation> classNames = new ArrayList<ClassNameInformation>();
|
final List<ClassNameInformation> classNames = new ArrayList<ClassNameInformation>();
|
||||||
JarFile jar = null;
|
JarFile jar = null;
|
||||||
try {
|
try {
|
||||||
jar = new JarFile(dependency.getActualFilePath());
|
jar = new JarFile(dependency.getActualFilePath());
|
||||||
@@ -1121,17 +1082,17 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cycles through the list of class names and places the package levels 0-3 into the provided maps for vendor and
|
* Cycles through the list of class names and places the package levels 0-3 into the provided maps for vendor and product.
|
||||||
* product. This is helpful when analyzing vendor/product as many times this is included in the package name.
|
* This is helpful when analyzing vendor/product as many times this is included in the package name.
|
||||||
*
|
*
|
||||||
* @param classNames a list of class names
|
* @param classNames a list of class names
|
||||||
* @param vendor HashMap of possible vendor names from package names (e.g. owasp)
|
* @param vendor HashMap of possible vendor names from package names (e.g. owasp)
|
||||||
* @param product HashMap of possible product names from package names (e.g. dependencycheck)
|
* @param product HashMap of possible product names from package names (e.g. dependencycheck)
|
||||||
*/
|
*/
|
||||||
private void analyzeFullyQualifiedClassNames(ArrayList<ClassNameInformation> classNames,
|
private void analyzeFullyQualifiedClassNames(List<ClassNameInformation> classNames,
|
||||||
HashMap<String, Integer> vendor, HashMap<String, Integer> product) {
|
Map<String, Integer> vendor, Map<String, Integer> product) {
|
||||||
for (ClassNameInformation entry : classNames) {
|
for (ClassNameInformation entry : classNames) {
|
||||||
final ArrayList<String> list = entry.getPackageStructure();
|
final List<String> list = entry.getPackageStructure();
|
||||||
addEntry(vendor, list.get(0));
|
addEntry(vendor, list.get(0));
|
||||||
|
|
||||||
if (list.size() == 2) {
|
if (list.size() == 2) {
|
||||||
@@ -1153,13 +1114,13 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds an entry to the specified collection and sets the Integer (e.g. the count) to 1. If the entry already exists
|
* Adds an entry to the specified collection and sets the Integer (e.g. the count) to 1. If the entry already exists in the
|
||||||
* in the collection then the Integer is incremented by 1.
|
* collection then the Integer is incremented by 1.
|
||||||
*
|
*
|
||||||
* @param collection a collection of strings and their occurrence count
|
* @param collection a collection of strings and their occurrence count
|
||||||
* @param key the key to add to the collection
|
* @param key the key to add to the collection
|
||||||
*/
|
*/
|
||||||
private void addEntry(HashMap<String, Integer> collection, String key) {
|
private void addEntry(Map<String, Integer> collection, String key) {
|
||||||
if (collection.containsKey(key)) {
|
if (collection.containsKey(key)) {
|
||||||
collection.put(key, collection.get(key) + 1);
|
collection.put(key, collection.get(key) + 1);
|
||||||
} else {
|
} else {
|
||||||
@@ -1168,15 +1129,15 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cycles through the collection of class name information to see if parts of the package names are contained in the
|
* Cycles through the collection of class name information to see if parts of the package names are contained in the provided
|
||||||
* provided value. If found, it will be added as the HIGHEST confidence evidence because we have more then one
|
* value. If found, it will be added as the HIGHEST confidence evidence because we have more then one source corroborating the
|
||||||
* source corroborating the value.
|
* value.
|
||||||
*
|
*
|
||||||
* @param classes a collection of class name information
|
* @param classes a collection of class name information
|
||||||
* @param value the value to check to see if it contains a package name
|
* @param value the value to check to see if it contains a package name
|
||||||
* @param evidence the evidence collection to add new entries too
|
* @param evidence the evidence collection to add new entries too
|
||||||
*/
|
*/
|
||||||
private void addMatchingValues(ArrayList<ClassNameInformation> classes, String value, EvidenceCollection evidence) {
|
private void addMatchingValues(List<ClassNameInformation> classes, String value, EvidenceCollection evidence) {
|
||||||
if (value == null || value.isEmpty() || classes == null || classes.isEmpty()) {
|
if (value == null || value.isEmpty() || classes == null || classes.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1211,7 +1172,7 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
* @param pomProperties the properties, used for string interpolation
|
* @param pomProperties the properties, used for string interpolation
|
||||||
* @param dependency the dependency to add license information too
|
* @param dependency the dependency to add license information too
|
||||||
*/
|
*/
|
||||||
private void extractLicense(Model pom, Properties pomProperties, Dependency dependency) {
|
public static void extractLicense(Model pom, Properties pomProperties, Dependency dependency) {
|
||||||
//license
|
//license
|
||||||
if (pom.getLicenses() != null) {
|
if (pom.getLicenses() != null) {
|
||||||
String license = null;
|
String license = null;
|
||||||
@@ -1252,9 +1213,9 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* Stores information about a given class name. This class will keep the fully qualified class name and a list
|
* Stores information about a given class name. This class will keep the fully qualified class name and a list of the
|
||||||
* of the important parts of the package structure. Up to the first four levels of the package structure are
|
* important parts of the package structure. Up to the first four levels of the package structure are stored, excluding a
|
||||||
* stored, excluding a leading "org" or "com". Example:</p>
|
* leading "org" or "com". Example:</p>
|
||||||
* <code>ClassNameInformation obj = new ClassNameInformation("org.owasp.dependencycheck.analyzer.JarAnalyzer");
|
* <code>ClassNameInformation obj = new ClassNameInformation("org.owasp.dependencycheck.analyzer.JarAnalyzer");
|
||||||
* System.out.println(obj.getName());
|
* System.out.println(obj.getName());
|
||||||
* for (String p : obj.getPackageStructure())
|
* for (String p : obj.getPackageStructure())
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.owasp.dependencycheck.analyzer;
|
package org.owasp.dependencycheck.analyzer;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
@@ -24,13 +25,18 @@ import java.net.URL;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.owasp.dependencycheck.Engine;
|
import org.owasp.dependencycheck.Engine;
|
||||||
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
|
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
|
||||||
import org.owasp.dependencycheck.data.nexus.MavenArtifact;
|
import org.owasp.dependencycheck.data.nexus.MavenArtifact;
|
||||||
import org.owasp.dependencycheck.data.nexus.NexusSearch;
|
import org.owasp.dependencycheck.data.nexus.NexusSearch;
|
||||||
import org.owasp.dependencycheck.dependency.Confidence;
|
import org.owasp.dependencycheck.dependency.Confidence;
|
||||||
import org.owasp.dependencycheck.dependency.Dependency;
|
import org.owasp.dependencycheck.dependency.Dependency;
|
||||||
import org.owasp.dependencycheck.dependency.Identifier;
|
import org.owasp.dependencycheck.dependency.Evidence;
|
||||||
|
import org.owasp.dependencycheck.jaxb.pom.PomUtils;
|
||||||
|
import org.owasp.dependencycheck.utils.InvalidSettingException;
|
||||||
|
import org.owasp.dependencycheck.utils.DownloadFailedException;
|
||||||
|
import org.owasp.dependencycheck.utils.Downloader;
|
||||||
import org.owasp.dependencycheck.utils.Settings;
|
import org.owasp.dependencycheck.utils.Settings;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -49,6 +55,11 @@ import org.owasp.dependencycheck.utils.Settings;
|
|||||||
*/
|
*/
|
||||||
public class NexusAnalyzer extends AbstractFileTypeAnalyzer {
|
public class NexusAnalyzer extends AbstractFileTypeAnalyzer {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default URL - this will be used by the CentralAnalyzer to determine whether to enable this.
|
||||||
|
*/
|
||||||
|
public static final String DEFAULT_URL = "https://repository.sonatype.org/service/local/";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The logger.
|
* The logger.
|
||||||
*/
|
*/
|
||||||
@@ -74,6 +85,51 @@ public class NexusAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
*/
|
*/
|
||||||
private NexusSearch searcher;
|
private NexusSearch searcher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field indicating if the analyzer is enabled.
|
||||||
|
*/
|
||||||
|
private final boolean enabled = checkEnabled();
|
||||||
|
/**
|
||||||
|
* Field for doing POM work
|
||||||
|
*/
|
||||||
|
private final PomUtils pomUtil = new PomUtils();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if this analyzer is enabled
|
||||||
|
*
|
||||||
|
* @return <code>true</code> if the analyzer is enabled; otherwise <code>false</code>
|
||||||
|
*/
|
||||||
|
private boolean checkEnabled() {
|
||||||
|
/* Enable this analyzer ONLY if the Nexus URL has been set to something
|
||||||
|
other than the default one (if it's the default one, we'll use the
|
||||||
|
central one) and it's enabled by the user.
|
||||||
|
*/
|
||||||
|
boolean retval = false;
|
||||||
|
try {
|
||||||
|
if ((!DEFAULT_URL.equals(Settings.getString(Settings.KEYS.ANALYZER_NEXUS_URL)))
|
||||||
|
&& Settings.getBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED)) {
|
||||||
|
LOGGER.info("Enabling Nexus analyzer");
|
||||||
|
retval = true;
|
||||||
|
} else {
|
||||||
|
LOGGER.fine("Nexus analyzer disabled, using Central instead");
|
||||||
|
}
|
||||||
|
} catch (InvalidSettingException ise) {
|
||||||
|
LOGGER.warning("Invalid setting. Disabling Nexus analyzer");
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether to enable this analyzer or not.
|
||||||
|
*
|
||||||
|
* @return whether the analyzer should be enabled
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes the analyzer once before any analysis is performed.
|
* Initializes the analyzer once before any analysis is performed.
|
||||||
*
|
*
|
||||||
@@ -150,29 +206,42 @@ public class NexusAnalyzer extends AbstractFileTypeAnalyzer {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void analyzeFileType(Dependency dependency, Engine engine) throws AnalysisException {
|
public void analyzeFileType(Dependency dependency, Engine engine) throws AnalysisException {
|
||||||
|
if (!isEnabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
final MavenArtifact ma = searcher.searchSha1(dependency.getSha1sum());
|
final MavenArtifact ma = searcher.searchSha1(dependency.getSha1sum());
|
||||||
if (ma.getGroupId() != null && !"".equals(ma.getGroupId())) {
|
dependency.addAsEvidence("nexus", ma, Confidence.HIGH);
|
||||||
dependency.getVendorEvidence().addEvidence("nexus", "groupid", ma.getGroupId(), Confidence.HIGH);
|
boolean pomAnalyzed = false;
|
||||||
}
|
LOGGER.fine("POM URL " + ma.getPomUrl());
|
||||||
if (ma.getArtifactId() != null && !"".equals(ma.getArtifactId())) {
|
for (Evidence e : dependency.getVendorEvidence()) {
|
||||||
dependency.getProductEvidence().addEvidence("nexus", "artifactid", ma.getArtifactId(), Confidence.HIGH);
|
if ("pom".equals(e.getSource())) {
|
||||||
}
|
pomAnalyzed = true;
|
||||||
if (ma.getVersion() != null && !"".equals(ma.getVersion())) {
|
break;
|
||||||
dependency.getVersionEvidence().addEvidence("nexus", "version", ma.getVersion(), Confidence.HIGH);
|
|
||||||
}
|
|
||||||
if (ma.getArtifactUrl() != null && !"".equals(ma.getArtifactUrl())) {
|
|
||||||
boolean found = false;
|
|
||||||
for (Identifier i : dependency.getIdentifiers()) {
|
|
||||||
if ("maven".equals(i.getType()) && i.getValue().equals(ma.toString())) {
|
|
||||||
found = true;
|
|
||||||
i.setConfidence(Confidence.HIGHEST);
|
|
||||||
i.setUrl(ma.getArtifactUrl());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (!found) {
|
}
|
||||||
dependency.addIdentifier("maven", ma.toString(), ma.getArtifactUrl(), Confidence.HIGHEST);
|
if (!pomAnalyzed && ma.getPomUrl() != null) {
|
||||||
|
File pomFile = null;
|
||||||
|
try {
|
||||||
|
final File baseDir = Settings.getTempDirectory();
|
||||||
|
pomFile = File.createTempFile("pom", ".xml", baseDir);
|
||||||
|
if (!pomFile.delete()) {
|
||||||
|
final String msg = String.format("Unable to fetch pom.xml for %s from Nexus repository; "
|
||||||
|
+ "this could result in undetected CPE/CVEs.", dependency.getFileName());
|
||||||
|
LOGGER.warning(msg);
|
||||||
|
LOGGER.fine("Unable to delete temp file");
|
||||||
|
}
|
||||||
|
LOGGER.fine(String.format("Downloading %s", ma.getPomUrl()));
|
||||||
|
Downloader.fetchFile(new URL(ma.getPomUrl()), pomFile);
|
||||||
|
pomUtil.analyzePOM(dependency, pomFile);
|
||||||
|
} catch (DownloadFailedException ex) {
|
||||||
|
final String msg = String.format("Unable to download pom.xml for %s from Nexus repository; "
|
||||||
|
+ "this could result in undetected CPE/CVEs.", dependency.getFileName());
|
||||||
|
LOGGER.warning(msg);
|
||||||
|
} finally {
|
||||||
|
if (pomFile != null && !FileUtils.deleteQuietly(pomFile)) {
|
||||||
|
pomFile.deleteOnExit();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (IllegalArgumentException iae) {
|
} catch (IllegalArgumentException iae) {
|
||||||
|
|||||||
@@ -0,0 +1,161 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of dependency-check-core.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 Jeremy Long. All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.owasp.dependencycheck.data.central;
|
||||||
|
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
import javax.xml.xpath.XPath;
|
||||||
|
import javax.xml.xpath.XPathConstants;
|
||||||
|
import javax.xml.xpath.XPathFactory;
|
||||||
|
import org.owasp.dependencycheck.data.nexus.MavenArtifact;
|
||||||
|
import org.owasp.dependencycheck.utils.Settings;
|
||||||
|
import org.owasp.dependencycheck.utils.URLConnectionFactory;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.NodeList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class of methods to search Maven Central via Central.
|
||||||
|
*
|
||||||
|
* @author colezlaw
|
||||||
|
*/
|
||||||
|
public class CentralSearch {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The URL for the Central service
|
||||||
|
*/
|
||||||
|
private final URL rootURL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether to use the Proxy when making requests
|
||||||
|
*/
|
||||||
|
private boolean useProxy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used for logging.
|
||||||
|
*/
|
||||||
|
private static final Logger LOGGER = Logger.getLogger(CentralSearch.class.getName());
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a NexusSearch for the given repository URL.
|
||||||
|
*
|
||||||
|
* @param rootURL the URL of the repository on which searches should execute. Only parameters are added to this (so it should
|
||||||
|
* end in /select)
|
||||||
|
*/
|
||||||
|
public CentralSearch(URL rootURL) {
|
||||||
|
this.rootURL = rootURL;
|
||||||
|
if (null != Settings.getString(Settings.KEYS.PROXY_SERVER)) {
|
||||||
|
useProxy = true;
|
||||||
|
LOGGER.fine("Using proxy");
|
||||||
|
} else {
|
||||||
|
useProxy = false;
|
||||||
|
LOGGER.fine("Not using proxy");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Searches the configured Central URL for the given sha1 hash. If the artifact is found, a <code>MavenArtifact</code> is
|
||||||
|
* populated with the GAV.
|
||||||
|
*
|
||||||
|
* @param sha1 the SHA-1 hash string for which to search
|
||||||
|
* @return the populated Maven GAV.
|
||||||
|
* @throws IOException if it's unable to connect to the specified repository or if the specified artifact is not found.
|
||||||
|
*/
|
||||||
|
public List<MavenArtifact> searchSha1(String sha1) throws IOException {
|
||||||
|
if (null == sha1 || !sha1.matches("^[0-9A-Fa-f]{40}$")) {
|
||||||
|
throw new IllegalArgumentException("Invalid SHA1 format");
|
||||||
|
}
|
||||||
|
|
||||||
|
final URL url = new URL(rootURL + String.format("?q=1:\"%s\"&wt=xml", sha1));
|
||||||
|
|
||||||
|
LOGGER.fine(String.format("Searching Central url %s", url.toString()));
|
||||||
|
|
||||||
|
// Determine if we need to use a proxy. The rules:
|
||||||
|
// 1) If the proxy is set, AND the setting is set to true, use the proxy
|
||||||
|
// 2) Otherwise, don't use the proxy (either the proxy isn't configured,
|
||||||
|
// or proxy is specifically set to false)
|
||||||
|
final HttpURLConnection conn = URLConnectionFactory.createHttpURLConnection(url, useProxy);
|
||||||
|
|
||||||
|
conn.setDoOutput(true);
|
||||||
|
|
||||||
|
// JSON would be more elegant, but there's not currently a dependency
|
||||||
|
// on JSON, so don't want to add one just for this
|
||||||
|
conn.addRequestProperty("Accept", "application/xml");
|
||||||
|
conn.connect();
|
||||||
|
|
||||||
|
if (conn.getResponseCode() == 200) {
|
||||||
|
boolean missing = false;
|
||||||
|
try {
|
||||||
|
final DocumentBuilder builder = DocumentBuilderFactory
|
||||||
|
.newInstance().newDocumentBuilder();
|
||||||
|
final Document doc = builder.parse(conn.getInputStream());
|
||||||
|
final XPath xpath = XPathFactory.newInstance().newXPath();
|
||||||
|
final String numFound = xpath.evaluate("/response/result/@numFound", doc);
|
||||||
|
if ("0".equals(numFound)) {
|
||||||
|
missing = true;
|
||||||
|
} else {
|
||||||
|
final ArrayList<MavenArtifact> result = new ArrayList<MavenArtifact>();
|
||||||
|
final NodeList docs = (NodeList) xpath.evaluate("/response/result/doc", doc, XPathConstants.NODESET);
|
||||||
|
for (int i = 0; i < docs.getLength(); i++) {
|
||||||
|
final String g = xpath.evaluate("./str[@name='g']", docs.item(i));
|
||||||
|
LOGGER.finest(String.format("GroupId: %s", g));
|
||||||
|
final String a = xpath.evaluate("./str[@name='a']", docs.item(i));
|
||||||
|
LOGGER.finest(String.format("ArtifactId: %s", a));
|
||||||
|
final String v = xpath.evaluate("./str[@name='v']", docs.item(i));
|
||||||
|
final NodeList atts = (NodeList) xpath.evaluate("./arr[@name='ec']/str", docs.item(i), XPathConstants.NODESET);
|
||||||
|
boolean pomAvailable = false;
|
||||||
|
boolean jarAvailable = false;
|
||||||
|
for (int x = 0; x < atts.getLength(); x++) {
|
||||||
|
final String tmp = xpath.evaluate(".", atts.item(x));
|
||||||
|
if (".pom".equals(tmp)) {
|
||||||
|
pomAvailable = true;
|
||||||
|
} else if (".jar".equals(tmp)) {
|
||||||
|
jarAvailable = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LOGGER.finest(String.format("Version: %s", v));
|
||||||
|
result.add(new MavenArtifact(g, a, v, jarAvailable, pomAvailable));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
} catch (Throwable e) {
|
||||||
|
// Anything else is jacked up XML stuff that we really can't recover
|
||||||
|
// from well
|
||||||
|
throw new IOException(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (missing) {
|
||||||
|
throw new FileNotFoundException("Artifact not found in Central");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
final String msg = String.format("Could not connect to Central received response code: %d %s",
|
||||||
|
conn.getResponseCode(), conn.getResponseMessage());
|
||||||
|
LOGGER.fine(msg);
|
||||||
|
throw new IOException(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* <html>
|
||||||
|
* <head>
|
||||||
|
* <title>org.owasp.dependencycheck.data.central</title>
|
||||||
|
* </head>
|
||||||
|
* <body>
|
||||||
|
* <p>
|
||||||
|
* Contains classes related to searching Maven Central.</p>
|
||||||
|
* <p>
|
||||||
|
* These are used to abstract Maven Central searching away from OWASP Dependency Check so they can be reused elsewhere.</p>
|
||||||
|
* </body>
|
||||||
|
* </html>
|
||||||
|
*/
|
||||||
|
package org.owasp.dependencycheck.data.central;
|
||||||
@@ -48,12 +48,13 @@ import org.owasp.dependencycheck.data.nvdcve.DatabaseException;
|
|||||||
import org.owasp.dependencycheck.utils.Pair;
|
import org.owasp.dependencycheck.utils.Pair;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An in memory lucene index that contains the vendor/product combinations from the CPE (application) identifiers within
|
* An in memory lucene index that contains the vendor/product combinations from the CPE (application) identifiers within the NVD
|
||||||
* the NVD CVE data.
|
* CVE data.
|
||||||
*
|
*
|
||||||
* @author Jeremy Long <jeremy.long@owasp.org>
|
* @author Jeremy Long <jeremy.long@owasp.org>
|
||||||
*/
|
*/
|
||||||
public final class CpeMemoryIndex {
|
public final class CpeMemoryIndex {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The logger.
|
* The logger.
|
||||||
*/
|
*/
|
||||||
@@ -61,7 +62,7 @@ public final class CpeMemoryIndex {
|
|||||||
/**
|
/**
|
||||||
* singleton instance.
|
* singleton instance.
|
||||||
*/
|
*/
|
||||||
private static CpeMemoryIndex instance = new CpeMemoryIndex();
|
private static final CpeMemoryIndex INSTANCE = new CpeMemoryIndex();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* private constructor for singleton.
|
* private constructor for singleton.
|
||||||
@@ -75,7 +76,7 @@ public final class CpeMemoryIndex {
|
|||||||
* @return the instance of the CpeMemoryIndex
|
* @return the instance of the CpeMemoryIndex
|
||||||
*/
|
*/
|
||||||
public static CpeMemoryIndex getInstance() {
|
public static CpeMemoryIndex getInstance() {
|
||||||
return instance;
|
return INSTANCE;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* The in memory Lucene index.
|
* The in memory Lucene index.
|
||||||
@@ -113,18 +114,20 @@ public final class CpeMemoryIndex {
|
|||||||
* @throws IndexException thrown if there is an error creating the index
|
* @throws IndexException thrown if there is an error creating the index
|
||||||
*/
|
*/
|
||||||
public void open(CveDB cve) throws IndexException {
|
public void open(CveDB cve) throws IndexException {
|
||||||
if (!openState) {
|
synchronized (INSTANCE) {
|
||||||
index = new RAMDirectory();
|
if (!openState) {
|
||||||
buildIndex(cve);
|
index = new RAMDirectory();
|
||||||
try {
|
buildIndex(cve);
|
||||||
indexReader = DirectoryReader.open(index);
|
try {
|
||||||
} catch (IOException ex) {
|
indexReader = DirectoryReader.open(index);
|
||||||
throw new IndexException(ex);
|
} catch (IOException ex) {
|
||||||
|
throw new IndexException(ex);
|
||||||
|
}
|
||||||
|
indexSearcher = new IndexSearcher(indexReader);
|
||||||
|
searchingAnalyzer = createSearchingAnalyzer();
|
||||||
|
queryParser = new QueryParser(LuceneUtils.CURRENT_VERSION, Fields.DOCUMENT_KEY, searchingAnalyzer);
|
||||||
|
openState = true;
|
||||||
}
|
}
|
||||||
indexSearcher = new IndexSearcher(indexReader);
|
|
||||||
searchingAnalyzer = createSearchingAnalyzer();
|
|
||||||
queryParser = new QueryParser(LuceneUtils.CURRENT_VERSION, Fields.DOCUMENT_KEY, searchingAnalyzer);
|
|
||||||
openState = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@@ -160,7 +163,7 @@ public final class CpeMemoryIndex {
|
|||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private Analyzer createSearchingAnalyzer() {
|
private Analyzer createSearchingAnalyzer() {
|
||||||
final Map fieldAnalyzers = new HashMap();
|
final Map<String, Analyzer> fieldAnalyzers = new HashMap<String, Analyzer>();
|
||||||
fieldAnalyzers.put(Fields.DOCUMENT_KEY, new KeywordAnalyzer());
|
fieldAnalyzers.put(Fields.DOCUMENT_KEY, new KeywordAnalyzer());
|
||||||
productSearchFieldAnalyzer = new SearchFieldAnalyzer(LuceneUtils.CURRENT_VERSION);
|
productSearchFieldAnalyzer = new SearchFieldAnalyzer(LuceneUtils.CURRENT_VERSION);
|
||||||
vendorSearchFieldAnalyzer = new SearchFieldAnalyzer(LuceneUtils.CURRENT_VERSION);
|
vendorSearchFieldAnalyzer = new SearchFieldAnalyzer(LuceneUtils.CURRENT_VERSION);
|
||||||
|
|||||||
@@ -29,10 +29,12 @@ import java.util.logging.Logger;
|
|||||||
* @author Jeremy Long <jeremy.long@owasp.org>
|
* @author Jeremy Long <jeremy.long@owasp.org>
|
||||||
*/
|
*/
|
||||||
public final class CweDB {
|
public final class CweDB {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Logger.
|
* The Logger.
|
||||||
*/
|
*/
|
||||||
private static final Logger LOGGER = Logger.getLogger(CweDB.class.getName());
|
private static final Logger LOGGER = Logger.getLogger(CweDB.class.getName());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Empty private constructor as this is a utility class.
|
* Empty private constructor as this is a utility class.
|
||||||
*/
|
*/
|
||||||
@@ -55,7 +57,9 @@ public final class CweDB {
|
|||||||
final String filePath = "data/cwe.hashmap.serialized";
|
final String filePath = "data/cwe.hashmap.serialized";
|
||||||
final InputStream input = CweDB.class.getClassLoader().getResourceAsStream(filePath);
|
final InputStream input = CweDB.class.getClassLoader().getResourceAsStream(filePath);
|
||||||
oin = new ObjectInputStream(input);
|
oin = new ObjectInputStream(input);
|
||||||
return (HashMap<String, String>) oin.readObject();
|
@SuppressWarnings("unchecked")
|
||||||
|
final HashMap<String, String> ret = (HashMap<String, String>) oin.readObject();
|
||||||
|
return ret;
|
||||||
} catch (ClassNotFoundException ex) {
|
} catch (ClassNotFoundException ex) {
|
||||||
LOGGER.log(Level.WARNING, "Unable to load CWE data. This should not be an issue.");
|
LOGGER.log(Level.WARNING, "Unable to load CWE data. This should not be an issue.");
|
||||||
LOGGER.log(Level.FINE, null, ex);
|
LOGGER.log(Level.FINE, null, ex);
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ public abstract class AbstractTokenizingFilter extends TokenFilter {
|
|||||||
* @return whether or not a new term was added
|
* @return whether or not a new term was added
|
||||||
*/
|
*/
|
||||||
protected boolean addTerm() {
|
protected boolean addTerm() {
|
||||||
final boolean termAdded = tokens.size() > 0;
|
final boolean termAdded = !tokens.isEmpty();
|
||||||
if (termAdded) {
|
if (termAdded) {
|
||||||
final String term = tokens.pop();
|
final String term = tokens.pop();
|
||||||
clearAttributes();
|
clearAttributes();
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ import org.apache.lucene.util.Version;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* A Lucene Analyzer that utilizes the WhitespaceTokenizer, WordDelimiterFilter, LowerCaseFilter, and StopFilter. The
|
* A Lucene Analyzer that utilizes the WhitespaceTokenizer, WordDelimiterFilter, LowerCaseFilter, and StopFilter. The intended
|
||||||
* intended purpose of this Analyzer is to index the CPE fields vendor and product.</p>
|
* purpose of this Analyzer is to index the CPE fields vendor and product.</p>
|
||||||
*
|
*
|
||||||
* @author Jeremy Long <jeremy.long@owasp.org>
|
* @author Jeremy Long <jeremy.long@owasp.org>
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.owasp.dependencycheck.data.lucene;
|
package org.owasp.dependencycheck.data.lucene;
|
||||||
|
|
||||||
|
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||||
import org.apache.lucene.util.Version;
|
import org.apache.lucene.util.Version;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -28,10 +29,10 @@ import org.apache.lucene.util.Version;
|
|||||||
public final class LuceneUtils {
|
public final class LuceneUtils {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The current version of Lucene being used. Declaring this one place so an upgrade doesn't require hunting through
|
* The current version of Lucene being used. Declaring this one place so an upgrade doesn't require hunting through the code
|
||||||
* the code base.
|
* base.
|
||||||
*/
|
*/
|
||||||
public static final Version CURRENT_VERSION = Version.LUCENE_45;
|
public static final Version CURRENT_VERSION = Version.LUCENE_47;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private constructor as this is a utility class.
|
* Private constructor as this is a utility class.
|
||||||
@@ -46,7 +47,7 @@ public final class LuceneUtils {
|
|||||||
* @param text the data to be escaped
|
* @param text the data to be escaped
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("fallthrough")
|
@SuppressWarnings("fallthrough")
|
||||||
@edu.umd.cs.findbugs.annotations.SuppressWarnings(
|
@SuppressFBWarnings(
|
||||||
value = "SF_SWITCH_NO_DEFAULT",
|
value = "SF_SWITCH_NO_DEFAULT",
|
||||||
justification = "The switch below does have a default.")
|
justification = "The switch below does have a default.")
|
||||||
public static void appendEscapedLuceneQuery(StringBuilder buf,
|
public static void appendEscapedLuceneQuery(StringBuilder buf,
|
||||||
|
|||||||
@@ -39,8 +39,7 @@ public class SearchFieldAnalyzer extends Analyzer {
|
|||||||
*/
|
*/
|
||||||
private final Version version;
|
private final Version version;
|
||||||
/**
|
/**
|
||||||
* A local reference to the TokenPairConcatenatingFilter so that we can clear any left over state if this analyzer
|
* A local reference to the TokenPairConcatenatingFilter so that we can clear any left over state if this analyzer is re-used.
|
||||||
* is re-used.
|
|
||||||
*/
|
*/
|
||||||
private TokenPairConcatenatingFilter concatenatingFilter;
|
private TokenPairConcatenatingFilter concatenatingFilter;
|
||||||
|
|
||||||
@@ -85,8 +84,7 @@ public class SearchFieldAnalyzer extends Analyzer {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* Resets the analyzer and clears any internal state data that may have been left-over from previous uses of the
|
* Resets the analyzer and clears any internal state data that may have been left-over from previous uses of the analyzer.</p>
|
||||||
* analyzer.</p>
|
|
||||||
* <p>
|
* <p>
|
||||||
* <b>If this analyzer is re-used this method must be called between uses.</b></p>
|
* <b>If this analyzer is re-used this method must be called between uses.</b></p>
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,72 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of dependency-check-core.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2012 Jeremy Long. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
package org.owasp.dependencycheck.data.lucene;
|
|
||||||
|
|
||||||
import java.io.Reader;
|
|
||||||
import org.apache.lucene.analysis.Analyzer;
|
|
||||||
import org.apache.lucene.analysis.TokenStream;
|
|
||||||
import org.apache.lucene.analysis.Tokenizer;
|
|
||||||
import org.apache.lucene.analysis.core.LowerCaseFilter;
|
|
||||||
import org.apache.lucene.analysis.core.WhitespaceTokenizer;
|
|
||||||
import org.apache.lucene.util.Version;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SearchVersionAnalyzer is a Lucene Analyzer used to analyze version information.
|
|
||||||
*
|
|
||||||
* @author Jeremy Long <jeremy.long@owasp.org>
|
|
||||||
* @deprecated version information is no longer stored in lucene
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public class SearchVersionAnalyzer extends Analyzer {
|
|
||||||
//TODO consider implementing payloads/custom attributes...
|
|
||||||
// use custom attributes for major, minor, x, x, x, rcx
|
|
||||||
// these can then be used to weight the score for searches on the version.
|
|
||||||
// see http://lucene.apache.org/core/3_6_1/api/core/org/apache/lucene/analysis/package-summary.html#package_description
|
|
||||||
// look at this article to implement
|
|
||||||
// http://www.codewrecks.com/blog/index.php/2012/08/25/index-your-blog-using-tags-and-lucene-net/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Lucene Version used.
|
|
||||||
*/
|
|
||||||
private final Version version;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new SearchVersionAnalyzer.
|
|
||||||
*
|
|
||||||
* @param version the Lucene version
|
|
||||||
*/
|
|
||||||
public SearchVersionAnalyzer(Version version) {
|
|
||||||
this.version = version;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates the TokenStreamComponents
|
|
||||||
*
|
|
||||||
* @param fieldName the field name being analyzed
|
|
||||||
* @param reader the reader containing the input
|
|
||||||
* @return the TokenStreamComponents
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
|
|
||||||
final Tokenizer source = new WhitespaceTokenizer(version, reader);
|
|
||||||
TokenStream stream = source;
|
|
||||||
stream = new LowerCaseFilter(version, stream);
|
|
||||||
stream = new VersionTokenizingFilter(stream);
|
|
||||||
return new TokenStreamComponents(source, stream);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -92,7 +92,7 @@ public final class TokenPairConcatenatingFilter extends TokenFilter {
|
|||||||
|
|
||||||
//if we have a previousTerm - write it out as its own token concatenated
|
//if we have a previousTerm - write it out as its own token concatenated
|
||||||
// with the current word (if one is available).
|
// with the current word (if one is available).
|
||||||
if (previousWord != null && words.size() > 0) {
|
if (previousWord != null && !words.isEmpty()) {
|
||||||
final String word = words.getFirst();
|
final String word = words.getFirst();
|
||||||
clearAttributes();
|
clearAttributes();
|
||||||
termAtt.append(previousWord).append(word);
|
termAtt.append(previousWord).append(word);
|
||||||
@@ -100,7 +100,7 @@ public final class TokenPairConcatenatingFilter extends TokenFilter {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//if we have words, write it out as a single token
|
//if we have words, write it out as a single token
|
||||||
if (words.size() > 0) {
|
if (!words.isEmpty()) {
|
||||||
final String word = words.removeFirst();
|
final String word = words.removeFirst();
|
||||||
clearAttributes();
|
clearAttributes();
|
||||||
termAtt.append(word);
|
termAtt.append(word);
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ public final class UrlTokenizingFilter extends AbstractTokenizingFilter {
|
|||||||
public boolean incrementToken() throws IOException {
|
public boolean incrementToken() throws IOException {
|
||||||
final LinkedList<String> tokens = getTokens();
|
final LinkedList<String> tokens = getTokens();
|
||||||
final CharTermAttribute termAtt = getTermAtt();
|
final CharTermAttribute termAtt = getTermAtt();
|
||||||
if (tokens.size() == 0 && input.incrementToken()) {
|
if (tokens.isEmpty() && input.incrementToken()) {
|
||||||
final String text = new String(termAtt.buffer(), 0, termAtt.length());
|
final String text = new String(termAtt.buffer(), 0, termAtt.length());
|
||||||
if (UrlStringUtils.containsUrl(text)) {
|
if (UrlStringUtils.containsUrl(text)) {
|
||||||
final String[] parts = text.split("\\s");
|
final String[] parts = text.split("\\s");
|
||||||
|
|||||||
@@ -1,71 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of dependency-check-core.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2012 Jeremy Long. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
package org.owasp.dependencycheck.data.lucene;
|
|
||||||
|
|
||||||
import java.io.Reader;
|
|
||||||
import org.apache.lucene.analysis.Analyzer;
|
|
||||||
import org.apache.lucene.analysis.TokenStream;
|
|
||||||
import org.apache.lucene.analysis.Tokenizer;
|
|
||||||
import org.apache.lucene.analysis.core.LowerCaseFilter;
|
|
||||||
import org.apache.lucene.analysis.core.WhitespaceTokenizer;
|
|
||||||
import org.apache.lucene.util.Version;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* VersionAnalyzer is a Lucene Analyzer used to analyze version information.
|
|
||||||
*
|
|
||||||
* @author Jeremy Long <jeremy.long@owasp.org>
|
|
||||||
* @deprecated version information is no longer stored in lucene
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public class VersionAnalyzer extends Analyzer {
|
|
||||||
//TODO consider implementing payloads/custom attributes...
|
|
||||||
// use custom attributes for major, minor, x, x, x, rcx
|
|
||||||
// these can then be used to weight the score for searches on the version.
|
|
||||||
// see http://lucene.apache.org/core/3_6_1/api/core/org/apache/lucene/analysis/package-summary.html#package_description
|
|
||||||
// look at this article to implement
|
|
||||||
// http://www.codewrecks.com/blog/index.php/2012/08/25/index-your-blog-using-tags-and-lucene-net/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Lucene Version used.
|
|
||||||
*/
|
|
||||||
private final Version version;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new VersionAnalyzer.
|
|
||||||
*
|
|
||||||
* @param version the Lucene version
|
|
||||||
*/
|
|
||||||
public VersionAnalyzer(Version version) {
|
|
||||||
this.version = version;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates the TokenStreamComponents
|
|
||||||
*
|
|
||||||
* @param fieldName the field name being analyzed
|
|
||||||
* @param reader the reader containing the input
|
|
||||||
* @return the TokenStreamComponents
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
|
|
||||||
final Tokenizer source = new WhitespaceTokenizer(version, reader);
|
|
||||||
TokenStream stream = source;
|
|
||||||
stream = new LowerCaseFilter(version, stream);
|
|
||||||
return new TokenStreamComponents(source, stream);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,98 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of dependency-check-core.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2012 Jeremy Long. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
package org.owasp.dependencycheck.data.lucene;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import org.apache.lucene.analysis.TokenStream;
|
|
||||||
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* Takes a TokenStream and splits or adds tokens to correctly index version numbers.</p>
|
|
||||||
* <p>
|
|
||||||
* <b>Example:</b> "3.0.0.RELEASE" -> "3 3.0 3.0.0 RELEASE 3.0.0.RELEASE".</p>
|
|
||||||
*
|
|
||||||
* @author Jeremy Long <jeremy.long@owasp.org>
|
|
||||||
* @deprecated version information is no longer stored in lucene
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public final class VersionTokenizingFilter extends AbstractTokenizingFilter {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new VersionTokenizingFilter.
|
|
||||||
*
|
|
||||||
* @param stream the TokenStream that this filter will process
|
|
||||||
*/
|
|
||||||
public VersionTokenizingFilter(TokenStream stream) {
|
|
||||||
super(stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Increments the underlying TokenStream and sets CharTermAttributes to construct an expanded set of tokens by
|
|
||||||
* concatenating tokens with the previous token.
|
|
||||||
*
|
|
||||||
* @return whether or not we have hit the end of the TokenStream
|
|
||||||
* @throws IOException is thrown when an IOException occurs
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean incrementToken() throws IOException {
|
|
||||||
final LinkedList<String> tokens = getTokens();
|
|
||||||
final CharTermAttribute termAtt = getTermAtt();
|
|
||||||
if (tokens.size() == 0 && input.incrementToken()) {
|
|
||||||
final String version = new String(termAtt.buffer(), 0, termAtt.length());
|
|
||||||
final String[] toAnalyze = version.split("[_-]");
|
|
||||||
//ensure we analyze the whole string as one too
|
|
||||||
analyzeVersion(version);
|
|
||||||
for (String str : toAnalyze) {
|
|
||||||
analyzeVersion(str);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return addTerm();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* Analyzes the version and adds several copies of the version as different tokens. For example, the version 1.2.7
|
|
||||||
* would create the tokens 1 1.2 1.2.7. This is useful in discovering the correct version - sometimes a maintenance
|
|
||||||
* or build number will throw off the version identification.</p>
|
|
||||||
*
|
|
||||||
* <p>
|
|
||||||
* expected format:&nbps;major.minor[.maintenance[.build]]</p>
|
|
||||||
*
|
|
||||||
* @param version the version to analyze
|
|
||||||
*/
|
|
||||||
private void analyzeVersion(String version) {
|
|
||||||
//todo should we also be splitting on dash or underscore? we would need
|
|
||||||
// to incorporate the dash or underscore back in...
|
|
||||||
final LinkedList<String> tokens = getTokens();
|
|
||||||
final String[] versionParts = version.split("\\.");
|
|
||||||
String dottedVersion = null;
|
|
||||||
for (String current : versionParts) {
|
|
||||||
if (!current.matches("^/d+$")) {
|
|
||||||
tokens.add(current);
|
|
||||||
}
|
|
||||||
if (dottedVersion == null) {
|
|
||||||
dottedVersion = current;
|
|
||||||
} else {
|
|
||||||
dottedVersion = dottedVersion + "." + current;
|
|
||||||
}
|
|
||||||
tokens.add(dottedVersion);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -24,6 +24,11 @@ package org.owasp.dependencycheck.data.nexus;
|
|||||||
*/
|
*/
|
||||||
public class MavenArtifact {
|
public class MavenArtifact {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base URL for download artifacts from Central.
|
||||||
|
*/
|
||||||
|
private static final String CENTRAL_CONTENT_URL = "http://search.maven.org/remotecontent?filepath=";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The groupId
|
* The groupId
|
||||||
*/
|
*/
|
||||||
@@ -43,6 +48,10 @@ public class MavenArtifact {
|
|||||||
* The artifact url. This may change depending on which Nexus server the search took place.
|
* The artifact url. This may change depending on which Nexus server the search took place.
|
||||||
*/
|
*/
|
||||||
private String artifactUrl;
|
private String artifactUrl;
|
||||||
|
/**
|
||||||
|
* The url to download the POM from.
|
||||||
|
*/
|
||||||
|
private String pomUrl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an empty MavenArtifact.
|
* Creates an empty MavenArtifact.
|
||||||
@@ -58,9 +67,34 @@ public class MavenArtifact {
|
|||||||
* @param version the version
|
* @param version the version
|
||||||
*/
|
*/
|
||||||
public MavenArtifact(String groupId, String artifactId, String version) {
|
public MavenArtifact(String groupId, String artifactId, String version) {
|
||||||
setGroupId(groupId);
|
this.groupId = groupId;
|
||||||
setArtifactId(artifactId);
|
this.artifactId = artifactId;
|
||||||
setVersion(version);
|
this.version = version;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a MavenArtifact with the given attributes.
|
||||||
|
*
|
||||||
|
* @param groupId the groupId
|
||||||
|
* @param artifactId the artifactId
|
||||||
|
* @param version the version
|
||||||
|
* @param jarAvailable if the jar file is available from central
|
||||||
|
* @param pomAvailable if the pom file is available from central
|
||||||
|
*/
|
||||||
|
public MavenArtifact(String groupId, String artifactId, String version, boolean jarAvailable, boolean pomAvailable) {
|
||||||
|
this.groupId = groupId;
|
||||||
|
this.artifactId = artifactId;
|
||||||
|
this.version = version;
|
||||||
|
if (jarAvailable) {
|
||||||
|
//org/springframework/spring-core/3.2.0.RELEASE/spring-core-3.2.0.RELEASE.pom
|
||||||
|
this.artifactUrl = this.CENTRAL_CONTENT_URL + groupId.replace('.', '/') + "/" + artifactId.replace('.', '/') + "/"
|
||||||
|
+ version + "/" + artifactId + "-" + version + ".jar";
|
||||||
|
}
|
||||||
|
if (pomAvailable) {
|
||||||
|
//org/springframework/spring-core/3.2.0.RELEASE/spring-core-3.2.0.RELEASE.pom
|
||||||
|
this.pomUrl = this.CENTRAL_CONTENT_URL + groupId.replace('.', '/') + "/" + artifactId.replace('.', '/') + "/"
|
||||||
|
+ version + "/" + artifactId + "-" + version + ".pom";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -72,10 +106,10 @@ public class MavenArtifact {
|
|||||||
* @param url the artifactLink url
|
* @param url the artifactLink url
|
||||||
*/
|
*/
|
||||||
public MavenArtifact(String groupId, String artifactId, String version, String url) {
|
public MavenArtifact(String groupId, String artifactId, String version, String url) {
|
||||||
setGroupId(groupId);
|
this.groupId = groupId;
|
||||||
setArtifactId(artifactId);
|
this.artifactId = artifactId;
|
||||||
setVersion(version);
|
this.version = version;
|
||||||
setArtifactUrl(url);
|
this.artifactUrl = url;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -159,6 +193,25 @@ public class MavenArtifact {
|
|||||||
public String getArtifactUrl() {
|
public String getArtifactUrl() {
|
||||||
return artifactUrl;
|
return artifactUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the value of pomUrl.
|
||||||
|
*
|
||||||
|
* @return the value of pomUrl
|
||||||
|
*/
|
||||||
|
public String getPomUrl() {
|
||||||
|
return pomUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the value of pomUrl.
|
||||||
|
*
|
||||||
|
* @param pomUrl new value of pomUrl
|
||||||
|
*/
|
||||||
|
public void setPomUrl(String pomUrl) {
|
||||||
|
this.pomUrl = pomUrl;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// vim: cc=120:sw=4:ts=4:sts=4
|
// vim: cc=120:sw=4:ts=4:sts=4
|
||||||
|
|||||||
@@ -58,8 +58,8 @@ public class NexusSearch {
|
|||||||
/**
|
/**
|
||||||
* Creates a NexusSearch for the given repository URL.
|
* Creates a NexusSearch for the given repository URL.
|
||||||
*
|
*
|
||||||
* @param rootURL the root URL of the repository on which searches should execute. full URL's are calculated
|
* @param rootURL the root URL of the repository on which searches should execute. full URL's are calculated relative to this
|
||||||
* relative to this URL, so it should end with a /
|
* URL, so it should end with a /
|
||||||
*/
|
*/
|
||||||
public NexusSearch(URL rootURL) {
|
public NexusSearch(URL rootURL) {
|
||||||
this.rootURL = rootURL;
|
this.rootURL = rootURL;
|
||||||
@@ -78,13 +78,12 @@ public class NexusSearch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Searches the configured Nexus repository for the given sha1 hash. If the artifact is found, a
|
* Searches the configured Nexus repository for the given sha1 hash. If the artifact is found, a <code>MavenArtifact</code> is
|
||||||
* <code>MavenArtifact</code> is populated with the coordinate information.
|
* populated with the coordinate information.
|
||||||
*
|
*
|
||||||
* @param sha1 The SHA-1 hash string for which to search
|
* @param sha1 The SHA-1 hash string for which to search
|
||||||
* @return the populated Maven coordinates
|
* @return the populated Maven coordinates
|
||||||
* @throws IOException if it's unable to connect to the specified repository or if the specified artifact is not
|
* @throws IOException if it's unable to connect to the specified repository or if the specified artifact is not found.
|
||||||
* found.
|
|
||||||
*/
|
*/
|
||||||
public MavenArtifact searchSha1(String sha1) throws IOException {
|
public MavenArtifact searchSha1(String sha1) throws IOException {
|
||||||
if (null == sha1 || !sha1.matches("^[0-9A-Fa-f]{40}$")) {
|
if (null == sha1 || !sha1.matches("^[0-9A-Fa-f]{40}$")) {
|
||||||
@@ -131,7 +130,18 @@ public class NexusSearch {
|
|||||||
.evaluate(
|
.evaluate(
|
||||||
"/org.sonatype.nexus.rest.model.NexusArtifact/artifactLink",
|
"/org.sonatype.nexus.rest.model.NexusArtifact/artifactLink",
|
||||||
doc);
|
doc);
|
||||||
return new MavenArtifact(groupId, artifactId, version, link);
|
final String pomLink = xpath
|
||||||
|
.evaluate(
|
||||||
|
"/org.sonatype.nexus.rest.model.NexusArtifact/pomLink",
|
||||||
|
doc);
|
||||||
|
final MavenArtifact ma = new MavenArtifact(groupId, artifactId, version);
|
||||||
|
if (link != null && !"".equals(link)) {
|
||||||
|
ma.setArtifactUrl(link);
|
||||||
|
}
|
||||||
|
if (pomLink != null && !"".equals(pomLink)) {
|
||||||
|
ma.setPomUrl(pomLink);
|
||||||
|
}
|
||||||
|
return ma;
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
// Anything else is jacked-up XML stuff that we really can't recover
|
// Anything else is jacked-up XML stuff that we really can't recover
|
||||||
// from well
|
// from well
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.owasp.dependencycheck.data.nvdcve;
|
package org.owasp.dependencycheck.data.nvdcve;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
@@ -24,8 +25,10 @@ import java.sql.ResultSet;
|
|||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -39,6 +42,7 @@ import org.owasp.dependencycheck.utils.DBUtils;
|
|||||||
import org.owasp.dependencycheck.utils.DependencyVersion;
|
import org.owasp.dependencycheck.utils.DependencyVersion;
|
||||||
import org.owasp.dependencycheck.utils.DependencyVersionUtil;
|
import org.owasp.dependencycheck.utils.DependencyVersionUtil;
|
||||||
import org.owasp.dependencycheck.utils.Pair;
|
import org.owasp.dependencycheck.utils.Pair;
|
||||||
|
import org.owasp.dependencycheck.utils.Settings;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The database holding information about the NVD CVE data.
|
* The database holding information about the NVD CVE data.
|
||||||
@@ -57,8 +61,8 @@ public class CveDB {
|
|||||||
private Connection conn;
|
private Connection conn;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new CveDB object and opens the database connection. Note, the connection must be closed by the caller
|
* Creates a new CveDB object and opens the database connection. Note, the connection must be closed by the caller by calling
|
||||||
* by calling the close method.
|
* the close method.
|
||||||
*
|
*
|
||||||
* @throws DatabaseException thrown if there is an exception opening the database.
|
* @throws DatabaseException thrown if there is an exception opening the database.
|
||||||
*/
|
*/
|
||||||
@@ -87,7 +91,9 @@ public class CveDB {
|
|||||||
* @throws DatabaseException thrown if there is an error opening the database connection
|
* @throws DatabaseException thrown if there is an error opening the database connection
|
||||||
*/
|
*/
|
||||||
public final void open() throws DatabaseException {
|
public final void open() throws DatabaseException {
|
||||||
conn = ConnectionFactory.getConnection();
|
if (!isOpen()) {
|
||||||
|
conn = ConnectionFactory.getConnection();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -170,8 +176,8 @@ public class CveDB {
|
|||||||
*/
|
*/
|
||||||
private static final String DELETE_VULNERABILITY = "DELETE FROM vulnerability WHERE id = ?";
|
private static final String DELETE_VULNERABILITY = "DELETE FROM vulnerability WHERE id = ?";
|
||||||
/**
|
/**
|
||||||
* SQL Statement to cleanup orphan entries. Yes, the db schema could be a little tighter, but what we have works
|
* SQL Statement to cleanup orphan entries. Yes, the db schema could be a little tighter, but what we have works well to keep
|
||||||
* well to keep the data file size down a bit.
|
* the data file size down a bit.
|
||||||
*/
|
*/
|
||||||
private static final String CLEANUP_ORPHANS = "DELETE FROM CpeEntry WHERE id not in (SELECT CPEEntryId FROM Software); ";
|
private static final String CLEANUP_ORPHANS = "DELETE FROM CpeEntry WHERE id not in (SELECT CPEEntryId FROM Software); ";
|
||||||
/**
|
/**
|
||||||
@@ -208,7 +214,8 @@ public class CveDB {
|
|||||||
private static final String SELECT_CVE_FROM_SOFTWARE = "SELECT cve, cpe, previousVersion "
|
private static final String SELECT_CVE_FROM_SOFTWARE = "SELECT cve, cpe, previousVersion "
|
||||||
+ "FROM software INNER JOIN vulnerability ON vulnerability.id = software.cveId "
|
+ "FROM software INNER JOIN vulnerability ON vulnerability.id = software.cveId "
|
||||||
+ "INNER JOIN cpeEntry ON cpeEntry.id = software.cpeEntryId "
|
+ "INNER JOIN cpeEntry ON cpeEntry.id = software.cpeEntryId "
|
||||||
+ "WHERE vendor = ? AND product = ?";
|
+ "WHERE vendor = ? AND product = ? "
|
||||||
|
+ "ORDER BY cve, cpe"; //, previousVersion
|
||||||
//unfortunately, the version info is too complicated to do in a select. Need to filter this afterwards
|
//unfortunately, the version info is too complicated to do in a select. Need to filter this afterwards
|
||||||
// + " AND (version = '-' OR previousVersion IS NOT NULL OR version=?)";
|
// + " AND (version = '-' OR previousVersion IS NOT NULL OR version=?)";
|
||||||
//
|
//
|
||||||
@@ -266,8 +273,8 @@ public class CveDB {
|
|||||||
|
|
||||||
//</editor-fold>
|
//</editor-fold>
|
||||||
/**
|
/**
|
||||||
* Searches the CPE entries in the database and retrieves all entries for a given vendor and product combination.
|
* Searches the CPE entries in the database and retrieves all entries for a given vendor and product combination. The returned
|
||||||
* The returned list will include all versions of the product that are registered in the NVD CVE data.
|
* list will include all versions of the product that are registered in the NVD CVE data.
|
||||||
*
|
*
|
||||||
* @param vendor the identified vendor name of the dependency being analyzed
|
* @param vendor the identified vendor name of the dependency being analyzed
|
||||||
* @param product the identified name of the product of the dependency being analyzed
|
* @param product the identified name of the product of the dependency being analyzed
|
||||||
@@ -306,14 +313,14 @@ public class CveDB {
|
|||||||
* @throws DatabaseException thrown when there is an error retrieving the data from the DB
|
* @throws DatabaseException thrown when there is an error retrieving the data from the DB
|
||||||
*/
|
*/
|
||||||
public Set<Pair<String, String>> getVendorProductList() throws DatabaseException {
|
public Set<Pair<String, String>> getVendorProductList() throws DatabaseException {
|
||||||
final HashSet data = new HashSet<Pair<String, String>>();
|
final Set<Pair<String, String>> data = new HashSet<Pair<String, String>>();
|
||||||
ResultSet rs = null;
|
ResultSet rs = null;
|
||||||
PreparedStatement ps = null;
|
PreparedStatement ps = null;
|
||||||
try {
|
try {
|
||||||
ps = getConnection().prepareStatement(SELECT_VENDOR_PRODUCT_LIST);
|
ps = getConnection().prepareStatement(SELECT_VENDOR_PRODUCT_LIST);
|
||||||
rs = ps.executeQuery();
|
rs = ps.executeQuery();
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
data.add(new Pair(rs.getString(1), rs.getString(2)));
|
data.add(new Pair<String, String>(rs.getString(1), rs.getString(2)));
|
||||||
}
|
}
|
||||||
} catch (SQLException ex) {
|
} catch (SQLException ex) {
|
||||||
final String msg = "An unexpected SQL Exception occurred; please see the verbose log for more details.";
|
final String msg = "An unexpected SQL Exception occurred; please see the verbose log for more details.";
|
||||||
@@ -452,30 +459,41 @@ public class CveDB {
|
|||||||
final List<Vulnerability> vulnerabilities = new ArrayList<Vulnerability>();
|
final List<Vulnerability> vulnerabilities = new ArrayList<Vulnerability>();
|
||||||
|
|
||||||
PreparedStatement ps;
|
PreparedStatement ps;
|
||||||
final HashSet<String> cveEntries = new HashSet<String>();
|
|
||||||
try {
|
try {
|
||||||
ps = getConnection().prepareStatement(SELECT_CVE_FROM_SOFTWARE);
|
ps = getConnection().prepareStatement(SELECT_CVE_FROM_SOFTWARE);
|
||||||
ps.setString(1, cpe.getVendor());
|
ps.setString(1, cpe.getVendor());
|
||||||
ps.setString(2, cpe.getProduct());
|
ps.setString(2, cpe.getProduct());
|
||||||
rs = ps.executeQuery();
|
rs = ps.executeQuery();
|
||||||
|
String currentCVE = "";
|
||||||
|
|
||||||
|
final Map<String, Boolean> vulnSoftware = new HashMap<String, Boolean>();
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
final String cveId = rs.getString(1);
|
final String cveId = rs.getString(1);
|
||||||
|
if (!currentCVE.equals(cveId)) { //check for match and add
|
||||||
|
final Entry<String, Boolean> matchedCPE = getMatchingSoftware(vulnSoftware, cpe.getVendor(), cpe.getProduct(), detectedVersion);
|
||||||
|
if (matchedCPE != null) {
|
||||||
|
final Vulnerability v = getVulnerability(currentCVE);
|
||||||
|
v.setMatchedCPE(matchedCPE.getKey(), matchedCPE.getValue() ? "Y" : null);
|
||||||
|
vulnerabilities.add(v);
|
||||||
|
}
|
||||||
|
vulnSoftware.clear();
|
||||||
|
currentCVE = cveId;
|
||||||
|
}
|
||||||
|
|
||||||
final String cpeId = rs.getString(2);
|
final String cpeId = rs.getString(2);
|
||||||
final String previous = rs.getString(3);
|
final String previous = rs.getString(3);
|
||||||
if (!cveEntries.contains(cveId) && isAffected(cpe.getVendor(), cpe.getProduct(), detectedVersion, cpeId, previous)) {
|
final Boolean p = previous != null && !previous.isEmpty();
|
||||||
cveEntries.add(cveId);
|
vulnSoftware.put(cpeId, p);
|
||||||
final Vulnerability v = getVulnerability(cveId);
|
}
|
||||||
v.setMatchedCPE(cpeId, previous);
|
//remember to process the last set of CVE/CPE entries
|
||||||
vulnerabilities.add(v);
|
final Entry<String, Boolean> matchedCPE = getMatchingSoftware(vulnSoftware, cpe.getVendor(), cpe.getProduct(), detectedVersion);
|
||||||
}
|
if (matchedCPE != null) {
|
||||||
|
final Vulnerability v = getVulnerability(currentCVE);
|
||||||
|
v.setMatchedCPE(matchedCPE.getKey(), matchedCPE.getValue() ? "Y" : null);
|
||||||
|
vulnerabilities.add(v);
|
||||||
}
|
}
|
||||||
DBUtils.closeResultSet(rs);
|
DBUtils.closeResultSet(rs);
|
||||||
DBUtils.closeStatement(ps);
|
DBUtils.closeStatement(ps);
|
||||||
// for (String cve : cveEntries) {
|
|
||||||
// final Vulnerability v = getVulnerability(cve);
|
|
||||||
// vulnerabilities.add(v);
|
|
||||||
// }
|
|
||||||
|
|
||||||
} catch (SQLException ex) {
|
} catch (SQLException ex) {
|
||||||
throw new DatabaseException("Exception retrieving vulnerability for " + cpeStr, ex);
|
throw new DatabaseException("Exception retrieving vulnerability for " + cpeStr, ex);
|
||||||
} finally {
|
} finally {
|
||||||
@@ -701,8 +719,45 @@ public class CveDB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* It is possible that orphaned rows may be generated during database updates. This should be called after all
|
* Checks to see if data exists so that analysis can be performed.
|
||||||
* updates have been completed to ensure orphan entries are removed.
|
*
|
||||||
|
* @return <code>true</code> if data exists; otherwise <code>false</code>
|
||||||
|
*/
|
||||||
|
public boolean dataExists() {
|
||||||
|
Statement cs = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
try {
|
||||||
|
cs = conn.createStatement();
|
||||||
|
rs = cs.executeQuery("SELECT COUNT(*) records FROM cpeEntry");
|
||||||
|
if (rs.next()) {
|
||||||
|
if (rs.getInt(1) > 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
String dd;
|
||||||
|
try {
|
||||||
|
dd = Settings.getDataDirectory().getAbsolutePath();
|
||||||
|
} catch (IOException ex1) {
|
||||||
|
dd = Settings.getString(Settings.KEYS.DATA_DIRECTORY);
|
||||||
|
}
|
||||||
|
final String msg = String.format("Unable to access the local database.%n%nEnsure that '%s' is a writable directory. "
|
||||||
|
+ "If the problem persist try deleting the files in '%s' and running %s again. If the problem continues, please "
|
||||||
|
+ "create a log file (see documentation at http://jeremylong.github.io/DependencyCheck/) and open a ticket at "
|
||||||
|
+ "https://github.com/jeremylong/DependencyCheck/issues and include the log file.%n%n",
|
||||||
|
dd, dd, Settings.getString(Settings.KEYS.APPLICATION_VAME));
|
||||||
|
LOGGER.log(Level.SEVERE, msg);
|
||||||
|
LOGGER.log(Level.FINE, "", ex);
|
||||||
|
} finally {
|
||||||
|
DBUtils.closeResultSet(rs);
|
||||||
|
DBUtils.closeStatement(cs);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* It is possible that orphaned rows may be generated during database updates. This should be called after all updates have
|
||||||
|
* been completed to ensure orphan entries are removed.
|
||||||
*/
|
*/
|
||||||
public void cleanupDatabase() {
|
public void cleanupDatabase() {
|
||||||
PreparedStatement ps = null;
|
PreparedStatement ps = null;
|
||||||
@@ -721,46 +776,80 @@ public class CveDB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines if the given identifiedVersion is affected by the given cpeId and previous version flag. A non-null,
|
* Determines if the given identifiedVersion is affected by the given cpeId and previous version flag. A non-null, non-empty
|
||||||
* non-empty string passed to the previous version argument indicates that all previous versions are affected.
|
* string passed to the previous version argument indicates that all previous versions are affected.
|
||||||
*
|
*
|
||||||
* @param vendor the vendor of the dependency being analyzed
|
* @param vendor the vendor of the dependency being analyzed
|
||||||
* @param product the product name of the dependency being analyzed
|
* @param product the product name of the dependency being analyzed
|
||||||
|
* @param vulnerableSoftware a map of the vulnerable software with a boolean indicating if all previous versions are affected
|
||||||
* @param identifiedVersion the identified version of the dependency being analyzed
|
* @param identifiedVersion the identified version of the dependency being analyzed
|
||||||
* @param cpeId the cpe identifier of software that has a known vulnerability
|
|
||||||
* @param previous a flag indicating if previous versions of the product are vulnerable
|
|
||||||
* @return true if the identified version is affected, otherwise false
|
* @return true if the identified version is affected, otherwise false
|
||||||
*/
|
*/
|
||||||
private boolean isAffected(String vendor, String product, DependencyVersion identifiedVersion, String cpeId, String previous) {
|
Entry<String, Boolean> getMatchingSoftware(Map<String, Boolean> vulnerableSoftware, String vendor, String product,
|
||||||
boolean affected = false;
|
DependencyVersion identifiedVersion) {
|
||||||
final boolean isStruts = "apache".equals(vendor) && "struts".equals(product);
|
|
||||||
final DependencyVersion v = parseDependencyVersion(cpeId);
|
final boolean isVersionTwoADifferentProduct = "apache".equals(vendor) && "struts".equals(product);
|
||||||
final boolean prevAffected = previous != null && !previous.isEmpty();
|
|
||||||
if (v == null || "-".equals(v.toString())) { //all versions
|
final Set<String> majorVersionsAffectingAllPrevious = new HashSet<String>();
|
||||||
affected = true;
|
final boolean matchesAnyPrevious = identifiedVersion == null || "-".equals(identifiedVersion.toString());
|
||||||
} else if (identifiedVersion == null || "-".equals(identifiedVersion.toString())) {
|
String majorVersionMatch = null;
|
||||||
if (prevAffected) {
|
for (Entry<String, Boolean> entry : vulnerableSoftware.entrySet()) {
|
||||||
affected = true;
|
final DependencyVersion v = parseDependencyVersion(entry.getKey());
|
||||||
|
if (v == null || "-".equals(v.toString())) { //all versions
|
||||||
|
return entry;
|
||||||
}
|
}
|
||||||
} else if (identifiedVersion.equals(v) || (prevAffected && identifiedVersion.compareTo(v) < 0)) {
|
if (entry.getValue()) {
|
||||||
if (isStruts) { //struts 2 vulns don't affect struts 1
|
if (matchesAnyPrevious) {
|
||||||
if (identifiedVersion.getVersionParts().get(0).equals(v.getVersionParts().get(0))) {
|
return entry;
|
||||||
affected = true;
|
|
||||||
}
|
}
|
||||||
} else {
|
if (identifiedVersion != null && identifiedVersion.getVersionParts().get(0).equals(v.getVersionParts().get(0))) {
|
||||||
affected = true;
|
majorVersionMatch = v.getVersionParts().get(0);
|
||||||
|
}
|
||||||
|
majorVersionsAffectingAllPrevious.add(v.getVersionParts().get(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
if (matchesAnyPrevious) {
|
||||||
* TODO consider utilizing the matchThreeVersion method to get additional results. However, this
|
return null;
|
||||||
* might also introduce false positives.
|
}
|
||||||
*/
|
|
||||||
return affected;
|
final boolean canSkipVersions = majorVersionMatch != null && majorVersionsAffectingAllPrevious.size() > 1;
|
||||||
|
//yes, we are iterating over this twice. The first time we are skipping versions those that affect all versions
|
||||||
|
//then later we process those that affect all versions. This could be done with sorting...
|
||||||
|
for (Entry<String, Boolean> entry : vulnerableSoftware.entrySet()) {
|
||||||
|
if (!entry.getValue()) {
|
||||||
|
final DependencyVersion v = parseDependencyVersion(entry.getKey());
|
||||||
|
//this can't dereference a null 'majorVersionMatch' as canSkipVersions accounts for this.
|
||||||
|
if (canSkipVersions && !majorVersionMatch.equals(v.getVersionParts().get(0))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
//this can't dereference a null 'identifiedVersion' because if it was null we would have exited
|
||||||
|
//in the above loop or just after loop (if matchesAnyPrevious return null).
|
||||||
|
if (identifiedVersion.equals(v)) {
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (Entry<String, Boolean> entry : vulnerableSoftware.entrySet()) {
|
||||||
|
if (entry.getValue()) {
|
||||||
|
final DependencyVersion v = parseDependencyVersion(entry.getKey());
|
||||||
|
//this can't dereference a null 'majorVersionMatch' as canSkipVersions accounts for this.
|
||||||
|
if (canSkipVersions && !majorVersionMatch.equals(v.getVersionParts().get(0))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
//this can't dereference a null 'identifiedVersion' because if it was null we would have exited
|
||||||
|
//in the above loop or just after loop (if matchesAnyPrevious return null).
|
||||||
|
if (entry.getValue() && identifiedVersion.compareTo(v) <= 0) {
|
||||||
|
if (!(isVersionTwoADifferentProduct && !identifiedVersion.getVersionParts().get(0).equals(v.getVersionParts().get(0)))) {
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses the version (including revision) from a CPE identifier. If no version is identified then a '-' is
|
* Parses the version (including revision) from a CPE identifier. If no version is identified then a '-' is returned.
|
||||||
* returned.
|
|
||||||
*
|
*
|
||||||
* @param cpeStr a cpe identifier
|
* @param cpeStr a cpe identifier
|
||||||
* @return a dependency version
|
* @return a dependency version
|
||||||
@@ -784,9 +873,9 @@ public class CveDB {
|
|||||||
*/
|
*/
|
||||||
private DependencyVersion parseDependencyVersion(VulnerableSoftware cpe) {
|
private DependencyVersion parseDependencyVersion(VulnerableSoftware cpe) {
|
||||||
DependencyVersion cpeVersion;
|
DependencyVersion cpeVersion;
|
||||||
if (cpe.getVersion() != null && cpe.getVersion().length() > 0) {
|
if (cpe.getVersion() != null && !cpe.getVersion().isEmpty()) {
|
||||||
String versionText;
|
String versionText;
|
||||||
if (cpe.getRevision() != null && cpe.getRevision().length() > 0) {
|
if (cpe.getRevision() != null && !cpe.getRevision().isEmpty()) {
|
||||||
versionText = String.format("%s.%s", cpe.getVersion(), cpe.getRevision());
|
versionText = String.format("%s.%s", cpe.getVersion(), cpe.getRevision());
|
||||||
} else {
|
} else {
|
||||||
versionText = cpe.getVersion();
|
versionText = cpe.getVersion();
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ public class DatabaseProperties {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes a properties file containing the last updated date to the VULNERABLE_CPE directory.
|
* Saves the last updated information to the properties file.
|
||||||
*
|
*
|
||||||
* @param updatedValue the updated NVD CVE entry
|
* @param updatedValue the updated NVD CVE entry
|
||||||
* @throws UpdateException is thrown if there is an update exception
|
* @throws UpdateException is thrown if there is an update exception
|
||||||
@@ -100,8 +100,19 @@ public class DatabaseProperties {
|
|||||||
if (updatedValue == null) {
|
if (updatedValue == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
properties.put(LAST_UPDATED_BASE + updatedValue.getId(), String.valueOf(updatedValue.getTimestamp()));
|
save(LAST_UPDATED_BASE + updatedValue.getId(), String.valueOf(updatedValue.getTimestamp()));
|
||||||
cveDB.saveProperty(LAST_UPDATED_BASE + updatedValue.getId(), String.valueOf(updatedValue.getTimestamp()));
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Saves the key value pair to the properties store.
|
||||||
|
*
|
||||||
|
* @param key the property key
|
||||||
|
* @param value the property value
|
||||||
|
* @throws UpdateException is thrown if there is an update exception
|
||||||
|
*/
|
||||||
|
public void save(String key, String value) throws UpdateException {
|
||||||
|
properties.put(key, value);
|
||||||
|
cveDB.saveProperty(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -142,8 +153,8 @@ public class DatabaseProperties {
|
|||||||
*
|
*
|
||||||
* @return a map of the database meta data
|
* @return a map of the database meta data
|
||||||
*/
|
*/
|
||||||
public Map getMetaData() {
|
public Map<String, String> getMetaData() {
|
||||||
final TreeMap map = new TreeMap();
|
final Map<String, String> map = new TreeMap<String, String>();
|
||||||
for (Entry<Object, Object> entry : properties.entrySet()) {
|
for (Entry<Object, Object> entry : properties.entrySet()) {
|
||||||
final String key = (String) entry.getKey();
|
final String key = (String) entry.getKey();
|
||||||
if (!"version".equals(key)) {
|
if (!"version".equals(key)) {
|
||||||
@@ -156,10 +167,10 @@ public class DatabaseProperties {
|
|||||||
map.put(key, formatted);
|
map.put(key, formatted);
|
||||||
} catch (Throwable ex) { //deliberately being broad in this catch clause
|
} catch (Throwable ex) { //deliberately being broad in this catch clause
|
||||||
LOGGER.log(Level.FINE, "Unable to parse timestamp from DB", ex);
|
LOGGER.log(Level.FINE, "Unable to parse timestamp from DB", ex);
|
||||||
map.put(key, entry.getValue());
|
map.put(key, (String) entry.getValue());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
map.put(key, entry.getValue());
|
map.put(key, (String) entry.getValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import java.sql.Driver;
|
|||||||
import java.sql.DriverManager;
|
import java.sql.DriverManager;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
@@ -75,7 +76,7 @@ public final class DriverLoader {
|
|||||||
*/
|
*/
|
||||||
public static Driver load(String className, String pathToDriver) throws DriverLoadException {
|
public static Driver load(String className, String pathToDriver) throws DriverLoadException {
|
||||||
final URLClassLoader parent = (URLClassLoader) ClassLoader.getSystemClassLoader();
|
final URLClassLoader parent = (URLClassLoader) ClassLoader.getSystemClassLoader();
|
||||||
final ArrayList<URL> urls = new ArrayList<URL>();
|
final List<URL> urls = new ArrayList<URL>();
|
||||||
final String[] paths = pathToDriver.split(File.pathSeparator);
|
final String[] paths = pathToDriver.split(File.pathSeparator);
|
||||||
for (String path : paths) {
|
for (String path : paths) {
|
||||||
final File file = new File(path);
|
final File file = new File(path);
|
||||||
|
|||||||
@@ -0,0 +1,214 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of dependency-check-core.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 Jeremy Long. All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.owasp.dependencycheck.data.update;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
import org.owasp.dependencycheck.data.nvdcve.CveDB;
|
||||||
|
import org.owasp.dependencycheck.data.nvdcve.DatabaseException;
|
||||||
|
import org.owasp.dependencycheck.data.nvdcve.DatabaseProperties;
|
||||||
|
import org.owasp.dependencycheck.data.update.exception.UpdateException;
|
||||||
|
import org.owasp.dependencycheck.utils.DateUtil;
|
||||||
|
import org.owasp.dependencycheck.utils.DependencyVersion;
|
||||||
|
import org.owasp.dependencycheck.utils.Settings;
|
||||||
|
import org.owasp.dependencycheck.utils.URLConnectionFactory;
|
||||||
|
import org.owasp.dependencycheck.utils.URLConnectionFailureException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Jeremy Long <jeremy.long@owasp.org>
|
||||||
|
*/
|
||||||
|
public class EngineVersionCheck implements CachedWebDataSource {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static logger.
|
||||||
|
*/
|
||||||
|
private static final Logger LOGGER = Logger.getLogger(EngineVersionCheck.class.getName());
|
||||||
|
/**
|
||||||
|
* The property key indicating when the last version check occurred.
|
||||||
|
*/
|
||||||
|
public static final String ENGINE_VERSION_CHECKED_ON = "VersionCheckOn";
|
||||||
|
/**
|
||||||
|
* The property key indicating when the last version check occurred.
|
||||||
|
*/
|
||||||
|
public static final String CURRENT_ENGINE_RELEASE = "CurrentEngineRelease";
|
||||||
|
/**
|
||||||
|
* Reference to the Cve Database.
|
||||||
|
*/
|
||||||
|
private CveDB cveDB = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The version retrieved from the database properties or web to check against.
|
||||||
|
*/
|
||||||
|
private String updateToVersion;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for updateToVersion - only used for testing. Represents the version retrieved from the database.
|
||||||
|
*
|
||||||
|
* @return the version to test
|
||||||
|
*/
|
||||||
|
protected String getUpdateToVersion() {
|
||||||
|
return updateToVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter for updateToVersion - only used for testing. Represents the version retrieved from the database.
|
||||||
|
*
|
||||||
|
* @param version the version to test
|
||||||
|
*/
|
||||||
|
protected void setUpdateToVersion(String version) {
|
||||||
|
updateToVersion = version;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update() throws UpdateException {
|
||||||
|
try {
|
||||||
|
openDatabase();
|
||||||
|
LOGGER.fine("Begin Engine Version Check");
|
||||||
|
final DatabaseProperties properties = cveDB.getDatabaseProperties();
|
||||||
|
final long lastChecked = Long.parseLong(properties.getProperty(ENGINE_VERSION_CHECKED_ON, "0"));
|
||||||
|
final long now = (new Date()).getTime();
|
||||||
|
updateToVersion = properties.getProperty(CURRENT_ENGINE_RELEASE, "");
|
||||||
|
final String currentVersion = Settings.getString(Settings.KEYS.APPLICATION_VERSION, "0.0.0");
|
||||||
|
LOGGER.fine("Last checked: " + lastChecked);
|
||||||
|
LOGGER.fine("Now: " + now);
|
||||||
|
LOGGER.fine("Current version: " + currentVersion);
|
||||||
|
final boolean updateNeeded = shouldUpdate(lastChecked, now, properties, currentVersion);
|
||||||
|
if (updateNeeded) {
|
||||||
|
final String msg = String.format("A new version of dependency-check is available. Consider updating to version %s.",
|
||||||
|
updateToVersion);
|
||||||
|
LOGGER.warning(msg);
|
||||||
|
}
|
||||||
|
} catch (DatabaseException ex) {
|
||||||
|
LOGGER.log(Level.FINE, "Database Exception opening databases to retrieve properties", ex);
|
||||||
|
throw new UpdateException("Error occured updating database properties.");
|
||||||
|
} finally {
|
||||||
|
closeDatabase();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if a new version of the dependency-check engine has been released.
|
||||||
|
*
|
||||||
|
* @param lastChecked the epoch time of the last version check
|
||||||
|
* @param now the current epoch time
|
||||||
|
* @param properties the database properties object
|
||||||
|
* @param currentVersion the current version of dependency-check
|
||||||
|
* @return <code>true</code> if a newer version of the database has been released; otherwise <code>false</code>
|
||||||
|
* @throws UpdateException thrown if there is an error connecting to the github documentation site or accessing the
|
||||||
|
* local database.
|
||||||
|
*/
|
||||||
|
protected boolean shouldUpdate(final long lastChecked, final long now, final DatabaseProperties properties,
|
||||||
|
String currentVersion) throws UpdateException {
|
||||||
|
//check every 30 days if we know there is an update, otherwise check every 7 days
|
||||||
|
int checkRange = 30;
|
||||||
|
if (updateToVersion.isEmpty()) {
|
||||||
|
checkRange = 7;
|
||||||
|
}
|
||||||
|
if (!DateUtil.withinDateRange(lastChecked, now, checkRange)) {
|
||||||
|
LOGGER.fine("Checking web for new version.");
|
||||||
|
final String currentRelease = getCurrentReleaseVersion();
|
||||||
|
if (currentRelease != null) {
|
||||||
|
final DependencyVersion v = new DependencyVersion(currentRelease);
|
||||||
|
if (v.getVersionParts() != null && v.getVersionParts().size() >= 3) {
|
||||||
|
updateToVersion = v.toString();
|
||||||
|
if (!currentRelease.equals(updateToVersion)) {
|
||||||
|
properties.save(CURRENT_ENGINE_RELEASE, updateToVersion);
|
||||||
|
} else {
|
||||||
|
properties.save(CURRENT_ENGINE_RELEASE, "");
|
||||||
|
}
|
||||||
|
properties.save(ENGINE_VERSION_CHECKED_ON, Long.toString(now));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LOGGER.log(Level.FINE, "Current Release: {0}", updateToVersion);
|
||||||
|
}
|
||||||
|
final DependencyVersion running = new DependencyVersion(currentVersion);
|
||||||
|
final DependencyVersion released = new DependencyVersion(updateToVersion);
|
||||||
|
if (running.compareTo(released) < 0) {
|
||||||
|
LOGGER.fine("Upgrade recommended");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
LOGGER.fine("Upgrade not needed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens the CVE and CPE data stores.
|
||||||
|
*
|
||||||
|
* @throws DatabaseException thrown if a data store cannot be opened
|
||||||
|
*/
|
||||||
|
protected final void openDatabase() throws DatabaseException {
|
||||||
|
if (cveDB != null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cveDB = new CveDB();
|
||||||
|
cveDB.open();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the CVE and CPE data stores.
|
||||||
|
*/
|
||||||
|
protected void closeDatabase() {
|
||||||
|
if (cveDB != null) {
|
||||||
|
try {
|
||||||
|
cveDB.close();
|
||||||
|
} catch (Throwable ignore) {
|
||||||
|
LOGGER.log(Level.FINEST, "Error closing the cveDB", ignore);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the current released version number from the github documentation site.
|
||||||
|
*
|
||||||
|
* @return the current released version number
|
||||||
|
*/
|
||||||
|
protected String getCurrentReleaseVersion() {
|
||||||
|
HttpURLConnection conn = null;
|
||||||
|
try {
|
||||||
|
final String str = Settings.getString(Settings.KEYS.ENGINE_VERSION_CHECK_URL, "http://jeremylong.github.io/DependencyCheck/current.txt");
|
||||||
|
final URL url = new URL(str);
|
||||||
|
conn = URLConnectionFactory.createHttpURLConnection(url);
|
||||||
|
conn.connect();
|
||||||
|
if (conn.getResponseCode() != 200) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
final String releaseVersion = IOUtils.toString(conn.getInputStream(), "UTF-8");
|
||||||
|
if (releaseVersion != null) {
|
||||||
|
return releaseVersion.trim();
|
||||||
|
}
|
||||||
|
} catch (MalformedURLException ex) {
|
||||||
|
LOGGER.log(Level.FINE, "unable to retrieve current release version of dependency-check", ex);
|
||||||
|
} catch (URLConnectionFailureException ex) {
|
||||||
|
LOGGER.log(Level.FINE, "unable to retrieve current release version of dependency-check", ex);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
LOGGER.log(Level.FINE, "unable to retrieve current release version of dependency-check", ex);
|
||||||
|
} finally {
|
||||||
|
if (conn != null) {
|
||||||
|
conn.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -36,6 +36,7 @@ import org.owasp.dependencycheck.data.update.exception.InvalidDataException;
|
|||||||
import org.owasp.dependencycheck.data.update.exception.UpdateException;
|
import org.owasp.dependencycheck.data.update.exception.UpdateException;
|
||||||
import org.owasp.dependencycheck.data.update.task.DownloadTask;
|
import org.owasp.dependencycheck.data.update.task.DownloadTask;
|
||||||
import org.owasp.dependencycheck.data.update.task.ProcessTask;
|
import org.owasp.dependencycheck.data.update.task.ProcessTask;
|
||||||
|
import org.owasp.dependencycheck.utils.DateUtil;
|
||||||
import org.owasp.dependencycheck.utils.DownloadFailedException;
|
import org.owasp.dependencycheck.utils.DownloadFailedException;
|
||||||
import org.owasp.dependencycheck.utils.InvalidSettingException;
|
import org.owasp.dependencycheck.utils.InvalidSettingException;
|
||||||
import org.owasp.dependencycheck.utils.Settings;
|
import org.owasp.dependencycheck.utils.Settings;
|
||||||
@@ -220,7 +221,7 @@ public class StandardUpdate {
|
|||||||
final int days = Settings.getInt(Settings.KEYS.CVE_MODIFIED_VALID_FOR_DAYS, 7);
|
final int days = Settings.getInt(Settings.KEYS.CVE_MODIFIED_VALID_FOR_DAYS, 7);
|
||||||
if (lastUpdated == updates.getTimeStamp(MODIFIED)) {
|
if (lastUpdated == updates.getTimeStamp(MODIFIED)) {
|
||||||
updates.clear(); //we don't need to update anything.
|
updates.clear(); //we don't need to update anything.
|
||||||
} else if (withinRange(lastUpdated, now.getTime(), days)) {
|
} else if (DateUtil.withinDateRange(lastUpdated, now.getTime(), days)) {
|
||||||
for (NvdCveInfo entry : updates) {
|
for (NvdCveInfo entry : updates) {
|
||||||
if (MODIFIED.equals(entry.getId())) {
|
if (MODIFIED.equals(entry.getId())) {
|
||||||
entry.setNeedsUpdate(true);
|
entry.setNeedsUpdate(true);
|
||||||
@@ -317,19 +318,4 @@ public class StandardUpdate {
|
|||||||
throw new UpdateException("Error updating the CPE/CVE data, please see the log file for more details.");
|
throw new UpdateException("Error updating the CPE/CVE data, please see the log file for more details.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines if the epoch date is within the range specified of the compareTo epoch time. This takes the
|
|
||||||
* (compareTo-date)/1000/60/60/24 to get the number of days. If the calculated days is less then the range the date
|
|
||||||
* is considered valid.
|
|
||||||
*
|
|
||||||
* @param date the date to be checked.
|
|
||||||
* @param compareTo the date to compare to.
|
|
||||||
* @param range the range in days to be considered valid.
|
|
||||||
* @return whether or not the date is within the range.
|
|
||||||
*/
|
|
||||||
protected boolean withinRange(long date, long compareTo, int range) {
|
|
||||||
final double differenceInDays = (compareTo - date) / 1000.0 / 60.0 / 60.0 / 24.0;
|
|
||||||
return differenceInDays < range;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,9 @@
|
|||||||
package org.owasp.dependencycheck.data.update.task;
|
package org.owasp.dependencycheck.data.update.task;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
@@ -25,6 +28,8 @@ import java.util.concurrent.ExecutorService;
|
|||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
import java.util.zip.GZIPInputStream;
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.owasp.dependencycheck.data.nvdcve.CveDB;
|
import org.owasp.dependencycheck.data.nvdcve.CveDB;
|
||||||
import org.owasp.dependencycheck.data.update.NvdCveInfo;
|
import org.owasp.dependencycheck.data.update.NvdCveInfo;
|
||||||
import org.owasp.dependencycheck.data.update.exception.UpdateException;
|
import org.owasp.dependencycheck.data.update.exception.UpdateException;
|
||||||
@@ -195,10 +200,18 @@ public class DownloadTask implements Callable<Future<ProcessTask>> {
|
|||||||
LOGGER.log(Level.FINE, null, ex);
|
LOGGER.log(Level.FINE, null, ex);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
if (url1.toExternalForm().endsWith(".xml.gz")) {
|
||||||
|
extractGzip(first);
|
||||||
|
}
|
||||||
|
if (url2.toExternalForm().endsWith(".xml.gz")) {
|
||||||
|
extractGzip(second);
|
||||||
|
}
|
||||||
|
|
||||||
msg = String.format("Download Complete for NVD CVE - %s", nvdCveInfo.getId());
|
msg = String.format("Download Complete for NVD CVE - %s", nvdCveInfo.getId());
|
||||||
LOGGER.log(Level.INFO, msg);
|
LOGGER.log(Level.INFO, msg);
|
||||||
|
if (this.processorService == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
final ProcessTask task = new ProcessTask(cveDB, this, settings);
|
final ProcessTask task = new ProcessTask(cveDB, this, settings);
|
||||||
return this.processorService.submit(task);
|
return this.processorService.submit(task);
|
||||||
|
|
||||||
@@ -237,4 +250,56 @@ public class DownloadTask implements Callable<Future<ProcessTask>> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts the file contained in a gzip archive. The extracted file is placed in the exact same path as the file
|
||||||
|
* specified.
|
||||||
|
*
|
||||||
|
* @param file the archive file
|
||||||
|
* @throws FileNotFoundException thrown if the file does not exist
|
||||||
|
* @throws IOException thrown if there is an error extracting the file.
|
||||||
|
*/
|
||||||
|
private void extractGzip(File file) throws FileNotFoundException, IOException {
|
||||||
|
final String originalPath = file.getPath();
|
||||||
|
final File gzip = new File(originalPath + ".gz");
|
||||||
|
if (gzip.isFile() && !gzip.delete()) {
|
||||||
|
gzip.deleteOnExit();
|
||||||
|
}
|
||||||
|
if (!file.renameTo(gzip)) {
|
||||||
|
throw new IOException("Unable to rename '" + file.getPath() + "'");
|
||||||
|
}
|
||||||
|
final File newfile = new File(originalPath);
|
||||||
|
|
||||||
|
final byte[] buffer = new byte[4096];
|
||||||
|
|
||||||
|
GZIPInputStream cin = null;
|
||||||
|
FileOutputStream out = null;
|
||||||
|
try {
|
||||||
|
cin = new GZIPInputStream(new FileInputStream(gzip));
|
||||||
|
out = new FileOutputStream(newfile);
|
||||||
|
|
||||||
|
int len;
|
||||||
|
while ((len = cin.read(buffer)) > 0) {
|
||||||
|
out.write(buffer, 0, len);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (cin != null) {
|
||||||
|
try {
|
||||||
|
cin.close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
LOGGER.log(Level.FINEST, "ignore", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (out != null) {
|
||||||
|
try {
|
||||||
|
out.close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
LOGGER.log(Level.FINEST, "ignore", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (gzip.isFile()) {
|
||||||
|
FileUtils.deleteQuietly(gzip);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,18 +21,22 @@ import java.io.File;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
import org.owasp.dependencycheck.data.nexus.MavenArtifact;
|
||||||
import org.owasp.dependencycheck.utils.Checksum;
|
import org.owasp.dependencycheck.utils.Checksum;
|
||||||
import org.owasp.dependencycheck.utils.FileUtils;
|
import org.owasp.dependencycheck.utils.FileUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A program dependency. This object is one of the core components within DependencyCheck. It is used to collect
|
* A program dependency. This object is one of the core components within DependencyCheck. It is used to collect information about
|
||||||
* information about the dependency in the form of evidence. The Evidence is then used to determine if there are any
|
* the dependency in the form of evidence. The Evidence is then used to determine if there are any known, published,
|
||||||
* known, published, vulnerabilities associated with the program dependency.
|
* vulnerabilities associated with the program dependency.
|
||||||
*
|
*
|
||||||
* @author Jeremy Long <jeremy.long@owasp.org>
|
* @author Jeremy Long <jeremy.long@owasp.org>
|
||||||
*/
|
*/
|
||||||
@@ -120,8 +124,8 @@ public class Dependency implements Serializable, Comparable<Dependency> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the file name of the dependency with the backslash escaped for use in JavaScript. This is a complete hack
|
* Returns the file name of the dependency with the backslash escaped for use in JavaScript. This is a complete hack as I
|
||||||
* as I could not get the replace to work in the template itself.
|
* could not get the replace to work in the template itself.
|
||||||
*
|
*
|
||||||
* @return the file name of the dependency with the backslash escaped for use in JavaScript
|
* @return the file name of the dependency with the backslash escaped for use in JavaScript
|
||||||
*/
|
*/
|
||||||
@@ -193,8 +197,7 @@ public class Dependency implements Serializable, Comparable<Dependency> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the file name to display in reports; if no display file name has been set it will default to the actual
|
* Returns the file name to display in reports; if no display file name has been set it will default to the actual file name.
|
||||||
* file name.
|
|
||||||
*
|
*
|
||||||
* @return the file name to display
|
* @return the file name to display
|
||||||
*/
|
*/
|
||||||
@@ -209,8 +212,8 @@ public class Dependency implements Serializable, Comparable<Dependency> {
|
|||||||
* <p>
|
* <p>
|
||||||
* Gets the file path of the dependency.</p>
|
* Gets the file path of the dependency.</p>
|
||||||
* <p>
|
* <p>
|
||||||
* <b>NOTE:</b> This may not be the actual path of the file on disk. The actual path of the file on disk can be
|
* <b>NOTE:</b> This may not be the actual path of the file on disk. The actual path of the file on disk can be obtained via
|
||||||
* obtained via the getActualFilePath().</p>
|
* the getActualFilePath().</p>
|
||||||
*
|
*
|
||||||
* @return the file path of the dependency
|
* @return the file path of the dependency
|
||||||
*/
|
*/
|
||||||
@@ -316,6 +319,43 @@ public class Dependency implements Serializable, Comparable<Dependency> {
|
|||||||
this.identifiers.add(i);
|
this.identifiers.add(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds the maven artifact as evidence.
|
||||||
|
*
|
||||||
|
* @param source The source of the evidence
|
||||||
|
* @param mavenArtifact The maven artifact
|
||||||
|
* @param confidence The confidence level of this evidence
|
||||||
|
*/
|
||||||
|
public void addAsEvidence(String source, MavenArtifact mavenArtifact, Confidence confidence) {
|
||||||
|
if (mavenArtifact.getGroupId() != null && !mavenArtifact.getGroupId().isEmpty()) {
|
||||||
|
this.getVendorEvidence().addEvidence(source, "groupid", mavenArtifact.getGroupId(), confidence);
|
||||||
|
}
|
||||||
|
if (mavenArtifact.getArtifactId() != null && !mavenArtifact.getArtifactId().isEmpty()) {
|
||||||
|
this.getProductEvidence().addEvidence(source, "artifactid", mavenArtifact.getArtifactId(), confidence);
|
||||||
|
}
|
||||||
|
if (mavenArtifact.getVersion() != null && !mavenArtifact.getVersion().isEmpty()) {
|
||||||
|
this.getVersionEvidence().addEvidence(source, "version", mavenArtifact.getVersion(), confidence);
|
||||||
|
}
|
||||||
|
if (mavenArtifact.getArtifactUrl() != null && !mavenArtifact.getArtifactUrl().isEmpty()) {
|
||||||
|
boolean found = false;
|
||||||
|
for (Identifier i : this.getIdentifiers()) {
|
||||||
|
if ("maven".equals(i.getType()) && i.getValue().equals(mavenArtifact.toString())) {
|
||||||
|
found = true;
|
||||||
|
i.setConfidence(Confidence.HIGHEST);
|
||||||
|
final String url = "http://search.maven.org/#search|ga|1|1%3A%22" + this.getSha1sum() + "%22";
|
||||||
|
i.setUrl(url);
|
||||||
|
//i.setUrl(mavenArtifact.getArtifactUrl());
|
||||||
|
LOGGER.fine(String.format("Already found identifier %s. Confidence set to highest", i.getValue()));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
LOGGER.fine(String.format("Adding new maven identifier %s", mavenArtifact.toString()));
|
||||||
|
this.addIdentifier("maven", mavenArtifact.toString(), mavenArtifact.getArtifactUrl(), Confidence.HIGHEST);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds an entry to the list of detected Identifiers for the dependency file.
|
* Adds an entry to the list of detected Identifiers for the dependency file.
|
||||||
*
|
*
|
||||||
@@ -324,6 +364,7 @@ public class Dependency implements Serializable, Comparable<Dependency> {
|
|||||||
public void addIdentifier(Identifier identifier) {
|
public void addIdentifier(Identifier identifier) {
|
||||||
this.identifiers.add(identifier);
|
this.identifiers.add(identifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A set of identifiers that have been suppressed.
|
* A set of identifiers that have been suppressed.
|
||||||
*/
|
*/
|
||||||
@@ -441,6 +482,7 @@ public class Dependency implements Serializable, Comparable<Dependency> {
|
|||||||
public EvidenceCollection getVersionEvidence() {
|
public EvidenceCollection getVersionEvidence() {
|
||||||
return this.versionEvidence;
|
return this.versionEvidence;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The description of the JAR file.
|
* The description of the JAR file.
|
||||||
*/
|
*/
|
||||||
@@ -463,6 +505,7 @@ public class Dependency implements Serializable, Comparable<Dependency> {
|
|||||||
public void setDescription(String description) {
|
public void setDescription(String description) {
|
||||||
this.description = description;
|
this.description = description;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The license that this dependency uses.
|
* The license that this dependency uses.
|
||||||
*/
|
*/
|
||||||
@@ -485,6 +528,7 @@ public class Dependency implements Serializable, Comparable<Dependency> {
|
|||||||
public void setLicense(String license) {
|
public void setLicense(String license) {
|
||||||
this.license = license;
|
this.license = license;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A list of vulnerabilities for this dependency.
|
* A list of vulnerabilities for this dependency.
|
||||||
*/
|
*/
|
||||||
@@ -540,6 +584,7 @@ public class Dependency implements Serializable, Comparable<Dependency> {
|
|||||||
public void addVulnerability(Vulnerability vulnerability) {
|
public void addVulnerability(Vulnerability vulnerability) {
|
||||||
this.vulnerabilities.add(vulnerability);
|
this.vulnerabilities.add(vulnerability);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A collection of related dependencies.
|
* A collection of related dependencies.
|
||||||
*/
|
*/
|
||||||
@@ -554,6 +599,47 @@ public class Dependency implements Serializable, Comparable<Dependency> {
|
|||||||
return relatedDependencies;
|
return relatedDependencies;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list of projects that reference this dependency.
|
||||||
|
*/
|
||||||
|
private Set<String> projectReferences = new HashSet<String>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the value of projectReferences.
|
||||||
|
*
|
||||||
|
* @return the value of projectReferences
|
||||||
|
*/
|
||||||
|
public Set<String> getProjectReferences() {
|
||||||
|
return projectReferences;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the value of projectReferences.
|
||||||
|
*
|
||||||
|
* @param projectReferences new value of projectReferences
|
||||||
|
*/
|
||||||
|
public void setProjectReferences(Set<String> projectReferences) {
|
||||||
|
this.projectReferences = projectReferences;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a project reference.
|
||||||
|
*
|
||||||
|
* @param projectReference a project reference
|
||||||
|
*/
|
||||||
|
public void addProjectReference(String projectReference) {
|
||||||
|
this.projectReferences.add(projectReference);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a collection of project reference.
|
||||||
|
*
|
||||||
|
* @param projectReferences a set of project references
|
||||||
|
*/
|
||||||
|
public void addAllProjectReferences(Set<String> projectReferences) {
|
||||||
|
this.projectReferences.addAll(projectReferences);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the value of relatedDependencies.
|
* Set the value of relatedDependencies.
|
||||||
*
|
*
|
||||||
@@ -569,7 +655,46 @@ public class Dependency implements Serializable, Comparable<Dependency> {
|
|||||||
* @param dependency a reference to the related dependency
|
* @param dependency a reference to the related dependency
|
||||||
*/
|
*/
|
||||||
public void addRelatedDependency(Dependency dependency) {
|
public void addRelatedDependency(Dependency dependency) {
|
||||||
relatedDependencies.add(dependency);
|
if (this == dependency) {
|
||||||
|
LOGGER.warning("Attempted to add a circular reference - please post the log file to issue #172 here "
|
||||||
|
+ "https://github.com/jeremylong/DependencyCheck/issues/172 ");
|
||||||
|
LOGGER.log(Level.FINE, "this: {0}", this.toString());
|
||||||
|
LOGGER.log(Level.FINE, "dependency: {0}", dependency.toString());
|
||||||
|
} else {
|
||||||
|
relatedDependencies.add(dependency);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list of available versions.
|
||||||
|
*/
|
||||||
|
private List<String> availableVersions = new ArrayList<String>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the value of availableVersions.
|
||||||
|
*
|
||||||
|
* @return the value of availableVersions
|
||||||
|
*/
|
||||||
|
public List<String> getAvailableVersions() {
|
||||||
|
return availableVersions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the value of availableVersions.
|
||||||
|
*
|
||||||
|
* @param availableVersions new value of availableVersions
|
||||||
|
*/
|
||||||
|
public void setAvailableVersions(List<String> availableVersions) {
|
||||||
|
this.availableVersions = availableVersions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a version to the available version list.
|
||||||
|
*
|
||||||
|
* @param version the version to add to the list
|
||||||
|
*/
|
||||||
|
public void addAvailableVersion(String version) {
|
||||||
|
this.availableVersions.add(version);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -579,7 +704,7 @@ public class Dependency implements Serializable, Comparable<Dependency> {
|
|||||||
* @return an integer representing the natural ordering
|
* @return an integer representing the natural ordering
|
||||||
*/
|
*/
|
||||||
public int compareTo(Dependency o) {
|
public int compareTo(Dependency o) {
|
||||||
return this.getFileName().compareToIgnoreCase(o.getFileName());
|
return this.getFilePath().compareToIgnoreCase(o.getFilePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -640,6 +765,15 @@ public class Dependency implements Serializable, Comparable<Dependency> {
|
|||||||
&& (this.relatedDependencies == null || !this.relatedDependencies.equals(other.relatedDependencies))) {
|
&& (this.relatedDependencies == null || !this.relatedDependencies.equals(other.relatedDependencies))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (this.projectReferences != other.projectReferences
|
||||||
|
&& (this.projectReferences == null || !this.projectReferences.equals(other.projectReferences))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (this.availableVersions != other.availableVersions
|
||||||
|
&& (this.availableVersions == null || !this.availableVersions.equals(other.availableVersions))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -665,6 +799,8 @@ public class Dependency implements Serializable, Comparable<Dependency> {
|
|||||||
hash = 47 * hash + (this.license != null ? this.license.hashCode() : 0);
|
hash = 47 * hash + (this.license != null ? this.license.hashCode() : 0);
|
||||||
hash = 47 * hash + (this.vulnerabilities != null ? this.vulnerabilities.hashCode() : 0);
|
hash = 47 * hash + (this.vulnerabilities != null ? this.vulnerabilities.hashCode() : 0);
|
||||||
hash = 47 * hash + (this.relatedDependencies != null ? this.relatedDependencies.hashCode() : 0);
|
hash = 47 * hash + (this.relatedDependencies != null ? this.relatedDependencies.hashCode() : 0);
|
||||||
|
hash = 47 * hash + (this.projectReferences != null ? this.projectReferences.hashCode() : 0);
|
||||||
|
hash = 47 * hash + (this.availableVersions != null ? this.availableVersions.hashCode() : 0);
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,15 @@ import java.io.Serializable;
|
|||||||
*/
|
*/
|
||||||
public class Identifier implements Serializable, Comparable<Identifier> {
|
public class Identifier implements Serializable, Comparable<Identifier> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor. Should only be used for automatic class
|
||||||
|
* creation as is the case with many XML parsers (for the parsing
|
||||||
|
* of the Dependency-Check XML report). For all other use-cases,
|
||||||
|
* please use the non-default constructors.
|
||||||
|
*/
|
||||||
|
public Identifier() {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new Identifier with the specified data.
|
* Constructs a new Identifier with the specified data.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -0,0 +1,226 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of dependency-check-core.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Jeremy Long. All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.owasp.dependencycheck.jaxb.pom;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import javax.xml.bind.JAXBContext;
|
||||||
|
import javax.xml.bind.JAXBElement;
|
||||||
|
import javax.xml.bind.JAXBException;
|
||||||
|
import javax.xml.bind.Unmarshaller;
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import javax.xml.parsers.SAXParser;
|
||||||
|
import javax.xml.parsers.SAXParserFactory;
|
||||||
|
import javax.xml.transform.sax.SAXSource;
|
||||||
|
|
||||||
|
import org.owasp.dependencycheck.analyzer.JarAnalyzer;
|
||||||
|
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
|
||||||
|
import org.owasp.dependencycheck.dependency.Confidence;
|
||||||
|
import org.owasp.dependencycheck.dependency.Dependency;
|
||||||
|
import org.owasp.dependencycheck.jaxb.pom.generated.Model;
|
||||||
|
import org.owasp.dependencycheck.jaxb.pom.generated.Organization;
|
||||||
|
import org.xml.sax.InputSource;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
import org.xml.sax.XMLFilter;
|
||||||
|
import org.xml.sax.XMLReader;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author jeremy
|
||||||
|
*/
|
||||||
|
public class PomUtils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The logger.
|
||||||
|
*/
|
||||||
|
private static final Logger LOGGER = Logger.getLogger(PomUtils.class.getName());
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The unmarshaller used to parse the pom.xml from a JAR file.
|
||||||
|
*/
|
||||||
|
private Unmarshaller pomUnmarshaller;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new POM Utility.
|
||||||
|
*/
|
||||||
|
public PomUtils() {
|
||||||
|
try {
|
||||||
|
//final JAXBContext jaxbContext = JAXBContext.newInstance("org.owasp.dependencycheck.jaxb.pom.generated");
|
||||||
|
final JAXBContext jaxbContext = JAXBContext.newInstance(Model.class);
|
||||||
|
pomUnmarshaller = jaxbContext.createUnmarshaller();
|
||||||
|
} catch (JAXBException ex) { //guess we will just have a null pointer exception later...
|
||||||
|
LOGGER.log(Level.SEVERE, "Unable to load parser. See the log for more details.");
|
||||||
|
LOGGER.log(Level.FINE, null, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads in the specified POM and converts it to a Model.
|
||||||
|
*
|
||||||
|
* @param file the pom.xml file
|
||||||
|
* @return returns a
|
||||||
|
* @throws AnalysisException is thrown if there is an exception extracting or parsing the POM
|
||||||
|
* {@link org.owasp.dependencycheck.jaxb.pom.generated.Model} object
|
||||||
|
*/
|
||||||
|
public Model readPom(File file) throws AnalysisException {
|
||||||
|
Model model = null;
|
||||||
|
try {
|
||||||
|
final FileInputStream stream = new FileInputStream(file);
|
||||||
|
final InputStreamReader reader = new InputStreamReader(stream, "UTF-8");
|
||||||
|
final InputSource xml = new InputSource(reader);
|
||||||
|
final SAXSource source = new SAXSource(xml);
|
||||||
|
model = readPom(source);
|
||||||
|
} catch (SecurityException ex) {
|
||||||
|
final String msg = String.format("Unable to parse pom '%s'; invalid signature", file.getPath());
|
||||||
|
LOGGER.log(Level.WARNING, msg);
|
||||||
|
LOGGER.log(Level.FINE, "", ex);
|
||||||
|
throw new AnalysisException(ex);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
final String msg = String.format("Unable to parse pom '%s'(IO Exception)", file.getPath());
|
||||||
|
LOGGER.log(Level.WARNING, msg);
|
||||||
|
LOGGER.log(Level.FINE, "", ex);
|
||||||
|
throw new AnalysisException(ex);
|
||||||
|
} catch (Throwable ex) {
|
||||||
|
final String msg = String.format("Unexpected error during parsing of the pom '%s'", file.getPath());
|
||||||
|
LOGGER.log(Level.WARNING, msg);
|
||||||
|
LOGGER.log(Level.FINE, "", ex);
|
||||||
|
throw new AnalysisException(ex);
|
||||||
|
}
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the specified POM from a jar file and converts it to a Model.
|
||||||
|
*
|
||||||
|
* @param source the SAXSource input stream to read the POM from
|
||||||
|
* @return returns the POM object
|
||||||
|
* @throws AnalysisException is thrown if there is an exception extracting or parsing the POM
|
||||||
|
* {@link org.owasp.dependencycheck.jaxb.pom.generated.Model} object
|
||||||
|
*/
|
||||||
|
public Model readPom(SAXSource source) throws AnalysisException {
|
||||||
|
Model model = null;
|
||||||
|
try {
|
||||||
|
final XMLFilter filter = new MavenNamespaceFilter();
|
||||||
|
final SAXParserFactory spf = SAXParserFactory.newInstance();
|
||||||
|
final SAXParser sp = spf.newSAXParser();
|
||||||
|
final XMLReader xr = sp.getXMLReader();
|
||||||
|
filter.setParent(xr);
|
||||||
|
final JAXBElement<Model> el = pomUnmarshaller.unmarshal(source, Model.class);
|
||||||
|
model = el.getValue();
|
||||||
|
} catch (SecurityException ex) {
|
||||||
|
throw new AnalysisException(ex);
|
||||||
|
} catch (ParserConfigurationException ex) {
|
||||||
|
throw new AnalysisException(ex);
|
||||||
|
} catch (SAXException ex) {
|
||||||
|
throw new AnalysisException(ex);
|
||||||
|
} catch (JAXBException ex) {
|
||||||
|
throw new AnalysisException(ex);
|
||||||
|
} catch (Throwable ex) {
|
||||||
|
throw new AnalysisException(ex);
|
||||||
|
}
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads in the pom file and adds elements as evidence to the given dependency.
|
||||||
|
*
|
||||||
|
* @param dependency the dependency being analyzed
|
||||||
|
* @param pomFile the pom file to read
|
||||||
|
* @throws AnalysisException is thrown if there is an exception parsing the pom
|
||||||
|
*/
|
||||||
|
public void analyzePOM(Dependency dependency, File pomFile) throws AnalysisException {
|
||||||
|
final Model pom = this.readPom(pomFile);
|
||||||
|
|
||||||
|
String groupid = pom.getGroupId();
|
||||||
|
String parentGroupId = null;
|
||||||
|
|
||||||
|
if (pom.getParent() != null) {
|
||||||
|
parentGroupId = pom.getParent().getGroupId();
|
||||||
|
if ((groupid == null || groupid.isEmpty()) && parentGroupId != null && !parentGroupId.isEmpty()) {
|
||||||
|
groupid = parentGroupId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (groupid != null && !groupid.isEmpty()) {
|
||||||
|
dependency.getVendorEvidence().addEvidence("pom", "groupid", groupid, Confidence.HIGHEST);
|
||||||
|
dependency.getProductEvidence().addEvidence("pom", "groupid", groupid, Confidence.LOW);
|
||||||
|
if (parentGroupId != null && !parentGroupId.isEmpty() && !parentGroupId.equals(groupid)) {
|
||||||
|
dependency.getVendorEvidence().addEvidence("pom", "parent-groupid", parentGroupId, Confidence.MEDIUM);
|
||||||
|
dependency.getProductEvidence().addEvidence("pom", "parent-groupid", parentGroupId, Confidence.LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String artifactid = pom.getArtifactId();
|
||||||
|
String parentArtifactId = null;
|
||||||
|
if (pom.getParent() != null) {
|
||||||
|
parentArtifactId = pom.getParent().getArtifactId();
|
||||||
|
if ((artifactid == null || artifactid.isEmpty()) && parentArtifactId != null && !parentArtifactId.isEmpty()) {
|
||||||
|
artifactid = parentArtifactId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (artifactid != null && !artifactid.isEmpty()) {
|
||||||
|
if (artifactid.startsWith("org.") || artifactid.startsWith("com.")) {
|
||||||
|
artifactid = artifactid.substring(4);
|
||||||
|
}
|
||||||
|
dependency.getProductEvidence().addEvidence("pom", "artifactid", artifactid, Confidence.HIGHEST);
|
||||||
|
dependency.getVendorEvidence().addEvidence("pom", "artifactid", artifactid, Confidence.LOW);
|
||||||
|
if (parentArtifactId != null && !parentArtifactId.isEmpty() && !parentArtifactId.equals(artifactid)) {
|
||||||
|
dependency.getProductEvidence().addEvidence("pom", "parent-artifactid", parentArtifactId, Confidence.MEDIUM);
|
||||||
|
dependency.getVendorEvidence().addEvidence("pom", "parent-artifactid", parentArtifactId, Confidence.LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//version
|
||||||
|
String version = pom.getVersion();
|
||||||
|
String parentVersion = null;
|
||||||
|
if (pom.getParent() != null) {
|
||||||
|
parentVersion = pom.getParent().getVersion();
|
||||||
|
if ((version == null || version.isEmpty()) && parentVersion != null && !parentVersion.isEmpty()) {
|
||||||
|
version = parentVersion;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (version != null && !version.isEmpty()) {
|
||||||
|
dependency.getVersionEvidence().addEvidence("pom", "version", version, Confidence.HIGHEST);
|
||||||
|
if (parentVersion != null && !parentVersion.isEmpty() && !parentVersion.equals(version)) {
|
||||||
|
dependency.getVersionEvidence().addEvidence("pom", "parent-version", version, Confidence.LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final Organization org = pom.getOrganization();
|
||||||
|
if (org != null) {
|
||||||
|
final String orgName = org.getName();
|
||||||
|
if (orgName != null && !orgName.isEmpty()) {
|
||||||
|
dependency.getVendorEvidence().addEvidence("pom", "organization name", orgName, Confidence.HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String pomName = pom.getName();
|
||||||
|
if (pomName != null && !pomName.isEmpty()) {
|
||||||
|
dependency.getProductEvidence().addEvidence("pom", "name", pomName, Confidence.HIGH);
|
||||||
|
dependency.getVendorEvidence().addEvidence("pom", "name", pomName, Confidence.HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pom.getDescription() != null) {
|
||||||
|
final String description = pom.getDescription();
|
||||||
|
if (description != null && !description.isEmpty()) {
|
||||||
|
JarAnalyzer.addDescription(dependency, description, "pom", "description");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JarAnalyzer.extractLicense(pom, null, dependency);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -31,7 +31,7 @@ import javax.xml.namespace.QName;
|
|||||||
@XmlRegistry
|
@XmlRegistry
|
||||||
public class ObjectFactory {
|
public class ObjectFactory {
|
||||||
|
|
||||||
private final static QName _Project_QNAME = new QName("http://maven.apache.org/POM/4.0.0", "project");
|
private static final QName _Project_QNAME = new QName("http://maven.apache.org/POM/4.0.0", "project");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.owasp.dependencycheck.analyzer.pom.generated
|
* Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.owasp.dependencycheck.analyzer.pom.generated
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ public class ReportGenerator {
|
|||||||
context.put("scanDate", scanDate);
|
context.put("scanDate", scanDate);
|
||||||
context.put("scanDateXML", scanDateXML);
|
context.put("scanDateXML", scanDateXML);
|
||||||
context.put("enc", enc);
|
context.put("enc", enc);
|
||||||
context.put("version", Settings.getString("application.version", "Unknown"));
|
context.put("version", Settings.getString(Settings.KEYS.APPLICATION_VERSION, "Unknown"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -137,6 +137,26 @@ public class ReportGenerator {
|
|||||||
return new VelocityContext();
|
return new VelocityContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates the Dependency Reports for the identified dependencies.
|
||||||
|
*
|
||||||
|
* @param outputStream the OutputStream to send the generated report to
|
||||||
|
* @param format the format the report should be written in
|
||||||
|
* @throws IOException is thrown when the template file does not exist
|
||||||
|
* @throws Exception is thrown if there is an error writing out the reports.
|
||||||
|
*/
|
||||||
|
public void generateReports(OutputStream outputStream, Format format) throws IOException, Exception {
|
||||||
|
if (format == Format.XML || format == Format.ALL) {
|
||||||
|
generateReport("XmlReport", outputStream);
|
||||||
|
}
|
||||||
|
if (format == Format.HTML || format == Format.ALL) {
|
||||||
|
generateReport("HtmlReport", outputStream);
|
||||||
|
}
|
||||||
|
if (format == Format.VULN || format == Format.ALL) {
|
||||||
|
generateReport("VulnerabilityReport", outputStream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates the Dependency Reports for the identified dependencies.
|
* Generates the Dependency Reports for the identified dependencies.
|
||||||
*
|
*
|
||||||
@@ -167,15 +187,28 @@ public class ReportGenerator {
|
|||||||
*/
|
*/
|
||||||
public void generateReports(String outputDir, String outputFormat) throws IOException, Exception {
|
public void generateReports(String outputDir, String outputFormat) throws IOException, Exception {
|
||||||
final String format = outputFormat.toUpperCase();
|
final String format = outputFormat.toUpperCase();
|
||||||
|
final String pathToCheck = outputDir.toLowerCase();
|
||||||
if (format.matches("^(XML|HTML|VULN|ALL)$")) {
|
if (format.matches("^(XML|HTML|VULN|ALL)$")) {
|
||||||
if ("XML".equalsIgnoreCase(format)) {
|
if ("XML".equalsIgnoreCase(format)) {
|
||||||
generateReports(outputDir, Format.XML);
|
if (pathToCheck.endsWith(".xml")) {
|
||||||
|
generateReport("XmlReport", outputDir);
|
||||||
|
} else {
|
||||||
|
generateReports(outputDir, Format.XML);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ("HTML".equalsIgnoreCase(format)) {
|
if ("HTML".equalsIgnoreCase(format)) {
|
||||||
generateReports(outputDir, Format.HTML);
|
if (pathToCheck.endsWith(".html") || pathToCheck.endsWith(".htm")) {
|
||||||
|
generateReport("HtmlReport", outputDir);
|
||||||
|
} else {
|
||||||
|
generateReports(outputDir, Format.HTML);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ("VULN".equalsIgnoreCase(format)) {
|
if ("VULN".equalsIgnoreCase(format)) {
|
||||||
generateReports(outputDir, Format.VULN);
|
if (pathToCheck.endsWith(".html") || pathToCheck.endsWith(".htm")) {
|
||||||
|
generateReport("VulnReport", outputDir);
|
||||||
|
} else {
|
||||||
|
generateReports(outputDir, Format.VULN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ("ALL".equalsIgnoreCase(format)) {
|
if ("ALL".equalsIgnoreCase(format)) {
|
||||||
generateReports(outputDir, Format.ALL);
|
generateReports(outputDir, Format.ALL);
|
||||||
@@ -189,11 +222,11 @@ public class ReportGenerator {
|
|||||||
* template file.
|
* template file.
|
||||||
*
|
*
|
||||||
* @param templateName the name of the template to load.
|
* @param templateName the name of the template to load.
|
||||||
* @param outFileName the filename and path to write the report to.
|
* @param outputStream the OutputStream to write the report to.
|
||||||
* @throws IOException is thrown when the template file does not exist.
|
* @throws IOException is thrown when the template file does not exist.
|
||||||
* @throws Exception is thrown when an exception occurs.
|
* @throws Exception is thrown when an exception occurs.
|
||||||
*/
|
*/
|
||||||
protected void generateReport(String templateName, String outFileName) throws IOException, Exception {
|
protected void generateReport(String templateName, OutputStream outputStream) throws IOException, Exception {
|
||||||
InputStream input = null;
|
InputStream input = null;
|
||||||
String templatePath = null;
|
String templatePath = null;
|
||||||
final File f = new File(templateName);
|
final File f = new File(templateName);
|
||||||
@@ -216,18 +249,8 @@ public class ReportGenerator {
|
|||||||
|
|
||||||
final InputStreamReader reader = new InputStreamReader(input, "UTF-8");
|
final InputStreamReader reader = new InputStreamReader(input, "UTF-8");
|
||||||
OutputStreamWriter writer = null;
|
OutputStreamWriter writer = null;
|
||||||
OutputStream outputStream = null;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final File outDir = new File(outFileName).getParentFile();
|
|
||||||
if (!outDir.exists()) {
|
|
||||||
final boolean created = outDir.mkdirs();
|
|
||||||
if (!created) {
|
|
||||||
throw new Exception("Unable to create directory '" + outDir.getAbsolutePath() + "'.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
outputStream = new FileOutputStream(outFileName);
|
|
||||||
writer = new OutputStreamWriter(outputStream, "UTF-8");
|
writer = new OutputStreamWriter(outputStream, "UTF-8");
|
||||||
|
|
||||||
if (!engine.evaluate(context, writer, templatePath, reader)) {
|
if (!engine.evaluate(context, writer, templatePath, reader)) {
|
||||||
@@ -256,4 +279,41 @@ public class ReportGenerator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a report from a given Velocity Template. The template name provided can be the name of a template
|
||||||
|
* contained in the jar file, such as 'XmlReport' or 'HtmlReport', or the template name can be the path to a
|
||||||
|
* template file.
|
||||||
|
*
|
||||||
|
* @param templateName the name of the template to load.
|
||||||
|
* @param outFileName the filename and path to write the report to.
|
||||||
|
* @throws IOException is thrown when the template file does not exist.
|
||||||
|
* @throws Exception is thrown when an exception occurs.
|
||||||
|
*/
|
||||||
|
protected void generateReport(String templateName, String outFileName) throws Exception {
|
||||||
|
File outFile = new File(outFileName);
|
||||||
|
if (outFile.getParentFile() == null) {
|
||||||
|
outFile = new File(".", outFileName);
|
||||||
|
}
|
||||||
|
if (!outFile.getParentFile().exists()) {
|
||||||
|
final boolean created = outFile.getParentFile().mkdirs();
|
||||||
|
if (!created) {
|
||||||
|
throw new Exception("Unable to create directory '" + outFile.getParentFile().getAbsolutePath() + "'.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OutputStream outputSteam = null;
|
||||||
|
try {
|
||||||
|
outputSteam = new FileOutputStream(outFile);
|
||||||
|
generateReport(templateName, outputSteam);
|
||||||
|
} finally {
|
||||||
|
if (outputSteam != null) {
|
||||||
|
try {
|
||||||
|
outputSteam.close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
LOGGER.log(Level.FINEST, "ignore", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,11 +26,6 @@ import java.io.IOException;
|
|||||||
*/
|
*/
|
||||||
public class SuppressionParseException extends IOException {
|
public class SuppressionParseException extends IOException {
|
||||||
|
|
||||||
/**
|
|
||||||
* The serial version UID.
|
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new SuppressionParseException.
|
* Creates a new SuppressionParseException.
|
||||||
*/
|
*/
|
||||||
@@ -50,7 +45,7 @@ public class SuppressionParseException extends IOException {
|
|||||||
/**
|
/**
|
||||||
* Creates a new SuppressionParseException.
|
* Creates a new SuppressionParseException.
|
||||||
*
|
*
|
||||||
* @param ex the cause of the download failure.
|
* @param ex the cause of the parse exception
|
||||||
*/
|
*/
|
||||||
public SuppressionParseException(Throwable ex) {
|
public SuppressionParseException(Throwable ex) {
|
||||||
super(ex);
|
super(ex);
|
||||||
@@ -60,7 +55,7 @@ public class SuppressionParseException extends IOException {
|
|||||||
* Creates a new SuppressionParseException.
|
* Creates a new SuppressionParseException.
|
||||||
*
|
*
|
||||||
* @param msg a message for the exception.
|
* @param msg a message for the exception.
|
||||||
* @param ex the cause of the download failure.
|
* @param ex the cause of the parse exception
|
||||||
*/
|
*/
|
||||||
public SuppressionParseException(String msg, Throwable ex) {
|
public SuppressionParseException(String msg, Throwable ex) {
|
||||||
super(msg, ex);
|
super(msg, ex);
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ public class SuppressionRule {
|
|||||||
* @return whether or not this suppression rule as CPE entries
|
* @return whether or not this suppression rule as CPE entries
|
||||||
*/
|
*/
|
||||||
public boolean hasCpe() {
|
public boolean hasCpe() {
|
||||||
return cpe.size() > 0;
|
return !cpe.isEmpty();
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* The list of cvssBelow scores.
|
* The list of cvssBelow scores.
|
||||||
@@ -152,7 +152,7 @@ public class SuppressionRule {
|
|||||||
* @return whether or not this suppression rule has cvss suppressions
|
* @return whether or not this suppression rule has cvss suppressions
|
||||||
*/
|
*/
|
||||||
public boolean hasCvssBelow() {
|
public boolean hasCvssBelow() {
|
||||||
return cvssBelow.size() > 0;
|
return !cvssBelow.isEmpty();
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* The list of cwe entries to suppress.
|
* The list of cwe entries to suppress.
|
||||||
@@ -192,7 +192,7 @@ public class SuppressionRule {
|
|||||||
* @return whether this suppression rule has CWE entries
|
* @return whether this suppression rule has CWE entries
|
||||||
*/
|
*/
|
||||||
public boolean hasCwe() {
|
public boolean hasCwe() {
|
||||||
return cwe.size() > 0;
|
return !cwe.isEmpty();
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* The list of cve entries to suppress.
|
* The list of cve entries to suppress.
|
||||||
@@ -232,7 +232,7 @@ public class SuppressionRule {
|
|||||||
* @return whether this suppression rule has CVE entries
|
* @return whether this suppression rule has CVE entries
|
||||||
*/
|
*/
|
||||||
public boolean hasCve() {
|
public boolean hasCve() {
|
||||||
return cve.size() > 0;
|
return !cve.isEmpty();
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* A Maven GAV to suppression.
|
* A Maven GAV to suppression.
|
||||||
@@ -266,10 +266,14 @@ public class SuppressionRule {
|
|||||||
return gav != null;
|
return gav != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A flag indicating whether or not the suppression rule is a core/base rule that should not be included in the
|
||||||
|
* resulting report in the "suppressed" section.
|
||||||
|
*/
|
||||||
private boolean base;
|
private boolean base;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the value of base
|
* Get the value of base.
|
||||||
*
|
*
|
||||||
* @return the value of base
|
* @return the value of base
|
||||||
*/
|
*/
|
||||||
@@ -278,7 +282,7 @@ public class SuppressionRule {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the value of base
|
* Set the value of base.
|
||||||
*
|
*
|
||||||
* @param base new value of base
|
* @param base new value of base
|
||||||
*/
|
*/
|
||||||
@@ -446,28 +450,28 @@ public class SuppressionRule {
|
|||||||
if (gav != null) {
|
if (gav != null) {
|
||||||
sb.append("gav=").append(gav).append(",");
|
sb.append("gav=").append(gav).append(",");
|
||||||
}
|
}
|
||||||
if (cpe != null && cpe.size() > 0) {
|
if (cpe != null && !cpe.isEmpty()) {
|
||||||
sb.append("cpe={");
|
sb.append("cpe={");
|
||||||
for (PropertyType pt : cpe) {
|
for (PropertyType pt : cpe) {
|
||||||
sb.append(pt).append(",");
|
sb.append(pt).append(",");
|
||||||
}
|
}
|
||||||
sb.append("}");
|
sb.append("}");
|
||||||
}
|
}
|
||||||
if (cwe != null && cwe.size() > 0) {
|
if (cwe != null && !cwe.isEmpty()) {
|
||||||
sb.append("cwe={");
|
sb.append("cwe={");
|
||||||
for (String s : cwe) {
|
for (String s : cwe) {
|
||||||
sb.append(s).append(",");
|
sb.append(s).append(",");
|
||||||
}
|
}
|
||||||
sb.append("}");
|
sb.append("}");
|
||||||
}
|
}
|
||||||
if (cve != null && cve.size() > 0) {
|
if (cve != null && !cve.isEmpty()) {
|
||||||
sb.append("cve={");
|
sb.append("cve={");
|
||||||
for (String s : cve) {
|
for (String s : cve) {
|
||||||
sb.append(s).append(",");
|
sb.append(s).append(",");
|
||||||
}
|
}
|
||||||
sb.append("}");
|
sb.append("}");
|
||||||
}
|
}
|
||||||
if (cvssBelow != null && cvssBelow.size() > 0) {
|
if (cvssBelow != null && !cvssBelow.isEmpty()) {
|
||||||
sb.append("cvssBelow={");
|
sb.append("cvssBelow={");
|
||||||
for (Float s : cvssBelow) {
|
for (Float s : cvssBelow) {
|
||||||
sb.append(s).append(",");
|
sb.append(s).append(",");
|
||||||
|
|||||||
@@ -54,7 +54,9 @@ public final class DBUtils {
|
|||||||
int id = 0;
|
int id = 0;
|
||||||
try {
|
try {
|
||||||
rs = statement.getGeneratedKeys();
|
rs = statement.getGeneratedKeys();
|
||||||
rs.next();
|
if (!rs.next()) {
|
||||||
|
throw new DatabaseException("Unable to get primary key for inserted row");
|
||||||
|
}
|
||||||
id = rs.getInt(1);
|
id = rs.getInt(1);
|
||||||
} catch (SQLException ex) {
|
} catch (SQLException ex) {
|
||||||
throw new DatabaseException("Unable to get primary key for inserted row");
|
throw new DatabaseException("Unable to get primary key for inserted row");
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of dependency-check-core.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 Jeremy Long. All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.owasp.dependencycheck.utils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Jeremy Long <jeremy.long@owasp.org>
|
||||||
|
*/
|
||||||
|
public final class DateUtil {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Private constructor for utility class.
|
||||||
|
*/
|
||||||
|
private DateUtil() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if the epoch date is within the range specified of the compareTo epoch time. This takes the
|
||||||
|
* (compareTo-date)/1000/60/60/24 to get the number of days. If the calculated days is less then the range the date
|
||||||
|
* is considered valid.
|
||||||
|
*
|
||||||
|
* @param date the date to be checked.
|
||||||
|
* @param compareTo the date to compare to.
|
||||||
|
* @param range the range in days to be considered valid.
|
||||||
|
* @return whether or not the date is within the range.
|
||||||
|
*/
|
||||||
|
public static boolean withinDateRange(long date, long compareTo, int range) {
|
||||||
|
final double differenceInDays = (compareTo - date) / 1000.0 / 60.0 / 60.0 / 24.0;
|
||||||
|
return differenceInDays < range;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -65,7 +65,7 @@ public class DependencyVersion implements Iterable, Comparable<DependencyVersion
|
|||||||
public final void parseVersion(String version) {
|
public final void parseVersion(String version) {
|
||||||
versionParts = new ArrayList<String>();
|
versionParts = new ArrayList<String>();
|
||||||
if (version != null) {
|
if (version != null) {
|
||||||
final Pattern rx = Pattern.compile("(\\d+|[a-z]+\\d+|(release|beta|alpha)$)");
|
final Pattern rx = Pattern.compile("(\\d+[a-z]{1,3}$|[a-z]+\\d+|\\d+|(release|beta|alpha)$)");
|
||||||
final Matcher matcher = rx.matcher(version.toLowerCase());
|
final Matcher matcher = rx.matcher(version.toLowerCase());
|
||||||
while (matcher.find()) {
|
while (matcher.find()) {
|
||||||
versionParts.add(matcher.group());
|
versionParts.add(matcher.group());
|
||||||
@@ -198,8 +198,8 @@ public class DependencyVersion implements Iterable, Comparable<DependencyVersion
|
|||||||
|
|
||||||
boolean ret = true;
|
boolean ret = true;
|
||||||
for (int i = 0; i < max; i++) {
|
for (int i = 0; i < max; i++) {
|
||||||
String thisVersion = this.versionParts.get(i);
|
final String thisVersion = this.versionParts.get(i);
|
||||||
String otherVersion = version.getVersionParts().get(i);
|
final String otherVersion = version.getVersionParts().get(i);
|
||||||
if (i >= 3) {
|
if (i >= 3) {
|
||||||
if (thisVersion.compareToIgnoreCase(otherVersion) >= 0) {
|
if (thisVersion.compareToIgnoreCase(otherVersion) >= 0) {
|
||||||
ret = false;
|
ret = false;
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
package org.owasp.dependencycheck.utils;
|
package org.owasp.dependencycheck.utils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@@ -32,7 +33,7 @@ public final class DependencyVersionUtil {
|
|||||||
/**
|
/**
|
||||||
* Regular expression to extract version numbers from file names.
|
* Regular expression to extract version numbers from file names.
|
||||||
*/
|
*/
|
||||||
private static final Pattern RX_VERSION = Pattern.compile("\\d+(\\.\\d{1,6})+(\\.?([_-](release|beta|alpha)|[a-zA-Z_-]{1,3}\\d{1,8}))?");
|
private static final Pattern RX_VERSION = Pattern.compile("\\d+(\\.\\d{1,6})+(\\.?([_-](release|beta|alpha|\\d+)|[a-zA-Z_-]{1,3}\\d{0,8}))?");
|
||||||
/**
|
/**
|
||||||
* Regular expression to extract a single version number without periods. This is a last ditch effort just to check
|
* Regular expression to extract a single version number without periods. This is a last ditch effort just to check
|
||||||
* in case we are missing a version number using the previous regex.
|
* in case we are missing a version number using the previous regex.
|
||||||
@@ -62,7 +63,7 @@ public final class DependencyVersionUtil {
|
|||||||
//'-' is a special case used within the CVE entries, just include it as the version.
|
//'-' is a special case used within the CVE entries, just include it as the version.
|
||||||
if ("-".equals(text)) {
|
if ("-".equals(text)) {
|
||||||
final DependencyVersion dv = new DependencyVersion();
|
final DependencyVersion dv = new DependencyVersion();
|
||||||
final ArrayList<String> list = new ArrayList<String>();
|
final List<String> list = new ArrayList<String>();
|
||||||
list.add(text);
|
list.add(text);
|
||||||
dv.setVersionParts(list);
|
dv.setVersionParts(list);
|
||||||
return dv;
|
return dv;
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ public final class ExtractionUtil {
|
|||||||
fos = new FileOutputStream(file);
|
fos = new FileOutputStream(file);
|
||||||
bos = new BufferedOutputStream(fos, BUFFER_SIZE);
|
bos = new BufferedOutputStream(fos, BUFFER_SIZE);
|
||||||
int count;
|
int count;
|
||||||
final byte data[] = new byte[BUFFER_SIZE];
|
final byte[] data = new byte[BUFFER_SIZE];
|
||||||
while ((count = zis.read(data, 0, BUFFER_SIZE)) != -1) {
|
while ((count = zis.read(data, 0, BUFFER_SIZE)) != -1) {
|
||||||
bos.write(data, 0, count);
|
bos.write(data, 0, count);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -68,7 +69,7 @@ public final class UrlStringUtils {
|
|||||||
/**
|
/**
|
||||||
* A listing of domain parts that should not be used as evidence. Yes, this is an incomplete list.
|
* A listing of domain parts that should not be used as evidence. Yes, this is an incomplete list.
|
||||||
*/
|
*/
|
||||||
private static final HashSet<String> IGNORE_LIST = new HashSet<String>(
|
private static final Set<String> IGNORE_LIST = new HashSet<String>(
|
||||||
Arrays.asList("www", "com", "org", "gov", "info", "name", "net", "pro", "tel", "mobi", "xxx"));
|
Arrays.asList("www", "com", "org", "gov", "info", "name", "net", "pro", "tel", "mobi", "xxx"));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -86,7 +87,7 @@ public final class UrlStringUtils {
|
|||||||
* @throws MalformedURLException thrown if the URL is malformed
|
* @throws MalformedURLException thrown if the URL is malformed
|
||||||
*/
|
*/
|
||||||
public static List<String> extractImportantUrlData(String text) throws MalformedURLException {
|
public static List<String> extractImportantUrlData(String text) throws MalformedURLException {
|
||||||
final ArrayList<String> importantParts = new ArrayList<String>();
|
final List<String> importantParts = new ArrayList<String>();
|
||||||
final URL url = new URL(text);
|
final URL url = new URL(text);
|
||||||
final String[] domain = url.getHost().split("\\.");
|
final String[] domain = url.getHost().split("\\.");
|
||||||
//add the domain except www and the tld.
|
//add the domain except www and the tld.
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ org.owasp.dependencycheck.analyzer.CpeSuppressionAnalyzer
|
|||||||
org.owasp.dependencycheck.analyzer.DependencyBundlingAnalyzer
|
org.owasp.dependencycheck.analyzer.DependencyBundlingAnalyzer
|
||||||
org.owasp.dependencycheck.analyzer.NvdCveAnalyzer
|
org.owasp.dependencycheck.analyzer.NvdCveAnalyzer
|
||||||
org.owasp.dependencycheck.analyzer.VulnerabilitySuppressionAnalyzer
|
org.owasp.dependencycheck.analyzer.VulnerabilitySuppressionAnalyzer
|
||||||
|
org.owasp.dependencycheck.analyzer.CentralAnalyzer
|
||||||
org.owasp.dependencycheck.analyzer.NexusAnalyzer
|
org.owasp.dependencycheck.analyzer.NexusAnalyzer
|
||||||
org.owasp.dependencycheck.analyzer.NuspecAnalyzer
|
org.owasp.dependencycheck.analyzer.NuspecAnalyzer
|
||||||
org.owasp.dependencycheck.analyzer.AssemblyAnalyzer
|
org.owasp.dependencycheck.analyzer.AssemblyAnalyzer
|
||||||
@@ -1 +1,2 @@
|
|||||||
org.owasp.dependencycheck.data.update.NvdCveUpdater
|
org.owasp.dependencycheck.data.update.NvdCveUpdater
|
||||||
|
org.owasp.dependencycheck.data.update.EngineVersionCheck
|
||||||
@@ -9,6 +9,15 @@
|
|||||||
<cpe>cpe:/a:springsource:spring_framework</cpe>
|
<cpe>cpe:/a:springsource:spring_framework</cpe>
|
||||||
<cpe>cpe:/a:vmware:springsource_spring_framework</cpe>
|
<cpe>cpe:/a:vmware:springsource_spring_framework</cpe>
|
||||||
</suppress>
|
</suppress>
|
||||||
|
<suppress base="true">
|
||||||
|
<notes><![CDATA[
|
||||||
|
This suppresses false positives identified on spring security.
|
||||||
|
]]></notes>
|
||||||
|
<filePath regex="true">.*spring-security-[^\\/]*\.jar$</filePath>
|
||||||
|
<cpe>cpe:/a:mod_security:mod_security</cpe>
|
||||||
|
<cpe>cpe:/a:springsource:spring_framework</cpe>
|
||||||
|
<cpe>cpe:/a:vmware:springsource_spring_framework</cpe>
|
||||||
|
</suppress>
|
||||||
<suppress base="true">
|
<suppress base="true">
|
||||||
<notes><![CDATA[
|
<notes><![CDATA[
|
||||||
This suppreses additional false positives for the xstream library that occur because spring has a copy of this library.
|
This suppreses additional false positives for the xstream library that occur because spring has a copy of this library.
|
||||||
@@ -35,7 +44,44 @@
|
|||||||
<notes><![CDATA[
|
<notes><![CDATA[
|
||||||
Suppresses false positives on Jersey core client.
|
Suppresses false positives on Jersey core client.
|
||||||
]]></notes>
|
]]></notes>
|
||||||
<gav regex="true">org\.glassfish\.jersey\.core:jersey-(client|common):.*</gav>
|
<gav regex="true">(com\.sun\.jersey|org\.glassfish\.jersey\.core):jersey-(client|common):.*</gav>
|
||||||
|
<cpe>cpe:/a:oracle:glassfish</cpe>
|
||||||
|
<cpe>cpe:/a:oracle:oracle_client</cpe>
|
||||||
|
</suppress>
|
||||||
|
<suppress base="true">
|
||||||
|
<notes><![CDATA[
|
||||||
|
Suppresses false positives on the grizzly-framework
|
||||||
|
]]></notes>
|
||||||
|
<gav regex="true">org\.glassfish\.grizzly:grizzly-framework:.*</gav>
|
||||||
<cpe>cpe:/a:oracle:glassfish</cpe>
|
<cpe>cpe:/a:oracle:glassfish</cpe>
|
||||||
</suppress>
|
</suppress>
|
||||||
|
<suppress base="true">
|
||||||
|
<notes><![CDATA[
|
||||||
|
Suppresses false positives on the grizzly-framework
|
||||||
|
]]></notes>
|
||||||
|
<gav regex="true">org\.forgerock\.opendj:opendj-ldap-sdk:.*</gav>
|
||||||
|
<cpe>cpe:/a:ldap_project:ldap</cpe>
|
||||||
|
</suppress>
|
||||||
|
<suppress base="true">
|
||||||
|
<notes><![CDATA[
|
||||||
|
Suppresses false positives on the org.opensaml:xmltooling
|
||||||
|
]]></notes>
|
||||||
|
<gav regex="true">org\.opensaml:xmltooling:.*</gav>
|
||||||
|
<cpe>cpe:/a:shibboleth:opensaml</cpe>
|
||||||
|
</suppress>
|
||||||
|
<suppress base="true">
|
||||||
|
<notes><![CDATA[
|
||||||
|
Suppresses false positives on the org.opensaml:openws
|
||||||
|
]]></notes>
|
||||||
|
<gav regex="true">org\.opensaml:openws:.*</gav>
|
||||||
|
<cpe>cpe:/a:internet2:opensaml</cpe>
|
||||||
|
</suppress>
|
||||||
|
<suppress base="true">
|
||||||
|
<notes><![CDATA[
|
||||||
|
Suppresses false positives on the org.opensaml:xmltooling
|
||||||
|
]]></notes>
|
||||||
|
<gav regex="true">org\.opensaml:xmltooling:.*</gav>
|
||||||
|
<cpe>cpe:/a:internet2:opensaml</cpe>
|
||||||
|
</suppress>
|
||||||
|
|
||||||
</suppressions>
|
</suppressions>
|
||||||
@@ -3,6 +3,9 @@ application.version=${pom.version}
|
|||||||
autoupdate=true
|
autoupdate=true
|
||||||
max.download.threads=3
|
max.download.threads=3
|
||||||
|
|
||||||
|
# the url to obtain the current engine version from
|
||||||
|
engine.version.url=http://jeremylong.github.io/DependencyCheck/current.txt
|
||||||
|
|
||||||
#temp.directory defaults to System.getProperty("java.io.tmpdir")
|
#temp.directory defaults to System.getProperty("java.io.tmpdir")
|
||||||
#temp.directory=[path to temp directory]
|
#temp.directory=[path to temp directory]
|
||||||
|
|
||||||
@@ -40,11 +43,16 @@ data.driver_path=
|
|||||||
cve.url.modified.validfordays=7
|
cve.url.modified.validfordays=7
|
||||||
|
|
||||||
# the path to the modified nvd cve xml file.
|
# the path to the modified nvd cve xml file.
|
||||||
cve.url-1.2.modified=http://nvd.nist.gov/download/nvdcve-modified.xml
|
cve.url-1.2.modified=https://nvd.nist.gov/download/nvdcve-Modified.xml.gz
|
||||||
cve.url-2.0.modified=http://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-modified.xml
|
#cve.url-1.2.modified=http://nvd.nist.gov/download/nvdcve-modified.xml
|
||||||
|
cve.url-2.0.modified=https://nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-Modified.xml.gz
|
||||||
|
#cve.url-2.0.modified=http://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-modified.xml
|
||||||
cve.startyear=2002
|
cve.startyear=2002
|
||||||
cve.url-2.0.base=http://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-%d.xml
|
cve.url-1.2.base=https://nvd.nist.gov/download/nvdcve-%d.xml.gz
|
||||||
cve.url-1.2.base=http://nvd.nist.gov/download/nvdcve-%d.xml
|
#cve.url-1.2.base=http://nvd.nist.gov/download/nvdcve-%d.xml
|
||||||
|
cve.url-2.0.base=https://nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-%d.xml.gz
|
||||||
|
#cve.url-2.0.base=http://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-%d.xml
|
||||||
|
|
||||||
|
|
||||||
# file type analyzer settings:
|
# file type analyzer settings:
|
||||||
analyzer.archive.enabled=true
|
analyzer.archive.enabled=true
|
||||||
@@ -58,3 +66,7 @@ analyzer.nexus.url=https://repository.sonatype.org/service/local/
|
|||||||
# If set to true, the proxy will still ONLY be used if the proxy properties (proxy.url, proxy.port)
|
# If set to true, the proxy will still ONLY be used if the proxy properties (proxy.url, proxy.port)
|
||||||
# are configured
|
# are configured
|
||||||
analyzer.nexus.proxy=true
|
analyzer.nexus.proxy=true
|
||||||
|
|
||||||
|
# the URL for searching search.maven.org for SHA-1 and whether it's enabled
|
||||||
|
analyzer.central.enabled=true
|
||||||
|
analyzer.central.url=http://search.maven.org/solrsearch/select
|
||||||
|
|||||||
@@ -534,7 +534,7 @@ arising out of or in connection with the use of this tool, the analysis performe
|
|||||||
<li class="scaninfo hidden"><i>$enc.html($prop.key)</i>: $enc.html($prop.value)</li>
|
<li class="scaninfo hidden"><i>$enc.html($prop.key)</i>: $enc.html($prop.value)</li>
|
||||||
#end
|
#end
|
||||||
</ul><br/>
|
</ul><br/>
|
||||||
Display: <a href="#" title="Click to toggle display" onclick="return toggleDisplay(this, '.notvulnerable', 'Showing Vulnerable Dependencies', 'Showing All Dependencies'); return false;">Showing Vulnerable Dependencies</a><br/><br/>
|
Display: <a href="#" title="Click to toggle display" onclick="return toggleDisplay(this, '.notvulnerable', 'Showing Vulnerable Dependencies (click to show all)', 'Showing All Dependencies (click to show less)'); return false;">Showing Vulnerable Dependencies (click to show all)</a><br/><br/>
|
||||||
#set($lnkcnt=0)
|
#set($lnkcnt=0)
|
||||||
<table class="lined">
|
<table class="lined">
|
||||||
<tr style="text-align:left">
|
<tr style="text-align:left">
|
||||||
@@ -606,22 +606,6 @@ arising out of or in connection with the use of this tool, the analysis performe
|
|||||||
</tr>
|
</tr>
|
||||||
#end
|
#end
|
||||||
</table>
|
</table>
|
||||||
## <ul class="indent">
|
|
||||||
## #set($lnkcnt=0)
|
|
||||||
## #foreach($dependency in $dependencies)
|
|
||||||
## #set($lnkcnt=$lnkcnt+1)
|
|
||||||
## <li class="#if($dependency.getVulnerabilities().size()==0)notvulnerable#else vulnerable#end">
|
|
||||||
## <a href="#l${lnkcnt}_$enc.html($enc.url($dependency.Sha1sum))">$enc.html($dependency.DisplayFileName)</a>
|
|
||||||
## #if($dependency.getRelatedDependencies().size()>0)
|
|
||||||
## <ul>
|
|
||||||
## #foreach($related in $dependency.getRelatedDependencies())
|
|
||||||
## <li>$enc.html($related.DisplayFileName)</li>
|
|
||||||
## #end
|
|
||||||
## </ul>
|
|
||||||
## #end
|
|
||||||
## </li>
|
|
||||||
## #end
|
|
||||||
## </ul>
|
|
||||||
<h2>Dependencies</h2>
|
<h2>Dependencies</h2>
|
||||||
#set($lnkcnt=0)
|
#set($lnkcnt=0)
|
||||||
#set($cnt=0)
|
#set($cnt=0)
|
||||||
@@ -644,6 +628,19 @@ arising out of or in connection with the use of this tool, the analysis performe
|
|||||||
<b>File Path:</b> $enc.html($dependency.FilePath)<br/>
|
<b>File Path:</b> $enc.html($dependency.FilePath)<br/>
|
||||||
<b>MD5:</b> $enc.html($dependency.Md5sum)<br/>
|
<b>MD5:</b> $enc.html($dependency.Md5sum)<br/>
|
||||||
<b>SHA1:</b> $enc.html($dependency.Sha1sum)
|
<b>SHA1:</b> $enc.html($dependency.Sha1sum)
|
||||||
|
#if ($dependency.projectReferences.size()==1)
|
||||||
|
<br/><b>Referenced In Project:</b>
|
||||||
|
#foreach($ref in $dependency.projectReferences)
|
||||||
|
$enc.html($ref)
|
||||||
|
#end
|
||||||
|
#end
|
||||||
|
#if ($dependency.projectReferences.size()>1)
|
||||||
|
<br/><b>Referenced In Projects:</b><ul>
|
||||||
|
#foreach($ref in $dependency.projectReferences)
|
||||||
|
<li>$enc.html($ref)</li>
|
||||||
|
#end
|
||||||
|
</ul>
|
||||||
|
#end
|
||||||
</p>
|
</p>
|
||||||
#set($cnt=$cnt+1)
|
#set($cnt=$cnt+1)
|
||||||
<h4 id="header$cnt" class="subsectionheader expandable expandablesubsection white">Evidence</h4>
|
<h4 id="header$cnt" class="subsectionheader expandable expandablesubsection white">Evidence</h4>
|
||||||
@@ -906,6 +903,6 @@ arising out of or in connection with the use of this tool, the analysis performe
|
|||||||
## END SUPPRESSED VULNERABILITIES
|
## END SUPPRESSED VULNERABILITIES
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div><br/><br/>This report contains data retrieved from the <a href="nvd.nist.gov">National Vulnerability Database</a>.</div>
|
<div><br/><br/>This report contains data retrieved from the <a href="http://nvd.nist.gov">National Vulnerability Database</a>.</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -236,6 +236,6 @@ arising out of or in connection with the use of this tool, the analysis performe
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<p><br/><br/>This report contains data retrieved from the <a href="nvd.nist.gov">National Vulnerability Database</a>.</p>
|
<p><br/><br/>This report contains data retrieved from the <a href="http://nvd.nist.gov">National Vulnerability Database</a>.</p>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -15,7 +15,10 @@
|
|||||||
*/
|
*/
|
||||||
package org.owasp.dependencycheck;
|
package org.owasp.dependencycheck;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.InputStream;
|
||||||
import org.junit.AfterClass;
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.Assume;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.owasp.dependencycheck.utils.Settings;
|
import org.owasp.dependencycheck.utils.Settings;
|
||||||
|
|
||||||
@@ -34,4 +37,31 @@ public class BaseTest {
|
|||||||
public static void tearDownClass() throws Exception {
|
public static void tearDownClass() throws Exception {
|
||||||
Settings.cleanup(true);
|
Settings.cleanup(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the given resource as an InputStream using the object's class loader. The org.junit.Assume API is used so that test
|
||||||
|
* cases are skipped if the resource is not available.
|
||||||
|
*
|
||||||
|
* @param o the object used to obtain a reference to the class loader
|
||||||
|
* @param resource the name of the resource to load
|
||||||
|
* @return the resource as an InputStream
|
||||||
|
*/
|
||||||
|
public static InputStream getResourceAsStream(Object o, String resource) {
|
||||||
|
getResourceAsFile(o, resource);
|
||||||
|
return o.getClass().getClassLoader().getResourceAsStream(resource);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the given resource as a File using the object's class loader. The org.junit.Assume API is used so that test cases
|
||||||
|
* are skipped if the resource is not available.
|
||||||
|
*
|
||||||
|
* @param o the object used to obtain a reference to the class loader
|
||||||
|
* @param resource the name of the resource to load
|
||||||
|
* @return the resource as an File
|
||||||
|
*/
|
||||||
|
public static File getResourceAsFile(Object o, String resource) {
|
||||||
|
File f = new File(o.getClass().getClassLoader().getResource(resource).getPath());
|
||||||
|
Assume.assumeTrue(String.format("%n%n[SEVERE] Unable to load resource for test case: %s%n%n", resource), f.exists());
|
||||||
|
return f;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import org.junit.Before;
|
|||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.owasp.dependencycheck.data.nvdcve.CveDB;
|
import org.owasp.dependencycheck.data.nvdcve.CveDB;
|
||||||
import org.owasp.dependencycheck.data.nvdcve.DatabaseProperties;
|
import org.owasp.dependencycheck.data.nvdcve.DatabaseProperties;
|
||||||
import org.owasp.dependencycheck.dependency.Dependency;
|
|
||||||
import org.owasp.dependencycheck.reporting.ReportGenerator;
|
import org.owasp.dependencycheck.reporting.ReportGenerator;
|
||||||
import org.owasp.dependencycheck.utils.Settings;
|
import org.owasp.dependencycheck.utils.Settings;
|
||||||
|
|
||||||
@@ -42,26 +41,6 @@ public class EngineIntegrationTest extends BaseTest {
|
|||||||
public void tearDown() {
|
public void tearDown() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Test of scan method, of class Engine.
|
|
||||||
*
|
|
||||||
* @throws Exception is thrown when an exception occurs.
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testScan() throws Exception {
|
|
||||||
String testClasses = "target/test-classes/*.zip";
|
|
||||||
boolean autoUpdate = Settings.getBoolean(Settings.KEYS.AUTO_UPDATE);
|
|
||||||
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
|
||||||
Engine instance = new Engine();
|
|
||||||
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, autoUpdate);
|
|
||||||
instance.scan(testClasses);
|
|
||||||
assertTrue(instance.getDependencies().size() > 0);
|
|
||||||
for (Dependency d : instance.getDependencies()) {
|
|
||||||
assertTrue("non-zip file collected " + d.getFileName(), d.getFileName().toLowerCase().endsWith(".zip"));
|
|
||||||
}
|
|
||||||
instance.cleanup();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test running the entire engine.
|
* Test running the entire engine.
|
||||||
*
|
*
|
||||||
@@ -81,8 +60,7 @@ public class EngineIntegrationTest extends BaseTest {
|
|||||||
cveDB.open();
|
cveDB.open();
|
||||||
DatabaseProperties dbProp = cveDB.getDatabaseProperties();
|
DatabaseProperties dbProp = cveDB.getDatabaseProperties();
|
||||||
cveDB.close();
|
cveDB.close();
|
||||||
ReportGenerator rg = new ReportGenerator("DependencyCheck",
|
ReportGenerator rg = new ReportGenerator("DependencyCheck", instance.getDependencies(), instance.getAnalyzers(), dbProp);
|
||||||
instance.getDependencies(), instance.getAnalyzers(), dbProp);
|
|
||||||
rg.generateReports("./target/", "ALL");
|
rg.generateReports("./target/", "ALL");
|
||||||
instance.cleanup();
|
instance.cleanup();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import java.util.Set;
|
|||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.owasp.dependencycheck.BaseTest;
|
||||||
import org.owasp.dependencycheck.Engine;
|
import org.owasp.dependencycheck.Engine;
|
||||||
import org.owasp.dependencycheck.data.cpe.AbstractDatabaseTestCase;
|
import org.owasp.dependencycheck.data.cpe.AbstractDatabaseTestCase;
|
||||||
import org.owasp.dependencycheck.dependency.Dependency;
|
import org.owasp.dependencycheck.dependency.Dependency;
|
||||||
@@ -40,7 +41,7 @@ public class ArchiveAnalyzerIntegrationTest extends AbstractDatabaseTestCase {
|
|||||||
@Test
|
@Test
|
||||||
public void testGetSupportedExtensions() {
|
public void testGetSupportedExtensions() {
|
||||||
ArchiveAnalyzer instance = new ArchiveAnalyzer();
|
ArchiveAnalyzer instance = new ArchiveAnalyzer();
|
||||||
Set expResult = new HashSet<String>();
|
Set<String> expResult = new HashSet<String>();
|
||||||
expResult.add("zip");
|
expResult.add("zip");
|
||||||
expResult.add("war");
|
expResult.add("war");
|
||||||
expResult.add("ear");
|
expResult.add("ear");
|
||||||
@@ -129,11 +130,12 @@ public class ArchiveAnalyzerIntegrationTest extends AbstractDatabaseTestCase {
|
|||||||
instance.supportsExtension("ear");
|
instance.supportsExtension("ear");
|
||||||
try {
|
try {
|
||||||
instance.initialize();
|
instance.initialize();
|
||||||
|
File file = BaseTest.getResourceAsFile(this, "daytrader-ear-2.1.7.ear");
|
||||||
File file = new File(this.getClass().getClassLoader().getResource("daytrader-ear-2.1.7.ear").getPath());
|
//File file = new File(this.getClass().getClassLoader().getResource("daytrader-ear-2.1.7.ear").getPath());
|
||||||
Dependency dependency = new Dependency(file);
|
Dependency dependency = new Dependency(file);
|
||||||
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
||||||
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false);
|
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false);
|
||||||
|
Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false);
|
||||||
Engine engine = new Engine();
|
Engine engine = new Engine();
|
||||||
|
|
||||||
int initial_size = engine.getDependencies().size();
|
int initial_size = engine.getDependencies().size();
|
||||||
@@ -161,10 +163,12 @@ public class ArchiveAnalyzerIntegrationTest extends AbstractDatabaseTestCase {
|
|||||||
instance.initialize();
|
instance.initialize();
|
||||||
|
|
||||||
//File file = new File(this.getClass().getClassLoader().getResource("file.tar").getPath());
|
//File file = new File(this.getClass().getClassLoader().getResource("file.tar").getPath());
|
||||||
File file = new File(this.getClass().getClassLoader().getResource("stagedhttp-modified.tar").getPath());
|
//File file = new File(this.getClass().getClassLoader().getResource("stagedhttp-modified.tar").getPath());
|
||||||
|
File file = BaseTest.getResourceAsFile(this, "stagedhttp-modified.tar");
|
||||||
Dependency dependency = new Dependency(file);
|
Dependency dependency = new Dependency(file);
|
||||||
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
||||||
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false);
|
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false);
|
||||||
|
Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false);
|
||||||
Engine engine = new Engine();
|
Engine engine = new Engine();
|
||||||
|
|
||||||
int initial_size = engine.getDependencies().size();
|
int initial_size = engine.getDependencies().size();
|
||||||
@@ -189,10 +193,12 @@ public class ArchiveAnalyzerIntegrationTest extends AbstractDatabaseTestCase {
|
|||||||
try {
|
try {
|
||||||
instance.initialize();
|
instance.initialize();
|
||||||
|
|
||||||
File file = new File(this.getClass().getClassLoader().getResource("file.tar.gz").getPath());
|
//File file = new File(this.getClass().getClassLoader().getResource("file.tar.gz").getPath());
|
||||||
|
File file = BaseTest.getResourceAsFile(this, "file.tar.gz");
|
||||||
//Dependency dependency = new Dependency(file);
|
//Dependency dependency = new Dependency(file);
|
||||||
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
||||||
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false);
|
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false);
|
||||||
|
Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false);
|
||||||
Engine engine = new Engine();
|
Engine engine = new Engine();
|
||||||
|
|
||||||
int initial_size = engine.getDependencies().size();
|
int initial_size = engine.getDependencies().size();
|
||||||
@@ -220,6 +226,7 @@ public class ArchiveAnalyzerIntegrationTest extends AbstractDatabaseTestCase {
|
|||||||
// File file = new File(this.getClass().getClassLoader().getResource("nested.zip").getPath());
|
// File file = new File(this.getClass().getClassLoader().getResource("nested.zip").getPath());
|
||||||
// Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
// Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
||||||
// Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false);
|
// Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false);
|
||||||
|
// Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false);
|
||||||
// Engine engine = new Engine();
|
// Engine engine = new Engine();
|
||||||
//
|
//
|
||||||
// engine.scan(file);
|
// engine.scan(file);
|
||||||
@@ -239,9 +246,11 @@ public class ArchiveAnalyzerIntegrationTest extends AbstractDatabaseTestCase {
|
|||||||
try {
|
try {
|
||||||
instance.initialize();
|
instance.initialize();
|
||||||
|
|
||||||
File file = new File(this.getClass().getClassLoader().getResource("file.tgz").getPath());
|
//File file = new File(this.getClass().getClassLoader().getResource("file.tgz").getPath());
|
||||||
|
File file = BaseTest.getResourceAsFile(this, "file.tgz");
|
||||||
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
||||||
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false);
|
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false);
|
||||||
|
Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false);
|
||||||
Engine engine = new Engine();
|
Engine engine = new Engine();
|
||||||
|
|
||||||
int initial_size = engine.getDependencies().size();
|
int initial_size = engine.getDependencies().size();
|
||||||
@@ -265,10 +274,12 @@ public class ArchiveAnalyzerIntegrationTest extends AbstractDatabaseTestCase {
|
|||||||
try {
|
try {
|
||||||
instance.initialize();
|
instance.initialize();
|
||||||
|
|
||||||
File file = new File(this.getClass().getClassLoader().getResource("test.zip").getPath());
|
//File file = new File(this.getClass().getClassLoader().getResource("test.zip").getPath());
|
||||||
|
File file = BaseTest.getResourceAsFile(this, "test.zip");
|
||||||
Dependency dependency = new Dependency(file);
|
Dependency dependency = new Dependency(file);
|
||||||
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
||||||
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false);
|
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false);
|
||||||
|
Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false);
|
||||||
Engine engine = new Engine();
|
Engine engine = new Engine();
|
||||||
int initial_size = engine.getDependencies().size();
|
int initial_size = engine.getDependencies().size();
|
||||||
// boolean failed = false;
|
// boolean failed = false;
|
||||||
|
|||||||
@@ -78,7 +78,8 @@ public class AssemblyAnalyzerTest extends BaseTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testAnalysis() throws Exception {
|
public void testAnalysis() throws Exception {
|
||||||
File f = new File(AssemblyAnalyzerTest.class.getClassLoader().getResource("GrokAssembly.exe").getPath());
|
//File f = new File(AssemblyAnalyzerTest.class.getClassLoader().getResource("GrokAssembly.exe").getPath());
|
||||||
|
File f = BaseTest.getResourceAsFile(this, "GrokAssembly.exe");
|
||||||
Dependency d = new Dependency(f);
|
Dependency d = new Dependency(f);
|
||||||
analyzer.analyze(d, null);
|
analyzer.analyze(d, null);
|
||||||
boolean foundVendor = false;
|
boolean foundVendor = false;
|
||||||
@@ -100,7 +101,9 @@ public class AssemblyAnalyzerTest extends BaseTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testLog4Net() throws Exception {
|
public void testLog4Net() throws Exception {
|
||||||
File f = new File(AssemblyAnalyzerTest.class.getClassLoader().getResource("log4net.dll").getPath());
|
//File f = new File(AssemblyAnalyzerTest.class.getClassLoader().getResource("log4net.dll").getPath());
|
||||||
|
File f = BaseTest.getResourceAsFile(this, "log4net.dll");
|
||||||
|
|
||||||
Dependency d = new Dependency(f);
|
Dependency d = new Dependency(f);
|
||||||
analyzer.analyze(d, null);
|
analyzer.analyze(d, null);
|
||||||
assertTrue(d.getVersionEvidence().getEvidence().contains(new Evidence("grokassembly", "version", "1.2.13.0", Confidence.HIGHEST)));
|
assertTrue(d.getVersionEvidence().getEvidence().contains(new Evidence("grokassembly", "version", "1.2.13.0", Confidence.HIGHEST)));
|
||||||
@@ -115,7 +118,8 @@ public class AssemblyAnalyzerTest extends BaseTest {
|
|||||||
// Tweak the log level so the warning doesn't show in the console
|
// Tweak the log level so the warning doesn't show in the console
|
||||||
Logger.getLogger(AssemblyAnalyzer.class.getName()).setLevel(Level.OFF);
|
Logger.getLogger(AssemblyAnalyzer.class.getName()).setLevel(Level.OFF);
|
||||||
Logger.getLogger(Dependency.class.getName()).setLevel(Level.OFF);
|
Logger.getLogger(Dependency.class.getName()).setLevel(Level.OFF);
|
||||||
File f = new File(AssemblyAnalyzerTest.class.getClassLoader().getResource("log4net.dll").getPath());
|
//File f = new File(AssemblyAnalyzerTest.class.getClassLoader().getResource("log4net.dll").getPath());
|
||||||
|
File f = BaseTest.getResourceAsFile(this, "log4net.dll");
|
||||||
File test = new File(f.getParent(), "nonexistent.dll");
|
File test = new File(f.getParent(), "nonexistent.dll");
|
||||||
Dependency d = new Dependency(test);
|
Dependency d = new Dependency(test);
|
||||||
|
|
||||||
|
|||||||
@@ -25,9 +25,12 @@ import java.util.Set;
|
|||||||
import org.apache.lucene.index.CorruptIndexException;
|
import org.apache.lucene.index.CorruptIndexException;
|
||||||
import org.apache.lucene.queryparser.classic.ParseException;
|
import org.apache.lucene.queryparser.classic.ParseException;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.owasp.dependencycheck.BaseTest;
|
||||||
import org.owasp.dependencycheck.data.cpe.AbstractDatabaseTestCase;
|
import org.owasp.dependencycheck.data.cpe.AbstractDatabaseTestCase;
|
||||||
import org.owasp.dependencycheck.data.cpe.IndexEntry;
|
import org.owasp.dependencycheck.data.cpe.IndexEntry;
|
||||||
|
import org.owasp.dependencycheck.dependency.Confidence;
|
||||||
import org.owasp.dependencycheck.dependency.Dependency;
|
import org.owasp.dependencycheck.dependency.Dependency;
|
||||||
import org.owasp.dependencycheck.dependency.Identifier;
|
import org.owasp.dependencycheck.dependency.Identifier;
|
||||||
|
|
||||||
@@ -108,7 +111,8 @@ public class CPEAnalyzerIntegrationTest extends AbstractDatabaseTestCase {
|
|||||||
*/
|
*/
|
||||||
public void callDetermineCPE_full(String depName, String expResult, CPEAnalyzer instance, FileNameAnalyzer fnAnalyzer, JarAnalyzer jarAnalyzer, HintAnalyzer hAnalyzer, FalsePositiveAnalyzer fp) throws Exception {
|
public void callDetermineCPE_full(String depName, String expResult, CPEAnalyzer instance, FileNameAnalyzer fnAnalyzer, JarAnalyzer jarAnalyzer, HintAnalyzer hAnalyzer, FalsePositiveAnalyzer fp) throws Exception {
|
||||||
|
|
||||||
File file = new File(this.getClass().getClassLoader().getResource(depName).getPath());
|
//File file = new File(this.getClass().getClassLoader().getResource(depName).getPath());
|
||||||
|
File file = BaseTest.getResourceAsFile(this, depName);
|
||||||
|
|
||||||
Dependency dep = new Dependency(file);
|
Dependency dep = new Dependency(file);
|
||||||
|
|
||||||
@@ -135,7 +139,8 @@ public class CPEAnalyzerIntegrationTest extends AbstractDatabaseTestCase {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testDetermineCPE() throws Exception {
|
public void testDetermineCPE() throws Exception {
|
||||||
File file = new File(this.getClass().getClassLoader().getResource("struts2-core-2.1.2.jar").getPath());
|
//File file = new File(this.getClass().getClassLoader().getResource("struts2-core-2.1.2.jar").getPath());
|
||||||
|
File file = BaseTest.getResourceAsFile(this, "struts2-core-2.1.2.jar");
|
||||||
//File file = new File(this.getClass().getClassLoader().getResource("axis2-adb-1.4.1.jar").getPath());
|
//File file = new File(this.getClass().getClassLoader().getResource("axis2-adb-1.4.1.jar").getPath());
|
||||||
Dependency struts = new Dependency(file);
|
Dependency struts = new Dependency(file);
|
||||||
|
|
||||||
@@ -145,15 +150,18 @@ public class CPEAnalyzerIntegrationTest extends AbstractDatabaseTestCase {
|
|||||||
JarAnalyzer jarAnalyzer = new JarAnalyzer();
|
JarAnalyzer jarAnalyzer = new JarAnalyzer();
|
||||||
jarAnalyzer.analyze(struts, null);
|
jarAnalyzer.analyze(struts, null);
|
||||||
|
|
||||||
File fileCommonValidator = new File(this.getClass().getClassLoader().getResource("commons-validator-1.4.0.jar").getPath());
|
//File fileCommonValidator = new File(this.getClass().getClassLoader().getResource("commons-validator-1.4.0.jar").getPath());
|
||||||
|
File fileCommonValidator = BaseTest.getResourceAsFile(this, "commons-validator-1.4.0.jar");
|
||||||
Dependency commonValidator = new Dependency(fileCommonValidator);
|
Dependency commonValidator = new Dependency(fileCommonValidator);
|
||||||
jarAnalyzer.analyze(commonValidator, null);
|
jarAnalyzer.analyze(commonValidator, null);
|
||||||
|
|
||||||
File fileSpring = new File(this.getClass().getClassLoader().getResource("spring-core-2.5.5.jar").getPath());
|
//File fileSpring = new File(this.getClass().getClassLoader().getResource("spring-core-2.5.5.jar").getPath());
|
||||||
|
File fileSpring = BaseTest.getResourceAsFile(this, "spring-core-2.5.5.jar");
|
||||||
Dependency spring = new Dependency(fileSpring);
|
Dependency spring = new Dependency(fileSpring);
|
||||||
jarAnalyzer.analyze(spring, null);
|
jarAnalyzer.analyze(spring, null);
|
||||||
|
|
||||||
File fileSpring3 = new File(this.getClass().getClassLoader().getResource("spring-core-3.0.0.RELEASE.jar").getPath());
|
//File fileSpring3 = new File(this.getClass().getClassLoader().getResource("spring-core-3.0.0.RELEASE.jar").getPath());
|
||||||
|
File fileSpring3 = BaseTest.getResourceAsFile(this, "spring-core-3.0.0.RELEASE.jar");
|
||||||
Dependency spring3 = new Dependency(fileSpring3);
|
Dependency spring3 = new Dependency(fileSpring3);
|
||||||
jarAnalyzer.analyze(spring3, null);
|
jarAnalyzer.analyze(spring3, null);
|
||||||
|
|
||||||
@@ -183,6 +191,30 @@ public class CPEAnalyzerIntegrationTest extends AbstractDatabaseTestCase {
|
|||||||
//Assert.assertTrue("Incorrect match - spring", spring.getIdentifiers().get(0).getValue().equals(expResultSpring));
|
//Assert.assertTrue("Incorrect match - spring", spring.getIdentifiers().get(0).getValue().equals(expResultSpring));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of determineIdentifiers method, of class CPEAnalyzer.
|
||||||
|
*
|
||||||
|
* @throws Exception is thrown when an exception occurs
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testDetermineIdentifiers() throws Exception {
|
||||||
|
Dependency openssl = new Dependency();
|
||||||
|
openssl.getVendorEvidence().addEvidence("test", "vendor", "openssl", Confidence.HIGHEST);
|
||||||
|
openssl.getProductEvidence().addEvidence("test", "product", "openssl", Confidence.HIGHEST);
|
||||||
|
openssl.getVersionEvidence().addEvidence("test", "version", "1.0.1c", Confidence.HIGHEST);
|
||||||
|
|
||||||
|
CPEAnalyzer instance = new CPEAnalyzer();
|
||||||
|
instance.open();
|
||||||
|
instance.determineIdentifiers(openssl, "openssl", "openssl", Confidence.HIGHEST);
|
||||||
|
instance.close();
|
||||||
|
|
||||||
|
String expResult = "cpe:/a:openssl:openssl:1.0.1c";
|
||||||
|
Identifier expIdentifier = new Identifier("cpe", expResult, expResult);
|
||||||
|
|
||||||
|
assertTrue(openssl.getIdentifiers().contains(expIdentifier));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test of searchCPE method, of class CPEAnalyzer.
|
* Test of searchCPE method, of class CPEAnalyzer.
|
||||||
*
|
*
|
||||||
@@ -193,12 +225,12 @@ public class CPEAnalyzerIntegrationTest extends AbstractDatabaseTestCase {
|
|||||||
String vendor = "apache software foundation";
|
String vendor = "apache software foundation";
|
||||||
String product = "struts 2 core";
|
String product = "struts 2 core";
|
||||||
String version = "2.1.2";
|
String version = "2.1.2";
|
||||||
String expResult = "cpe:/a:apache:struts:2.1.2";
|
String expVendor = "apache";
|
||||||
|
String expProduct = "struts";
|
||||||
|
|
||||||
CPEAnalyzer instance = new CPEAnalyzer();
|
CPEAnalyzer instance = new CPEAnalyzer();
|
||||||
instance.open();
|
instance.open();
|
||||||
|
|
||||||
//TODO - yeah, not a very good test as the results are the same with or without weighting...
|
|
||||||
Set<String> productWeightings = new HashSet<String>(1);
|
Set<String> productWeightings = new HashSet<String>(1);
|
||||||
productWeightings.add("struts2");
|
productWeightings.add("struts2");
|
||||||
|
|
||||||
@@ -206,9 +238,16 @@ public class CPEAnalyzerIntegrationTest extends AbstractDatabaseTestCase {
|
|||||||
vendorWeightings.add("apache");
|
vendorWeightings.add("apache");
|
||||||
|
|
||||||
List<IndexEntry> result = instance.searchCPE(vendor, product, productWeightings, vendorWeightings);
|
List<IndexEntry> result = instance.searchCPE(vendor, product, productWeightings, vendorWeightings);
|
||||||
//TODO fix this assert
|
|
||||||
//Assert.assertEquals(expResult, result.get(0).getName());
|
|
||||||
|
|
||||||
instance.close();
|
instance.close();
|
||||||
|
|
||||||
|
boolean found = false;
|
||||||
|
for (IndexEntry entry : result) {
|
||||||
|
if (expVendor.equals(entry.getVendor()) && expProduct.equals(entry.getProduct())) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assertTrue("apache:struts was not identified", found);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,4 +86,40 @@ public class DependencyBundlingAnalyzerTest extends BaseTest {
|
|||||||
assertEquals(expResult, result);
|
assertEquals(expResult, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFirstPathIsShortest() {
|
||||||
|
DependencyBundlingAnalyzer instance = new DependencyBundlingAnalyzer();
|
||||||
|
|
||||||
|
String left = "./a/c.jar";
|
||||||
|
String right = "./d/e/f.jar";
|
||||||
|
boolean expResult = true;
|
||||||
|
boolean result = instance.firstPathIsShortest(left, right);
|
||||||
|
assertEquals(expResult, result);
|
||||||
|
|
||||||
|
left = "./a/b/c.jar";
|
||||||
|
right = "./d/e/f.jar";
|
||||||
|
expResult = true;
|
||||||
|
result = instance.firstPathIsShortest(left, right);
|
||||||
|
assertEquals(expResult, result);
|
||||||
|
|
||||||
|
left = "./d/b/c.jar";
|
||||||
|
right = "./a/e/f.jar";
|
||||||
|
expResult = false;
|
||||||
|
result = instance.firstPathIsShortest(left, right);
|
||||||
|
assertEquals(expResult, result);
|
||||||
|
|
||||||
|
left = "./a/b/c.jar";
|
||||||
|
right = "./d/f.jar";
|
||||||
|
expResult = false;
|
||||||
|
result = instance.firstPathIsShortest(left, right);
|
||||||
|
assertEquals(expResult, result);
|
||||||
|
|
||||||
|
left = "./a/b/c.jar";
|
||||||
|
right = "./a/b/c.jar";
|
||||||
|
expResult = true;
|
||||||
|
result = instance.firstPathIsShortest(left, right);
|
||||||
|
assertEquals(expResult, result);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import java.io.File;
|
|||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.owasp.dependencycheck.BaseTest;
|
||||||
import org.owasp.dependencycheck.dependency.Dependency;
|
import org.owasp.dependencycheck.dependency.Dependency;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -56,9 +57,11 @@ public class FileNameAnalyzerTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testAnalyze() throws Exception {
|
public void testAnalyze() throws Exception {
|
||||||
File struts = new File(this.getClass().getClassLoader().getResource("struts2-core-2.1.2.jar").getPath());
|
//File struts = new File(this.getClass().getClassLoader().getResource("struts2-core-2.1.2.jar").getPath());
|
||||||
|
File struts = BaseTest.getResourceAsFile(this, "struts2-core-2.1.2.jar");
|
||||||
Dependency resultStruts = new Dependency(struts);
|
Dependency resultStruts = new Dependency(struts);
|
||||||
File axis = new File(this.getClass().getClassLoader().getResource("axis2-adb-1.4.1.jar").getPath());
|
//File axis = new File(this.getClass().getClassLoader().getResource("axis2-adb-1.4.1.jar").getPath());
|
||||||
|
File axis = BaseTest.getResourceAsFile(this, "axis2-adb-1.4.1.jar");
|
||||||
Dependency resultAxis = new Dependency(axis);
|
Dependency resultAxis = new Dependency(axis);
|
||||||
FileNameAnalyzer instance = new FileNameAnalyzer();
|
FileNameAnalyzer instance = new FileNameAnalyzer();
|
||||||
instance.analyze(resultStruts, null);
|
instance.analyze(resultStruts, null);
|
||||||
|
|||||||
@@ -69,12 +69,15 @@ public class HintAnalyzerTest extends BaseTest {
|
|||||||
public void testAnalyze() throws Exception {
|
public void testAnalyze() throws Exception {
|
||||||
HintAnalyzer instance = new HintAnalyzer();
|
HintAnalyzer instance = new HintAnalyzer();
|
||||||
|
|
||||||
File guice = new File(this.getClass().getClassLoader().getResource("guice-3.0.jar").getPath());
|
//File guice = new File(this.getClass().getClassLoader().getResource("guice-3.0.jar").getPath());
|
||||||
|
File guice = BaseTest.getResourceAsFile(this, "guice-3.0.jar");
|
||||||
//Dependency guice = new Dependency(fileg);
|
//Dependency guice = new Dependency(fileg);
|
||||||
File spring = new File(this.getClass().getClassLoader().getResource("spring-core-3.0.0.RELEASE.jar").getPath());
|
//File spring = new File(this.getClass().getClassLoader().getResource("spring-core-3.0.0.RELEASE.jar").getPath());
|
||||||
|
File spring = BaseTest.getResourceAsFile(this, "spring-core-3.0.0.RELEASE.jar");
|
||||||
//Dependency spring = new Dependency(files);
|
//Dependency spring = new Dependency(files);
|
||||||
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
||||||
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false);
|
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false);
|
||||||
|
Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false);
|
||||||
Engine engine = new Engine();
|
Engine engine = new Engine();
|
||||||
|
|
||||||
engine.scan(guice);
|
engine.scan(guice);
|
||||||
|
|||||||
@@ -41,14 +41,16 @@ public class JarAnalyzerTest extends BaseTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testAnalyze() throws Exception {
|
public void testAnalyze() throws Exception {
|
||||||
File file = new File(this.getClass().getClassLoader().getResource("struts2-core-2.1.2.jar").getPath());
|
//File file = new File(this.getClass().getClassLoader().getResource("struts2-core-2.1.2.jar").getPath());
|
||||||
|
File file = BaseTest.getResourceAsFile(this, "struts2-core-2.1.2.jar");
|
||||||
Dependency result = new Dependency(file);
|
Dependency result = new Dependency(file);
|
||||||
JarAnalyzer instance = new JarAnalyzer();
|
JarAnalyzer instance = new JarAnalyzer();
|
||||||
instance.analyze(result, null);
|
instance.analyze(result, null);
|
||||||
assertTrue(result.getVendorEvidence().toString().toLowerCase().contains("apache"));
|
assertTrue(result.getVendorEvidence().toString().toLowerCase().contains("apache"));
|
||||||
assertTrue(result.getVendorEvidence().getWeighting().contains("apache"));
|
assertTrue(result.getVendorEvidence().getWeighting().contains("apache"));
|
||||||
|
|
||||||
file = new File(this.getClass().getClassLoader().getResource("org.mortbay.jetty.jar").getPath());
|
//file = new File(this.getClass().getClassLoader().getResource("org.mortbay.jetty.jar").getPath());
|
||||||
|
file = BaseTest.getResourceAsFile(this, "org.mortbay.jetty.jar");
|
||||||
result = new Dependency(file);
|
result = new Dependency(file);
|
||||||
instance.analyze(result, null);
|
instance.analyze(result, null);
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
@@ -81,7 +83,8 @@ public class JarAnalyzerTest extends BaseTest {
|
|||||||
}
|
}
|
||||||
assertTrue("implementation-version of 4.2.27 not found in org.mortbay.jetty.jar", found);
|
assertTrue("implementation-version of 4.2.27 not found in org.mortbay.jetty.jar", found);
|
||||||
|
|
||||||
file = new File(this.getClass().getClassLoader().getResource("org.mortbay.jmx.jar").getPath());
|
//file = new File(this.getClass().getClassLoader().getResource("org.mortbay.jmx.jar").getPath());
|
||||||
|
file = BaseTest.getResourceAsFile(this, "org.mortbay.jmx.jar");
|
||||||
result = new Dependency(file);
|
result = new Dependency(file);
|
||||||
instance.analyze(result, null);
|
instance.analyze(result, null);
|
||||||
assertEquals("org.mortbar,jmx.jar has version evidence?", result.getVersionEvidence().size(), 0);
|
assertEquals("org.mortbar,jmx.jar has version evidence?", result.getVersionEvidence().size(), 0);
|
||||||
@@ -93,7 +96,7 @@ public class JarAnalyzerTest extends BaseTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testGetSupportedExtensions() {
|
public void testGetSupportedExtensions() {
|
||||||
JarAnalyzer instance = new JarAnalyzer();
|
JarAnalyzer instance = new JarAnalyzer();
|
||||||
Set expResult = new HashSet();
|
Set<String> expResult = new HashSet<String>();
|
||||||
expResult.add("jar");
|
expResult.add("jar");
|
||||||
expResult.add("war");
|
expResult.add("war");
|
||||||
Set result = instance.getSupportedExtensions();
|
Set result = instance.getSupportedExtensions();
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public class JavaScriptAnalyzerTest extends BaseTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testGetSupportedExtensions() {
|
public void testGetSupportedExtensions() {
|
||||||
JavaScriptAnalyzer instance = new JavaScriptAnalyzer();
|
JavaScriptAnalyzer instance = new JavaScriptAnalyzer();
|
||||||
Set expResult = new HashSet<String>();
|
Set<String> expResult = new HashSet<String>();
|
||||||
expResult.add("js");
|
expResult.add("js");
|
||||||
Set result = instance.getSupportedExtensions();
|
Set result = instance.getSupportedExtensions();
|
||||||
assertEquals(expResult, result);
|
assertEquals(expResult, result);
|
||||||
@@ -84,9 +84,12 @@ public class JavaScriptAnalyzerTest extends BaseTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testAnalyze() throws Exception {
|
public void testAnalyze() throws Exception {
|
||||||
File jq6 = new File(this.getClass().getClassLoader().getResource("jquery-1.6.2.min.js").getPath());
|
//File jq6 = new File(this.getClass().getClassLoader().getResource("jquery-1.6.2.min.js").getPath());
|
||||||
File jq10 = new File(this.getClass().getClassLoader().getResource("jquery-1.10.2.js").getPath());
|
File jq6 = BaseTest.getResourceAsFile(this, "jquery-1.6.2.min.js");
|
||||||
File jq10min = new File(this.getClass().getClassLoader().getResource("jquery-1.10.2.min.js").getPath());
|
//File jq10 = new File(this.getClass().getClassLoader().getResource("jquery-1.10.2.js").getPath());
|
||||||
|
File jq10 = BaseTest.getResourceAsFile(this, "jquery-1.10.2.js");
|
||||||
|
//File jq10min = new File(this.getClass().getClassLoader().getResource("jquery-1.10.2.min.js").getPath());
|
||||||
|
File jq10min = BaseTest.getResourceAsFile(this, "jquery-1.10.2.min.js");
|
||||||
Dependency depJQ6 = new Dependency(jq6);
|
Dependency depJQ6 = new Dependency(jq6);
|
||||||
Dependency depJQ10 = new Dependency(jq10);
|
Dependency depJQ10 = new Dependency(jq10);
|
||||||
Dependency depJQ10min = new Dependency(jq10min);
|
Dependency depJQ10min = new Dependency(jq10min);
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import java.io.File;
|
|||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.owasp.dependencycheck.BaseTest;
|
||||||
import org.owasp.dependencycheck.Engine;
|
import org.owasp.dependencycheck.Engine;
|
||||||
import org.owasp.dependencycheck.data.cpe.AbstractDatabaseTestCase;
|
import org.owasp.dependencycheck.data.cpe.AbstractDatabaseTestCase;
|
||||||
import org.owasp.dependencycheck.dependency.Dependency;
|
import org.owasp.dependencycheck.dependency.Dependency;
|
||||||
@@ -61,10 +62,13 @@ public class VulnerabilitySuppressionAnalyzerIntegrationTest extends AbstractDat
|
|||||||
@Test
|
@Test
|
||||||
public void testAnalyze() throws Exception {
|
public void testAnalyze() throws Exception {
|
||||||
|
|
||||||
File file = new File(this.getClass().getClassLoader().getResource("commons-fileupload-1.2.1.jar").getPath());
|
//File file = new File(this.getClass().getClassLoader().getResource("commons-fileupload-1.2.1.jar").getPath());
|
||||||
File suppression = new File(this.getClass().getClassLoader().getResource("commons-fileupload-1.2.1.suppression.xml").getPath());
|
File file = BaseTest.getResourceAsFile(this, "commons-fileupload-1.2.1.jar");
|
||||||
|
//File suppression = new File(this.getClass().getClassLoader().getResource("commons-fileupload-1.2.1.suppression.xml").getPath());
|
||||||
|
File suppression = BaseTest.getResourceAsFile(this, "commons-fileupload-1.2.1.suppression.xml");
|
||||||
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
||||||
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false);
|
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false);
|
||||||
|
Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false);
|
||||||
Engine engine = new Engine();
|
Engine engine = new Engine();
|
||||||
engine.scan(file);
|
engine.scan(file);
|
||||||
engine.analyzeDependencies();
|
engine.analyzeDependencies();
|
||||||
|
|||||||
@@ -0,0 +1,63 @@
|
|||||||
|
package org.owasp.dependencycheck.data.central;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.owasp.dependencycheck.BaseTest;
|
||||||
|
import org.owasp.dependencycheck.data.nexus.MavenArtifact;
|
||||||
|
import org.owasp.dependencycheck.utils.Settings;
|
||||||
|
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by colezlaw on 10/13/14.
|
||||||
|
*/
|
||||||
|
public class CentralSearchTest extends BaseTest {
|
||||||
|
private static final Logger LOGGER = Logger.getLogger(CentralSearchTest.class.getName());
|
||||||
|
private CentralSearch searcher;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
String centralUrl = Settings.getString(Settings.KEYS.ANALYZER_CENTRAL_URL);
|
||||||
|
LOGGER.fine(centralUrl);
|
||||||
|
searcher = new CentralSearch(new URL(centralUrl));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException.class)
|
||||||
|
public void testNullSha1() throws Exception { searcher.searchSha1(null); }
|
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException.class)
|
||||||
|
public void testMalformedSha1() throws Exception {
|
||||||
|
searcher.searchSha1("invalid");
|
||||||
|
}
|
||||||
|
|
||||||
|
// This test does generate network traffic and communicates with a host
|
||||||
|
// you may not be able to reach. Remove the @Ignore annotation if you want to
|
||||||
|
// test it anyway
|
||||||
|
@Test
|
||||||
|
public void testValidSha1() throws Exception {
|
||||||
|
List<MavenArtifact> ma = searcher.searchSha1("9977a8d04e75609cf01badc4eb6a9c7198c4c5ea");
|
||||||
|
assertEquals("Incorrect group", "org.apache.maven.plugins", ma.get(0).getGroupId());
|
||||||
|
assertEquals("Incorrect artifact", "maven-compiler-plugin", ma.get(0).getArtifactId());
|
||||||
|
assertEquals("Incorrect version", "3.1", ma.get(0).getVersion());
|
||||||
|
}
|
||||||
|
|
||||||
|
// This test does generate network traffic and communicates with a host
|
||||||
|
// you may not be able to reach. Remove the @Ignore annotation if you want to
|
||||||
|
// test it anyway
|
||||||
|
@Test(expected = FileNotFoundException.class)
|
||||||
|
public void testMissingSha1() throws Exception {
|
||||||
|
searcher.searchSha1("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
|
||||||
|
}
|
||||||
|
|
||||||
|
// This test should give us multiple results back from Central
|
||||||
|
@Test
|
||||||
|
public void testMultipleReturns() throws Exception {
|
||||||
|
List<MavenArtifact> ma = searcher.searchSha1("94A9CE681A42D0352B3AD22659F67835E560D107");
|
||||||
|
assertTrue(ma.size() > 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,16 +20,10 @@ package org.owasp.dependencycheck.data.lucene;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.Reader;
|
import java.io.Reader;
|
||||||
import org.apache.lucene.analysis.Analyzer;
|
import org.apache.lucene.analysis.Analyzer;
|
||||||
import org.apache.lucene.analysis.Analyzer.TokenStreamComponents;
|
|
||||||
import org.apache.lucene.analysis.BaseTokenStreamTestCase;
|
import org.apache.lucene.analysis.BaseTokenStreamTestCase;
|
||||||
import static org.apache.lucene.analysis.BaseTokenStreamTestCase.checkOneTerm;
|
|
||||||
import org.apache.lucene.analysis.MockTokenizer;
|
import org.apache.lucene.analysis.MockTokenizer;
|
||||||
import org.apache.lucene.analysis.Tokenizer;
|
import org.apache.lucene.analysis.Tokenizer;
|
||||||
import org.apache.lucene.analysis.core.KeywordTokenizer;
|
import org.apache.lucene.analysis.core.KeywordTokenizer;
|
||||||
import org.junit.After;
|
|
||||||
import org.junit.AfterClass;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -50,24 +44,6 @@ public class UrlTokenizingFilterTest extends BaseTokenStreamTestCase {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@BeforeClass
|
|
||||||
public static void setUpClass() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@AfterClass
|
|
||||||
public static void tearDownClass() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setUp() throws Exception {
|
|
||||||
super.setUp();
|
|
||||||
}
|
|
||||||
|
|
||||||
@After
|
|
||||||
public void tearDown() throws Exception {
|
|
||||||
super.tearDown();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* test some example domains
|
* test some example domains
|
||||||
*/
|
*/
|
||||||
@@ -102,6 +78,6 @@ public class UrlTokenizingFilterTest extends BaseTokenStreamTestCase {
|
|||||||
return new TokenStreamComponents(tokenizer, new UrlTokenizingFilter(tokenizer));
|
return new TokenStreamComponents(tokenizer, new UrlTokenizingFilter(tokenizer));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
checkOneTermReuse(a, "", "");
|
checkOneTerm(a, "", "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertEquals;
|
|||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
import org.junit.Assume;
|
import org.junit.Assume;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
import org.junit.Ignore;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.owasp.dependencycheck.BaseTest;
|
import org.owasp.dependencycheck.BaseTest;
|
||||||
import org.owasp.dependencycheck.utils.Settings;
|
import org.owasp.dependencycheck.utils.Settings;
|
||||||
@@ -42,11 +43,13 @@ public class NexusSearchTest extends BaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
@Test(expected = IllegalArgumentException.class)
|
||||||
|
@Ignore
|
||||||
public void testNullSha1() throws Exception {
|
public void testNullSha1() throws Exception {
|
||||||
searcher.searchSha1(null);
|
searcher.searchSha1(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
@Test(expected = IllegalArgumentException.class)
|
||||||
|
@Ignore
|
||||||
public void testMalformedSha1() throws Exception {
|
public void testMalformedSha1() throws Exception {
|
||||||
searcher.searchSha1("invalid");
|
searcher.searchSha1("invalid");
|
||||||
}
|
}
|
||||||
@@ -55,6 +58,7 @@ public class NexusSearchTest extends BaseTest {
|
|||||||
// you may not be able to reach. Remove the @Ignore annotation if you want to
|
// you may not be able to reach. Remove the @Ignore annotation if you want to
|
||||||
// test it anyway
|
// test it anyway
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore
|
||||||
public void testValidSha1() throws Exception {
|
public void testValidSha1() throws Exception {
|
||||||
MavenArtifact ma = searcher.searchSha1("9977a8d04e75609cf01badc4eb6a9c7198c4c5ea");
|
MavenArtifact ma = searcher.searchSha1("9977a8d04e75609cf01badc4eb6a9c7198c4c5ea");
|
||||||
assertEquals("Incorrect group", "org.apache.maven.plugins", ma.getGroupId());
|
assertEquals("Incorrect group", "org.apache.maven.plugins", ma.getGroupId());
|
||||||
@@ -67,6 +71,7 @@ public class NexusSearchTest extends BaseTest {
|
|||||||
// you may not be able to reach. Remove the @Ignore annotation if you want to
|
// you may not be able to reach. Remove the @Ignore annotation if you want to
|
||||||
// test it anyway
|
// test it anyway
|
||||||
@Test(expected = FileNotFoundException.class)
|
@Test(expected = FileNotFoundException.class)
|
||||||
|
@Ignore
|
||||||
public void testMissingSha1() throws Exception {
|
public void testMissingSha1() throws Exception {
|
||||||
searcher.searchSha1("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
|
searcher.searchSha1("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
package org.owasp.dependencycheck.data.nuget;
|
package org.owasp.dependencycheck.data.nuget;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.File;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
@@ -39,7 +40,8 @@ public class XPathNuspecParserTest extends BaseTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testGoodDocument() throws Exception {
|
public void testGoodDocument() throws Exception {
|
||||||
NuspecParser parser = new XPathNuspecParser();
|
NuspecParser parser = new XPathNuspecParser();
|
||||||
InputStream is = XPathNuspecParserTest.class.getClassLoader().getResourceAsStream("log4net.2.0.3.nuspec");
|
//InputStream is = XPathNuspecParserTest.class.getClassLoader().getResourceAsStream("log4net.2.0.3.nuspec");
|
||||||
|
InputStream is = BaseTest.getResourceAsStream(this, "log4net.2.0.3.nuspec");
|
||||||
NugetPackage np = parser.parse(is);
|
NugetPackage np = parser.parse(is);
|
||||||
assertEquals("log4net", np.getId());
|
assertEquals("log4net", np.getId());
|
||||||
assertEquals("2.0.3", np.getVersion());
|
assertEquals("2.0.3", np.getVersion());
|
||||||
@@ -57,7 +59,8 @@ public class XPathNuspecParserTest extends BaseTest {
|
|||||||
@Test(expected = NuspecParseException.class)
|
@Test(expected = NuspecParseException.class)
|
||||||
public void testMissingDocument() throws Exception {
|
public void testMissingDocument() throws Exception {
|
||||||
NuspecParser parser = new XPathNuspecParser();
|
NuspecParser parser = new XPathNuspecParser();
|
||||||
InputStream is = XPathNuspecParserTest.class.getClassLoader().getResourceAsStream("dependencycheck.properties");
|
//InputStream is = XPathNuspecParserTest.class.getClassLoader().getResourceAsStream("dependencycheck.properties");
|
||||||
|
InputStream is = BaseTest.getResourceAsStream(this, "dependencycheck.properties");
|
||||||
|
|
||||||
//hide the fatal message from the core parser
|
//hide the fatal message from the core parser
|
||||||
final ByteArrayOutputStream myOut = new ByteArrayOutputStream();
|
final ByteArrayOutputStream myOut = new ByteArrayOutputStream();
|
||||||
@@ -74,7 +77,8 @@ public class XPathNuspecParserTest extends BaseTest {
|
|||||||
@Test(expected = NuspecParseException.class)
|
@Test(expected = NuspecParseException.class)
|
||||||
public void testNotNuspec() throws Exception {
|
public void testNotNuspec() throws Exception {
|
||||||
NuspecParser parser = new XPathNuspecParser();
|
NuspecParser parser = new XPathNuspecParser();
|
||||||
InputStream is = XPathNuspecParserTest.class.getClassLoader().getResourceAsStream("suppressions.xml");
|
//InputStream is = XPathNuspecParserTest.class.getClassLoader().getResourceAsStream("suppressions.xml");
|
||||||
|
InputStream is = BaseTest.getResourceAsStream(this, "suppressions.xml");
|
||||||
NugetPackage np = parser.parse(is);
|
NugetPackage np = parser.parse(is);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,11 +17,16 @@
|
|||||||
*/
|
*/
|
||||||
package org.owasp.dependencycheck.data.nvdcve;
|
package org.owasp.dependencycheck.data.nvdcve;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map.Entry;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import org.junit.Assert;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.owasp.dependencycheck.dependency.Vulnerability;
|
||||||
import org.owasp.dependencycheck.dependency.VulnerableSoftware;
|
import org.owasp.dependencycheck.dependency.VulnerableSoftware;
|
||||||
|
import org.owasp.dependencycheck.utils.DependencyVersion;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -64,12 +69,95 @@ public class CveDBIntegrationTest extends BaseDBTestCase {
|
|||||||
public void testGetVulnerabilities() throws Exception {
|
public void testGetVulnerabilities() throws Exception {
|
||||||
String cpeStr = "cpe:/a:apache:struts:2.1.2";
|
String cpeStr = "cpe:/a:apache:struts:2.1.2";
|
||||||
CveDB instance = new CveDB();
|
CveDB instance = new CveDB();
|
||||||
|
List<Vulnerability> results;
|
||||||
try {
|
try {
|
||||||
instance.open();
|
instance.open();
|
||||||
List result = instance.getVulnerabilities(cpeStr);
|
results = instance.getVulnerabilities(cpeStr);
|
||||||
assertTrue(result.size() > 5);
|
assertTrue(results.size() > 5);
|
||||||
|
cpeStr = "cpe:/a:jruby:jruby:1.6.3";
|
||||||
|
results = instance.getVulnerabilities(cpeStr);
|
||||||
|
assertTrue(results.size() > 1);
|
||||||
|
|
||||||
|
boolean found = false;
|
||||||
|
String expected = "CVE-2011-4838";
|
||||||
|
for (Vulnerability v : results) {
|
||||||
|
if (expected.equals(v.getName())) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assertTrue("Expected " + expected + ", but was not identified", found);
|
||||||
|
|
||||||
|
found = false;
|
||||||
|
expected = "CVE-2012-5370";
|
||||||
|
for (Vulnerability v : results) {
|
||||||
|
if (expected.equals(v.getName())) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assertTrue("Expected " + expected + ", but was not identified", found);
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
instance.close();
|
instance.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of getMatchingSoftware method, of class CveDB.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testGetMatchingSoftware() throws Exception {
|
||||||
|
HashMap<String, Boolean> versions = new HashMap<String, Boolean>();
|
||||||
|
DependencyVersion identifiedVersion = new DependencyVersion("1.0.1o");
|
||||||
|
versions.put("cpe:/a:openssl:openssl:1.0.1e", Boolean.FALSE);
|
||||||
|
|
||||||
|
CveDB instance = new CveDB();
|
||||||
|
Entry<String, Boolean> results = instance.getMatchingSoftware(versions, "openssl", "openssl", identifiedVersion);
|
||||||
|
Assert.assertNull(results);
|
||||||
|
versions.put("cpe:/a:openssl:openssl:1.0.1p", Boolean.FALSE);
|
||||||
|
results = instance.getMatchingSoftware(versions, "openssl", "openssl", identifiedVersion);
|
||||||
|
Assert.assertNull(results);
|
||||||
|
|
||||||
|
versions.put("cpe:/a:openssl:openssl:1.0.1q", Boolean.TRUE);
|
||||||
|
results = instance.getMatchingSoftware(versions, "openssl", "openssl", identifiedVersion);
|
||||||
|
Assert.assertNotNull(results);
|
||||||
|
Assert.assertEquals("cpe:/a:openssl:openssl:1.0.1q", results.getKey());
|
||||||
|
|
||||||
|
versions.clear();
|
||||||
|
|
||||||
|
versions.put("cpe:/a:springsource:spring_framework:3.2.5", Boolean.FALSE);
|
||||||
|
versions.put("cpe:/a:springsource:spring_framework:3.2.6", Boolean.FALSE);
|
||||||
|
versions.put("cpe:/a:springsource:spring_framework:3.2.7", Boolean.TRUE);
|
||||||
|
|
||||||
|
versions.put("cpe:/a:springsource:spring_framework:4.0.1", Boolean.TRUE);
|
||||||
|
versions.put("cpe:/a:springsource:spring_framework:4.0.0:m1", Boolean.FALSE);
|
||||||
|
versions.put("cpe:/a:springsource:spring_framework:4.0.0:m2", Boolean.FALSE);
|
||||||
|
versions.put("cpe:/a:springsource:spring_framework:4.0.0:rc1", Boolean.FALSE);
|
||||||
|
|
||||||
|
identifiedVersion = new DependencyVersion("3.2.2");
|
||||||
|
results = instance.getMatchingSoftware(versions, "springsource", "spring_framework", identifiedVersion);
|
||||||
|
Assert.assertEquals("cpe:/a:springsource:spring_framework:3.2.7", results.getKey());
|
||||||
|
Assert.assertTrue(results.getValue());
|
||||||
|
identifiedVersion = new DependencyVersion("3.2.12");
|
||||||
|
results = instance.getMatchingSoftware(versions, "springsource", "spring_framework", identifiedVersion);
|
||||||
|
Assert.assertNull(results);
|
||||||
|
|
||||||
|
identifiedVersion = new DependencyVersion("4.0.0");
|
||||||
|
results = instance.getMatchingSoftware(versions, "springsource", "spring_framework", identifiedVersion);
|
||||||
|
Assert.assertEquals("cpe:/a:springsource:spring_framework:4.0.1", results.getKey());
|
||||||
|
Assert.assertTrue(results.getValue());
|
||||||
|
identifiedVersion = new DependencyVersion("4.1.0");
|
||||||
|
results = instance.getMatchingSoftware(versions, "springsource", "spring_framework", identifiedVersion);
|
||||||
|
Assert.assertNull(results);
|
||||||
|
|
||||||
|
versions.clear();
|
||||||
|
|
||||||
|
versions.put("cpe:/a:jruby:jruby:-", Boolean.FALSE);
|
||||||
|
identifiedVersion = new DependencyVersion("1.6.3");
|
||||||
|
results = instance.getMatchingSoftware(versions, "springsource", "spring_framework", identifiedVersion);
|
||||||
|
Assert.assertNotNull(results);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import static org.junit.Assert.assertTrue;
|
|||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.owasp.dependencycheck.BaseTest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -85,7 +86,8 @@ public class DriverLoaderTest {
|
|||||||
public void testLoad_String_String() throws Exception {
|
public void testLoad_String_String() throws Exception {
|
||||||
String className = "com.mysql.jdbc.Driver";
|
String className = "com.mysql.jdbc.Driver";
|
||||||
//we know this is in target/test-classes
|
//we know this is in target/test-classes
|
||||||
File testClassPath = (new File(this.getClass().getClassLoader().getResource("org.mortbay.jetty.jar").getPath())).getParentFile();
|
//File testClassPath = (new File(this.getClass().getClassLoader().getResource("org.mortbay.jetty.jar").getPath())).getParentFile();
|
||||||
|
File testClassPath = BaseTest.getResourceAsFile(this, "org.mortbay.jetty.jar").getParentFile();
|
||||||
File driver = new File(testClassPath, "../../src/test/resources/mysql-connector-java-5.1.27-bin.jar");
|
File driver = new File(testClassPath, "../../src/test/resources/mysql-connector-java-5.1.27-bin.jar");
|
||||||
assertTrue("MySQL Driver JAR file not found in src/test/resources?", driver.isFile());
|
assertTrue("MySQL Driver JAR file not found in src/test/resources?", driver.isFile());
|
||||||
|
|
||||||
@@ -108,7 +110,8 @@ public class DriverLoaderTest {
|
|||||||
public void testLoad_String_String_multiple_paths() throws Exception {
|
public void testLoad_String_String_multiple_paths() throws Exception {
|
||||||
final String className = "com.mysql.jdbc.Driver";
|
final String className = "com.mysql.jdbc.Driver";
|
||||||
//we know this is in target/test-classes
|
//we know this is in target/test-classes
|
||||||
final File testClassPath = (new File(this.getClass().getClassLoader().getResource("org.mortbay.jetty.jar").getPath())).getParentFile();
|
//final File testClassPath = (new File(this.getClass().getClassLoader().getResource("org.mortbay.jetty.jar").getPath())).getParentFile();
|
||||||
|
final File testClassPath = BaseTest.getResourceAsFile(this, "org.mortbay.jetty.jar").getParentFile();
|
||||||
final File dir1 = new File(testClassPath, "../../src/test/");
|
final File dir1 = new File(testClassPath, "../../src/test/");
|
||||||
final File dir2 = new File(testClassPath, "../../src/test/resources/");
|
final File dir2 = new File(testClassPath, "../../src/test/resources/");
|
||||||
final String paths = String.format("%s" + File.pathSeparator + "%s", dir1.getAbsolutePath(), dir2.getAbsolutePath());
|
final String paths = String.format("%s" + File.pathSeparator + "%s", dir1.getAbsolutePath(), dir2.getAbsolutePath());
|
||||||
@@ -130,7 +133,8 @@ public class DriverLoaderTest {
|
|||||||
public void testLoad_String_String_badClassName() throws Exception {
|
public void testLoad_String_String_badClassName() throws Exception {
|
||||||
String className = "com.mybad.jdbc.Driver";
|
String className = "com.mybad.jdbc.Driver";
|
||||||
//we know this is in target/test-classes
|
//we know this is in target/test-classes
|
||||||
File testClassPath = (new File(this.getClass().getClassLoader().getResource("org.mortbay.jetty.jar").getPath())).getParentFile();
|
//File testClassPath = (new File(this.getClass().getClassLoader().getResource("org.mortbay.jetty.jar").getPath())).getParentFile();
|
||||||
|
File testClassPath = BaseTest.getResourceAsFile(this, "org.mortbay.jetty.jar").getParentFile();
|
||||||
File driver = new File(testClassPath, "../../src/test/resources/mysql-connector-java-5.1.27-bin.jar");
|
File driver = new File(testClassPath, "../../src/test/resources/mysql-connector-java-5.1.27-bin.jar");
|
||||||
assertTrue("MySQL Driver JAR file not found in src/test/resources?", driver.isFile());
|
assertTrue("MySQL Driver JAR file not found in src/test/resources?", driver.isFile());
|
||||||
|
|
||||||
@@ -144,7 +148,8 @@ public class DriverLoaderTest {
|
|||||||
public void testLoad_String_String_badPath() throws Exception {
|
public void testLoad_String_String_badPath() throws Exception {
|
||||||
String className = "com.mysql.jdbc.Driver";
|
String className = "com.mysql.jdbc.Driver";
|
||||||
//we know this is in target/test-classes
|
//we know this is in target/test-classes
|
||||||
File testClassPath = (new File(this.getClass().getClassLoader().getResource("org.mortbay.jetty.jar").getPath())).getParentFile();
|
//File testClassPath = (new File(this.getClass().getClassLoader().getResource("org.mortbay.jetty.jar").getPath())).getParentFile();
|
||||||
|
File testClassPath = BaseTest.getResourceAsFile(this, "org.mortbay.jetty.jar").getParentFile();
|
||||||
File driver = new File(testClassPath, "../../src/test/bad/mysql-connector-java-5.1.27-bin.jar");
|
File driver = new File(testClassPath, "../../src/test/bad/mysql-connector-java-5.1.27-bin.jar");
|
||||||
Driver d = DriverLoader.load(className, driver.getAbsolutePath());
|
Driver d = DriverLoader.load(className, driver.getAbsolutePath());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,145 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014 OWASP.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.owasp.dependencycheck.data.update;
|
||||||
|
|
||||||
|
import java.text.DateFormat;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Properties;
|
||||||
|
import mockit.Mock;
|
||||||
|
import mockit.MockUp;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.owasp.dependencycheck.BaseTest;
|
||||||
|
import org.owasp.dependencycheck.data.nvdcve.DatabaseProperties;
|
||||||
|
import org.owasp.dependencycheck.data.update.exception.UpdateException;
|
||||||
|
import org.owasp.dependencycheck.utils.DependencyVersion;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Jeremy Long <jeremy.long@owasp.org>
|
||||||
|
*/
|
||||||
|
public class EngineVersionCheckTest extends BaseTest {
|
||||||
|
|
||||||
|
// /**
|
||||||
|
// * Test of update method, of class EngineVersionCheck.
|
||||||
|
// */
|
||||||
|
// @Test
|
||||||
|
// public void testUpdate() throws Exception {
|
||||||
|
// EngineVersionCheck instance = new EngineVersionCheck();
|
||||||
|
// instance.update();
|
||||||
|
// }
|
||||||
|
/**
|
||||||
|
* Test of shouldUpdate method, of class EngineVersionCheck.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testShouldUpdate() throws Exception {
|
||||||
|
DatabaseProperties properties = new MockUp<DatabaseProperties>() {
|
||||||
|
final private Properties properties = new Properties();
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
public void save(String key, String value) throws UpdateException {
|
||||||
|
properties.setProperty(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
public String getProperty(String key) {
|
||||||
|
return properties.getProperty(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
}.getMockInstance();
|
||||||
|
|
||||||
|
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
|
||||||
|
|
||||||
|
String updateToVersion = "1.2.6";
|
||||||
|
String currentVersion = "1.2.6";
|
||||||
|
long lastChecked = df.parse("2014-12-01").getTime();
|
||||||
|
long now = df.parse("2014-12-01").getTime();
|
||||||
|
|
||||||
|
EngineVersionCheck instance = new EngineVersionCheck();
|
||||||
|
boolean expResult = false;
|
||||||
|
instance.setUpdateToVersion(updateToVersion);
|
||||||
|
boolean result = instance.shouldUpdate(lastChecked, now, properties, currentVersion);
|
||||||
|
assertEquals(expResult, result);
|
||||||
|
|
||||||
|
updateToVersion = "1.2.5";
|
||||||
|
currentVersion = "1.2.5";
|
||||||
|
lastChecked = df.parse("2014-10-01").getTime();
|
||||||
|
now = df.parse("2014-12-01").getTime();
|
||||||
|
expResult = true;
|
||||||
|
instance.setUpdateToVersion(updateToVersion);
|
||||||
|
result = instance.shouldUpdate(lastChecked, now, properties, currentVersion);
|
||||||
|
assertEquals(expResult, result);
|
||||||
|
//System.out.println(properties.getProperty(CURRENT_ENGINE_RELEASE));
|
||||||
|
|
||||||
|
updateToVersion = "1.2.5";
|
||||||
|
currentVersion = "1.2.5";
|
||||||
|
lastChecked = df.parse("2014-12-01").getTime();
|
||||||
|
now = df.parse("2014-12-03").getTime();
|
||||||
|
expResult = false;
|
||||||
|
instance.setUpdateToVersion(updateToVersion);
|
||||||
|
result = instance.shouldUpdate(lastChecked, now, properties, currentVersion);
|
||||||
|
assertEquals(expResult, result);
|
||||||
|
|
||||||
|
updateToVersion = "1.2.6";
|
||||||
|
currentVersion = "1.2.5";
|
||||||
|
lastChecked = df.parse("2014-12-01").getTime();
|
||||||
|
now = df.parse("2014-12-03").getTime();
|
||||||
|
expResult = true;
|
||||||
|
instance.setUpdateToVersion(updateToVersion);
|
||||||
|
result = instance.shouldUpdate(lastChecked, now, properties, currentVersion);
|
||||||
|
assertEquals(expResult, result);
|
||||||
|
|
||||||
|
updateToVersion = "1.2.5";
|
||||||
|
currentVersion = "1.2.6";
|
||||||
|
lastChecked = df.parse("2014-12-01").getTime();
|
||||||
|
now = df.parse("2014-12-08").getTime();
|
||||||
|
expResult = false;
|
||||||
|
instance.setUpdateToVersion(updateToVersion);
|
||||||
|
result = instance.shouldUpdate(lastChecked, now, properties, currentVersion);
|
||||||
|
assertEquals(expResult, result);
|
||||||
|
|
||||||
|
updateToVersion = "";
|
||||||
|
currentVersion = "1.2.5";
|
||||||
|
lastChecked = df.parse("2014-12-01").getTime();
|
||||||
|
now = df.parse("2014-12-03").getTime();
|
||||||
|
expResult = false;
|
||||||
|
instance.setUpdateToVersion(updateToVersion);
|
||||||
|
result = instance.shouldUpdate(lastChecked, now, properties, currentVersion);
|
||||||
|
assertEquals(expResult, result);
|
||||||
|
|
||||||
|
updateToVersion = "";
|
||||||
|
currentVersion = "1.2.5";
|
||||||
|
lastChecked = df.parse("2014-12-01").getTime();
|
||||||
|
now = df.parse("2014-12-08").getTime();
|
||||||
|
expResult = true;
|
||||||
|
instance.setUpdateToVersion(updateToVersion);
|
||||||
|
result = instance.shouldUpdate(lastChecked, now, properties, currentVersion);
|
||||||
|
assertEquals(expResult, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of getCurrentReleaseVersion method, of class EngineVersionCheck.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testGetCurrentReleaseVersion() {
|
||||||
|
EngineVersionCheck instance = new EngineVersionCheck();
|
||||||
|
DependencyVersion minExpResult = new DependencyVersion("1.2.6");
|
||||||
|
String release = instance.getCurrentReleaseVersion();
|
||||||
|
DependencyVersion result = new DependencyVersion(release);
|
||||||
|
assertTrue(minExpResult.compareTo(result) <= 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -34,7 +34,8 @@ public class NvdCveUpdaterIntegrationTest extends BaseTest {
|
|||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
int year = Calendar.getInstance().get(Calendar.YEAR);
|
int year = Calendar.getInstance().get(Calendar.YEAR);
|
||||||
if (year <= 2014) {
|
if (year <= 2014) {
|
||||||
File f = new File(NvdCveUpdaterIntegrationTest.class.getClassLoader().getResource("nvdcve-2.0-2014.xml").getPath());
|
//File f = new File(NvdCveUpdaterIntegrationTest.class.getClassLoader().getResource("nvdcve-2.0-2014.xml").getPath());
|
||||||
|
File f = BaseTest.getResourceAsFile(this, "nvdcve-2.0-2014.xml");
|
||||||
String baseURL = f.toURI().toURL().toString();
|
String baseURL = f.toURI().toURL().toString();
|
||||||
String modified12 = baseURL.replace("nvdcve-2.0-2014.xml", "nvdcve-modified.xml");
|
String modified12 = baseURL.replace("nvdcve-2.0-2014.xml", "nvdcve-modified.xml");
|
||||||
String modified20 = baseURL.replace("nvdcve-2.0-2014.xml", "nvdcve-2.0-modified.xml");
|
String modified20 = baseURL.replace("nvdcve-2.0-2014.xml", "nvdcve-2.0-modified.xml");
|
||||||
|
|||||||
@@ -18,8 +18,6 @@
|
|||||||
package org.owasp.dependencycheck.data.update;
|
package org.owasp.dependencycheck.data.update;
|
||||||
|
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.util.Calendar;
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.owasp.dependencycheck.BaseTest;
|
import org.owasp.dependencycheck.BaseTest;
|
||||||
@@ -47,26 +45,6 @@ public class StandardUpdateIntegrationTest extends BaseTest {
|
|||||||
instance.closeDataStores();
|
instance.closeDataStores();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Test of withinRange method, of class StandardUpdate.
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testWithinRange() throws Exception {
|
|
||||||
Calendar c = Calendar.getInstance();
|
|
||||||
|
|
||||||
long current = c.getTimeInMillis();
|
|
||||||
long lastRun = c.getTimeInMillis() - (3 * (1000 * 60 * 60 * 24));
|
|
||||||
int range = 7; // 7 days
|
|
||||||
StandardUpdate instance = getStandardUpdateTask();
|
|
||||||
boolean expResult = true;
|
|
||||||
boolean result = instance.withinRange(lastRun, current, range);
|
|
||||||
assertEquals(expResult, result);
|
|
||||||
|
|
||||||
lastRun = c.getTimeInMillis() - (8 * (1000 * 60 * 60 * 24));
|
|
||||||
expResult = false;
|
|
||||||
result = instance.withinRange(lastRun, current, range);
|
|
||||||
assertEquals(expResult, result);
|
|
||||||
}
|
|
||||||
// test removed as it is duplicative of the EngineIntegrationTest and the NvdCveUpdaterIntergraionTest
|
// test removed as it is duplicative of the EngineIntegrationTest and the NvdCveUpdaterIntergraionTest
|
||||||
// /**
|
// /**
|
||||||
// * Test of update method, of class StandardUpdate.
|
// * Test of update method, of class StandardUpdate.
|
||||||
@@ -77,7 +55,6 @@ public class StandardUpdateIntegrationTest extends BaseTest {
|
|||||||
// instance.update();
|
// instance.update();
|
||||||
// //TODO make this an actual test
|
// //TODO make this an actual test
|
||||||
// }
|
// }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test of updatesNeeded method, of class StandardUpdate.
|
* Test of updatesNeeded method, of class StandardUpdate.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of dependency-check-core.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 Jeremy Long. All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.owasp.dependencycheck.data.update.task;
|
||||||
|
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.owasp.dependencycheck.data.nvdcve.CveDB;
|
||||||
|
import org.owasp.dependencycheck.data.update.NvdCveInfo;
|
||||||
|
import org.owasp.dependencycheck.utils.Settings;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Jeremy Long <jeremy.long@owasp.org>
|
||||||
|
*/
|
||||||
|
public class DownloadTaskTest {
|
||||||
|
|
||||||
|
public DownloadTaskTest() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpClass() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void tearDownClass() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
Settings.initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() {
|
||||||
|
Settings.cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of call method, of class DownloadTask.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testCall() throws Exception {
|
||||||
|
NvdCveInfo cve = new NvdCveInfo();
|
||||||
|
cve.setId("modified");
|
||||||
|
cve.setNeedsUpdate(true);
|
||||||
|
cve.setUrl(Settings.getString(Settings.KEYS.CVE_MODIFIED_20_URL));
|
||||||
|
cve.setOldSchemaVersionUrl(Settings.getString(Settings.KEYS.CVE_MODIFIED_12_URL));
|
||||||
|
ExecutorService processExecutor = null;
|
||||||
|
CveDB cveDB = null;
|
||||||
|
DownloadTask instance = new DownloadTask(cve, processExecutor, cveDB, Settings.getInstance());
|
||||||
|
Future<ProcessTask> result = instance.call();
|
||||||
|
assertNull(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,6 +28,7 @@ import static org.junit.Assert.assertTrue;
|
|||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.owasp.dependencycheck.BaseTest;
|
||||||
import org.owasp.dependencycheck.dependency.VulnerableSoftware;
|
import org.owasp.dependencycheck.dependency.VulnerableSoftware;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -60,7 +61,8 @@ public class NvdCve_1_2_HandlerTest {
|
|||||||
SAXParserFactory factory = SAXParserFactory.newInstance();
|
SAXParserFactory factory = SAXParserFactory.newInstance();
|
||||||
SAXParser saxParser = factory.newSAXParser();
|
SAXParser saxParser = factory.newSAXParser();
|
||||||
|
|
||||||
File file = new File(this.getClass().getClassLoader().getResource("nvdcve-2012.xml").getPath());
|
//File file = new File(this.getClass().getClassLoader().getResource("nvdcve-2012.xml").getPath());
|
||||||
|
File file = BaseTest.getResourceAsFile(this, "nvdcve-2012.xml");
|
||||||
|
|
||||||
NvdCve12Handler instance = new NvdCve12Handler();
|
NvdCve12Handler instance = new NvdCve12Handler();
|
||||||
saxParser.parse(file, instance);
|
saxParser.parse(file, instance);
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import static org.junit.Assert.assertTrue;
|
|||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.owasp.dependencycheck.BaseTest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -59,7 +60,8 @@ public class NvdCve_2_0_HandlerTest {
|
|||||||
SAXParserFactory factory = SAXParserFactory.newInstance();
|
SAXParserFactory factory = SAXParserFactory.newInstance();
|
||||||
SAXParser saxParser = factory.newSAXParser();
|
SAXParser saxParser = factory.newSAXParser();
|
||||||
|
|
||||||
File file = new File(this.getClass().getClassLoader().getResource("nvdcve-2.0-2012.xml").getPath());
|
//File file = new File(this.getClass().getClassLoader().getResource("nvdcve-2.0-2012.xml").getPath());
|
||||||
|
File file = BaseTest.getResourceAsFile(this, "nvdcve-2.0-2012.xml");
|
||||||
|
|
||||||
NvdCve20Handler instance = new NvdCve20Handler();
|
NvdCve20Handler instance = new NvdCve20Handler();
|
||||||
|
|
||||||
|
|||||||
@@ -23,10 +23,13 @@ import java.util.Set;
|
|||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.AfterClass;
|
import org.junit.AfterClass;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.owasp.dependencycheck.BaseTest;
|
||||||
|
import org.owasp.dependencycheck.data.nexus.MavenArtifact;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -150,9 +153,11 @@ public class DependencyTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testGetMd5sum() {
|
public void testGetMd5sum() {
|
||||||
File file = new File(this.getClass().getClassLoader().getResource("struts2-core-2.1.2.jar").getPath());
|
//File file = new File(this.getClass().getClassLoader().getResource("struts2-core-2.1.2.jar").getPath());
|
||||||
|
File file = BaseTest.getResourceAsFile(this, "struts2-core-2.1.2.jar");
|
||||||
|
|
||||||
Dependency instance = new Dependency(file);
|
Dependency instance = new Dependency(file);
|
||||||
// assertEquals("89CE9E36AA9A9E03F1450936D2F4F8DD0F961F8B", result.getSha1sum());
|
//assertEquals("89CE9E36AA9A9E03F1450936D2F4F8DD0F961F8B", result.getSha1sum());
|
||||||
String expResult = "C30B57142E1CCBC1EFD5CD15F307358F";
|
String expResult = "C30B57142E1CCBC1EFD5CD15F307358F";
|
||||||
String result = instance.getMd5sum();
|
String result = instance.getMd5sum();
|
||||||
assertEquals(expResult, result);
|
assertEquals(expResult, result);
|
||||||
@@ -174,7 +179,8 @@ public class DependencyTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testGetSha1sum() {
|
public void testGetSha1sum() {
|
||||||
File file = new File(this.getClass().getClassLoader().getResource("struts2-core-2.1.2.jar").getPath());
|
//File file = new File(this.getClass().getClassLoader().getResource("struts2-core-2.1.2.jar").getPath());
|
||||||
|
File file = BaseTest.getResourceAsFile(this, "struts2-core-2.1.2.jar");
|
||||||
Dependency instance = new Dependency(file);
|
Dependency instance = new Dependency(file);
|
||||||
String expResult = "89CE9E36AA9A9E03F1450936D2F4F8DD0F961F8B";
|
String expResult = "89CE9E36AA9A9E03F1450936D2F4F8DD0F961F8B";
|
||||||
String result = instance.getSha1sum();
|
String result = instance.getSha1sum();
|
||||||
@@ -294,4 +300,34 @@ public class DependencyTest {
|
|||||||
EvidenceCollection result = instance.getVersionEvidence();
|
EvidenceCollection result = instance.getVersionEvidence();
|
||||||
assertTrue(true); //this is just a getter setter pair.
|
assertTrue(true); //this is just a getter setter pair.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of addAsEvidence method, of class Dependency.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testAddAsEvidence() {
|
||||||
|
Dependency instance = new Dependency();
|
||||||
|
MavenArtifact mavenArtifact = new MavenArtifact("group", "artifact", "version", "url");
|
||||||
|
instance.addAsEvidence("pom", mavenArtifact, Confidence.HIGH);
|
||||||
|
assertTrue(instance.getEvidence().contains(Confidence.HIGH));
|
||||||
|
assertFalse(instance.getEvidence().getEvidence("pom", "groupid").isEmpty());
|
||||||
|
assertFalse(instance.getEvidence().getEvidence("pom", "artifactid").isEmpty());
|
||||||
|
assertFalse(instance.getEvidence().getEvidence("pom", "version").isEmpty());
|
||||||
|
assertFalse(instance.getIdentifiers().isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of addAsEvidence method, of class Dependency.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testAddAsEvidenceWithEmptyArtefact() {
|
||||||
|
Dependency instance = new Dependency();
|
||||||
|
MavenArtifact mavenArtifact = new MavenArtifact(null, null, null, null);
|
||||||
|
instance.addAsEvidence("pom", mavenArtifact, Confidence.HIGH);
|
||||||
|
assertFalse(instance.getEvidence().contains(Confidence.HIGH));
|
||||||
|
assertTrue(instance.getEvidence().getEvidence("pom", "groupid").isEmpty());
|
||||||
|
assertTrue(instance.getEvidence().getEvidence("pom", "artifactid").isEmpty());
|
||||||
|
assertTrue(instance.getEvidence().getEvidence("pom", "version").isEmpty());
|
||||||
|
assertTrue(instance.getIdentifiers().isEmpty());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,8 +105,8 @@ public class ReportGeneratorIntegrationTest extends BaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates an XML report containing known vulnerabilities and realistic data and validates the generated XML
|
* Generates an XML report containing known vulnerabilities and realistic data and validates the generated XML document
|
||||||
* document against the XSD.
|
* against the XSD.
|
||||||
*
|
*
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
@@ -120,9 +120,12 @@ public class ReportGeneratorIntegrationTest extends BaseTest {
|
|||||||
}
|
}
|
||||||
String writeTo = "target/test-reports/Report.xml";
|
String writeTo = "target/test-reports/Report.xml";
|
||||||
|
|
||||||
File struts = new File(this.getClass().getClassLoader().getResource("struts2-core-2.1.2.jar").getPath());
|
//File struts = new File(this.getClass().getClassLoader().getResource("struts2-core-2.1.2.jar").getPath());
|
||||||
File axis = new File(this.getClass().getClassLoader().getResource("axis2-adb-1.4.1.jar").getPath());
|
File struts = BaseTest.getResourceAsFile(this, "struts2-core-2.1.2.jar");
|
||||||
File jetty = new File(this.getClass().getClassLoader().getResource("org.mortbay.jetty.jar").getPath());
|
//File axis = new File(this.getClass().getClassLoader().getResource("axis2-adb-1.4.1.jar").getPath());
|
||||||
|
File axis = BaseTest.getResourceAsFile(this, "axis2-adb-1.4.1.jar");
|
||||||
|
//File jetty = new File(this.getClass().getClassLoader().getResource("org.mortbay.jetty.jar").getPath());
|
||||||
|
File jetty = BaseTest.getResourceAsFile(this, "org.mortbay.jetty.jar");
|
||||||
|
|
||||||
boolean autoUpdate = Settings.getBoolean(Settings.KEYS.AUTO_UPDATE);
|
boolean autoUpdate = Settings.getBoolean(Settings.KEYS.AUTO_UPDATE);
|
||||||
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false);
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import static org.junit.Assert.assertTrue;
|
|||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.owasp.dependencycheck.BaseTest;
|
||||||
import org.xml.sax.InputSource;
|
import org.xml.sax.InputSource;
|
||||||
import org.xml.sax.XMLReader;
|
import org.xml.sax.XMLReader;
|
||||||
|
|
||||||
@@ -66,9 +67,11 @@ public class SuppressionHandlerTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testHandler() throws Exception {
|
public void testHandler() throws Exception {
|
||||||
File file = new File(this.getClass().getClassLoader().getResource("suppressions.xml").getPath());
|
//File file = new File(this.getClass().getClassLoader().getResource("suppressions.xml").getPath());
|
||||||
|
File file = BaseTest.getResourceAsFile(this, "suppressions.xml");
|
||||||
|
|
||||||
File schema = new File(this.getClass().getClassLoader().getResource("schema/suppression.xsd").getPath());
|
//File schema = new File(this.getClass().getClassLoader().getResource("schema/suppression.xsd").getPath());
|
||||||
|
File schema = BaseTest.getResourceAsFile(this, "schema/suppression.xsd");
|
||||||
SuppressionHandler handler = new SuppressionHandler();
|
SuppressionHandler handler = new SuppressionHandler();
|
||||||
|
|
||||||
SAXParserFactory factory = SAXParserFactory.newInstance();
|
SAXParserFactory factory = SAXParserFactory.newInstance();
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import static org.junit.Assert.assertTrue;
|
|||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.owasp.dependencycheck.BaseTest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test of the suppression parser.
|
* Test of the suppression parser.
|
||||||
@@ -57,7 +58,8 @@ public class SuppressionParserTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testParseSuppressionRules() throws Exception {
|
public void testParseSuppressionRules() throws Exception {
|
||||||
File file = new File(this.getClass().getClassLoader().getResource("suppressions.xml").getPath());
|
//File file = new File(this.getClass().getClassLoader().getResource("suppressions.xml").getPath());
|
||||||
|
File file = BaseTest.getResourceAsFile(this, "suppressions.xml");
|
||||||
SuppressionParser instance = new SuppressionParser();
|
SuppressionParser instance = new SuppressionParser();
|
||||||
List result = instance.parseSuppressionRules(file);
|
List result = instance.parseSuppressionRules(file);
|
||||||
assertTrue(result.size() > 3);
|
assertTrue(result.size() > 3);
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import static org.junit.Assert.assertTrue;
|
|||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.owasp.dependencycheck.BaseTest;
|
||||||
import org.owasp.dependencycheck.dependency.Dependency;
|
import org.owasp.dependencycheck.dependency.Dependency;
|
||||||
import org.owasp.dependencycheck.dependency.Identifier;
|
import org.owasp.dependencycheck.dependency.Identifier;
|
||||||
import org.owasp.dependencycheck.dependency.Vulnerability;
|
import org.owasp.dependencycheck.dependency.Vulnerability;
|
||||||
@@ -422,7 +423,8 @@ public class SuppressionRuleTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testProcess() {
|
public void testProcess() {
|
||||||
File struts = new File(this.getClass().getClassLoader().getResource("struts2-core-2.1.2.jar").getPath());
|
//File struts = new File(this.getClass().getClassLoader().getResource("struts2-core-2.1.2.jar").getPath());
|
||||||
|
File struts = BaseTest.getResourceAsFile(this, "struts2-core-2.1.2.jar");
|
||||||
Dependency dependency = new Dependency(struts);
|
Dependency dependency = new Dependency(struts);
|
||||||
dependency.addIdentifier("cpe", "cpe:/a:microsoft:.net_framework:4.5", "some url not needed for this test");
|
dependency.addIdentifier("cpe", "cpe:/a:microsoft:.net_framework:4.5", "some url not needed for this test");
|
||||||
String sha1 = dependency.getSha1sum();
|
String sha1 = dependency.getSha1sum();
|
||||||
@@ -501,7 +503,8 @@ public class SuppressionRuleTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testProcessGAV() {
|
public void testProcessGAV() {
|
||||||
File spring = new File(this.getClass().getClassLoader().getResource("spring-security-web-3.0.0.RELEASE.jar").getPath());
|
//File spring = new File(this.getClass().getClassLoader().getResource("spring-security-web-3.0.0.RELEASE.jar").getPath());
|
||||||
|
File spring = BaseTest.getResourceAsFile(this, "spring-security-web-3.0.0.RELEASE.jar");
|
||||||
Dependency dependency = new Dependency(spring);
|
Dependency dependency = new Dependency(spring);
|
||||||
dependency.addIdentifier("cpe", "cpe:/a:vmware:springsource_spring_framework:3.0.0", "some url not needed for this test");
|
dependency.addIdentifier("cpe", "cpe:/a:vmware:springsource_spring_framework:3.0.0", "some url not needed for this test");
|
||||||
dependency.addIdentifier("cpe", "cpe:/a:springsource:spring_framework:3.0.0", "some url not needed for this test");
|
dependency.addIdentifier("cpe", "cpe:/a:springsource:spring_framework:3.0.0", "some url not needed for this test");
|
||||||
|
|||||||
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014 OWASP.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.owasp.dependencycheck.utils;
|
||||||
|
|
||||||
|
import java.util.Calendar;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Jeremy Long <jeremy.long@owasp.org>
|
||||||
|
*/
|
||||||
|
public class DateUtilTest {
|
||||||
|
|
||||||
|
public DateUtilTest() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpClass() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void tearDownClass() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of withinDateRange method, of class DateUtil.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testWithinDateRange() {
|
||||||
|
Calendar c = Calendar.getInstance();
|
||||||
|
|
||||||
|
long current = c.getTimeInMillis();
|
||||||
|
long lastRun = c.getTimeInMillis() - (3 * (1000 * 60 * 60 * 24));
|
||||||
|
int range = 7; // 7 days
|
||||||
|
boolean expResult = true;
|
||||||
|
boolean result = DateUtil.withinDateRange(lastRun, current, range);
|
||||||
|
assertEquals(expResult, result);
|
||||||
|
|
||||||
|
lastRun = c.getTimeInMillis() - (8 * (1000 * 60 * 60 * 24));
|
||||||
|
expResult = false;
|
||||||
|
result = DateUtil.withinDateRange(lastRun, current, range);
|
||||||
|
assertEquals(expResult, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -165,6 +165,14 @@ public class DependencyVersionTest {
|
|||||||
version = new DependencyVersion("1.2.3.1");
|
version = new DependencyVersion("1.2.3.1");
|
||||||
assertEquals(-1, instance.compareTo(version));
|
assertEquals(-1, instance.compareTo(version));
|
||||||
|
|
||||||
|
instance = new DependencyVersion("1.0.1n");
|
||||||
|
version = new DependencyVersion("1.0.1m");
|
||||||
|
assertEquals(1, instance.compareTo(version));
|
||||||
|
version = new DependencyVersion("1.0.1n");
|
||||||
|
assertEquals(0, instance.compareTo(version));
|
||||||
|
version = new DependencyVersion("1.0.1o");
|
||||||
|
assertEquals(-1, instance.compareTo(version));
|
||||||
|
|
||||||
DependencyVersion[] dv = new DependencyVersion[7];
|
DependencyVersion[] dv = new DependencyVersion[7];
|
||||||
dv[0] = new DependencyVersion("2.1.3");
|
dv[0] = new DependencyVersion("2.1.3");
|
||||||
dv[1] = new DependencyVersion("2.1.3.r2");
|
dv[1] = new DependencyVersion("2.1.3.r2");
|
||||||
|
|||||||
@@ -54,13 +54,13 @@ public class DependencyVersionUtilTest {
|
|||||||
* Test of parseVersion method, of class DependencyVersionUtil.
|
* Test of parseVersion method, of class DependencyVersionUtil.
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testParseVersionFromFileName() {
|
public void testParseVersion() {
|
||||||
final String[] fileName = {"something-0.9.5.jar", "lib2-1.1.jar", "lib1.5r4-someflag-R26.jar",
|
final String[] fileName = {"something-0.9.5.jar", "lib2-1.1.jar", "lib1.5r4-someflag-R26.jar",
|
||||||
"lib-1.2.5-dev-20050313.jar", "testlib_V4.4.0.jar", "lib-core-2.0.0-RC1-SNAPSHOT.jar",
|
"lib-1.2.5-dev-20050313.jar", "testlib_V4.4.0.jar", "lib-core-2.0.0-RC1-SNAPSHOT.jar",
|
||||||
"lib-jsp-2.0.1_R114940.jar", "dev-api-2.3.11_R121413.jar", "lib-api-3.7-SNAPSHOT.jar",
|
"lib-jsp-2.0.1_R114940.jar", "dev-api-2.3.11_R121413.jar", "lib-api-3.7-SNAPSHOT.jar",
|
||||||
"-", "", "1.3-beta", "6"};
|
"-", "", "1.3-beta", "6", "openssl1.0.1c", "jsf-impl-2.2.8-02.jar"};
|
||||||
final String[] expResult = {"0.9.5", "1.1", "1.5.r4", "1.2.5", "4.4.0", "2.0.0.rc1",
|
final String[] expResult = {"0.9.5", "1.1", "1.5.r4", "1.2.5", "4.4.0", "2.0.0.rc1",
|
||||||
"2.0.1.r114940", "2.3.11.r121413", "3.7", "-", null, "1.3.beta", "6"};
|
"2.0.1.r114940", "2.3.11.r121413", "3.7", "-", null, "1.3.beta", "6", "1.0.1c", "2.2.8.02"};
|
||||||
|
|
||||||
for (int i = 0; i < fileName.length; i++) {
|
for (int i = 0; i < fileName.length; i++) {
|
||||||
final DependencyVersion version = DependencyVersionUtil.parseVersion(fileName[i]);
|
final DependencyVersion version = DependencyVersionUtil.parseVersion(fileName[i]);
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ application.version=${pom.version}
|
|||||||
autoupdate=true
|
autoupdate=true
|
||||||
max.download.threads=3
|
max.download.threads=3
|
||||||
|
|
||||||
|
# the url to obtain the current engine version from
|
||||||
|
engine.version.url=http://jeremylong.github.io/DependencyCheck/current.txt
|
||||||
|
|
||||||
#temp.directory defaults to System.getProperty("java.io.tmpdir")
|
#temp.directory defaults to System.getProperty("java.io.tmpdir")
|
||||||
#temp.directory=[path to temp directory]
|
#temp.directory=[path to temp directory]
|
||||||
|
|
||||||
@@ -47,11 +50,16 @@ cpe.meta.url=http://static.nvd.nist.gov/feeds/xml/cpe/dictionary/official-cpe-di
|
|||||||
cve.url.modified.validfordays=7
|
cve.url.modified.validfordays=7
|
||||||
|
|
||||||
# the path to the modified nvd cve xml file.
|
# the path to the modified nvd cve xml file.
|
||||||
cve.url-1.2.modified=http://nvd.nist.gov/download/nvdcve-modified.xml
|
|
||||||
cve.url-2.0.modified=http://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-modified.xml
|
|
||||||
cve.startyear=2014
|
cve.startyear=2014
|
||||||
cve.url-2.0.base=http://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-%d.xml
|
cve.url-1.2.modified=https://nvd.nist.gov/download/nvdcve-Modified.xml.gz
|
||||||
cve.url-1.2.base=http://nvd.nist.gov/download/nvdcve-%d.xml
|
#cve.url-1.2.modified=http://nvd.nist.gov/download/nvdcve-modified.xml
|
||||||
|
cve.url-2.0.modified=https://nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-Modified.xml.gz
|
||||||
|
#cve.url-2.0.modified=http://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-modified.xml
|
||||||
|
cve.url-1.2.base=https://nvd.nist.gov/download/nvdcve-%d.xml.gz
|
||||||
|
#cve.url-1.2.base=http://nvd.nist.gov/download/nvdcve-%d.xml
|
||||||
|
cve.url-2.0.base=https://nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-%d.xml.gz
|
||||||
|
#cve.url-2.0.base=http://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-%d.xml
|
||||||
|
|
||||||
|
|
||||||
# the URL for searching Nexus for SHA-1 hashes and whether it's enabled
|
# the URL for searching Nexus for SHA-1 hashes and whether it's enabled
|
||||||
analyzer.nexus.enabled=true
|
analyzer.nexus.enabled=true
|
||||||
@@ -59,3 +67,7 @@ analyzer.nexus.url=https://repository.sonatype.org/service/local/
|
|||||||
# If set to true, the proxy will still ONLY be used if the proxy properties (proxy.url, proxy.port)
|
# If set to true, the proxy will still ONLY be used if the proxy properties (proxy.url, proxy.port)
|
||||||
# are configured
|
# are configured
|
||||||
analyzer.nexus.proxy=true
|
analyzer.nexus.proxy=true
|
||||||
|
|
||||||
|
# the URL for searching search.maven.org for SHA-1 and whether it's enabled
|
||||||
|
analyzer.central.enabled=true
|
||||||
|
analyzer.central.url=http://search.maven.org/solrsearch/select
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user