Compare commits

..

1047 Commits

Author SHA1 Message Date
Jeremy Long
1b3b4a5906 version 1.3.2 2015-11-29 07:34:45 -05:00
Jeremy Long
5c8b374352 updated documentation 2015-11-28 08:14:00 -05:00
Jeremy Long
e05cef6886 extended the wrong base test case 2015-11-27 07:07:17 -05:00
Jeremy Long
cb39ecacf9 moved dependency-check-gradle to a new repo 2015-11-27 06:54:48 -05:00
Jeremy Long
e6816f94eb moving documentation of gradle and jenkins plugins under the main parent site 2015-11-26 06:36:35 -05:00
Jeremy Long
8b5dbeab44 removed stack trace in build when bundle audit is not installed 2015-11-25 05:59:58 -05:00
Jeremy Long
29c21c3611 pmd/checkstyle/findbugs corrections 2015-11-25 05:43:04 -05:00
Jeremy Long
e05bed8d65 Merge branch 'master' of github.com:jeremylong/DependencyCheck 2015-11-24 16:12:30 -05:00
Jeremy Long
1b2210aba0 pmd/checkstyle/findbugs corrections 2015-11-24 16:12:23 -05:00
Jeremy Long
7fb1b1d57b Merge pull request #330 from dwvisser/ruby-bundler
Ruby bundler-audit Analyzer
2015-11-24 15:53:00 -05:00
Jeremy Long
a3adf71a1d avoid npe 2015-11-24 05:43:45 -05:00
Jeremy Long
51d81fab5d grok assembly exe was hanging, reordered so input stream was processed before error stream to resolve the issue. 2015-11-24 05:34:34 -05:00
Dale Visser
2ed5dc153a Fixed merge conflict in App.java 2015-11-23 13:27:22 -05:00
Jeremy Long
5f8f156bee Merge branch 'master' of github.com:jeremylong/DependencyCheck 2015-11-22 07:31:27 -05:00
Jeremy Long
eb03c90d7a updated documentation 2015-11-22 07:31:17 -05:00
Jeremy Long
fc05471086 bug fix that might be related to #388, in addition added logging incase the bug fix does not work 2015-11-22 07:30:28 -05:00
Jeremy Long
b9db2dd89f Merge pull request #409 from awhitford/MinorCodeTweaks
Thanks!
2015-11-22 07:14:12 -05:00
Jeremy Long
de7fe21a4f Merge pull request #411 from hansjoachim/upgrade-slf4j
Upgraded slf4j to latest version
2015-11-22 07:07:07 -05:00
Jeremy Long
56f9a7c4f9 Merge pull request #407 from awhitford/DepUpg
Upgraded dependencies.
2015-11-22 07:06:38 -05:00
Hans Joachim Desserud
df569a5ae2 Upgraded slf4j to latest version 2015-11-14 10:10:44 +01:00
Jeremy Long
acb9d04c51 updated to be feature complete with 1.3.2-SNAPSHOT 2015-11-11 18:44:19 -05:00
Jeremy Long
09c4708a22 update for issue #410 2015-11-11 00:58:00 -05:00
Anthony Whitford
b346dfe0a3 Minor code tweaks. 2015-11-10 00:09:01 -08:00
Jeremy Long
5f259cb88c added missed configuration options for new analyzers 2015-11-07 06:37:36 -05:00
Anthony Whitford
fb2aff3310 Upgraded dependencies. 2015-11-06 23:16:12 -08:00
Jeremy Long
3c4c65c28c corrected NVD CVE URLs 2015-11-04 06:00:04 -05:00
Jeremy Long
15885e3e8c Merge branch 'awhitford-ModelInterpolationAlt' 2015-11-03 05:52:54 -05:00
Jeremy Long
5508c60e85 resulved conflict 2015-11-03 05:52:22 -05:00
Jeremy Long
ffc341e4b9 Merge pull request #405 from awhitford/StringToChar
One character String constants with char constants
2015-11-03 05:43:41 -05:00
Jeremy Long
41a68f7b25 Merge pull request #406 from awhitford/DropCountCharacters
Removed unnecessary countCharacter method.
2015-11-03 05:42:28 -05:00
Anthony Whitford
041d3c5312 Removed unnecessary countCharacter method by leveraging StringUtils.countMatches. 2015-11-01 23:19:37 -08:00
Anthony Whitford
8e8b462bc8 Replaced one character String constants with char constants, when applicable. 2015-11-01 22:39:30 -08:00
Jeremy Long
efbc76e06f Merge pull request #402 from awhitford/SettingsSetters
New setters for Settings
2015-11-01 05:52:34 -05:00
Jeremy Long
67a44d2adc added postgres 2015-11-01 05:50:08 -05:00
Anthony Whitford
92a35b929a Leveraged the new setters with null and empty checking for Settings. 2015-10-31 10:26:32 -07:00
Anthony Whitford
e5744dd63f Added extra setters with null and empty checks. 2015-10-31 10:25:50 -07:00
Jeremy Long
f2f3d050bd added 3.0 update schema 2015-10-31 07:25:02 -04:00
Jeremy Long
0cbecbe3a0 Merge branch 'master' of github.com:jeremylong/DependencyCheck 2015-10-30 05:42:36 -04:00
Jeremy Long
51a8b5a058 added mysql dialect 2015-10-30 05:41:12 -04:00
Jeremy Long
aaf716e54b Merge pull request #395 from awhitford/IOUtils
Leverage IOUtils
2015-10-30 05:32:44 -04:00
Jeremy Long
209fcc7946 Merge pull request #397 from awhitford/ModelInterpolate
Improved interpolateString.
2015-10-30 05:31:35 -04:00
Jeremy Long
a5cb131806 Merge pull request #400 from kgeis/patch-1
Update index.md.vm
2015-10-30 05:23:09 -04:00
Ken Geis
8fbeb5f5d5 Update index.md.vm
update usage examples to match currently used flags (--app -> --project)
2015-10-28 09:26:59 -07:00
Anthony Whitford
a92bdfe30d Alternative interpolateString implementation leveraging commons-lang3. 2015-10-28 00:08:12 -07:00
Anthony Whitford
7f130ff036 Improved interpolateString. 2015-10-27 23:25:28 -07:00
Jeremy Long
b704f72854 fixed npe 2015-10-27 06:15:34 -04:00
Anthony Whitford
e21f8a97ac More opportunities to leverage IOUtils. 2015-10-27 01:00:29 -07:00
Anthony Whitford
a8ff403809 Removed unused imports. 2015-10-27 01:00:04 -07:00
Anthony Whitford
22097c0a25 Replaced boiler-plate file read with simpler IOUtils call. 2015-10-27 00:10:32 -07:00
Jeremy Long
92e7d9cf80 improved update failure reporting 2015-10-26 06:36:10 -04:00
Jeremy Long
54d921f275 added test case 2015-10-26 06:32:02 -04:00
Jeremy Long
08d7b3dbce currently unused but contains DDL that may be needed in the future 2015-10-26 06:31:43 -04:00
Jeremy Long
6949b3c229 update file cannot contain comments 2015-10-26 06:30:56 -04:00
Jeremy Long
b0ca38bd29 reverted surefire due to IDE integration failures with 2.19 2015-10-26 06:30:16 -04:00
Jeremy Long
cf173ee9e7 Merge branch 'master' of github.com:jeremylong/DependencyCheck 2015-10-25 06:22:36 -04:00
Jeremy Long
aa9908b34a updated test properties w/ changes that had been made in the main properties 2015-10-25 06:22:30 -04:00
Jeremy Long
640674ef72 minor - added a comment explaining one of the preoperties 2015-10-25 06:21:48 -04:00
Jeremy Long
0c69ab80bb Merge pull request #382 from awhitford/MojoStreamClose
Removed unnecessary OutputStream closing.
2015-10-25 06:04:28 -04:00
Jeremy Long
662557c2f3 Merge pull request #387 from fabioscala/feature/overrideSuppressionFile
Allow setting suppression file in gradle plugin
2015-10-25 06:03:15 -04:00
Jeremy Long
346b2c31d2 moved default values to the properties file instead of hard-coding them 2015-10-25 05:58:57 -04:00
Jeremy Long
62dbf99557 moved default values to the properties file instead of hard-coding them 2015-10-25 05:57:24 -04:00
Jeremy Long
99b140adaa updated field name to make it more clear 2015-10-24 06:19:00 -04:00
Jeremy Long
387d577d4f updated field name to make it more clear 2015-10-24 06:18:36 -04:00
Jeremy Long
ab7eee7db9 updated field name to make it more clear 2015-10-24 06:18:09 -04:00
Jeremy Long
487a45f01b updated field name to make it more clear 2015-10-24 06:17:31 -04:00
Jeremy Long
60665c6bd8 Merge pull request #392 from awhitford/PluginUpgrades
Upgraded plugins.
2015-10-23 06:30:17 -04:00
Jeremy Long
8fc9a3d6d1 Merge pull request #391 from awhitford/CpeSetting
Change CpeUpdater to use CPE_MODIFIED_VALID_FOR_DAYS
2015-10-23 06:29:51 -04:00
Jeremy Long
05a05f7e88 Merge branch 'awhitford-NvdCheck' 2015-10-23 06:28:34 -04:00
Jeremy Long
0c5bdfd7b7 added a setInt in support of PR #390 2015-10-23 06:28:04 -04:00
Jeremy Long
626e93c7e3 minor changes to patch for PR #390 2015-10-23 06:27:29 -04:00
Jeremy Long
b588c4c900 set a default value of four hours for issue #390 2015-10-23 06:26:42 -04:00
Jeremy Long
c52a0d88df expanded issue #390 to the CLI 2015-10-23 06:25:47 -04:00
Jeremy Long
84838d19d9 added documentation for issue #390 2015-10-23 06:25:20 -04:00
Jeremy Long
faf335a181 expanded issue #390 to the Ant task 2015-10-23 06:24:14 -04:00
Jeremy Long
5c25351884 removed default value that over-wrote the properties file value 2015-10-23 06:22:58 -04:00
Jeremy Long
520f3cb09a Merge branch 'NvdCheck' of https://github.com/awhitford/DependencyCheck into awhitford-NvdCheck 2015-10-23 05:32:27 -04:00
Anthony Whitford
e234246618 Upgraded plugins. 2015-10-22 00:18:50 -07:00
Anthony Whitford
5d1d378f61 Shouldn't CPE Updater use the CPE_MODIFIED_VALID_FOR_DAYS setting (not CVE)? 2015-10-21 23:56:28 -07:00
Anthony Whitford
cef3bb7424 Reworked withinDateRange to avoid type conversion between doubles and longs; expressed in long integer math. 2015-10-21 23:27:03 -07:00
Anthony Whitford
ccb03f2763 Added cveValidForHours parameter that can suppress redundant and repetitive checks for NVD CVE changes. 2015-10-21 23:25:18 -07:00
Anthony Whitford
1f6168366b Added logic to optionally prevent overly repetitive checks for NVD CVE changes. 2015-10-21 23:23:47 -07:00
Anthony Whitford
cd5bf85245 Added a database property for recording the last time the NVD CVE was checked. 2015-10-21 23:21:25 -07:00
Anthony Whitford
f2778e5d28 Adding a setting to suppress repetitive NVD checks. 2015-10-21 23:19:57 -07:00
Jeremy Long
c2e6065ed7 added option to change the name of the report per issue #389 2015-10-20 06:18:28 -04:00
Jeremy Long
fccba5f7fd Merge pull request #381 from awhitford/SkipMojo
Added basic skip option for mojos.
2015-10-20 05:58:16 -04:00
Jeremy Long
3f230c5a05 resolve issue #372 2015-10-18 06:32:44 -04:00
Jeremy Long
dc849c3891 removed duplicate abstract test base 2015-10-18 06:17:21 -04:00
Jeremy Long
2770b58a20 fixing the build 2015-10-18 06:07:23 -04:00
Jeremy Long
37519acfb8 minor performance improvement 2015-10-17 07:42:09 -04:00
Jeremy Long
ad8c7b3cd2 missed one character in my lucene escape util 2015-10-17 07:40:38 -04:00
Jeremy Long
04db8d3208 Merge pull request #385 from awhitford/FileUtils
Leverage FilenameUtils
2015-10-16 06:30:53 -04:00
Jeremy Long
666e3b1e30 fix for issue #384 2015-10-16 06:23:03 -04:00
Fabio Scala
dc68781c06 Allow setting suppression file in gradle plugin 2015-10-15 11:24:33 +02:00
Jeremy Long
a7f50d147e depending on test order this test may fail if ArchiveAnalyzer was previously loaded. 2015-10-14 07:12:04 -04:00
Anthony Whitford
7e639db5de Leveraging FilenameUtils rather than string dissection. 2015-10-14 00:16:20 -07:00
Anthony Whitford
19a97a1706 Demonstrating the benefit of commons-io instead of the simpler string dissection. 2015-10-13 23:59:31 -07:00
Anthony Whitford
cd66a9ef61 Demonstrating the benefit of commons-io instead of the simpler string dissection. 2015-10-13 23:59:11 -07:00
Anthony Whitford
f121430a5d Simplified getFileExtension by leveraging commons-io. Also cut a line from delete. 2015-10-13 23:50:41 -07:00
Jeremy Long
2f518dacfc Merge branch 'master' of github.com:jeremylong/DependencyCheck 2015-10-13 21:24:22 -04:00
Jeremy Long
fded8b6cd3 fixed issue #383 2015-10-13 21:24:03 -04:00
Jeremy Long
3b6c64dc9d move test resource to correct directory 2015-10-13 19:03:33 -04:00
Jeremy Long
d742985640 resolve issue #377 2015-10-13 19:03:19 -04:00
Jeremy Long
a13dd58989 Merge pull request #380 from awhitford/TestLint
Removed compiler warnings from test code.
2015-10-12 06:46:50 -04:00
Jeremy Long
622b3210ae Merge pull request #379 from awhitford/HashSetLen
Sized the new HashSet to avoid rehashing risk.
2015-10-12 06:46:12 -04:00
Jeremy Long
90c97ed6aa Merge pull request #376 from awhitford/ComposerExSerial
Added missing serialVersionUID to new ComposerException.
2015-10-12 06:45:38 -04:00
Jeremy Long
53a4dfbf88 Merge pull request #378 from awhitford/RmNonCloseStream
Removing unused NonClosingStream.
2015-10-12 06:45:20 -04:00
Jeremy Long
f488c57363 Merge branch 'awhitford-DbMerge' 2015-10-12 06:44:00 -04:00
Jeremy Long
0ce830ca9d fixed test case to correctly initialize the settings 2015-10-12 06:43:32 -04:00
Jeremy Long
30ae418c2c updated MySQL profile 2015-10-12 06:42:55 -04:00
Jeremy Long
3b976d211f upgrdae db schema version 2015-10-12 06:15:24 -04:00
Jeremy Long
cca49b5dc2 added information regarding updating the database schema 2015-10-12 06:13:06 -04:00
Jeremy Long
8c2b2070c6 added URL to database upgrade page 2015-10-12 05:53:07 -04:00
Jeremy Long
24b8ff26db Merge branch 'DbMerge' of https://github.com/awhitford/DependencyCheck into awhitford-DbMerge 2015-10-12 05:48:03 -04:00
Jeremy Long
f0d93538ae changed update script to fail on non-H2 databases; they require manual upgrades 2015-10-12 05:47:50 -04:00
Jeremy Long
02eab65c4e upgrade h2 db schema to 3.0 2015-10-12 05:47:00 -04:00
Jeremy Long
d941aa7df3 script to upgrade a MySQL db 2015-10-12 05:46:33 -04:00
Anthony Whitford
b5026a45f6 Removed unnecessary OutputStream closing. Also the flush and reset are not necessary since the stream is being closed right away. 2015-10-11 19:09:03 -07:00
Anthony Whitford
79fde3ebc9 Added basic skip option for mojos. 2015-10-11 18:44:25 -07:00
Anthony Whitford
031d648585 Removed compiler warnings from test code. 2015-10-11 17:48:27 -07:00
Anthony Whitford
762b2fe7d6 Leverage Collections.singleton for single entry HashSets. 2015-10-11 17:32:08 -07:00
Anthony Whitford
5db377923e Sized the new HashSet to avoid rehashing risk. 2015-10-11 16:51:57 -07:00
Anthony Whitford
c3177df739 Removing unused NonClosingStream. 2015-10-11 11:42:03 -07:00
Anthony Whitford
0dc36765f1 Added missing serialVersionUID to new ComposerException. 2015-10-10 16:19:59 -07:00
Jeremy Long
38e61ebd8d Merge branch 'awhitford-MvnPhase' 2015-10-10 06:15:29 -04:00
Jeremy Long
529b9739b5 changed default phase to VERIFY 2015-10-10 06:14:50 -04:00
Jeremy Long
a014ca7d8a Merge branch 'MvnPhase' of https://github.com/awhitford/DependencyCheck into awhitford-MvnPhase 2015-10-10 05:59:04 -04:00
Jeremy Long
83701f7d0d Merge pull request #374 from awhitford/EngineScanTweak
Consolidated scan(Set) and scan(List) with scan(Collection).
2015-10-10 05:54:31 -04:00
Jeremy Long
b2500939f3 Merge pull request #375 from skitt/cme-fix
Avoid ConcurrentModificationExceptions
2015-10-10 05:52:32 -04:00
Stephen Kitt
1852b9dbb2 Avoid ConcurrentModificationExceptions
AggregateMojo.getDescendants() can end up adding descendants while
it's iterating over them. This separates the addition from the
iteration to avoid this.

Signed-off-by: Stephen Kitt <skitt@redhat.com>
2015-10-09 17:07:27 +02:00
Anthony Whitford
069474fc71 Consolidated scan(Set) and scan(List) with scan(Collection). 2015-10-09 07:52:43 -07:00
Jeremy Long
e7f518264a Merge branch 'master' of github.com:jeremylong/DependencyCheck 2015-10-09 08:52:06 -04:00
Jeremy Long
b0b096c3f5 updated version to 1.3.2-SNAPSHOT 2015-10-09 08:51:58 -04:00
Jeremy Long
bfa9d04d42 added another suppression rule 2015-10-09 08:33:04 -04:00
Jeremy Long
7dbe58469a Merge pull request #371 from awhitford/CpeLucenePerf
Re-use Document and Field instances to minimize GC overhead.
2015-10-09 07:03:35 -04:00
Jeremy Long
41b36dabc2 Merge pull request #370 from awhitford/DontLogToString
Do not need or want to call toString for a logger parameter.
2015-10-09 07:01:44 -04:00
Jeremy Long
4a685557d9 Merge pull request #369 from awhitford/BadSuppress
Removed unnecessary @SuppressWarnings.
2015-10-09 07:01:02 -04:00
Jeremy Long
e7ef4b6906 Merge pull request #367 from awhitford/SettingsCleanup
Settings cleanup
2015-10-09 07:00:39 -04:00
Jeremy Long
67502fb9d3 Merge pull request #368 from awhitford/UtilsCleanup
Utils cleanup
2015-10-09 06:59:33 -04:00
Anthony Whitford
960283bdcf Do not need or want to call toString for a logger parameter. 2015-10-09 02:08:07 -07:00
Anthony Whitford
39f30eab7a Re-use Document and Field instances to minimize GC overhead. See http://wiki.apache.org/lucene-java/ImproveIndexingSpeed 2015-10-09 00:38:55 -07:00
Anthony Whitford
24b4741aaf Removed unnecessary @SuppressWarnings. 2015-10-08 23:40:14 -07:00
Anthony Whitford
64f373fb43 Removed old warning suppression. 2015-10-08 20:58:20 -07:00
Anthony Whitford
bc1830d8eb Removed redundant call to length for substring. 2015-10-08 20:57:28 -07:00
Anthony Whitford
f2a2a91682 Slight simplification to standard getInt and getLong. 2015-10-08 00:56:38 -07:00
Anthony Whitford
274ac339ad Corrected a few bugs in Settings. 2015-10-08 00:39:57 -07:00
Anthony Whitford
1d916286ee Changing the check phase from compile to verify. 2015-10-07 23:11:53 -07:00
Jeremy Long
832d54300a fixed suppression for issue #365 2015-10-03 07:41:15 -04:00
Jeremy Long
ba6d3bbe15 added suppression for issue #365 2015-10-03 07:35:05 -04:00
Jeremy Long
c1d0789ac7 the Central analyzer should be enabled by default 2015-09-30 06:37:47 -04:00
Dale Visser
0573d0083e Ruby Bundler: Throw AnalysisException in initialize if can't run bundle-audit. 2015-09-22 15:07:43 -04:00
Dale Visser
e57d62b682 Merge branch 'upmaster' into ruby-bundler
Conflicts:
	dependency-check-cli/src/main/java/org/owasp/dependencycheck/App.java
	dependency-check-cli/src/main/java/org/owasp/dependencycheck/CliParser.java
	dependency-check-core/src/main/resources/META-INF/services/org.owasp.dependencycheck.analyzer.Analyzer
2015-09-22 14:21:43 -04:00
Jeremy Long
bb6f27b322 updated other tool(s) listed 2015-09-22 06:12:10 -04:00
Jeremy Long
86f424ad37 Merge pull request #358 from wmaintw/master
update the version of dependency-check-core that the gradle plugin used
2015-09-22 06:01:19 -04:00
ma wei
ad81bbc761 modify README 2015-09-21 09:26:25 +08:00
ma wei
07e868e6f6 upgrade dependency check core version to 1.3.1 2015-09-21 09:24:58 +08:00
Jeremy Long
b45700df03 version 1.3.1 2015-09-20 07:17:00 -04:00
Jeremy Long
93ce2a8e3a fixed path in zip to be different then the cli 2015-09-20 07:14:02 -04:00
Jeremy Long
fbc4d46962 updated language list to include php 2015-09-20 06:39:55 -04:00
Jeremy Long
d73d138b3f checkstyle/pmd/findbugs corrections 2015-09-20 06:39:27 -04:00
Jeremy Long
14ea21d53d checkstyle/pmd/findbugs corrections 2015-09-20 06:38:47 -04:00
Jeremy Long
2b3791b83e checkstyle/findbugs/pmd/copyright corrections 2015-09-19 08:20:58 -04:00
Jeremy Long
e04809f96b checkstyle/findbugs/pmd/copyright corrections 2015-09-19 08:20:14 -04:00
Jeremy Long
9203acff9c checkstyle/pmd/findbugs patches 2015-09-19 07:52:24 -04:00
Jeremy Long
afc1a9f077 removed unused settings 2015-09-18 06:53:30 -04:00
Jeremy Long
fc57851113 added options to disable analyzers 2015-09-18 06:52:36 -04:00
Jeremy Long
1f1d3f843f Merge branch 'colezlaw-composer-json' 2015-09-18 05:47:35 -04:00
Jeremy Long
b389260dec updated copyright 2015-09-18 05:47:06 -04:00
ma wei
1f37a5ff8f update the example command in README file 2015-09-17 17:17:41 +08:00
ma wei
815d60eca2 update README, fix typo which would lead to unable to apply this plugin 2015-09-17 17:15:42 +08:00
Dale Visser
877a584a26 Ruby Bundler: Disable Gemspec analysis if successful init. Moved to new analysis phase after init, before info collection. 2015-09-15 12:27:26 -04:00
Dale Visser
0c60c9ff75 Merge branch 'upmaster' into ruby-bundler 2015-09-15 11:59:59 -04:00
Will Stranathan
6a7a868b71 Initial checkin of ComposerLockAnalyzer 2015-09-14 22:14:00 -04:00
Jeremy Long
b5a070b228 Merge pull request #345 from hansjoachim/upgrades
Upgrade jmockit to 1.19
2015-09-14 19:29:15 -04:00
Dale Visser
39f13c6e5b Merge branch 'upmaster' into ruby-bundler 2015-09-14 17:14:20 -04:00
Jeremy Long
8c98da09f0 Merge pull request #355 from hansjoachim/warnings
Warnings
2015-09-13 19:31:16 -04:00
Jeremy Long
ed70a7200c Merge pull request #356 from awhitford/CompilerWarn
Enabled Compiler Lint Check and Deprecation Warnings
2015-09-13 19:28:26 -04:00
Anthony Whitford
ea4410cd16 Added missing serialVersionUID. 2015-09-13 10:57:54 -07:00
Anthony Whitford
9d9b1cbcd5 Replaced hashCode to leverage builder instead of deprecated ObjectUtils methods. 2015-09-13 10:55:02 -07:00
Anthony Whitford
f17d8f38fb Replaced equals and hashCode to leverage builders instead of deprecated ObjectUtils methods. 2015-09-13 10:48:03 -07:00
Anthony Whitford
0efc9d1cd2 Added missing serialVersionUID. 2015-09-13 10:34:19 -07:00
Anthony Whitford
4f5d5f1afd Added missing serialVersionUID. 2015-09-13 10:30:08 -07:00
Anthony Whitford
c4d8d7abf4 Removed redundant maven-compiler-plugin declaration. 2015-09-13 10:22:44 -07:00
Anthony Whitford
3fad29a709 Enabled lint check and deprecation warnings during compilation. 2015-09-13 10:22:25 -07:00
Hans Joachim Desserud
665f204c1f Code review: remove outcommented @Override annotation 2015-09-13 19:05:53 +02:00
Hans Joachim Desserud
362b651823 Unused imports 2015-09-13 17:06:44 +02:00
Hans Joachim Desserud
49b56588b8 Replace with foreach 2015-09-13 17:04:46 +02:00
Hans Joachim Desserud
c7a763ffdc Remove inheritance from Junit3 class and empty, unused methods 2015-09-13 17:01:32 +02:00
Hans Joachim Desserud
5435ddad9f Place array designator on the type 2015-09-13 16:46:14 +02:00
Hans Joachim Desserud
0ecd466c4c Add missing @Override annotations 2015-09-13 14:52:08 +02:00
Jeremy Long
6117e25b97 resolved merge 2015-09-13 07:49:25 -04:00
Jeremy Long
ee10f09bc6 Merge branch 'awhitford-StringB' 2015-09-13 07:47:11 -04:00
Jeremy Long
58512e302f resolved conflicts 2015-09-13 07:46:46 -04:00
Jeremy Long
ce564c209b removed deprecated/unused methods 2015-09-13 07:43:05 -04:00
Jeremy Long
7296d49693 Merge pull request #352 from awhitford/mpirp
Upgraded maven-project-info-reports-plugin from 2.8 to 2.8.1.
2015-09-13 07:41:01 -04:00
Jeremy Long
290fdc4c0f Merge pull request #350 from awhitford/AnalyzeIO
Replaced code with IOUtils.copy.

Thanks for the PR!
2015-09-13 07:40:41 -04:00
Jeremy Long
1fa5ae695d Merge pull request #349 from hansjoachim/warnings
Fixes various warnings
2015-09-13 07:37:25 -04:00
Jeremy Long
b2ba6d38b8 Merge branch 'hansjoachim-directoryscanner' 2015-09-13 07:29:56 -04:00
Jeremy Long
620f1b94bc added more false positive suppressions 2015-09-13 07:29:17 -04:00
Jeremy Long
c8fb5d1a9a excluded ant-launcher 2015-09-13 07:28:41 -04:00
Jeremy Long
1f763aeb72 Merge branch 'directoryscanner' of https://github.com/hansjoachim/DependencyCheck into hansjoachim-directoryscanner 2015-09-13 07:13:47 -04:00
Jeremy Long
fcfb019555 suppressed findbugs redundant null check 2015-09-13 07:03:55 -04:00
Jeremy Long
d4c1acb126 checkstyle fix - empty catch 2015-09-13 07:03:15 -04:00
Jeremy Long
862bf43685 suppressed checkstyle warnings 2015-09-13 07:02:41 -04:00
Jeremy Long
f83139a9ee fixed line length checkstyle finding 2015-09-13 07:02:13 -04:00
Jeremy Long
3d938b3edf added findbugs annotations to allow suppression 2015-09-13 07:01:28 -04:00
Jeremy Long
6c6ae66e36 added SuppressionCommentFilter so we can suppress individual findings 2015-09-13 07:01:10 -04:00
Jeremy Long
813e423bec added findbugs annotations to allow suppression 2015-09-13 07:00:27 -04:00
Anthony Whitford
a9a235fc87 Replaced StringBuffer with more efficient StringBuilder. 2015-09-12 19:53:44 -07:00
Anthony Whitford
6e1c6b4bed Replaced StringBuffer with more efficient StringBuilder. 2015-09-12 19:50:43 -07:00
Anthony Whitford
2214059a63 Upgraded maven-project-info-reports-plugin from 2.8 to 2.8.1. Also enabled cim report (since ci is being used). 2015-09-12 18:48:30 -07:00
Anthony Whitford
424cfcfa0c Added optional merge property support via a database dialect. Note that saveProperties was broken and unused, so removed. 2015-09-12 14:13:46 -07:00
Anthony Whitford
ce871dfa3e Replaced code with IOUtils.copy. 2015-09-12 10:55:33 -07:00
Hans Joachim Desserud
48a6eb1f86 Prefer interfaces over concerete classes. Did not change return type for public methods as this might potentially cause problems/need for changes for external users 2015-09-12 15:35:56 +02:00
Hans Joachim Desserud
fb85fb5b76 Ensure that we assert something. If the iterator doesn't have any values we would never enter the loop, but the test would still be green 2015-09-12 15:03:41 +02:00
Hans Joachim Desserud
c39c3cfdae Comment for review 2015-09-12 15:02:22 +02:00
Hans Joachim Desserud
e2fa7c666a Unused variable 2015-09-12 14:53:01 +02:00
Hans Joachim Desserud
f49cc6fb1f Unused methods in test 2015-09-12 14:51:49 +02:00
Hans Joachim Desserud
69bef59473 Remove superflous semicolon 2015-09-12 14:50:35 +02:00
Hans Joachim Desserud
9e931b9eb0 Remove modified copy of Apache Ant's DirectoryScanner 2015-09-12 14:14:54 +02:00
Hans Joachim Desserud
b26d9ea1e0 Replace use of included DirectoryScanner with Apache Ant's 2015-09-12 14:14:53 +02:00
Hans Joachim Desserud
ca5607d79e Removed empty methods from test 2015-09-12 14:14:08 +02:00
Hans Joachim Desserud
903eaed250 Remove unused imports 2015-09-12 14:06:47 +02:00
Jeremy Long
0859eab2dc corrected documentation 2015-09-12 06:59:19 -04:00
Jeremy Long
f0f84722ba removed unused import 2015-09-12 06:59:07 -04:00
Hans Joachim Desserud
17b8ba7069 Upgrade jmockit to 1.19 2015-09-12 12:40:01 +02:00
Jeremy Long
eb91152cfa updated the dependency-check-ant documentation 2015-09-11 06:53:58 -04:00
Jeremy Long
08c1b6879e changed scope on ant dependencies to provided 2015-09-11 06:15:59 -04:00
Jeremy Long
0077a8f67c removed link to usage.html as it was removed 2015-09-11 06:15:26 -04:00
Jeremy Long
a89cc67bd2 fixed hyperlink (usage->index) 2015-09-11 06:14:47 -04:00
Jeremy Long
388415ecc2 fixed hyperlink 2015-09-11 06:13:30 -04:00
Jeremy Long
44c5ba208d added documentation about unused code 2015-09-11 05:31:09 -04:00
Jeremy Long
d3a51857cb Merge pull request #344 from awhitford/DbOpts
Db opts
2015-09-11 05:25:16 -04:00
Anthony Whitford
11a3db5d64 Revert "Replaced update or insert property logic with merge property logic."
This reverts commit ece4a51b94.
2015-09-10 23:21:44 -07:00
Anthony Whitford
f3be8ae608 Merge remote-tracking branch 'jeremylong/master' into DbOpts 2015-09-10 23:17:46 -07:00
Jeremy Long
0577c9121c merge conflicts resolved 2015-09-10 06:47:38 -04:00
Jeremy Long
058f51e8c1 removed the shade plugin 2015-09-10 06:43:43 -04:00
Jeremy Long
698444caec changed the name of the data directory 2015-09-10 06:42:48 -04:00
Jeremy Long
d575df4b19 updated release to correctly bundle the zip 2015-09-10 06:42:25 -04:00
Jeremy Long
bee98513a2 cleaned up notices because additional notices are no longer added by shade 2015-09-10 06:41:48 -04:00
Anthony Whitford
3746df49ee Added type declarations. 2015-09-10 00:21:54 -07:00
Anthony Whitford
d98f67eab9 Added missing serialVersionUID. 2015-09-10 00:20:03 -07:00
Anthony Whitford
fde415e251 Added missing serialVersionUID. 2015-09-10 00:05:04 -07:00
Anthony Whitford
5702f39181 Addressed possible resource leak. 2015-09-09 23:54:20 -07:00
Anthony Whitford
45658afd89 Replaced empty string equals check with an isEmpty check. 2015-09-09 23:20:51 -07:00
Anthony Whitford
ece4a51b94 Replaced update or insert property logic with merge property logic. 2015-09-09 23:18:38 -07:00
Dale Visser
837d4918f2 Merge branch 'upmaster' into ruby-bundler. Fixed omission of --disableBundleAudit option.
Conflicts:
	dependency-check-cli/src/main/java/org/owasp/dependencycheck/CliParser.java
2015-09-09 18:09:41 -04:00
Jeremy Long
57ae0f1676 resolved command line invocation of aggregate resulting in missing html report (#189) 2015-09-09 06:15:17 -04:00
Jeremy Long
48e644e007 removed un-needed call to log.isDebugEnabled() 2015-09-09 05:58:51 -04:00
Jeremy Long
49a04fa913 Merge branch 'awhitford-FluidoSkin14' 2015-09-08 06:43:06 -04:00
Jeremy Long
df943bcf75 Merge branch 'FluidoSkin14' of https://github.com/awhitford/DependencyCheck into awhitford-FluidoSkin14 2015-09-08 06:35:14 -04:00
Jeremy Long
fdbec176fa fixed logging statements to use slf4j format syntax instead of String.format syntax 2015-09-08 06:31:59 -04:00
Jeremy Long
4b2b4e5482 Merge pull request #343 from awhitford/CodeTweaks
Code tweaks
2015-09-08 06:20:18 -04:00
Anthony Whitford
96768d8529 Replaced Date manipulation with more efficient System call. 2015-09-08 01:01:13 -07:00
Anthony Whitford
2689a08026 Replaced Date manipulation with more efficient System call. 2015-09-07 17:50:02 -07:00
Anthony Whitford
54be70672e Replaced Date manipulation with more efficient System call. 2015-09-07 17:49:11 -07:00
Anthony Whitford
480fa50af5 Corrected Javadoc to eliminate warning. 2015-09-07 17:01:24 -07:00
Anthony Whitford
b51731d15f Added final keyword. 2015-09-07 16:35:23 -07:00
Anthony Whitford
c09650a136 Removed unused slf4j-ext and slf4j-jdk14 dependency declarations. 2015-09-07 16:30:58 -07:00
Anthony Whitford
769fcb20d8 Removed a now unused import. 2015-09-07 16:29:27 -07:00
Anthony Whitford
537c4b3a50 Added missing final keywords. 2015-09-07 16:28:55 -07:00
Anthony Whitford
a75c17ac5e Added final keywords and elaborated the javax.json imports. 2015-09-07 16:28:22 -07:00
Anthony Whitford
85604e8afa Logback-core is a transitive dependency from logback-classic -- no need to explicitly mention it. JSoup type is jar by default, so no need to mention that. SLF4J-Ext does not seem to be used, so can drop that. H2 only has runtime scope. 2015-09-07 16:01:10 -07:00
Anthony Whitford
9a45c9aa7c Removed unused Cal10n MessageConveyor. 2015-09-07 15:21:54 -07:00
Anthony Whitford
01450bacc2 Removed a redundant null check, and replaced an addAll with the constructor population. 2015-09-07 14:51:26 -07:00
Anthony Whitford
af0255ee09 Rather than create a collection, then call addAll to populate, the collection can be created with the collection to clone. 2015-09-07 14:48:23 -07:00
Anthony Whitford
df25bbb6d2 Replaced json iteration with more efficient entrySet. Also corrected an invalid logging statement. 2015-09-07 14:43:34 -07:00
Anthony Whitford
444685bc05 Inner class should be static (since it doesn't reference parent). 2015-09-07 14:40:32 -07:00
Anthony Whitford
115f63c330 Removed an unused import and combined nested if statements. 2015-09-07 14:38:43 -07:00
Anthony Whitford
f9dbc4f7bf Upgraded Fluido Skin to 1.4 (from 1.3.1). 2015-09-07 10:54:01 -07:00
Jeremy Long
83263f8dee Update README.md
added build badge
2015-09-07 07:43:33 -04:00
Jeremy Long
a452ade957 Merge pull request #339 from awhitford/DependencyUpgrades
Upgraded dependencies.
2015-09-07 07:36:47 -04:00
Jeremy Long
1f48af024e Merge pull request #338 from awhitford/PomCleanup
Pom cleanup
2015-09-07 07:34:07 -04:00
Jeremy Long
0a643d7195 Merge pull request #340 from awhitford/CommonsLang3
Upgraded commons-lang-2.6 to newer commons-lang3-3.4.
2015-09-07 07:30:52 -04:00
Jeremy Long
c3835b9da7 removed erroneous short cli argument for exclude 2015-09-07 07:27:39 -04:00
Jeremy Long
bb1a96cf7a Merge branch 'master' of github.com:jeremylong/DependencyCheck 2015-09-07 07:25:36 -04:00
Jeremy Long
56360301d7 changed debug message to an error 2015-09-07 07:25:29 -04:00
Jeremy Long
435cccdeae Merge pull request #341 from awhitford/CommonsCli131
Upgraded commons-cli to 1.3.1 (from 1.2).
2015-09-07 07:24:48 -04:00
Anthony Whitford
b11b472933 Upgraded commons-cli to 1.3.1 (from 1.2). See http://commons.apache.org/proper/commons-cli/release_1_3.html for upgrade details. 2015-09-07 02:27:10 -07:00
Anthony Whitford
514f8398e2 Upgraded commons-lang-2.6 to newer commons-lang3-3.4. 2015-09-07 01:09:41 -07:00
Anthony Whitford
90935fef25 Upgraded dependencies. 2015-09-07 00:40:30 -07:00
Anthony Whitford
9b5ce1c3a6 Upgraded shade plugin to 2.4.1 (from 2.3). 2015-09-06 23:20:15 -07:00
Anthony Whitford
8ad1639b02 License is inherited from Parent POM -- no need to restate unless it is different. 2015-09-06 22:30:01 -07:00
Anthony Whitford
6d70332cd6 Centralized the Versions report to the parent pom. 2015-09-06 22:21:50 -07:00
Anthony Whitford
717f6240e3 Centralized javadoc reporting to parent pom. 2015-09-06 20:51:56 -07:00
Anthony Whitford
ab782054a1 Missed this lingering redundant maven-project-info-reports-plugin declaration. 2015-09-06 13:37:04 -07:00
Anthony Whitford
b481f01217 Moved the maven-plugin-plugin declarations into the maven module since it is unique to that module. 2015-09-06 13:05:17 -07:00
Anthony Whitford
d0f884f5b2 Centralized the maven-surefire-report-plugin to the parent pom. Note that gradle and jenkins modules are skipped since it does not apply. 2015-09-06 12:56:36 -07:00
Anthony Whitford
51e66354b0 No need to explicitly add a jar goal when it implicitly exists already for a jar module. 2015-09-06 11:18:56 -07:00
Jeremy Long
1efe90f445 Merge pull request #337 from awhitford/Checkstyle
Thanks again!
2015-09-06 06:12:19 -04:00
Anthony Whitford
7b47b7549d Removed redundant declarations for maven-compiler-plugin and maven-jar-plugin. 2015-09-06 01:42:01 -07:00
Anthony Whitford
7ccb77fb57 Removed unnecessary property for findbugs-maven-plugin since it is now only declared once. 2015-09-06 01:32:00 -07:00
Anthony Whitford
a32fa69823 Moved taglist-maven-plugin to the parent pom. (Gradle and Jenkins modules don't have them -- before or after.) This will make it easier to manage and evolve. 2015-09-06 01:29:17 -07:00
Anthony Whitford
ece4cb03ad project.build.sourceEncoding is already specified in the parent pom, so this is not necessary. 2015-09-06 00:53:53 -07:00
Anthony Whitford
5c53b6528f Centralized the findbugs-maven-plugin to the parent pom. Gradle and Jenkins modules skip it naturally. The onlyAnlyze setting for utils is maintained via a property. Also was able to upgrade to latest plugin, version 3.0.2. 2015-09-06 00:51:28 -07:00
Anthony Whitford
9b92007eff Centralized cobertura plugin to the parent pom and was able to upgrade it from 2.6 to 2.7. 2015-09-06 00:23:24 -07:00
Anthony Whitford
e433809f4d Moved maven-jxr-plugin and maven-project-info-reports-plugin reporting declarations into the parent pom. No need to duplicate in child modules. Utils did not have project-info reports, but there does not seem to be a good reason. Also note that the JXR plugin is naturally skipped when it does not apply (there is no java code), so not necessary to explicitly skip it for gradle and jenkins modules. 2015-09-05 23:57:53 -07:00
Anthony Whitford
d74218004a Reporting section for jenkins module is completely redundant with the parent pom. It can be removed and will generate the same report. 2015-09-05 23:17:28 -07:00
Anthony Whitford
c35276e3df Reporting section for gradle module is completely redundant with the parent pom. It can be removed and will generate the same report. 2015-09-05 23:15:35 -07:00
Anthony Whitford
064236ed5b Added Dependency plugin to Reporting section because it has an excellent Dependency Analysis Report. 2015-09-05 22:56:36 -07:00
Anthony Whitford
2a50dcba9d Removed Checkstyle and PMD violations. 2015-09-05 22:25:59 -07:00
Anthony Whitford
f7974b324b Exclude generated HelpMojo.java file from Checkstyle analysis. 2015-09-05 22:25:38 -07:00
Jeremy Long
3bb716b060 Merge pull request #336 from awhitford/Timing
Added time measurements for key steps.
2015-09-05 21:08:05 -04:00
Jeremy Long
39e465261f Merge branch 'master' of github.com:jeremylong/DependencyCheck 2015-09-05 21:07:47 -04:00
Jeremy Long
784b78b17c added another timer to pull #336 2015-09-05 21:07:29 -04:00
Jeremy Long
22c68ed8ef Merge pull request #331 from wmaintw/master
add compatibility supports
2015-09-05 21:00:15 -04:00
Jeremy Long
c4c670a3b1 Merge pull request #334 from awhitford/MavenPluginWarnings
Removed deprecated code.
2015-09-05 20:59:05 -04:00
Jeremy Long
17a05cc1d4 removed excessive logging used to debug 2015-09-05 20:56:54 -04:00
Jeremy Long
d452c5fabb fixed shift operator per issue #335 2015-09-05 20:56:18 -04:00
Jeremy Long
2cf974ef02 maven-reporting-api cannot be scoped to provided 2015-09-05 07:09:01 -04:00
Jeremy Long
1f0e789575 fixed bug that might contribute to issue #189 2015-09-05 06:48:00 -04:00
Anthony Whitford
92e1fd3f28 Added time measurements for key steps. 2015-09-05 00:31:50 -07:00
Jeremy Long
49736a87aa Merge branch 'awhitford-FixSite' 2015-09-03 05:32:06 -04:00
Anthony Whitford
d009e39842 Removed unnecessary maven-site-plugin dependency, and maven-plugin-annotations dependency is provided. 2015-09-03 01:47:46 -07:00
Anthony Whitford
c2b8901537 Removed deprecated code. 2015-09-03 01:25:53 -07:00
Anthony Whitford
dd910cb5ec Updated plugins. 2015-09-03 00:48:06 -07:00
Jeremy Long
4632753f02 commented out initial attempt at issue #22 to resolve issue #327 2015-09-02 06:42:36 -04:00
Jeremy Long
3fdcd12b4f maven dependencies should be marked as provided per issue #329 2015-09-02 06:05:56 -04:00
ma wei
94d1d611c7 add compatibility supports 2015-09-02 13:45:06 +08:00
Jeremy Long
27b54a0bfa changed taskdef.properties file name 2015-09-01 06:37:44 -04:00
Jeremy Long
1b1ecd0748 split monolithic taskdef into three primary taskdefs 2015-08-31 06:59:57 -04:00
Dale Visser
1e29d2e751 Merge branch 'upmaster' into ruby-bundler
Conflicts:
	dependency-check-cli/src/main/java/org/owasp/dependencycheck/CliParser.java
2015-08-30 15:11:33 -04:00
Dale Visser
a0437bf933 Ruby bunder: Code needed to disable the analyzer in the CLI if desired. 2015-08-30 15:07:21 -04:00
Dale Visser
73e0292a4b Ruby Bundler: Added informative message about updating DB. Switched most log messages to debug level. 2015-08-30 14:52:55 -04:00
Dale Visser
c393e74160 Ruby bundler: Better message and logging when bundle-audit not found. 2015-08-30 14:31:58 -04:00
Dale Visser
80c4666198 Ruby bundler: More method extractions to eliminate monolithic method. 2015-08-30 14:16:32 -04:00
Dale Visser
ea7bd1f700 Ruby bundler: tidied up how extracted method is used. 2015-08-30 14:06:47 -04:00
Dale Visser
b3a55cc85d Ruby bundler: extracted method 2015-08-30 13:57:30 -04:00
Dale Visser
036200350d Ruby bundler: add needed null checks to avoid NPEs. 2015-08-30 13:50:22 -04:00
Jeremy Long
e630c484ff implementing the purge feature as requested in issue #328 2015-08-30 07:02:26 -04:00
Dale Visser
713e9658c5 Ruby bundler: got description working. Added boilerplate text describing differences from standard D-C vulnerability report. 2015-08-29 12:29:44 -04:00
Dale Visser
782039810e Ruby Bundler: Added URL to report. 2015-08-29 11:33:16 -04:00
Dale Visser
b473d8ab9c Ruby Bundler: Added URL to report. 2015-08-29 11:28:38 -04:00
Dale Visser
2eb6918fb3 Ruby Bundler: Clean up report a little bit, and grouped vulnerabilities under dependencies, when appropriate. 2015-08-29 11:06:24 -04:00
Jeremy Long
29626666a7 removed debug logging 2015-08-29 08:38:49 -04:00
Jeremy Long
dc41c9a671 Merge branch 'master' of github.com:jeremylong/DependencyCheck 2015-08-29 08:02:42 -04:00
Jeremy Long
83af70bb59 corrected argument name for the purge nvd option 2015-08-29 07:57:54 -04:00
Jeremy Long
b293873640 finished deprecating the application name argument in favor of project name per issue #320 2015-08-29 07:12:40 -04:00
Jeremy Long
8bb92815cb added argument to purge local NVD per issue #328 2015-08-29 06:58:13 -04:00
Jeremy Long
7a8f7199c8 renaming app argument to project per issue #320 2015-08-29 06:48:52 -04:00
Dale Visser
6f4ce34840 Ruby Bundler: Added CVSS score and a little hack to avoid dependency bundling. 2015-08-28 21:31:01 -04:00
Dale Visser
8853552161 Ruby Bundler: Successfully adding vulnerability into report, though all displayed info not looking great. 2015-08-28 19:56:35 -04:00
Dale Visser
95d3d17d83 Ruby Bundler: Now successfully creating temp files for dependency objects. 2015-08-28 13:58:49 -04:00
Jeremy Long
3594280b04 Merge pull request #326 from dwvisser/doc-updates
Added previously overlooked documentation for CMake, Node.js and Ruby Gems Analyzers
2015-08-28 06:12:54 -04:00
Jeremy Long
1e447c6e3e Merge branch 'master' of github.com:jeremylong/DependencyCheck 2015-08-28 05:27:16 -04:00
Jeremy Long
c41a288280 added null checks 2015-08-28 05:27:00 -04:00
Dale Visser
a0492fe944 Merge branch 'upmaster' into ruby-bundler
Conflicts:
	dependency-check-core/src/main/resources/META-INF/services/org.owasp.dependencycheck.analyzer.Analyzer
2015-08-27 14:05:36 -04:00
Dale Visser
1fffebd497 Docs: Added Ruby Gemspec analyzer page, fixed typos on Node.js page. 2015-08-26 14:40:36 -04:00
Dale Visser
62c05049a7 Docs: Added node.js page, fixed typos in Python page. 2015-08-26 14:25:32 -04:00
Dale Visser
0fdf377d45 Docs: Added CMake analyzer page. 2015-08-26 14:11:30 -04:00
Dale Visser
6ca8e2644a Docs: Fixed sidebar links to OpenSSL and Python analyzer pages. 2015-08-26 13:59:28 -04:00
Dale Visser
4a3061db6d Docs: Added CMake to landing page, and links to Autoconf and CMake. Added missing analyzers to analyzers list. Shortened my analyzer URLs, though not all in site index yet. 2015-08-26 13:54:15 -04:00
Dale Visser
61ac81518a Docs: Added Ruby and Node.js to landing page. Added table row for Node.js in Analyzers list. 2015-08-26 12:27:38 -04:00
Jeremy Long
acd4b4371d Merge pull request #323 from wmaintw/master
Implement the nested configuration for proxy and cve related settings
2015-08-26 06:05:38 -04:00
Jeremy Long
1d20291d44 Merge branch 'dwvisser-node-js-analyzer' 2015-08-26 06:03:32 -04:00
Dale Visser
c60245ea2b Node.js Analyzer: Switched from org.json to Glassfish JSR 353 reference implementation. 2015-08-25 17:28:17 -04:00
Dale Visser
9e25480baa Merge branch 'upmaster' into node-js-analyzer
Conflicts:
	dependency-check-cli/src/main/java/org/owasp/dependencycheck/App.java
	dependency-check-cli/src/site/markdown/arguments.md
	dependency-check-core/src/main/resources/META-INF/services/org.owasp.dependencycheck.analyzer.Analyzer
2015-08-25 13:03:12 -04:00
ma wei
facd803943 update README file 2015-08-25 23:17:12 +08:00
ma wei
05c8a6282d upgrade to 0.0.7 2015-08-25 23:06:34 +08:00
ma wei
3f9ae34203 refactor: change method name for override settings 2015-08-25 19:50:50 +08:00
ma wei
afb85309a2 implement nested configuration for CVE settings 2015-08-25 19:49:03 +08:00
ma wei
2c5e64d0d5 update README for configuration change 2015-08-25 19:17:55 +08:00
ma wei
ddb8c432be implement the nested configuration for proxy settings 2015-08-25 19:11:27 +08:00
Jeremy Long
054be314f6 added targetCompatibility = 1.7 per issue #321 2015-08-25 06:13:29 -04:00
Jeremy Long
e484c5754e Merge pull request #312 from dwvisser/rubygems-analyzer-pr
Rubygems analyzer
2015-08-25 05:31:10 -04:00
Jeremy Long
b36c4f65e5 Merge pull request #322 from wmaintw/master
Remove duplicated configuration items in DependencyCheckTask
2015-08-25 05:28:34 -04:00
Jeremy Long
4bdfbcc916 Merge pull request #316 from dwvisser/iso-scanning
Help for scanning ISO images on Linux, Mac OS X, and Windows
2015-08-25 05:27:10 -04:00
ma wei
519198bb61 Merge remote-tracking branch 'upstream/master' 2015-08-24 22:29:28 +08:00
ma wei
9a7c342f91 modify spec for testing project extension 2015-08-24 22:25:03 +08:00
ma wei
761a5ed3dd remove duplicated configuration items in DependencyCheckTask 2015-08-24 22:17:16 +08:00
Jeremy Long
481e753ad4 corrected spring-security false positives per issue #319 and #311 2015-08-23 06:45:35 -04:00
Dale Visser
271016f0fa Added verbose flag to get as much reportable info as possible. 2015-08-19 15:33:50 -04:00
Dale Visser
4493f895c6 Added test resources to cover interesting bundle-audit cases. 2015-08-19 15:26:17 -04:00
Dale Visser
5c32ecd8e1 Ruby Analyzer: Added bundle-audit analyzer. So far just launches if available and logs the output. 2015-08-18 16:59:39 -04:00
Dale Visser
0b5244d321 Markdown escape * character fix 2015-08-18 12:37:09 -04:00
Jeremy Long
b6f9715174 Merge pull request #318 from dwvisser/code-inspection-fixes
Random fixes to issues found by IntelliJ IDEA code inspection.
2015-08-17 19:46:41 -04:00
Dale Visser
2db1f8d2b6 Random fixes to issues found by IntelliJ IDEA code inspection. 2015-08-17 18:55:51 -04:00
Dale Visser
4c5957ae40 ISO scanning: Fixed slight errors in Python file types, and made formatting consistent. 2015-08-17 14:49:24 -04:00
Dale Visser
38cd19de15 ISO scanning: Added clarification on what can be scanned. Fleshed out file type analyzers page with details. Re-ordered side menu alphabetically to match. 2015-08-17 12:16:45 -04:00
Jeremy Long
f66ffbdd63 Merge branch 'master' of github.com:jeremylong/DependencyCheck 2015-08-16 06:25:02 -04:00
Jeremy Long
8d3f08e529 fixed links 2015-08-16 06:24:08 -04:00
Jeremy Long
4209c1c406 Merge pull request #315 from recena/master
Fixed links
2015-08-16 06:17:24 -04:00
Dale Visser
1cd12d0a0c Documentation giving help for scanning ISO images on Linux, Mac OS X, and Windows. 2015-08-14 13:51:38 -04:00
Manuel Recena
7eb18e1931 Fixed links 2015-08-14 12:33:47 +02:00
ma wei
d308e50e1e remove duplicated plugin properties file 2015-08-14 17:12:28 +08:00
Dale Visser
88569cb369 rubygems: Finished command-line interface integration. 2015-08-12 12:08:05 -04:00
Dale Visser
235869fc79 rubygems: Reformat and consisitent parameter naming in private methods. 2015-08-12 12:08:05 -04:00
Dale Visser
89166e81fb rubygems: Add summary to evidence, inline constants that were only being used once. 2015-08-12 12:08:05 -04:00
Dale Visser
2d109b81cf rubygems: Used substring(int) to remove the need for Matcher.find(int).
Also fixed javadoc, made some variables final, shortened a variable name.
2015-08-12 12:06:18 -04:00
Dale Visser
5c02b4dccb rubygems: Added new analyzer to META-INF/services. Confirmed correlation with CPE in CLI. 2015-08-12 12:06:18 -04:00
Dale Visser
e7f154b58d rubygems: Various refactoring improvements. 2015-08-12 12:00:56 -04:00
Dale Visser
c0752575c6 rubygems: All evidence assertions now passing. 2015-08-12 12:00:43 -04:00
Dale Visser
7eb2c89f39 rugygems: Added gemspec test resources, test cases, and minimal code to run tests and have evidence gathering test fail. 2015-08-12 11:58:46 -04:00
Dale Visser
bf4eb07342 Node.js: Added missing command-line option for disableing Node.js analyzer. 2015-08-11 15:27:20 -04:00
Jeremy Long
c856d01b52 removed un-needed dependencies 2015-08-09 16:05:14 -04:00
Dale Visser
7a535b2576 node.js: Added parent folder to display file name. Added try-catch for JSONException, logging warning message in that case. 2015-08-09 11:32:57 -04:00
Dale Visser
4b17fd88a3 node.js: Adding name_project to vendor evidence, as many node.js projects seem to follow this pattern with their CPEs. Also, logging warnings whenever JSON parse doesn't go as expected. 2015-08-09 11:18:16 -04:00
Jeremy Long
8d1f3f723f version 1.3.1-SNAPSHOT 2015-08-09 10:25:44 -04:00
Jeremy Long
a543fbbec9 added an additional attempt to remove the temporary directory 2015-08-09 10:25:30 -04:00
Jeremy Long
37f50db00e removed related dependencies from hashCode and equals to resolve issue #293 2015-08-09 09:56:20 -04:00
Jeremy Long
ccb87f43b7 made suppression notes textarea readonly to resolve issue #306 2015-08-09 09:36:55 -04:00
Jeremy Long
d569f39f53 Merge branch 'master' of github.com:jeremylong/DependencyCheck 2015-08-09 09:10:32 -04:00
Jeremy Long
fb3951772f fixed errors due to null values per issue #309 2015-08-09 09:10:18 -04:00
Jeremy Long
2c00bf4040 Merge pull request #305 from wmaintw/master
[new pull request] Implement configuration item "quickQueryTimpstamp" in grade plugin
2015-08-07 18:26:03 -04:00
Dale Visser
4f8772bd77 node.js: Added parameter to cli. 2015-08-07 16:10:56 -04:00
Dale Visser
b4c3046ab5 node.js: Added package.json eveidence gathering, using json.org package for the parsing. 2015-08-07 15:41:01 -04:00
Dale Visser
2441b92bc6 node.js: Initial commit, with analysis test failing. 2015-08-07 14:43:08 -04:00
ma wei
c39eec32f2 ignore gradle generated temporary files 2015-08-07 10:14:34 +08:00
ma wei
7837718d04 update README file 2015-08-07 10:13:53 +08:00
ma wei
7069671471 fix issue that fail to publish gradle plugin to gradle plugin portal 2015-08-07 10:13:27 +08:00
ma wei
d1dbde2890 fix issue that fail to publish gradle plugin to maven central 2015-08-07 10:13:00 +08:00
ma wei
0472471ac9 update the gradle plugin version to 0.0.6 2015-08-07 10:11:34 +08:00
ma wei
62a0b8da90 add configuration, let user has ability to control HTTP method used during the update process to avoid proxy problem 2015-08-07 10:09:40 +08:00
ma wei
810530fabd upgrade dependency check core and utils version to 1.3.0 2015-08-07 10:08:37 +08:00
Jeremy Long
707de56612 Merge pull request #302 from dwvisser/290-add-bz2-format
Add bzip2 format to ArchiveAnalyzer
2015-08-06 07:02:21 -04:00
Jeremy Long
921b0eb229 Merge pull request #301 from dwvisser/run-against-cached-db-pr
Help page for how to use multiple local snapshots of the NVD
2015-08-05 22:54:33 -04:00
Jeremy Long
9afb92f0ed Merge pull request #303 from colezlaw/homebrew-cli-instructions
Added homebrew installation instructions
2015-08-05 22:52:36 -04:00
Will Stranathan
1ded88e089 Added homebrew installation instructions 2015-08-05 20:58:20 -04:00
Dale Visser
1f074ff400 290: Further refactoring for readability. 2015-08-05 17:42:25 -04:00
Dale Visser
4764f61b48 290: Added unit tests and implementation to support bzip2. 2015-08-05 17:42:10 -04:00
Dale Visser
56424924bb 290: Extracted some methods to reduce average method size, and eliminate some duplicate code. 2015-08-05 17:42:10 -04:00
Dale Visser
4c3831ec74 Removed superfluous phrase. 2015-08-05 12:03:21 -04:00
Dale Visser
ba564a6aed Added page to site that documents how to take daily snapshots of the NVD,
and run D-C cli against those snapshots.
2015-08-05 11:57:23 -04:00
Jeremy Long
d529e88242 version 1.3.0 2015-08-04 21:19:19 -04:00
Jeremy Long
5d6ad8bc6c added gradle to the site 2015-08-04 14:07:34 -04:00
Jeremy Long
01769a6f38 added gradle to the site 2015-08-04 14:07:15 -04:00
Jeremy Long
a43cc38739 added logo 2015-08-04 12:07:11 -04:00
Jeremy Long
085069c2c7 added logo 2015-08-04 12:06:55 -04:00
Jeremy Long
816a6d057a updated so that *.sh files are marked as executable 2015-08-02 07:24:36 -04:00
Jeremy Long
19ab099f98 added 0755 to *.sh 2015-08-02 07:10:20 -04:00
Jeremy Long
99a1097953 making the world a better place - avoid the hate #287 2015-08-02 06:54:10 -04:00
Jeremy Long
673cf7018b initial gradle site documentation 2015-08-02 06:33:45 -04:00
Jeremy Long
624f52882e modified how generated keys were returned in an attempt to resolve issue #296 2015-08-02 06:28:05 -04:00
Jeremy Long
654ab4a289 added cleanup steps to remove temp resources, etc. 2015-08-01 07:01:50 -04:00
Jeremy Long
ec86dc5734 changed packaging 2015-08-01 07:01:05 -04:00
Jeremy Long
44f37c12c3 checkstyle corrections 2015-08-01 06:49:55 -04:00
Jeremy Long
d0b704d7f4 corrected data directory path when running test cases 2015-08-01 06:08:35 -04:00
Jeremy Long
7452942091 Merge pull request #297 from dwvisser/broken-cli-docs-link
Fixed broken link to CLI instructions in main project README.
2015-08-01 05:52:00 -04:00
Dale Visser
ea4ea680a2 Fixed broken link to CLI instructions in main project README. 2015-07-31 10:28:55 -04:00
Jeremy Long
ac7ae3d8df disabled test case for JDK6 to resolve issue #294 2015-07-31 05:28:53 -04:00
Jeremy Long
4fa5f2ac72 reverted plugin-plugin version to resolve issue #294 2015-07-31 05:28:18 -04:00
Jeremy Long
8b1a44fe42 Merge pull request #295 from colezlaw/issue-294
Removed i18n for SLF4J logging as it was preventing build on jdk1.6
2015-07-30 05:35:46 -04:00
Will Stranathan
c4d26f9194 Removed i18n for SLF4J logging as it was preventing build on jdk1.6 2015-07-29 18:29:09 -04:00
Jeremy Long
79b59f2aae checkstyle/pmd/findbugs recommended updates 2015-07-29 07:00:30 -04:00
Jeremy Long
1eecd13ea7 Merge branch 'master' of github.com:jeremylong/DependencyCheck 2015-07-28 06:33:52 -04:00
Jeremy Long
1ae3a63f5c final tested patch for issue #285 2015-07-28 06:33:40 -04:00
Jeremy Long
561694a991 Merge pull request #292 from willis7/master
Fix bug introduced with #282
2015-07-28 06:07:48 -04:00
Jeremy Long
096af016ef documented shallow clone per issue #283 2015-07-28 05:40:08 -04:00
Sion Williams
498835015a outputDirectory should have been called using the method rather than directly calling the property. This now fixes the failing integration test in the last commit. 2015-07-27 22:33:39 +01:00
Sion Williams
cafa0d6578 Integration test spec proves outputDirectory value is not being honoured when changed using dsl. 2015-07-27 22:03:19 +01:00
Jeremy Long
5444253ed6 added more CVSS details per issue #154 2015-07-27 06:56:23 -04:00
Jeremy Long
d0ae12a167 working patch for issue #285 2015-07-27 06:53:50 -04:00
Jeremy Long
e323c7f810 patch for issue #285 2015-07-25 07:18:33 -04:00
Jeremy Long
dd3758af43 manually merged PR #270
Former-commit-id: 9d4504942f229a7462d59b292e478ea2289ecfed
2015-07-24 06:44:54 -04:00
Jeremy Long
94ae6e76f1 manually merged PR #282
Former-commit-id: cf2ae5572602f7258b4c617097ab003fe3f644c6
2015-07-24 05:50:55 -04:00
Jeremy Long
ee969a5ed9 manually merged PR #278
Former-commit-id: 7811e5832e680589e5b1734e775ee8cab92dd30f
2015-07-24 05:36:32 -04:00
Jeremy Long
a547a219a4 grammar police caught me (#285)
Former-commit-id: 83a94b573aea686ba8cc8c6620e1495c46cd425b
2015-07-23 05:16:39 -04:00
Jeremy Long
d4eba634ea reduced logging levels in test as build issue was resolved
Former-commit-id: e1c8cd3ef9f19d5c0d17dc59d6feed6474118602
2015-07-22 06:45:17 -04:00
Jeremy Long
0927897451 documented argument for new config option to limit symbolic link depth per #285
Former-commit-id: cf8775d8d539c37e68f7c34692aa5c249b4cef26
2015-07-22 06:44:51 -04:00
Jeremy Long
63e5a2c5ba initial patch to add symbolic link depth per issue #285; more testing needs to be performed
Former-commit-id: bc40f8cfc1410c46e402ce6931e53f377b5c60ee
2015-07-22 06:43:52 -04:00
Jeremy Long
a7f3f1d806 initial patch to add symbolic link depth per issue #285; more testing needs to be performed
Former-commit-id: f0fb24c29703f7ec390f94560a224adf936f898c
2015-07-22 06:43:41 -04:00
Jeremy Long
97d3a2986c corrected merge conflict
Former-commit-id: 5653364b7053ae119dd2d0a604258ccd80f4a061
2015-07-21 07:06:11 -04:00
Jeremy Long
d3b20757ef changed to BaseDBTest instead of BaseTest to reesolve build errors per issue #273
Former-commit-id: 392b26cac4595d6dd6c9a4ffbd2d76f851c8c7ed
2015-07-21 07:04:39 -04:00
Jeremy Long
d99804f14e Merge pull request #284 from dwvisser/remove-dependency-extension-property
Remove dependency file extension property

Former-commit-id: 4f21b07f05c0ff74918d1394afaa7cedd693ecf0
2015-07-20 05:35:49 -04:00
Dale Visser
1b8dc71980 Merge branch 'upmaster' into remove-dependency-extension-property
Former-commit-id: b06adaf9fa3031c27be08523b9689ae58d0cc322
2015-07-19 08:06:43 -04:00
Jeremy Long
dc466f1480 set objects to null after closing them
Former-commit-id: 3d62a1b66741d69730e39413b8d99b670d744b50
2015-07-19 06:21:30 -04:00
Jeremy Long
ba6a783834 update to close to set objects to null
Former-commit-id: 9c1caaeca9ca0a472180eb6bf4bb7a7c7fba6e6e
2015-07-19 05:49:06 -04:00
Jeremy Long
b2edf5683c minor reformat
Former-commit-id: b5431379bfd281a25a11cd17c203bfbe294c55a8
2015-07-19 05:48:27 -04:00
Jeremy Long
dacb91b9a8 cleaned up test cases to properly close the DB
Former-commit-id: 7333e882aebfe54b94a4d70cdb55ca2fbd3f3c51
2015-07-17 15:31:00 -04:00
Jeremy Long
7ac71a7b2a additional logging
Former-commit-id: 6c91f3482dfe9980d33b1b8ac6c43c6988c08e60
2015-07-17 15:30:31 -04:00
Jeremy Long
4b44bb5426 modified test case
Former-commit-id: 5499e7a8021b0b24d4db640e1381a94d9c02dc0c
2015-07-17 15:29:57 -04:00
Jeremy Long
8cd68c7c16 improved logging
Former-commit-id: 5b6741a1d561cbf4c20ef98907ce99a2b245b42e
2015-07-17 08:45:43 -04:00
Jeremy Long
0ae228d6f8 added try/catch to tests to correctly close the db
Former-commit-id: 8f71f57a7724340a8526a35bd0e42748f02530c5
2015-07-17 08:45:33 -04:00
Jeremy Long
6a2ed23822 switched to debug logging in test
Former-commit-id: 4d42f08ac2fdc58ce1eeb4ab3f27d1efa72a6a46
2015-07-17 08:24:33 -04:00
Jeremy Long
fe0035fe0e fixed namespaces
Former-commit-id: 8f6f3361021b2efc1843ae93ed1bab44e5f053a4
2015-07-16 07:00:17 -04:00
Jeremy Long
aeabaf8513 fixed failing test due to renaming the schema
Former-commit-id: 2cbc4b84cb28e72c163cde3b2d1e5f8c66ae5b42
2015-07-16 06:51:40 -04:00
Jeremy Long
43907e07c2 Merge pull request #279 from dwvisser/fix-properties-file
Eliminated duplicate key in dependencycheck.properties file

Former-commit-id: a5fcb23d750c366340c8a6af801b9ac6e9ac19b8
2015-07-15 08:20:27 -04:00
Jeremy Long
2413dc9a41 corrected package
Former-commit-id: 3d7e08e0730cb6c03eb43221dc77afc3b1a3c2d3
2015-07-15 08:18:02 -04:00
Dale Visser
2d92c9d240 Commented out first instance of cpe.url, and moved 2nd instance up. Assumption: the 2nd value was being used.
Former-commit-id: 2cae0ca086b2fb666d883dc1a3fbcb174465aa2b
2015-07-14 18:00:45 -04:00
Jeremy Long
a24813b678 updated schema and xml report to include the confidence and type of evidence
Former-commit-id: 774764585a15d8d78a615f20f91c3a8aaaf4abb2
2015-07-14 08:01:22 -04:00
Jeremy Long
dffb2887d6 added task to copy xsd to the site
Former-commit-id: ec6bffd48bc2b98cb5b992ebcc0862e89897c255
2015-07-14 08:00:42 -04:00
Jeremy Long
68f1c1a54c changed display code so that all evidence is shown instead of just the used evidence
Former-commit-id: e01f14f244960ddccbd859bf50c0603abe5170d1
2015-07-14 07:48:07 -04:00
Jeremy Long
726aa7b894 changed tooltip header on evidence count
Former-commit-id: fdf92f87a81d985fd01b19d5ce04517c81608a62
2015-07-14 07:41:19 -04:00
Jeremy Long
44c795cd4f patched to resolve issue #261
Former-commit-id: 44ace36f4a02885134a0af0fb44d11d351d8c7f6
2015-07-11 07:15:08 -04:00
Jeremy Long
4d5d46d08a Merge pull request #274 from dwvisser/openssl-source-analyzer
OpenSSL source analyzer

Former-commit-id: cc2f02f3722b7480f0ec5f7979892b78dc4076d1
2015-07-11 06:29:55 -04:00
Jeremy Long
52cdff14bd minor update
Former-commit-id: 074158f04f25d94c003f970a0d7c4b4c0180fc0b
2015-07-11 06:04:55 -04:00
Jeremy Long
0372167f25 updated documentation to resolve issue #268
Former-commit-id: 78f6158c5c053a7595dd2dc702c015c257a2a00f
2015-07-11 06:02:46 -04:00
Dale Visser
005e401c7f Remove fileExtension property from Dependency class.
Former-commit-id: fc6303c6c835724fe61f882a9df5e2247c7a9b3e
2015-07-10 13:48:27 -04:00
Jeremy Long
479212dd60 Merge branch 'master' of github.com:jeremylong/DependencyCheck
Former-commit-id: 2e6f7993d6389db4bf7957928ae4772a9cc54887
2015-07-10 07:10:34 -04:00
Jeremy Long
0af9239906 added CVE URL arguments per feature request #268
Former-commit-id: a33128070eb9bcc365de1788ebc84c187731568d
2015-07-10 07:10:13 -04:00
Jeremy Long
13d871ab21 Merge pull request #277 from hmolsen/patch-1
fix broken link to suppression site

Former-commit-id: cc663d3a7fdbe4fc952cfa255181ef505f2fe2ce
2015-07-10 06:44:22 -04:00
Jeremy Long
136830ce22 cleaned up logging
Former-commit-id: d9614a2a309e17ceab628b2258f78da0b792a5a8
2015-07-10 06:13:41 -04:00
Jeremy Long
afe8e343b1 test code to run on cloudbees to debug a build issue
Former-commit-id: b3bba62d28666160682ea15813ea80411f72f9a0
2015-07-10 05:56:55 -04:00
hmolsen
f7c2cdff9b fix broken link to suppression site
Former-commit-id: e6c6a4a990da7cd9360654a7b9d12fa15d2d4dd5
2015-07-10 10:33:59 +02:00
Dale Visser
a7abe97ca0 OpenSSL: Forgot to 'git add' new files in previous commit.
Former-commit-id: 7219edc255d239995d5bbb5cbe587e999a7160a8
2015-07-09 17:13:03 -04:00
Dale Visser
5354137c76 OpenSSL: Site doc additions, including about Autoconf analyzer.
Former-commit-id: 35253cfbf5cfcf04b2f3fe39f0891cd0bf1155b4
2015-07-09 17:11:06 -04:00
Dale Visser
433c2e5916 OpenSSL: Updates to use FileFilter instead of file extension.
Former-commit-id: 974bc28171b5b3ac3e772c93447489e1afb797f1
2015-07-09 16:35:04 -04:00
Dale Visser
e5fdda60fc Merge branch 'upmaster' into openssl-source-analyzer
Conflicts:
	dependency-check-core/src/test/java/org/owasp/dependencycheck/analyzer/PythonPackageAnalyzerTest.java

Former-commit-id: 6d92982227ad0ff7c4381d03eb1bf542dfe7697f
2015-07-09 16:14:54 -04:00
Jeremy Long
b227cf890b checkstyle recommended updates
Former-commit-id: 17e3e4580553c07b33533f1e9f6cb5f33177f78e
2015-07-09 07:07:36 -04:00
Jeremy Long
0a4c3102dd reverted changes as a schema upgrade is not needed at this time
Former-commit-id: 6f97fef5748a3d630a73f790cca8baa4753e1d7a
2015-07-09 07:07:10 -04:00
Jeremy Long
54094ebc21 removed unfinished JavaScriptAnalyzer
Former-commit-id: 9d7d7e82da91cea21ea87b8d933093e738571ba2
2015-07-09 06:37:29 -04:00
Jeremy Long
bf3fe6404a reverted changes as a schema upgrade is not needed at this time
Former-commit-id: 22671cb1c7e2e6db26f704f12b5fb86100586221
2015-07-09 06:18:30 -04:00
Jeremy Long
58888ac389 Merge pull request #271 from wmaintw/master
Add ability to dependency-check-gradle plugin for customize CVE urls, report output directory and some bug fixing

Former-commit-id: bd78214d389ae52fab0c0280910469289d7b699c
2015-07-09 06:02:17 -04:00
Jeremy Long
07df8ecc02 Merge pull request #275 from dwvisser/filetype-analyzer-pr
Modify AbstractFileTypeAnalyzer to use FileFilter instead of just file extensions

Former-commit-id: ea2d82e9203f3d3556f7621960bb1e35d839db95
2015-07-09 05:51:37 -04:00
Jeremy Long
c86becb169 Merge pull request #276 from colezlaw/homebrew-instructions
Added homebrew instructions

Former-commit-id: 07b4ce33f2b1e96556761c1e31878180f23dc41e
2015-07-09 05:22:17 -04:00
Will Stranathan
98a43606ce Added homebrew instructions
Former-commit-id: 05167f240768a8136e580544875454b3f2fdbdfe
2015-07-08 22:22:28 -04:00
ma wei
5b2353e612 add license information for these gradle script files
Former-commit-id: 1ecf5c52dc82e1fd55172385f303dc5022bad801
2015-07-09 10:20:12 +08:00
Dale Visser
a3ad598004 OpenSSL: Untested changes to get command-line working.
Former-commit-id: f81a410bba6cbc1b71cb7d5fef121eb4f52a780b
2015-07-08 14:07:17 -04:00
Jeremy Long
c02d1d73b8 Merge branch 'hansjoachim-reporting'
Former-commit-id: 9612b8a07e11bfa93d94b71d079bc98d28a73b87
2015-07-08 06:59:11 -04:00
Jeremy Long
77c99e1d7c Merge branch 'reporting' of https://github.com/hansjoachim/DependencyCheck into hansjoachim-reporting
Former-commit-id: 272d25200c1635371806df3bc1d7ad7754cba475
2015-07-08 06:48:14 -04:00
Jeremy Long
055d34818a updated documentation to resolve issue #269
Former-commit-id: ae4668c9182f181f1c01c17e0737b892fe8078ba
2015-07-08 06:39:37 -04:00
Jeremy Long
3a06503b74 commented out test case
Former-commit-id: c62a28c8a39c42e6c458387c03445c86deb6454c
2015-07-08 06:32:52 -04:00
Jeremy Long
cae15a8d7a updated javadoc
Former-commit-id: 264561aed2a9e138d97c4f06c5e27df5b8acf7e9
2015-07-08 06:32:20 -04:00
Jeremy Long
70554d1158 removed Cpe Updater as it will not currently be used
Former-commit-id: 2d9d5a2082dc386697557943e46399c31633ffbc
2015-07-08 06:31:41 -04:00
Jeremy Long
db42da14d1 updated documentation
Former-commit-id: f4b200a38c5df345cd5714c4dbf624af57b40481
2015-07-08 06:31:08 -04:00
Jeremy Long
9daa9b6cca reorganized code, made the database file name version independent so that upgrades can be made, and implemented a CPE updates per issue #149
Former-commit-id: fdb57afa28ecffdb7ca90971851844718ecb8bb9
2015-07-08 06:20:19 -04:00
Dale Visser
30087b5e79 OpenSSL: Minor code edits/refactoring.
Former-commit-id: 5c0247772406b55a0e1e7219b83389a5ed0605f4
2015-07-07 17:48:50 -04:00
Dale Visser
c214b70459 OpenSSL: Analyzer unit test passes.
Former-commit-id: 06d36762375a5fc55bc7f30a7857713ce332fceb
2015-07-07 17:37:31 -04:00
Dale Visser
ad0b6c28ba Added long hexadecimal to version string conversion function, and passing unit test.
Former-commit-id: 846e2a3c07016974c396770397304875fd36b7f6
2015-07-07 16:48:38 -04:00
Dale Visser
8127dc2620 OpenSSL: Initial skeleton of OpenSSLAnalyzer and unit test suite. Fixed package imports in PythonPackageAnalyzerTest.java
Former-commit-id: b27fa07cde451c0a19e5ce3f2d46701f02dda47e
2015-07-07 15:51:33 -04:00
ma wei
fed5d3efc0 add read-me info about customize report output directory
Former-commit-id: be8ba701e31f0c90fd686e90ebbf752b96665521
2015-07-07 14:08:48 +08:00
ma wei
ed3c806869 update the version of dependency-check-gradle to 0.0.5
Former-commit-id: facbe13d3bd077b5540e8c20d6b3b1bb3d1b4e3f
2015-07-07 13:57:15 +08:00
ma wei
b8a32eb086 add ability for customize report output directory
Former-commit-id: fdf53b2768ecd38f16de676ddd35e63fcd1cfad0
2015-07-07 13:45:55 +08:00
ma wei
e537ce155e upgrade the version of dependency check utils
Former-commit-id: 34ef2d92888cf2e108cc0759fd1ba04fb795abe3
2015-07-07 13:45:21 +08:00
Dale Visser
be506964b0 Fixed javadoc. Some reformatting of FileFilterBuilder.
Former-commit-id: 66a81beb1f1361b16743a762f6941dfef626ca4a
2015-07-06 14:16:44 -04:00
Dale Visser
df39b490f5 Made extension file filtering case-insensitive.
Former-commit-id: e7bc80227edcf0d4fb9503eb39d43260b7db028e
2015-07-06 13:50:00 -04:00
Dale Visser
e3256e4bb9 Removed unused imports from AbstractFileTypeAnalyzer.
Former-commit-id: 79af85c863a4b64a113f88c3bab75ba038bcec0b
2015-07-06 13:44:08 -04:00
Dale Visser
4d01d636cc Changed AbstractFiletypeAnalyzer to expose getFileFilter() instead of getSupportedExtensions(), and
refactored existing implementations to return a FileFilter instance. The new FileFilterBuilder class
encapsulates building of a filter that can consider the full filename or other attributes, in addition
to file extension.


Former-commit-id: 9c968c77cc2285d571d38b1a8486d05b09b12aa4
2015-07-06 13:35:49 -04:00
Hans Joachim Desserud
1bf07036e8 Merge branch 'master' into reporting
Conflicts:
	dependency-check-cli/pom.xml

Former-commit-id: f381a7191effbe65f852c76e5e19033e4a264171
2015-07-06 18:36:49 +02:00
Jeremy Long
da058fcaf5 corrected naming of cpe part update
Former-commit-id: 1e7e29ac28d576c495f96713277eaa7c1b705cfc
2015-07-05 06:24:55 -04:00
Jeremy Long
7203c91c70 corrected naming of cpe part update
Former-commit-id: aaac06bda3480c23d663f25b1feac34dc57032b9
2015-07-05 06:09:17 -04:00
Jeremy Long
44893a2a2c added CPE entries to patch issue #149
Former-commit-id: 472d5456e6a8a9d569908ce8da4f64d05afa96c7
2015-07-04 06:40:39 -04:00
Jeremy Long
bdf2ca6e1d added CPE entries to patch issue #149
Former-commit-id: 2bd88a3823d5889ad12952fc3f344e69d571ad05
2015-07-04 06:39:54 -04:00
Jeremy Long
621ac3b6ec changed logging level on one delete temp file log entry
Former-commit-id: 2f73b9a97a641bb86b73db76dc82d5e84cde9e17
2015-07-04 06:38:39 -04:00
Jeremy Long
9fbf8b58a1 added archive.scan.depth
Former-commit-id: 4582ae764582a0435b6f672ed86393d37f8e3d05
2015-06-29 06:24:43 -04:00
Jeremy Long
70ac55f983 Merge pull request #264 from dwvisser/evidence-hashcode-contract
Evidence class compliance with Object.hashCode() contract

Former-commit-id: 94898beb75c867b58a5f8a1cd879b7b47ab47cb5
2015-06-29 06:12:17 -04:00
Jeremy Long
890bb4a2c3 changed how specification version is handled to resolve 262
Former-commit-id: c902d0683bec70a8254c7110e14b14bf0f3ad54a
2015-06-28 07:08:36 -04:00
Dale Visser
888f2aed97 Replaced ternary expression with ObjectUtils.equals(), and reformatted using IDE.
Former-commit-id: e72ba88f6e4d29cb00288c34a9d413e455f26b16
2015-06-24 15:38:03 -04:00
Dale Visser
e6707c65a5 Made magic number constants private.
Former-commit-id: 12539d50efb17790b770934d10b953e0fd180c8a
2015-06-24 15:25:03 -04:00
Dale Visser
414912de67 Replaced private method with ObjectUtils.compare().
Former-commit-id: 16c4a5a7ed74819351bab55528442183a3244a0c
2015-06-24 15:19:24 -04:00
Dale Visser
723ba740e0 Repleced testEquality() with StringUtils.equalsIgnoreCase().
Former-commit-id: 559413b9fef79fddbb85bcebda3ed0ca76c908dd
2015-06-24 15:12:15 -04:00
Dale Visser
e2389b4992 Replaced private method with calls to StringUtils.equalsIgnoreCase()
Former-commit-id: d4c92115e6f90109bfae9487ef3f4c829bf22232
2015-06-24 15:01:32 -04:00
Dale Visser
39e587085f Replaced private method with equivalent ObjectUtils.equals() call.
Former-commit-id: 9d460788899a3cb6e0891d63e39f50c3f96fc385
2015-06-24 14:57:10 -04:00
Dale Visser
42e77c77a9 More expressive/readable code using commons-lang.
Former-commit-id: bf24d6d4672c57fdbe6c1f113ddb25628ec97db4
2015-06-24 14:48:48 -04:00
Dale Visser
e8353089f3 Made hashCode() implement satisfy the Object.hashCode() contract, i.e., a.equals(b) implies a.hashCode() == b.hashCode()
Former-commit-id: 9f347a57b740b572d2d6a9a9e523de44e384773e
2015-06-24 14:41:20 -04:00
Jeremy Long
d76799cfd0 changed a warning log message to debug
Former-commit-id: dee9cc935de19052dc0d25b927b6dc4b5948504c
2015-06-24 06:16:12 -04:00
Jeremy Long
4907c20ba6 Merge pull request #263 from dwvisser/engine-javadoc
Added explanatory text to analyzeDependencies() javadoc. 

Former-commit-id: a23881a1e1d2b8c247176acb525f2e9ade601cca
2015-06-24 06:00:35 -04:00
Dale Visser
fa16a960a5 Added explanatory text to analyzeDependencies() javadoc. Fixed IDE warning about unnecessary ternary expression. Slight code reformat.
Former-commit-id: 2b2887308c853cae85a4a6f9572e3fde20f0c990
2015-06-23 11:56:09 -04:00
Jeremy Long
aa66e5ab15 removed unused JUL properties file
Former-commit-id: e02cb926d9c52fbd6f8e99dc612dea6707fac51a
2015-06-22 05:54:18 -04:00
Jeremy Long
802e4fc238 changed default logging for tests to INFO
Former-commit-id: 45b4dc2707e0a267d2ef41a84627c5fee5ba92f1
2015-06-22 05:53:51 -04:00
Jeremy Long
2494fec2a7 checkstyle/findbugs/pmd corrections
Former-commit-id: 7e1758362e3e3da13678e5e2a8bffa28b8ad5a87
2015-06-22 05:53:11 -04:00
Jeremy Long
13db27854b logback test configuration
Former-commit-id: f7af8edab353b7900eb20f088707ad9c38d9330e
2015-06-21 20:12:31 -04:00
Jeremy Long
190e17e6b9 converted to logback instead of slfj-simple
Former-commit-id: ad06d3bf039bbb30b1f10ce2ae5861000b1c05f6
2015-06-21 20:11:27 -04:00
Jeremy Long
02acd3162e removed simplelogger references
Former-commit-id: 5ab1de428d8d69a9d3f7bd8e80af0779f46b1fa0
2015-06-21 20:11:03 -04:00
Jeremy Long
47fa6e67d9 converted to logback instead of slfj-simple
Former-commit-id: 1b3854eeb5ad098931d5603b5206d88a900176da
2015-06-21 20:10:23 -04:00
Jeremy Long
aba7b47fa8 removed logback-classic version number because it is in dependency-management
Former-commit-id: 231224b23957508f2084ec06f1debf09b6513b90
2015-06-21 20:09:14 -04:00
Hans Joachim Desserud
c1ae4f8cc2 Replaced version numbers for reporting plugins in maven module
Former-commit-id: e7ec67e0692d4233a2d6d651f50b0cd250c4587b
2015-06-21 17:52:48 +02:00
Hans Joachim Desserud
4f43793e17 Bonus: fixed copyright symbol
Former-commit-id: 49d9f8af2055135238aa656cb69e20089a22e9fe
2015-06-21 17:43:04 +02:00
Hans Joachim Desserud
8fd32ebd5e Replaced version numbers for reporting plugins in cli module
Former-commit-id: c686c6f452ff1c514924d3c7dee59eaac4463af1
2015-06-21 17:42:13 +02:00
Hans Joachim Desserud
0b2059462b Replaced version numbers for reporting plugins in ant module
Former-commit-id: 6eaa38d2988142c07b92e94933564d652b7852d3
2015-06-21 17:31:42 +02:00
Hans Joachim Desserud
b0df41213a Use properties in reporting version numbers in root pom
Former-commit-id: 77b71beee1caeaa94712a8e3392952ea4bc78689
2015-06-21 14:42:15 +02:00
Hans Joachim Desserud
f421f30122 Add (and sync) reporting plugins for jenkins module
Former-commit-id: 0148cb4c9576f800f684299141e2e97b7d493bdd
2015-06-21 14:38:41 +02:00
Hans Joachim Desserud
358ac46393 Replace reporting plugin version numbers with properties in core module
Former-commit-id: dbd8588f6f259e03203700ebc2075fb8b84ff575
2015-06-21 14:27:25 +02:00
Hans Joachim Desserud
ebd98b9094 Move reporting-plugin-version properties to root pom
Former-commit-id: eeff5c2d0f0fce884c3c12b071d030e4f0107302
2015-06-21 14:27:25 +02:00
Hans Joachim Desserud
c713bb0353 Move reporting plugin version numbers into properties
Former-commit-id: a3cbc3ba8647dc2118e6c35f2819c87eb2f98e6f
2015-06-21 14:27:24 +02:00
Jeremy Long
d61a7b090d removed unused import
Former-commit-id: b5fa9e7692183a4244e23206549b63ac809aec94
2015-06-21 07:38:18 -04:00
Jeremy Long
9f1a894b86 removed duplicate slfj4-api
Former-commit-id: 480d6b7a79bfb7a52bd341d9fdef47cb6f9f1c4c
2015-06-21 07:37:59 -04:00
Jeremy Long
cc86d73719 removed unused import
Former-commit-id: 298698b4a56a0fd267ee6bc81e5abe46156b94f6
2015-06-21 07:21:42 -04:00
Jeremy Long
86b1802d16 version for slf4j-api was moved to dependency-managment in parent
Former-commit-id: c7a6567c4b0077a512765beb9ee864b9f7fa5459
2015-06-21 07:21:14 -04:00
Jeremy Long
3cdf66a0a4 removed LogUtils
Former-commit-id: d2507a7a917e0e8f2a9f4e11379aadbbd4540a43
2015-06-21 07:20:36 -04:00
Jeremy Long
faeee200d3 removed unused classes
Former-commit-id: 0f642f99d1ab168a3c97653b5abbda7ab313732a
2015-06-21 07:20:01 -04:00
Jeremy Long
4b34734919 Merge branch 'colezlaw-dependency-management'
Former-commit-id: 221f40ba56ebaa05bbf2f0eb208fdeba03252170
2015-06-21 06:48:43 -04:00
Jeremy Long
765c1b8875 dependency management updates
Former-commit-id: 7b853706a10d6caeb547fda15b217ebc7893949a
2015-06-21 06:48:25 -04:00
Jeremy Long
f89cefd9ae Merge pull request #241 from dwvisser/autoconf-files-analyzer
Autoconf files analyzer

Former-commit-id: f8e364d31b9a40abfef67ef93d91cb65527be217
2015-06-21 06:35:14 -04:00
Jeremy Long
23dfa8645c Merge branch 'master' of github.com:jeremylong/DependencyCheck
Former-commit-id: 179e9bb323f6a225d44393ac80e1d983b6af8947
2015-06-21 06:19:18 -04:00
Jeremy Long
9556e7bf51 added logback
Former-commit-id: 2d42135f5f38ae09c84d95add075b09a62b8c347
2015-06-21 06:19:10 -04:00
Jeremy Long
7fa306dd9a added logback instead of JUL to resolve issue #164
Former-commit-id: 226e52fc03b22501358d6d147d3fa042c274f1f4
2015-06-21 06:18:54 -04:00
Jeremy Long
d9a322b533 added logback
Former-commit-id: 3179f2fd13329ce3b83126b70dfa516c551978a4
2015-06-21 06:15:40 -04:00
Jeremy Long
fde1b21d1f added logback
Former-commit-id: a1f23b3181e642a41ba5e1b767b86b103d4ad134
2015-06-21 06:14:49 -04:00
Will Stranathan
124249a35d Moving all versions into the parent project
Former-commit-id: fb72244825663b3ae063daf4c5b305504532e254
2015-06-20 11:20:58 -04:00
Jeremy Long
6d6e9a6df7 Merge pull request #258 from dwvisser/dependency-class
Dependency class javadoc and code readability/re-use changes

Former-commit-id: dda65552ee613a836a20901772e93cf2d5cae003
2015-06-20 05:47:54 -04:00
Dale Visser
77ae9dfbef Extracted magic numbers in hashCode() to named constants.
Former-commit-id: e023cdf8583859215243244227bdc576b4df75f4
2015-06-19 13:47:03 -04:00
Jeremy Long
4ed642ed5d changed the lifecycle of the aggregate mojo
Former-commit-id: d8cbcc207d921a66baea8c7763329defc170a512
2015-06-19 06:42:25 -04:00
Jeremy Long
556be02696 removed the logFile as it is no longer used
Former-commit-id: 4fc60afe005df06712abe7478b431ba3c4c29562
2015-06-19 06:41:55 -04:00
Jeremy Long
572418a2f5 removed the logFile as it is no longer used
Former-commit-id: 51466302d3697dcb07673493cd33776a4bd395c3
2015-06-19 06:41:33 -04:00
Jeremy Long
fce742910e removed the logFile configuration as we now use the ant logger
Former-commit-id: 250f861439d7fbe4b2916c258aa6dd96ce5feca6
2015-06-19 06:40:56 -04:00
Jeremy Long
370b0cb049 removed the unused logFile property
Former-commit-id: 882b8abad919c9635919f5b6891845d6523c00b9
2015-06-19 06:40:07 -04:00
Jeremy Long
76333b8647 patch to resolve issue #255
Former-commit-id: 0e3f3081929a4bd93ea14a7379567f2f0c776b02
2015-06-19 05:39:31 -04:00
Jeremy Long
ce7d12e850 Merge branch 'master' of github.com:jeremylong/DependencyCheck
Former-commit-id: e7876e1969de54e1d9a139fb7e40f26748687c5b
2015-06-19 05:35:10 -04:00
Jeremy Long
63d92c62a5 additional checks added as part of issue #257
Former-commit-id: 9a9154adcc42688f600a9a6cce49a919fd08f482
2015-06-19 05:34:52 -04:00
Dale Visser
7e2720e673 Added explanatory Javadoc comments for relatedDependency behavior and purpose. Added logging whenever there is a collision adding to relatedDependency.
Former-commit-id: 99d3c9527541769e47008a9c919e4727bd2bf623
2015-06-18 19:33:57 -04:00
Dale Visser
a7c0ea3602 Line reduction in Dependency.equals(), and refactor of Dependency.hashCode() using ObjectUtils and a for loop.
Former-commit-id: e95186fe8aa0eae3c6ee45f4f5c459f86c19c636
2015-06-18 19:07:45 -04:00
Dale Visser
374829ecd5 DependencyCheck.equals() taking advantage of commons ObjectUtils now.
Former-commit-id: d72ed9b7ee7c0b634b64e90e902d7991534cde79
2015-06-18 16:51:56 -04:00
Jeremy Long
6a67c04ca2 Merge pull request #256 from dwvisser/deprecation-warning-fixes
Some minor dependency-check-core compiler warning fixes

Former-commit-id: 2a833976d69160acdf2e2d2494f16749064e170f
2015-06-17 20:51:04 -04:00
Jeremy Long
f4ce087649 moved files
Former-commit-id: 4041a13f94723e6002e82b926916d60946b3a4d2
2015-06-17 20:48:50 -04:00
Jeremy Long
4566ce7de8 added package-info
Former-commit-id: e3d0de42bc1e66cead82b043da10cd5c148fb9a1
2015-06-17 20:48:41 -04:00
Jeremy Long
a898e61a7a added package-info
Former-commit-id: be01f5e10b7550bfb180af62d111574a3d988079
2015-06-17 20:48:17 -04:00
Jeremy Long
6d524bdc99 added The OWASP Foundation
Former-commit-id: 29b73f7bb17368be8c1d0b5547290365eaedefb9
2015-06-17 20:47:24 -04:00
Jeremy Long
1ba21f7f71 fixed copyright
Former-commit-id: 8e49185e3efef904af121a69fb04c8c577ef0b6e
2015-06-17 20:46:51 -04:00
Jeremy Long
7f710e0782 Merge branch 'master' of github.com:jeremylong/DependencyCheck
Former-commit-id: 0050abb5911eb52058d7e43a65d7f3df5dda6f24
2015-06-17 20:16:54 -04:00
Jeremy Long
acb78c18bf Merge pull request #254 from colezlaw/issue-239
Now switched to slf4j

Former-commit-id: 7b2e8bc1351455620912bdcb761d639cb5588986
2015-06-17 20:16:42 -04:00
Dale Visser
5b1f632035 Isolated sources of deprecation warnings, and added warning suppression annotations. Also added a minor Enumeration -> Enumeration<JarEntry> "fix"
Former-commit-id: ccfe52d9ed50977ce73b928b09232d8635d7fcf2
2015-06-17 15:51:06 -04:00
Will Stranathan
8aca739f54 Now switched to slf4j
Former-commit-id: 880512e5998d86026cfec40b1a8a165dd6b4b8e1
2015-06-16 18:50:05 -04:00
Jeremy Long
efdfcee7fc minor tweak to test cases to prevent warnings during the test case execution
Former-commit-id: 26e14d162629b3de225193718396fa87bb932d95
2015-06-16 14:06:34 -04:00
Jeremy Long
1b4cb1379a Merge branch 'hansjoachim-more-dependency-management'
Former-commit-id: 043ec0799ce163e2a1ea38f9a7ed2113b2a892b9
2015-06-16 05:38:03 -04:00
Jeremy Long
820d7f18c4 Merge branch 'more-dependency-management' of https://github.com/hansjoachim/DependencyCheck into hansjoachim-more-dependency-management
Former-commit-id: 80ad346062356e133e8641bae1761dfc8aa396c3
2015-06-14 19:59:19 -04:00
Jeremy Long
7a5a5e0211 added the hint analyzer to the test case to fix a bug
Former-commit-id: 48062285772215509e00ff74a0d3dcf83f571cb9
2015-06-14 16:07:44 -04:00
Jeremy Long
07dda233ec patch for issue #229 to remove bundle vendor from the evidence
Former-commit-id: a5a24422d5edfb23d3ea4d4c617044051d454860
2015-06-14 15:51:26 -04:00
Jeremy Long
02209fc039 patch for issue #229 and false negative for spring security
Former-commit-id: 8c9cd15ab06a88f675241fe75f1fe193634eddf0
2015-06-14 15:50:14 -04:00
Hans Joachim Desserud
a372882c18 Upgrade maven-core, -plugin-api and -settings dependencies to version 3.3.3
Former-commit-id: 92d1b4c84ccdc70bd3dd7ae29484ac546adea6b5
2015-06-13 15:57:01 +02:00
Hans Joachim Desserud
91c05598b2 Move -maven depency version numbers to the parent pom
Former-commit-id: 64013140d893a6b9ed356c515a94951ad1c92dd4
2015-06-13 15:56:59 +02:00
Hans Joachim Desserud
0130ab6356 Remove commons-io version number from -core
Former-commit-id: e2085764fa4f4ead5e865fb5463523344f7ba228
2015-06-13 15:56:57 +02:00
Hans Joachim Desserud
581a3f8388 Move commons-io version number to parent pom
Former-commit-id: b065059630f6c06f522a1b3c0e56d99c78f363ae
2015-06-13 15:56:55 +02:00
Hans Joachim Desserud
2587ad21c0 Add upgrade warnings/notes
Former-commit-id: e35d3be893841c3a8c6a958888d87ff304e22360
2015-06-13 15:56:54 +02:00
Hans Joachim Desserud
8b56349daa Move commons-cli version number to parent pom
Former-commit-id: e80c5831d491189c867cdceb3255c655e3b76027
2015-06-13 15:56:52 +02:00
Jeremy Long
25f2eb69b9 fixed bug related to temp files
Former-commit-id: 5b492bb592122645a7a7afda34b23f54da8c2fa4
2015-06-13 08:41:19 -04:00
Jeremy Long
46b4761f1a updated test case initialization
Former-commit-id: eb6c0b16c2ca4555d81d8c66db18198991ab8d51
2015-06-13 08:32:38 -04:00
Jeremy Long
4d3f96f979 fixed bug related to temp files
Former-commit-id: 3d1a5c6d30411ab026b2f072a8aee25106bf9691
2015-06-13 08:30:05 -04:00
Jeremy Long
084371a1e3 initial long running test, commented out as not all resources are in repo yet
Former-commit-id: 3811321133cf2dfdf898677803086d8e2aa7e689
2015-06-13 08:29:30 -04:00
Jeremy Long
f5aaaf1c63 fixed bug related to an incorrect file path, resulted in NPE in the dependency bundling analyzer in rare cases
Former-commit-id: ac1846686bc1c96feaa4c3966dd91f6ad425542f
2015-06-13 08:26:18 -04:00
Jeremy Long
316bab6fff fix for issue 232 - dependencies in seperate war files were being combined as related in cli
Former-commit-id: d43f3689be374468a6877436a2b1c94d13897c30
2015-06-13 08:25:20 -04:00
Jeremy Long
65a5d38fc6 updated test configuration
Former-commit-id: 598f069d1618f8941d480a1f6020ea9969a66222
2015-06-13 08:23:54 -04:00
ma wei
aa927e9168 refactor the build.gradle file, extract publish tasks to separated gradle file
Former-commit-id: 539b8d16917a8a60e07a7f1466ce9ad0c84ca94e
2015-06-11 10:11:07 +08:00
Jeremy Long
7b0a120e66 added test-jar back
Former-commit-id: 98de0ae9efde8e5fba07f19d327703c52c5a67e7
2015-06-10 05:35:47 -04:00
Jeremy Long
143ce58cb3 patch for issue #251
Former-commit-id: b63ab10ddf415eb5b5b7d0f2a7fc2e343e3f2aef
2015-06-07 17:45:59 -04:00
Jeremy Long
9244b44ce6 Merge branch 'hansjoachim-plugins'
Former-commit-id: f88e9750d80b430e36b9557d5d8832bec15b4efc
2015-06-07 17:14:36 -04:00
Hans Joachim Desserud
4720312b26 Upgraded several plugins to latest version
Former-commit-id: 0e7cc8f6d90a31fcf59171f2432957efabe9e813
2015-06-07 17:50:42 +02:00
Jeremy Long
d43610701b added suppression entries per issuue #237
Former-commit-id: b600d89b0da9414f8f48d7d0fe3d447b75418c9c
2015-06-07 07:38:55 -04:00
Jeremy Long
243b0b2c21 removed test-jar
Former-commit-id: c6f5ee69992ba24185941e5488212f0e47286ec2
2015-06-07 07:09:32 -04:00
Jeremy Long
930894ced5 changed provided scoped dependencies to the correct test scope per issue #244
Former-commit-id: a6882023e79e158ab664ea3c39b6419b0940ce26
2015-06-07 07:09:03 -04:00
Jeremy Long
63ce7850e1 Merge branch 'hansjoachim-upgrades'
Former-commit-id: 6e19e7b75a4481314adb9b74586541a582a98018
2015-06-07 06:43:02 -04:00
Hans Joachim Desserud
984a38ce91 Renamed field to avoid shadowing
Former-commit-id: 05c0f0784d3ef4aa688e4700c790dc44d9c6d133
2015-06-06 14:05:06 +02:00
Hans Joachim Desserud
12ce2275e0 Replace deprecated use of extending BuildFileTest with BuildFileRule now that the latter is available in ant-testutil
Former-commit-id: c06ccc49f15012ef545b94d8e601c5ae0f012190
2015-06-06 14:05:06 +02:00
Hans Joachim Desserud
214b88ea1c Move Apache Ant dependency declaration to dependencyManagment and upgrade to 1.9.5
Former-commit-id: 9be839121e7423007ff293b44aa69327b7821a2c
2015-06-06 14:05:05 +02:00
Jeremy Long
980e00e824 Merge pull request #248 from colezlaw/xpathfix
Fixed the Xpath expression to be more accurate and to find the getLog…

Former-commit-id: 43c480a97da111436353fbb1bb6f686eddaf89dd
2015-06-06 06:13:33 -04:00
ma wei
80276d5e4d adjust format in README
Former-commit-id: 7bcc077020394df43130bcd35d60cf1063b6c815
2015-06-06 10:33:43 +08:00
ma wei
28c2db9edc adjust format in README
Former-commit-id: 6a905bf23bec0f939974d83d53941a54d0dd851a
2015-06-06 10:32:02 +08:00
ma wei
5e66f70cf0 Update README, add usage for install plugin from MavenCentral
Former-commit-id: 26c9119b6eeb042e46f9855a2c51c48a0675419b
2015-06-06 10:29:50 +08:00
ma wei
4e41187bf3 Modify version to 0.0.4, changed the GroupId in order to release to MavenCentral
Former-commit-id: 7f57d17742215afcf3a9e2b4aa82e93d7444439e
2015-06-06 10:28:52 +08:00
Will Stranathan
0a09760aec Fixed the Xpath expression to be more accurate and to find the getLogger statement
Former-commit-id: 2ecf96fe54d6f417f1fbf4b51092b73ed0d8a015
2015-06-05 22:03:13 -04:00
Jeremy Long
500ad62470 Merge pull request #247 from dwvisser/analyzer-logger-fix
Fixed logger name in PythonPackageAnalyzer.

Former-commit-id: 3fe7f3cce7db8733ef534b556cfd4023d9a210fc
2015-06-05 20:00:04 -04:00
Jeremy Long
1204d98e8d added rough rule to look for copy paste errors regarding loggers (i.e. obtaining the logger for the wrong class per PR #247)
Former-commit-id: ca6b2566ea496909ea4ab4f48241bb664b130183
2015-06-05 19:59:40 -04:00
Dale Visser
ae3596ac99 Fixed logger name in PythonPackageAnalyzer.
Former-commit-id: 759bdd58e3af6050014ef34cf40056fb83592249
2015-06-05 14:43:45 -04:00
Jeremy Long
d662c693f1 updated version numbers
Former-commit-id: 68c36d5c7f9b57e8b14fa9cd96fb6e74e34e4c19
2015-06-05 09:21:01 -04:00
Jeremy Long
1820cd0ae8 1.2.12-SNAPSHOT
Former-commit-id: 0099793057b121184d59f9aabfeb92b6df7ecaac
2015-06-05 09:20:49 -04:00
Jeremy Long
c5e144d211 Merge pull request #236 from ercpe/fix-dbstatements
Fix table name in dbStatements

Former-commit-id: 5ea4b843251c9c3c4d1a6b7cbf0d2b6599add3e8
2015-06-05 07:26:29 -04:00
Jeremy Long
e1c041a250 1.2.12-SNAPSHOT
Former-commit-id: 5136f7af23b3de02e6375350c2b850518ef6a3a8
2015-06-05 07:26:17 -04:00
Jeremy Long
82dff86802 added an Oxford comma for consistency
Former-commit-id: 4b6d06035396759018a6a4a843d6c573178cc5d6
2015-06-05 07:06:19 -04:00
Jeremy Long
b2019d7633 Merge pull request #243 from dwvisser/docs-index-update
Add Python, .NET to project description, fixed broken links

Former-commit-id: f192013295457df2d53853e27bc2cbcc8f09ef7b
2015-06-05 06:51:45 -04:00
Jeremy Long
f6afea0004 fix for issue #238
Former-commit-id: 3e2d26a90fb14975d01be395c9ac6a6a80297e2d
2015-06-05 06:10:41 -04:00
Jeremy Long
309eb502cd Merge branch 'master' of github.com:jeremylong/DependencyCheck
Former-commit-id: 9f114b5a00713330c15cd4b24578bee1904074ee
2015-06-05 05:58:44 -04:00
Dale Visser
712252eb6b Fixed broken links.
Former-commit-id: b14061de70552c56a81742c1bc35ffb322f75d54
2015-06-04 10:38:01 -04:00
Dale Visser
c3baf36eb5 Added .NET and Python to description on site index page.
Former-commit-id: 94f09b4e66452afc111db493d4e7195170441b5d
2015-06-04 10:23:56 -04:00
Dale Visser
771fd77088 AutoconfAnalyzer: Some 'diff' whitespace fixes.
Former-commit-id: 98b756d97d38068550a416eb1df0c7fa2e217504
2015-06-03 15:05:13 -04:00
Dale Visser
7d3ac21e42 AutoconfAnalyzer: Some code refactoring to eliminate duplicate code
and redundant condition checking, plus fixes/additions to Javadoc.

Former-commit-id: 1c18377b6d871f354915ca210df6ee22534553ba
2015-06-03 14:50:49 -04:00
Dale Visser
cc3a72f4fd AutoconfAnalyzer: Added 'configure' extension for analyzing Autoconf
output configure scripts for the package metadata shell variables
generated by autoconf. Passing tests that look at metadata generated
in Readable's and Binutil's configure scripts.

Former-commit-id: d20bb17ccf4fde848dede4b87805241387e73f89
2015-06-03 14:50:24 -04:00
Dale Visser
d87fa374ec Autoconf analyzer: added configure.in and unquoted values processing.
Former-commit-id: 4cedd800c60250f19deaebf8cdff9db4e310e7ab
2015-06-03 14:50:24 -04:00
Dale Visser
154a576388 AutoconfAnalyzer: added analyzer to service registry; added needed command-line hooks, flags.
Former-commit-id: bc4cc6082b4181286e62e736f4d5751e60379779
2015-06-03 14:50:17 -04:00
Dale Visser
29fe71b82c AutoconfAnalyzer: Minor code fixes to address some static analysis warnings.
Former-commit-id: a8ad815fd8fbcf1b21141093d92da0758c344d01
2015-06-03 14:50:09 -04:00
Dale Visser
e960fd31fa AutoconfAnalyzer: Added unit test for Readable's configure.ac, which makes full usage of
available AC_INIT parameters.

Former-commit-id: e545f3f85b70f15c1650528af9afd940984478a1
2015-06-03 14:49:45 -04:00
Dale Visser
132fb87c2c Initial AutconfAnalyzer implementation, along with passing unit tests utilizing
GNU Ghostscript's configure.ac.


Former-commit-id: 50f2c5bc8ba83f346471cde091b4cc46947ed246
2015-06-03 14:39:49 -04:00
ma wei
6e281e0b66 Add gradle task to publish this plugin to Maven Central
Former-commit-id: dc5bfcbc382d7eb5f227c655214560082c8b9633
2015-06-02 14:14:06 +08:00
ma wei
a86ff9dfd1 Add ability for user to configure CVE url in gradle build file
Former-commit-id: 186b03ff55c9cab1c7bd788e5ea5ba1f8e79241e
2015-06-02 14:03:03 +08:00
Johann Schmitz
3ea33f1dd6 Fix table name in dbStatements
Changed table name to "software" to avoid SQL errors on MySQL (case sensitive)


Former-commit-id: c5097a534c778db2e919ce26d54ba175767e8c8a
2015-05-27 16:44:42 +02:00
Johann Schmitz
b645fd495f Fix table name in dbStatements
Changed table name to "cpeEntry" to avoid SQL errors on MySQL (case sensitive)


Former-commit-id: 0b9bedaad63a4310c4b3aa69fc0351a1b27f55ce
2015-05-27 10:18:20 +02:00
Jeremy Long
5e635224e2 Merge pull request #235 from wmaintw/master
Add license information and modify the legalese for the gradle plugin

Former-commit-id: b880c195086735cab18ee3c78ef2f074aff625d8
2015-05-25 11:32:51 -04:00
ma wei
54d8becd74 Add license information and modify the legalese
Former-commit-id: 4586da1e5e89cc90cdd67f7a06ee3d7fe2e5871f
2015-05-25 12:23:58 +08:00
Jeremy Long
87243537e7 fixed documentation (path to mono) per issue #234
Former-commit-id: bc56be22a694aea6868bb7a23b38bd992e3c7bbd
2015-05-23 07:13:33 -04:00
Jeremy Long
0604361d4e Merge branch 'wmaintw-master'
Former-commit-id: 16f0045f42b6bb19b7f3e0a7e74afee4a5a62e4c
2015-05-23 06:48:08 -04:00
Jeremy Long
399c052129 Merge branch 'master' of https://github.com/wmaintw/DependencyCheck into wmaintw-master
Former-commit-id: 2974aad3031a4b5746f735640f9fdee430e5b709
2015-05-23 06:46:11 -04:00
Jeremy Long
362c7e9c04 added notes for future enhancement
Former-commit-id: 2886464dc1fd657b79f1763eec2862bbf2c11af7
2015-05-23 06:39:23 -04:00
ma wei
c4843253c0 update version in README
Former-commit-id: f34bbf1704c329035cb12b739b40505cdae88230
2015-05-22 15:14:21 +08:00
Jeremy Long
928d8dbb15 Merge pull request #233 from dwvisser/add-dvisser-as-contributor
Added Dale Visser to the developers list.

Former-commit-id: d960cd48ef9541c57ca6b9e545f23a6833105392
2015-05-17 07:20:42 -04:00
ma wei
7f528d8d4a update proxy setting usage
Former-commit-id: fd11b04a2a68619e9481e9d1341ef64b96dbf9d8
2015-05-15 11:39:52 +08:00
ma wei
8ddf4a0e72 add ability for user to customize proxy setting
Former-commit-id: 8b5093ccc75751bbea1415334bd5f4335bc5bbc6
2015-05-15 11:33:17 +08:00
Dale Visser
5c589136e5 Added Dale Visser to the developers list.
Former-commit-id: 678f9e701a59148288b20a62978343d4633b2fb2
2015-05-14 11:06:57 -04:00
ma wei
00f10771d9 modify the plugin version to 0.0.2 in README
Former-commit-id: aab6f65c20e565647a7fd91f04af63aeedeab32f
2015-05-14 11:27:02 +08:00
ma wei
583a5cda61 upgrade dependency-core version to 1.2.11
Former-commit-id: c36d8d962a352c574cacabc73a4e12c1bb6c7a7a
2015-05-14 11:25:18 +08:00
ma wei
f9e5ebccfd modify usage for multiple sub project
Former-commit-id: 295bd3be8cc8901c7d103b51d6a4041b53bbcb3e
2015-05-14 11:24:29 +08:00
ma wei
77eebb6c1b update version to 0.0.2
Former-commit-id: d999f6fe3e9f5d6c309bdbda5581fb586e895930
2015-05-14 11:06:34 +08:00
ma wei
53d01e5fe1 update usage for multiple sub project
Former-commit-id: 16aac082aa5f52f01db8f6935252306bd176860b
2015-05-14 11:04:39 +08:00
ma wei
3d08e8db06 generate report for each sub project in different directory
Former-commit-id: f13f90e93121734706ad2bc43bf47d70533b117c
2015-05-14 10:48:15 +08:00
Jeremy Long
50a3ce2036 fixed typo in file name
Former-commit-id: eec0a010dd1c88cbf933446920f2d5a53932714a
2015-05-13 08:12:30 -04:00
Jeremy Long
a127948c4c sorted projects in each list
Former-commit-id: 5b36f4f7b35f2eff178779307466976767e2e933
2015-05-13 06:36:19 -04:00
Jeremy Long
36b406f7ec added a link to the python analyzer
Former-commit-id: fa73940acd758656f3876cff9d3b8e475ef430e1
2015-05-13 06:35:35 -04:00
Jeremy Long
3c50e9f784 fixed markdown syntax and added a link to the python analyzer
Former-commit-id: 286dd35ae2c1480a7bd2fac2a4f0d59d7990a12f
2015-05-13 06:35:18 -04:00
ma wei
51e2af148e modify code format in README.md
Former-commit-id: 5aabb0ec41022da8a2e0c83fc0317e7cbcc4cb95
2015-05-13 10:22:36 +08:00
ma wei
d7351f97fe add ability to publish this plugin to Gradle Plugin Portal
Former-commit-id: 7dd9400a1871db2c880cecee3297734f39b3be4e
2015-05-13 10:17:07 +08:00
Jeremy Long
1a042fab4b version 1.2.11
Former-commit-id: a7da992577504112a168f71e0dde9364d2a68ad0
2015-05-12 06:02:29 -04:00
Jeremy Long
c3f000c5ef version 1.2.11
Former-commit-id: cd3b5ef7fa3dce4e40933c9278b2a2a46fcf6f20
2015-05-12 06:02:29 -04:00
Jeremy Long
e848dd5bee version 1.2.11
Former-commit-id: 3b4665a8697668081e87f7082ed26931cd98b022
2015-05-12 06:02:28 -04:00
Jeremy Long
566e11f755 version 1.2.11
Former-commit-id: 2650031e6240ca78460d1f4eca9d533a51404bff
2015-05-12 06:02:28 -04:00
Jeremy Long
13aa00e465 version 1.2.11
Former-commit-id: 962ba27959c0648f7c271cbe3b10235c390f561e
2015-05-12 06:02:28 -04:00
Jeremy Long
e9df060e0c version 1.2.11
Former-commit-id: 25145940a45388db1a01e954246ebcc50cda41d9
2015-05-12 06:02:28 -04:00
Jeremy Long
c4724e8020 version 1.2.11
Former-commit-id: 90b6adbbf9a01bee641cdca7e2fda2cacd6266bc
2015-05-12 06:02:27 -04:00
Jeremy Long
9c36087dae updated sample report
Former-commit-id: 3147df8191930f55ffcb6810b0d5751fbb93b2fd
2015-05-12 05:23:45 -04:00
ma wei
51c3ebcdb8 add ability to publish this plugin to Bintray
Former-commit-id: 61b03346bf2f3035d52f86c88d8d655099ed5eb7
2015-05-12 16:45:40 +08:00
ma wei
f29e4a5d36 remove unused code
Former-commit-id: 1844b759f255550545b4ead5e527289c2ad8b1a7
2015-05-12 16:22:15 +08:00
Jeremy Long
99dd04a1c1 findbugs correction
Former-commit-id: 79dc73b57f2d025754e0fc717610e9a067f1a155
2015-05-11 20:31:50 -04:00
Jeremy Long
29c47e3e96 findbugs correction
Former-commit-id: 55b3830b5d31908e452ea6c688b0213aa04a7f41
2015-05-11 20:31:36 -04:00
Jeremy Long
659248ff22 findbugs correction
Former-commit-id: 3c3c89dfa3bb71a23db3ff5e5f80ef098a8f5e9a
2015-05-11 20:31:25 -04:00
Jeremy Long
71a7e8d2dc findbugs correction
Former-commit-id: a58d1242d8a3ea307a83314f7b77e66f392d4ef3
2015-05-11 20:31:14 -04:00
Jeremy Long
caabdc6584 checkstyle corrections
Former-commit-id: 14e427f40af0fd7577d0711a80003e53811ef4e3
2015-05-10 08:30:52 -04:00
Jeremy Long
0b92d2ec17 checkstyle corrections
Former-commit-id: fe41cc533ce48a09ad80321018150d0a6b396eff
2015-05-10 08:30:43 -04:00
Jeremy Long
db8bcd8fd6 checkstyle corrections
Former-commit-id: 0d71fe52d044822ed051e7f9692a46bc76abe739
2015-05-10 08:30:33 -04:00
Jeremy Long
17cb96ef41 checkstyle corrections
Former-commit-id: d7f292f1a188081247290db6a372a2f53decced9
2015-05-10 08:19:04 -04:00
Jeremy Long
2248380c90 checkstyle corrections
Former-commit-id: 2326fa7a3cf7e2e478a4fd0edf773a449e8688a6
2015-05-10 08:19:03 -04:00
Jeremy Long
ffe64d2f8f checkstyle corrections
Former-commit-id: 2382f87c687a9c22e60dd399298ec2693c2f52ef
2015-05-10 08:19:03 -04:00
Jeremy Long
a0c624fca6 checkstyle corrections
Former-commit-id: effc24928a851553bdaf23bd0f589add9db6c7c6
2015-05-10 08:19:02 -04:00
Jeremy Long
31022ea8de checkstyle corrections
Former-commit-id: 0fd9070170429a79aa7efdd9c7c5d85e88e8a10f
2015-05-10 08:19:02 -04:00
Jeremy Long
0d0de4d5b3 checkstyle corrections
Former-commit-id: f830829cad039031b0e9a630c10ca95fd64a2e24
2015-05-10 08:19:02 -04:00
Jeremy Long
1fdb4c4627 checkstyle corrections
Former-commit-id: 982cd5df66cc4b41e73deddd7e1ae749a2cb955e
2015-05-10 08:19:01 -04:00
Jeremy Long
76665c54e2 checkstyle corrections
Former-commit-id: 61ed77caae7ee3f9ca10cafa511fa8cbcdd24fa2
2015-05-10 08:19:01 -04:00
Jeremy Long
04166766da checkstyle corrections
Former-commit-id: 7a96e04aeb874f27248375b47ad7d1f0aee6b8dc
2015-05-10 08:19:01 -04:00
Jeremy Long
aa7f903210 checkstyle corrections
Former-commit-id: 0067c70b027c153e56a7e48d7fe1066aadba9016
2015-05-10 08:19:01 -04:00
Jeremy Long
c4ca53cdf9 checkstyle corrections
Former-commit-id: 585bac09a04d92bd9f503ee93beb9260cf65e63c
2015-05-10 08:19:00 -04:00
Jeremy Long
d5885acd6e checkstyle corrections
Former-commit-id: 02db425ee86feb94346bfaf6e7cb8eb6b3b078b3
2015-05-10 08:19:00 -04:00
Jeremy Long
550b3332a3 checkstyle corrections
Former-commit-id: ca9d957a11e4f1b4184ac19b8938314a43b09d36
2015-05-10 08:19:00 -04:00
Jeremy Long
93b98576b8 checkstyle corrections
Former-commit-id: 4235986f29cd91b212024844edf4360d1204deba
2015-05-10 08:19:00 -04:00
Jeremy Long
e6f2c25167 checkstyle corrections
Former-commit-id: 7f488144815cb3065b6f5304a3d44e700319f4e9
2015-05-10 08:18:59 -04:00
Jeremy Long
0b207c6141 added test cases
Former-commit-id: 2f23cb9e248dfbbc7be40252172c560b48acef57
2015-05-10 07:16:48 -04:00
Jeremy Long
3ed5e85646 added code to strip -py2 from the identified version
Former-commit-id: 4e8f8f21a3ac21099b6ea4524f5299da95973943
2015-05-10 07:16:22 -04:00
Jeremy Long
4068da33c8 updated to resolve issue #218
Former-commit-id: b99559ce5f57014d6f94961cb321097793436678
2015-05-09 08:00:21 -04:00
Jeremy Long
d1d53ee65b updated to use HTTP or HTTPS as appropriate for the download URL
Former-commit-id: a285898cfb8ae9d2dd92549b8136c64cc551d1a4
2015-05-09 07:58:40 -04:00
Jeremy Long
38413c4f64 updated to determine if HTTP or HTTPS should be used when downloading the artifacts
Former-commit-id: b3281bfc2a57e4fd94298e06179ff5f268dfc51b
2015-05-09 07:54:56 -04:00
Jeremy Long
a6bb6cd170 fixed bug causing false positives on CPE entries with a vendor or product descriptor that is two or less characters as part of fix for #229
Former-commit-id: b4c9c8bcb2b5f542933747067b516b9247443d96
2015-05-09 05:28:31 -04:00
Jeremy Long
145bf70420 updated documentation per issue #230
Former-commit-id: 28c50979be4f2fbdbab36cc75d65c45d7729ff27
2015-05-08 19:03:15 -04:00
Jeremy Long
e2c92c57e6 updated documentation per issue #230
Former-commit-id: e3c4e4efb1720ed0fcfb8d530857ca445852c4da
2015-05-08 19:02:47 -04:00
ma wei
1fa59270c1 add README
Former-commit-id: d1a87185137952bdfeaf6dd2543e0ff748e37859
2015-05-08 16:04:29 +08:00
ma wei
d5c1fda958 rename plugin name to 'dependency-check'
Former-commit-id: 240e44081b0f0a6e2678f8b2c37ef8684f245ffd
2015-05-08 16:04:18 +08:00
ma wei
b0e34fd062 add gradle task, utilize dependency-check-core functions to check dependency vulnerabilities
Former-commit-id: bef42df0ed3869fbceb4fe3ec459228031554439
2015-05-08 15:35:55 +08:00
ma wei
8fbf8df0bd initial check in
Former-commit-id: 2be8565868e6c8d62f86fcd7c70d350464c667c6
2015-05-07 11:25:31 +08:00
Jeremy Long
bcc2173768 changed confidence of maven identifier per issue #229
Former-commit-id: f5d4ad0fa35e4b6bf1975dc3aa8dc3bb862011fe
2015-05-06 16:24:15 -04:00
Jeremy Long
aa1df53ab0 fixed copy/paste error when checking for oss parent group/artifact
Former-commit-id: 432420dd19272d47e3073c0c6513de69c75c4409
2015-05-06 06:46:03 -04:00
Jeremy Long
fb6a2a2c37 fixed typo
Former-commit-id: 5ddb2be656057820ae6a6b347d1738fe5096165d
2015-05-06 06:45:25 -04:00
Jeremy Long
f403fc732c added additional test dependencies
Former-commit-id: d0726c02f7fb3ea07d6558d9344c51b23532e379
2015-05-06 06:36:05 -04:00
Jeremy Long
03aa7c56a2 corrected markdown syntax
Former-commit-id: 00ae7bfdb5b956f8c848b97fe218aa40f02de7be
2015-05-05 19:38:52 -04:00
Jeremy Long
547d6d4bcc fixed formating issues
Former-commit-id: d602cf23c16ec7b1a7e77011ab7dd0e08579aa18
2015-05-05 19:38:28 -04:00
Jeremy Long
2cba8f906d fixed formating issues
Former-commit-id: cecd4d7cddac6bf4ce7e9c7012c613a24766ccc4
2015-05-05 19:38:05 -04:00
Jeremy Long
bb5ee6a347 added related works
Former-commit-id: ced0b755e4d6c0c19b0de1cc9d33f5a934ad8ec2
2015-05-05 19:35:03 -04:00
Jeremy Long
34604efde4 added content to resolve issue #220
Former-commit-id: e7d0a7739051f098f36a818fbdfec4eed920647c
2015-05-05 18:42:46 -04:00
Jeremy Long
c232a4fbad updated and linked documentation
Former-commit-id: 175e477cc1d6bf395a2b83a96a56174b8c7a67cb
2015-05-05 05:38:28 -04:00
Jeremy Long
0c5dfdbe24 added more documentation
Former-commit-id: 1f3ef3a136bf05da797236b898371b4f7edb56a4
2015-05-04 06:21:46 -04:00
Jeremy Long
c0f9a382b3 minor fix to sorting
Former-commit-id: de65b06be56d1d6ed3d6913819227b7f49f916d5
2015-05-03 07:54:15 -04:00
Jeremy Long
8ca32fcace patched issue #219
Former-commit-id: bc925ade007ee8736c65fd039f26a26812c0a5b4
2015-05-03 07:42:32 -04:00
Jeremy Long
0461a9fc89 moved string interpolation to Model
Former-commit-id: 111849899d090f7ca5433fd6c8688e1ba7b80cda
2015-05-03 07:22:37 -04:00
Jeremy Long
2b600290ae added tests for Model
Former-commit-id: c02ad169f661616b9ab51779bb0fad6642cf30b7
2015-05-03 07:21:41 -04:00
Jeremy Long
56fd3f2566 moved interpolate string test to ModelTest
Former-commit-id: 399a9f462da994e9687345bca2f510c2bd393921
2015-05-03 07:21:15 -04:00
Jeremy Long
142e06e752 Removed code duplication by using the JarAnalyzer's setPomEvidence
Former-commit-id: fea72403f300fe9d3ca095d94e7368a2426182c1
2015-05-03 07:20:44 -04:00
Jeremy Long
cbf2a047be moved string interpolation from JarAnalyzer to Model
Former-commit-id: dcc442ef1d938ccd8db82fc20f10b3c1aef0818b
2015-05-03 07:19:31 -04:00
Jeremy Long
1880e22d22 added equals, hashcode, and tostring
Former-commit-id: d29f3d164d55448bf8a38ef73f2071f44b67a865
2015-05-03 07:18:53 -04:00
Jeremy Long
963b1eae1c fixed unit test
Former-commit-id: d4560b518805dcdf20d17f92c7b214dad2fa9676
2015-05-02 20:53:35 -04:00
Jeremy Long
d173573e6c minor format/comment updates
Former-commit-id: 40f4da7591189b7f3b31a51120df75c709f18f04
2015-05-02 20:52:57 -04:00
Jeremy Long
b6c0426c1c refactored initialization of the analyzer
Former-commit-id: c9e32fbd039c87eafc25bf0bf62dad23c6a7279a
2015-05-02 07:31:05 -04:00
Jeremy Long
4f18e9ee7f auto-format changed indentations
Former-commit-id: 1ef56dd84a5167644c2767cefdee54d555175c55
2015-05-02 07:30:15 -04:00
Jeremy Long
e227b90370 add table sorting per issue #222
Former-commit-id: 74e47bf4c0d109e3e3e0372f5b13804025196fc1
2015-05-01 05:36:38 -04:00
Jeremy Long
360b112bd2 added Node Security Project
Former-commit-id: ddf86a1e16684666c3dc62c57ebeec68fe471dec
2015-04-29 16:12:56 -04:00
Jeremy Long
ff7027439d initial version of Python Analyzer documentation
Former-commit-id: acf1de698829521f47299b12e6f44b30675a3bec
2015-04-29 16:12:30 -04:00
Jeremy Long
a5ed91611a minor update to documentation
Former-commit-id: 8ded385a196c8c4e120b2f33646954310d8903bf
2015-04-29 16:12:03 -04:00
Jeremy Long
168b1c3684 minor update to documentation
Former-commit-id: b41917cd2cd2dbb1c3099f32bb3cb453ed6b9157
2015-04-29 16:11:25 -04:00
Jeremy Long
7e1141ff16 Merge pull request #217 from dwvisser/python-github-pr
Add Analyzers for Python Distribution Files and Packages

Former-commit-id: 972a63525744bbbd510b4ae2d92028dc3079787a
2015-04-26 08:14:03 -04:00
Jeremy Long
168d55c54c removed un-needed plugin
Former-commit-id: 406dd00f2803302e68f16d3f52503845c581a3f1
2015-04-23 06:18:27 -04:00
Jeremy Long
d5ed2bc765 updated site structure and data
Former-commit-id: 9745b59268f55930b3fdff9c24ad219715cb714a
2015-04-22 20:21:31 -04:00
Jeremy Long
940a4613ee updated list
Former-commit-id: 02501953376253591f9af5ee8372af51a6357b90
2015-04-22 20:20:57 -04:00
Dale Visser
4f6d96e16b Added class, mozilla, sendfile and yacc to suppression, since all are *not* Python-based.
Former-commit-id: d4467d0b1ca70134a61c7f039180ec6dc115de6b
2015-04-21 16:53:14 -04:00
Dale Visser
707d9925a8 Added file, gnupg, mongodb, openssl and sendmail to suppression, since all are *not* Python-based.
Former-commit-id: a3bb880e64a207d48e9efdbd8520aa37f9886c26
2015-04-21 16:08:44 -04:00
Dale Visser
657340c912 Suppression of site-packages with vendor = python_software_foundation.
Former-commit-id: 2473db879a0edfac46618cde9d474a9ebd1be2dc
2015-04-20 16:17:15 -04:00
Jeremy Long
3e220704a1 updated documentation
Former-commit-id: 8445473727eb9d6b0122fa640a107ebeef8f5001
2015-04-19 08:15:04 -04:00
Jeremy Long
4a2309a3f8 updated documentation
Former-commit-id: a41eadec0c691ce907b64a688a60325dd61f9ae7
2015-04-19 08:14:55 -04:00
Jeremy Long
09122be7be externalized sql statements as part of issue #216
Former-commit-id: ea18ad69c2e7b6cc9d276fc30333d2fd16926858
2015-04-16 06:08:33 -04:00
Jeremy Long
e26ec47ad7 externalized sql statements as part of issue #216
Former-commit-id: 3af237a7f227f741fd4a948de5281a978ce59fec
2015-04-15 06:26:36 -04:00
Dale Visser
05ae73eea2 Suppress all mappings to python:python CPEs coming from site-packages or dist-packages.
Added command-line options to disable Python scanning.


Former-commit-id: cf8f1188f77316e7974a02d4dabf156462b9e1d2
2015-04-14 10:39:22 -04:00
Dale Visser
511d2b9457 Added PythonPackageAnalyzer, for directly analyzing Python library, a.k.a.,
package, source code.


Former-commit-id: 3154ea4ecddd794cb3e7f3686972fd7a6cc2177c
2015-04-14 10:37:38 -04:00
Dale Visser
bf96c24ec3 Added capability to scan Python egg distribution format (.egg and .zip).
Changed copyright notices to IDA, and added as possible copyyright holder in
checkstyle-header file, and some whitespace fixes.


Former-commit-id: ac4288dff7c3c40e64dc733791c80035f73cc602
2015-04-14 10:36:28 -04:00
Dale Visser
e328ec990c Added capability to scan extracted egg and wheel metadata in the local Python
environment.


Former-commit-id: b0259d38134bf18b1eb72db9951dbe2d04ba8fb9
2015-04-14 10:32:04 -04:00
Dale Visser
a5dee0cb27 Added PythonDistributionAnalyzer, including unit tests with test data, with
capability to analyze the Python wheel distribution format. Using
javax.mail.internet.InternetHeaders to parse metadata files.


Former-commit-id: 478ab6be7b0f30f7991144039e33a6f69dd261ed
2015-04-14 10:30:36 -04:00
Jeremy Long
7fb5d5bde5 resolved issue #213
Former-commit-id: e50ac440ea63132f387c28fc2f8e0f3ff81d9896
2015-04-14 07:03:07 -04:00
Jeremy Long
5a329b4a6d version 1.2.11-SNAPSHOT
Former-commit-id: c0aa23ec9d12d6cb175aa43356f492dae78d7c3a
2015-04-14 07:02:41 -04:00
Jeremy Long
500f6c5b6f version 1.2.10
Former-commit-id: 0da4b8daeb214ee8b1ee3410cde0e4842f9c8003
2015-04-13 17:33:43 -04:00
Jeremy Long
29f76ba62a updated to resolve issue #210
Former-commit-id: cc5f3b351cee90af187712b328ab35d599ccbba6
2015-04-07 08:58:40 -04:00
Jeremy Long
70e0c84a20 updated pom parsing to resolve issue #210
Former-commit-id: e1092139cc27a01fba8ecfa37aa3904ee96154e6
2015-04-07 08:56:45 -04:00
Jeremy Long
3dd95180e0 initial test of pom utils
Former-commit-id: f9515f9647fbb134a97ae944189167a020858048
2015-04-07 08:55:43 -04:00
Jeremy Long
dcd8fc0320 added pojo class to hold data from pom.xml
Former-commit-id: cf66a8d5a6fe180b7253813af1ea7ff20695957f
2015-04-07 06:59:58 -04:00
Jeremy Long
bcd9fb0be9 updated to correctly use utility class PomUtils
Former-commit-id: 4c8cb205df42785aa71fa5f0621a52946000c200
2015-04-07 06:58:58 -04:00
Jeremy Long
a088d20612 replaced jaxb with sax parser
Former-commit-id: 68b01f1943cae8778cb9dd257f84f1c5321aadf4
2015-04-07 06:58:00 -04:00
Jeremy Long
29fb347bbb replaced jaxb with sax parser
Former-commit-id: a1c0325c9d68675931947a5beade6f0ee65814ba
2015-04-07 06:57:13 -04:00
Jeremy Long
b2a436b3bc replaced jaxb with sax parser
Former-commit-id: 3a68df99ece4b86e13b266650ad4ab496a864704
2015-04-07 06:57:09 -04:00
Jeremy Long
d288912df1 replaced jaxb with sax parser
Former-commit-id: e414ec7919c8709a9d099f7dbcbf349161206c22
2015-04-07 06:57:09 -04:00
Jeremy Long
7bde6baaac replaced jaxb with sax parser
Former-commit-id: a52e0ca02d5bb11aead699d62a38e50b1dd6670b
2015-04-07 06:57:08 -04:00
Jeremy Long
26ca6d9b77 replaced jaxb with sax parser
Former-commit-id: ad48ae623b717e9ffb4b1918ba039805931e9998
2015-04-07 06:57:08 -04:00
Jeremy Long
961626a136 removed jaxb
Former-commit-id: 0f7887da58f135eed0e669209e33409000d1807d
2015-04-07 06:57:07 -04:00
Jeremy Long
641a311537 removed jaxb
Former-commit-id: 2a307afe8d3381572133af1ae9d0cd489e3ae934
2015-04-07 06:57:07 -04:00
Jeremy Long
995ba02357 removed jaxb
Former-commit-id: 413724fb7e584e246764add0979e20e260b14343
2015-04-07 06:57:07 -04:00
Jeremy Long
fb3e6e4208 removed jaxb
Former-commit-id: 881feef75155fc031df63f187d01ad8e150075e8
2015-04-07 06:57:06 -04:00
Jeremy Long
e5363f7c8f removed jaxb
Former-commit-id: eb799f07859ef7476d71e1265a162fd32907c637
2015-04-07 06:57:06 -04:00
Jeremy Long
d1a128b897 removed jaxb
Former-commit-id: f477e060a011528b7a5c8bfd50382f6684b4e607
2015-04-07 06:57:06 -04:00
Jeremy Long
2b5fb4d75a removed jaxb
Former-commit-id: 551ef5c2b41551e08252a1e14574190a840b3055
2015-04-07 06:57:06 -04:00
Jeremy Long
6439ddde23 removed jaxb
Former-commit-id: 0a2fee66a643fd6d5ac6a1be279a59dc401a362a
2015-04-07 06:57:05 -04:00
Jeremy Long
f2994ed4ff removed jaxb
Former-commit-id: c6113b6436bc4789c68482358355f732d7f9f465
2015-04-07 06:57:05 -04:00
Jeremy Long
019bf67f93 removed jaxb
Former-commit-id: 4cf9a4a3d4f05efb2fa49f63339d144a3888e03d
2015-04-07 06:57:05 -04:00
Jeremy Long
78c1dcd0d0 removed jaxb
Former-commit-id: 76e89bd3b8b91b8a740427d56b5db36c1a990860
2015-04-07 06:57:04 -04:00
Jeremy Long
e07b30df85 removed jaxb
Former-commit-id: 5b4dd75c3b11a5b342a59ff33da7b55d4d18b8cd
2015-04-07 06:57:04 -04:00
Jeremy Long
96cd517c36 removed jaxb
Former-commit-id: 1e93d173b0fb6e9252c755ba792564237710c9be
2015-04-07 06:57:04 -04:00
Jeremy Long
2cb8e00c99 removed jaxb
Former-commit-id: 3e74c70e0423bd455f7043bbfd5725295d3a5600
2015-04-07 06:57:03 -04:00
Jeremy Long
92f093009e removed jaxb
Former-commit-id: aca14c70fed2421dc444eec2256e290154dc9ff6
2015-04-07 06:57:03 -04:00
Jeremy Long
27256a1854 removed jaxb
Former-commit-id: e5eaaa4d41b7d4c105979151b39e4627c268229a
2015-04-07 06:57:03 -04:00
Jeremy Long
ba782ca56f removed jaxb
Former-commit-id: e9ba1c00a0d2cc00584d1a16a1b2e383d5b5bcb7
2015-04-07 06:57:02 -04:00
Jeremy Long
3f3e33a366 removed jaxb
Former-commit-id: beb3d86fc7a6cf9668c89985e9799d63551b95f9
2015-04-07 06:57:02 -04:00
Jeremy Long
343fd75477 removed jaxb
Former-commit-id: 9f33ebbd388afe6e022f909a20ca463ca6958f5a
2015-04-07 06:57:02 -04:00
Jeremy Long
7bcfb6ff49 removed jaxb
Former-commit-id: ab8aceb365aa303ff4dc99b4eedc89bfd7dce3fd
2015-04-07 06:57:01 -04:00
Jeremy Long
78ec08792f removed jaxb
Former-commit-id: 4c0685feb62da31bc0deb6f5c310df6eb20e21df
2015-04-07 06:57:01 -04:00
Jeremy Long
461b41f300 removed jaxb
Former-commit-id: a854bb2d722766fcc336563c12b0fea6a7d8d031
2015-04-07 06:57:00 -04:00
Jeremy Long
5b246424fb removed jaxb
Former-commit-id: 417c552c2311709c35c82999f773fab484b6bd80
2015-04-07 06:57:00 -04:00
Jeremy Long
6af4b4cd5e removed jaxb
Former-commit-id: 621b2070136bad0374dd37ec12e788a789498d87
2015-04-07 06:57:00 -04:00
Jeremy Long
6d348eb5a7 removed jaxb
Former-commit-id: 4f0eeb2569e46b55821492771776f5573bb0def8
2015-04-07 06:57:00 -04:00
Jeremy Long
b26f6b697a removed jaxb
Former-commit-id: 376893da54ccb8e3d27aeb03734b6814dc846500
2015-04-07 06:56:59 -04:00
Jeremy Long
554510bb78 removed jaxb
Former-commit-id: 2e945592f021a0c3508cf153ad84bcb2c0102de7
2015-04-07 06:56:59 -04:00
Jeremy Long
3f2e5b7c69 removed jaxb
Former-commit-id: 975161363155f5b297a18bce8765e2479c3a6177
2015-04-07 06:56:59 -04:00
Jeremy Long
3c4989f5ca removed jaxb
Former-commit-id: 9b590ecce2ad7a2c960aaf5c6d3b9825c2059045
2015-04-07 06:56:58 -04:00
Jeremy Long
d33c649be6 removed jaxb
Former-commit-id: 0db8ef041849af552d6b066045bbf6ff2d96f686
2015-04-07 06:56:58 -04:00
Jeremy Long
c55954e5e8 removed jaxb
Former-commit-id: e6c17d8f70b15886dc32b635e0b7cd2e5fdb427a
2015-04-07 06:56:58 -04:00
Jeremy Long
678311e65b removed jaxb
Former-commit-id: c4ab6153cbaedd5b06b6c725145f53266b8e99c2
2015-04-07 06:56:57 -04:00
Jeremy Long
ab1d3075e8 removed jaxb
Former-commit-id: 88ba3f6e18e6276fb60e7d3c9eb7ee8891cade8e
2015-04-07 06:56:57 -04:00
Jeremy Long
0a6f8b7ac1 removed jaxb
Former-commit-id: 1452d82d2388610b3becb43d6fd50f9e7b4231f4
2015-04-07 06:56:57 -04:00
Jeremy Long
422a1f78fc removed jaxb
Former-commit-id: 41fa4ae4098fcde985a888141fc6f3229c3ca680
2015-04-07 06:56:56 -04:00
Jeremy Long
f21af8bd1e removed jaxb
Former-commit-id: d33ce17573b849f6b7426d813b1a6e882122c399
2015-04-07 06:56:56 -04:00
Jeremy Long
924278e387 removed jaxb
Former-commit-id: 20d7bfb8bd4c9a097da746de0d087add935f51ff
2015-04-07 06:56:56 -04:00
Jeremy Long
c6ea4466fb removed jaxb
Former-commit-id: 104c5d60aecfd53603e8e59edc58335949334319
2015-04-07 06:56:55 -04:00
Jeremy Long
318cc7a8fb removed jaxb
Former-commit-id: f4bc144353738f9742b6e746005907577aa5def9
2015-04-07 06:56:55 -04:00
Jeremy Long
9554a30286 added test dependency
Former-commit-id: 424bb6900a580fd5fa1e58979e28329273a17199
2015-04-06 19:59:56 -04:00
Jeremy Long
5336da52d9 added Hugo Costa as a contributor
Former-commit-id: c7b9bf343a5087d1e6b384a6e38e38ba6900e900
2015-04-06 19:59:31 -04:00
Jeremy Long
bd0c2e4ee4 added test dependency to test issue #210
Former-commit-id: cdb4911037e3e74cb3e56f488c3c496595f08187
2015-04-05 16:41:56 -04:00
Jeremy Long
64aad66adc changed config on javadoc so it does not fail with jdk8
Former-commit-id: 6300a8fd8bf2c6314f5a963fb10fd85cf3e59ac8
2015-04-05 12:54:36 -04:00
Jeremy Long
587bf131db updated sample report
Former-commit-id: b04eedcc48cd6461585742dd2e2b9b9661d6875b
2015-04-05 11:03:40 -04:00
Jeremy Long
fc96c727ec added logo
Former-commit-id: 28f42f846833db2ae8fe5f5d7504678067db836c
2015-04-05 10:46:27 -04:00
Jeremy Long
d17bd5bd9e added logo
Former-commit-id: 9a831f9ba0d3af212e681dd8ac6a3cecdf2cf851
2015-04-05 10:45:19 -04:00
Jeremy Long
b22a935a6c updated package info
Former-commit-id: 4050b01bfc1c92862fc71f23239c1d5202a5126e
2015-04-05 10:44:24 -04:00
Jeremy Long
a7c1d594dc updated package-info
Former-commit-id: 5d02d7dacbc0e20efffdaecc5a1630d102114fa5
2015-04-05 09:31:34 -04:00
Jeremy Long
dd20a9c7cc updated package-info
Former-commit-id: cd69861ebd1c3ef2e8a679b87d08acd43b49e7bd
2015-04-05 09:31:34 -04:00
Jeremy Long
e0994e0e54 updated package-info
Former-commit-id: 385c57cab581f700ec110dc02245c4b37976148d
2015-04-05 09:31:34 -04:00
Jeremy Long
0f8ce09646 updated package-info
Former-commit-id: d93c76a844ab6c9177856ab74b27f8d7e9d547b1
2015-04-05 09:31:33 -04:00
Jeremy Long
871e27d19f updated package-info
Former-commit-id: 3375a31fca8abb2d7553e0dfb39c96cc2bb8a44b
2015-04-05 09:31:33 -04:00
Jeremy Long
c429df3280 updated package-info
Former-commit-id: 864920215f4b1620550c5bba2822d596f885d0be
2015-04-05 09:31:33 -04:00
Jeremy Long
13f355c385 updated package-info
Former-commit-id: ee67619c2480dc0de800055da7d00c5312146ee6
2015-04-05 09:31:32 -04:00
Jeremy Long
d33ddefb2d updated package-info
Former-commit-id: abee416d7c2690d66f255d69efc34855a82064db
2015-04-05 09:31:32 -04:00
Jeremy Long
75b3f4b3c8 updated package-info
Former-commit-id: 191f7b8866bdc2e5c9ea9b5aac2c4ab1a23a5881
2015-04-05 09:31:32 -04:00
Jeremy Long
03ce1d2ea8 updated package-info
Former-commit-id: a38dc7f72dda348947817f35ecaa0eadc39ac99c
2015-04-05 09:31:31 -04:00
Jeremy Long
08eae2b09c updated package-info
Former-commit-id: 206b5f173ad7f2f87dc5a5ff8232a4099f07ef29
2015-04-05 09:31:31 -04:00
Jeremy Long
c94f9e2d2b updated package-info
Former-commit-id: 44e0d6bf55997292b7570d0cb8ae61c41ee5c001
2015-04-05 09:31:31 -04:00
Jeremy Long
520370688c updated package-info
Former-commit-id: c577b32102ac872b713df1c88b2af3424f00565c
2015-04-05 09:31:31 -04:00
Jeremy Long
725949db2f updated package-info
Former-commit-id: 2af313130c4d4a180896eb465685413385ddbdf2
2015-04-05 09:31:30 -04:00
Jeremy Long
5d647155b6 updated package-info
Former-commit-id: 9ca5a2b3bd7e86495d73c97bde84e731c22e1e61
2015-04-05 09:31:30 -04:00
Jeremy Long
c152bd0517 updated package-info
Former-commit-id: cda9f52d0d8f46523bc65f0b84ba9bc62e16b065
2015-04-05 09:31:30 -04:00
Jeremy Long
f35146d93d updated package-info
Former-commit-id: 85603781da2c18a1275e13385080abcf662a331b
2015-04-05 09:31:29 -04:00
Jeremy Long
e8e58555d0 updated package-info
Former-commit-id: 7e59b9f0cd75ce84b6d230856458d0a44b167d0d
2015-04-05 09:31:29 -04:00
Jeremy Long
7190dcc04e updated package-info
Former-commit-id: c459f7479fc476f19ee1ba52dc162a9ead751fc8
2015-04-05 09:31:29 -04:00
Jeremy Long
b623e3b3c8 updated package-info
Former-commit-id: 5f1e580af20320d75e7af5a00d9f6eababfe15a2
2015-04-05 09:31:28 -04:00
Jeremy Long
d78e82bd56 updated package-info
Former-commit-id: 232d2259875911ee517ed71dd741801f285a7ad4
2015-04-05 09:31:28 -04:00
Jeremy Long
ff478253e3 updated package-info
Former-commit-id: fe210fb0ea9a25612dc869e6086f4d63c29e282b
2015-04-05 09:31:28 -04:00
Jeremy Long
85c3368cda updated package-info
Former-commit-id: e4991a34fc6959d2d7352722a8fdc8d9d9249857
2015-04-05 09:31:28 -04:00
Jeremy Long
a4095cec8d updated package-info
Former-commit-id: be1142cf59d4755dc703d400d449574ca7775087
2015-04-05 09:31:27 -04:00
Jeremy Long
c840ce249f updated javadoc author
Former-commit-id: df65c5c6389d9fc4c884c4ecab728ab825d3ccea
2015-04-05 09:22:17 -04:00
Jeremy Long
b70812fc3d updated javadoc author
Former-commit-id: adfd776cd02132c2da6b3d3b77b13db0f8675551
2015-04-05 09:22:16 -04:00
Jeremy Long
3ccf06321d updated javadoc author
Former-commit-id: 0c72c9263cc012d64ff46969fa7f77a8b730cf4a
2015-04-05 09:22:16 -04:00
Jeremy Long
1d5dd5ea11 updated javadoc author
Former-commit-id: d72d2947df15f40a6febf9df7d2b6d4da1575c4c
2015-04-05 09:22:16 -04:00
Jeremy Long
0cadd88769 updated javadoc author
Former-commit-id: a0dc3aea76c887631da951f9467af28f1c8d4d89
2015-04-05 09:22:15 -04:00
Jeremy Long
75499a3321 updated javadoc author
Former-commit-id: 958d2b0792543e10fd902b6f24177820c1a45de1
2015-04-05 09:22:15 -04:00
Jeremy Long
5096027523 updated javadoc author
Former-commit-id: 8344848ff8c6c3255cf1be2f9699366d4b94cfe0
2015-04-05 09:22:15 -04:00
Jeremy Long
5c8c07794d updated javadoc author
Former-commit-id: 4b602ba266e8e539cb5f0341f4a3207c05c13850
2015-04-05 09:22:14 -04:00
Jeremy Long
18a72bbb59 updated javadoc author
Former-commit-id: 789d787c659b501f3ee4c82242c4c8e9eead9b49
2015-04-05 09:22:14 -04:00
Jeremy Long
7b3c4475da updated javadoc author
Former-commit-id: d705f8956b50fc3afd0526880b42d9c9309349e3
2015-04-05 09:22:14 -04:00
Jeremy Long
419c446f01 updated javadoc author
Former-commit-id: f1de29baff37ed811a85ef8cda22bc2d4eabb0c7
2015-04-05 09:22:14 -04:00
Jeremy Long
735c16cc11 updated javadoc author
Former-commit-id: ce3dc0b7869c50bcf8b3bd8f59adb62a369b1bf4
2015-04-05 09:22:13 -04:00
Jeremy Long
ed41abcf9d updated javadoc author
Former-commit-id: 7b01912bb9e86f7545c6309637cecc1104fedef8
2015-04-05 09:22:13 -04:00
Jeremy Long
b750a8c802 updated javadoc author
Former-commit-id: 20ad9f99f500c5488744accbdc5280d32cb7cb1e
2015-04-05 09:22:13 -04:00
Jeremy Long
1ee75dd8cb updated javadoc author
Former-commit-id: e2bcedcb3763492a4a21054cdfb7a23214c5dd96
2015-04-05 09:22:12 -04:00
Jeremy Long
396efad518 updated javadoc author
Former-commit-id: 5b12bb57ebafec5490482df506364df38b4d2820
2015-04-05 09:22:12 -04:00
Jeremy Long
8f33be262a updated javadoc author
Former-commit-id: 9b172db31e69c1e0ecfa47c8b3c3056f0f660917
2015-04-05 09:22:12 -04:00
Jeremy Long
9daa111f9c updated javadoc author
Former-commit-id: bb9eaba78f1575d83249b36300ea62132430b548
2015-04-05 09:22:11 -04:00
Jeremy Long
889bf22840 updated javadoc author
Former-commit-id: e036917954ab04da8901c4147884c33c47784802
2015-04-05 09:22:11 -04:00
Jeremy Long
f46e96c7de updated javadoc author
Former-commit-id: 1944424e30f21c49bceb1e9ac7f334c1e51cc442
2015-04-05 09:22:11 -04:00
Jeremy Long
9be6dc2935 updated javadoc author
Former-commit-id: 71af3fb7cfbb1c805b99ddc74cab774913ebb4b5
2015-04-05 09:22:10 -04:00
Jeremy Long
6188f6d74a updated javadoc author
Former-commit-id: 44997fec64aff42545e9e0a5c5ec4ebbd9cdb2ca
2015-04-05 09:22:10 -04:00
Jeremy Long
8837fab9fa updated javadoc author
Former-commit-id: 2234a090e2446137023f9df091b8a85d9a745487
2015-04-05 09:22:09 -04:00
Jeremy Long
316339011b updated javadoc author
Former-commit-id: d7e75e84d406203c6d2ca820a759972d403bd8e9
2015-04-05 09:22:09 -04:00
Jeremy Long
fe7121e057 updated javadoc author
Former-commit-id: 9e608bda0c4159337d6de0a727ec014404c027ee
2015-04-05 09:22:09 -04:00
Jeremy Long
bc09bfd3ba updated javadoc author
Former-commit-id: a83c5adc7e113a30fc5c18a0f7b71c7efaec0455
2015-04-05 09:22:08 -04:00
Jeremy Long
26f19cead1 updated javadoc author
Former-commit-id: 424fb69a163625765e263573307da1aca2f53471
2015-04-05 09:22:08 -04:00
Jeremy Long
777b35f412 updated javadoc author
Former-commit-id: 593115789ba670e60ce966a52c5d6b04393530e3
2015-04-05 09:22:08 -04:00
Jeremy Long
9e94ffb422 updated javadoc author
Former-commit-id: 66012a54190236c40c679a43749a1525fb981980
2015-04-05 09:22:07 -04:00
Jeremy Long
b6a38bf4d1 updated javadoc author
Former-commit-id: 29b815170175af50e9e88fbb35f7e690f7c0dd02
2015-04-05 09:22:07 -04:00
Jeremy Long
92d12ec68e updated javadoc author
Former-commit-id: 47f25243b5b1bb13bae43f6e3949c03c9c270fef
2015-04-05 09:22:07 -04:00
Jeremy Long
93dd5e4b31 updated javadoc author
Former-commit-id: af11a440ee1c2938cad612d8d367d0b9a6068d17
2015-04-05 09:22:07 -04:00
Jeremy Long
79e325e2ab updated javadoc author
Former-commit-id: a9b00911d1d2e58ad26a1843f08100676047bf24
2015-04-05 09:22:06 -04:00
Jeremy Long
0e095018a4 updated javadoc author
Former-commit-id: f48ca4839aabc0a524fc650b55813e4a94ed2e84
2015-04-05 09:22:06 -04:00
Jeremy Long
7040071ab9 updated javadoc author
Former-commit-id: facf33488cda4af6cf5bad4e7cb74fb36768734a
2015-04-05 09:22:05 -04:00
Jeremy Long
e157350d03 updated javadoc author
Former-commit-id: 86395763274c8880e77bab58504fbef84ebc835f
2015-04-05 09:22:05 -04:00
Jeremy Long
28f6ef5eec updated javadoc author
Former-commit-id: eef141b45e5214cf443d82b11cbbc72edbc9b1e6
2015-04-05 09:22:05 -04:00
Jeremy Long
15bcee3d10 updated javadoc author
Former-commit-id: 2e2d5260afc76c52de66d14cf79db0a9e5254dfb
2015-04-05 09:22:04 -04:00
Jeremy Long
67dbf70f5b updated javadoc author
Former-commit-id: 37a7181707149b1670e10b692cab1c105d3f7b7f
2015-04-05 09:22:04 -04:00
Jeremy Long
c75b99837f updated javadoc author
Former-commit-id: 627b185b0dcc2329c3584db140eb48b7d19ddbf2
2015-04-05 09:22:03 -04:00
Jeremy Long
cbc951be62 updated javadoc author
Former-commit-id: 0f27e547cd080b87e10049385e15a190c83bf1d3
2015-04-05 09:22:03 -04:00
Jeremy Long
f5b38852a7 updated javadoc author
Former-commit-id: e4ba8b60bbabf5357671d262f7e51d375f035713
2015-04-05 09:22:03 -04:00
Jeremy Long
45b5fd3762 updated javadoc author
Former-commit-id: 03bc2f6657bcee87080f63a39b482fac029c691c
2015-04-05 09:22:02 -04:00
Jeremy Long
04c14f3a27 updated javadoc author
Former-commit-id: bece55f77feb1cbd3a44f34e925ef05df207d284
2015-04-05 09:22:02 -04:00
Jeremy Long
a55d89cc93 updated javadoc author
Former-commit-id: ba2f0672fe8bc4c3a5e33c9ec63d4a832315a07d
2015-04-05 09:22:02 -04:00
Jeremy Long
888801ab0c updated javadoc author
Former-commit-id: d1a8192239e3ec78caf9d25e9cb1ce8aaca6ae9c
2015-04-05 09:22:01 -04:00
Jeremy Long
731528ef6e updated javadoc author
Former-commit-id: 3e8a18f4a43c8a19a1c0367a55b41c8512209bdf
2015-04-05 09:22:01 -04:00
Jeremy Long
d7fbd0df47 updated javadoc author
Former-commit-id: 1ced9da6fc9dc722e1a31de5c3395bd6b285d532
2015-04-05 09:22:01 -04:00
Jeremy Long
6f95e6d499 updated javadoc author
Former-commit-id: b46f4707e56e95e7359e3033a926a00a39c20f38
2015-04-05 09:22:00 -04:00
Jeremy Long
79e6a13b29 updated javadoc author
Former-commit-id: b12db8dfae7a5b34ae136957ff24f773df763682
2015-04-05 09:22:00 -04:00
Jeremy Long
b9a53775b6 updated javadoc author
Former-commit-id: 7cd4642264106e5772b942f97bb44e4dc938ad7d
2015-04-05 09:22:00 -04:00
Jeremy Long
1b15603227 updated javadoc author
Former-commit-id: 5614c10fe48b95e019d1c2ab77e3e1ba9bdacfb0
2015-04-05 09:21:59 -04:00
Jeremy Long
a7ffeb7016 updated javadoc author
Former-commit-id: e63cbab39d36b0136a819861d761f8cddc2f45c8
2015-04-05 09:21:59 -04:00
Jeremy Long
13b1c0fe0c updated javadoc author
Former-commit-id: 65462fd6b12c13b63108eb191801f2a0dc1df222
2015-04-05 09:21:58 -04:00
Jeremy Long
1d259c510f updated javadoc author
Former-commit-id: b939fe30eee6c1422c7c4efcf5c2385402d5c9b1
2015-04-05 09:21:58 -04:00
Jeremy Long
56783bbf4d updated javadoc author
Former-commit-id: c2fcf6e846e73e7d0bb1b6e205e755c0dee053e1
2015-04-05 09:21:58 -04:00
Jeremy Long
e63c296b16 updated javadoc author
Former-commit-id: 57b85879b008a9915e780791a97bee3a7ee4c87b
2015-04-05 09:21:58 -04:00
Jeremy Long
57450a65cf updated javadoc author
Former-commit-id: c23bc2250251ad0872676843a42fad0ed6c6b04a
2015-04-05 09:21:57 -04:00
Jeremy Long
716b52ef90 updated javadoc author
Former-commit-id: 2392c4a656c8919ef5ac00c3f3ba49681e758874
2015-04-05 09:21:57 -04:00
Jeremy Long
6ab8552f44 updated javadoc author
Former-commit-id: 5bebd493ea9a6e1d88f611d73be5c5889d4c2353
2015-04-05 09:21:56 -04:00
Jeremy Long
9880483690 updated javadoc author
Former-commit-id: 65596d2877aa7ffd991227f5853a2582ae28da5e
2015-04-05 09:21:56 -04:00
Jeremy Long
7b9b459b74 updated javadoc author
Former-commit-id: e2cb159cab7da584f8449a202126a97fcfbf8118
2015-04-05 09:21:56 -04:00
Jeremy Long
0723606120 updated javadoc author
Former-commit-id: bc82c40243b3ba06eb699cb0e51da88633edd8fa
2015-04-05 09:21:55 -04:00
Jeremy Long
4261e9eb29 updated javadoc author
Former-commit-id: 21f0c81d58d78ad4fb2614f2229c5c4c7136802c
2015-04-05 09:21:55 -04:00
Jeremy Long
a322556c66 updated javadoc author
Former-commit-id: 1f78887b2fefcfaf5b995f0e3c0f177507fc8af3
2015-04-05 09:21:55 -04:00
Jeremy Long
b6d3efa042 updated javadoc author
Former-commit-id: 9b059f0264a83076651ff7f2c7c777b250a32f03
2015-04-05 09:21:54 -04:00
Jeremy Long
4019a0615c updated javadoc author
Former-commit-id: 04d2b404e05a3d256f5264919434f9e42c3115fb
2015-04-05 09:21:54 -04:00
Jeremy Long
376e486c47 updated javadoc author
Former-commit-id: faae701f01ee6387b1398ac685a80ad08b331a46
2015-04-05 09:21:54 -04:00
Jeremy Long
5b7c47682b updated javadoc author
Former-commit-id: e4b0e6584872a99d9185093e4ebfb027d8e4b7ed
2015-04-05 09:21:53 -04:00
Jeremy Long
741a803ea7 updated javadoc author
Former-commit-id: 5162f0cb6c5b49148f57248c69fe8503564c668d
2015-04-05 09:21:53 -04:00
Jeremy Long
8a886f5434 updated javadoc author
Former-commit-id: ebeeadb36fbe79a541a66d5b823a07c18645b6d1
2015-04-05 09:21:52 -04:00
Jeremy Long
01514af188 updated javadoc author
Former-commit-id: f818712696e4bee22e34213314e46121829d448a
2015-04-05 09:21:52 -04:00
Jeremy Long
c5d5dccc57 updated javadoc author
Former-commit-id: 99ea41063450a2aa935647c485200197b1d30c10
2015-04-05 09:21:52 -04:00
Jeremy Long
5e58304448 updated javadoc author
Former-commit-id: a2422be3b9eb08ee7a8de380f5d062c7d93e2563
2015-04-05 09:21:51 -04:00
Jeremy Long
dd9c4bfa42 updated javadoc author
Former-commit-id: c4cabe37f0152f01ebb207d1ecf0d7121ce120a5
2015-04-05 09:21:51 -04:00
Jeremy Long
e6a559f0d1 updated javadoc author
Former-commit-id: ef4555f15cb4f4ef82ed618ca65abfe5bc9a61a9
2015-04-05 09:21:51 -04:00
Jeremy Long
f1c860f68c updated javadoc author
Former-commit-id: feb156e25fe847555b1d0b2bee20c8ac5d44572f
2015-04-05 09:21:50 -04:00
Jeremy Long
cd175816e2 updated javadoc author
Former-commit-id: 3ce50ed038fea725567ac467b3e25d06a6af2f0a
2015-04-05 09:21:50 -04:00
Jeremy Long
1d74d2e241 updated javadoc author
Former-commit-id: ebc89915ab35e8ccc329a2d9e6229ac8d47ec7f5
2015-04-05 09:21:50 -04:00
Jeremy Long
c4479a36a9 updated javadoc author
Former-commit-id: 1339c60872f7cc1e7c573a7ca3d6a68d4e00706f
2015-04-05 09:21:49 -04:00
Jeremy Long
cc2c18243e updated javadoc author
Former-commit-id: 92c8dc2bcbb8da1a41084acfa392326e32939e29
2015-04-05 09:21:49 -04:00
Jeremy Long
211d34fcef updated javadoc author
Former-commit-id: 469d1881d6d50e441204abd24c95ecda0040ea31
2015-04-05 09:21:48 -04:00
Jeremy Long
dc60c24d89 updated javadoc author
Former-commit-id: 6c7daa183556f05cdb8c89bba90e71f9737fb2ae
2015-04-05 09:21:48 -04:00
Jeremy Long
922e6437cf updated javadoc author
Former-commit-id: fe5c364466522eacbbf2cc52e32ccd6c5b1e4ba5
2015-04-05 09:21:47 -04:00
Jeremy Long
1058157827 updated javadoc author
Former-commit-id: 8cd3670afd8b5be3aea7b80040836ef54bda0725
2015-04-05 09:21:47 -04:00
Jeremy Long
33b38e686a updated javadoc author
Former-commit-id: bc280f51596877c6a59fa0b15a60b494a7081ebe
2015-04-05 09:21:47 -04:00
Jeremy Long
a6014f30dd updated javadoc author
Former-commit-id: e6db05a05dddce2cc87110f0a926280a2fbcc411
2015-04-05 09:21:46 -04:00
Jeremy Long
3fc75df55d updated javadoc author
Former-commit-id: de65aa7dc89a1befe46bdcbbabca8cb63cfbe1f4
2015-04-05 09:21:46 -04:00
Jeremy Long
2bcd9d78e8 updated javadoc author
Former-commit-id: 59253e1927d2910c882865f5a9a052b4d66e004f
2015-04-05 09:21:46 -04:00
Jeremy Long
723b9e9cea updated javadoc author
Former-commit-id: ad409cc8c07c126a119bb6b6ab21c7dde38ec656
2015-04-05 09:21:45 -04:00
Jeremy Long
efb7088cd8 updated javadoc author
Former-commit-id: a5f88426208091e934fee073c8e075d323e6a82a
2015-04-05 09:21:45 -04:00
Jeremy Long
f2131102f5 updated javadoc author
Former-commit-id: 009df028d14ef0d78ca74f63e1c9cd9984d1109f
2015-04-05 09:21:45 -04:00
Jeremy Long
eae04bb156 updated javadoc author
Former-commit-id: b8ab72134701d8f4846c104e25fde499fdedb3e9
2015-04-05 09:21:44 -04:00
Jeremy Long
11716128df updated javadoc author
Former-commit-id: 05a564adebe1121e20d3be4d961ed4b09f94742d
2015-04-05 09:21:44 -04:00
Jeremy Long
5122808189 updated javadoc author
Former-commit-id: e47179411fd0dff94f876f7db37e69584fd3786b
2015-04-05 09:21:44 -04:00
Jeremy Long
3c1905f941 updated javadoc author
Former-commit-id: b5fa72ecbcf831459fbde0d45d65006a2cd0d049
2015-04-05 09:21:43 -04:00
Jeremy Long
3348086c00 updated javadoc author
Former-commit-id: f68b96df72699fd541ac14af9a98e198729017d6
2015-04-05 09:21:43 -04:00
Jeremy Long
919efc5037 updated javadoc author
Former-commit-id: be4a6f9d5c5d1f43ddbe2324a68036e6e459d1a2
2015-04-05 09:21:42 -04:00
Jeremy Long
04ab0e09d5 updated javadoc author
Former-commit-id: c1f55752be340dac6c6fd234640d60b64a553a88
2015-04-05 09:21:42 -04:00
Jeremy Long
c8862cb927 updated javadoc author
Former-commit-id: 07943962fcaaddbb23f7c68400f7f7d868745e01
2015-04-05 09:21:42 -04:00
Jeremy Long
ac135ec2b6 updated javadoc author
Former-commit-id: cf4872f514d35b74be8abdb1ae54897b0ed8c254
2015-04-05 09:21:41 -04:00
Jeremy Long
0257000d1a updated javadoc author
Former-commit-id: a5cf1d6894c53d8635bf14a0cd1454130c451151
2015-04-05 09:21:41 -04:00
Jeremy Long
608b95e941 updated javadoc author
Former-commit-id: 022735ae188f0db1dc859581c0a6583b8c669b5f
2015-04-05 09:21:41 -04:00
Jeremy Long
e6a2c5b5b4 updated javadoc author
Former-commit-id: 13ed43813582e20381731943e1518ec6fd01f7c3
2015-04-05 09:21:40 -04:00
Jeremy Long
a546aadba1 updated javadoc author
Former-commit-id: fc7b5f76a67eaab2e78f6f385252030de63438c9
2015-04-05 09:21:40 -04:00
Jeremy Long
5934588b2c updated javadoc author
Former-commit-id: d4a4d6b17f22aa039dadd3e2c63a69432a1fc03d
2015-04-05 09:21:40 -04:00
Jeremy Long
3ad5482a30 updated javadoc author
Former-commit-id: d705171c799bfc2815f63306cc31a25ad8c3a360
2015-04-05 09:21:39 -04:00
Jeremy Long
c3902447af updated javadoc author
Former-commit-id: 2cbd83d6544a19dd4d15d5d88f2f1dff30432251
2015-04-05 09:21:39 -04:00
Jeremy Long
764aa466f4 updated javadoc author
Former-commit-id: 3bdcfe1fae3dca5c0c934c97b1c48e117255de09
2015-04-05 09:21:38 -04:00
Jeremy Long
9ffda6cd17 updated javadoc author
Former-commit-id: d13fac65cb7ed951698130523baaf241146addde
2015-04-05 09:21:38 -04:00
Jeremy Long
8281fb09fc updated javadoc author
Former-commit-id: c559dad07d948c834f7aa451475e0e52895abd26
2015-04-05 09:21:38 -04:00
Jeremy Long
b6988f96fb updated javadoc author
Former-commit-id: 3f11465c5f678401d93b0aa12ce267ca0ba3d523
2015-04-05 09:21:37 -04:00
Jeremy Long
4597c13d9a updated javadoc author
Former-commit-id: ea95eaf016057dd9316d3841f453d2c2cb7cac61
2015-04-05 09:21:37 -04:00
Jeremy Long
acf7297c8d updated javadoc author
Former-commit-id: bef2871312d17e886101fbfaf804a0910e9eaac9
2015-04-05 09:21:37 -04:00
Jeremy Long
bbdc8298d9 updated javadoc author
Former-commit-id: 4e217219079d10b0a7a33444eccb5a218784290d
2015-04-05 09:21:36 -04:00
Jeremy Long
4d9f102033 updated javadoc author
Former-commit-id: ab1f753c303338c0be531e46fb2338fc8e429403
2015-04-05 09:21:36 -04:00
Jeremy Long
0056e1052c updated javadoc author
Former-commit-id: 78a6833acf9011146dcb529bdf14f6d96fbe9741
2015-04-05 09:21:36 -04:00
Jeremy Long
7b729e078b updated javadoc author
Former-commit-id: dfeb34c3ff80b4a18c01284edd0e547165227e64
2015-04-05 09:21:35 -04:00
Jeremy Long
6a0623f1e7 updated javadoc author
Former-commit-id: 868f59d066f98252f72456a942b4dc5e3c20ea03
2015-04-05 09:21:35 -04:00
Jeremy Long
542c871152 updated javadoc author
Former-commit-id: 1ce5048775cad33c5c2e7c1ad2ba09539d2ce8e8
2015-04-05 09:21:35 -04:00
Jeremy Long
77189eeeb1 updated javadoc author
Former-commit-id: e6fe0c911571602a216b7092c743de117ec28feb
2015-04-05 09:21:34 -04:00
Jeremy Long
340172ab56 updated javadoc author
Former-commit-id: 557d8fb6c19d3e6c2bebd500c500533d2dcfa7cd
2015-04-05 09:21:34 -04:00
Jeremy Long
afcfed1c67 updated javadoc author
Former-commit-id: cfbefad580b452ed98b8b336338946eb6a7ca506
2015-04-05 09:21:33 -04:00
Jeremy Long
59ce3bb64d updated javadoc author
Former-commit-id: 9f8d8178aa290507894b8ea64cc6ca18ab72c6f6
2015-04-05 09:21:33 -04:00
Jeremy Long
81c5aa73d2 updated javadoc author
Former-commit-id: d255d240647ef205febf61f9373da728c4b58c6d
2015-04-05 09:21:33 -04:00
Jeremy Long
12ff05208c updated javadoc author
Former-commit-id: 1a683cf8ef016bab26be3653adc957ae5edd7cc3
2015-04-05 09:21:32 -04:00
Jeremy Long
dc0ef70699 updated javadoc author
Former-commit-id: ff5f1f9fe7357a87602364537f93d9c5fddf1574
2015-04-05 09:21:32 -04:00
Jeremy Long
6ce735dcc7 updated javadoc author
Former-commit-id: 1bbedeb9c9ec23d07822f89234318289794c1fd4
2015-04-05 09:21:32 -04:00
Jeremy Long
faf3298f7a updated javadoc author
Former-commit-id: 13a111fb531dc07d909febaffa7eb86e63f04db5
2015-04-05 09:21:31 -04:00
Jeremy Long
4f1b6b4bf1 updated javadoc author
Former-commit-id: 9880049e15071f42fd2be262e34a8536e574b43d
2015-04-05 09:21:31 -04:00
Jeremy Long
99702fdb67 updated javadoc author
Former-commit-id: 1e4a45aaaadcd37891fcd51cb258cbcb94083696
2015-04-05 09:21:30 -04:00
Jeremy Long
7bce7691e4 updated javadoc author
Former-commit-id: b4904e00c4cf2077ff02386dd75aced6b69370b5
2015-04-05 09:21:30 -04:00
Jeremy Long
7f90160936 updated javadoc author
Former-commit-id: efb4c51cea724c4b2e6ff3bbab111893f6ebc887
2015-04-05 09:21:30 -04:00
Jeremy Long
f367ad7185 updated javadoc author
Former-commit-id: 4802729f76f07cedf9ea678822a7b884792ded9b
2015-04-05 09:21:29 -04:00
Jeremy Long
29a31476b1 updated javadoc author
Former-commit-id: dddb1eaf50985adbc1c6a8603c3ada0b58deee57
2015-04-05 09:21:29 -04:00
Jeremy Long
b844b66614 updated javadoc author
Former-commit-id: 577d5887c89e2df966220ac51588f6a4810d00e2
2015-04-05 09:21:29 -04:00
Jeremy Long
3e6fa1ed1f updated javadoc author
Former-commit-id: a3a72fdd91082968ff0f927ff391b01a03abbccc
2015-04-05 09:21:28 -04:00
Jeremy Long
e141b4eb9f updated javadoc author
Former-commit-id: 556a8a0c649d625684000d0f4d0db3beff0e92d9
2015-04-05 09:21:28 -04:00
Jeremy Long
c794194bb5 updated javadoc author
Former-commit-id: b5ed0d4b6191df9e3b4320cb79274f42b0ad0089
2015-04-05 09:21:27 -04:00
Jeremy Long
3a31902e78 updated javadoc author
Former-commit-id: aba79f7dd00f77d02dcedf5dff3152e38b960b8d
2015-04-05 09:21:27 -04:00
Jeremy Long
fedafe55c3 updated javadoc author
Former-commit-id: b4c0e0ab694ce650bf48eb4e246fe6eb43c99889
2015-04-05 09:21:27 -04:00
Jeremy Long
1c0b885267 updated javadoc author
Former-commit-id: f420200f47b0c2161c57af24d2b70db60f23cd4b
2015-04-05 09:21:26 -04:00
Jeremy Long
8e4791048b updated javadoc author
Former-commit-id: aba167a3ba3a67a8da23729f969de406a4f7ce10
2015-04-05 09:21:26 -04:00
Jeremy Long
e28be6f2b7 updated javadoc author
Former-commit-id: 30f7e50b4d38804ef4fa16d140239566db5f8cac
2015-04-05 09:21:26 -04:00
Jeremy Long
55271b8e83 updated javadoc author
Former-commit-id: faf88eac765f642fa25bcf730634e79c17d107ac
2015-04-05 09:21:25 -04:00
Jeremy Long
8b5d8679f7 updated javadoc author
Former-commit-id: 55ca887799f155a48b09297313fe7be22ab71f1f
2015-04-05 09:21:25 -04:00
Jeremy Long
51d8ced8ce updated javadoc author
Former-commit-id: cf9eab6585eabf35eee74f22400683f14b4b35c1
2015-04-05 09:21:25 -04:00
Jeremy Long
1cc94dd60b updated javadoc author
Former-commit-id: 9a52b80f8d67e5ad2861eff891382196eb605c68
2015-04-05 09:21:24 -04:00
Jeremy Long
6d107e79b6 updated javadoc author
Former-commit-id: 5f2a68378d7d566f71e8146206a93e36b7987c4a
2015-04-05 09:21:24 -04:00
Jeremy Long
6f44b4dce1 updated javadoc author
Former-commit-id: d8293e9a910e979cd40a4d4c8a017bd0cca291f9
2015-04-05 09:21:24 -04:00
Jeremy Long
1600492780 updated javadoc author
Former-commit-id: 98a7c3b5faed0c15a25fd93bdaca9ed806847ac0
2015-04-05 09:21:23 -04:00
Jeremy Long
5f396cc647 updated javadoc author
Former-commit-id: 07d4d2adb4de14796b58f1e1c722f2a88f1fc45f
2015-04-05 09:21:23 -04:00
Jeremy Long
49bd45d88c updated javadoc author
Former-commit-id: 3c79ef2eef1fdffc2bae0e45091fffb6af1e41d6
2015-04-05 09:21:23 -04:00
Jeremy Long
c41e673346 updated javadoc author
Former-commit-id: bdc0c240959e2ce9c5dc194bb9fa32083e5287e9
2015-04-05 09:21:22 -04:00
Jeremy Long
cf8d1a490c updated javadoc author
Former-commit-id: e40d29b2150990e9c093d5cfe991003239895d09
2015-04-05 09:21:22 -04:00
Jeremy Long
962f20296c updated javadoc author
Former-commit-id: 41514e76ebd6db3fbb4f955c28443f9ce436cbeb
2015-04-05 09:21:22 -04:00
Jeremy Long
e9c1ae1893 updated javadoc author
Former-commit-id: df80e5ee5504e57c95cc89e9af8d9c8910074ab0
2015-04-05 09:21:21 -04:00
Jeremy Long
5db51a2abf updated javadoc author
Former-commit-id: 8d5db6e14ce0231f572f85f580b276880964e4d9
2015-04-05 09:21:21 -04:00
Jeremy Long
63be1efed9 updated javadoc author
Former-commit-id: 2b327604180bb6f96d599f618af6e42e6a9cf1c2
2015-04-05 09:21:21 -04:00
Jeremy Long
7fe3c659e0 updated javadoc author
Former-commit-id: 1129346d7f495fa50b2f1c84c53817d3b0cab0e8
2015-04-05 09:21:20 -04:00
Jeremy Long
4d76c7685c updated javadoc author
Former-commit-id: bf53d2c21d0244de8cb6130274329e51ebe7dcc2
2015-04-05 09:21:20 -04:00
Jeremy Long
b50bcde028 updated javadoc author
Former-commit-id: a3289db80cf37f081d3ae56e9ad27914398b92d6
2015-04-05 09:21:20 -04:00
Jeremy Long
9a8b61ae47 updated javadoc author
Former-commit-id: 506514c92c0939aa40306cc238cf94fb9301f62c
2015-04-05 09:21:19 -04:00
Jeremy Long
c31880d8de updated javadoc author
Former-commit-id: 9d63c24fdef328dfa0161e0dbc874f04e6a20246
2015-04-05 09:21:19 -04:00
Jeremy Long
1496dc8e7d updated javadoc author
Former-commit-id: 4e26403ffcd24b6884c89cc608856db72d7e0e6b
2015-04-05 09:21:18 -04:00
Jeremy Long
cdbd513e42 updated javadoc author
Former-commit-id: b8f9f04bdb055931b1f8ba1553187ee17a5f68c3
2015-04-05 09:21:18 -04:00
Jeremy Long
653bf1764e updated javadoc author
Former-commit-id: 6ef2a7148b546249425675b6c1996a0b2f39fb53
2015-04-05 09:21:18 -04:00
Jeremy Long
df08acfe9e updated javadoc author
Former-commit-id: 3c6beecbf580b21d2c45ca105dcbd217d4d9a9ad
2015-04-05 09:21:17 -04:00
Jeremy Long
e7a5287bb4 added bypass so test would be ignored under 1.8
Former-commit-id: 65f2316643266d144e063dd329a8298d3058a78c
2015-04-05 08:38:24 -04:00
Jeremy Long
656f26cc9d added test case
Former-commit-id: 2330a397a8af99797a16c8201f1baac124089e6f
2015-04-05 08:37:43 -04:00
Jeremy Long
52385ddac4 added new logo
Former-commit-id: 97baa927bb9fa7f56c40323329c7b385ebd541a2
2015-04-05 08:36:51 -04:00
Jeremy Long
50c58667ba added new logo
Former-commit-id: 9a70c59f2a89d92a746e6c7eab056c2b7d093843
2015-04-05 08:36:16 -04:00
Jeremy Long
9cc6ca5ebe bug fix - the compareTo needed to be case insensitive
Former-commit-id: d4507585c046d06002a58b1bc39220c68cc04e6d
2015-04-05 08:35:31 -04:00
Jeremy Long
34b82a3f84 new favicon
Former-commit-id: 4389b32bab06787552eca7510b184856bffffdcd
2015-03-29 06:30:49 -04:00
Jeremy Long
d0401f3f8d Add an update only option
Former-commit-id: 67253232762acb61e1400dc60443e556f71db874
2015-03-28 12:17:24 -04:00
Jeremy Long
f247978d12 Merge branch 'master' of github.com:jeremylong/DependencyCheck
Former-commit-id: b4c8b0aceafa5975733d800161a68fc95d36667d
2015-03-28 07:22:10 -04:00
Jeremy Long
999116c75e patch to resolve issue #202
Former-commit-id: 576831ec73c00b957a6700dd753894f5429de071
2015-03-28 07:21:53 -04:00
Steve Springett
04e9f5b15b Fixed syntax for PR #204
Former-commit-id: 61875128cd3b710c4aadb2621ab1e6a11b8f7b8e
2015-03-26 13:00:51 -05:00
Steve Springett
78b0f7798f Merge pull request #204 from rperam/master
Property to control whether external reports need to be generated or not

Former-commit-id: 8a53f09f1e4af41695c48d057eee963a24903b5d
2015-03-26 10:38:23 -05:00
Rudra Peram
b0727ef3cf Set a property to determine whether external reports need to be generated or not
Former-commit-id: 83ce9ecd722f47140198e276ecc86d279f39d881
2015-03-25 23:52:48 -07:00
RK
01fb31fc15 Merge pull request #1 from jeremylong/master
Update from jeremylong/DependencyCheck

Former-commit-id: 93d5034211fec0e3f1c3bdf8ef3a305d141097ad
2015-03-25 23:43:40 -07:00
Jeremy Long
a1187acc31 changed default timeout to 10 seconds
Former-commit-id: 0240be0f5ec3db514310c1ce47eaf906d198bc3a
2015-03-20 09:01:13 -04:00
Jeremy Long
fe4a24a651 removed nexus auth test code
Former-commit-id: 9b5f8cbceb5a6a273dfd7ba85bf16510dab3ddb5
2015-03-18 10:07:01 -04:00
Jeremy Long
3dcce572d3 added the capability to follow more then a single redirect when downloading a file
Former-commit-id: cc3382fec2c168119474ee6bae7b5f250163c2da
2015-03-18 05:47:37 -04:00
Jeremy Long
ece69014ce added auth to nexus search
Former-commit-id: eb0b5e8ab0dcb27fe2edcb79b9dc9898c13bcb6b
2015-03-16 06:50:12 -04:00
Jeremy Long
fc6bb67e56 version 1.2.10-SNAPSHOT
Former-commit-id: aa597102bf8e24cb876b1d7c805ba8f2e06fda22
2015-03-06 19:49:05 -05:00
Jeremy Long
968de2947b fixed javadoc
Former-commit-id: e5736e49452f0d620438d2e6174cb35bcf236eaf
2015-03-06 19:40:29 -05:00
639 changed files with 328068 additions and 48565 deletions

5
.gitignore vendored
View File

@@ -1,4 +1,6 @@
*/target/**
# IntelliJ test run side-effects
dependency-check-core/data/
# Intellij project files
*.iml
*.ipr
@@ -10,6 +12,7 @@
.settings
maven-eclipse.xml
.externalToolBuilders
.pmd
# Netbeans configuration
nb-configuration.xml
/target/
@@ -22,4 +25,4 @@ _site/**
#unknown as to why these are showing up... but need to be ignored.
.LCKpom.xml~
#coverity
/cov-int/
/cov-int/

View File

@@ -1,3 +1,4 @@
[![Build Status](https://dependency-check.ci.cloudbees.com/buildStatus/icon?job=dependency-check)](https://dependency-check.ci.cloudbees.com/job/dependency-check/)
Dependency-Check
================
@@ -9,12 +10,14 @@ Current Releases
-------------
### Jenkins Plugin
For instructions on the use of the Jenkins plugin please see the [Jenkins dependency-check page](http://wiki.jenkins-ci.org/x/CwDgAQ).
For instructions on the use of the Jenkins plugin please see the [OWASP Dependency-Check Plugin page](https://wiki.jenkins-ci.org/display/JENKINS/OWASP+Dependency-Check+Plugin).
### Command Line
More detailed instructions can be found on the [dependency-check github pages](http://jeremylong.github.io/DependencyCheck/dependency-check-cli/installation.html).
The latest CLI can be downloaded from bintray's [dependency-check page](https://bintray.com/jeremy-long/owasp/dependency-check).
More detailed instructions can be found on the
[dependency-check github pages](http://jeremylong.github.io/DependencyCheck/dependency-check-cli/).
The latest CLI can be downloaded from bintray's
[dependency-check page](https://bintray.com/jeremy-long/owasp/dependency-check).
On *nix
```
@@ -26,10 +29,16 @@ On Windows
> bin/dependency-check.bat -h
> bin/dependency-check.bat --app Testing --out . --scan [path to jar files to be scanned]
```
On Mac with [Homebrew](http://brew.sh)
```
$ brew update && brew install dependency-check
$ dependency-check -h
$ dependency-check --app Testing --out . --scan [path to jar files to be scanned]
```
### Maven Plugin
More detailed instructions can be found on the [dependency-check-maven github pages](http://jeremylong.github.io/DependencyCheck/dependency-check-maven/usage.html).
More detailed instructions can be found on the [dependency-check-maven github pages](http://jeremylong.github.io/DependencyCheck/dependency-check-maven).
The plugin can be configured using the following:
```xml
@@ -58,15 +67,19 @@ The plugin can be configured using the following:
### Ant Task
For instructions on the use of the Ant Task, please see the [dependency-check-ant github page](http://jeremylong.github.io/DependencyCheck/dependency-check-ant/installation.html).
For instructions on the use of the Ant Task, please see the [dependency-check-ant github page](http://jeremylong.github.io/DependencyCheck/dependency-check-ant).
Development Usage
-------------
The following instructions outline how to compile and use the current snapshot. While every intention is to maintain a stable snapshot it is recommended
that the release versions listed above be used.
Note, currently the install goal may take a long time to execute the integration tests. However, if this takes more then 30 minutes it is likely that the
download of data from the NVD is having an issue. This issue is still being researched and a solution should be published soon.
The repository has some large files due to test resources. The team has tried to cleanup the history as much as possible.
However, it is recommended that you perform a shallow clone to save yourself time:
```bash
git clone --depth 1 git@github.com:jeremylong/DependencyCheck.git
```
On *nix
```
@@ -95,9 +108,9 @@ Archive: [google group](https://groups.google.com/forum/#!forum/dependency-check
Copyright & License
-
Dependency-Check is Copyright (c) 2012-2014 Jeremy Long. All Rights Reserved.
Dependency-Check is Copyright (c) 2012-2015 Jeremy Long. All Rights Reserved.
Permission to modify and redistribute is granted under the terms of the Apache 2.0 license. See the [LICENSE.txt](https://github.com/jeremylong/DependencyCheck/dependency-check-cli/blob/master/LICENSE.txt) file for the full license.
Permission to modify and redistribute is granted under the terms of the Apache 2.0 license. See the [LICENSE.txt](https://raw.githubusercontent.com/jeremylong/DependencyCheck/master/LICENSE.txt) file for the full license.
Dependency-Check makes use of several other open source libraries. Please see the [NOTICE.txt] [notices] file for more information.

View File

@@ -1,9 +1,6 @@
-----------------------------
---begin dependency-check----
-----------------------------
dependency-check
OWASP dependency-check
Copyright (c) 2012-2013 Jeremy Long. All Rights Reserved.
Copyright (c) 2012-2015 Jeremy Long. All Rights Reserved.
The licenses for the software listed below can be found in the META-INF/licenses/[dependency name].
@@ -19,11 +16,3 @@ An original copy of the license agreement can be found at: http://www.h2database
This product includes data from the Common Weakness Enumeration (CWE): http://cwe.mitre.org/
This product downloads and utilizes data from the National Vulnerability Database hosted by NIST: http://nvd.nist.gov/download.cfm
-----------------------------
---end dependency-check------
-----------------------------
Notices below are from dependent libraries and have been included via maven-shade-plugin.
-----------------------------

View File

@@ -1,25 +1,134 @@
Dependency-Check Ant Task
Dependency-Check-Gradle
=========
Dependency-Check Ant Task can be used to check the project dependencies for published security vulnerabilities. The checks
performed are a "best effort" and as such, there could be false positives as well as false negatives. However,
vulnerabilities in 3rd party components is a well-known problem and is currently documented in the 2013 OWASP
Top 10 as [A9 - Using Components with Known Vulnerabilities](https://www.owasp.org/index.php/Top_10_2013-A9-Using_Components_with_Known_Vulnerabilities).
**Working in progress**
Documentation and links to production binary releases can be found on the [github pages](http://jeremylong.github.io/DependencyCheck/dependency-check-ant/installation.html).
This is a DependencyCheck gradle plugin designed for project which use Gradle as build script.
Mailing List
------------
Dependency-Check is a utility that attempts to detect publicly disclosed vulnerabilities contained within project dependencies. It does this by determining if there is a Common Platform Enumeration (CPE) identifier for a given dependency. If found, it will generate a report linking to the associated CVE entries.
Subscribe: [dependency-check+subscribe@googlegroups.com](mailto:dependency-check+subscribe@googlegroups.com)
=========
Post: [dependency-check@googlegroups.com](mailto:dependency-check@googlegroups.com)
## What's New
Current latest version is `0.0.8`
Copyright & License
-------------------
## Usage
Dependency-Check is Copyright (c) 2012-2014 Jeremy Long. All Rights Reserved.
### Step 1, Apply dependency check gradle plugin
Permission to modify and redistribute is granted under the terms of the Apache 2.0 license. See the [LICENSE.txt](https://github.com/jeremylong/DependencyCheck/dependency-check-cli/blob/master/LICENSE.txt) file for the full license.
Install from Maven central repo
Dependency-Check-Ant makes use of other open source libraries. Please see the [NOTICE.txt](https://github.com/jeremylong/DependencyCheck/dependency-check-ant/blob/master/NOTICES.txt) file for more information.
```groovy
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.owasp:dependency-check-gradle:1.3.2'
}
}
apply plugin: 'dependency-check-gradle'
```
### Step 2, Run gradle task
Once gradle plugin applied, run following gradle task to check dependencies:
```
gradle dependencyCheck --info
```
The reports will be generated automatically under `./reports` folder.
If your project includes multiple sub-projects, the report will be generated for each sub-project in different sub-directory.
## FAQ
> **Questions List:**
> - What if I'm behind a proxy?
> - What if my project includes multiple sub-project? How can I use this plugin for each of them including the root project?
> - How to customize the report directory?
### What if I'm behind a proxy?
Maybe you have to use proxy to access internet, in this case, you could configure proxy settings for this plugin:
```groovy
dependencyCheck {
proxy {
server = "127.0.0.1" // required, the server name or IP address of the proxy
port = 3128 // required, the port number of the proxy
// optional, the proxy server might require username
// username = "username"
// optional, the proxy server might require password
// password = "password"
}
}
```
In addition, if the proxy only allow HTTP `GET` or `POST` methods, you will find that the update process will always fail,
the root cause is that every time you run `dependencyCheck` task, it will try to query the latest timestamp to determine whether need to perform an update action,
and for performance reason the HTTP method it uses by default is `HEAD`, which probably is disabled or not supported by the proxy. To avoid this problem, you can simply change the HTTP method by below configuration:
```groovy
dependencyCheck {
quickQueryTimestamp = false // when set to false, it means use HTTP GET method to query timestamp. (default value is true)
}
```
### What if my project includes multiple sub-project? How can I use this plugin for each of them including the root project?
Try put 'apply plugin: "dependency-check"' inside the 'allprojects' or 'subprojects' if you'd like to check all sub-projects only, see below:
(1) For all projects including root project:
```groovy
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "gradle.plugin.com.tools.security:dependency-check:0.0.8"
}
}
allprojects {
apply plugin: "dependency-check"
}
```
(2) For all sub-projects:
```groovy
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "gradle.plugin.com.tools.security:dependency-check:0.0.8"
}
}
subprojects {
apply plugin: "dependency-check"
}
```
In this way, the dependency check will be executed for all projects (including root project) or just sub projects.
### How to customize the report directory?
By default, all reports will be placed under `./reports` folder, to change the default directory, just modify it in the configuration section like this:
```groovy
subprojects {
apply plugin: "dependency-check"
dependencyCheck {
outputDirectory = "./customized-path/security-report"
}
}
```

View File

@@ -20,7 +20,7 @@ Copyright (c) 2013 - Jeremy Long. All Rights Reserved.
<parent>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-parent</artifactId>
<version>1.2.9</version>
<version>1.3.2</version>
</parent>
<artifactId>dependency-check-ant</artifactId>
@@ -190,38 +190,36 @@ Copyright (c) 2013 - Jeremy Long. All Rights Reserved.
</execution>
</executions>
</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>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/NOTICE.txt</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
<resource>META-INF/NOTICE</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
<resource>META-INF/LICENSE</resource>
</transformer>
</transformers>
<attach>false</attach> <!-- don't install/deploy this archive -->
</configuration>
<executions>
<execution>
<id>create-distribution</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>src/main/assembly/release.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
@@ -229,9 +227,6 @@ Copyright (c) 2013 - Jeremy Long. All Rights Reserved.
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<configuration>
<!--instrumentation>
<ignoreTrivial>true</ignoreTrivial>
</instrumentation-->
<check>
<branchRate>85</branchRate>
<lineRate>85</lineRate>
@@ -273,100 +268,10 @@ Copyright (c) 2013 - Jeremy Long. All Rights Reserved.
</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>
<version>${reporting.checkstyle-plugin.version}</version>
<configuration>
<enableRulesSummary>false</enableRulesSummary>
<enableFilesSummary>false</enableFilesSummary>
@@ -379,7 +284,7 @@ Copyright (c) 2013 - Jeremy Long. All Rights Reserved.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.0.1</version>
<version>${reporting.pmd-plugin.version}</version>
<configuration>
<targetJdk>1.6</targetJdk>
<linkXref>true</linkXref>
@@ -395,11 +300,6 @@ Copyright (c) 2013 - Jeremy Long. All Rights Reserved.
</rulesets>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>2.5.3</version>
</plugin>
</plugins>
</reporting>
<dependencies>
@@ -423,12 +323,11 @@ Copyright (c) 2013 - Jeremy Long. All Rights Reserved.
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.9.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-testutil</artifactId>
<version>1.9.4</version>
<scope>test</scope>
</dependency>
</dependencies>

View File

@@ -12,18 +12,25 @@
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<!--fileSets>
<fileSet>
<outputDirectory>/</outputDirectory>
<outputDirectory>dependency-check</outputDirectory>
<directory>${project.build.directory}</directory>
<includes>
<include>dependency-check*.jar</include>
</includes>
</fileSet>
</fileSets>
</fileSets-->
<files>
<file>
<source>${project.build.directory}/${project.artifactId}-${project.version}.jar</source>
<outputDirectory>dependency-check-ant</outputDirectory>
<destName>dependency-check-ant.jar</destName>
</file>
</files>
<dependencySets>
<dependencySet>
<outputDirectory>/lib</outputDirectory>
<outputDirectory>dependency-check-ant/lib</outputDirectory>
<scope>runtime</scope>
</dependencySet>
</dependencySets>

View File

@@ -0,0 +1,273 @@
/*
* This file is part of dependency-check-ant.
*
* 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 The OWASP Foundation. All Rights Reserved.
*/
package org.owasp.dependencycheck.ant.logging;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.slf4j.helpers.FormattingTuple;
import org.slf4j.helpers.MarkerIgnoringBase;
import org.slf4j.helpers.MessageFormatter;
/**
* An instance of {@link org.slf4j.Logger} which simply calls the log method on the delegate Ant task.
*
* @author colezlaw
*/
public class AntLoggerAdapter extends MarkerIgnoringBase {
/**
* A reference to the Ant task used for logging.
*/
private Task task;
/**
* Constructs an Ant Logger Adapter.
*
* @param task the Ant Task to use for logging
*/
public AntLoggerAdapter(Task task) {
super();
this.task = task;
}
/**
* Sets the current Ant task to use for logging.
*
* @param task the Ant task to use for logging
*/
public void setTask(Task task) {
this.task = task;
}
@Override
public boolean isTraceEnabled() {
// Might be a more efficient way to do this, but Ant doesn't enable or disable
// various levels globally - it just fires things at registered Listeners.
return true;
}
@Override
public void trace(String msg) {
if (task != null) {
task.log(msg, Project.MSG_VERBOSE);
}
}
@Override
public void trace(String format, Object arg) {
if (task != null) {
final FormattingTuple tp = MessageFormatter.format(format, arg);
task.log(tp.getMessage(), Project.MSG_VERBOSE);
}
}
@Override
public void trace(String format, Object arg1, Object arg2) {
if (task != null) {
final FormattingTuple tp = MessageFormatter.format(format, arg1, arg2);
task.log(tp.getMessage(), Project.MSG_VERBOSE);
}
}
@Override
public void trace(String format, Object... arguments) {
if (task != null) {
final FormattingTuple tp = MessageFormatter.format(format, arguments);
task.log(tp.getMessage(), Project.MSG_VERBOSE);
}
}
@Override
public void trace(String msg, Throwable t) {
if (task != null) {
task.log(msg, t, Project.MSG_VERBOSE);
}
}
@Override
public boolean isDebugEnabled() {
return true;
}
@Override
public void debug(String msg) {
if (task != null) {
task.log(msg, Project.MSG_DEBUG);
}
}
@Override
public void debug(String format, Object arg) {
if (task != null) {
final FormattingTuple tp = MessageFormatter.format(format, arg);
task.log(tp.getMessage(), Project.MSG_DEBUG);
}
}
@Override
public void debug(String format, Object arg1, Object arg2) {
if (task != null) {
final FormattingTuple tp = MessageFormatter.format(format, arg1, arg2);
task.log(tp.getMessage(), Project.MSG_DEBUG);
}
}
@Override
public void debug(String format, Object... arguments) {
if (task != null) {
final FormattingTuple tp = MessageFormatter.format(format, arguments);
task.log(tp.getMessage(), Project.MSG_DEBUG);
}
}
@Override
public void debug(String msg, Throwable t) {
if (task != null) {
task.log(msg, t, Project.MSG_DEBUG);
}
}
@Override
public boolean isInfoEnabled() {
return true;
}
@Override
public void info(String msg) {
if (task != null) {
task.log(msg, Project.MSG_INFO);
}
}
@Override
public void info(String format, Object arg) {
if (task != null) {
final FormattingTuple tp = MessageFormatter.format(format, arg);
task.log(tp.getMessage(), Project.MSG_INFO);
}
}
@Override
public void info(String format, Object arg1, Object arg2) {
if (task != null) {
final FormattingTuple tp = MessageFormatter.format(format, arg1, arg2);
task.log(tp.getMessage(), Project.MSG_INFO);
}
}
@Override
public void info(String format, Object... arguments) {
if (task != null) {
final FormattingTuple tp = MessageFormatter.format(format, arguments);
task.log(tp.getMessage(), Project.MSG_INFO);
}
}
@Override
public void info(String msg, Throwable t) {
if (task != null) {
task.log(msg, t, Project.MSG_INFO);
}
}
@Override
public boolean isWarnEnabled() {
return true;
}
@Override
public void warn(String msg) {
if (task != null) {
task.log(msg, Project.MSG_WARN);
}
}
@Override
public void warn(String format, Object arg) {
if (task != null) {
final FormattingTuple tp = MessageFormatter.format(format, arg);
task.log(tp.getMessage(), Project.MSG_WARN);
}
}
@Override
public void warn(String format, Object... arguments) {
if (task != null) {
final FormattingTuple tp = MessageFormatter.format(format, arguments);
task.log(tp.getMessage(), Project.MSG_WARN);
}
}
@Override
public void warn(String format, Object arg1, Object arg2) {
if (task != null) {
final FormattingTuple tp = MessageFormatter.format(format, arg1, arg2);
task.log(tp.getMessage(), Project.MSG_WARN);
}
}
@Override
public void warn(String msg, Throwable t) {
if (task != null) {
task.log(msg, t, Project.MSG_WARN);
}
}
@Override
public boolean isErrorEnabled() {
return true;
}
@Override
public void error(String msg) {
if (task != null) {
task.log(msg, Project.MSG_ERR);
}
}
@Override
public void error(String format, Object arg) {
if (task != null) {
final FormattingTuple tp = MessageFormatter.format(format, arg);
task.log(tp.getMessage(), Project.MSG_ERR);
}
}
@Override
public void error(String format, Object arg1, Object arg2) {
if (task != null) {
final FormattingTuple tp = MessageFormatter.format(format, arg1, arg2);
task.log(tp.getMessage(), Project.MSG_ERR);
}
}
@Override
public void error(String format, Object... arguments) {
if (task != null) {
final FormattingTuple tp = MessageFormatter.format(format, arguments);
task.log(tp.getMessage(), Project.MSG_ERR);
}
}
@Override
public void error(String msg, Throwable t) {
if (task != null) {
task.log(msg, t, Project.MSG_ERR);
}
}
}

View File

@@ -0,0 +1,56 @@
/*
* This file is part of dependency-check-ant.
*
* 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 The OWASP Foundation. All Rights Reserved.
*/
package org.owasp.dependencycheck.ant.logging;
import org.apache.tools.ant.Task;
import org.slf4j.ILoggerFactory;
import org.slf4j.Logger;
/**
* An implementation of {@link org.slf4j.ILoggerFactory} which always returns {@link AntLoggerAdapter} instances.
*
* @author colezlaw
*/
public class AntLoggerFactory implements ILoggerFactory {
/**
* A reference to the Ant logger Adapter.
*/
private final AntLoggerAdapter antLoggerAdapter;
/**
* Constructs a new Ant Logger Factory.
*
* @param task the Ant task to use for logging
*/
public AntLoggerFactory(Task task) {
super();
this.antLoggerAdapter = new AntLoggerAdapter(task);
}
/**
* Returns the Ant logger adapter.
*
* @param name ignored in this implementation
* @return the Ant logger adapter
*/
@Override
public Logger getLogger(String name) {
return antLoggerAdapter;
}
}

View File

@@ -0,0 +1,4 @@
/**
* This package includes the Ant task definitions.
*/
package org.owasp.dependencycheck.ant.logging;

View File

@@ -0,0 +1,127 @@
/*
* This file is part of dependency-check-ant.
*
* 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.taskdefs;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.owasp.dependencycheck.utils.Settings;
import org.slf4j.impl.StaticLoggerBinder;
/**
* An Ant task definition to execute dependency-check during an Ant build.
*
* @author Jeremy Long
*/
public class Purge extends Task {
/**
* The properties file location.
*/
private static final String PROPERTIES_FILE = "task.properties";
/**
* Construct a new DependencyCheckTask.
*/
public Purge() {
super();
// Call this before Dependency Check Core starts logging anything - this way, all SLF4J messages from
// core end up coming through this tasks logger
StaticLoggerBinder.getSingleton().setTask(this);
}
/**
* The location of the data directory that contains
*/
private String dataDirectory = null;
/**
* Get the value of dataDirectory.
*
* @return the value of dataDirectory
*/
public String getDataDirectory() {
return dataDirectory;
}
/**
* Set the value of dataDirectory.
*
* @param dataDirectory new value of dataDirectory
*/
public void setDataDirectory(String dataDirectory) {
this.dataDirectory = dataDirectory;
}
@Override
public void execute() throws BuildException {
populateSettings();
File db;
try {
db = new File(Settings.getDataDirectory(), "dc.h2.db");
if (db.exists()) {
if (db.delete()) {
log("Database file purged; local copy of the NVD has been removed", Project.MSG_INFO);
} else {
log(String.format("Unable to delete '%s'; please delete the file manually", db.getAbsolutePath()), Project.MSG_ERR);
}
} else {
log(String.format("Unable to purge database; the database file does not exists: %s", db.getAbsolutePath()), Project.MSG_ERR);
}
} catch (IOException ex) {
log("Unable to delete the database", Project.MSG_ERR);
} finally {
Settings.cleanup(true);
}
}
/**
* Takes the properties supplied and updates the dependency-check settings. Additionally, this sets the system properties
* required to change the proxy server, port, and connection timeout.
*/
protected void populateSettings() {
Settings.initialize();
InputStream taskProperties = null;
try {
taskProperties = this.getClass().getClassLoader().getResourceAsStream(PROPERTIES_FILE);
Settings.mergeProperties(taskProperties);
} catch (IOException ex) {
log("Unable to load the dependency-check ant task.properties file.", ex, Project.MSG_WARN);
} finally {
if (taskProperties != null) {
try {
taskProperties.close();
} catch (IOException ex) {
log("", ex, Project.MSG_DEBUG);
}
}
}
if (dataDirectory != null) {
Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDirectory);
} else {
final File jarPath = new File(Purge.class.getProtectionDomain().getCodeSource().getLocation().getPath());
final File base = jarPath.getParentFile();
final String sub = Settings.getString(Settings.KEYS.DATA_DIRECTORY);
final File dataDir = new File(base, sub);
Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDir.getAbsolutePath());
}
}
}

View File

@@ -0,0 +1,437 @@
/*
* This file is part of dependency-check-ant.
*
* 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.taskdefs;
import org.apache.tools.ant.BuildException;
import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.data.nvdcve.DatabaseException;
import org.owasp.dependencycheck.utils.Settings;
import org.slf4j.impl.StaticLoggerBinder;
/**
* An Ant task definition to execute dependency-check update. This will download the latest data from the National Vulnerability
* Database (NVD) and store a copy in the local database.
*
* @author Jeremy Long
*/
public class Update extends Purge {
/**
* Construct a new UpdateTask.
*/
public Update() {
super();
// Call this before Dependency Check Core starts logging anything - this way, all SLF4J messages from
// core end up coming through this tasks logger
StaticLoggerBinder.getSingleton().setTask(this);
}
/**
* The Proxy Server.
*/
private String proxyServer;
/**
* Get the value of proxyServer.
*
* @return the value of proxyServer
*/
public String getProxyServer() {
return proxyServer;
}
/**
* Set the value of proxyServer.
*
* @param server new value of proxyServer
*/
public void setProxyServer(String server) {
this.proxyServer = server;
}
/**
* The Proxy Port.
*/
private String proxyPort;
/**
* Get the value of proxyPort.
*
* @return the value of proxyPort
*/
public String getProxyPort() {
return proxyPort;
}
/**
* Set the value of proxyPort.
*
* @param proxyPort new value of proxyPort
*/
public void setProxyPort(String proxyPort) {
this.proxyPort = proxyPort;
}
/**
* The Proxy username.
*/
private String proxyUsername;
/**
* Get the value of proxyUsername.
*
* @return the value of proxyUsername
*/
public String getProxyUsername() {
return proxyUsername;
}
/**
* Set the value of proxyUsername.
*
* @param proxyUsername new value of proxyUsername
*/
public void setProxyUsername(String proxyUsername) {
this.proxyUsername = proxyUsername;
}
/**
* The Proxy password.
*/
private String proxyPassword;
/**
* Get the value of proxyPassword.
*
* @return the value of proxyPassword
*/
public String getProxyPassword() {
return proxyPassword;
}
/**
* Set the value of proxyPassword.
*
* @param proxyPassword new value of proxyPassword
*/
public void setProxyPassword(String proxyPassword) {
this.proxyPassword = proxyPassword;
}
/**
* The Connection Timeout.
*/
private String connectionTimeout;
/**
* Get the value of connectionTimeout.
*
* @return the value of connectionTimeout
*/
public String getConnectionTimeout() {
return connectionTimeout;
}
/**
* Set the value of connectionTimeout.
*
* @param connectionTimeout new value of connectionTimeout
*/
public void setConnectionTimeout(String connectionTimeout) {
this.connectionTimeout = connectionTimeout;
}
/**
* The database driver name; such as org.h2.Driver.
*/
private String databaseDriverName;
/**
* Get the value of databaseDriverName.
*
* @return the value of databaseDriverName
*/
public String getDatabaseDriverName() {
return databaseDriverName;
}
/**
* Set the value of databaseDriverName.
*
* @param databaseDriverName new value of databaseDriverName
*/
public void setDatabaseDriverName(String databaseDriverName) {
this.databaseDriverName = databaseDriverName;
}
/**
* The path to the database driver JAR file if it is not on the class path.
*/
private String databaseDriverPath;
/**
* Get the value of databaseDriverPath.
*
* @return the value of databaseDriverPath
*/
public String getDatabaseDriverPath() {
return databaseDriverPath;
}
/**
* Set the value of databaseDriverPath.
*
* @param databaseDriverPath new value of databaseDriverPath
*/
public void setDatabaseDriverPath(String databaseDriverPath) {
this.databaseDriverPath = databaseDriverPath;
}
/**
* The database connection string.
*/
private String connectionString;
/**
* Get the value of connectionString.
*
* @return the value of connectionString
*/
public String getConnectionString() {
return connectionString;
}
/**
* Set the value of connectionString.
*
* @param connectionString new value of connectionString
*/
public void setConnectionString(String connectionString) {
this.connectionString = connectionString;
}
/**
* The user name for connecting to the database.
*/
private String databaseUser;
/**
* Get the value of databaseUser.
*
* @return the value of databaseUser
*/
public String getDatabaseUser() {
return databaseUser;
}
/**
* Set the value of databaseUser.
*
* @param databaseUser new value of databaseUser
*/
public void setDatabaseUser(String databaseUser) {
this.databaseUser = databaseUser;
}
/**
* The password to use when connecting to the database.
*/
private String databasePassword;
/**
* Get the value of databasePassword.
*
* @return the value of databasePassword
*/
public String getDatabasePassword() {
return databasePassword;
}
/**
* Set the value of databasePassword.
*
* @param databasePassword new value of databasePassword
*/
public void setDatabasePassword(String databasePassword) {
this.databasePassword = databasePassword;
}
/**
* The url for the modified NVD CVE (1.2 schema).
*/
private String cveUrl12Modified;
/**
* Get the value of cveUrl12Modified.
*
* @return the value of cveUrl12Modified
*/
public String getCveUrl12Modified() {
return cveUrl12Modified;
}
/**
* Set the value of cveUrl12Modified.
*
* @param cveUrl12Modified new value of cveUrl12Modified
*/
public void setCveUrl12Modified(String cveUrl12Modified) {
this.cveUrl12Modified = cveUrl12Modified;
}
/**
* The url for the modified NVD CVE (2.0 schema).
*/
private String cveUrl20Modified;
/**
* Get the value of cveUrl20Modified.
*
* @return the value of cveUrl20Modified
*/
public String getCveUrl20Modified() {
return cveUrl20Modified;
}
/**
* Set the value of cveUrl20Modified.
*
* @param cveUrl20Modified new value of cveUrl20Modified
*/
public void setCveUrl20Modified(String cveUrl20Modified) {
this.cveUrl20Modified = cveUrl20Modified;
}
/**
* Base Data Mirror URL for CVE 1.2.
*/
private String cveUrl12Base;
/**
* Get the value of cveUrl12Base.
*
* @return the value of cveUrl12Base
*/
public String getCveUrl12Base() {
return cveUrl12Base;
}
/**
* Set the value of cveUrl12Base.
*
* @param cveUrl12Base new value of cveUrl12Base
*/
public void setCveUrl12Base(String cveUrl12Base) {
this.cveUrl12Base = cveUrl12Base;
}
/**
* Data Mirror URL for CVE 2.0.
*/
private String cveUrl20Base;
/**
* Get the value of cveUrl20Base.
*
* @return the value of cveUrl20Base
*/
public String getCveUrl20Base() {
return cveUrl20Base;
}
/**
* Set the value of cveUrl20Base.
*
* @param cveUrl20Base new value of cveUrl20Base
*/
public void setCveUrl20Base(String cveUrl20Base) {
this.cveUrl20Base = cveUrl20Base;
}
/**
* The number of hours to wait before re-checking for updates.
*/
private Integer cveValidForHours;
/**
* Get the value of cveValidForHours.
*
* @return the value of cveValidForHours
*/
public Integer getCveValidForHours() {
return cveValidForHours;
}
/**
* Set the value of cveValidForHours.
*
* @param cveValidForHours new value of cveValidForHours
*/
public void setCveValidForHours(Integer cveValidForHours) {
this.cveValidForHours = cveValidForHours;
}
/**
* Executes the update by initializing the settings, downloads the NVD XML data, and then processes the data storing it in the
* local database.
*
* @throws BuildException thrown if a connection to the local database cannot be made.
*/
@Override
public void execute() throws BuildException {
populateSettings();
Engine engine = null;
try {
engine = new Engine(Update.class.getClassLoader());
engine.doUpdates();
} catch (DatabaseException ex) {
throw new BuildException("Unable to connect to the dependency-check database; unable to update the NVD data", ex);
} finally {
Settings.cleanup(true);
if (engine != null) {
engine.cleanup();
}
}
}
/**
* Takes the properties supplied and updates the dependency-check settings. Additionally, this sets the system properties
* required to change the proxy server, port, and connection timeout.
*
* @throws BuildException thrown when an invalid setting is configured.
*/
@Override
protected void populateSettings() throws BuildException {
super.populateSettings();
Settings.setStringIfNotEmpty(Settings.KEYS.PROXY_SERVER, proxyServer);
Settings.setStringIfNotEmpty(Settings.KEYS.PROXY_PORT, proxyPort);
Settings.setStringIfNotEmpty(Settings.KEYS.PROXY_USERNAME, proxyUsername);
Settings.setStringIfNotEmpty(Settings.KEYS.PROXY_PASSWORD, proxyPassword);
Settings.setStringIfNotEmpty(Settings.KEYS.CONNECTION_TIMEOUT, connectionTimeout);
Settings.setStringIfNotEmpty(Settings.KEYS.DB_DRIVER_NAME, databaseDriverName);
Settings.setStringIfNotEmpty(Settings.KEYS.DB_DRIVER_PATH, databaseDriverPath);
Settings.setStringIfNotEmpty(Settings.KEYS.DB_CONNECTION_STRING, connectionString);
Settings.setStringIfNotEmpty(Settings.KEYS.DB_USER, databaseUser);
Settings.setStringIfNotEmpty(Settings.KEYS.DB_PASSWORD, databasePassword);
Settings.setStringIfNotEmpty(Settings.KEYS.CVE_MODIFIED_12_URL, cveUrl12Modified);
Settings.setStringIfNotEmpty(Settings.KEYS.CVE_MODIFIED_20_URL, cveUrl20Modified);
Settings.setStringIfNotEmpty(Settings.KEYS.CVE_SCHEMA_1_2, cveUrl12Base);
Settings.setStringIfNotEmpty(Settings.KEYS.CVE_SCHEMA_2_0, cveUrl20Base);
if (cveValidForHours != null) {
if (cveValidForHours >= 0) {
Settings.setInt(Settings.KEYS.CVE_CHECK_VALID_FOR_HOURS, cveValidForHours);
} else {
throw new BuildException("Invalid setting: `cpeValidForHours` must be 0 or greater");
}
}
}
}

View File

@@ -1,11 +1,4 @@
/**
* <html>
* <head>
* <title>org.owasp.dependencycheck.taskdefs</title>
* </head>
* <body>
* This package includes the Ant task definitions.
* </body>
* </html>
* This package includes the a slf4j logging implementation that wraps the Ant logger.
*/
package org.owasp.dependencycheck.taskdefs;

View File

@@ -0,0 +1,103 @@
/*
* This file is part of dependency-check-ant.
*
* 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 The OWASP Foundation. All Rights Reserved.
*/
package org.slf4j.impl;
import org.apache.tools.ant.Task;
import org.owasp.dependencycheck.ant.logging.AntLoggerFactory;
import org.slf4j.ILoggerFactory;
import org.slf4j.spi.LoggerFactoryBinder;
/**
* The binding of {@link LoggerFactory} class with an actual instance of {@link ILoggerFactory} is performed using information
* returned by this class.
*
* @author colezlaw
*/
public class StaticLoggerBinder implements LoggerFactoryBinder {
/**
* The unique instance of this class
*
*/
private static final StaticLoggerBinder SINGLETON = new StaticLoggerBinder();
/**
* Return the singleton of this class.
*
* @return the StaticLoggerBinder singleton
*/
public static final StaticLoggerBinder getSingleton() {
return SINGLETON;
}
/**
* Ant tasks have the log method we actually want to call. So we hang onto the task as a delegate
*/
private Task task = null;
/**
* Set the Task which will this is to log through.
*
* @param task the task through which to log
*/
public void setTask(Task task) {
this.task = task;
loggerFactory = new AntLoggerFactory(task);
}
/**
* Declare the version of the SLF4J API this implementation is compiled against. The value of this filed is usually modified
* with each release.
*/
// to avoid constant folding by the compiler, this field must *not* be final
public static String REQUESTED_API_VERSION = "1.7.12"; // final
private static final String LOGGER_FACTORY_CLASS = AntLoggerFactory.class.getName();
/**
* The ILoggerFactory instance returned by the {@link #getLoggerFactory} method should always be the smae object
*/
private ILoggerFactory loggerFactory;
/**
* Constructs a new static logger binder.
*/
private StaticLoggerBinder() {
loggerFactory = new AntLoggerFactory(task);
}
/**
* Returns the logger factory.
*
* @return the logger factory
*/
@Override
public ILoggerFactory getLoggerFactory() {
return loggerFactory;
}
/**
* Returns the logger factory class string.
*
* @return the logger factory class string
*/
@Override
public String getLoggerFactoryClassStr() {
return LOGGER_FACTORY_CLASS;
}
}

View File

@@ -0,0 +1,4 @@
/**
* This package contains the static binder for the slf4j-ant logger.
*/
package org.slf4j.impl;

View File

@@ -0,0 +1,3 @@
dependency-check=org.owasp.dependencycheck.taskdefs.Check
dependency-check-purge=org.owasp.dependencycheck.taskdefs.Purge
dependency-check-update=org.owasp.dependencycheck.taskdefs.Update

View File

@@ -1,23 +0,0 @@
handlers=java.util.logging.ConsoleHandler, java.util.logging.FileHandler
# logging levels
# FINEST, FINER, FINE, CONFIG, INFO, WARNING and SEVERE.
# Configure the ConsoleHandler.
java.util.logging.ConsoleHandler.level=INFO
#org.owasp.dependencycheck.data.nvdcve.xml
# Configure the FileHandler.
#java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
#java.util.logging.FileHandler.level=FINEST
# The following special tokens can be used in the pattern property
# which specifies the location and name of the log file.
# / - standard path separator
# %t - system temporary directory
# %h - value of the user.home system property
# %g - generation number for rotating logs
# %u - unique number to avoid conflicts
# FileHandler writes to %h/demo0.log by default.
#java.util.logging.FileHandler.pattern=./target/dependency-check.log

View File

@@ -1,2 +1,2 @@
# the path to the data directory
data.directory=dependency-check-data
data.directory=data

View File

@@ -1,3 +0,0 @@
# define custom tasks here
dependencycheck=org.owasp.dependencycheck.taskdefs.DependencyCheckTask

View File

@@ -0,0 +1,19 @@
Configuration
====================
The dependency-check-purge task deletes the local copy of the NVD. This task
should rarely be used, if ever. This is included as a convenience method in
the rare circumstance that the local H2 database because corrupt.
```xml
<target name="dependency-check-purge" description="Dependency-Check purge">
<dependency-check-purge />
</target>
```
Configuration: dependency-check-purge Task
--------------------
The following properties can be set on the dependency-check-purge task.
Property | Description | Default Value
----------------------|----------------------------------------------------------------|------------------
dataDirectory | Data directory that is used to store the local copy of the NVD | data

View File

@@ -0,0 +1,44 @@
Configuration
====================
The dependency-check-update task downloads and updates the local copy of the NVD.
There are several reasons that one may want to use this task; primarily, creating
an update that will be run only once a day or once every few days (but not greater
then 7 days) and then use the `autoUpdate="false"` setting on individual
dependency-check scans. See [Internet Access Required](https://jeremylong.github.io/DependencyCheck/data/index.html)
for more information on why this task would be used.
```xml
<target name="dependency-check-update" description="Dependency-Check Update">
<dependency-check-update />
</target>
```
Configuration: dependency-check-update Task
--------------------
The following properties can be set on the dependency-check task.
Property | Description | Default Value
----------------------|------------------------------------|------------------
proxyServer | The Proxy Server. | &nbsp;
proxyPort | The Proxy Port. | &nbsp;
proxyUsername | Defines the proxy user name. | &nbsp;
proxyPassword | Defines the proxy password. | &nbsp;
connectionTimeout | The URL Connection Timeout. | &nbsp;
Advanced Configuration
====================
The following properties can be configured in the plugin. However, they are less frequently changed. One exception
may be the cvedUrl properties, which can be used to host a mirror of the NVD within an enterprise environment.
Property | Description | Default Value
---------------------|-------------------------------------------------------------------------------------------------------|------------------
cveUrl12Modified | URL for the modified CVE 1.2. | https://nvd.nist.gov/download/nvdcve-Modified.xml.gz
cveUrl20Modified | URL for the modified CVE 2.0. | https://nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-Modified.xml.gz
cveUrl12Base | Base URL for each year's CVE 1.2, the %d will be replaced with the year. | https://nvd.nist.gov/download/nvdcve-%d.xml.gz
cveUrl20Base | Base URL for each year's CVE 2.0, the %d will be replaced with the year. | https://nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-%d.xml.gz
dataDirectory | Data directory that is used to store the local copy of the NVD. This should generally not be changed. | data
databaseDriverName | The name of the database driver. Example: org.h2.Driver. | &nbsp;
databaseDriverPath | The path to the database driver JAR file; only used if the driver is not in the class path. | &nbsp;
connectionString | The connection string used to connect to the database. | &nbsp;
databaseUser | The username used when connecting to the database. | &nbsp;
databasePassword | The password used when connecting to the database. | &nbsp;

View File

@@ -1,5 +1,11 @@
Configuration
====================
Once dependency-check-ant has been [installed](index.html) the defined tasks can be used.
* dependency-check - the primary task used to check the project dependencies. Configuration options are below.
* dependency-check-purge - deletes the local copy of the NVD; this should rarely be used (if ever). See the [purge configuration](config-purge.html) for more information.
* dependency-check-update - downloads and updates the local copy of the NVD. See the [update configuration](config-update.html) for more information.
To configure the dependency-check task you can add it to a target and include a
file based [resource collection](http://ant.apache.org/manual/Types/resources.html#collection)
such as a [FileSet](http://ant.apache.org/manual/Types/fileset.html), [DirSet](http://ant.apache.org/manual/Types/dirset.html),
@@ -8,7 +14,7 @@ the project's dependencies.
```xml
<target name="dependency-check" description="Dependency-Check Analysis">
<dependency-check applicationname="Hello World"
<dependency-check projectname="Hello World"
reportoutputdirectory="${basedir}"
reportformat="ALL">
@@ -19,24 +25,24 @@ the project's dependencies.
</target>
```
Configuration
====================
The following properties can be set on the dependency-check-maven plugin.
Configuration: dependency-check Task
--------------------
The following properties can be set on the dependency-check-update task.
Property | Description | Default Value
---------------------|------------------------------------|------------------
autoUpdate | Sets whether auto-updating of the NVD CVE/CPE data is enabled. It is not recommended that this be turned to false. | true
externalReport | When using as a Site plugin this parameter sets whether or not the external report format should be used. | false
outputDirectory | The location to write the report(s). Note, this is not used if generating the report as part of a `mvn site` build | 'target'
failBuildOnCVSS | Specifies if the build should be failed if a CVSS score above a specified level is identified. The default is 11 which means since the CVSS scores are 0-10, by default the build will never fail. | 11
format | The report format to be generated (HTML, XML, VULN, ALL). This configuration option has no affect if using this within the Site plugin unless the externalReport is set to true. | HTML
logFile | The file path to write verbose logging information. | &nbsp;
suppressionFile | The file path to the XML suppression file \- used to suppress [false positives](../suppression.html) | &nbsp;
proxyServer | The Proxy Server. | &nbsp;
proxyPort | The Proxy Port. | &nbsp;
proxyUsername | Defines the proxy user name. | &nbsp;
proxyPassword | Defines the proxy password. | &nbsp;
connectionTimeout | The URL Connection Timeout. | &nbsp;
Property | Description | Default Value
----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------
autoUpdate | Sets whether auto-updating of the NVD CVE/CPE data is enabled. It is not recommended that this be turned to false. | true
cveValidForHours | Sets the number of hours to wait before checking for new updates from the NVD | 4
failBuildOnCVSS | Specifies if the build should be failed if a CVSS score above a specified level is identified. The default is 11 which means since the CVSS scores are 0-10, by default the build will never fail. | 11
projectName | The name of the project being scanned. | Dependency-Check
reportFormat | The report format to be generated (HTML, XML, VULN, ALL). This configuration option has no affect if using this within the Site plugin unless the externalReport is set to true. | HTML
reportOutputDirectory | The location to write the report(s). Note, this is not used if generating the report as part of a `mvn site` build | 'target'
suppressionFile | The file path to the XML suppression file \- used to suppress [false positives](../general/suppression.html) | &nbsp;
proxyServer | The Proxy Server. | &nbsp;
proxyPort | The Proxy Port. | &nbsp;
proxyUsername | Defines the proxy user name. | &nbsp;
proxyPassword | Defines the proxy password. | &nbsp;
connectionTimeout | The URL Connection Timeout. | &nbsp;
Analyzer Configuration
====================
@@ -46,31 +52,39 @@ Note, that specific analyzers will automatically disable themselves if no file
types that they support are detected - so specifically disabling them may not
be needed.
Property | Description | Default Value
------------------------|---------------------------------------------------------------------------|------------------
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. | &nbsp;
jarAnalyzer | Sets whether the Jar 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
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. | &nbsp;
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
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. | &nbsp;
Property | Description | Default Value
------------------------------|---------------------------------------------------------------------------|------------------
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. | &nbsp;
jarAnalyzer | Sets whether the Jar 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
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 web service endpoint (example http://domain.enterprise/nexus/service/local/). If not set the Nexus Analyzer will be disabled. | &nbsp;
nexusUsesProxy | Whether or not the defined proxy should be used when connecting to Nexus. | true
pyDistributionAnalyzerEnabled | Sets whether the Python Distribution Analyzer will be used. | true
pyPackageAnalyzerEnabled | Sets whether the Python Package Analyzer will be used. | true
rubygemsAnalyzerEnabled | Sets whether the Ruby Gemspec Analyzer will be used. | true
opensslAnalyzerEnabled | Sets whether or not the openssl Analyzer should be used. | true
cmakeAnalyzerEnabled | Sets whether or not the CMake Analyzer should be used. | true
autoconfAnalyzerEnabled | Sets whether or not the autoconf Analyzer should be used. | true
composerAnalyzerEnabled | Sets whether or not the PHP Composer Lock File Analyzer should be used. | true
nodeAnalyzerEnabled | Sets whether or not the Node.js Analyzer should 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
pathToMono | The path to Mono for .NET assembly analysis on non-windows systems. | &nbsp;
Advanced Configuration
====================
The following properties can be configured in the plugin. However, they are less frequently changed. One exception
may be the cvedUrl properties, which can be used to host a mirror of the NVD within an enterprise environment.
Property | Description | Default Value
---------------------|-------------------------------------------------------------------------|------------------
cveUrl12Modified | URL for the modified CVE 1.2 | http://nvd.nist.gov/download/nvdcve-modified.xml
cveUrl20Modified | URL for the modified CVE 2.0 | http://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-modified.xml
cveUrl12Base | Base URL for each year's CVE 1.2, the %d will be replaced with the year | http://nvd.nist.gov/download/nvdcve-%d.xml
cveUrl20Base | Base URL for each year's CVE 2.0, the %d will be replaced with the year | http://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-%d.xml
dataDirectory | Data directory to hold SQL CVEs contents. This should generally not be changed. | &nbsp;
Property | Description | Default Value
---------------------|--------------------------------------------------------------------------|------------------
cveUrl12Modified | URL for the modified CVE 1.2. | http://nvd.nist.gov/download/nvdcve-modified.xml
cveUrl20Modified | URL for the modified CVE 2.0. | http://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-modified.xml
cveUrl12Base | Base URL for each year's CVE 1.2, the %d will be replaced with the year. | http://nvd.nist.gov/download/nvdcve-%d.xml
cveUrl20Base | Base URL for each year's CVE 2.0, the %d will be replaced with the year. | http://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-%d.xml
dataDirectory | Data directory that is used to store the local copy of the NVD. This should generally not be changed. | data
databaseDriverName | The name of the database driver. Example: org.h2.Driver. | &nbsp;
databaseDriverPath | The path to the database driver JAR file; only used if the driver is not in the class path. | &nbsp;
connectionString | The connection string used to connect to the database. | &nbsp;

View File

@@ -0,0 +1,35 @@
About
====================
OWASP dependency-check-ant is an Ant Task that uses dependency-check-core to detect publicly
disclosed vulnerabilities associated with the project's dependencies. The task will
generate a report listing the dependency, any identified Common Platform Enumeration (CPE)
identifiers, and the associated Common Vulnerability and Exposure (CVE) entries.
Installation
====================
1. Download dependency-check-ant from [bintray here](http://dl.bintray.com/jeremy-long/owasp/dependency-check-ant-${project.version}-release.zip).
2. Unzip the archive
3. Add the taskdef to your build.xml:
```xml
<!-- Set the value to the installation directory's path -->
<property name="dependency-check.home" value="C:/tools/dependency-check-ant"/>
<path id="dependency-check.path">
<pathelement location="${dependency-check.home}/dependency-check-ant.jar"/>
</path>
<taskdef resource="dependency-check-taskdefs.properties">
<classpath refid="dependency-check.path" />
</taskdef>
```
4. Use the defined taskdefs:
* [dependency-check](configuration.html) - the primary task used to check the project dependencies.
* [dependency-check-purge](config-purge.html) - deletes the local copy of the NVD; this should rarely be used (if ever).
* [dependency-check-update](config-update.html) - downloads and updates the local copy of the NVD.
It is important to understand that the first time this task is executed it may
take 10 minutes or more as it downloads and processes the data from the National
Vulnerability Database (NVD) hosted by NIST: https://nvd.nist.gov
After the first batch download, as long as the task is executed at least once every
seven days the update will only take a few seconds.

View File

@@ -1,26 +0,0 @@
Installation
====================
Download dependency-check-ant from [bintray here](http://dl.bintray.com/jeremy-long/owasp/dependency-check-ant-${project.version}.jar).
To install dependency-check-ant place the dependency-check-ant-${project.version}.jar into
the lib directory of your Ant instalation directory. Once installed you can add
the taskdef to you build.xml and add the task to a new or existing target:
```xml
<taskdef name="dependency-check" classname="org.owasp.dependencycheck.taskdefs.DependencyCheckTask"/>
```
If you do not want to install dependency-check-ant into your ant's lib directory when you define the task def you
must add the classpath to the taskdef:
```xml
<taskdef name="dependency-check" classname="org.owasp.dependencycheck.taskdefs.DependencyCheckTask">
<classpath path="[path]/[to]/dependency-check-ant-${project.version}.jar"/>
</taskdef>
```
It is important to understand that the first time this task is executed it may
take 20 minutes or more as it downloads and processes the data from the National
Vulnerability Database (NVD) hosted by NIST: https://nvd.nist.gov
After the first batch download, as long as the task is executed at least once every
seven days the update will only take a few seconds.

View File

@@ -1,33 +0,0 @@
Usage
====================
First, add the dependency-check-ant taskdef to your build.xml (see the [installation guide](installation.html):
```xml
<taskdef name="dependency-check" classname="org.owasp.dependencycheck.taskdefs.DependencyCheckTask"/>
```
Or
```xml
<taskdef name="dependency-check" classname="org.owasp.dependencycheck.taskdefs.DependencyCheckTask">
<classpath path="[path]/[to]/dependency-check-ant-${project.version}.jar"/>
</taskdef>
```
Next, add the task to a target of your choosing:
```xml
<target name="dependency-check" description="Dependency-Check Analysis">
<dependency-check applicationname="Hello World"
autoupdate="true"
reportoutputdirectory="${basedir}"
reportformat="HTML">
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
</dependency-check>
</target>
```
See the [configuration guide](configuration.html) for more information.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -18,7 +18,9 @@ Copyright (c) 2013 Jeremy Long. All Rights Reserved.
-->
<project name="dependency-check-ant">
<bannerLeft>
<name>dependency-check-ant</name>
<name>OWASP dependency-check-ant</name>
<alt>OWASP dependency-check-ant</alt>
<src>./images/dc-ant.svg</src>
</bannerLeft>
<body>
<breadcrumbs>
@@ -26,10 +28,8 @@ Copyright (c) 2013 Jeremy Long. All Rights Reserved.
</breadcrumbs>
<menu name="Getting Started">
<item name="Installation" href="installation.html"/>
<item name="Usage" href="usage.html"/>
<item name="Configuration" href="configuration.html"/>
</menu>
<menu ref="Project Documentation" />
<menu ref="reports" />
</body>
</project>

View File

@@ -18,34 +18,41 @@
package org.owasp.dependencycheck.taskdefs;
import java.io.File;
import org.apache.tools.ant.BuildFileTest;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.BuildFileRule;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.owasp.dependencycheck.data.nvdcve.BaseDBTestCase;
import org.junit.rules.ExpectedException;
import org.owasp.dependencycheck.BaseDBTestCase;
import org.owasp.dependencycheck.utils.Settings;
import static org.junit.Assert.assertTrue;
/**
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
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
public class DependencyCheckTaskTest {
@Rule
public BuildFileRule buildFileRule = new BuildFileRule();
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Before
@Override
public void setUp() throws Exception {
Settings.initialize();
BaseDBTestCase.ensureDBExists();
final String buildFile = this.getClass().getClassLoader().getResource("build.xml").getPath();
configureProject(buildFile);
buildFileRule.configureProject(buildFile);
}
@After
@Override
public void tearDown() {
//no cleanup...
//executeTarget("cleanup");
@@ -63,7 +70,7 @@ public class DependencyCheckTaskTest extends BuildFileTest {
throw new Exception("Unable to delete 'target/DependencyCheck-Report.html' prior to test.");
}
}
executeTarget("test.fileset");
buildFileRule.executeTarget("test.fileset");
assertTrue("DependencyCheck report was not generated", report.exists());
@@ -82,7 +89,7 @@ public class DependencyCheckTaskTest extends BuildFileTest {
throw new Exception("Unable to delete 'target/DependencyCheck-Report.xml' prior to test.");
}
}
executeTarget("test.filelist");
buildFileRule.executeTarget("test.filelist");
assertTrue("DependencyCheck report was not generated", report.exists());
}
@@ -100,7 +107,7 @@ public class DependencyCheckTaskTest extends BuildFileTest {
throw new Exception("Unable to delete 'target/DependencyCheck-Vulnerability.html' prior to test.");
}
}
executeTarget("test.dirset");
buildFileRule.executeTarget("test.dirset");
assertTrue("DependencyCheck report was not generated", report.exists());
}
@@ -109,7 +116,7 @@ public class DependencyCheckTaskTest extends BuildFileTest {
*/
@Test
public void testGetFailBuildOnCVSS() {
expectBuildException("failCVSS", "asdfasdfscore");
System.out.println(this.getOutput());
expectedException.expect(BuildException.class);
buildFileRule.executeTarget("failCVSS");
}
}

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="Dependency-Check Test Build" default="test.fileset" basedir=".">
<taskdef name="dependency-check" classname="org.owasp.dependencycheck.taskdefs.DependencyCheckTask" />
<taskdef name="dependency-check" classname="org.owasp.dependencycheck.taskdefs.Check" />
<target name="test.fileset">
<dependency-check

View File

@@ -19,6 +19,6 @@ Copyright & License
Dependency-Check is Copyright (c) 2012-2014 Jeremy Long. All Rights Reserved.
Permission to modify and redistribute is granted under the terms of the Apache 2.0 license. See the [LICENSE.txt](https://github.com/jeremylong/DependencyCheck/dependency-check-cli/blob/master/LICENSE.txt) file for the full license.
Permission to modify and redistribute is granted under the terms of the Apache 2.0 license. See the [LICENSE.txt](https://raw.githubusercontent.com/jeremylong/DependencyCheck/master/LICENSE.txt) file for the full license.
Dependency-Check Command Line makes use of other open source libraries. Please see the [NOTICE.txt](https://github.com/jeremylong/DependencyCheck/dependency-check-cli/blob/master/NOTICES.txt) file for more information.
Dependency-Check Command Line makes use of other open source libraries. Please see the [NOTICE.txt](https://raw.githubusercontent.com/jeremylong/DependencyCheck/master/dependency-check-cli/NOTICE.txt) file for more information.

View File

@@ -20,7 +20,7 @@ Copyright (c) 2012 - Jeremy Long. All Rights Reserved.
<parent>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-parent</artifactId>
<version>1.2.9</version>
<version>1.3.2</version>
</parent>
<artifactId>dependency-check-cli</artifactId>
@@ -44,6 +44,7 @@ Copyright (c) 2012 - Jeremy Long. All Rights Reserved.
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>logback.xml</include>
</includes>
<filtering>true</filtering>
</resource>
@@ -123,10 +124,6 @@ Copyright (c) 2012 - Jeremy Long. All Rights Reserved.
</systemProperties>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>appassembler-maven-plugin</artifactId>
@@ -177,100 +174,10 @@ Copyright (c) 2012 - Jeremy Long. All Rights Reserved.
</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>
<version>${reporting.checkstyle-plugin.version}</version>
<configuration>
<enableRulesSummary>false</enableRulesSummary>
<enableFilesSummary>false</enableFilesSummary>
@@ -283,7 +190,7 @@ Copyright (c) 2012 - Jeremy Long. All Rights Reserved.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.1</version>
<version>${reporting.pmd-plugin.version}</version>
<configuration>
<targetJdk>1.6</targetJdk>
<linkXref>true</linkXref>
@@ -299,18 +206,12 @@ Copyright (c) 2012 - Jeremy Long. All Rights Reserved.
</rulesets>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>2.5.3</version>
</plugin>
</plugins>
</reporting>
<dependencies>
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.owasp</groupId>
@@ -322,5 +223,27 @@ Copyright (c) 2012 - Jeremy Long. All Rights Reserved.
<artifactId>dependency-check-utils</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.ant</groupId>
<artifactId>ant-launcher</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>

View File

@@ -3,8 +3,7 @@
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="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>
<formats>
<format>zip</format>
@@ -12,25 +11,41 @@
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<outputDirectory>/</outputDirectory>
<directory>${project.build.directory}/release</directory>
<outputDirectory>dependency-check/bin</outputDirectory>
<directory>${project.build.directory}/release/bin</directory>
<includes>
<include>*.sh</include>
</includes>
<fileMode>0755</fileMode>
</fileSet>
<fileSet>
<outputDirectory>dependency-check/bin</outputDirectory>
<directory>${project.build.directory}/release/bin</directory>
<includes>
<include>*.bat</include>
</includes>
</fileSet>
<fileSet>
<outputDirectory>dependency-check/repo</outputDirectory>
<directory>${project.build.directory}/release/repo</directory>
</fileSet>
<fileSet>
<outputDirectory>dependency-check</outputDirectory>
<includes>
<include>LICENSE*</include>
<include>NOTICE*</include>
</includes>
</fileSet>
<fileSet>
<outputDirectory>licenses</outputDirectory>
<outputDirectory>dependency-check/licenses</outputDirectory>
<directory>${basedir}/src/main/resources/META-INF/licenses</directory>
</fileSet>
<fileSet>
<outputDirectory>licenses</outputDirectory>
<outputDirectory>dependency-check/licenses</outputDirectory>
<directory>${basedir}/../dependency-check-core/src/main/resources/META-INF/licenses</directory>
</fileSet>
<fileSet>
<outputDirectory>/</outputDirectory>
<outputDirectory>dependency-check</outputDirectory>
<directory>${basedir}</directory>
<includes>
<include>README.md</include>

View File

@@ -17,43 +17,40 @@
*/
package org.owasp.dependencycheck;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.cli.ParseException;
import org.apache.commons.lang.StringUtils;
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.dependency.Dependency;
import org.owasp.dependencycheck.org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.DirectoryScanner;
import org.owasp.dependencycheck.reporting.ReportGenerator;
import org.owasp.dependencycheck.utils.LogUtils;
import org.owasp.dependencycheck.utils.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.core.FileAppender;
import org.slf4j.impl.StaticLoggerBinder;
/**
* The command line interface for the DependencyCheck application.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class App {
/**
* The location of the log properties configuration file.
*/
private static final String LOG_PROPERTIES_FILE = "log.properties";
/**
* The logger.
*/
private static final Logger LOGGER = Logger.getLogger(App.class.getName());
private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
/**
* The main method for the application.
@@ -90,17 +87,43 @@ public class App {
return;
}
final InputStream in = App.class.getClassLoader().getResourceAsStream(LOG_PROPERTIES_FILE);
LogUtils.prepareLogger(in, cli.getVerboseLog());
if (cli.getVerboseLog() != null) {
prepareLogger(cli.getVerboseLog());
}
if (cli.isGetVersion()) {
if (cli.isPurge()) {
if (cli.getConnectionString() != null) {
LOGGER.error("Unable to purge the database when using a non-default connection string");
} else {
populateSettings(cli);
File db;
try {
db = new File(Settings.getDataDirectory(), "dc.h2.db");
if (db.exists()) {
if (db.delete()) {
LOGGER.info("Database file purged; local copy of the NVD has been removed");
} else {
LOGGER.error("Unable to delete '{}'; please delete the file manually", db.getAbsolutePath());
}
} else {
LOGGER.error("Unable to purge database; the database file does not exists: {}", db.getAbsolutePath());
}
} catch (IOException ex) {
LOGGER.error("Unable to delete the database");
}
}
} else if (cli.isGetVersion()) {
cli.printVersionInfo();
} else if (cli.isUpdateOnly()) {
populateSettings(cli);
runUpdateOnly();
} else if (cli.isRunScan()) {
populateSettings(cli);
try {
runScan(cli.getReportDirectory(), cli.getReportFormat(), cli.getApplicationName(), cli.getScanFiles(), cli.getExcludeList());
runScan(cli.getReportDirectory(), cli.getReportFormat(), cli.getProjectName(), cli.getScanFiles(),
cli.getExcludeList(), cli.getSymLinkDepth());
} catch (InvalidScanPathException ex) {
Logger.getLogger(App.class.getName()).log(Level.SEVERE, "An invalid scan path was detected; unable to scan '//*' paths");
LOGGER.error("An invalid scan path was detected; unable to scan '//*' paths");
}
} else {
cli.printHelp();
@@ -115,55 +138,52 @@ public class App {
* @param applicationName the application name for the report
* @param files the files/directories to scan
* @param excludes the patterns for files/directories to exclude
* @param symLinkDepth the depth that symbolic links will be followed
*
* @throws InvalidScanPathException thrown if the path to scan starts with "//"
*/
private void runScan(String reportDirectory, String outputFormat, String applicationName, String[] files,
String[] excludes) throws InvalidScanPathException {
String[] excludes, int symLinkDepth) throws InvalidScanPathException {
Engine engine = null;
try {
engine = new Engine();
List<String> antStylePaths = new ArrayList<String>();
if (excludes == null || excludes.length == 0) {
for (String file : files) {
if (file.contains("*") || file.contains("?")) {
antStylePaths.add(file);
} else {
engine.scan(file);
}
}
} else {
antStylePaths = Arrays.asList(files);
final List<String> antStylePaths = new ArrayList<String>();
for (String file : files) {
final String antPath = ensureCanonicalPath(file);
antStylePaths.add(antPath);
}
final Set<File> paths = new HashSet<File>();
for (String file : antStylePaths) {
LOGGER.debug("Scanning {}", file);
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 {
final int pos = getLastFileSeparator(include);
final String tmpBase = include.substring(0, pos);
final String tmpInclude = include.substring(pos + 1);
if (tmpInclude.indexOf('*') >= 0 || tmpInclude.indexOf('?') >= 0
|| (new File(include)).isFile()) {
baseDir = new File(tmpBase);
include = tmpInclude;
} else {
baseDir = new File(tmp);
include = include.substring(pos + 1);
baseDir = new File(tmpBase, tmpInclude);
include = "**/*";
}
} else { //no path info - must just be a file in the working directory
baseDir = new File(".");
}
//LOGGER.debug("baseDir: {}", baseDir);
//LOGGER.debug("include: {}", include);
scanner.setBasedir(baseDir);
scanner.setIncludes(include);
final String[] includes = {include};
scanner.setIncludes(includes);
scanner.setMaxLevelsOfSymlinks(symLinkDepth);
if (symLinkDepth <= 0) {
scanner.setFollowSymlinks(false);
}
if (excludes != null && excludes.length > 0) {
scanner.addExcludes(excludes);
}
@@ -171,6 +191,7 @@ public class App {
if (scanner.getIncludedFilesCount() > 0) {
for (String s : scanner.getIncludedFiles()) {
final File f = new File(baseDir, s);
LOGGER.debug("Found file {}", f.toString());
paths.add(f);
}
}
@@ -186,7 +207,7 @@ public class App {
cve.open();
prop = cve.getDatabaseProperties();
} catch (DatabaseException ex) {
LOGGER.log(Level.FINE, "Unable to retrieve DB Properties", ex);
LOGGER.debug("Unable to retrieve DB Properties", ex);
} finally {
if (cve != null) {
cve.close();
@@ -196,15 +217,33 @@ public class App {
try {
report.generateReports(reportDirectory, outputFormat);
} catch (IOException ex) {
LOGGER.log(Level.SEVERE, "There was an IO error while attempting to generate the report.");
LOGGER.log(Level.FINE, null, ex);
LOGGER.error("There was an IO error while attempting to generate the report.");
LOGGER.debug("", ex);
} catch (Throwable ex) {
LOGGER.log(Level.SEVERE, "There was an error while attempting to generate the report.");
LOGGER.log(Level.FINE, null, ex);
LOGGER.error("There was an error while attempting to generate the report.");
LOGGER.debug("", ex);
}
} catch (DatabaseException ex) {
LOGGER.log(Level.SEVERE, "Unable to connect to the dependency-check database; analysis has stopped");
LOGGER.log(Level.FINE, "", ex);
LOGGER.error("Unable to connect to the dependency-check database; analysis has stopped");
LOGGER.debug("", ex);
} finally {
if (engine != null) {
engine.cleanup();
}
}
}
/**
* Only executes the update phase of dependency-check.
*/
private void runUpdateOnly() {
Engine engine = null;
try {
engine = new Engine();
engine.doUpdates();
} catch (DatabaseException ex) {
LOGGER.error("Unable to connect to the dependency-check database; analysis has stopped");
LOGGER.debug("", ex);
} finally {
if (engine != null) {
engine.cleanup();
@@ -215,8 +254,8 @@ public class App {
/**
* Updates the global Settings.
*
* @param cli a reference to the CLI Parser that contains the command line arguments used to set the corresponding
* settings in the core engine.
* @param cli a reference to the CLI Parser that contains the command line arguments used to set the corresponding settings in
* the core engine.
*/
private void populateSettings(CliParser cli) {
@@ -229,12 +268,6 @@ public class App {
final String dataDirectory = cli.getDataDirectory();
final File propertiesFile = cli.getPropertiesFile();
final String suppressionFile = cli.getSuppressionFile();
final boolean jarDisabled = cli.isJarDisabled();
final boolean archiveDisabled = cli.isArchiveDisabled();
final boolean assemblyDisabled = cli.isAssemblyDisabled();
final boolean nuspecDisabled = cli.isNuspecDisabled();
final boolean centralDisabled = cli.isCentralDisabled();
final boolean nexusDisabled = cli.isNexusDisabled();
final String nexusUrl = cli.getNexusUrl();
final String databaseDriverName = cli.getDatabaseDriverName();
final String databaseDriverPath = cli.getDatabaseDriverPath();
@@ -243,18 +276,21 @@ public class App {
final String databasePassword = cli.getDatabasePassword();
final String additionalZipExtensions = cli.getAdditionalZipExtensions();
final String pathToMono = cli.getPathToMono();
final String cveMod12 = cli.getModifiedCve12Url();
final String cveMod20 = cli.getModifiedCve20Url();
final String cveBase12 = cli.getBaseCve12Url();
final String cveBase20 = cli.getBaseCve20Url();
final Integer cveValidForHours = cli.getCveValidForHours();
if (propertiesFile != null) {
try {
Settings.mergeProperties(propertiesFile);
} catch (FileNotFoundException ex) {
final String msg = String.format("Unable to load properties file '%s'", propertiesFile.getPath());
LOGGER.log(Level.SEVERE, msg);
LOGGER.log(Level.FINE, null, ex);
LOGGER.error("Unable to load properties file '{}'", propertiesFile.getPath());
LOGGER.debug("", ex);
} catch (IOException ex) {
final String msg = String.format("Unable to find properties file '%s'", propertiesFile.getPath());
LOGGER.log(Level.SEVERE, msg);
LOGGER.log(Level.FINE, null, ex);
LOGGER.error("Unable to find properties file '{}'", propertiesFile.getPath());
LOGGER.debug("", ex);
}
}
// We have to wait until we've merged the properties before attempting to set whether we use
@@ -274,57 +310,134 @@ public class App {
Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDir.getAbsolutePath());
}
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, autoUpdate);
if (proxyServer != null && !proxyServer.isEmpty()) {
Settings.setString(Settings.KEYS.PROXY_SERVER, proxyServer);
}
if (proxyPort != null && !proxyPort.isEmpty()) {
Settings.setString(Settings.KEYS.PROXY_PORT, proxyPort);
}
if (proxyUser != null && !proxyUser.isEmpty()) {
Settings.setString(Settings.KEYS.PROXY_USERNAME, proxyUser);
}
if (proxyPass != null && !proxyPass.isEmpty()) {
Settings.setString(Settings.KEYS.PROXY_PASSWORD, proxyPass);
}
if (connectionTimeout != null && !connectionTimeout.isEmpty()) {
Settings.setString(Settings.KEYS.CONNECTION_TIMEOUT, connectionTimeout);
}
if (suppressionFile != null && !suppressionFile.isEmpty()) {
Settings.setString(Settings.KEYS.SUPPRESSION_FILE, suppressionFile);
}
Settings.setStringIfNotEmpty(Settings.KEYS.PROXY_SERVER, proxyServer);
Settings.setStringIfNotEmpty(Settings.KEYS.PROXY_PORT, proxyPort);
Settings.setStringIfNotEmpty(Settings.KEYS.PROXY_USERNAME, proxyUser);
Settings.setStringIfNotEmpty(Settings.KEYS.PROXY_PASSWORD, proxyPass);
Settings.setStringIfNotEmpty(Settings.KEYS.CONNECTION_TIMEOUT, connectionTimeout);
Settings.setStringIfNotEmpty(Settings.KEYS.SUPPRESSION_FILE, suppressionFile);
Settings.setIntIfNotNull(Settings.KEYS.CVE_CHECK_VALID_FOR_HOURS, cveValidForHours);
//File Type Analyzer Settings
Settings.setBoolean(Settings.KEYS.ANALYZER_JAR_ENABLED, !jarDisabled);
Settings.setBoolean(Settings.KEYS.ANALYZER_ARCHIVE_ENABLED, !archiveDisabled);
Settings.setBoolean(Settings.KEYS.ANALYZER_NUSPEC_ENABLED, !nuspecDisabled);
Settings.setBoolean(Settings.KEYS.ANALYZER_ASSEMBLY_ENABLED, !assemblyDisabled);
Settings.setBoolean(Settings.KEYS.ANALYZER_JAR_ENABLED, !cli.isJarDisabled());
Settings.setBoolean(Settings.KEYS.ANALYZER_ARCHIVE_ENABLED, !cli.isArchiveDisabled());
Settings.setBoolean(Settings.KEYS.ANALYZER_PYTHON_DISTRIBUTION_ENABLED, !cli.isPythonDistributionDisabled());
Settings.setBoolean(Settings.KEYS.ANALYZER_PYTHON_PACKAGE_ENABLED, !cli.isPythonPackageDisabled());
Settings.setBoolean(Settings.KEYS.ANALYZER_AUTOCONF_ENABLED, !cli.isAutoconfDisabled());
Settings.setBoolean(Settings.KEYS.ANALYZER_CMAKE_ENABLED, !cli.isCmakeDisabled());
Settings.setBoolean(Settings.KEYS.ANALYZER_NUSPEC_ENABLED, !cli.isNuspecDisabled());
Settings.setBoolean(Settings.KEYS.ANALYZER_ASSEMBLY_ENABLED, !cli.isAssemblyDisabled());
Settings.setBoolean(Settings.KEYS.ANALYZER_BUNDLE_AUDIT_ENABLED, !cli.isBundleAuditDisabled());
Settings.setBoolean(Settings.KEYS.ANALYZER_OPENSSL_ENABLED, !cli.isOpenSSLDisabled());
Settings.setBoolean(Settings.KEYS.ANALYZER_COMPOSER_LOCK_ENABLED, !cli.isComposerDisabled());
Settings.setBoolean(Settings.KEYS.ANALYZER_NODE_PACKAGE_ENABLED, !cli.isNodeJsDisabled());
Settings.setBoolean(Settings.KEYS.ANALYZER_RUBY_GEMSPEC_ENABLED, !cli.isRubyGemspecDisabled());
Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, !cli.isCentralDisabled());
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, !cli.isNexusDisabled());
Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, !centralDisabled);
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, !nexusDisabled);
if (nexusUrl != null && !nexusUrl.isEmpty()) {
Settings.setString(Settings.KEYS.ANALYZER_NEXUS_URL, nexusUrl);
Settings.setStringIfNotEmpty(Settings.KEYS.ANALYZER_BUNDLE_AUDIT_PATH, cli.getPathToBundleAudit());
Settings.setStringIfNotEmpty(Settings.KEYS.ANALYZER_NEXUS_URL, nexusUrl);
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_USES_PROXY, nexusUsesProxy);
Settings.setStringIfNotEmpty(Settings.KEYS.DB_DRIVER_NAME, databaseDriverName);
Settings.setStringIfNotEmpty(Settings.KEYS.DB_DRIVER_PATH, databaseDriverPath);
Settings.setStringIfNotEmpty(Settings.KEYS.DB_CONNECTION_STRING, connectionString);
Settings.setStringIfNotEmpty(Settings.KEYS.DB_USER, databaseUser);
Settings.setStringIfNotEmpty(Settings.KEYS.DB_PASSWORD, databasePassword);
Settings.setStringIfNotEmpty(Settings.KEYS.ADDITIONAL_ZIP_EXTENSIONS, additionalZipExtensions);
Settings.setStringIfNotEmpty(Settings.KEYS.ANALYZER_ASSEMBLY_MONO_PATH, pathToMono);
if (cveBase12 != null && !cveBase12.isEmpty()) {
Settings.setString(Settings.KEYS.CVE_SCHEMA_1_2, cveBase12);
Settings.setString(Settings.KEYS.CVE_SCHEMA_2_0, cveBase20);
Settings.setString(Settings.KEYS.CVE_MODIFIED_12_URL, cveMod12);
Settings.setString(Settings.KEYS.CVE_MODIFIED_20_URL, cveMod20);
}
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_PROXY, nexusUsesProxy);
if (databaseDriverName != null && !databaseDriverName.isEmpty()) {
Settings.setString(Settings.KEYS.DB_DRIVER_NAME, databaseDriverName);
}
/**
* Creates a file appender and adds it to logback.
*
* @param verboseLog the path to the verbose log file
*/
private void prepareLogger(String verboseLog) {
final StaticLoggerBinder loggerBinder = StaticLoggerBinder.getSingleton();
final LoggerContext context = (LoggerContext) loggerBinder.getLoggerFactory();
final PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setPattern("%d %C:%L%n%-5level - %msg%n");
encoder.setContext(context);
encoder.start();
final FileAppender fa = new FileAppender();
fa.setAppend(true);
fa.setEncoder(encoder);
fa.setContext(context);
fa.setFile(verboseLog);
final File f = new File(verboseLog);
String name = f.getName();
final int i = name.lastIndexOf('.');
if (i > 1) {
name = name.substring(0, i);
}
if (databaseDriverPath != null && !databaseDriverPath.isEmpty()) {
Settings.setString(Settings.KEYS.DB_DRIVER_PATH, databaseDriverPath);
fa.setName(name);
fa.start();
final ch.qos.logback.classic.Logger rootLogger = context.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME);
rootLogger.addAppender(fa);
}
/**
* Takes a path and resolves it to be a canonical &amp; absolute path. The caveats are that this method will take an Ant style
* file selector path (../someDir/**\/*.jar) and convert it to an absolute/canonical path (at least to the left of the first *
* or ?).
*
* @param path the path to canonicalize
* @return the canonical path
*/
protected String ensureCanonicalPath(String path) {
String basePath = null;
String wildCards = null;
final String file = path.replace('\\', '/');
if (file.contains("*") || file.contains("?")) {
int pos = getLastFileSeparator(file);
if (pos < 0) {
return file;
}
pos += 1;
basePath = file.substring(0, pos);
wildCards = file.substring(pos);
} else {
basePath = file;
}
if (connectionString != null && !connectionString.isEmpty()) {
Settings.setString(Settings.KEYS.DB_CONNECTION_STRING, connectionString);
File f = new File(basePath);
try {
f = f.getCanonicalFile();
if (wildCards != null) {
f = new File(f, wildCards);
}
} catch (IOException ex) {
LOGGER.warn("Invalid path '{}' was provided.", path);
LOGGER.debug("Invalid path provided", ex);
}
if (databaseUser != null && !databaseUser.isEmpty()) {
Settings.setString(Settings.KEYS.DB_USER, databaseUser);
}
if (databasePassword != null && !databasePassword.isEmpty()) {
Settings.setString(Settings.KEYS.DB_PASSWORD, databasePassword);
}
if (additionalZipExtensions != null && !additionalZipExtensions.isEmpty()) {
Settings.setString(Settings.KEYS.ADDITIONAL_ZIP_EXTENSIONS, additionalZipExtensions);
}
if (pathToMono != null && !pathToMono.isEmpty()) {
Settings.setString(Settings.KEYS.ANALYZER_ASSEMBLY_MONO_PATH, pathToMono);
return f.getAbsolutePath().replace('\\', '/');
}
/**
* Returns the position of the last file separator.
*
* @param file a file path
* @return the position of the last file separator
*/
private int getLastFileSeparator(String file) {
if (file.contains("*") || file.contains("?")) {
int p1 = file.indexOf('*');
int p2 = file.indexOf('?');
p1 = p1 > 0 ? p1 : file.length();
p2 = p2 > 0 ? p2 : file.length();
int pos = p1 < p2 ? p1 : p2;
pos = file.lastIndexOf('/', pos);
return pos;
} else {
return file.lastIndexOf('/');
}
}
}

View File

@@ -19,31 +19,32 @@ package org.owasp.dependencycheck;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.logging.Logger;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.OptionGroup;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import org.owasp.dependencycheck.reporting.ReportGenerator.Format;
import org.owasp.dependencycheck.utils.InvalidSettingException;
import org.owasp.dependencycheck.utils.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A utility to parse command line arguments for the DependencyCheck.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public final class CliParser {
/**
* The logger.
*/
private static final Logger LOGGER = Logger.getLogger(CliParser.class.getName());
private static final Logger LOGGER = LoggerFactory.getLogger(CliParser.class);
/**
* The command line.
*/
@@ -76,7 +77,7 @@ public final class CliParser {
* @throws ParseException if the arguments are invalid
*/
private CommandLine parseArgs(String[] args) throws ParseException {
final CommandLineParser parser = new PosixParser();
final CommandLineParser parser = new DefaultParser();
final Options options = createCommandLineOptions();
return parser.parse(options, args);
}
@@ -89,14 +90,27 @@ public final class CliParser {
* @throws ParseException is thrown if there is an exception parsing the command line.
*/
private void validateArgs() throws FileNotFoundException, ParseException {
if (isUpdateOnly() || isRunScan()) {
final String value = line.getOptionValue(ARGUMENT.CVE_VALID_FOR_HOURS);
if (value != null) {
try {
final int i = Integer.parseInt(value);
if (i < 0) {
throw new ParseException("Invalid Setting: cveValidForHours must be a number greater than or equal to 0.");
}
} catch (NumberFormatException ex) {
throw new ParseException("Invalid Setting: cveValidForHours must be a number greater than or equal to 0.");
}
}
}
if (isRunScan()) {
validatePathExists(getScanFiles(), ARGUMENT.SCAN);
validatePathExists(getReportDirectory(), ARGUMENT.OUT);
if (getPathToMono() != null) {
validatePathExists(getPathToMono(), ARGUMENT.PATH_TO_MONO);
}
if (!line.hasOption(ARGUMENT.APP_NAME)) {
throw new ParseException("Missing 'app' argument; the scan cannot be run without the an application name.");
if (!line.hasOption(ARGUMENT.APP_NAME) && !line.hasOption(ARGUMENT.PROJECT)) {
throw new ParseException("Missing '" + ARGUMENT.PROJECT + "' argument; the scan cannot be run without the an project name.");
}
if (line.hasOption(ARGUMENT.OUTPUT_FORMAT)) {
final String format = line.getOptionValue(ARGUMENT.OUTPUT_FORMAT);
@@ -108,6 +122,21 @@ public final class CliParser {
throw new ParseException(msg);
}
}
if ((getBaseCve12Url() != null || getBaseCve20Url() != null || getModifiedCve12Url() != null || getModifiedCve20Url() != null)
&& (getBaseCve12Url() == null || getBaseCve20Url() == null || getModifiedCve12Url() == null || getModifiedCve20Url() == null)) {
final String msg = "If one of the CVE URLs is specified they must all be specified; please add the missing CVE URL.";
throw new ParseException(msg);
}
if (line.hasOption((ARGUMENT.SYM_LINK_DEPTH))) {
try {
final int i = Integer.parseInt(line.getOptionValue(ARGUMENT.SYM_LINK_DEPTH));
if (i < 0) {
throw new ParseException("Symbolic Link Depth (symLink) must be greater than zero.");
}
} catch (NumberFormatException ex) {
throw new ParseException("Symbolic Link Depth (symLink) is not a number.");
}
}
}
}
@@ -191,8 +220,8 @@ public final class CliParser {
final Option help = new Option(ARGUMENT.HELP_SHORT, ARGUMENT.HELP, false,
"Print this message.");
final Option advancedHelp = OptionBuilder.withLongOpt(ARGUMENT.ADVANCED_HELP)
.withDescription("Print the advanced help message.").create();
final Option advancedHelp = Option.builder().longOpt(ARGUMENT.ADVANCED_HELP)
.desc("Print the advanced help message.").build();
final Option version = new Option(ARGUMENT.VERSION_SHORT, ARGUMENT.VERSION,
false, "Print the version information.");
@@ -200,40 +229,48 @@ public final class CliParser {
final Option noUpdate = new Option(ARGUMENT.DISABLE_AUTO_UPDATE_SHORT, ARGUMENT.DISABLE_AUTO_UPDATE,
false, "Disables the automatic updating of the CPE data.");
final Option appName = OptionBuilder.withArgName("name").hasArg().withLongOpt(ARGUMENT.APP_NAME)
.withDescription("The name of the application being scanned. This is a required argument.")
.create(ARGUMENT.APP_NAME_SHORT);
final Option projectName = Option.builder().hasArg().argName("name").longOpt(ARGUMENT.PROJECT)
.desc("The name of the project being scanned. This is a required argument.")
.build();
final Option path = OptionBuilder.withArgName("path").hasArg().withLongOpt(ARGUMENT.SCAN)
.withDescription("The path to scan - this option can be specified multiple times. Ant style"
final Option path = Option.builder(ARGUMENT.SCAN_SHORT).argName("path").hasArg().longOpt(ARGUMENT.SCAN)
.desc("The path to scan - this option can be specified multiple times. Ant style"
+ " paths are supported (e.g. path/**/*.jar).")
.create(ARGUMENT.SCAN_SHORT);
.build();
final Option excludes = OptionBuilder.withArgName("pattern").hasArg().withLongOpt(ARGUMENT.EXCLUDE)
.withDescription("Specify and exclusion pattern. This option can be specified multiple times"
final Option excludes = Option.builder().argName("pattern").hasArg().longOpt(ARGUMENT.EXCLUDE)
.desc("Specify and exclusion pattern. This option can be specified multiple times"
+ " and it accepts Ant style excludsions.")
.create();
.build();
final Option props = OptionBuilder.withArgName("file").hasArg().withLongOpt(ARGUMENT.PROP)
.withDescription("A property file to load.")
.create(ARGUMENT.PROP_SHORT);
final Option props = Option.builder(ARGUMENT.PROP_SHORT).argName("file").hasArg().longOpt(ARGUMENT.PROP)
.desc("A property file to load.")
.build();
final Option out = OptionBuilder.withArgName("path").hasArg().withLongOpt(ARGUMENT.OUT)
.withDescription("The folder to write reports to. This defaults to the current directory. "
final Option out = Option.builder(ARGUMENT.OUT_SHORT).argName("path").hasArg().longOpt(ARGUMENT.OUT)
.desc("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);
.build();
final Option outputFormat = OptionBuilder.withArgName("format").hasArg().withLongOpt(ARGUMENT.OUTPUT_FORMAT)
.withDescription("The output format to write to (XML, HTML, VULN, ALL). The default is HTML.")
.create(ARGUMENT.OUTPUT_FORMAT_SHORT);
final Option outputFormat = Option.builder(ARGUMENT.OUTPUT_FORMAT_SHORT).argName("format").hasArg().longOpt(ARGUMENT.OUTPUT_FORMAT)
.desc("The output format to write to (XML, HTML, VULN, ALL). The default is HTML.")
.build();
final Option verboseLog = OptionBuilder.withArgName("file").hasArg().withLongOpt(ARGUMENT.VERBOSE_LOG)
.withDescription("The file path to write verbose logging information.")
.create(ARGUMENT.VERBOSE_LOG_SHORT);
final Option verboseLog = Option.builder(ARGUMENT.VERBOSE_LOG_SHORT).argName("file").hasArg().longOpt(ARGUMENT.VERBOSE_LOG)
.desc("The file path to write verbose logging information.")
.build();
final Option suppressionFile = OptionBuilder.withArgName("file").hasArg().withLongOpt(ARGUMENT.SUPPRESSION_FILE)
.withDescription("The file path to the suppression XML file.")
.create();
final Option symLinkDepth = Option.builder().argName("depth").hasArg().longOpt(ARGUMENT.SYM_LINK_DEPTH)
.desc("Sets how deep nested symbolic links will be followed; 0 indicates symbolic links will not be followed.")
.build();
final Option suppressionFile = Option.builder().argName("file").hasArg().longOpt(ARGUMENT.SUPPRESSION_FILE)
.desc("The file path to the suppression XML file.")
.build();
final Option cveValidForHours = Option.builder().argName("hours").hasArg().longOpt(ARGUMENT.CVE_VALID_FOR_HOURS)
.desc("The number of hours to wait before checking for new updates from the NVD.")
.build();
//This is an option group because it can be specified more then once.
final OptionGroup og = new OptionGroup();
@@ -244,16 +281,18 @@ public final class CliParser {
options.addOptionGroup(og)
.addOptionGroup(exog)
.addOption(projectName)
.addOption(out)
.addOption(outputFormat)
.addOption(appName)
.addOption(version)
.addOption(help)
.addOption(advancedHelp)
.addOption(noUpdate)
.addOption(symLinkDepth)
.addOption(props)
.addOption(verboseLog)
.addOption(suppressionFile);
.addOption(suppressionFile)
.addOption(cveValidForHours);
}
/**
@@ -266,91 +305,129 @@ public final class CliParser {
@SuppressWarnings("static-access")
private void addAdvancedOptions(final Options options) throws IllegalArgumentException {
final Option data = OptionBuilder.withArgName("path").hasArg().withLongOpt(ARGUMENT.DATA_DIRECTORY)
.withDescription("The location of the H2 Database file. This option should generally not be set.")
.create(ARGUMENT.DATA_DIRECTORY_SHORT);
final Option cve12Base = Option.builder().argName("url").hasArg().longOpt(ARGUMENT.CVE_BASE_12)
.desc("Base URL for each years CVE 1.2, the %d will be replaced with the year. ")
.build();
final Option connectionTimeout = OptionBuilder.withArgName("timeout").hasArg().withLongOpt(ARGUMENT.CONNECTION_TIMEOUT)
.withDescription("The connection timeout (in milliseconds) to use when downloading resources.")
.create(ARGUMENT.CONNECTION_TIMEOUT_SHORT);
final Option cve20Base = Option.builder().argName("url").hasArg().longOpt(ARGUMENT.CVE_BASE_20)
.desc("Base URL for each years CVE 2.0, the %d will be replaced with the year.")
.build();
final Option proxyServer = OptionBuilder.withArgName("server").hasArg().withLongOpt(ARGUMENT.PROXY_SERVER)
.withDescription("The proxy server to use when downloading resources.")
.create();
final Option cve12Modified = Option.builder().argName("url").hasArg().longOpt(ARGUMENT.CVE_MOD_12)
.desc("URL for the modified CVE 1.2.")
.build();
final Option proxyPort = OptionBuilder.withArgName("port").hasArg().withLongOpt(ARGUMENT.PROXY_PORT)
.withDescription("The proxy port to use when downloading resources.")
.create();
final Option cve20Modified = Option.builder().argName("url").hasArg().longOpt(ARGUMENT.CVE_MOD_20)
.desc("URL for the modified CVE 2.0.")
.build();
final Option proxyUsername = OptionBuilder.withArgName("user").hasArg().withLongOpt(ARGUMENT.PROXY_USERNAME)
.withDescription("The proxy username to use when downloading resources.")
.create();
final Option updateOnly = Option.builder().longOpt(ARGUMENT.UPDATE_ONLY)
.desc("Only update the local NVD data cache; no scan will be executed.").build();
final Option proxyPassword = OptionBuilder.withArgName("pass").hasArg().withLongOpt(ARGUMENT.PROXY_PASSWORD)
.withDescription("The proxy password to use when downloading resources.")
.create();
final Option data = Option.builder(ARGUMENT.DATA_DIRECTORY_SHORT).argName("path").hasArg().longOpt(ARGUMENT.DATA_DIRECTORY)
.desc("The location of the H2 Database file. This option should generally not be set.")
.build();
final Option connectionString = OptionBuilder.withArgName("connStr").hasArg().withLongOpt(ARGUMENT.CONNECTION_STRING)
.withDescription("The connection string to the database.")
.create();
final Option nexusUrl = Option.builder().argName("url").hasArg().longOpt(ARGUMENT.NEXUS_URL)
.desc("The url to the Nexus Server's REST API Endpoint (http://domain/nexus/service/local). "
+ "If not set the Nexus Analyzer will be disabled.").build();
final Option dbUser = OptionBuilder.withArgName("user").hasArg().withLongOpt(ARGUMENT.DB_NAME)
.withDescription("The username used to connect to the database.")
.create();
final Option nexusUsesProxy = Option.builder().argName("true/false").hasArg().longOpt(ARGUMENT.NEXUS_USES_PROXY)
.desc("Whether or not the configured proxy should be used when connecting to Nexus.")
.build();
final Option dbPassword = OptionBuilder.withArgName("password").hasArg().withLongOpt(ARGUMENT.DB_PASSWORD)
.withDescription("The password for connecting to the database.")
.create();
final Option additionalZipExtensions = Option.builder().argName("extensions").hasArg()
.longOpt(ARGUMENT.ADDITIONAL_ZIP_EXTENSIONS)
.desc("A comma separated list of additional extensions to be scanned as ZIP files "
+ "(ZIP, EAR, WAR are already treated as zip files)").build();
final Option dbDriver = OptionBuilder.withArgName("driver").hasArg().withLongOpt(ARGUMENT.DB_DRIVER)
.withDescription("The database driver name.")
.create();
final Option pathToMono = Option.builder().argName("path").hasArg().longOpt(ARGUMENT.PATH_TO_MONO)
.desc("The path to Mono for .NET Assembly analysis on non-windows systems.")
.build();
final Option pathToBundleAudit = Option.builder().argName("path").hasArg()
.longOpt(ARGUMENT.PATH_TO_BUNDLE_AUDIT)
.desc("The path to bundle-audit for Gem bundle analysis.").build();
final Option dbDriverPath = OptionBuilder.withArgName("path").hasArg().withLongOpt(ARGUMENT.DB_DRIVER_PATH)
.withDescription("The path to the database driver; note, this does not need to be set unless the JAR is outside of the classpath.")
.create();
final Option connectionTimeout = Option.builder(ARGUMENT.CONNECTION_TIMEOUT_SHORT).argName("timeout").hasArg()
.longOpt(ARGUMENT.CONNECTION_TIMEOUT).desc("The connection timeout (in milliseconds) to use when downloading resources.")
.build();
final Option disableJarAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_JAR)
.withDescription("Disable the Jar Analyzer.")
.create();
final Option disableArchiveAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_ARCHIVE)
.withDescription("Disable the Archive Analyzer.")
.create();
final Option disableNuspecAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_NUSPEC)
.withDescription("Disable the Nuspec Analyzer.")
.create();
final Option disableAssemblyAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_ASSEMBLY)
.withDescription("Disable the .NET Assembly Analyzer.")
.create();
final Option proxyServer = Option.builder().argName("server").hasArg().longOpt(ARGUMENT.PROXY_SERVER)
.desc("The proxy server to use when downloading resources.").build();
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 proxyPort = Option.builder().argName("port").hasArg().longOpt(ARGUMENT.PROXY_PORT)
.desc("The proxy port to use when downloading resources.").build();
final Option disableNexusAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_NEXUS)
.withDescription("Disable the Nexus Analyzer.")
.create();
final Option proxyUsername = Option.builder().argName("user").hasArg().longOpt(ARGUMENT.PROXY_USERNAME)
.desc("The proxy username to use when downloading resources.").build();
final Option nexusUrl = OptionBuilder.withArgName("url").hasArg().withLongOpt(ARGUMENT.NEXUS_URL)
.withDescription("The url to the Nexus Pro Server. If not set the Nexus Analyzer will be disabled.")
.create();
final Option proxyPassword = Option.builder().argName("pass").hasArg().longOpt(ARGUMENT.PROXY_PASSWORD)
.desc("The proxy password to use when downloading resources.").build();
final Option nexusUsesProxy = OptionBuilder.withArgName("true/false").hasArg().withLongOpt(ARGUMENT.NEXUS_USES_PROXY)
.withDescription("Whether or not the configured proxy should be used when connecting to Nexus.")
.create();
final Option connectionString = Option.builder().argName("connStr").hasArg().longOpt(ARGUMENT.CONNECTION_STRING)
.desc("The connection string to the database.").build();
final Option additionalZipExtensions = OptionBuilder.withArgName("extensions").hasArg()
.withLongOpt(ARGUMENT.ADDITIONAL_ZIP_EXTENSIONS)
.withDescription("A comma separated list of additional extensions to be scanned as ZIP files "
+ "(ZIP, EAR, WAR are already treated as zip files)")
.create();
final Option dbUser = Option.builder().argName("user").hasArg().longOpt(ARGUMENT.DB_NAME)
.desc("The username used to connect to the database.").build();
final Option pathToMono = OptionBuilder.withArgName("path").hasArg().withLongOpt(ARGUMENT.PATH_TO_MONO)
.withDescription("The path to Mono for .NET Assembly analysis on non-windows systems.")
.create();
final Option dbPassword = Option.builder().argName("password").hasArg().longOpt(ARGUMENT.DB_PASSWORD)
.desc("The password for connecting to the database.").build();
options.addOption(proxyPort)
final Option dbDriver = Option.builder().argName("driver").hasArg().longOpt(ARGUMENT.DB_DRIVER)
.desc("The database driver name.").build();
final Option dbDriverPath = Option.builder().argName("path").hasArg().longOpt(ARGUMENT.DB_DRIVER_PATH)
.desc("The path to the database driver; note, this does not need to be set unless the JAR is outside of the classpath.")
.build();
final Option disableJarAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_JAR)
.desc("Disable the Jar Analyzer.").build();
final Option disableArchiveAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_ARCHIVE)
.desc("Disable the Archive Analyzer.").build();
final Option disableNuspecAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_NUSPEC)
.desc("Disable the Nuspec Analyzer.").build();
final Option disableAssemblyAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_ASSEMBLY)
.desc("Disable the .NET Assembly Analyzer.").build();
final Option disablePythonDistributionAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_PY_DIST)
.desc("Disable the Python Distribution Analyzer.").build();
final Option disablePythonPackageAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_PY_PKG)
.desc("Disable the Python Package Analyzer.").build();
final Option disableComposerAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_COMPOSER)
.desc("Disable the PHP Composer Analyzer.").build();
final Option disableAutoconfAnalyzer = Option.builder()
.longOpt(ARGUMENT.DISABLE_AUTOCONF)
.desc("Disable the Autoconf Analyzer.").build();
final Option disableOpenSSLAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_OPENSSL)
.desc("Disable the OpenSSL Analyzer.").build();
final Option disableCmakeAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_CMAKE)
.desc("Disable the Cmake Analyzer.").build();
final Option disableCentralAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_CENTRAL)
.desc("Disable the Central Analyzer. If this analyzer is disabled it is likely you also want to disable "
+ "the Nexus Analyzer.").build();
final Option disableNexusAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_NEXUS)
.desc("Disable the Nexus Analyzer.").build();
final Option purge = Option.builder().longOpt(ARGUMENT.PURGE_NVD)
.desc("Purges the local NVD data cache")
.build();
options.addOption(updateOnly)
.addOption(cve12Base)
.addOption(cve20Base)
.addOption(cve12Modified)
.addOption(cve20Modified)
.addOption(proxyPort)
.addOption(proxyServer)
.addOption(proxyUsername)
.addOption(proxyPassword)
@@ -364,13 +441,28 @@ public final class CliParser {
.addOption(disableJarAnalyzer)
.addOption(disableArchiveAnalyzer)
.addOption(disableAssemblyAnalyzer)
.addOption(pathToBundleAudit)
.addOption(disablePythonDistributionAnalyzer)
.addOption(disableCmakeAnalyzer)
.addOption(disablePythonPackageAnalyzer)
.addOption(Option.builder().longOpt(ARGUMENT.DISABLE_RUBYGEMS)
.desc("Disable the Ruby Gemspec Analyzer.").build())
.addOption(Option.builder().longOpt(ARGUMENT.DISABLE_BUNDLE_AUDIT)
.desc("Disable the Ruby Bundler-Audit Analyzer.").build())
.addOption(disableAutoconfAnalyzer)
.addOption(disableComposerAnalyzer)
.addOption(disableOpenSSLAnalyzer)
.addOption(disableNuspecAnalyzer)
.addOption(disableCentralAnalyzer)
.addOption(disableNexusAnalyzer)
.addOption(Option.builder().longOpt(ARGUMENT.DISABLE_NODE_JS)
.desc("Disable the Node.js Package Analyzer.").build())
.addOption(nexusUrl)
.addOption(nexusUsesProxy)
.addOption(additionalZipExtensions)
.addOption(pathToMono);
.addOption(pathToMono)
.addOption(pathToBundleAudit)
.addOption(purge);
}
/**
@@ -380,14 +472,18 @@ public final class CliParser {
* @param options a collection of command line arguments
* @throws IllegalArgumentException thrown if there is an exception
*/
@SuppressWarnings("static-access")
@SuppressWarnings({"static-access", "deprecation"})
private void addDeprecatedOptions(final Options options) throws IllegalArgumentException {
final Option proxyServer = OptionBuilder.withArgName("url").hasArg().withLongOpt(ARGUMENT.PROXY_URL)
.withDescription("The proxy url argument is deprecated, use proxyserver instead.")
.create();
final Option proxyServer = Option.builder().argName("url").hasArg().longOpt(ARGUMENT.PROXY_URL)
.desc("The proxy url argument is deprecated, use proxyserver instead.")
.build();
final Option appName = Option.builder(ARGUMENT.APP_NAME_SHORT).argName("name").hasArg().longOpt(ARGUMENT.APP_NAME)
.desc("The name of the project being scanned.")
.build();
options.addOption(proxyServer);
options.addOption(appName);
}
/**
@@ -417,6 +513,24 @@ public final class CliParser {
return (line != null) && isValid && line.hasOption(ARGUMENT.SCAN);
}
/**
* Returns the symbolic link depth (how deeply symbolic links will be followed).
*
* @return the symbolic link depth
*/
public int getSymLinkDepth() {
int value = 0;
try {
value = Integer.parseInt(line.getOptionValue(ARGUMENT.SYM_LINK_DEPTH, "0"));
if (value < 0) {
value = 0;
}
} catch (NumberFormatException ex) {
LOGGER.debug("Symbolic link was not a number");
}
return value;
}
/**
* Returns true if the disableJar command line argument was specified.
*
@@ -453,6 +567,70 @@ public final class CliParser {
return (line != null) && line.hasOption(ARGUMENT.DISABLE_ASSEMBLY);
}
/**
* Returns true if the disableBundleAudit command line argument was specified.
*
* @return true if the disableBundleAudit command line argument was specified; otherwise false
*/
public boolean isBundleAuditDisabled() {
return (line != null) && line.hasOption(ARGUMENT.DISABLE_BUNDLE_AUDIT);
}
/**
* Returns true if the disablePyDist command line argument was specified.
*
* @return true if the disablePyDist command line argument was specified; otherwise false
*/
public boolean isPythonDistributionDisabled() {
return (line != null) && line.hasOption(ARGUMENT.DISABLE_PY_DIST);
}
/**
* Returns true if the disablePyPkg command line argument was specified.
*
* @return true if the disablePyPkg command line argument was specified; otherwise false
*/
public boolean isPythonPackageDisabled() {
return (line != null) && line.hasOption(ARGUMENT.DISABLE_PY_PKG);
}
/**
* Returns whether the Ruby gemspec analyzer is disabled.
*
* @return true if the {@link ARGUMENT#DISABLE_RUBYGEMS} command line argument was specified; otherwise false
*/
public boolean isRubyGemspecDisabled() {
return (null != line) && line.hasOption(ARGUMENT.DISABLE_RUBYGEMS);
}
/**
* Returns true if the disableCmake command line argument was specified.
*
* @return true if the disableCmake command line argument was specified; otherwise false
*/
public boolean isCmakeDisabled() {
return (line != null) && line.hasOption(ARGUMENT.DISABLE_CMAKE);
}
/**
* Returns true if the disableAutoconf command line argument was specified.
*
* @return true if the disableAutoconf command line argument was specified; otherwise false
*/
public boolean isAutoconfDisabled() {
return (line != null) && line.hasOption(ARGUMENT.DISABLE_AUTOCONF);
}
/**
* Returns true if the disableComposer command line argument was specified.
*
* @return true if the disableComposer command line argument was specified; otherwise false
*/
public boolean isComposerDisabled() {
return (line != null) && line.hasOption(ARGUMENT.DISABLE_COMPOSER);
}
/**
* Returns true if the disableNexus command line argument was specified.
*
@@ -462,6 +640,24 @@ public final class CliParser {
return (line != null) && line.hasOption(ARGUMENT.DISABLE_NEXUS);
}
/**
* Returns true if the disableOpenSSL command line argument was specified.
*
* @return true if the disableOpenSSL command line argument was specified; otherwise false
*/
public boolean isOpenSSLDisabled() {
return (line != null) && line.hasOption(ARGUMENT.DISABLE_OPENSSL);
}
/**
* Returns true if the disableNodeJS command line argument was specified.
*
* @return true if the disableNodeJS command line argument was specified; otherwise false
*/
public boolean isNodeJsDisabled() {
return (line != null) && line.hasOption(ARGUMENT.DISABLE_NODE_JS);
}
/**
* Returns true if the disableCentral command line argument was specified.
*
@@ -494,7 +690,7 @@ public final class CliParser {
// still honor the property if it's set.
if (line == null || !line.hasOption(ARGUMENT.NEXUS_USES_PROXY)) {
try {
return Settings.getBoolean(Settings.KEYS.ANALYZER_NEXUS_PROXY);
return Settings.getBoolean(Settings.KEYS.ANALYZER_NEXUS_USES_PROXY);
} catch (InvalidSettingException ise) {
return true;
}
@@ -562,6 +758,15 @@ public final class CliParser {
return line.getOptionValue(ARGUMENT.PATH_TO_MONO);
}
/**
* Returns the path to bundle-audit for Ruby bundle analysis.
*
* @return the path to Mono
*/
public String getPathToBundleAudit() {
return line.getOptionValue(ARGUMENT.PATH_TO_BUNDLE_AUDIT);
}
/**
* Returns the output format specified on the command line. Defaults to HTML if no format was specified.
*
@@ -576,8 +781,50 @@ public final class CliParser {
*
* @return the application name.
*/
public String getApplicationName() {
return line.getOptionValue(ARGUMENT.APP_NAME);
public String getProjectName() {
final String appName = line.getOptionValue(ARGUMENT.APP_NAME);
String name = line.getOptionValue(ARGUMENT.PROJECT);
if (name == null && appName != null) {
name = appName;
LOGGER.warn("The '" + ARGUMENT.APP_NAME + "' argument should no longer be used; use '" + ARGUMENT.PROJECT + "' instead.");
}
return name;
}
/**
* Returns the base URL for the CVE 1.2 XMl file.
*
* @return the URL to the CVE 1.2 XML file.
*/
public String getBaseCve12Url() {
return line.getOptionValue(ARGUMENT.CVE_BASE_12);
}
/**
* Returns the base URL for the CVE 2.0 XMl file.
*
* @return the URL to the CVE 2.0 XML file.
*/
public String getBaseCve20Url() {
return line.getOptionValue(ARGUMENT.CVE_BASE_20);
}
/**
* Returns the URL for the modified CVE 1.2 XMl file.
*
* @return the URL to the modified CVE 1.2 XML file.
*/
public String getModifiedCve12Url() {
return line.getOptionValue(ARGUMENT.CVE_MOD_12);
}
/**
* Returns the URL for the modified CVE 2.0 XMl file.
*
* @return the URL to the modified CVE 2.0 XML file.
*/
public String getModifiedCve20Url() {
return line.getOptionValue(ARGUMENT.CVE_MOD_20);
}
/**
@@ -594,13 +841,14 @@ public final class CliParser {
*
* @return the proxy server
*/
@SuppressWarnings("deprecation")
public String getProxyServer() {
String server = line.getOptionValue(ARGUMENT.PROXY_SERVER);
if (server == null) {
server = line.getOptionValue(ARGUMENT.PROXY_URL);
if (server != null) {
LOGGER.warning("An old command line argument 'proxyurl' was detected; use proxyserver instead");
LOGGER.warn("An old command line argument 'proxyurl' was detected; use proxyserver instead");
}
}
return server;
@@ -689,10 +937,28 @@ public final class CliParser {
/**
* Checks if the auto update feature has been disabled. If it has been disabled via the command line this will return false.
*
* @return if auto-update is allowed.
* @return <code>true</code> if auto-update is allowed; otherwise <code>false</code>
*/
public boolean isAutoUpdate() {
return (line == null) || !line.hasOption(ARGUMENT.DISABLE_AUTO_UPDATE);
return line != null && !line.hasOption(ARGUMENT.DISABLE_AUTO_UPDATE);
}
/**
* Checks if the update only flag has been set.
*
* @return <code>true</code> if the update only flag has been set; otherwise <code>false</code>.
*/
public boolean isUpdateOnly() {
return line != null && line.hasOption(ARGUMENT.UPDATE_ONLY);
}
/**
* Checks if the purge NVD flag has been set.
*
* @return <code>true</code> if the purge nvd flag has been set; otherwise <code>false</code>.
*/
public boolean isPurge() {
return line != null && line.hasOption(ARGUMENT.PURGE_NVD);
}
/**
@@ -749,6 +1015,19 @@ public final class CliParser {
return line.getOptionValue(ARGUMENT.ADDITIONAL_ZIP_EXTENSIONS);
}
/**
* Get the value of cveValidForHours.
*
* @return the value of cveValidForHours
*/
public Integer getCveValidForHours() {
final String v = line.getOptionValue(ARGUMENT.CVE_VALID_FOR_HOURS);
if (v != null) {
return Integer.parseInt(v);
}
return null;
}
/**
* A collection of static final strings that represent the possible command line arguments.
*/
@@ -770,6 +1049,14 @@ public final class CliParser {
* The short CLI argument name specifying that the CPE/CVE/etc. data should not be automatically updated.
*/
public static final String DISABLE_AUTO_UPDATE_SHORT = "n";
/**
* The long CLI argument name specifying that only the update phase should be executed; no scan should be run.
*/
public static final String UPDATE_ONLY = "updateonly";
/**
* The long CLI argument name specifying that only the update phase should be executed; no scan should be run.
*/
public static final String PURGE_NVD = "purge";
/**
* The long CLI argument name specifying the directory to write the reports to.
*/
@@ -787,12 +1074,22 @@ public final class CliParser {
*/
public static final String OUTPUT_FORMAT_SHORT = "f";
/**
* The long CLI argument name specifying the name of the application to be scanned.
* The long CLI argument name specifying the name of the project to be scanned.
*/
public static final String PROJECT = "project";
/**
* The long CLI argument name specifying the name of the application to be scanned.
*
* @deprecated project should be used instead
*/
@Deprecated
public static final String APP_NAME = "app";
/**
* The short CLI argument name specifying the name of the application to be scanned.
*
* @deprecated project should be used instead
*/
@Deprecated
public static final String APP_NAME_SHORT = "a";
/**
* The long CLI argument name asking for help.
@@ -825,7 +1122,7 @@ public final class CliParser {
/**
* The CLI argument name indicating the proxy url.
*
* @deprecated use {@link org.owasp.dependencycheck.cli.CliParser.ArgumentName#PROXY_SERVER} instead
* @deprecated use {@link #PROXY_SERVER} instead
*/
@Deprecated
public static final String PROXY_URL = "proxyurl";
@@ -857,6 +1154,22 @@ public final class CliParser {
* The CLI argument name for setting the location of the data directory.
*/
public static final String DATA_DIRECTORY = "data";
/**
* The CLI argument name for setting the URL for the CVE Data Files.
*/
public static final String CVE_MOD_12 = "cveUrl12Modified";
/**
* The CLI argument name for setting the URL for the CVE Data Files.
*/
public static final String CVE_MOD_20 = "cveUrl20Modified";
/**
* The CLI argument name for setting the URL for the CVE Data Files.
*/
public static final String CVE_BASE_12 = "cveUrl12Base";
/**
* The CLI argument name for setting the URL for the CVE Data Files.
*/
public static final String CVE_BASE_20 = "cveUrl20Base";
/**
* The short CLI argument name for setting the location of the data directory.
*/
@@ -869,10 +1182,19 @@ public final class CliParser {
* The short CLI argument name for setting the location of the data directory.
*/
public static final String VERBOSE_LOG_SHORT = "l";
/**
* The CLI argument name for setting the depth of symbolic links that will be followed.
*/
public static final String SYM_LINK_DEPTH = "symLink";
/**
* The CLI argument name for setting the location of the suppression file.
*/
public static final String SUPPRESSION_FILE = "suppression";
/**
* The CLI argument name for setting the location of the suppression file.
*/
public static final String CVE_VALID_FOR_HOURS = "cveValidForHours";
/**
* Disables the Jar Analyzer.
*/
@@ -881,10 +1203,38 @@ public final class CliParser {
* Disables the Archive Analyzer.
*/
public static final String DISABLE_ARCHIVE = "disableArchive";
/**
* Disables the Python Distribution Analyzer.
*/
public static final String DISABLE_PY_DIST = "disablePyDist";
/**
* Disables the Python Package Analyzer.
*/
public static final String DISABLE_PY_PKG = "disablePyPkg";
/**
* Disables the Python Package Analyzer.
*/
public static final String DISABLE_COMPOSER = "disableComposer";
/**
* Disables the Ruby Gemspec Analyzer.
*/
public static final String DISABLE_RUBYGEMS = "disableRubygems";
/**
* Disables the Autoconf Analyzer.
*/
public static final String DISABLE_AUTOCONF = "disableAutoconf";
/**
* Disables the Cmake Analyzer.
*/
public static final String DISABLE_CMAKE = "disableCmake";
/**
* Disables the Assembly Analyzer.
*/
public static final String DISABLE_ASSEMBLY = "disableAssembly";
/**
* Disables the Ruby Bundler Audit Analyzer.
*/
public static final String DISABLE_BUNDLE_AUDIT = "disableBundleAudit";
/**
* Disables the Nuspec Analyzer.
*/
@@ -897,6 +1247,14 @@ public final class CliParser {
* Disables the Nexus Analyzer.
*/
public static final String DISABLE_NEXUS = "disableNexus";
/**
* Disables the OpenSSL Analyzer.
*/
public static final String DISABLE_OPENSSL = "disableOpenSSL";
/**
* Disables the Node.js Package Analyzer.
*/
public static final String DISABLE_NODE_JS = "disableNodeJS";
/**
* The URL of the nexus server.
*/
@@ -937,5 +1295,9 @@ public final class CliParser {
* Exclude path argument.
*/
public static final String EXCLUDE = "exclude";
/**
* The CLI argument name for setting the path to bundle-audit for Ruby bundle analysis.
*/
public static final String PATH_TO_BUNDLE_AUDIT = "bundleAudit";
}
}

View File

@@ -20,9 +20,14 @@ package org.owasp.dependencycheck;
/**
* Thrown if an invalid path is encountered.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
class InvalidScanPathException extends Exception {
public class InvalidScanPathException extends Exception {
/**
* The serial version UID for serialization.
*/
private static final long serialVersionUID = 1L;
/**
* Creates a new InvalidScanPathException.

View File

@@ -1,12 +1,4 @@
/**
* <html>
* <head>
* <title>org.owasp.dependencycheck</title>
* </head>
* <body>
* Includes the main entry point for the DependencyChecker.
* </body>
* </html>
*/
*/
package org.owasp.dependencycheck;

View File

@@ -1,22 +0,0 @@
handlers=java.util.logging.ConsoleHandler
#, java.util.logging.FileHandler
# logging levels
# FINEST, FINER, FINE, CONFIG, INFO, WARNING and SEVERE.
# Configure the ConsoleHandler.
java.util.logging.ConsoleHandler.level=INFO
# Configure the FileHandler.
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.FileHandler.level=FINE
# The following special tokens can be used in the pattern property
# which specifies the location and name of the log file.
# / - standard path separator
# %t - system temporary directory
# %h - value of the user.home system property
# %g - generation number for rotating logs
# %u - unique number to avoid conflicts
# FileHandler writes to %h/demo0.log by default.
java.util.logging.FileHandler.pattern=./dependency-check.log

View File

@@ -0,0 +1,16 @@
<configuration>
<contextName>dependency-check</contextName>
<!-- Logging configuration -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<Target>System.out</Target>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>[%level] %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="console"/>
</root>
</configuration>

View File

@@ -5,41 +5,60 @@ The following table lists the command line arguments:
Short | Argument&nbsp;Name&nbsp;&nbsp; | Parameter | Description | Requirement
-------|-----------------------|-----------------|-------------|------------
\-a | \-\-app | \<name\> | The name of the application being scanned. This is a required argument. | Required
| \-\-project | \<name\> | The name of the project being scanned. | 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
| \-\-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
| \-\-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
| \-\-symLink | \<depth\> | The depth that symbolic links will be followed; the default is 0 meaning symbolic links will not be followed. | 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
\-l | \-\-log | \<file\> | The file path to write verbose logging information. | Optional
\-n | \-\-noupdate | | Disables the automatic updating of the CPE data. | Optional
| \-\-suppression | \<file\> | The file path to the suppression XML file; used to suppress [false positives](../suppression.html). | Optional
| \-\-suppression | \<file\> | The file path to the suppression XML file; used to suppress [false positives](../general/suppression.html). | Optional
\-h | \-\-help | | Print the help message. | Optional
| \-\-advancedHelp | | Print the advanced help message. | Optional
\-v | \-\-version | | Print the version information. | Optional
| \-\-cveValidForHours | \<hours\> | The number of hours to wait before checking for new updates from the NVD. The default is 4 hours. | Optional
Advanced Options
================
Short | Argument&nbsp;Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Parameter | Description | Default&nbsp;Value
-------|-----------------------|-----------------|-----------------------------------------------------------------------------|---------------
Short | Argument&nbsp;Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Parameter | Description | Default&nbsp;Value
-------|-----------------------|-----------------|----------------------------------------------------------------------------------|-------------------
| \-\-cveUrl12Modified | \<url\> | URL for the modified CVE 1.2 | https://nvd.nist.gov/download/nvdcve-Modified.xml.gz
| \-\-cveUrl20Modified | \<url\> | URL for the modified CVE 2.0 | https://nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-Modified.xml.gz
| \-\-cveUrl12Base | \<url\> | Base URL for each year's CVE 1.2, the %d will be replaced with the year | https://nvd.nist.gov/download/nvdcve-%d.xml.gz
| \-\-cveUrl20Base | \<url\> | Base URL for each year's CVE 2.0, the %d will be replaced with the year | https://nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-%d.xml.gz
\-P | \-\-propertyfile | \<file\> | Specifies a file that contains properties to use instead of applicaion defaults. | &nbsp;
| \-\-disableArchive | | Sets whether the Archive Analyzer will be used. | false
| \-\-updateonly | | If set only the update phase of dependency-check will be executed; no scan will be executed and no report will be generated. | &nbsp;
| \-\-disablePyDist | | Sets whether the Python Distribution Analyzer will be used. | false
| \-\-disablePyPkg | | Sets whether the Python Package Analyzer will be used. | false
| \-\-disableNodeJS | | Sets whether the Node.js Package Analyzer will be used. | false
| \-\-disableRubygems | | Sets whether the Ruby Gemspec Analyzer will be used. | false
| \-\-disableBundleAudit | | Sets whether the Ruby Bundler Audit Analyzer will be used. | false
| \-\-disableAutoconf | | Sets whether the Autoconf Analyzer will be used. | false
| \-\-disableOpenSSL | | Sets whether the OpenSSL Analyzer will be used. | false
| \-\-disableCmake | | Sets whether the Cmake Analyzer will be disabled. | false
| \-\-disableArchive | | Sets whether the Archive Analyzer will be disabled. | 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. | &nbsp;
| \-\-disableJar | | Sets whether the Jar Analyzer will be used. | false
| \-\-disableJar | | Sets whether the Jar Analyzer will be disabled. | false
| \-\-disableComposer | | Sets whether the PHP Composer Lock File Analyzer will be disabled. | 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 | | 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 Pro Server. If not set the Nexus Analyzer will be disabled. | &nbsp;
| \-\-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
| \-\-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. | &nbsp;
| \-\-proxyserver | \<server\> | The proxy server to use when downloading resources. | &nbsp;
| \-\-proxyport | \<port\> | The proxy port to use when downloading resources. | &nbsp;
| \-\-connectiontimeout | \<timeout\> | The connection timeout (in milliseconds) to use when downloading resources. | &nbsp;
| \-\-proxypass | \<pass\> | The proxy password to use when downloading resources. | &nbsp;
| \-\-proxyuser | \<user\> | The proxy username to use when downloading resources. | &nbsp;
| \-\-connectionString | \<connStr\> | The connection string to the database. | &nbsp;
| \-\-dbDriverName | \<driver\> | The database driver name. | &nbsp;
| \-\-nexus | \<url\> | The url to the Nexus Server's web service end point (example: http://domain.enterprise/nexus/service/local/). If not set the Nexus Analyzer will be disabled. | &nbsp;
| \-\-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
| \-\-disableAssembly | | Sets whether or not the .NET Assembly Analyzer should be used. | false
| \-\-mono | \<path\> | The path to Mono for .NET Assembly analysis on non-windows systems. | &nbsp;
| \-\-bundleAudit | | The path to the bundle-audit executable. | &nbsp;
| \-\-proxyserver | \<server\> | The proxy server to use when downloading resources. | &nbsp;
| \-\-proxyport | \<port\> | The proxy port to use when downloading resources. | &nbsp;
| \-\-connectiontimeout | \<timeout\> | The connection timeout (in milliseconds) to use when downloading resources. | &nbsp;
| \-\-proxypass | \<pass\> | The proxy password to use when downloading resources. | &nbsp;
| \-\-proxyuser | \<user\> | The proxy username to use when downloading resources. | &nbsp;
| \-\-connectionString | \<connStr\> | The connection string to the database. | &nbsp;
| \-\-dbDriverName | \<driver\> | The database driver name. | &nbsp;
| \-\-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. | &nbsp;
| \-\-dbPassword | \<password\> | The password for connecting to the database. | &nbsp;
| \-\-dbUser | \<user\> | The username used to connect to the database. | &nbsp;
| \-\-dbPassword | \<password\> | The password for connecting to the database. | &nbsp;
| \-\-dbUser | \<user\> | The username used to connect to the database. | &nbsp;
\-d | \-\-data | \<path\> | The location of the data directory used to store persistent data. This option should generally not be set. | &nbsp;
| \-\-purge | | Delete the local copy of the NVD. This is used to force a refresh of the data. | &nbsp;

View File

@@ -0,0 +1,39 @@
About
====================
OWASP dependency-check-cli is an command line tool that uses dependency-check-core to detect
publicly disclosed vulnerabilities associated with the scanned project dependencies. The tool
will generate a report listing the dependency, any identified Common Platform Enumeration (CPE)
identifiers, and the associated Common Vulnerability and Exposure (CVE) entries.
Installation & Usage
====================
Download the dependency-check command line tool [here](http://dl.bintray.com/jeremy-long/owasp/dependency-check-${project.version}-release.zip).
Extract the zip file to a location on your computer and put the 'bin' directory into the
path environment variable. On \*nix systems you will likely need to make the shell
script executable:
$ chmod +777 dependency-check.sh
#set( $H = '#' )
$H$H$H Homebrew
$ brew install dependency-check
This puts an executable `dependency-check` script in the `/bin` directory of
your homebrew installation.
To scan a folder on the system you can run:
$H$H$H Windows
dependency-check.bat --project "My App Name" --scan "c:\java\application\lib"
$H$H$H *nix
dependency-check.sh --project "My App Name" --scan "/java/application/lib"
To view the command line arguments, see the <a href="arguments.html">arguments page</a>, or you can run:
$H$H$H Windows
dependency-check.bat --help
$H$H$H *nix
dependency-check.sh --help

View File

@@ -1,25 +0,0 @@
Installation & Usage
====================
Download the dependency-check command line tool [here](http://dl.bintray.com/jeremy-long/owasp/dependency-check-${project.version}-release.zip).
Extract the zip file to a location on your computer and put the 'bin' directory into the
path environment variable. On \*nix systems you will likely need to make the shell
script executable:
$ chmod +777 dependency-check.sh
To scan a folder on the system you can run:
#set( $H = '#' )
$H$H$H Windows
dependency-check.bat --app "My App Name" --scan "c:\java\application\lib"
$H$H$H *nix
dependency-check.sh --app "My App Name" --scan "/java/application/lib"
To view the command line arguments, see the <a href="arguments.html">arguments page</a>, or you can run:
$H$H$H Windows
dependency-check.bat --help
$H$H$H *nix
dependency-check.sh --help

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -18,17 +18,18 @@ Copyright (c) 2013 Jeremy Long. All Rights Reserved.
-->
<project name="dependency-check-cli">
<bannerLeft>
<name>dependency-check-cli</name>
<name>OWASP dependency-check-cli</name>
<alt>OWASP dependency-check-cli</alt>
<src>./images/dc-cli.svg</src>
</bannerLeft>
<body>
<breadcrumbs>
<item name="dependency-check" href="../index.html"/>
</breadcrumbs>
<menu name="Getting Started">
<item name="Installation" href="installation.html"/>
<item name="Installation" href="index.html"/>
<item name="Configuration" href="arguments.html"/>
</menu>
<menu ref="Project Documentation" />
<menu ref="reports" />
</body>
</project>

View File

@@ -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) 2015 The OWASP Foundatio. All Rights Reserved.
*/
package org.owasp.dependencycheck;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
/**
*
* @author jeremy
*/
public class AppTest {
public AppTest() {
}
@BeforeClass
public static void setUpClass() {
}
@AfterClass
public static void tearDownClass() {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
/**
* Test of ensureCanonicalPath method, of class App.
*/
@Test
public void testEnsureCanonicalPath() {
String file = "../*.jar";
App instance = new App();
String result = instance.ensureCanonicalPath(file);
assertFalse(result.contains(".."));
assertTrue(result.endsWith("*.jar"));
}
/**
* Test of ensureCanonicalPath method, of class App.
*/
@Test
public void testEnsureCanonicalPath2() {
String file = "../some/skip/../path/file.txt";
App instance = new App();
String expResult = "/some/path/file.txt";
String result = instance.ensureCanonicalPath(file);
assertTrue("result=" + result, result.endsWith(expResult));
}
}

View File

@@ -34,7 +34,7 @@ import org.owasp.dependencycheck.utils.Settings;
/**
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class CliParserTest {

View File

@@ -17,7 +17,7 @@ Copyright & License
Dependency-Check is Copyright (c) 2012-2014 Jeremy Long. All Rights Reserved.
Permission to modify and redistribute is granted under the terms of the Apache 2.0 license. See the [LICENSE.txt](https://github.com/jeremylong/DependencyCheck/dependency-check-cli/blob/master/LICENSE.txt) file for the full license.
Permission to modify and redistribute is granted under the terms of the Apache 2.0 license. See the [LICENSE.txt](https://raw.githubusercontent.com/jeremylong/DependencyCheck/master/LICENSE.txt) file for the full license.
Dependency-Check makes use of several other open source libraries. Please see the [NOTICE.txt] [notices] file for more information.
@@ -25,4 +25,4 @@ Dependency-Check makes use of several other open source libraries. Please see th
[wiki]: https://github.com/jeremylong/DependencyCheck/wiki
[subscribe]: mailto:dependency-check+subscribe@googlegroups.com
[post]: mailto:dependency-check@googlegroups.com
[notices]: https://github.com/jeremylong/DependencyCheck/blob/master/NOTICES.txt
[notices]: https://raw.githubusercontent.com/jeremylong/DependencyCheck/master/NOTICE.txt

View File

@@ -20,7 +20,7 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
<parent>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-parent</artifactId>
<version>1.2.9</version>
<version>1.3.2</version>
</parent>
<artifactId>dependency-check-core</artifactId>
@@ -101,7 +101,7 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
</goals>
<configuration>
<outputDirectory>${project.build.directory}/test-classes</outputDirectory>
<includeScope>provided</includeScope>
<includeScope>test</includeScope>
</configuration>
</execution>
</executions>
@@ -110,19 +110,17 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>jar</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
<execution>
<id>test-jar</id>
<phase>package</phase>
<goals>
<goal>test-jar</goal>
</goals>
<configuration>
<includes>
<include>**/*.class</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
@@ -205,69 +203,21 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
<name>data.directory</name>
<value>${project.build.directory}/data</value>
</property>
<property>
<name>temp.directory</name>
<value>${project.build.directory}/temp</value>
</property>
</systemProperties>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgument>-Xlint:unchecked</compilerArgument>
</configuration>
</plugin>
</plugins>
</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>
@@ -277,34 +227,10 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
</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>
<version>${reporting.checkstyle-plugin.version}</version>
<configuration>
<enableRulesSummary>false</enableRulesSummary>
<enableFilesSummary>false</enableFilesSummary>
@@ -317,7 +243,7 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.1</version>
<version>${reporting.pmd-plugin.version}</version>
<configuration>
<targetJdk>1.6</targetJdk>
<linkXref>true</linkXref>
@@ -333,15 +259,25 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
</rulesets>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>2.5.3</version>
</plugin>
</plugins>
</reporting>
<dependencies>
<!-- Note, to stay compatible with Jenkins installations only JARs compiled to 1.6 can be used -->
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>annotations</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<!-- Set this to test so that each project that uses this has to have its own implementation of SLF4J -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-utils</artifactId>
@@ -350,7 +286,6 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-test-framework</artifactId>
<version>${apache.lucene.version}</version>
<scope>test</scope>
</dependency>
<dependency>
@@ -358,120 +293,113 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
<artifactId>jmockit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>annotations</artifactId>
<version>3.0.0</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>${apache.lucene.version}</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>${apache.lucene.version}</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>${apache.lucene.version}</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.3.176</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.7.2</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>mailapi</artifactId>
</dependency>
<!-- The following dependencies are only used during testing -->
<dependency>
<groupId>org.apache.maven.scm</groupId>
<artifactId>maven-scm-provider-cvsexe</artifactId>
<version>1.8.1</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>2.5.5</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>3.0.0.RELEASE</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
<version>2.5</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.2.0</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.1.2</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
<version>6.1.0</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-spring</artifactId>
<version>1.4.1</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-adb</artifactId>
<version>1.4.1</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
@@ -479,7 +407,7 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
<artifactId>daytrader-ear</artifactId>
<version>2.1.7</version>
<type>ear</type>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
@@ -487,7 +415,7 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
<artifactId>war</artifactId>
<version>4.0</version>
<type>war</type>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
@@ -495,28 +423,35 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
<artifactId>dojo-war</artifactId>
<version>1.3.0</version>
<type>war</type>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.openjpa</groupId>
<artifactId>openjpa</artifactId>
<version>2.0.1</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>3.0</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>1.1.0.RELEASE</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>uk.ltd.getahead</groupId>
<artifactId>dwr</artifactId>
<version>1.1.1</version>
<scope>test</scope>
<optional>true</optional>
</dependency>
</dependencies>
@@ -526,7 +461,6 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
<activation>
<property>
<name>mysql</name>
<!--value>test</value-->
</property>
</activation>
<build>
@@ -534,7 +468,6 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<skip>true</skip>
</configuration>
@@ -542,12 +475,68 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<systemProperties>
<property>
<name>data.driver_path</name>
<value>${basedir}/${driver_path}</value>
<value>${driver_path}</value>
</property>
<property>
<name>data.driver_name</name>
<value>${driver_name}</value>
</property>
<property>
<name>data.connection_string</name>
<value>${connection_string}</value>
</property>
</systemProperties>
<includes>
<include>**/*MySQLTest.java</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>Postgresql-IntegrationTest</id>
<activation>
<property>
<name>postgresql</name>
</property>
</activation>
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4-1204-jdbc42</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<configuration>
<systemProperties>
<property>
<name>data.driver_path</name>
<value>${driver_path}</value>
</property>
<property>
<name>data.driver_name</name>
@@ -590,99 +579,150 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-util</artifactId>
<version>1.7</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.2</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.ws.security</groupId>
<artifactId>wss4j</artifactId>
<version>1.5.7</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.ganyo</groupId>
<artifactId>gcm-server</artifactId>
<version>1.0.2</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.python</groupId>
<artifactId>jython-standalone</artifactId>
<version>2.7-b1</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.jruby</groupId>
<artifactId>jruby-complete</artifactId>
<version>1.7.4</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.jruby</groupId>
<artifactId>jruby</artifactId>
<version>1.6.3</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.12</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.11.1</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.8-02</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>3.0</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.opensaml</groupId>
<artifactId>xmltooling</artifactId>
<version>1.4.1</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.12.RELEASE</version>
<scope>provided</scope>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.google.gerrit</groupId>
<artifactId>gerrit-extension-api</artifactId>
<version>2.11</version>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-sqladmin</artifactId>
<version>v1beta4-rev5-1.20.0</version>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.google.gwt.google-apis</groupId>
<artifactId>gwt-gears</artifactId>
<version>1.2.1</version>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.mozilla</groupId>
<artifactId>rhino</artifactId>
<version>1.7.6</version>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.microsoft.windowsazure</groupId>
<artifactId>microsoft-azure-api-media</artifactId>
<version>0.5.0</version>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.microsoft.windowsazure</groupId>
<artifactId>microsoft-azure-api-management-sql</artifactId>
<version>0.5.0</version>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.microsoft.bingads</groupId>
<artifactId>microsoft.bingads</artifactId>
<version>9.3.4</version>
<scope>test</scope>
<optional>true</optional>
</dependency>
</dependencies>
</profile>
</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>

View File

@@ -17,15 +17,6 @@
*/
package org.owasp.dependencycheck;
import java.io.File;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.owasp.dependencycheck.analyzer.AnalysisPhase;
import org.owasp.dependencycheck.analyzer.Analyzer;
import org.owasp.dependencycheck.analyzer.AnalyzerService;
@@ -39,18 +30,29 @@ import org.owasp.dependencycheck.data.update.UpdateService;
import org.owasp.dependencycheck.data.update.exception.UpdateException;
import org.owasp.dependencycheck.dependency.Dependency;
import org.owasp.dependencycheck.exception.NoDataException;
import org.owasp.dependencycheck.utils.FileUtils;
import org.owasp.dependencycheck.utils.InvalidSettingException;
import org.owasp.dependencycheck.utils.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Scans files, directories, etc. for Dependencies. Analyzers are loaded and used to process the files found by the
* scan, if a file is encountered and an Analyzer is associated with the file type then the file is turned into a
* dependency.
* Scans files, directories, etc. for Dependencies. Analyzers are loaded and used to process the files found by the scan, if a
* file is encountered and an Analyzer is associated with the file type then the file is turned into a dependency.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class Engine {
public class Engine implements FileFilter {
/**
* The list of dependencies.
@@ -59,7 +61,7 @@ public class Engine {
/**
* A Map of analyzers grouped by Analysis phase.
*/
private EnumMap<AnalysisPhase, List<Analyzer>> analyzers = new EnumMap<AnalysisPhase, List<Analyzer>>(AnalysisPhase.class);
private Map<AnalysisPhase, List<Analyzer>> analyzers = new EnumMap<AnalysisPhase, List<Analyzer>>(AnalysisPhase.class);
/**
* A Map of analyzers grouped by Analysis phase.
@@ -73,7 +75,7 @@ public class Engine {
/**
* The Logger for use throughout the class.
*/
private static final Logger LOGGER = Logger.getLogger(Engine.class.getName());
private static final Logger LOGGER = LoggerFactory.getLogger(Engine.class);
/**
* Creates a new Engine.
@@ -163,19 +165,17 @@ public class Engine {
}
/**
* 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.
* 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.
*
* @param paths an array of paths to files or directories to be analyzed
* @return the list of dependencies scanned
*
* @since v0.3.2.5
*/
public List<Dependency> scan(String[] paths) {
final List<Dependency> deps = new ArrayList<Dependency>();
for (String path : paths) {
final File file = new File(path);
final List<Dependency> d = scan(file);
final List<Dependency> d = scan(path);
if (d != null) {
deps.addAll(d);
}
@@ -184,8 +184,8 @@ public class Engine {
}
/**
* 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.
* 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.
*
* @param path the path to a file or directory to be analyzed
* @return the list of dependencies scanned
@@ -196,12 +196,11 @@ public class Engine {
}
/**
* 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.
* 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.
*
* @param files an array of paths to files or directories to be analyzed.
* @return the list of dependencies
*
* @since v0.3.2.5
*/
public List<Dependency> scan(File[] files) {
@@ -216,54 +215,31 @@ public class Engine {
}
/**
* 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.
*
* @param files a set of paths to files or directories to be analyzed
* @return the list of dependencies scanned
*
* @since v0.3.2.5
*/
public List<Dependency> scan(Set<File> files) {
final List<Dependency> deps = new ArrayList<Dependency>();
for (File file : files) {
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
* dependencies identified are added to the dependency collection.
*
* @param files a set of paths to files or directories to be analyzed
* @return the list of dependencies scanned
*
* @since v0.3.2.5
*/
public List<Dependency> scan(List<File> files) {
final List<Dependency> deps = new ArrayList<Dependency>();
for (File file : files) {
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 collection of files or directories. If a directory is specified, it will be scanned recursively. Any dependencies
* identified are added to the dependency collection.
*
* @param files a set of paths to files or directories to be analyzed
* @return the list of dependencies scanned
* @since v0.3.2.5
*/
public List<Dependency> scan(Collection<File> files) {
final List<Dependency> deps = new ArrayList<Dependency>();
for (File file : files) {
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 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
*
*/
public List<Dependency> scan(File file) {
if (file.exists()) {
@@ -313,35 +289,30 @@ public class Engine {
* @return the scanned dependency
*/
protected Dependency scanFile(File file) {
if (!file.isFile()) {
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);
return null;
}
final String fileName = file.getName();
final String extension = FileUtils.getFileExtension(fileName);
Dependency dependency = null;
if (extension != null) {
if (supportsExtension(extension)) {
if (file.isFile()) {
if (accept(file)) {
dependency = new Dependency(file);
dependencies.add(dependency);
}
} else {
final String msg = String.format("No file extension found on file '%s'. The file was not analyzed.", file.toString());
LOGGER.log(Level.FINE, msg);
LOGGER.debug("Path passed to scanFile(File) is not a file: {}. Skipping the file.", file);
}
return dependency;
}
/**
* Runs the analyzers against all of the dependencies.
* Runs the analyzers against all of the dependencies. Since the mutable dependencies list is exposed via
* {@link #getDependencies()}, this method iterates over a copy of the dependencies list. Thus, the potential for
* {@link java.util.ConcurrentModificationException}s is avoided, and analyzers may safely add or remove entries from the
* dependencies list.
*/
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.");
LOGGER.debug("Invalid setting for auto-update; using true.");
}
if (autoUpdate) {
doUpdates();
@@ -351,24 +322,19 @@ public class Engine {
try {
ensureDataExists();
} catch (NoDataException ex) {
final String msg = String.format("%s%n%nUnable to continue dependency-check analysis.", ex.getMessage());
LOGGER.log(Level.SEVERE, msg);
LOGGER.log(Level.FINE, null, ex);
LOGGER.error("{}\n\nUnable to continue dependency-check analysis.", ex.getMessage());
LOGGER.debug("", ex);
return;
} catch (DatabaseException ex) {
final String msg = String.format("%s%n%nUnable to continue dependency-check analysis.", ex.getMessage());
LOGGER.log(Level.SEVERE, msg);
LOGGER.log(Level.FINE, null, ex);
LOGGER.error("{}\n\nUnable to continue dependency-check analysis.", ex.getMessage());
LOGGER.debug("", ex);
return;
}
final String logHeader = String.format("%n"
+ "----------------------------------------------------%n"
+ "BEGIN ANALYSIS%n"
+ "----------------------------------------------------");
LOGGER.log(Level.FINE, logHeader);
LOGGER.log(Level.INFO, "Analysis Starting");
LOGGER.debug("\n----------------------------------------------------\nBEGIN ANALYSIS\n----------------------------------------------------");
LOGGER.info("Analysis Starting");
final long analysisStart = System.currentTimeMillis();
// analysis phases
for (AnalysisPhase phase : AnalysisPhase.values()) {
@@ -381,30 +347,25 @@ public class Engine {
* analyzers may modify it. This prevents ConcurrentModificationExceptions.
* This is okay for adds/deletes because it happens per analyzer.
*/
final String msg = String.format("Begin Analyzer '%s'", a.getName());
LOGGER.log(Level.FINE, msg);
final Set<Dependency> dependencySet = new HashSet<Dependency>();
dependencySet.addAll(dependencies);
LOGGER.debug("Begin Analyzer '{}'", a.getName());
final Set<Dependency> dependencySet = new HashSet<Dependency>(dependencies);
for (Dependency d : dependencySet) {
boolean shouldAnalyze = true;
if (a instanceof FileTypeAnalyzer) {
final FileTypeAnalyzer fAnalyzer = (FileTypeAnalyzer) a;
shouldAnalyze = fAnalyzer.supportsExtension(d.getFileExtension());
shouldAnalyze = fAnalyzer.accept(d.getActualFile());
}
if (shouldAnalyze) {
final String msgFile = String.format("Begin Analysis of '%s'", d.getActualFilePath());
LOGGER.log(Level.FINE, msgFile);
LOGGER.debug("Begin Analysis of '{}'", d.getActualFilePath());
try {
a.analyze(d, this);
} catch (AnalysisException ex) {
final String exMsg = String.format("An error occurred while analyzing '%s'.", d.getActualFilePath());
LOGGER.log(Level.WARNING, exMsg);
LOGGER.log(Level.FINE, "", ex);
LOGGER.warn("An error occurred while analyzing '{}'.", d.getActualFilePath());
LOGGER.debug("", ex);
} catch (Throwable ex) {
final String axMsg = String.format("An unexpected error occurred during analysis of '%s'", d.getActualFilePath());
//final AnalysisException ax = new AnalysisException(axMsg, ex);
LOGGER.log(Level.WARNING, axMsg);
LOGGER.log(Level.FINE, "", ex);
LOGGER.warn("An unexpected error occurred during analysis of '{}'", d.getActualFilePath());
LOGGER.debug("", ex);
}
}
}
@@ -418,12 +379,8 @@ public class Engine {
}
}
final String logFooter = String.format("%n"
+ "----------------------------------------------------%n"
+ "END ANALYSIS%n"
+ "----------------------------------------------------");
LOGGER.log(Level.FINE, logFooter);
LOGGER.log(Level.INFO, "Analysis Complete");
LOGGER.debug("\n----------------------------------------------------\nEND ANALYSIS\n----------------------------------------------------");
LOGGER.info("Analysis Complete ({} ms)", System.currentTimeMillis() - analysisStart);
}
/**
@@ -434,17 +391,15 @@ public class Engine {
*/
protected Analyzer initializeAnalyzer(Analyzer analyzer) {
try {
final String msg = String.format("Initializing %s", analyzer.getName());
LOGGER.log(Level.FINE, msg);
LOGGER.debug("Initializing {}", analyzer.getName());
analyzer.initialize();
} catch (Throwable ex) {
final String msg = String.format("Exception occurred initializing %s.", analyzer.getName());
LOGGER.log(Level.SEVERE, msg);
LOGGER.log(Level.FINE, null, ex);
LOGGER.error("Exception occurred initializing {}.", analyzer.getName());
LOGGER.debug("", ex);
try {
analyzer.close();
} catch (Throwable ex1) {
LOGGER.log(Level.FINEST, null, ex1);
LOGGER.trace("", ex1);
}
}
return analyzer;
@@ -456,20 +411,20 @@ public class Engine {
* @param analyzer the analyzer to close
*/
protected void closeAnalyzer(Analyzer analyzer) {
final String msg = String.format("Closing Analyzer '%s'", analyzer.getName());
LOGGER.log(Level.FINE, msg);
LOGGER.debug("Closing Analyzer '{}'", analyzer.getName());
try {
analyzer.close();
} catch (Throwable ex) {
LOGGER.log(Level.FINEST, null, ex);
LOGGER.trace("", ex);
}
}
/**
* Cycles through the cached web data sources and calls update on all of them.
*/
private void doUpdates() {
public void doUpdates() {
LOGGER.info("Checking for updates");
final long updateStart = System.currentTimeMillis();
final UpdateService service = new UpdateService(serviceClassLoader);
final Iterator<CachedWebDataSource> iterator = service.getDataSources();
while (iterator.hasNext()) {
@@ -477,12 +432,12 @@ public class Engine {
try {
source.update();
} catch (UpdateException ex) {
LOGGER.log(Level.WARNING,
LOGGER.warn(
"Unable to update Cached Web DataSource, using local data instead. Results may not include recent vulnerabilities.");
LOGGER.log(Level.FINE, String.format("Unable to update details for %s", source.getClass().getName()), ex);
LOGGER.debug("Unable to update details for {}", source.getClass().getName(), ex);
}
}
LOGGER.info("Check for updates complete");
LOGGER.info("Check for updates complete ({} ms)", System.currentTimeMillis() - updateStart);
}
/**
@@ -502,18 +457,19 @@ public class Engine {
/**
* Checks all analyzers to see if an extension is supported.
*
* @param ext a file extension
* @param file a file extension
* @return true or false depending on whether or not the file extension is supported
*/
public boolean supportsExtension(String ext) {
if (ext == null) {
@Override
public boolean accept(File file) {
if (file == null) {
return false;
}
boolean scan = false;
for (FileTypeAnalyzer a : this.fileTypeAnalyzers) {
/* note, we can't break early on this loop as the analyzers need to know if
they have files to work on prior to initialization */
scan |= a.supportsExtension(ext);
scan |= a.accept(file);
}
return scan;
}

View File

@@ -20,8 +20,6 @@ package org.owasp.dependencycheck.agent;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.data.nvdcve.CveDB;
import org.owasp.dependencycheck.data.nvdcve.DatabaseException;
@@ -32,12 +30,14 @@ import org.owasp.dependencycheck.dependency.Vulnerability;
import org.owasp.dependencycheck.exception.ScanAgentException;
import org.owasp.dependencycheck.reporting.ReportGenerator;
import org.owasp.dependencycheck.utils.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This class provides a way to easily conduct a scan solely based on existing evidence metadata rather than collecting
* evidence from the files themselves. This class is based on the Ant task and Maven plugin with the exception that it
* takes a list of dependencies that can be programmatically added from data in a spreadsheet, database or some other
* datasource and conduct a scan based on this pre-defined evidence.
* This class provides a way to easily conduct a scan solely based on existing evidence metadata rather than collecting evidence
* from the files themselves. This class is based on the Ant task and Maven plugin with the exception that it takes a list of
* dependencies that can be programmatically added from data in a spreadsheet, database or some other datasource and conduct a
* scan based on this pre-defined evidence.
*
* <h2>Example:</h2>
* <pre>
@@ -67,7 +67,7 @@ public class DependencyCheckScanAgent {
/**
* Logger for use throughout the class.
*/
private static final Logger LOGGER = Logger.getLogger(DependencyCheckScanAgent.class.getName());
private static final Logger LOGGER = LoggerFactory.getLogger(DependencyCheckScanAgent.class);
/**
* The application name for the report.
*/
@@ -161,9 +161,9 @@ public class DependencyCheckScanAgent {
}
/**
* Specifies if the build should be failed if a CVSS score above a specified level is identified. The default is 11
* which 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 for the fail build on CVSS is 0 to 11, where anything above 10 will not cause the build to fail.
* Specifies if the build should be failed if a CVSS score above a specified level is identified. The default is 11 which
* 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
* 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;
@@ -186,8 +186,8 @@ public class DependencyCheckScanAgent {
}
/**
* Sets whether auto-updating of the NVD CVE/CPE data is enabled. It is not recommended that this be turned to
* false. Default is true.
* Sets whether auto-updating of the NVD CVE/CPE data is enabled. It is not recommended that this be turned to false. Default
* is true.
*/
private boolean autoUpdate = true;
@@ -210,8 +210,31 @@ public class DependencyCheckScanAgent {
}
/**
* The report format to be generated (HTML, XML, VULN, ALL). This configuration option has no affect if using this
* within the Site plugin unless the externalReport is set to true. Default is HTML.
* flag indicating whether or not to generate a report of findings.
*/
private boolean generateReport = true;
/**
* Get the value of generateReport.
*
* @return the value of generateReport
*/
public boolean isGenerateReport() {
return generateReport;
}
/**
* Set the value of generateReport.
*
* @param generateReport new value of generateReport
*/
public void setGenerateReport(boolean generateReport) {
this.generateReport = generateReport;
}
/**
* The report format to be generated (HTML, XML, VULN, ALL). This configuration option has no affect if using this within the
* Site plugin unless the externalReport is set to true. Default is HTML.
*/
private ReportGenerator.Format reportFormat = ReportGenerator.Format.HTML;
@@ -671,8 +694,8 @@ public class DependencyCheckScanAgent {
}
/**
* Additional ZIP File extensions to add analyze. This should be a comma-separated list of file extensions to treat
* like ZIP files.
* Additional ZIP File extensions to add analyze. This should be a comma-separated list of file extensions to treat like ZIP
* files.
*/
private String zipExtensions;
@@ -813,13 +836,11 @@ public class DependencyCheckScanAgent {
* Executes the Dependency-Check on the dependent libraries.
*
* @return the Engine used to scan the dependencies.
* @throws org.owasp.dependencycheck.data.nvdcve.DatabaseException thrown if there is an exception connecting to the
* database
* @throws org.owasp.dependencycheck.data.nvdcve.DatabaseException thrown if there is an exception connecting to the database
*/
private Engine executeDependencyCheck() throws DatabaseException {
populateSettings();
Engine engine = null;
engine = new Engine();
final Engine engine = new Engine();
engine.setDependencies(this.dependencies);
engine.analyzeDependencies();
return engine;
@@ -839,7 +860,7 @@ public class DependencyCheckScanAgent {
cve.open();
prop = cve.getDatabaseProperties();
} catch (DatabaseException ex) {
LOGGER.log(Level.FINE, "Unable to retrieve DB Properties", ex);
LOGGER.debug("Unable to retrieve DB Properties", ex);
} finally {
if (cve != null) {
cve.close();
@@ -849,19 +870,19 @@ public class DependencyCheckScanAgent {
try {
r.generateReports(outDirectory.getCanonicalPath(), this.reportFormat.name());
} catch (IOException ex) {
LOGGER.log(Level.SEVERE,
LOGGER.error(
"Unexpected exception occurred during analysis; please see the verbose error log for more details.");
LOGGER.log(Level.FINE, null, ex);
LOGGER.debug("", ex);
} catch (Throwable ex) {
LOGGER.log(Level.SEVERE,
LOGGER.error(
"Unexpected exception occurred during analysis; please see the verbose error log for more details.");
LOGGER.log(Level.FINE, null, ex);
LOGGER.debug("", ex);
}
}
/**
* Takes the properties supplied and updates the dependency-check settings. Additionally, this sets the system
* properties required to change the proxy server, port, and connection timeout.
* Takes the properties supplied and updates the dependency-check settings. Additionally, this sets the system properties
* required to change the proxy server, port, and connection timeout.
*/
private void populateSettings() {
Settings.initialize();
@@ -876,80 +897,43 @@ public class DependencyCheckScanAgent {
}
Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, autoUpdate);
if (proxyServer != null && !proxyServer.isEmpty()) {
Settings.setString(Settings.KEYS.PROXY_SERVER, proxyServer);
}
if (proxyPort != null && !proxyPort.isEmpty()) {
Settings.setString(Settings.KEYS.PROXY_PORT, proxyPort);
}
if (proxyUsername != null && !proxyUsername.isEmpty()) {
Settings.setString(Settings.KEYS.PROXY_USERNAME, proxyUsername);
}
if (proxyPassword != null && !proxyPassword.isEmpty()) {
Settings.setString(Settings.KEYS.PROXY_PASSWORD, proxyPassword);
}
if (connectionTimeout != null && !connectionTimeout.isEmpty()) {
Settings.setString(Settings.KEYS.CONNECTION_TIMEOUT, connectionTimeout);
}
if (suppressionFile != null && !suppressionFile.isEmpty()) {
Settings.setString(Settings.KEYS.SUPPRESSION_FILE, suppressionFile);
}
Settings.setStringIfNotEmpty(Settings.KEYS.PROXY_SERVER, proxyServer);
Settings.setStringIfNotEmpty(Settings.KEYS.PROXY_PORT, proxyPort);
Settings.setStringIfNotEmpty(Settings.KEYS.PROXY_USERNAME, proxyUsername);
Settings.setStringIfNotEmpty(Settings.KEYS.PROXY_PASSWORD, proxyPassword);
Settings.setStringIfNotEmpty(Settings.KEYS.CONNECTION_TIMEOUT, connectionTimeout);
Settings.setStringIfNotEmpty(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.setStringIfNotEmpty(Settings.KEYS.ANALYZER_CENTRAL_URL, centralUrl);
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, nexusAnalyzerEnabled);
if (nexusUrl != null && !nexusUrl.isEmpty()) {
Settings.setString(Settings.KEYS.ANALYZER_NEXUS_URL, nexusUrl);
}
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_PROXY, nexusUsesProxy);
if (databaseDriverName != null && !databaseDriverName.isEmpty()) {
Settings.setString(Settings.KEYS.DB_DRIVER_NAME, databaseDriverName);
}
if (databaseDriverPath != null && !databaseDriverPath.isEmpty()) {
Settings.setString(Settings.KEYS.DB_DRIVER_PATH, databaseDriverPath);
}
if (connectionString != null && !connectionString.isEmpty()) {
Settings.setString(Settings.KEYS.DB_CONNECTION_STRING, connectionString);
}
if (databaseUser != null && !databaseUser.isEmpty()) {
Settings.setString(Settings.KEYS.DB_USER, databaseUser);
}
if (databasePassword != null && !databasePassword.isEmpty()) {
Settings.setString(Settings.KEYS.DB_PASSWORD, databasePassword);
}
if (zipExtensions != null && !zipExtensions.isEmpty()) {
Settings.setString(Settings.KEYS.ADDITIONAL_ZIP_EXTENSIONS, zipExtensions);
}
if (cveUrl12Modified != null && !cveUrl12Modified.isEmpty()) {
Settings.setString(Settings.KEYS.CVE_MODIFIED_12_URL, cveUrl12Modified);
}
if (cveUrl20Modified != null && !cveUrl20Modified.isEmpty()) {
Settings.setString(Settings.KEYS.CVE_MODIFIED_20_URL, cveUrl20Modified);
}
if (cveUrl12Base != null && !cveUrl12Base.isEmpty()) {
Settings.setString(Settings.KEYS.CVE_SCHEMA_1_2, cveUrl12Base);
}
if (cveUrl20Base != null && !cveUrl20Base.isEmpty()) {
Settings.setString(Settings.KEYS.CVE_SCHEMA_2_0, cveUrl20Base);
}
if (pathToMono != null && !pathToMono.isEmpty()) {
Settings.setString(Settings.KEYS.ANALYZER_ASSEMBLY_MONO_PATH, pathToMono);
}
Settings.setStringIfNotEmpty(Settings.KEYS.ANALYZER_NEXUS_URL, nexusUrl);
Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_USES_PROXY, nexusUsesProxy);
Settings.setStringIfNotEmpty(Settings.KEYS.DB_DRIVER_NAME, databaseDriverName);
Settings.setStringIfNotEmpty(Settings.KEYS.DB_DRIVER_PATH, databaseDriverPath);
Settings.setStringIfNotEmpty(Settings.KEYS.DB_CONNECTION_STRING, connectionString);
Settings.setStringIfNotEmpty(Settings.KEYS.DB_USER, databaseUser);
Settings.setStringIfNotEmpty(Settings.KEYS.DB_PASSWORD, databasePassword);
Settings.setStringIfNotEmpty(Settings.KEYS.ADDITIONAL_ZIP_EXTENSIONS, zipExtensions);
Settings.setStringIfNotEmpty(Settings.KEYS.CVE_MODIFIED_12_URL, cveUrl12Modified);
Settings.setStringIfNotEmpty(Settings.KEYS.CVE_MODIFIED_20_URL, cveUrl20Modified);
Settings.setStringIfNotEmpty(Settings.KEYS.CVE_SCHEMA_1_2, cveUrl12Base);
Settings.setStringIfNotEmpty(Settings.KEYS.CVE_SCHEMA_2_0, cveUrl20Base);
Settings.setStringIfNotEmpty(Settings.KEYS.ANALYZER_ASSEMBLY_MONO_PATH, pathToMono);
}
/**
* Executes the dependency-check and generates the report.
*
* @throws org.owasp.dependencycheck.exception.ScanAgentException thrown if there is an exception executing the
* scan.
* @return a reference to the engine used to perform the scan.
* @throws org.owasp.dependencycheck.exception.ScanAgentException thrown if there is an exception executing the scan.
*/
public void execute() throws ScanAgentException {
public Engine execute() throws ScanAgentException {
Engine engine = null;
try {
engine = executeDependencyCheck();
generateExternalReports(engine, new File(this.reportOutputDirectory));
if (this.generateReport) {
generateExternalReports(engine, new File(this.reportOutputDirectory));
}
if (this.showSummary) {
showSummary(engine.getDependencies());
}
@@ -957,15 +941,16 @@ public class DependencyCheckScanAgent {
checkForFailure(engine.getDependencies());
}
} catch (DatabaseException ex) {
LOGGER.log(Level.SEVERE,
LOGGER.error(
"Unable to connect to the dependency-check database; analysis has stopped");
LOGGER.log(Level.FINE, "", ex);
LOGGER.debug("", ex);
} finally {
Settings.cleanup(true);
if (engine != null) {
engine.cleanup();
}
}
return engine;
}
/**
@@ -973,8 +958,7 @@ public class DependencyCheckScanAgent {
* configuration.
*
* @param dependencies the list of dependency objects
* @throws org.owasp.dependencycheck.exception.ScanAgentException thrown if there is an exception executing the
* scan.
* @throws org.owasp.dependencycheck.exception.ScanAgentException thrown if there is an exception executing the scan.
*/
private void checkForFailure(List<Dependency> dependencies) throws ScanAgentException {
final StringBuilder ids = new StringBuilder();
@@ -1034,10 +1018,9 @@ public class DependencyCheckScanAgent {
}
}
if (summary.length() > 0) {
final String msg = String.format("%n%n"
+ "One or more dependencies were identified with known vulnerabilities:%n%n%s"
+ "%n%nSee the dependency-check report for more details.%n%n", summary.toString());
LOGGER.log(Level.WARNING, msg);
LOGGER.warn("\n\nOne or more dependencies were identified with known vulnerabilities:\n\n{}\n\n"
+ "See the dependency-check report for more details.\n\n",
summary.toString());
}
}

View File

@@ -1,13 +1,6 @@
/**
* <html>
* <head>
* <title>org.owasp.dependencycheck.agent</title>
* </head>
* <body>
* The agent package holds an agent API that can be used by other applications that have information about dependencies;
* but would rather implement something in their code directly rather then spawn a process to run the entire
* dependency-check engine. This basically provides programmatic access to running a scan.
* </body>
* </html>
* The agent package holds an agent API that can be used by other applications that have information about dependencies; but would
* rather implement something in their code directly rather then spawn a process to run the entire dependency-check engine. This
* basically provides programmatic access to running a scan.
*/
package org.owasp.dependencycheck.agent;

View File

@@ -19,7 +19,7 @@ package org.owasp.dependencycheck.analyzer;
/**
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public abstract class AbstractAnalyzer implements Analyzer {

View File

@@ -17,28 +17,30 @@
*/
package org.owasp.dependencycheck.analyzer;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
import org.owasp.dependencycheck.dependency.Dependency;
import org.owasp.dependencycheck.utils.InvalidSettingException;
import org.owasp.dependencycheck.utils.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileFilter;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
/**
* The base FileTypeAnalyzer that all analyzers that have specific file types they analyze should extend.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public abstract class AbstractFileTypeAnalyzer extends AbstractAnalyzer implements FileTypeAnalyzer {
//<editor-fold defaultstate="collapsed" desc="Constructor">
/**
* Base constructor that all children must call. This checks the configuration to determine if the analyzer is
* enabled.
* Base constructor that all children must call. This checks the configuration to determine if the analyzer is enabled.
*/
public AbstractFileTypeAnalyzer() {
reset();
@@ -49,7 +51,7 @@ public abstract class AbstractFileTypeAnalyzer extends AbstractAnalyzer implemen
/**
* The logger.
*/
private static final Logger LOGGER = Logger.getLogger(AbstractFileTypeAnalyzer.class.getName());
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractFileTypeAnalyzer.class);
/**
* Whether the file type analyzer detected any files it needs to analyze.
*/
@@ -100,19 +102,16 @@ public abstract class AbstractFileTypeAnalyzer extends AbstractAnalyzer implemen
//<editor-fold defaultstate="collapsed" desc="Abstract methods children must implement">
/**
* <p>
* Returns a list of supported file extensions. An example would be an analyzer that inspected java jar files. The
* getSupportedExtensions function would return a set with a single element "jar".</p>
* Returns the {@link java.io.FileFilter} used to determine which files are to be analyzed. An example would be an analyzer
* that inspected Java jar files. Implementors may use {@link org.owasp.dependencycheck.utils.FileFilterBuilder}.</p>
*
* @return the file filter used to determine which files are to be analyzed
* <p/>
* <p>
* <b>Note:</b> when implementing this the extensions returned MUST be lowercase.</p>
*
* @return The file extensions supported by this analyzer.
*
* <p>
* If the analyzer returns null it will not cause additional files to be analyzed but will be executed against every
* file loaded</p>
* If the analyzer returns null it will not cause additional files to be analyzed, but will be executed against every file
* loaded.</p>
*/
protected abstract Set<String> getSupportedExtensions();
protected abstract FileFilter getFileFilter();
/**
* Initializes the file type analyzer.
@@ -122,8 +121,8 @@ public abstract class AbstractFileTypeAnalyzer extends AbstractAnalyzer implemen
protected abstract void initializeFileTypeAnalyzer() throws Exception;
/**
* 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.
* 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.
*
* @param dependency the dependency to analyze
* @param engine the engine scanning
@@ -164,17 +163,15 @@ public abstract class AbstractFileTypeAnalyzer extends AbstractAnalyzer implemen
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);
LOGGER.warn("Invalid setting for property '{}'", key);
LOGGER.debug("", ex);
LOGGER.warn("{} has been disabled", getName());
}
}
/**
* 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.
* 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.
*
* @param dependency the dependency to analyze
* @param engine the engine scanning
@@ -187,39 +184,28 @@ public abstract class AbstractFileTypeAnalyzer extends AbstractAnalyzer implemen
}
}
/**
* Returns whether or not this analyzer can process the given extension.
*
* @param extension the file extension to test for support.
* @return whether or not the specified file extension is supported by this analyzer.
*/
@Override
public final boolean supportsExtension(String extension) {
if (!enabled) {
return false;
}
final Set<String> ext = getSupportedExtensions();
if (ext == null) {
final String msg = String.format("The '%s' analyzer is misconfigured and does not have any file extensions;"
+ " it will be disabled", getName());
LOGGER.log(Level.SEVERE, msg);
return false;
} else {
final boolean match = ext.contains(extension);
if (match) {
filesMatched = match;
public boolean accept(File pathname) {
final FileFilter filter = getFileFilter();
boolean accepted = false;
if (null == filter) {
LOGGER.error("The '{}' analyzer is misconfigured and does not have a file filter; it will be disabled", getName());
} else if (enabled) {
accepted = filter.accept(pathname);
if (accepted) {
filesMatched = true;
}
return match;
}
return accepted;
}
//</editor-fold>
//</editor-fold>
//<editor-fold defaultstate="collapsed" desc="Static utility methods">
/**
* <p>
* Utility method to help in the creation of the extensions set. This constructs a new Set that can be used in a
* final static declaration.</p>
*
* Utility method to help in the creation of the extensions set. This constructs a new Set that can be used in a final static
* declaration.</p>
* <p/>
* <p>
* This implementation was copied from
* http://stackoverflow.com/questions/2041778/initialize-java-hashset-values-by-construction</p>
@@ -228,10 +214,10 @@ public abstract class AbstractFileTypeAnalyzer extends AbstractAnalyzer implemen
* @return a Set of strings.
*/
protected static Set<String> newHashSet(String... strings) {
final Set<String> set = new HashSet<String>();
final Set<String> set = new HashSet<String>(strings.length);
Collections.addAll(set, strings);
return set;
}
//</editor-fold>
}

View File

@@ -24,8 +24,6 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import org.owasp.dependencycheck.suppression.SuppressionParseException;
import org.owasp.dependencycheck.suppression.SuppressionParser;
@@ -34,18 +32,20 @@ import org.owasp.dependencycheck.utils.DownloadFailedException;
import org.owasp.dependencycheck.utils.Downloader;
import org.owasp.dependencycheck.utils.FileUtils;
import org.owasp.dependencycheck.utils.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Abstract base suppression analyzer that contains methods for parsing the suppression xml file.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public abstract class AbstractSuppressionAnalyzer extends AbstractAnalyzer {
/**
* The Logger for use throughout the class
*/
private static final Logger LOGGER = Logger.getLogger(AbstractSuppressionAnalyzer.class.getName());
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractSuppressionAnalyzer.class);
//<editor-fold defaultstate="collapsed" desc="All standard implementation details of Analyzer">
/**
@@ -103,7 +103,7 @@ public abstract class AbstractSuppressionAnalyzer extends AbstractAnalyzer {
try {
rules = parser.parseSuppressionRules(this.getClass().getClassLoader().getResourceAsStream("dependencycheck-base-suppression.xml"));
} catch (SuppressionParseException ex) {
LOGGER.log(Level.FINE, "Unable to parse the base suppression data file", ex);
LOGGER.debug("Unable to parse the base suppression data file", ex);
}
final String suppressionFilePath = Settings.getString(Settings.KEYS.SUPPRESSION_FILE);
if (suppressionFilePath == null) {
@@ -141,12 +141,11 @@ public abstract class AbstractSuppressionAnalyzer extends AbstractAnalyzer {
try {
//rules = parser.parseSuppressionRules(file);
rules.addAll(parser.parseSuppressionRules(file));
LOGGER.log(Level.FINE, rules.size() + " suppression rules were loaded.");
LOGGER.debug("{} suppression rules were loaded.", rules.size());
} catch (SuppressionParseException ex) {
final String msg = String.format("Unable to parse suppression xml file '%s'", file.getPath());
LOGGER.log(Level.WARNING, msg);
LOGGER.log(Level.WARNING, ex.getMessage());
LOGGER.log(Level.FINE, "", ex);
LOGGER.warn("Unable to parse suppression xml file '{}'", file.getPath());
LOGGER.warn(ex.getMessage());
LOGGER.debug("", ex);
throw ex;
}
}
@@ -171,8 +170,8 @@ public abstract class AbstractSuppressionAnalyzer extends AbstractAnalyzer {
* @throws SuppressionParseException throws the generated SuppressionParseException
*/
private void throwSuppressionParseException(String message, Exception exception) throws SuppressionParseException {
LOGGER.log(Level.WARNING, message);
LOGGER.log(Level.FINE, "", exception);
LOGGER.warn(message);
LOGGER.debug("", exception);
throw new SuppressionParseException(message, exception);
}
}

View File

@@ -20,7 +20,7 @@ package org.owasp.dependencycheck.analyzer;
/**
* An enumeration defining the phases of analysis.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public enum AnalysisPhase {
@@ -28,6 +28,10 @@ public enum AnalysisPhase {
* Initialization phase.
*/
INITIAL,
/**
* Pre information collection phase
*/
PRE_INFORMATION_COLLECTION,
/**
* Information collection phase.
*/

View File

@@ -25,7 +25,7 @@ import org.owasp.dependencycheck.dependency.Dependency;
* An interface that defines an Analyzer that is used to identify Dependencies. An analyzer will collect information
* about the dependency in the form of Evidence.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public interface Analyzer {

View File

@@ -24,7 +24,7 @@ import java.util.ServiceLoader;
* The Analyzer Service Loader. This class loads all services that implement
* org.owasp.dependencycheck.analyzer.Analyzer.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class AnalyzerService {

View File

@@ -18,21 +18,20 @@
package org.owasp.dependencycheck.analyzer;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.ArchiveInputStream;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
@@ -40,32 +39,36 @@ import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.apache.commons.compress.compressors.CompressorInputStream;
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
import org.apache.commons.compress.compressors.bzip2.BZip2Utils;
import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
import org.apache.commons.compress.compressors.gzip.GzipUtils;
import org.apache.commons.compress.utils.IOUtils;
import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
import org.owasp.dependencycheck.analyzer.exception.ArchiveExtractionException;
import org.owasp.dependencycheck.dependency.Dependency;
import org.owasp.dependencycheck.utils.FileFilterBuilder;
import org.owasp.dependencycheck.utils.FileUtils;
import org.owasp.dependencycheck.utils.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* <p>
* An analyzer that extracts files from archives and ensures any supported files contained within the archive are added
* to the dependency list.</p>
* An analyzer that extracts files from archives and ensures any supported files contained within the archive are added to the
* dependency list.</p>
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
/**
* The logger.
*/
private static final Logger LOGGER = Logger.getLogger(ArchiveAnalyzer.class.getName());
/**
* The buffer size to use when extracting files from the archive.
*/
private static final int BUFFER_SIZE = 4096;
private static final Logger LOGGER = LoggerFactory.getLogger(ArchiveAnalyzer.class);
/**
* The count of directories created during analysis. This is used for creating temporary directories.
*/
@@ -97,35 +100,41 @@ public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
*/
private static final Set<String> ZIPPABLES = newHashSet("zip", "ear", "war", "jar", "sar", "apk", "nupkg");
/**
* The set of file extensions supported by this analyzer. Note for developers, any additions to this list will need
* to be explicitly handled in extractFiles().
* The set of file extensions supported by this analyzer. Note for developers, any additions to this list will need to be
* explicitly handled in {@link #extractFiles(File, File, Engine)}.
*/
private static final Set<String> EXTENSIONS = newHashSet("tar", "gz", "tgz");
private static final Set<String> EXTENSIONS = newHashSet("tar", "gz", "tgz", "bz2", "tbz2");
/**
* The set of file extensions to remove from the engine's collection of dependencies.
* Detects files with extensions to remove from the engine's collection of dependencies.
*/
private static final Set<String> REMOVE_FROM_ANALYSIS = newHashSet("zip", "tar", "gz", "tgz"); //TODO add nupkg, apk, sar?
private static final FileFilter REMOVE_FROM_ANALYSIS = FileFilterBuilder.newInstance().addExtensions("zip", "tar", "gz", "tgz", "bz2", "tbz2")
.build();
static {
final String additionalZipExt = Settings.getString(Settings.KEYS.ADDITIONAL_ZIP_EXTENSIONS);
if (additionalZipExt != null) {
final Set<String> ext = new HashSet<String>(Arrays.asList(additionalZipExt));
ZIPPABLES.addAll(ext);
final String[] ext = additionalZipExt.split("\\s*,\\s*");
Collections.addAll(ZIPPABLES, ext);
}
EXTENSIONS.addAll(ZIPPABLES);
}
/**
* Returns a list of file EXTENSIONS supported by this analyzer.
*
* @return a list of file EXTENSIONS supported by this analyzer.
* The file filter used to filter supported files.
*/
private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(EXTENSIONS).build();
@Override
public Set<String> getSupportedExtensions() {
return EXTENSIONS;
protected FileFilter getFileFilter() {
return FILTER;
}
/**
* Detects files with .zip extension.
*/
private static final FileFilter ZIP_FILTER = FileFilterBuilder.newInstance().addExtensions("zip").build();
/**
* Returns the name of the analyzer.
*
@@ -184,17 +193,20 @@ public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
@Override
public void close() throws Exception {
if (tempFileLocation != null && tempFileLocation.exists()) {
LOGGER.log(Level.FINE, "Attempting to delete temporary files");
LOGGER.debug("Attempting to delete temporary files");
final boolean success = FileUtils.delete(tempFileLocation);
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");
if (!success && tempFileLocation.exists()) {
final String[] l = tempFileLocation.list();
if (l != null && l.length > 0) {
LOGGER.warn("Failed to delete some temporary files, see the log for more details");
}
}
}
}
/**
* 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.
* 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.
*
* @param dependency the dependency to analyze
* @param engine the engine scanning
@@ -207,15 +219,8 @@ public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
extractFiles(f, tmpDir, engine);
//make a copy
List<Dependency> dependencies = new ArrayList<Dependency>(engine.getDependencies());
engine.scan(tmpDir);
List<Dependency> newDependencies = engine.getDependencies();
if (dependencies.size() != newDependencies.size()) {
//get the new dependencies
final Set<Dependency> dependencySet = new HashSet<Dependency>();
dependencySet.addAll(newDependencies);
dependencySet.removeAll(dependencies);
final Set<Dependency> dependencySet = findMoreDependencies(engine, tmpDir);
if (!dependencySet.isEmpty()) {
for (Dependency d : dependencySet) {
//fix the dependency's display name and path
final String displayPath = String.format("%s%s",
@@ -229,50 +234,81 @@ public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
//TODO - can we get more evidence from the parent? EAR contains module name, etc.
//analyze the dependency (i.e. extract files) if it is a supported type.
if (this.supportsExtension(d.getFileExtension()) && scanDepth < MAX_SCAN_DEPTH) {
if (this.accept(d.getActualFile()) && scanDepth < MAX_SCAN_DEPTH) {
scanDepth += 1;
analyze(d, engine);
scanDepth -= 1;
}
}
}
if (this.REMOVE_FROM_ANALYSIS.contains(dependency.getFileExtension())) {
if ("zip".equals(dependency.getFileExtension()) && isZipFileActuallyJarFile(dependency)) {
final File tdir = getNextTempDirectory();
final String fileName = dependency.getFileName();
LOGGER.info(String.format("The zip file '%s' appears to be a JAR file, making a copy and analyzing it as a JAR.", fileName));
final File tmpLoc = new File(tdir, fileName.substring(0, fileName.length() - 3) + "jar");
try {
org.apache.commons.io.FileUtils.copyFile(tdir, tmpLoc);
dependencies = new ArrayList<Dependency>(engine.getDependencies());
engine.scan(tmpLoc);
newDependencies = engine.getDependencies();
if (dependencies.size() != newDependencies.size()) {
//get the new dependencies
final Set<Dependency> dependencySet = new HashSet<Dependency>();
dependencySet.addAll(newDependencies);
dependencySet.removeAll(dependencies);
if (dependencySet.size() != 1) {
LOGGER.info("Deep copy of ZIP to JAR file resulted in more then one dependency?");
}
for (Dependency d : dependencySet) {
//fix the dependency's display name and path
d.setFilePath(dependency.getFilePath());
d.setDisplayFileName(dependency.getFileName());
}
}
} catch (IOException ex) {
final String msg = String.format("Unable to perform deep copy on '%s'", dependency.getActualFile().getPath());
LOGGER.log(Level.FINE, msg, ex);
}
}
if (REMOVE_FROM_ANALYSIS.accept(dependency.getActualFile())) {
addDisguisedJarsToDependencies(dependency, engine);
engine.getDependencies().remove(dependency);
}
Collections.sort(engine.getDependencies());
}
/**
* If a zip file was identified as a possible JAR, this method will add the zip to the list of dependencies.
*
* @param dependency the zip file
* @param engine the engine
* @throws AnalysisException thrown if there is an issue
*/
private void addDisguisedJarsToDependencies(Dependency dependency, Engine engine) throws AnalysisException {
if (ZIP_FILTER.accept(dependency.getActualFile()) && isZipFileActuallyJarFile(dependency)) {
final File tdir = getNextTempDirectory();
final String fileName = dependency.getFileName();
LOGGER.info("The zip file '{}' appears to be a JAR file, making a copy and analyzing it as a JAR.", fileName);
final File tmpLoc = new File(tdir, fileName.substring(0, fileName.length() - 3) + "jar");
try {
org.apache.commons.io.FileUtils.copyFile(tdir, tmpLoc);
final Set<Dependency> dependencySet = findMoreDependencies(engine, tmpLoc);
if (!dependencySet.isEmpty()) {
if (dependencySet.size() != 1) {
LOGGER.info("Deep copy of ZIP to JAR file resulted in more than one dependency?");
}
for (Dependency d : dependencySet) {
//fix the dependency's display name and path
d.setFilePath(dependency.getFilePath());
d.setDisplayFileName(dependency.getFileName());
}
}
} catch (IOException ex) {
LOGGER.debug("Unable to perform deep copy on '{}'", dependency.getActualFile().getPath(), ex);
}
}
}
/**
* An empty dependency set.
*/
private static final Set<Dependency> EMPTY_DEPENDENCY_SET = Collections.emptySet();
/**
* Scan the given file/folder, and return any new dependencies found.
*
* @param engine used to scan
* @param file target of scanning
* @return any dependencies that weren't known to the engine before
*/
private static Set<Dependency> findMoreDependencies(Engine engine, File file) {
final List<Dependency> before = new ArrayList<Dependency>(engine.getDependencies());
engine.scan(file);
final List<Dependency> after = engine.getDependencies();
final boolean sizeChanged = before.size() != after.size();
final Set<Dependency> newDependencies;
if (sizeChanged) {
//get the new dependencies
newDependencies = new HashSet<Dependency>(after);
newDependencies.removeAll(before);
} else {
newDependencies = EMPTY_DEPENDENCY_SET;
}
return newDependencies;
}
/**
* Retrieves the next temporary directory to extract an archive too.
*
@@ -302,43 +338,41 @@ public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
* @throws AnalysisException thrown if the archive is not found
*/
private void extractFiles(File archive, File destination, Engine engine) throws AnalysisException {
if (archive == null || destination == null) {
return;
}
FileInputStream fis = null;
try {
fis = new FileInputStream(archive);
} catch (FileNotFoundException ex) {
LOGGER.log(Level.FINE, null, ex);
throw new AnalysisException("Archive file was not found.", ex);
}
final String archiveExt = FileUtils.getFileExtension(archive.getName()).toLowerCase();
try {
if (ZIPPABLES.contains(archiveExt)) {
extractArchive(new ZipArchiveInputStream(new BufferedInputStream(fis)), destination, engine);
} else if ("tar".equals(archiveExt)) {
extractArchive(new TarArchiveInputStream(new BufferedInputStream(fis)), destination, engine);
} else if ("gz".equals(archiveExt) || "tgz".equals(archiveExt)) {
final String uncompressedName = GzipUtils.getUncompressedFilename(archive.getName());
final String uncompressedExt = FileUtils.getFileExtension(uncompressedName).toLowerCase();
if (engine.supportsExtension(uncompressedExt)) {
decompressFile(new GzipCompressorInputStream(new BufferedInputStream(fis)), new File(destination, uncompressedName));
}
}
} catch (ArchiveExtractionException ex) {
final String msg = String.format("Exception extracting archive '%s'.", archive.getName());
LOGGER.log(Level.WARNING, msg);
LOGGER.log(Level.FINE, null, ex);
} catch (IOException ex) {
final String msg = String.format("Exception reading archive '%s'.", archive.getName());
LOGGER.log(Level.WARNING, msg);
LOGGER.log(Level.FINE, null, ex);
} finally {
if (archive != null && destination != null) {
FileInputStream fis;
try {
fis.close();
fis = new FileInputStream(archive);
} catch (FileNotFoundException ex) {
LOGGER.debug("", ex);
throw new AnalysisException("Archive file was not found.", ex);
}
final String archiveExt = FileUtils.getFileExtension(archive.getName()).toLowerCase();
try {
if (ZIPPABLES.contains(archiveExt)) {
extractArchive(new ZipArchiveInputStream(new BufferedInputStream(fis)), destination, engine);
} else if ("tar".equals(archiveExt)) {
extractArchive(new TarArchiveInputStream(new BufferedInputStream(fis)), destination, engine);
} else if ("gz".equals(archiveExt) || "tgz".equals(archiveExt)) {
final String uncompressedName = GzipUtils.getUncompressedFilename(archive.getName());
final File f = new File(destination, uncompressedName);
if (engine.accept(f)) {
decompressFile(new GzipCompressorInputStream(new BufferedInputStream(fis)), f);
}
} else if ("bz2".equals(archiveExt) || "tbz2".equals(archiveExt)) {
final String uncompressedName = BZip2Utils.getUncompressedFilename(archive.getName());
final File f = new File(destination, uncompressedName);
if (engine.accept(f)) {
decompressFile(new BZip2CompressorInputStream(new BufferedInputStream(fis)), f);
}
}
} catch (ArchiveExtractionException ex) {
LOGGER.warn("Exception extracting archive '{}'.", archive.getName());
LOGGER.debug("", ex);
} catch (IOException ex) {
LOGGER.log(Level.FINE, null, ex);
LOGGER.warn("Exception reading archive '{}'.", archive.getName());
LOGGER.debug("", ex);
} finally {
close(fis);
}
}
}
@@ -355,77 +389,51 @@ public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
ArchiveEntry entry;
try {
while ((entry = input.getNextEntry()) != null) {
final File file = new File(destination, entry.getName());
if (entry.isDirectory()) {
final File d = new File(destination, entry.getName());
if (!d.exists()) {
if (!d.mkdirs()) {
final String msg = String.format("Unable to create directory '%s'.", d.getAbsolutePath());
throw new AnalysisException(msg);
}
}
} else {
final File file = new File(destination, entry.getName());
final String ext = FileUtils.getFileExtension(file.getName());
if (engine.supportsExtension(ext)) {
final String extracting = String.format("Extracting '%s'", file.getPath());
LOGGER.fine(extracting);
BufferedOutputStream bos = null;
FileOutputStream fos = null;
try {
final File parent = file.getParentFile();
if (!parent.isDirectory()) {
if (!parent.mkdirs()) {
final String msg = String.format("Unable to build directory '%s'.", parent.getAbsolutePath());
throw new AnalysisException(msg);
}
}
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos, BUFFER_SIZE);
int count;
final byte[] data = new byte[BUFFER_SIZE];
while ((count = input.read(data, 0, BUFFER_SIZE)) != -1) {
bos.write(data, 0, count);
}
bos.flush();
} catch (FileNotFoundException ex) {
LOGGER.log(Level.FINE, null, ex);
final String msg = String.format("Unable to find file '%s'.", file.getName());
throw new AnalysisException(msg, ex);
} catch (IOException ex) {
LOGGER.log(Level.FINE, null, ex);
final String msg = String.format("IO Exception while parsing file '%s'.", file.getName());
throw new AnalysisException(msg, ex);
} finally {
if (bos != null) {
try {
bos.close();
} catch (IOException ex) {
LOGGER.log(Level.FINEST, null, ex);
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException ex) {
LOGGER.log(Level.FINEST, null, ex);
}
}
}
if (!file.exists() && !file.mkdirs()) {
final String msg = String.format("Unable to create directory '%s'.", file.getAbsolutePath());
throw new AnalysisException(msg);
}
} else if (engine.accept(file)) {
extractAcceptedFile(input, file);
}
}
} catch (IOException ex) {
throw new ArchiveExtractionException(ex);
} catch (Throwable ex) {
throw new ArchiveExtractionException(ex);
} finally {
if (input != null) {
try {
input.close();
} catch (IOException ex) {
LOGGER.log(Level.FINEST, null, ex);
}
close(input);
}
}
/**
* Extracts a file from an archive.
*
* @param input the archives input stream
* @param file the file to extract
* @throws AnalysisException thrown if there is an error
*/
private static void extractAcceptedFile(ArchiveInputStream input, File file) throws AnalysisException {
LOGGER.debug("Extracting '{}'", file.getPath());
FileOutputStream fos = null;
try {
final File parent = file.getParentFile();
if (!parent.isDirectory() && !parent.mkdirs()) {
final String msg = String.format("Unable to build directory '%s'.", parent.getAbsolutePath());
throw new AnalysisException(msg);
}
fos = new FileOutputStream(file);
IOUtils.copy(input, fos);
} catch (FileNotFoundException ex) {
LOGGER.debug("", ex);
final String msg = String.format("Unable to find file '%s'.", file.getName());
throw new AnalysisException(msg, ex);
} catch (IOException ex) {
LOGGER.debug("", ex);
final String msg = String.format("IO Exception while parsing file '%s'.", file.getName());
throw new AnalysisException(msg, ex);
} finally {
close(fos);
}
}
@@ -437,29 +445,33 @@ public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
* @throws ArchiveExtractionException thrown if there is an exception decompressing the file
*/
private void decompressFile(CompressorInputStream inputStream, File outputFile) throws ArchiveExtractionException {
final String msg = String.format("Decompressing '%s'", outputFile.getPath());
LOGGER.fine(msg);
LOGGER.debug("Decompressing '{}'", outputFile.getPath());
FileOutputStream out = null;
try {
out = new FileOutputStream(outputFile);
final byte[] buffer = new byte[BUFFER_SIZE];
int n = 0;
while (-1 != (n = inputStream.read(buffer))) {
out.write(buffer, 0, n);
}
IOUtils.copy(inputStream, out);
} catch (FileNotFoundException ex) {
LOGGER.log(Level.FINE, null, ex);
LOGGER.debug("", ex);
throw new ArchiveExtractionException(ex);
} catch (IOException ex) {
LOGGER.log(Level.FINE, null, ex);
LOGGER.debug("", ex);
throw new ArchiveExtractionException(ex);
} finally {
if (out != null) {
try {
out.close();
} catch (IOException ex) {
LOGGER.log(Level.FINEST, null, ex);
}
close(out);
}
}
/**
* Close the given {@link Closeable} instance, ignoring nulls, and logging any thrown {@link IOException}.
*
* @param closeable to be closed
*/
private static void close(Closeable closeable) {
if (null != closeable) {
try {
closeable.close();
} catch (IOException ex) {
LOGGER.trace("", ex);
}
}
}
@@ -490,7 +502,7 @@ public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
}
}
} catch (IOException ex) {
LOGGER.log(Level.FINE, String.format("Unable to unzip zip file '%s'", dependency.getFilePath()), ex);
LOGGER.debug("Unable to unzip zip file '{}'", dependency.getFilePath(), ex);
} finally {
ZipFile.closeQuietly(zip);
}

View File

@@ -17,31 +17,33 @@
*/
package org.owasp.dependencycheck.analyzer;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.NullOutputStream;
import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
import org.owasp.dependencycheck.dependency.Confidence;
import org.owasp.dependencycheck.dependency.Dependency;
import org.owasp.dependencycheck.dependency.Evidence;
import org.owasp.dependencycheck.utils.FileFilterBuilder;
import org.owasp.dependencycheck.utils.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import java.util.ArrayList;
import java.util.List;
/**
* Analyzer for getting company, product, and version information from a .NET assembly.
*
@@ -61,7 +63,7 @@ public class AssemblyAnalyzer extends AbstractFileTypeAnalyzer {
/**
* The list of supported extensions
*/
private static final Set<String> SUPPORTED_EXTENSIONS = newHashSet("dll", "exe");
private static final String[] SUPPORTED_EXTENSIONS = {"dll", "exe"};
/**
* The temp value for GrokAssembly.exe
*/
@@ -73,7 +75,7 @@ public class AssemblyAnalyzer extends AbstractFileTypeAnalyzer {
/**
* Logger
*/
private static final Logger LOGGER = Logger.getLogger(AssemblyAnalyzer.class.getName(), "dependencycheck-resources");
private static final Logger LOGGER = LoggerFactory.getLogger(AssemblyAnalyzer.class);
/**
* Builds the beginnings of a List for ProcessBuilder
@@ -106,45 +108,44 @@ public class AssemblyAnalyzer extends AbstractFileTypeAnalyzer {
public void analyzeFileType(Dependency dependency, Engine engine)
throws AnalysisException {
if (grokAssemblyExe == null) {
LOGGER.warning("analyzer.AssemblyAnalyzer.notdeployed");
LOGGER.warn("GrokAssembly didn't get deployed");
return;
}
final List<String> args = buildArgumentList();
args.add(dependency.getActualFilePath());
final ProcessBuilder pb = new ProcessBuilder(args);
BufferedReader rdr = null;
Document doc = null;
try {
final Process proc = pb.start();
// Try evacuating the error stream
rdr = new BufferedReader(new InputStreamReader(proc.getErrorStream(), "UTF-8"));
String line = null;
// CHECKSTYLE:OFF
while (rdr.ready() && (line = rdr.readLine()) != null) {
LOGGER.log(Level.WARNING, "analyzer.AssemblyAnalyzer.grokassembly.stderr", line);
}
// CHECKSTYLE:ON
int rc = 0;
doc = builder.parse(proc.getInputStream());
// Try evacuating the error stream
final String errorStream = IOUtils.toString(proc.getErrorStream(), "UTF-8");
if (null != errorStream && !errorStream.isEmpty()) {
LOGGER.warn("Error from GrokAssembly: {}", errorStream);
}
int rc = 0;
try {
rc = proc.waitFor();
} catch (InterruptedException ie) {
return;
}
if (rc == 3) {
LOGGER.log(Level.FINE, "analyzer.AssemblyAnalyzer.notassembly", dependency.getActualFilePath());
LOGGER.debug("{} is not a .NET assembly or executable and as such cannot be analyzed by dependency-check",
dependency.getActualFilePath());
return;
} else if (rc != 0) {
LOGGER.log(Level.WARNING, "analyzer.AssemblyAnalyzer.grokassembly.rc", rc);
LOGGER.warn("Return code {} from GrokAssembly", rc);
}
final XPath xpath = XPathFactory.newInstance().newXPath();
// First, see if there was an error
final String error = xpath.evaluate("/assembly/error", doc);
if (error != null && !"".equals(error)) {
if (error != null && !error.isEmpty()) {
throw new AnalysisException(error);
}
@@ -173,14 +174,6 @@ public class AssemblyAnalyzer extends AbstractFileTypeAnalyzer {
} catch (XPathExpressionException xpe) {
// This shouldn't happen
throw new AnalysisException(xpe);
} finally {
if (rdr != null) {
try {
rdr.close();
} catch (IOException ex) {
LOGGER.log(Level.FINEST, "ignore", ex);
}
}
}
}
@@ -197,55 +190,47 @@ public class AssemblyAnalyzer extends AbstractFileTypeAnalyzer {
try {
fos = new FileOutputStream(tempFile);
is = AssemblyAnalyzer.class.getClassLoader().getResourceAsStream("GrokAssembly.exe");
final byte[] buff = new byte[4096];
int bread = -1;
while ((bread = is.read(buff)) >= 0) {
fos.write(buff, 0, bread);
}
IOUtils.copy(is, fos);
grokAssemblyExe = tempFile;
// Set the temp file to get deleted when we're done
grokAssemblyExe.deleteOnExit();
LOGGER.log(Level.FINE, "analyzer.AssemblyAnalyzer.grokassembly.deployed", grokAssemblyExe.getPath());
LOGGER.debug("Extracted GrokAssembly.exe to {}", grokAssemblyExe.getPath());
} catch (IOException ioe) {
this.setEnabled(false);
LOGGER.log(Level.WARNING, "analyzer.AssemblyAnalyzer.grokassembly.notdeployed", ioe.getMessage());
LOGGER.warn("Could not extract GrokAssembly.exe: {}", ioe.getMessage());
throw new AnalysisException("Could not extract GrokAssembly.exe", ioe);
} finally {
if (fos != null) {
try {
fos.close();
} catch (Throwable e) {
LOGGER.fine("Error closing output stream");
LOGGER.debug("Error closing output stream");
}
}
if (is != null) {
try {
is.close();
} catch (Throwable e) {
LOGGER.fine("Error closing input stream");
LOGGER.debug("Error closing input stream");
}
}
}
// Now, need to see if GrokAssembly actually runs from this location.
final List<String> args = buildArgumentList();
BufferedReader rdr = null;
try {
final ProcessBuilder pb = new ProcessBuilder(args);
final Process p = pb.start();
// Try evacuating the error stream
rdr = new BufferedReader(new InputStreamReader(p.getErrorStream(), "UTF-8"));
// CHECKSTYLE:OFF
while (rdr.ready() && rdr.readLine() != null) {
// We expect this to complain
}
// CHECKSTYLE:ON
IOUtils.copy(p.getErrorStream(), NullOutputStream.NULL_OUTPUT_STREAM);
final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(p.getInputStream());
final XPath xpath = XPathFactory.newInstance().newXPath();
final String error = xpath.evaluate("/assembly/error", doc);
if (p.waitFor() != 1 || error == null || "".equals(error)) {
LOGGER.warning("An error occurred with the .NET AssemblyAnalyzer, please see the log for more details.");
LOGGER.fine("GrokAssembly.exe is not working properly");
if (p.waitFor() != 1 || error == null || error.isEmpty()) {
LOGGER.warn("An error occurred with the .NET AssemblyAnalyzer, please see the log for more details.");
LOGGER.debug("GrokAssembly.exe is not working properly");
grokAssemblyExe = null;
this.setEnabled(false);
throw new AnalysisException("Could not execute .NET AssemblyAnalyzer");
@@ -254,23 +239,21 @@ public class AssemblyAnalyzer extends AbstractFileTypeAnalyzer {
if (e instanceof AnalysisException) {
throw (AnalysisException) e;
} else {
LOGGER.warning("analyzer.AssemblyAnalyzer.grokassembly.initialization.failed");
LOGGER.log(Level.FINE, "analyzer.AssemblyAnalyzer.grokassembly.initialization.message", e.getMessage());
LOGGER.warn("An error occurred with the .NET AssemblyAnalyzer;\n"
+ "this can be ignored unless you are scanning .NET DLLs. Please see the log for more details.");
LOGGER.debug("Could not execute GrokAssembly {}", e.getMessage());
this.setEnabled(false);
throw new AnalysisException("An error occured with the .NET AssemblyAnalyzer", e);
}
} finally {
if (rdr != null) {
try {
rdr.close();
} catch (IOException ex) {
LOGGER.log(Level.FINEST, "ignore", ex);
}
}
}
builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
}
/**
* Removes resources used from the local file system.
*
* @throws Exception thrown if there is a problem closing the analyzer
*/
@Override
public void close() throws Exception {
super.close();
@@ -279,18 +262,19 @@ public class AssemblyAnalyzer extends AbstractFileTypeAnalyzer {
grokAssemblyExe.deleteOnExit();
}
} catch (SecurityException se) {
LOGGER.fine("analyzer.AssemblyAnalyzer.grokassembly.notdeleted");
LOGGER.debug("Can't delete temporary GrokAssembly.exe");
}
}
/**
* Gets the set of extensions supported by this analyzer.
*
* @return the list of supported extensions
* The File Filter used to filter supported extensions.
*/
private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(
SUPPORTED_EXTENSIONS).build();
@Override
public Set<String> getSupportedExtensions() {
return SUPPORTED_EXTENSIONS;
protected FileFilter getFileFilter() {
return FILTER;
}
/**

View File

@@ -0,0 +1,279 @@
/*
* 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 Institute for Defense Analyses. All Rights Reserved.
*/
package org.owasp.dependencycheck.analyzer;
import org.apache.commons.io.FileUtils;
import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
import org.owasp.dependencycheck.dependency.Confidence;
import org.owasp.dependencycheck.dependency.Dependency;
import org.owasp.dependencycheck.dependency.EvidenceCollection;
import org.owasp.dependencycheck.utils.FileFilterBuilder;
import org.owasp.dependencycheck.utils.Settings;
import org.owasp.dependencycheck.utils.UrlStringUtils;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Used to analyze Autoconf input files named configure.ac or configure.in. Files simply named "configure" are also analyzed,
* assuming they are generated by Autoconf, and contain certain special package descriptor variables.
*
* @author Dale Visser <dvisser@ida.org>
* @see <a href="https://www.gnu.org/software/autoconf/">Autoconf - GNU Project - Free Software Foundation (FSF)</a>
*/
public class AutoconfAnalyzer extends AbstractFileTypeAnalyzer {
/**
* Autoconf output filename.
*/
private static final String CONFIGURE = "configure";
/**
* Autoconf input filename.
*/
private static final String CONFIGURE_IN = "configure.in";
/**
* Autoconf input filename.
*/
private static final String CONFIGURE_AC = "configure.ac";
/**
* The name of the analyzer.
*/
private static final String ANALYZER_NAME = "Autoconf Analyzer";
/**
* The phase that this analyzer is intended to run in.
*/
private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
/**
* The set of file extensions supported by this analyzer.
*/
private static final String[] EXTENSIONS = {"ac", "in"};
/**
* Matches AC_INIT variables in the output configure script.
*/
private static final Pattern PACKAGE_VAR = Pattern.compile(
"PACKAGE_(.+?)='(.*?)'", Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
/**
* Matches AC_INIT statement in configure.ac file.
*/
private static final Pattern AC_INIT_PATTERN;
static {
// each instance of param or sep_param has a capture group
final String param = "\\[{0,2}(.+?)\\]{0,2}";
final String sepParam = "\\s*,\\s*" + param;
// Group 1: Package
// Group 2: Version
// Group 3: optional
// Group 4: Bug report address (if it exists)
// Group 5: optional
// Group 6: Tarname (if it exists)
// Group 7: optional
// Group 8: URL (if it exists)
AC_INIT_PATTERN = Pattern.compile(String.format(
"AC_INIT\\(%s%s(%s)?(%s)?(%s)?\\s*\\)", param, sepParam,
sepParam, sepParam, sepParam), Pattern.DOTALL
| Pattern.CASE_INSENSITIVE);
}
/**
* The file filter used to determine which files this analyzer supports.
*/
private static final FileFilter FILTER = FileFilterBuilder.newInstance().addFilenames(CONFIGURE).addExtensions(
EXTENSIONS).build();
/**
* Returns the FileFilter
*
* @return the FileFilter
*/
@Override
protected FileFilter getFileFilter() {
return FILTER;
}
/**
* Returns the name of the analyzer.
*
* @return the name of the analyzer.
*/
@Override
public String getName() {
return ANALYZER_NAME;
}
/**
* Returns the phase that the analyzer is intended to run in.
*
* @return the phase that the analyzer is intended to run in.
*/
@Override
public AnalysisPhase getAnalysisPhase() {
return ANALYSIS_PHASE;
}
/**
* Returns the key used in the properties file to reference the analyzer's enabled property.
*
* @return the analyzer's enabled property setting key
*/
@Override
protected String getAnalyzerEnabledSettingKey() {
return Settings.KEYS.ANALYZER_PYTHON_DISTRIBUTION_ENABLED;
}
@Override
protected void analyzeFileType(Dependency dependency, Engine engine)
throws AnalysisException {
final File actualFile = dependency.getActualFile();
final String name = actualFile.getName();
if (name.startsWith(CONFIGURE)) {
final File parent = actualFile.getParentFile();
final String parentName = parent.getName();
dependency.setDisplayFileName(parentName + "/" + name);
final boolean isOutputScript = CONFIGURE.equals(name);
if (isOutputScript || CONFIGURE_AC.equals(name)
|| CONFIGURE_IN.equals(name)) {
final String contents = getFileContents(actualFile);
if (!contents.isEmpty()) {
if (isOutputScript) {
extractConfigureScriptEvidence(dependency, name,
contents);
} else {
gatherEvidence(dependency, name, contents);
}
}
}
} else {
// copy, alter and set in case some other thread is iterating over
final List<Dependency> dependencies = new ArrayList<Dependency>(
engine.getDependencies());
dependencies.remove(dependency);
engine.setDependencies(dependencies);
}
}
/**
* Extracts evidence from the configuration.
*
* @param dependency the dependency being analyzed
* @param name the name of the source of evidence
* @param contents the contents to analyze for evidence
*/
private void extractConfigureScriptEvidence(Dependency dependency,
final String name, final String contents) {
final Matcher matcher = PACKAGE_VAR.matcher(contents);
while (matcher.find()) {
final String variable = matcher.group(1);
final String value = matcher.group(2);
if (!value.isEmpty()) {
if (variable.endsWith("NAME")) {
dependency.getProductEvidence().addEvidence(name, variable,
value, Confidence.HIGHEST);
} else if ("VERSION".equals(variable)) {
dependency.getVersionEvidence().addEvidence(name, variable,
value, Confidence.HIGHEST);
} else if ("BUGREPORT".equals(variable)) {
dependency.getVendorEvidence().addEvidence(name, variable,
value, Confidence.HIGH);
} else if ("URL".equals(variable)) {
dependency.getVendorEvidence().addEvidence(name, variable,
value, Confidence.HIGH);
}
}
}
}
/**
* Retrieves the contents of a given file.
*
* @param actualFile the file to read
* @return the contents of the file
* @throws AnalysisException thrown if there is an IO Exception
*/
private String getFileContents(final File actualFile)
throws AnalysisException {
String contents = "";
try {
contents = FileUtils.readFileToString(actualFile).trim();
} catch (IOException e) {
throw new AnalysisException(
"Problem occurred while reading dependency file.", e);
}
return contents;
}
/**
* Gathers evidence from a given file
*
* @param dependency the dependency to add evidence to
* @param name the source of the evidence
* @param contents the evidence to analyze
*/
private void gatherEvidence(Dependency dependency, final String name,
String contents) {
final Matcher matcher = AC_INIT_PATTERN.matcher(contents);
if (matcher.find()) {
final EvidenceCollection productEvidence = dependency
.getProductEvidence();
productEvidence.addEvidence(name, "Package", matcher.group(1),
Confidence.HIGHEST);
dependency.getVersionEvidence().addEvidence(name,
"Package Version", matcher.group(2), Confidence.HIGHEST);
final EvidenceCollection vendorEvidence = dependency
.getVendorEvidence();
if (null != matcher.group(3)) {
vendorEvidence.addEvidence(name, "Bug report address",
matcher.group(4), Confidence.HIGH);
}
if (null != matcher.group(5)) {
productEvidence.addEvidence(name, "Tarname", matcher.group(6),
Confidence.HIGH);
}
if (null != matcher.group(7)) {
final String url = matcher.group(8);
if (UrlStringUtils.isUrl(url)) {
vendorEvidence.addEvidence(name, "URL", url,
Confidence.HIGH);
}
}
}
}
/**
* Initializes the file type analyzer.
*
* @throws Exception thrown if there is an exception during initialization
*/
@Override
protected void initializeFileTypeAnalyzer() throws Exception {
// No initialization needed.
}
}

View File

@@ -0,0 +1,232 @@
/*
* 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 Institute for Defense Analyses. All Rights Reserved.
*/
package org.owasp.dependencycheck.analyzer;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
import org.owasp.dependencycheck.dependency.Confidence;
import org.owasp.dependencycheck.dependency.Dependency;
import org.owasp.dependencycheck.utils.Checksum;
import org.owasp.dependencycheck.utils.FileFilterBuilder;
import org.owasp.dependencycheck.utils.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* <p>
* Used to analyze CMake build files, and collect information that can be used to determine the associated CPE.</p>
* <p/>
* <p>
* Note: This analyzer catches straightforward invocations of the project command, plus some other observed patterns of version
* inclusion in real CMake projects. Many projects make use of older versions of CMake and/or use custom "homebrew" ways to insert
* version information. Hopefully as the newer CMake call pattern grows in usage, this analyzer allow more CPEs to be
* identified.</p>
*
* @author Dale Visser <dvisser@ida.org>
*/
public class CMakeAnalyzer extends AbstractFileTypeAnalyzer {
/**
* The logger.
*/
private static final Logger LOGGER = LoggerFactory.getLogger(CMakeAnalyzer.class);
/**
* Used when compiling file scanning regex patterns.
*/
private static final int REGEX_OPTIONS = Pattern.DOTALL
| Pattern.CASE_INSENSITIVE | Pattern.MULTILINE;
/**
* Regex to extract the product information.
*/
private static final Pattern PROJECT = Pattern.compile(
"^ *project *\\([ \\n]*(\\w+)[ \\n]*.*?\\)", REGEX_OPTIONS);
/**
* Regex to extract product and version information.
*
* Group 1: Product
*
* Group 2: Version
*/
private static final Pattern SET_VERSION = Pattern
.compile(
"^ *set\\s*\\(\\s*(\\w+)_version\\s+\"?(\\d+(?:\\.\\d+)+)[\\s\"]?\\)",
REGEX_OPTIONS);
/**
* Detects files that can be analyzed.
*/
private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(".cmake")
.addFilenames("CMakeLists.txt").build();
/**
* A reference to SHA1 message digest.
*/
private static MessageDigest sha1 = null;
static {
try {
sha1 = MessageDigest.getInstance("SHA1");
} catch (NoSuchAlgorithmException e) {
LOGGER.error(e.getMessage());
}
}
/**
* Returns the name of the CMake analyzer.
*
* @return the name of the analyzer
*
*/
@Override
public String getName() {
return "CMake Analyzer";
}
/**
* Tell that we are used for information collection.
*
* @return INFORMATION_COLLECTION
*/
@Override
public AnalysisPhase getAnalysisPhase() {
return AnalysisPhase.INFORMATION_COLLECTION;
}
/**
* Returns the set of supported file extensions.
*
* @return the set of supported file extensions
*/
@Override
protected FileFilter getFileFilter() {
return FILTER;
}
/**
* No-op initializer implementation.
*
* @throws Exception never thrown
*/
@Override
protected void initializeFileTypeAnalyzer() throws Exception {
// Nothing to do here.
}
/**
* Analyzes python packages and adds evidence to the dependency.
*
* @param dependency the dependency being analyzed
* @param engine the engine being used to perform the scan
* @throws AnalysisException thrown if there is an unrecoverable error analyzing the dependency
*/
@Override
protected void analyzeFileType(Dependency dependency, Engine engine)
throws AnalysisException {
final File file = dependency.getActualFile();
final String parentName = file.getParentFile().getName();
final String name = file.getName();
dependency.setDisplayFileName(String.format("%s%c%s", parentName, File.separatorChar, name));
String contents;
try {
contents = FileUtils.readFileToString(file).trim();
} catch (IOException e) {
throw new AnalysisException(
"Problem occurred while reading dependency file.", e);
}
if (StringUtils.isNotBlank(contents)) {
final Matcher m = PROJECT.matcher(contents);
int count = 0;
while (m.find()) {
count++;
LOGGER.debug(String.format(
"Found project command match with %d groups: %s",
m.groupCount(), m.group(0)));
final String group = m.group(1);
LOGGER.debug("Group 1: " + group);
dependency.getProductEvidence().addEvidence(name, "Project",
group, Confidence.HIGH);
}
LOGGER.debug("Found {} matches.", count);
analyzeSetVersionCommand(dependency, engine, contents);
}
}
/**
* Extracts the version information from the contents. If more then one version is found additional dependencies are added to
* the dependency list.
*
* @param dependency the dependency being analyzed
* @param engine the dependency-check engine
* @param contents the version information
*/
private void analyzeSetVersionCommand(Dependency dependency, Engine engine, String contents) {
Dependency currentDep = dependency;
final Matcher m = SET_VERSION.matcher(contents);
int count = 0;
while (m.find()) {
count++;
LOGGER.debug("Found project command match with {} groups: {}",
m.groupCount(), m.group(0));
String product = m.group(1);
final String version = m.group(2);
LOGGER.debug("Group 1: " + product);
LOGGER.debug("Group 2: " + version);
final String aliasPrefix = "ALIASOF_";
if (product.startsWith(aliasPrefix)) {
product = product.replaceFirst(aliasPrefix, "");
}
if (count > 1) {
//TODO - refactor so we do not assign to the parameter (checkstyle)
currentDep = new Dependency(dependency.getActualFile());
currentDep.setDisplayFileName(String.format("%s:%s", dependency.getDisplayFileName(), product));
final String filePath = String.format("%s:%s", dependency.getFilePath(), product);
currentDep.setFilePath(filePath);
// prevents coalescing into the dependency provided by engine
currentDep.setSha1sum(Checksum.getHex(sha1.digest(filePath.getBytes())));
engine.getDependencies().add(currentDep);
}
final String source = currentDep.getDisplayFileName();
currentDep.getProductEvidence().addEvidence(source, "Product",
product, Confidence.MEDIUM);
currentDep.getVersionEvidence().addEvidence(source, "Version",
version, Confidence.MEDIUM);
}
LOGGER.debug(String.format("Found %d matches.", count));
}
@Override
protected String getAnalyzerEnabledSettingKey() {
return Settings.KEYS.ANALYZER_CMAKE_ENABLED;
}
}

View File

@@ -25,8 +25,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.queryparser.classic.ParseException;
@@ -49,19 +47,21 @@ import org.owasp.dependencycheck.dependency.Identifier;
import org.owasp.dependencycheck.dependency.VulnerableSoftware;
import org.owasp.dependencycheck.utils.DependencyVersion;
import org.owasp.dependencycheck.utils.DependencyVersionUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* CPEAnalyzer is a utility class that takes a project dependency and attempts to discern if there is an associated CPE. It uses
* the evidence contained within the dependency to search the Lucene index.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class CPEAnalyzer implements Analyzer {
/**
* The Logger.
*/
private static final Logger LOGGER = Logger.getLogger(CPEAnalyzer.class.getName());
private static final Logger LOGGER = LoggerFactory.getLogger(CPEAnalyzer.class);
/**
* The maximum number of query results to return.
*/
@@ -134,15 +134,16 @@ public class CPEAnalyzer implements Analyzer {
* process.
*/
public void open() throws IOException, DatabaseException {
LOGGER.log(Level.FINE, "Opening the CVE Database");
cve = new CveDB();
cve.open();
LOGGER.log(Level.FINE, "Creating the Lucene CPE Index");
cpe = CpeMemoryIndex.getInstance();
try {
LOGGER.info("Creating the CPE Index");
final long creationStart = System.currentTimeMillis();
cpe.open(cve);
LOGGER.info("CPE Index Created ({} ms)", System.currentTimeMillis() - creationStart);
} catch (IndexException ex) {
LOGGER.log(Level.FINE, "IndexException", ex);
LOGGER.debug("IndexException", ex);
throw new DatabaseException(ex);
}
}
@@ -154,12 +155,18 @@ public class CPEAnalyzer implements Analyzer {
public void close() {
if (cpe != null) {
cpe.close();
cpe = null;
}
if (cve != null) {
cve.close();
cve = null;
}
}
public boolean isOpen() {
return cpe != null && cpe.isOpen();
}
/**
* Searches the data store of CPE entries, trying to identify the CPE for the given dependency based on the evidence contained
* within. The dependency passed in is updated with any identified CPE values.
@@ -176,11 +183,11 @@ public class CPEAnalyzer implements Analyzer {
for (Confidence confidence : Confidence.values()) {
if (dependency.getVendorEvidence().contains(confidence)) {
vendors = addEvidenceWithoutDuplicateTerms(vendors, dependency.getVendorEvidence(), confidence);
LOGGER.fine(String.format("vendor search: %s", vendors));
LOGGER.debug("vendor search: {}", vendors);
}
if (dependency.getProductEvidence().contains(confidence)) {
products = addEvidenceWithoutDuplicateTerms(products, dependency.getProductEvidence(), confidence);
LOGGER.fine(String.format("product search: %s", products));
LOGGER.debug("product search: {}", products);
}
if (!vendors.isEmpty() && !products.isEmpty()) {
final List<IndexEntry> entries = searchCPE(vendors, products, dependency.getProductEvidence().getWeighting(),
@@ -190,11 +197,11 @@ public class CPEAnalyzer implements Analyzer {
}
boolean identifierAdded = false;
for (IndexEntry e : entries) {
LOGGER.fine(String.format("Verifying entry: %s", e.toString()));
LOGGER.debug("Verifying entry: {}", e);
if (verifyEntry(e, dependency)) {
final String vendor = e.getVendor();
final String product = e.getProduct();
LOGGER.fine(String.format("identified vendor/product: %s/%s", vendor, product));
LOGGER.debug("identified vendor/product: {}/{}", vendor, product);
identifierAdded |= determineIdentifiers(dependency, vendor, product, confidence);
}
}
@@ -277,13 +284,11 @@ public class CPEAnalyzer implements Analyzer {
}
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);
LOGGER.warn("An error occured querying the CPE data. See the log for more details.");
LOGGER.info("Unable to parse: {}", searchString, 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);
LOGGER.warn("An error occured reading CPE data. See the log for more details.");
LOGGER.info("IO Error with search string: {}", searchString, ex);
}
return null;
}
@@ -330,11 +335,11 @@ public class CPEAnalyzer implements Analyzer {
* @return if the append was successful.
*/
private boolean appendWeightedSearch(StringBuilder sb, String field, String searchText, Set<String> weightedText) {
sb.append(" ").append(field).append(":( ");
sb.append(' ').append(field).append(":( ");
final String cleanText = cleanseText(searchText);
if ("".equals(cleanText)) {
if (cleanText.isEmpty()) {
return false;
}
@@ -344,20 +349,27 @@ public class CPEAnalyzer implements Analyzer {
final StringTokenizer tokens = new StringTokenizer(cleanText);
while (tokens.hasMoreElements()) {
final String word = tokens.nextToken();
String temp = null;
StringBuilder temp = null;
for (String weighted : weightedText) {
final String weightedStr = cleanseText(weighted);
if (equalsIgnoreCaseAndNonAlpha(word, weightedStr)) {
temp = LuceneUtils.escapeLuceneQuery(word) + WEIGHTING_BOOST;
temp = new StringBuilder(word.length() + 2);
LuceneUtils.appendEscapedLuceneQuery(temp, word);
temp.append(WEIGHTING_BOOST);
if (!word.equalsIgnoreCase(weightedStr)) {
temp += " " + LuceneUtils.escapeLuceneQuery(weightedStr) + WEIGHTING_BOOST;
temp.append(' ');
LuceneUtils.appendEscapedLuceneQuery(temp, weightedStr);
temp.append(WEIGHTING_BOOST);
}
break;
}
}
sb.append(' ');
if (temp == null) {
temp = LuceneUtils.escapeLuceneQuery(word);
LuceneUtils.appendEscapedLuceneQuery(sb, word);
} else {
sb.append(temp);
}
sb.append(" ").append(temp);
}
}
sb.append(" ) ");
@@ -402,6 +414,8 @@ public class CPEAnalyzer implements Analyzer {
private boolean verifyEntry(final IndexEntry entry, final Dependency dependency) {
boolean isValid = false;
//TODO - does this nullify some of the fuzzy matching that happens in the lucene search?
// for instance CPE some-component and in the evidence we have SomeComponent.
if (collectionContainsString(dependency.getProductEvidence(), entry.getProduct())
&& collectionContainsString(dependency.getVendorEvidence(), entry.getVendor())) {
//&& collectionContainsVersion(dependency.getVersionEvidence(), entry.getVersion())
@@ -418,17 +432,6 @@ public class CPEAnalyzer implements Analyzer {
* @return whether or not the EvidenceCollection contains the string
*/
private boolean collectionContainsString(EvidenceCollection ec, String text) {
//<editor-fold defaultstate="collapsed" desc="This code fold contains an old version of the code, delete once more testing is done">
// String[] splitText = text.split("[\\s_-]");
//
// for (String search : splitText) {
// //final String search = text.replaceAll("[\\s_-]", "").toLowerCase();
// if (ec.containsUsedString(search)) {
// return true;
// }
// }
//</editor-fold>
//TODO - likely need to change the split... not sure if this will work for CPE with special chars
if (text == null) {
return false;
@@ -450,9 +453,16 @@ public class CPEAnalyzer implements Analyzer {
list.add(word);
}
}
if (tempWord != null && !list.isEmpty()) {
final String tmp = list.get(list.size() - 1) + tempWord;
list.add(tmp);
if (tempWord != null) {
if (!list.isEmpty()) {
final String tmp = list.get(list.size() - 1) + tempWord;
list.add(tmp);
} else {
list.add(tempWord);
}
}
if (list.isEmpty()) {
return false;
}
boolean contains = true;
for (String word : list) {
@@ -511,8 +521,8 @@ public class CPEAnalyzer implements Analyzer {
}
for (VulnerableSoftware vs : cpes) {
DependencyVersion dbVer;
if (vs.getRevision() != null && !vs.getRevision().isEmpty()) {
dbVer = DependencyVersionUtil.parseVersion(vs.getVersion() + "." + vs.getRevision());
if (vs.getUpdate() != null && !vs.getUpdate().isEmpty()) {
dbVer = DependencyVersionUtil.parseVersion(vs.getVersion() + '.' + vs.getUpdate());
} else {
dbVer = DependencyVersionUtil.parseVersion(vs.getVersion());
}

View File

@@ -17,14 +17,6 @@
*/
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;
@@ -33,9 +25,19 @@ 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.xml.pom.PomUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import org.owasp.dependencycheck.utils.DownloadFailedException;
import org.owasp.dependencycheck.utils.Downloader;
import org.owasp.dependencycheck.utils.FileFilterBuilder;
import org.owasp.dependencycheck.utils.InvalidSettingException;
import org.owasp.dependencycheck.utils.Settings;
@@ -50,7 +52,7 @@ public class CentralAnalyzer extends AbstractFileTypeAnalyzer {
/**
* The logger.
*/
private static final Logger LOGGER = Logger.getLogger(CentralAnalyzer.class.getName());
private static final Logger LOGGER = LoggerFactory.getLogger(CentralAnalyzer.class);
/**
* The name of the analyzer.
@@ -65,7 +67,7 @@ public class CentralAnalyzer extends AbstractFileTypeAnalyzer {
/**
* The types of files on which this will work.
*/
private static final Set<String> SUPPORTED_EXTENSIONS = newHashSet("jar");
private static final String SUPPORTED_EXTENSIONS = "jar";
/**
* The analyzer should be disabled if there are errors, so this is a flag to determine if such an error has occurred.
@@ -76,10 +78,6 @@ public class CentralAnalyzer extends AbstractFileTypeAnalyzer {
* The searcher itself.
*/
private CentralSearch searcher;
/**
* Utility to read POM files.
*/
private PomUtils pomUtil = new PomUtils();
/**
* Field indicating if the analyzer is enabled.
*/
@@ -107,7 +105,7 @@ public class CentralAnalyzer extends AbstractFileTypeAnalyzer {
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");
LOGGER.debug("Enabling the Central analyzer");
retval = true;
} else {
LOGGER.info("Nexus analyzer is enabled, disabling the Central Analyzer");
@@ -116,7 +114,7 @@ public class CentralAnalyzer extends AbstractFileTypeAnalyzer {
LOGGER.info("Central analyzer disabled");
}
} catch (InvalidSettingException ise) {
LOGGER.warning("Invalid setting. Disabling the Central analyzer");
LOGGER.warn("Invalid setting. Disabling the Central analyzer");
}
return retval;
}
@@ -128,11 +126,11 @@ public class CentralAnalyzer extends AbstractFileTypeAnalyzer {
*/
@Override
public void initializeFileTypeAnalyzer() throws Exception {
LOGGER.fine("Initializing Central analyzer");
LOGGER.fine(String.format("Central analyzer enabled: %s", isEnabled()));
LOGGER.debug("Initializing Central analyzer");
LOGGER.debug("Central analyzer enabled: {}", isEnabled());
if (isEnabled()) {
final String searchUrl = Settings.getString(Settings.KEYS.ANALYZER_CENTRAL_URL);
LOGGER.fine(String.format("Central Analyzer URL: %s", searchUrl));
LOGGER.debug("Central Analyzer URL: {}", searchUrl);
searcher = new CentralSearch(new URL(searchUrl));
}
}
@@ -168,13 +166,13 @@ public class CentralAnalyzer extends AbstractFileTypeAnalyzer {
}
/**
* Returns the extensions for which this Analyzer runs.
*
* @return the extensions for which this Analyzer runs
* The file filter used to determine which files this analyzer supports.
*/
private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(SUPPORTED_EXTENSIONS).build();
@Override
public Set<String> getSupportedExtensions() {
return SUPPORTED_EXTENSIONS;
protected FileFilter getFileFilter() {
return FILTER;
}
/**
@@ -194,7 +192,7 @@ public class CentralAnalyzer extends AbstractFileTypeAnalyzer {
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()));
LOGGER.debug("Central analyzer found artifact ({}) for dependency ({})", ma, dependency.getFileName());
dependency.addAsEvidence("central", ma, confidence);
boolean pomAnalyzed = false;
for (Evidence e : dependency.getVendorEvidence()) {
@@ -209,19 +207,17 @@ public class CentralAnalyzer extends AbstractFileTypeAnalyzer {
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; "
LOGGER.warn("Unable to fetch pom.xml for {} from Central; "
+ "this could result in undetected CPE/CVEs.", dependency.getFileName());
LOGGER.warning(msg);
LOGGER.fine("Unable to delete temp file");
LOGGER.debug("Unable to delete temp file");
}
LOGGER.fine(String.format("Downloading %s", ma.getPomUrl()));
LOGGER.debug("Downloading {}", ma.getPomUrl());
Downloader.fetchFile(new URL(ma.getPomUrl()), pomFile);
pomUtil.analyzePOM(dependency, pomFile);
PomUtils.analyzePOM(dependency, pomFile);
} catch (DownloadFailedException ex) {
final String msg = String.format("Unable to download pom.xml for %s from Central; "
LOGGER.warn("Unable to download pom.xml for {} from Central; "
+ "this could result in undetected CPE/CVEs.", dependency.getFileName());
LOGGER.warning(msg);
} finally {
if (pomFile != null && !FileUtils.deleteQuietly(pomFile)) {
pomFile.deleteOnExit();
@@ -231,13 +227,12 @@ public class CentralAnalyzer extends AbstractFileTypeAnalyzer {
}
} catch (IllegalArgumentException iae) {
LOGGER.info(String.format("invalid sha1-hash on %s", dependency.getFileName()));
LOGGER.info("invalid sha1-hash on {}", dependency.getFileName());
} catch (FileNotFoundException fnfe) {
LOGGER.fine(String.format("Artifact not found in repository: '%s", dependency.getFileName()));
LOGGER.debug("Artifact not found in repository: '{}", dependency.getFileName());
} catch (IOException ioe) {
LOGGER.log(Level.FINE, "Could not connect to Central search", ioe);
LOGGER.debug("Could not connect to Central search", ioe);
errorFlag = true;
}
}
}

View File

@@ -0,0 +1,162 @@
/*
* 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 The OWASP Foundation. All Rights Reserved.
*/
package org.owasp.dependencycheck.analyzer;
import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
import org.owasp.dependencycheck.data.composer.ComposerDependency;
import org.owasp.dependencycheck.data.composer.ComposerException;
import org.owasp.dependencycheck.data.composer.ComposerLockParser;
import org.owasp.dependencycheck.dependency.Confidence;
import org.owasp.dependencycheck.dependency.Dependency;
import org.owasp.dependencycheck.utils.Checksum;
import org.owasp.dependencycheck.utils.FileFilterBuilder;
import org.owasp.dependencycheck.utils.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.nio.charset.Charset;
import java.security.MessageDigest;
/**
* Used to analyze a composer.lock file for a composer PHP app.
*
* @author colezlaw
*/
public class ComposerLockAnalyzer extends AbstractFileTypeAnalyzer {
/**
* The logger
*/
private static final Logger LOGGER = LoggerFactory.getLogger(ComposerLockAnalyzer.class);
/**
* The analyzer name
*/
private static final String ANALYZER_NAME = "Composer.lock analyzer";
/**
* composer.json
*/
private static final String COMPOSER_LOCK = "composer.lock";
/**
* The FileFilter
*/
private static final FileFilter FILE_FILTER = FileFilterBuilder.newInstance().addFilenames(COMPOSER_LOCK).build();
/**
* Returns the FileFilter
*
* @return the FileFilter
*/
@Override
protected FileFilter getFileFilter() {
return FILE_FILTER;
}
/**
* Initializes the analyzer
*
* @throws Exception
*/
@Override
protected void initializeFileTypeAnalyzer() throws Exception {
sha1 = MessageDigest.getInstance("SHA1");
}
/**
* The MessageDigest for calculating a new digest for the new dependencies added
*/
private MessageDigest sha1 = null;
/**
* Entry point for the analyzer.
*
* @param dependency the dependency to analyze
* @param engine the engine scanning
* @throws AnalysisException if there's a failure during analysis
*/
@Override
protected void analyzeFileType(Dependency dependency, Engine engine) throws AnalysisException {
FileInputStream fis = null;
try {
fis = new FileInputStream(dependency.getActualFile());
final ComposerLockParser clp = new ComposerLockParser(fis);
LOGGER.info("Checking composer.lock file {}", dependency.getActualFilePath());
clp.process();
for (ComposerDependency dep : clp.getDependencies()) {
final Dependency d = new Dependency(dependency.getActualFile());
d.setDisplayFileName(String.format("%s:%s/%s", dependency.getDisplayFileName(), dep.getGroup(), dep.getProject()));
final String filePath = String.format("%s:%s/%s", dependency.getFilePath(), dep.getGroup(), dep.getProject());
d.setFilePath(filePath);
d.setSha1sum(Checksum.getHex(sha1.digest(filePath.getBytes(Charset.defaultCharset()))));
d.getVendorEvidence().addEvidence(COMPOSER_LOCK, "vendor", dep.getGroup(), Confidence.HIGHEST);
d.getProductEvidence().addEvidence(COMPOSER_LOCK, "product", dep.getProject(), Confidence.HIGHEST);
d.getVersionEvidence().addEvidence(COMPOSER_LOCK, "version", dep.getVersion(), Confidence.HIGHEST);
LOGGER.info("Adding dependency {}", d);
engine.getDependencies().add(d);
}
} catch (FileNotFoundException fnfe) {
LOGGER.warn("Error opening dependency {}", dependency.getActualFilePath());
} catch (ComposerException ce) {
LOGGER.warn("Error parsing composer.json {}", dependency.getActualFilePath(), ce);
} finally {
if (fis != null) {
try {
fis.close();
} catch (Exception e) {
LOGGER.debug("Unable to close file", e);
}
}
}
}
/**
* Gets the key to determine whether the analyzer is enabled.
*
* @return the key specifying whether the analyzer is enabled
*/
@Override
protected String getAnalyzerEnabledSettingKey() {
return Settings.KEYS.ANALYZER_COMPOSER_LOCK_ENABLED;
}
/**
* Returns the analyzer's name.
*
* @return the analyzer's name
*/
@Override
public String getName() {
return ANALYZER_NAME;
}
/**
* Returns the phase this analyzer should run under.
*
* @return the analysis phase
*/
@Override
public AnalysisPhase getAnalysisPhase() {
return AnalysisPhase.INFORMATION_COLLECTION;
}
}

View File

@@ -26,7 +26,7 @@ import org.owasp.dependencycheck.suppression.SuppressionRule;
* The suppression analyzer processes an externally defined XML document that complies with the suppressions.xsd schema.
* Any identified CPE entries within the dependencies that match will be removed.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class CpeSuppressionAnalyzer extends AbstractSuppressionAnalyzer {

View File

@@ -22,8 +22,6 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.ListIterator;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.owasp.dependencycheck.Engine;
@@ -32,7 +30,8 @@ import org.owasp.dependencycheck.dependency.Dependency;
import org.owasp.dependencycheck.dependency.Identifier;
import org.owasp.dependencycheck.utils.DependencyVersion;
import org.owasp.dependencycheck.utils.DependencyVersionUtil;
import org.owasp.dependencycheck.utils.LogUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* <p>
@@ -42,14 +41,14 @@ import org.owasp.dependencycheck.utils.LogUtils;
* <p>
* Note, this grouping only works on dependencies with identified CVE entries</p>
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Analyzer {
/**
* The Logger.
*/
private static final Logger LOGGER = Logger.getLogger(DependencyBundlingAnalyzer.class.getName());
private static final Logger LOGGER = LoggerFactory.getLogger(DependencyBundlingAnalyzer.class);
//<editor-fold defaultstate="collapsed" desc="Constants and Member Variables">
/**
@@ -76,6 +75,7 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
*
* @return the name of the analyzer.
*/
@Override
public String getName() {
return ANALYZER_NAME;
}
@@ -85,6 +85,7 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
*
* @return the phase that the analyzer is intended to run in.
*/
@Override
public AnalysisPhase getAnalysisPhase() {
return ANALYSIS_PHASE;
}
@@ -111,7 +112,8 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
final ListIterator<Dependency> subIterator = engine.getDependencies().listIterator(mainIterator.nextIndex());
while (subIterator.hasNext()) {
final Dependency nextDependency = subIterator.next();
if (hashesMatch(dependency, nextDependency)) {
if (hashesMatch(dependency, nextDependency) && !containedInWar(dependency.getFilePath())
&& !containedInWar(nextDependency.getFilePath())) {
if (firstPathIsShortest(dependency.getFilePath(), nextDependency.getFilePath())) {
mergeDependencies(dependency, nextDependency, dependenciesToRemove);
} else {
@@ -125,7 +127,7 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
break;
} else {
mergeDependencies(dependency, nextDependency, dependenciesToRemove);
nextDependency.getRelatedDependencies().remove(nextDependency);
dependency.getRelatedDependencies().remove(nextDependency);
}
} else if (cpeIdentifiersMatch(dependency, nextDependency)
&& hasSameBasePath(dependency, nextDependency)
@@ -211,10 +213,8 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
//version check
final DependencyVersion version1 = DependencyVersionUtil.parseVersion(fileName1);
final DependencyVersion version2 = DependencyVersionUtil.parseVersion(fileName2);
if (version1 != null && version2 != null) {
if (!version1.equals(version2)) {
return false;
}
if (version1 != null && version2 != null && !version1.equals(version2)) {
return false;
}
//filename check
@@ -262,10 +262,7 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
}
}
}
if (LogUtils.isVerboseLoggingEnabled()) {
final String msg = String.format("IdentifiersMatch=%s (%s, %s)", matches, dependency1.getFileName(), dependency2.getFileName());
LOGGER.log(Level.FINE, msg);
}
LOGGER.debug("IdentifiersMatch={} ({}, {})", matches, dependency1.getFileName(), dependency2.getFileName());
return matches;
}
@@ -343,10 +340,7 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
*/
returnVal = leftName.length() <= rightName.length();
}
if (LogUtils.isVerboseLoggingEnabled()) {
final String msg = String.format("IsCore=%s (%s, %s)", returnVal, left.getFileName(), right.getFileName());
LOGGER.log(Level.FINE, msg);
}
LOGGER.debug("IsCore={} ({}, {})", returnVal, left.getFileName(), right.getFileName());
return returnVal;
}
@@ -421,4 +415,14 @@ public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Anal
}
return count;
}
/**
* Checks if the given file path is contained within a war or ear file.
*
* @param filePath the file path to check
* @return true if the path contains '.war\' or '.ear\'.
*/
private boolean containedInWar(String filePath) {
return filePath == null ? false : filePath.matches(".*\\.(ear|war)[\\\\/].*");
}
}

View File

@@ -17,6 +17,7 @@
*/
package org.owasp.dependencycheck.analyzer;
import java.io.FileFilter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
@@ -25,8 +26,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.owasp.dependencycheck.Engine;
@@ -34,18 +33,27 @@ import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
import org.owasp.dependencycheck.dependency.Dependency;
import org.owasp.dependencycheck.dependency.Identifier;
import org.owasp.dependencycheck.dependency.VulnerableSoftware;
import org.owasp.dependencycheck.utils.FileFilterBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This analyzer attempts to remove some well known false positives - specifically regarding the java runtime.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class FalsePositiveAnalyzer extends AbstractAnalyzer {
/**
* The Logger.
*/
private static final Logger LOGGER = Logger.getLogger(FalsePositiveAnalyzer.class.getName());
private static final Logger LOGGER = LoggerFactory.getLogger(FalsePositiveAnalyzer.class);
/**
* The file filter used to find DLL and EXE.
*/
private static final FileFilter DLL_EXE_FILTER = FileFilterBuilder.newInstance().addExtensions("dll", "exe").build();
//<editor-fold defaultstate="collapsed" desc="All standard implementation details of Analyzer">
/**
* The name of the analyzer.
@@ -61,6 +69,7 @@ public class FalsePositiveAnalyzer extends AbstractAnalyzer {
*
* @return the name of the analyzer.
*/
@Override
public String getName() {
return ANALYZER_NAME;
}
@@ -70,6 +79,7 @@ public class FalsePositiveAnalyzer extends AbstractAnalyzer {
*
* @return the phase that the analyzer is intended to run in.
*/
@Override
public AnalysisPhase getAnalysisPhase() {
return ANALYSIS_PHASE;
}
@@ -103,7 +113,7 @@ public class FalsePositiveAnalyzer extends AbstractAnalyzer {
for (Identifier i : dependency.getIdentifiers()) {
if ("maven".contains(i.getType())) {
if (i.getValue() != null && i.getValue().startsWith("org.springframework.")) {
final int endPoint = i.getValue().indexOf(":", 19);
final int endPoint = i.getValue().indexOf(':', 19);
if (endPoint >= 0) {
mustContain = i.getValue().substring(19, endPoint).toLowerCase();
break;
@@ -146,8 +156,7 @@ public class FalsePositiveAnalyzer extends AbstractAnalyzer {
*/
@SuppressWarnings("null")
private void removeSpuriousCPE(Dependency dependency) {
final List<Identifier> ids = new ArrayList<Identifier>();
ids.addAll(dependency.getIdentifiers());
final List<Identifier> ids = new ArrayList<Identifier>(dependency.getIdentifiers());
Collections.sort(ids);
final ListIterator<Identifier> mainItr = ids.listIterator();
while (mainItr.hasNext()) {
@@ -171,7 +180,7 @@ public class FalsePositiveAnalyzer extends AbstractAnalyzer {
final String nextVersion = nextCpe.getVersion();
if (currentVersion == null && nextVersion == null) {
//how did we get here?
LOGGER.log(Level.FINE, "currentVersion and nextVersion are both null?");
LOGGER.debug("currentVersion and nextVersion are both null?");
} else if (currentVersion == null && nextVersion != null) {
dependency.getIdentifiers().remove(currentId);
} else if (nextVersion == null && currentVersion != null) {
@@ -248,15 +257,15 @@ public class FalsePositiveAnalyzer extends AbstractAnalyzer {
try {
cpe.parseName(value);
} catch (UnsupportedEncodingException ex) {
LOGGER.log(Level.FINEST, null, ex);
LOGGER.trace("", ex);
return null;
}
return cpe;
}
/**
* Removes bad CPE matches for a dependency. Unfortunately, right now these are hard-coded patches for specific
* problems identified when testing this on a LARGE volume of jar files.
* Removes bad CPE matches for a dependency. Unfortunately, right now these are hard-coded patches for specific problems
* identified when testing this on a LARGE volume of jar files.
*
* @param dependency the dependency to analyze
*/
@@ -273,7 +282,7 @@ public class FalsePositiveAnalyzer extends AbstractAnalyzer {
//Set<Evidence> artifactId = dependency.getVendorEvidence().getEvidence("pom", "artifactid");
while (itr.hasNext()) {
final Identifier i = itr.next();
//TODO move this startsWith expression to a configuration file?
//TODO move this startsWith expression to the base suppression file
if ("cpe".equals(i.getType())) {
if ((i.getValue().matches(".*c\\+\\+.*")
|| i.getValue().startsWith("cpe:/a:file:file")
@@ -288,7 +297,14 @@ public class FalsePositiveAnalyzer extends AbstractAnalyzer {
|| dependency.getFileName().toLowerCase().endsWith(".dll")
|| dependency.getFileName().toLowerCase().endsWith(".exe")
|| dependency.getFileName().toLowerCase().endsWith(".nuspec")
|| dependency.getFileName().toLowerCase().endsWith(".nupkg"))) {
|| dependency.getFileName().toLowerCase().endsWith(".zip")
|| dependency.getFileName().toLowerCase().endsWith(".sar")
|| dependency.getFileName().toLowerCase().endsWith(".apk")
|| dependency.getFileName().toLowerCase().endsWith(".tar")
|| dependency.getFileName().toLowerCase().endsWith(".gz")
|| dependency.getFileName().toLowerCase().endsWith(".tgz")
|| dependency.getFileName().toLowerCase().endsWith(".ear")
|| dependency.getFileName().toLowerCase().endsWith(".war"))) {
itr.remove();
} else if ((i.getValue().startsWith("cpe:/a:jquery:jquery")
|| i.getValue().startsWith("cpe:/a:prototypejs:prototype")
@@ -302,8 +318,11 @@ public class FalsePositiveAnalyzer extends AbstractAnalyzer {
|| i.getValue().startsWith("cpe:/a:microsoft:word")
|| i.getValue().startsWith("cpe:/a:microsoft:visio")
|| i.getValue().startsWith("cpe:/a:microsoft:powerpoint")
|| i.getValue().startsWith("cpe:/a:microsoft:office"))
|| i.getValue().startsWith("cpe:/a:microsoft:office")
|| i.getValue().startsWith("cpe:/a:core_ftp:core_ftp"))
&& (dependency.getFileName().toLowerCase().endsWith(".jar")
|| dependency.getFileName().toLowerCase().endsWith(".ear")
|| dependency.getFileName().toLowerCase().endsWith(".war")
|| dependency.getFileName().toLowerCase().endsWith("pom.xml"))) {
itr.remove();
} else if (i.getValue().startsWith("cpe:/a:apache:maven")
@@ -354,26 +373,23 @@ public class FalsePositiveAnalyzer extends AbstractAnalyzer {
}
/**
* There are some known CPE entries, specifically regarding sun and oracle products due to the acquisition and
* changes in product names, that based on given evidence we can add the related CPE entries to ensure a complete
* list of CVE entries.
* There are some known CPE entries, specifically regarding sun and oracle products due to the acquisition and changes in
* product names, that based on given evidence we can add the related CPE entries to ensure a complete list of CVE entries.
*
* @param dependency the dependency being analyzed
*/
private void addFalseNegativeCPEs(Dependency dependency) {
//TODO move this to the hint analyzer
final Iterator<Identifier> itr = dependency.getIdentifiers().iterator();
while (itr.hasNext()) {
final Identifier i = itr.next();
if ("cpe".equals(i.getType()) && i.getValue() != null
&& (i.getValue().startsWith("cpe:/a:oracle:opensso:")
|| i.getValue().startsWith("cpe:/a:oracle:opensso_enterprise:")
|| i.getValue().startsWith("cpe:/a:sun:opensso_enterprise:")
|| i.getValue().startsWith("cpe:/a:sun:opensso:"))) {
final String newCpe = String.format("cpe:/a:sun:opensso_enterprise:%s", i.getValue().substring(22));
final String newCpe2 = String.format("cpe:/a:oracle:opensso_enterprise:%s", i.getValue().substring(22));
final String newCpe3 = String.format("cpe:/a:sun:opensso:%s", i.getValue().substring(22));
final String newCpe4 = String.format("cpe:/a:oracle:opensso:%s", i.getValue().substring(22));
for (final Identifier identifier : dependency.getIdentifiers()) {
if ("cpe".equals(identifier.getType()) && identifier.getValue() != null
&& (identifier.getValue().startsWith("cpe:/a:oracle:opensso:")
|| identifier.getValue().startsWith("cpe:/a:oracle:opensso_enterprise:")
|| identifier.getValue().startsWith("cpe:/a:sun:opensso_enterprise:")
|| identifier.getValue().startsWith("cpe:/a:sun:opensso:"))) {
final String newCpe = String.format("cpe:/a:sun:opensso_enterprise:%s", identifier.getValue().substring(22));
final String newCpe2 = String.format("cpe:/a:oracle:opensso_enterprise:%s", identifier.getValue().substring(22));
final String newCpe3 = String.format("cpe:/a:sun:opensso:%s", identifier.getValue().substring(22));
final String newCpe4 = String.format("cpe:/a:oracle:opensso:%s", identifier.getValue().substring(22));
try {
dependency.addIdentifier("cpe",
newCpe,
@@ -388,23 +404,22 @@ public class FalsePositiveAnalyzer extends AbstractAnalyzer {
newCpe4,
String.format(CPEAnalyzer.NVD_SEARCH_URL, URLEncoder.encode(newCpe4, "UTF-8")));
} catch (UnsupportedEncodingException ex) {
LOGGER.log(Level.FINE, null, ex);
LOGGER.debug("", ex);
}
}
}
}
/**
* Removes duplicate entries identified that are contained within JAR files. These occasionally crop up due to POM
* entries or other types of files (such as DLLs and EXEs) being contained within the JAR.
* Removes duplicate entries identified that are contained within JAR files. These occasionally crop up due to POM entries or
* other types of files (such as DLLs and EXEs) being contained within the JAR.
*
* @param dependency the dependency that might be a duplicate
* @param engine the engine used to scan all dependencies
*/
private void removeDuplicativeEntriesFromJar(Dependency dependency, Engine engine) {
if (dependency.getFileName().toLowerCase().endsWith("pom.xml")
|| "dll".equals(dependency.getFileExtension())
|| "exe".equals(dependency.getFileExtension())) {
|| DLL_EXE_FILTER.accept(dependency.getActualFile())) {
String parentPath = dependency.getFilePath().toLowerCase();
if (parentPath.contains(".jar")) {
parentPath = parentPath.substring(0, parentPath.indexOf(".jar") + 4);
@@ -457,8 +472,8 @@ public class FalsePositiveAnalyzer extends AbstractAnalyzer {
*/
private String trimCpeToVendor(String value) {
//cpe:/a:jruby:jruby:1.0.8
final int pos1 = value.indexOf(":", 7); //right of vendor
final int pos2 = value.indexOf(":", pos1 + 1); //right of product
final int pos1 = value.indexOf(':', 7); //right of vendor
final int pos2 = value.indexOf(':', pos1 + 1); //right of product
if (pos2 < 0) {
return value;
} else {

View File

@@ -18,6 +18,7 @@
package org.owasp.dependencycheck.analyzer;
import java.io.File;
import org.apache.commons.io.FilenameUtils;
import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
import org.owasp.dependencycheck.dependency.Confidence;
@@ -29,7 +30,7 @@ import org.owasp.dependencycheck.utils.DependencyVersionUtil;
*
* Takes a dependency and analyzes the filename and determines the hashes.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class FileNameAnalyzer extends AbstractAnalyzer implements Analyzer {
@@ -48,6 +49,7 @@ public class FileNameAnalyzer extends AbstractAnalyzer implements Analyzer {
*
* @return the name of the analyzer.
*/
@Override
public String getName() {
return ANALYZER_NAME;
}
@@ -57,6 +59,7 @@ public class FileNameAnalyzer extends AbstractAnalyzer implements Analyzer {
*
* @return the phase that the analyzer is intended to run in.
*/
@Override
public AnalysisPhase getAnalysisPhase() {
return ANALYSIS_PHASE;
}
@@ -74,13 +77,7 @@ public class FileNameAnalyzer extends AbstractAnalyzer implements Analyzer {
//strip any path information that may get added by ArchiveAnalyzer, etc.
final File f = dependency.getActualFile();
String fileName = f.getName();
//remove file extension
final int pos = fileName.lastIndexOf(".");
if (pos > 0) {
fileName = fileName.substring(0, pos);
}
final String fileName = FilenameUtils.removeExtension(f.getName());
//add version evidence
final DependencyVersion version = DependencyVersionUtil.parseVersion(fileName);

View File

@@ -17,20 +17,14 @@
*/
package org.owasp.dependencycheck.analyzer;
import java.io.FileFilter;
/**
* An Analyzer that scans specific file types.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public interface FileTypeAnalyzer extends Analyzer {
/**
* Returns whether or not this analyzer can process the given extension.
*
* @param extension the file extension to test for support.
* @return whether or not the specified file extension is supported by this analyzer.
*/
boolean supportsExtension(String extension);
public interface FileTypeAnalyzer extends Analyzer, FileFilter {
/**
* Resets the analyzers state.

View File

@@ -29,7 +29,7 @@ import org.owasp.dependencycheck.dependency.Evidence;
/**
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class HintAnalyzer extends AbstractAnalyzer implements Analyzer {
@@ -89,30 +89,70 @@ public class HintAnalyzer extends AbstractAnalyzer implements Analyzer {
"spring-core",
Confidence.HIGH);
final Evidence springTest4 = new Evidence("Manifest",
"Bundle-Vendor",
"SpringSource",
Confidence.HIGH);
final Evidence springTest5 = new Evidence("jar",
final Evidence springTest4 = new Evidence("jar",
"package name",
"springframework",
Confidence.LOW);
final Evidence springSecurityTest1 = new Evidence("Manifest",
"Bundle-Name",
"Spring Security Core",
Confidence.MEDIUM);
final Evidence springSecurityTest2 = new Evidence("pom",
"artifactid",
"spring-security-core",
Confidence.HIGH);
final Evidence symfony = new Evidence("composer.lock",
"vendor",
"symfony",
Confidence.HIGHEST);
final Evidence zendframeworkVendor = new Evidence("composer.lock",
"vendor",
"zendframework",
Confidence.HIGHEST);
final Evidence zendframeworkProduct = new Evidence("composer.lock",
"product",
"zendframework",
Confidence.HIGHEST);
//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.getFileName().contains("spring") && product.contains(springTest4))) {
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", "vmware", Confidence.HIGH);
dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "pivotal", Confidence.HIGH);
}
if (vendor.contains(springTest4)) {
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", "pivotal", Confidence.HIGH);
}
if (product.contains(springSecurityTest1) || product.contains(springSecurityTest2)) {
dependency.getProductEvidence().addEvidence("hint analyzer", "product", "springsource_spring_security", Confidence.HIGH);
dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "SpringSource", Confidence.HIGH);
dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "vmware", Confidence.HIGH);
}
if (vendor.contains(symfony)) {
dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "sensiolabs", Confidence.HIGHEST);
}
if (vendor.contains(zendframeworkVendor)) {
dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "zend", Confidence.HIGHEST);
}
if (product.contains(zendframeworkProduct)) {
dependency.getProductEvidence().addEvidence("hint analyzer", "vendor", "zend_framework", Confidence.HIGHEST);
}
//sun/oracle problem

View File

@@ -17,17 +17,14 @@
*/
package org.owasp.dependencycheck.analyzer;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileFilter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
@@ -42,30 +39,29 @@ import java.util.jar.Attributes;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import javax.xml.transform.sax.SAXSource;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.io.FilenameUtils;
import org.jsoup.Jsoup;
import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
import org.owasp.dependencycheck.dependency.Confidence;
import org.owasp.dependencycheck.dependency.Dependency;
import org.owasp.dependencycheck.dependency.EvidenceCollection;
import org.owasp.dependencycheck.jaxb.pom.PomUtils;
import org.owasp.dependencycheck.jaxb.pom.generated.License;
import org.owasp.dependencycheck.jaxb.pom.generated.Model;
import org.owasp.dependencycheck.jaxb.pom.generated.Organization;
import org.owasp.dependencycheck.utils.FileFilterBuilder;
import org.owasp.dependencycheck.xml.pom.License;
import org.owasp.dependencycheck.xml.pom.PomUtils;
import org.owasp.dependencycheck.xml.pom.Model;
import org.owasp.dependencycheck.utils.FileUtils;
import org.owasp.dependencycheck.utils.NonClosingStream;
import org.owasp.dependencycheck.utils.Settings;
import org.xml.sax.InputSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Used to load a JAR file and collect information that can be used to determine the associated CPE.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class JarAnalyzer extends AbstractFileTypeAnalyzer {
@@ -73,11 +69,7 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
/**
* The logger.
*/
private static final Logger LOGGER = Logger.getLogger(JarAnalyzer.class.getName());
/**
* The buffer size to use when extracting files from the archive.
*/
private static final int BUFFER_SIZE = 4096;
private static final Logger LOGGER = LoggerFactory.getLogger(JarAnalyzer.class);
/**
* The count of directories created during analysis. This is used for creating temporary directories.
*/
@@ -123,11 +115,18 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
"tool",
"bundle-manifestversion",
"bundlemanifestversion",
"bundle-vendor",
"include-resource",
"embed-dependency",
"ipojo-components",
"ipojo-extension",
"eclipse-sourcereferences");
/**
* Deprecated Jar manifest attribute, that is, nonetheless, useful for analysis.
*/
@SuppressWarnings("deprecation")
private static final String IMPLEMENTATION_VENDOR_ID = Attributes.Name.IMPLEMENTATION_VENDOR_ID
.toString();
/**
* item in some manifest, should be considered medium confidence.
*/
@@ -140,26 +139,16 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
* item in some manifest, should be considered medium confidence.
*/
private static final String BUNDLE_NAME = "Bundle-Name"; //: Struts 2 Core
/**
* item in some manifest, should be considered medium confidence.
*/
private static final String BUNDLE_VENDOR = "Bundle-Vendor"; //: Apache Software Foundation
/**
* A pattern to detect HTML within text.
*/
private static final Pattern HTML_DETECTION_PATTERN = Pattern.compile("\\<[a-z]+.*/?\\>", Pattern.CASE_INSENSITIVE);
/**
* The POM Utility for parsing POM files.
*/
private PomUtils pomUtils = null;
//</editor-fold>
/**
* Constructs a new JarAnalyzer.
*/
public JarAnalyzer() {
pomUtils = new PomUtils();
}
//<editor-fold defaultstate="collapsed" desc="All standard implmentation details of Analyzer">
@@ -174,16 +163,21 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
/**
* The set of file extensions supported by this analyzer.
*/
private static final Set<String> EXTENSIONS = newHashSet("jar", "war");
private static final String[] EXTENSIONS = {"jar", "war"};
/**
* Returns a list of file EXTENSIONS supported by this analyzer.
* The file filter used to determine which files this analyzer supports.
*/
private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(EXTENSIONS).build();
/**
* Returns the FileFilter.
*
* @return a list of file EXTENSIONS supported by this analyzer.
* @return the FileFilter
*/
@Override
public Set<String> getSupportedExtensions() {
return EXTENSIONS;
protected FileFilter getFileFilter() {
return FILTER;
}
/**
@@ -201,6 +195,7 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
*
* @return the phase that the analyzer is intended to run in.
*/
@Override
public AnalysisPhase getAnalysisPhase() {
return ANALYSIS_PHASE;
}
@@ -261,26 +256,21 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
try {
jar = new JarFile(dependency.getActualFilePath());
} catch (IOException ex) {
final String msg = String.format("Unable to read JarFile '%s'.", dependency.getActualFilePath());
//final AnalysisException ax = new AnalysisException(msg, ex);
LOGGER.log(Level.WARNING, msg);
LOGGER.log(Level.FINE, "", ex);
LOGGER.warn("Unable to read JarFile '{}'.", dependency.getActualFilePath());
LOGGER.trace("", ex);
return false;
}
List<String> pomEntries;
try {
pomEntries = retrievePomListing(jar);
} catch (IOException ex) {
final String msg = String.format("Unable to read Jar file entries in '%s'.", dependency.getActualFilePath());
//final AnalysisException ax = new AnalysisException(msg, ex);
LOGGER.log(Level.WARNING, msg);
LOGGER.log(Level.FINE, msg, ex);
LOGGER.warn("Unable to read Jar file entries in '{}'.", dependency.getActualFilePath());
LOGGER.trace("", ex);
return false;
}
File externalPom = null;
if (pomEntries.isEmpty()) {
String pomPath = dependency.getActualFilePath();
pomPath = pomPath.substring(0, pomPath.lastIndexOf('.')) + ".pom";
final String pomPath = FilenameUtils.removeExtension(dependency.getActualFilePath()) + ".pom";
externalPom = new File(pomPath);
if (externalPom.isFile()) {
pomEntries.add(pomPath);
@@ -289,13 +279,14 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
}
}
for (String path : pomEntries) {
LOGGER.debug("Reading pom entry: {}", path);
Properties pomProperties = null;
try {
if (externalPom == null) {
pomProperties = retrievePomProperties(path, jar);
}
} catch (IOException ex) {
LOGGER.log(Level.FINEST, "ignore this, failed reading a non-existent pom.properties", ex);
LOGGER.trace("ignore this, failed reading a non-existent pom.properties", ex);
}
Model pom = null;
try {
@@ -315,21 +306,22 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
newDependency.setFileName(displayName);
newDependency.setFilePath(displayPath);
setPomEvidence(newDependency, pom, pomProperties, null);
pom.processProperties(pomProperties);
setPomEvidence(newDependency, pom, null);
engine.getDependencies().add(newDependency);
Collections.sort(engine.getDependencies());
} else {
if (externalPom == null) {
pom = retrievePom(path, jar);
pom = PomUtils.readPom(path, jar);
} else {
pom = pomUtils.readPom(externalPom);
pom = PomUtils.readPom(externalPom);
}
foundSomething |= setPomEvidence(dependency, pom, pomProperties, classes);
pom.processProperties(pomProperties);
foundSomething |= setPomEvidence(dependency, pom, classes);
}
} catch (AnalysisException ex) {
final String msg = String.format("An error occured while analyzing '%s'.", dependency.getActualFilePath());
LOGGER.log(Level.WARNING, msg);
LOGGER.log(Level.FINE, "", ex);
LOGGER.warn("An error occured while analyzing '{}'.", dependency.getActualFilePath());
LOGGER.trace("", ex);
}
}
return foundSomething;
@@ -353,12 +345,13 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
reader = new InputStreamReader(jar.getInputStream(propEntry), "UTF-8");
pomProperties = new Properties();
pomProperties.load(reader);
LOGGER.debug("Read pom.properties: {}", propPath);
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException ex) {
LOGGER.log(Level.FINEST, "close error", ex);
LOGGER.trace("close error", ex);
}
}
}
@@ -380,6 +373,7 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
final JarEntry entry = entries.nextElement();
final String entryName = (new File(entry.getName())).getName().toLowerCase();
if (!entry.isDirectory() && "pom.xml".equals(entryName)) {
LOGGER.trace("POM Entry found: {}", entry.getName());
pomEntries.add(entry.getName());
}
}
@@ -394,62 +388,27 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
* @param dependency the dependency being analyzed
* @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
* {@link org.owasp.dependencycheck.xml.pom.Model} object
*/
private Model extractPom(String path, JarFile jar, Dependency dependency) throws AnalysisException {
InputStream input = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
final File tmpDir = getNextTempDirectory();
final File file = new File(tmpDir, "pom.xml");
try {
final ZipEntry entry = jar.getEntry(path);
input = jar.getInputStream(entry);
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos, BUFFER_SIZE);
int count;
final byte[] data = new byte[BUFFER_SIZE];
while ((count = input.read(data, 0, BUFFER_SIZE)) != -1) {
bos.write(data, 0, count);
}
bos.flush();
IOUtils.copy(input, fos);
dependency.setActualFilePath(file.getAbsolutePath());
} catch (IOException ex) {
final String msg = String.format("An error occurred reading '%s' from '%s'.", path, dependency.getFilePath());
LOGGER.warning(msg);
LOGGER.log(Level.SEVERE, "", ex);
LOGGER.warn("An error occurred reading '{}' from '{}'.", path, dependency.getFilePath());
LOGGER.error("", ex);
} finally {
closeStream(bos);
closeStream(fos);
closeStream(input);
}
Model model = null;
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
final InputStreamReader reader = new InputStreamReader(fis, "UTF-8");
final InputSource xml = new InputSource(reader);
final SAXSource source = new SAXSource(xml);
model = pomUtils.readPom(source);
} catch (FileNotFoundException ex) {
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.FINE, "", ex);
throw new AnalysisException(ex);
} catch (UnsupportedEncodingException ex) {
final String msg = String.format("Unable to parse pom '%s' in jar '%s' (IO Exception)", path, jar.getName());
LOGGER.log(Level.WARNING, msg);
LOGGER.log(Level.FINE, "", ex);
throw new AnalysisException(ex);
} catch (AnalysisException ex) {
final String msg = String.format("Unable to parse pom '%s' in jar '%s'", path, jar.getName());
LOGGER.log(Level.WARNING, msg);
LOGGER.log(Level.FINE, "", ex);
throw ex;
} finally {
closeStream(fis);
}
return model;
return PomUtils.readPom(file);
}
/**
@@ -462,7 +421,7 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
try {
stream.close();
} catch (IOException ex) {
LOGGER.log(Level.FINEST, null, ex);
LOGGER.trace("", ex);
}
}
}
@@ -477,76 +436,60 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
try {
stream.close();
} catch (IOException ex) {
LOGGER.log(Level.FINEST, null, ex);
LOGGER.trace("", ex);
}
}
}
/**
* Retrieves the specified POM from a jar file and converts it to a Model.
*
* @param path the path to the pom.xml file within the jar file
* @param jar the jar file to extract the pom from
* @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
*/
private Model retrievePom(String path, JarFile jar) throws AnalysisException {
final ZipEntry entry = jar.getEntry(path);
Model model = null;
if (entry != null) { //should never be null
try {
final NonClosingStream stream = new NonClosingStream(jar.getInputStream(entry));
final InputStreamReader reader = new InputStreamReader(stream, "UTF-8");
final InputSource xml = new InputSource(reader);
final SAXSource source = new SAXSource(xml);
model = pomUtils.readPom(source);
} catch (SecurityException ex) {
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.FINE, null, ex);
throw new AnalysisException(ex);
} catch (IOException ex) {
final String msg = String.format("Unable to parse pom '%s' in jar '%s' (IO Exception)", path, jar.getName());
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' in jar '%s'", path, jar.getName());
LOGGER.log(Level.WARNING, msg);
LOGGER.log(Level.FINE, "", ex);
throw new AnalysisException(ex);
}
}
return model;
}
/**
* Sets evidence from the pom on the supplied dependency.
*
* @param dependency the dependency to set data on
* @param pom the information from the pom
* @param pomProperties the pom properties file (null if none exists)
* @param classes a collection of ClassNameInformation - containing data about the fully qualified class names within the JAR
* file being analyzed
* @return true if there was evidence within the pom that we could use; otherwise false
*/
private boolean setPomEvidence(Dependency dependency, Model pom, Properties pomProperties, List<ClassNameInformation> classes) {
public static boolean setPomEvidence(Dependency dependency, Model pom, List<ClassNameInformation> classes) {
boolean foundSomething = false;
boolean addAsIdentifier = true;
if (pom == null) {
return foundSomething;
}
String groupid = interpolateString(pom.getGroupId(), pomProperties);
String parentGroupId = null;
String groupid = pom.getGroupId();
String parentGroupId = pom.getParentGroupId();
String artifactid = pom.getArtifactId();
String parentArtifactId = pom.getParentArtifactId();
String version = pom.getVersion();
String parentVersion = pom.getParentVersion();
if (pom.getParent() != null) {
parentGroupId = interpolateString(pom.getParent().getGroupId(), pomProperties);
if ((groupid == null || groupid.isEmpty()) && parentGroupId != null && !parentGroupId.isEmpty()) {
groupid = parentGroupId;
}
if ("org.sonatype.oss".equals(parentGroupId) && "oss-parent".equals(parentArtifactId)) {
parentGroupId = null;
parentArtifactId = null;
parentVersion = null;
}
if ((groupid == null || groupid.isEmpty()) && parentGroupId != null && !parentGroupId.isEmpty()) {
groupid = parentGroupId;
}
final String originalGroupID = groupid;
if (groupid.startsWith("org.") || groupid.startsWith("com.")) {
groupid = groupid.substring(4);
}
if ((artifactid == null || artifactid.isEmpty()) && parentArtifactId != null && !parentArtifactId.isEmpty()) {
artifactid = parentArtifactId;
}
final String originalArtifactID = artifactid;
if (artifactid.startsWith("org.") || artifactid.startsWith("com.")) {
artifactid = artifactid.substring(4);
}
if ((version == null || version.isEmpty()) && parentVersion != null && !parentVersion.isEmpty()) {
version = parentVersion;
}
if (groupid != null && !groupid.isEmpty()) {
foundSomething = true;
@@ -564,20 +507,7 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
addAsIdentifier = false;
}
String artifactid = interpolateString(pom.getArtifactId(), pomProperties);
String parentArtifactId = null;
if (pom.getParent() != null) {
parentArtifactId = interpolateString(pom.getParent().getArtifactId(), pomProperties);
if ((artifactid == null || artifactid.isEmpty()) && parentArtifactId != null && !parentArtifactId.isEmpty()) {
artifactid = parentArtifactId;
}
}
final String originalArtifactID = artifactid;
if (artifactid != null && !artifactid.isEmpty()) {
if (artifactid.startsWith("org.") || artifactid.startsWith("com.")) {
artifactid = artifactid.substring(4);
}
foundSomething = true;
dependency.getProductEvidence().addEvidence("pom", "artifactid", artifactid, Confidence.HIGHEST);
dependency.getVendorEvidence().addEvidence("pom", "artifactid", artifactid, Confidence.LOW);
@@ -592,16 +522,6 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
} else {
addAsIdentifier = false;
}
//version
String version = interpolateString(pom.getVersion(), pomProperties);
String parentVersion = null;
if (pom.getParent() != null) {
parentVersion = interpolateString(pom.getParent().getVersion(), pomProperties);
if ((version == null || version.isEmpty()) && parentVersion != null && !parentVersion.isEmpty()) {
version = parentVersion;
}
}
if (version != null && !version.isEmpty()) {
foundSomething = true;
@@ -614,22 +534,21 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
}
if (addAsIdentifier) {
dependency.addIdentifier("maven", String.format("%s:%s:%s", originalGroupID, originalArtifactID, version), null, Confidence.LOW);
dependency.addIdentifier("maven", String.format("%s:%s:%s", originalGroupID, originalArtifactID, version), null, Confidence.HIGH);
}
// org name
final Organization org = pom.getOrganization();
if (org != null && org.getName() != null) {
foundSomething = true;
final String orgName = interpolateString(org.getName(), pomProperties);
if (orgName != null && !orgName.isEmpty()) {
dependency.getVendorEvidence().addEvidence("pom", "organization name", orgName, Confidence.HIGH);
addMatchingValues(classes, orgName, dependency.getVendorEvidence());
}
final String org = pom.getOrganization();
if (org != null && !org.isEmpty()) {
dependency.getVendorEvidence().addEvidence("pom", "organization name", org, Confidence.HIGH);
dependency.getProductEvidence().addEvidence("pom", "organization name", org, Confidence.LOW);
addMatchingValues(classes, org, dependency.getVendorEvidence());
addMatchingValues(classes, org, dependency.getProductEvidence());
}
//pom name
final String pomName = interpolateString(pom.getName(), pomProperties);
if (pomName != null && !pomName.isEmpty()) {
final String pomName = pom.getName();
if (pomName
!= null && !pomName.isEmpty()) {
foundSomething = true;
dependency.getProductEvidence().addEvidence("pom", "name", pomName, Confidence.HIGH);
dependency.getVendorEvidence().addEvidence("pom", "name", pomName, Confidence.HIGH);
@@ -638,16 +557,15 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
}
//Description
if (pom.getDescription() != null) {
final String description = pom.getDescription();
if (description != null && !description.isEmpty() && !description.startsWith("POM was created by")) {
foundSomething = true;
final String description = interpolateString(pom.getDescription(), pomProperties);
if (description != null && !description.isEmpty()) {
final String trimmedDescription = addDescription(dependency, description, "pom", "description");
addMatchingValues(classes, trimmedDescription, dependency.getVendorEvidence());
addMatchingValues(classes, trimmedDescription, dependency.getProductEvidence());
}
final String trimmedDescription = addDescription(dependency, description, "pom", "description");
addMatchingValues(classes, trimmedDescription, dependency.getVendorEvidence());
addMatchingValues(classes, trimmedDescription, dependency.getProductEvidence());
}
extractLicense(pom, pomProperties, dependency);
extractLicense(pom, dependency);
return foundSomething;
}
@@ -718,9 +636,8 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
&& !dependency.getFileName().toLowerCase().endsWith("-javadoc.jar")
&& !dependency.getFileName().toLowerCase().endsWith("-src.jar")
&& !dependency.getFileName().toLowerCase().endsWith("-doc.jar")) {
LOGGER.log(Level.FINE,
String.format("Jar file '%s' does not contain a manifest.",
dependency.getFileName()));
LOGGER.debug("Jar file '{}' does not contain a manifest.",
dependency.getFileName());
}
return false;
}
@@ -732,6 +649,9 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
final String source = "Manifest";
String specificationVersion = null;
boolean hasImplementationVersion = false;
for (Entry<Object, Object> entry : atts.entrySet()) {
String key = entry.getKey().toString();
String value = atts.getValue(key);
@@ -745,13 +665,16 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
productEvidence.addEvidence(source, key, value, Confidence.HIGH);
addMatchingValues(classInformation, value, productEvidence);
} else if (key.equalsIgnoreCase(Attributes.Name.IMPLEMENTATION_VERSION.toString())) {
hasImplementationVersion = true;
foundSomething = true;
versionEvidence.addEvidence(source, key, value, Confidence.HIGH);
} else if ("specification-version".equalsIgnoreCase(key)) {
specificationVersion = key;
} else if (key.equalsIgnoreCase(Attributes.Name.IMPLEMENTATION_VENDOR.toString())) {
foundSomething = true;
vendorEvidence.addEvidence(source, key, value, Confidence.HIGH);
addMatchingValues(classInformation, value, vendorEvidence);
} else if (key.equalsIgnoreCase(Attributes.Name.IMPLEMENTATION_VENDOR_ID.toString())) {
} else if (key.equalsIgnoreCase(IMPLEMENTATION_VENDOR_ID)) {
foundSomething = true;
vendorEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
addMatchingValues(classInformation, value, vendorEvidence);
@@ -764,10 +687,11 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
foundSomething = true;
productEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
addMatchingValues(classInformation, value, productEvidence);
} else if (key.equalsIgnoreCase(BUNDLE_VENDOR)) {
foundSomething = true;
vendorEvidence.addEvidence(source, key, value, Confidence.HIGH);
addMatchingValues(classInformation, value, vendorEvidence);
// //the following caused false positives.
// } else if (key.equalsIgnoreCase(BUNDLE_VENDOR)) {
// foundSomething = true;
// vendorEvidence.addEvidence(source, key, value, Confidence.HIGH);
// addMatchingValues(classInformation, value, vendorEvidence);
} else if (key.equalsIgnoreCase(BUNDLE_VERSION)) {
foundSomething = true;
versionEvidence.addEvidence(source, key, value, Confidence.HIGH);
@@ -798,9 +722,9 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
foundSomething = true;
if (key.contains("version")) {
if (key.contains("specification")) {
versionEvidence.addEvidence(source, key, value, Confidence.LOW);
} else {
if (!key.contains("specification")) {
//versionEvidence.addEvidence(source, key, value, Confidence.LOW);
//} else {
versionEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
}
} else if ("build-id".equals(key)) {
@@ -852,6 +776,10 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
}
}
}
if (specificationVersion != null && !hasImplementationVersion) {
foundSomething = true;
versionEvidence.addEvidence(source, "specificationn-version", specificationVersion, Confidence.HIGH);
}
} finally {
if (jar != null) {
jar.close();
@@ -965,71 +893,14 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
@Override
public void close() {
if (tempFileLocation != null && tempFileLocation.exists()) {
LOGGER.log(Level.FINE, "Attempting to delete temporary files");
LOGGER.debug("Attempting to delete temporary files");
final boolean success = FileUtils.delete(tempFileLocation);
if (!success) {
LOGGER.log(Level.WARNING,
"Failed to delete some temporary files, see the log for more details");
LOGGER.warn("Failed to delete some temporary files, see the log for more details");
}
}
}
/**
* <p>
* A utility function that will interpolate strings based on values given in the properties file. It will also interpolate the
* strings contained within the properties file so that properties can reference other properties.</p>
* <p>
* <b>Note:</b> if there is no property found the reference will be removed. In other words, if the interpolated string will
* be replaced with an empty string.
* </p>
* <p>
* Example:</p>
* <code>
* Properties p = new Properties();
* p.setProperty("key", "value");
* String s = interpolateString("'${key}' and '${nothing}'", p);
* System.out.println(s);
* </code>
* <p>
* Will result in:</p>
* <code>
* 'value' and ''
* </code>
*
* @param text the string that contains references to properties.
* @param properties a collection of properties that may be referenced within the text.
* @return the interpolated text.
*/
public static String interpolateString(String text, Properties properties) {
final Properties props = properties;
if (text == null) {
return text;
}
if (props == null) {
return text;
}
final int pos = text.indexOf("${");
if (pos < 0) {
return text;
}
final int end = text.indexOf("}");
if (end < pos) {
return text;
}
final String propName = text.substring(pos + 2, end);
String propValue = interpolateString(props.getProperty(propName), props);
if (propValue == null) {
propValue = "";
}
final StringBuilder sb = new StringBuilder(propValue.length() + text.length());
sb.append(text.subSequence(0, pos));
sb.append(propValue);
sb.append(text.substring(end + 1));
return interpolateString(sb.toString(), props); //yes yes, this should be a loop...
}
/**
* Determines if the key value pair from the manifest is for an "import" type entry for package names.
*
@@ -1055,9 +926,9 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
JarFile jar = null;
try {
jar = new JarFile(dependency.getActualFilePath());
final Enumeration entries = jar.entries();
final Enumeration<JarEntry> entries = jar.entries();
while (entries.hasMoreElements()) {
final JarEntry entry = (JarEntry) entries.nextElement();
final JarEntry entry = entries.nextElement();
final String name = entry.getName().toLowerCase();
//no longer stripping "|com\\.sun" - there are some com.sun jar files with CVEs.
if (name.endsWith(".class") && !name.matches("^javax?\\..*$")) {
@@ -1066,15 +937,14 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
}
}
} catch (IOException ex) {
final String msg = String.format("Unable to open jar file '%s'.", dependency.getFileName());
LOGGER.log(Level.WARNING, msg);
LOGGER.log(Level.FINE, null, ex);
LOGGER.warn("Unable to open jar file '{}'.", dependency.getFileName());
LOGGER.debug("", ex);
} finally {
if (jar != null) {
try {
jar.close();
} catch (IOException ex) {
LOGGER.log(Level.FINEST, null, ex);
LOGGER.trace("", ex);
}
}
}
@@ -1137,7 +1007,7 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
* @param value the value to check to see if it contains a package name
* @param evidence the evidence collection to add new entries too
*/
private void addMatchingValues(List<ClassNameInformation> classes, String value, EvidenceCollection evidence) {
private static void addMatchingValues(List<ClassNameInformation> classes, String value, EvidenceCollection evidence) {
if (value == null || value.isEmpty() || classes == null || classes.isEmpty()) {
return;
}
@@ -1169,23 +1039,22 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
* Extracts the license information from the pom and adds it to the dependency.
*
* @param pom the pom object
* @param pomProperties the properties, used for string interpolation
* @param dependency the dependency to add license information too
*/
public static void extractLicense(Model pom, Properties pomProperties, Dependency dependency) {
public static void extractLicense(Model pom, Dependency dependency) {
//license
if (pom.getLicenses() != null) {
String license = null;
for (License lic : pom.getLicenses().getLicense()) {
for (License lic : pom.getLicenses()) {
String tmp = null;
if (lic.getName() != null) {
tmp = interpolateString(lic.getName(), pomProperties);
tmp = lic.getName();
}
if (lic.getUrl() != null) {
if (tmp == null) {
tmp = interpolateString(lic.getUrl(), pomProperties);
tmp = lic.getUrl();
} else {
tmp += ": " + interpolateString(lic.getUrl(), pomProperties);
tmp += ": " + lic.getUrl();
}
}
if (tmp == null) {
@@ -1202,6 +1071,7 @@ public class JarAnalyzer extends AbstractFileTypeAnalyzer {
}
if (license != null) {
dependency.setLicense(license);
}
}
}

View File

@@ -1,141 +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) 2014 Jeremy Long. All Rights Reserved.
*/
package org.owasp.dependencycheck.analyzer;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
import org.owasp.dependencycheck.dependency.Dependency;
import org.owasp.dependencycheck.utils.Settings;
/**
*
* Used to analyze a JavaScript file to gather information to aid in identification of a CPE identifier.
*
* @author Jeremy Long <jeremy.long@owasp.org>
*/
public class JavaScriptAnalyzer extends AbstractFileTypeAnalyzer {
/**
* The logger.
*/
private static final Logger LOGGER = Logger.getLogger(JavaScriptAnalyzer.class.getName());
//<editor-fold defaultstate="collapsed" desc="All standard implementation details of Analyzer">
/**
* The name of the analyzer.
*/
private static final String ANALYZER_NAME = "JavaScript Analyzer";
/**
* The phase that this analyzer is intended to run in.
*/
private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
/**
* The set of file extensions supported by this analyzer.
*/
private static final Set<String> EXTENSIONS = newHashSet("js");
/**
* Returns a list of file EXTENSIONS supported by this analyzer.
*
* @return a list of file EXTENSIONS supported by this analyzer.
*/
@Override
public Set<String> getSupportedExtensions() {
return EXTENSIONS;
}
/**
* Returns the name of the analyzer.
*
* @return the name of the analyzer.
*/
@Override
public String getName() {
return ANALYZER_NAME;
}
/**
* Returns the phase that the analyzer is intended to run in.
*
* @return the phase that the analyzer is intended to run in.
*/
@Override
public AnalysisPhase getAnalysisPhase() {
return ANALYSIS_PHASE;
}
//</editor-fold>
/**
* Returns the key used in the properties file to reference the analyzer's enabled property.
*
* @return the analyzer's enabled property setting key
*/
@Override
protected String getAnalyzerEnabledSettingKey() {
return Settings.KEYS.ANALYZER_JAVASCRIPT_ENABLED;
}
/**
* Loads a specified JavaScript file and collects information from the copyright information contained within.
*
* @param dependency the dependency to analyze.
* @param engine the engine that is scanning the dependencies
* @throws AnalysisException is thrown if there is an error reading the JavaScript file.
*/
@Override
public void analyzeFileType(Dependency dependency, Engine engine) throws AnalysisException {
BufferedReader fin = null;
try {
// /\*([^\*][^/]|[\r\n\f])+?\*/
final Pattern extractComments = Pattern.compile("(/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/)|(//.*)", Pattern.MULTILINE);
File file = dependency.getActualFile();
fin = new BufferedReader(new FileReader(file));
StringBuilder sb = new StringBuilder(2000);
String text;
while ((text = fin.readLine()) != null) {
sb.append(text);
}
} catch (FileNotFoundException ex) {
final String msg = String.format("Dependency file not found: '%s'", dependency.getActualFilePath());
throw new AnalysisException(msg, ex);
} catch (IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
} finally {
if (fin != null) {
try {
fin.close();
} catch (IOException ex) {
LOGGER.log(Level.FINEST, null, ex);
}
}
}
}
@Override
protected void initializeFileTypeAnalyzer() throws Exception {
}
}

View File

@@ -17,14 +17,6 @@
*/
package org.owasp.dependencycheck.analyzer;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
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;
@@ -33,10 +25,20 @@ import org.owasp.dependencycheck.data.nexus.NexusSearch;
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.InvalidSettingException;
import org.owasp.dependencycheck.xml.pom.PomUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import org.owasp.dependencycheck.utils.DownloadFailedException;
import org.owasp.dependencycheck.utils.Downloader;
import org.owasp.dependencycheck.utils.FileFilterBuilder;
import org.owasp.dependencycheck.utils.InvalidSettingException;
import org.owasp.dependencycheck.utils.Settings;
/**
@@ -45,10 +47,10 @@ import org.owasp.dependencycheck.utils.Settings;
* There are two settings which govern this behavior:
*
* <ul>
* <li>{@link org.owasp.dependencycheck.utils.Settings.KEYS#ANALYZER_NEXUS_ENABLED} determines whether this analyzer is
* even enabled. This can be overridden by setting the system property.</li>
* <li>{@link org.owasp.dependencycheck.utils.Settings.KEYS#ANALYZER_NEXUS_URL} the URL to a Nexus service to search by
* SHA-1. There is an expected <code>%s</code> in this where the SHA-1 will get entered.</li>
* <li>{@link org.owasp.dependencycheck.utils.Settings.KEYS#ANALYZER_NEXUS_ENABLED} determines whether this analyzer is even
* enabled. This can be overridden by setting the system property.</li>
* <li>{@link org.owasp.dependencycheck.utils.Settings.KEYS#ANALYZER_NEXUS_URL} the URL to a Nexus service to search by SHA-1.
* There is an expected <code>%s</code> in this where the SHA-1 will get entered.</li>
* </ul>
*
* @author colezlaw
@@ -63,7 +65,7 @@ public class NexusAnalyzer extends AbstractFileTypeAnalyzer {
/**
* The logger.
*/
private static final Logger LOGGER = Logger.getLogger(NexusAnalyzer.class.getName());
private static final Logger LOGGER = LoggerFactory.getLogger(NexusAnalyzer.class);
/**
* The name of the analyzer.
@@ -78,7 +80,7 @@ public class NexusAnalyzer extends AbstractFileTypeAnalyzer {
/**
* The types of files on which this will work.
*/
private static final Set<String> SUPPORTED_EXTENSIONS = newHashSet("jar");
private static final String SUPPORTED_EXTENSIONS = "jar";
/**
* The Nexus Search to be set up for this analyzer.
@@ -89,10 +91,6 @@ public class NexusAnalyzer extends AbstractFileTypeAnalyzer {
* 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
@@ -106,15 +104,15 @@ public class NexusAnalyzer extends AbstractFileTypeAnalyzer {
*/
boolean retval = false;
try {
if ((!DEFAULT_URL.equals(Settings.getString(Settings.KEYS.ANALYZER_NEXUS_URL)))
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");
LOGGER.debug("Nexus analyzer disabled, using Central instead");
}
} catch (InvalidSettingException ise) {
LOGGER.warning("Invalid setting. Disabling Nexus analyzer");
LOGGER.warn("Invalid setting. Disabling Nexus analyzer");
}
return retval;
@@ -137,21 +135,21 @@ public class NexusAnalyzer extends AbstractFileTypeAnalyzer {
*/
@Override
public void initializeFileTypeAnalyzer() throws Exception {
LOGGER.fine("Initializing Nexus Analyzer");
LOGGER.fine(String.format("Nexus Analyzer enabled: %s", isEnabled()));
LOGGER.debug("Initializing Nexus Analyzer");
LOGGER.debug("Nexus Analyzer enabled: {}", isEnabled());
if (isEnabled()) {
final String searchUrl = Settings.getString(Settings.KEYS.ANALYZER_NEXUS_URL);
LOGGER.fine(String.format("Nexus Analyzer URL: %s", searchUrl));
LOGGER.debug("Nexus Analyzer URL: {}", searchUrl);
try {
searcher = new NexusSearch(new URL(searchUrl));
if (!searcher.preflightRequest()) {
LOGGER.warning("There was an issue getting Nexus status. Disabling analyzer.");
LOGGER.warn("There was an issue getting Nexus status. Disabling analyzer.");
setEnabled(false);
}
} catch (MalformedURLException mue) {
// I know that initialize can throw an exception, but we'll
// just disable the analyzer if the URL isn't valid
LOGGER.warning(String.format("Property %s not a valid URL. Nexus Analyzer disabled", searchUrl));
LOGGER.warn("Property {} not a valid URL. Nexus Analyzer disabled", searchUrl);
setEnabled(false);
}
}
@@ -188,13 +186,18 @@ public class NexusAnalyzer extends AbstractFileTypeAnalyzer {
}
/**
* Returns the extensions for which this Analyzer runs.
* The file filter used to determine which files this analyzer supports.
*/
private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(SUPPORTED_EXTENSIONS).build();
/**
* Returns the FileFilter
*
* @return the extensions for which this Analyzer runs
* @return the FileFilter
*/
@Override
public Set<String> getSupportedExtensions() {
return SUPPORTED_EXTENSIONS;
protected FileFilter getFileFilter() {
return FILTER;
}
/**
@@ -213,7 +216,7 @@ public class NexusAnalyzer extends AbstractFileTypeAnalyzer {
final MavenArtifact ma = searcher.searchSha1(dependency.getSha1sum());
dependency.addAsEvidence("nexus", ma, Confidence.HIGH);
boolean pomAnalyzed = false;
LOGGER.fine("POM URL " + ma.getPomUrl());
LOGGER.debug("POM URL {}", ma.getPomUrl());
for (Evidence e : dependency.getVendorEvidence()) {
if ("pom".equals(e.getSource())) {
pomAnalyzed = true;
@@ -226,18 +229,16 @@ public class NexusAnalyzer extends AbstractFileTypeAnalyzer {
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; "
LOGGER.warn("Unable to fetch pom.xml for {} from Nexus repository; "
+ "this could result in undetected CPE/CVEs.", dependency.getFileName());
LOGGER.warning(msg);
LOGGER.fine("Unable to delete temp file");
LOGGER.debug("Unable to delete temp file");
}
LOGGER.fine(String.format("Downloading %s", ma.getPomUrl()));
LOGGER.debug("Downloading {}", ma.getPomUrl());
Downloader.fetchFile(new URL(ma.getPomUrl()), pomFile);
pomUtil.analyzePOM(dependency, pomFile);
PomUtils.analyzePOM(dependency, pomFile);
} catch (DownloadFailedException ex) {
final String msg = String.format("Unable to download pom.xml for %s from Nexus repository; "
LOGGER.warn("Unable to download pom.xml for {} from Nexus repository; "
+ "this could result in undetected CPE/CVEs.", dependency.getFileName());
LOGGER.warning(msg);
} finally {
if (pomFile != null && !FileUtils.deleteQuietly(pomFile)) {
pomFile.deleteOnExit();
@@ -246,14 +247,14 @@ public class NexusAnalyzer extends AbstractFileTypeAnalyzer {
}
} catch (IllegalArgumentException iae) {
//dependency.addAnalysisException(new AnalysisException("Invalid SHA-1"));
LOGGER.info(String.format("invalid sha-1 hash on %s", dependency.getFileName()));
LOGGER.info("invalid sha-1 hash on {}", dependency.getFileName());
} catch (FileNotFoundException fnfe) {
//dependency.addAnalysisException(new AnalysisException("Artifact not found on repository"));
LOGGER.fine(String.format("Artifact not found in repository '%s'", dependency.getFileName()));
LOGGER.log(Level.FINE, fnfe.getMessage(), fnfe);
LOGGER.debug("Artifact not found in repository '{}'", dependency.getFileName());
LOGGER.debug(fnfe.getMessage(), fnfe);
} catch (IOException ioe) {
//dependency.addAnalysisException(new AnalysisException("Could not connect to repository", ioe));
LOGGER.log(Level.FINE, "Could not connect to nexus repository", ioe);
LOGGER.debug("Could not connect to nexus repository", ioe);
}
}
}

View File

@@ -0,0 +1,187 @@
/*
* 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 Institute for Defense Analyses. All Rights Reserved.
*/
package org.owasp.dependencycheck.analyzer;
import org.apache.commons.io.FileUtils;
import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
import org.owasp.dependencycheck.dependency.Confidence;
import org.owasp.dependencycheck.dependency.Dependency;
import org.owasp.dependencycheck.dependency.EvidenceCollection;
import org.owasp.dependencycheck.utils.FileFilterBuilder;
import org.owasp.dependencycheck.utils.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Map;
import javax.json.Json;
import javax.json.JsonException;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.json.JsonString;
import javax.json.JsonValue;
/**
* Used to analyze Node Package Manager (npm) package.json files, and collect information that can be used to determine the
* associated CPE.
*
* @author Dale Visser <dvisser@ida.org>
*/
public class NodePackageAnalyzer extends AbstractFileTypeAnalyzer {
/**
* The logger.
*/
private static final Logger LOGGER = LoggerFactory.getLogger(NodePackageAnalyzer.class);
/**
* The name of the analyzer.
*/
private static final String ANALYZER_NAME = "Node.js Package Analyzer";
/**
* The phase that this analyzer is intended to run in.
*/
private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
/**
* The file name to scan.
*/
public static final String PACKAGE_JSON = "package.json";
/**
* Filter that detects files named "package.json".
*/
private static final FileFilter PACKAGE_JSON_FILTER = FileFilterBuilder.newInstance()
.addFilenames(PACKAGE_JSON).build();
/**
* Returns the FileFilter
*
* @return the FileFilter
*/
@Override
protected FileFilter getFileFilter() {
return PACKAGE_JSON_FILTER;
}
@Override
protected void initializeFileTypeAnalyzer() throws Exception {
// NO-OP
}
/**
* Returns the name of the analyzer.
*
* @return the name of the analyzer.
*/
@Override
public String getName() {
return ANALYZER_NAME;
}
/**
* Returns the phase that the analyzer is intended to run in.
*
* @return the phase that the analyzer is intended to run in.
*/
@Override
public AnalysisPhase getAnalysisPhase() {
return ANALYSIS_PHASE;
}
/**
* Returns the key used in the properties file to reference the analyzer's enabled property.
*
* @return the analyzer's enabled property setting key
*/
@Override
protected String getAnalyzerEnabledSettingKey() {
return Settings.KEYS.ANALYZER_NODE_PACKAGE_ENABLED;
}
@Override
protected void analyzeFileType(Dependency dependency, Engine engine)
throws AnalysisException {
final File file = dependency.getActualFile();
JsonReader jsonReader;
try {
jsonReader = Json.createReader(FileUtils.openInputStream(file));
} catch (IOException e) {
throw new AnalysisException(
"Problem occurred while reading dependency file.", e);
}
try {
final JsonObject json = jsonReader.readObject();
final EvidenceCollection productEvidence = dependency.getProductEvidence();
final EvidenceCollection vendorEvidence = dependency.getVendorEvidence();
if (json.containsKey("name")) {
final Object value = json.get("name");
if (value instanceof JsonString) {
final String valueString = ((JsonString) value).getString();
productEvidence.addEvidence(PACKAGE_JSON, "name", valueString, Confidence.HIGHEST);
vendorEvidence.addEvidence(PACKAGE_JSON, "name_project", String.format("%s_project", valueString), Confidence.LOW);
} else {
LOGGER.warn("JSON value not string as expected: {}", value);
}
}
addToEvidence(json, productEvidence, "description");
addToEvidence(json, vendorEvidence, "author");
addToEvidence(json, dependency.getVersionEvidence(), "version");
dependency.setDisplayFileName(String.format("%s/%s", file.getParentFile().getName(), file.getName()));
} catch (JsonException e) {
LOGGER.warn("Failed to parse package.json file.", e);
} finally {
jsonReader.close();
}
}
/**
* Adds information to an evidence collection from the node json configuration.
*
* @param json information from node.js
* @param collection a set of evidence about a dependency
* @param key the key to obtain the data from the json information
*/
private void addToEvidence(JsonObject json, EvidenceCollection collection, String key) {
if (json.containsKey(key)) {
final JsonValue value = json.get(key);
if (value instanceof JsonString) {
collection.addEvidence(PACKAGE_JSON, key, ((JsonString) value).getString(), Confidence.HIGHEST);
} else if (value instanceof JsonObject) {
final JsonObject jsonObject = (JsonObject) value;
for (final Map.Entry<String, JsonValue> entry : jsonObject.entrySet()) {
final String property = entry.getKey();
final JsonValue subValue = entry.getValue();
if (subValue instanceof JsonString) {
collection.addEvidence(PACKAGE_JSON,
String.format("%s.%s", key, property),
((JsonString) subValue).getString(),
Confidence.HIGHEST);
} else {
LOGGER.warn("JSON sub-value not string as expected: {}", subValue);
}
}
} else {
LOGGER.warn("JSON value not string or JSON object as expected: {}", value);
}
}
}
}

View File

@@ -17,12 +17,6 @@
*/
package org.owasp.dependencycheck.analyzer;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
import org.owasp.dependencycheck.data.nuget.NugetPackage;
@@ -31,7 +25,15 @@ import org.owasp.dependencycheck.data.nuget.NuspecParser;
import org.owasp.dependencycheck.data.nuget.XPathNuspecParser;
import org.owasp.dependencycheck.dependency.Confidence;
import org.owasp.dependencycheck.dependency.Dependency;
import org.owasp.dependencycheck.utils.FileFilterBuilder;
import org.owasp.dependencycheck.utils.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* Analyzer which will parse a Nuspec file to gather module information.
@@ -43,7 +45,7 @@ public class NuspecAnalyzer extends AbstractFileTypeAnalyzer {
/**
* The logger.
*/
private static final Logger LOGGER = Logger.getLogger(NuspecAnalyzer.class.getName());
private static final Logger LOGGER = LoggerFactory.getLogger(NuspecAnalyzer.class);
/**
* The name of the analyzer.
@@ -58,7 +60,7 @@ public class NuspecAnalyzer extends AbstractFileTypeAnalyzer {
/**
* The types of files on which this will work.
*/
private static final Set<String> SUPPORTED_EXTENSIONS = newHashSet("nuspec");
private static final String SUPPORTED_EXTENSIONS = "nuspec";
/**
* Initializes the analyzer once before any analysis is performed.
@@ -100,13 +102,19 @@ public class NuspecAnalyzer extends AbstractFileTypeAnalyzer {
}
/**
* Returns the extensions for which this Analyzer runs.
* The file filter used to determine which files this analyzer supports.
*/
private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(
SUPPORTED_EXTENSIONS).build();
/**
* Returns the FileFilter
*
* @return the extensions for which this Analyzer runs
* @return the FileFilter
*/
@Override
public Set<String> getSupportedExtensions() {
return SUPPORTED_EXTENSIONS;
protected FileFilter getFileFilter() {
return FILTER;
}
/**
@@ -118,7 +126,7 @@ public class NuspecAnalyzer extends AbstractFileTypeAnalyzer {
*/
@Override
public void analyzeFileType(Dependency dependency, Engine engine) throws AnalysisException {
LOGGER.log(Level.FINE, "Checking Nuspec file {0}", dependency.toString());
LOGGER.debug("Checking Nuspec file {}", dependency);
try {
final NuspecParser parser = new XPathNuspecParser();
NugetPackage np = null;
@@ -135,7 +143,7 @@ public class NuspecAnalyzer extends AbstractFileTypeAnalyzer {
try {
fis.close();
} catch (IOException e) {
LOGGER.fine("Error closing input stream");
LOGGER.debug("Error closing input stream");
}
}
}

View File

@@ -32,7 +32,7 @@ import org.owasp.dependencycheck.dependency.Vulnerability;
* NvdCveAnalyzer is a utility class that takes a project dependency and attempts to discern if there is an associated
* CVEs. It uses the the identifiers found by other analyzers to lookup the CVE data.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class NvdCveAnalyzer implements Analyzer {
@@ -73,7 +73,7 @@ public class NvdCveAnalyzer implements Analyzer {
* @return true or false.
*/
public boolean isOpen() {
return (cveDB != null);
return cveDB != null;
}
/**

View File

@@ -0,0 +1,175 @@
/*
* 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 Institute for Defense Analyses. All Rights Reserved.
*/
package org.owasp.dependencycheck.analyzer;
import org.apache.commons.io.FileUtils;
import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
import org.owasp.dependencycheck.dependency.Confidence;
import org.owasp.dependencycheck.dependency.Dependency;
import org.owasp.dependencycheck.utils.FileFilterBuilder;
import org.owasp.dependencycheck.utils.Settings;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Used to analyze OpenSSL source code present in the file system.
*
* @author Dale Visser <dvisser@ida.org>
*/
public class OpenSSLAnalyzer extends AbstractFileTypeAnalyzer {
private static final int HEXADECIMAL = 16;
/**
* Filename to analyze. All other .h files get removed from consideration.
*/
private static final String OPENSSLV_H = "opensslv.h";
/**
* Filter that detects files named "__init__.py".
*/
private static final FileFilter OPENSSLV_FILTER = FileFilterBuilder.newInstance().addFilenames(OPENSSLV_H).build();
private static final Pattern VERSION_PATTERN = Pattern.compile(
"define\\s+OPENSSL_VERSION_NUMBER\\s+0x([0-9a-zA-Z]{8})L", Pattern.DOTALL
| Pattern.CASE_INSENSITIVE);
private static final int MAJOR_OFFSET = 28;
private static final long MINOR_MASK = 0x0ff00000L;
private static final int MINOR_OFFSET = 20;
private static final long FIX_MASK = 0x000ff000L;
private static final int FIX_OFFSET = 12;
private static final long PATCH_MASK = 0x00000ff0L;
private static final int PATCH_OFFSET = 4;
private static final int NUM_LETTERS = 26;
private static final int STATUS_MASK = 0x0000000f;
/**
* Returns the open SSL version as a string.
*
* @param openSSLVersionConstant The open SSL version
* @return the version of openssl
*/
static String getOpenSSLVersion(long openSSLVersionConstant) {
final long major = openSSLVersionConstant >>> MAJOR_OFFSET;
final long minor = (openSSLVersionConstant & MINOR_MASK) >>> MINOR_OFFSET;
final long fix = (openSSLVersionConstant & FIX_MASK) >>> FIX_OFFSET;
final long patchLevel = (openSSLVersionConstant & PATCH_MASK) >>> PATCH_OFFSET;
final String patch = 0 == patchLevel || patchLevel > NUM_LETTERS ? "" : String.valueOf((char) (patchLevel + 'a' - 1));
final int statusCode = (int) (openSSLVersionConstant & STATUS_MASK);
final String status = 0xf == statusCode ? "" : (0 == statusCode ? "-dev" : "-beta" + statusCode);
return String.format("%d.%d.%d%s%s", major, minor, fix, patch, status);
}
/**
* Returns the name of the Python Package Analyzer.
*
* @return the name of the analyzer
*/
@Override
public String getName() {
return "OpenSSL Source Analyzer";
}
/**
* Tell that we are used for information collection.
*
* @return INFORMATION_COLLECTION
*/
@Override
public AnalysisPhase getAnalysisPhase() {
return AnalysisPhase.INFORMATION_COLLECTION;
}
/**
* Returns the set of supported file extensions.
*
* @return the set of supported file extensions
*/
@Override
protected FileFilter getFileFilter() {
return OPENSSLV_FILTER;
}
/**
* No-op initializer implementation.
*
* @throws Exception never thrown
*/
@Override
protected void initializeFileTypeAnalyzer() throws Exception {
// Nothing to do here.
}
/**
* Analyzes python packages and adds evidence to the dependency.
*
* @param dependency the dependency being analyzed
* @param engine the engine being used to perform the scan
* @throws AnalysisException thrown if there is an unrecoverable error analyzing the dependency
*/
@Override
protected void analyzeFileType(Dependency dependency, Engine engine)
throws AnalysisException {
final File file = dependency.getActualFile();
final String parentName = file.getParentFile().getName();
boolean found = false;
final String contents = getFileContents(file);
if (!contents.isEmpty()) {
final Matcher matcher = VERSION_PATTERN.matcher(contents);
if (matcher.find()) {
dependency.getVersionEvidence().addEvidence(OPENSSLV_H, "Version Constant",
getOpenSSLVersion(Long.parseLong(matcher.group(1), HEXADECIMAL)), Confidence.HIGH);
found = true;
}
}
if (found) {
dependency.setDisplayFileName(parentName + File.separatorChar + OPENSSLV_H);
dependency.getVendorEvidence().addEvidence(OPENSSLV_H, "Vendor", "OpenSSL", Confidence.HIGHEST);
dependency.getProductEvidence().addEvidence(OPENSSLV_H, "Product", "OpenSSL", Confidence.HIGHEST);
} else {
engine.getDependencies().remove(dependency);
}
}
/**
* Retrieves the contents of a given file.
*
* @param actualFile the file to read
* @return the contents of the file
* @throws AnalysisException thrown if there is an IO Exception
*/
private String getFileContents(final File actualFile)
throws AnalysisException {
String contents;
try {
contents = FileUtils.readFileToString(actualFile).trim();
} catch (IOException e) {
throw new AnalysisException(
"Problem occurred while reading dependency file.", e);
}
return contents;
}
@Override
protected String getAnalyzerEnabledSettingKey() {
return Settings.KEYS.ANALYZER_OPENSSL_ENABLED;
}
}

View File

@@ -0,0 +1,374 @@
/*
* 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 Institute for Defense Analyses. All Rights Reserved.
*/
package org.owasp.dependencycheck.analyzer;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import org.apache.commons.io.filefilter.NameFileFilter;
import org.apache.commons.io.filefilter.SuffixFileFilter;
import org.apache.commons.io.input.AutoCloseInputStream;
import org.apache.commons.lang3.StringUtils;
import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
import org.owasp.dependencycheck.dependency.Confidence;
import org.owasp.dependencycheck.dependency.Dependency;
import org.owasp.dependencycheck.dependency.EvidenceCollection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.mail.MessagingException;
import javax.mail.internet.InternetHeaders;
import org.owasp.dependencycheck.utils.ExtractionException;
import org.owasp.dependencycheck.utils.ExtractionUtil;
import org.owasp.dependencycheck.utils.FileFilterBuilder;
import org.owasp.dependencycheck.utils.FileUtils;
import org.owasp.dependencycheck.utils.Settings;
import org.owasp.dependencycheck.utils.UrlStringUtils;
/**
* Used to analyze a Wheel or egg distribution files, or their contents in unzipped form, and collect information that can be used
* to determine the associated CPE.
*
* @author Dale Visser <dvisser@ida.org>
*/
public class PythonDistributionAnalyzer extends AbstractFileTypeAnalyzer {
/**
* Name of egg metadata files to analyze.
*/
private static final String PKG_INFO = "PKG-INFO";
/**
* Name of wheel metadata files to analyze.
*/
private static final String METADATA = "METADATA";
/**
* The logger.
*/
private static final Logger LOGGER = LoggerFactory
.getLogger(PythonDistributionAnalyzer.class);
/**
* The count of directories created during analysis. This is used for creating temporary directories.
*/
private static int dirCount = 0;
/**
* The name of the analyzer.
*/
private static final String ANALYZER_NAME = "Python Distribution Analyzer";
/**
* The phase that this analyzer is intended to run in.
*/
private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
/**
* The set of file extensions supported by this analyzer.
*/
private static final String[] EXTENSIONS = {"whl", "egg", "zip"};
/**
* Used to match on egg archive candidate extensions.
*/
private static final FileFilter EGG_OR_ZIP = FileFilterBuilder.newInstance().addExtensions("egg", "zip").build();
/**
* Used to detect files with a .whl extension.
*/
private static final FileFilter WHL_FILTER = FileFilterBuilder.newInstance().addExtensions("whl").build();
/**
* The parent directory for the individual directories per archive.
*/
private File tempFileLocation;
/**
* Filter that detects *.dist-info files (but doesn't verify they are directories.
*/
private static final FilenameFilter DIST_INFO_FILTER = new SuffixFileFilter(
".dist-info");
/**
* Filter that detects files named "METADATA".
*/
private static final FilenameFilter EGG_INFO_FILTER = new NameFileFilter(
"EGG-INFO");
/**
* Filter that detects files named "METADATA".
*/
private static final NameFileFilter METADATA_FILTER = new NameFileFilter(
METADATA);
/**
* Filter that detects files named "PKG-INFO".
*/
private static final NameFileFilter PKG_INFO_FILTER = new NameFileFilter(
PKG_INFO);
/**
* The file filter used to determine which files this analyzer supports.
*/
private static final FileFilter FILTER = FileFilterBuilder.newInstance().addFileFilters(
METADATA_FILTER, PKG_INFO_FILTER).addExtensions(EXTENSIONS).build();
/**
* Returns the FileFilter
*
* @return the FileFilter
*/
@Override
protected FileFilter getFileFilter() {
return FILTER;
}
/**
* Returns the name of the analyzer.
*
* @return the name of the analyzer.
*/
@Override
public String getName() {
return ANALYZER_NAME;
}
/**
* Returns the phase that the analyzer is intended to run in.
*
* @return the phase that the analyzer is intended to run in.
*/
@Override
public AnalysisPhase getAnalysisPhase() {
return ANALYSIS_PHASE;
}
/**
* Returns the key used in the properties file to reference the analyzer's enabled property.
*
* @return the analyzer's enabled property setting key
*/
@Override
protected String getAnalyzerEnabledSettingKey() {
return Settings.KEYS.ANALYZER_PYTHON_DISTRIBUTION_ENABLED;
}
@Override
protected void analyzeFileType(Dependency dependency, Engine engine)
throws AnalysisException {
final File actualFile = dependency.getActualFile();
if (WHL_FILTER.accept(actualFile)) {
collectMetadataFromArchiveFormat(dependency, DIST_INFO_FILTER,
METADATA_FILTER);
} else if (EGG_OR_ZIP.accept(actualFile)) {
collectMetadataFromArchiveFormat(dependency, EGG_INFO_FILTER,
PKG_INFO_FILTER);
} else {
final String name = actualFile.getName();
final boolean metadata = METADATA.equals(name);
if (metadata || PKG_INFO.equals(name)) {
final File parent = actualFile.getParentFile();
final String parentName = parent.getName();
dependency.setDisplayFileName(parentName + "/" + name);
if (parent.isDirectory()
&& (metadata && parentName.endsWith(".dist-info")
|| parentName.endsWith(".egg-info") || "EGG-INFO"
.equals(parentName))) {
collectWheelMetadata(dependency, actualFile);
}
}
}
}
/**
* Collects the meta data from an archive.
*
* @param dependency the archive being scanned
* @param folderFilter the filter to apply to the folder
* @param metadataFilter the filter to apply to the meta data
* @throws AnalysisException thrown when there is a problem analyzing the dependency
*/
private void collectMetadataFromArchiveFormat(Dependency dependency,
FilenameFilter folderFilter, FilenameFilter metadataFilter)
throws AnalysisException {
final File temp = getNextTempDirectory();
LOGGER.debug("{} exists? {}", temp, temp.exists());
try {
ExtractionUtil.extractFilesUsingFilter(
new File(dependency.getActualFilePath()), temp,
metadataFilter);
} catch (ExtractionException ex) {
throw new AnalysisException(ex);
}
collectWheelMetadata(
dependency,
getMatchingFile(getMatchingFile(temp, folderFilter),
metadataFilter));
}
/**
* Makes sure a usable temporary directory is available.
*
* @throws Exception an AnalyzeException is thrown when the temp directory cannot be created
*/
@Override
protected void initializeFileTypeAnalyzer() throws Exception {
final File baseDir = Settings.getTempDirectory();
tempFileLocation = File.createTempFile("check", "tmp", baseDir);
if (!tempFileLocation.delete()) {
final String msg = String.format(
"Unable to delete temporary file '%s'.",
tempFileLocation.getAbsolutePath());
throw new AnalysisException(msg);
}
if (!tempFileLocation.mkdirs()) {
final String msg = String.format(
"Unable to create directory '%s'.",
tempFileLocation.getAbsolutePath());
throw new AnalysisException(msg);
}
}
/**
* Deletes any files extracted from the Wheel during analysis.
*/
@Override
public void close() {
if (tempFileLocation != null && tempFileLocation.exists()) {
LOGGER.debug("Attempting to delete temporary files");
final boolean success = FileUtils.delete(tempFileLocation);
if (!success) {
LOGGER.warn(
"Failed to delete some temporary files, see the log for more details");
}
}
}
/**
* Gathers evidence from the METADATA file.
*
* @param dependency the dependency being analyzed
* @param file a reference to the manifest/properties file
*/
private static void collectWheelMetadata(Dependency dependency, File file) {
final InternetHeaders headers = getManifestProperties(file);
addPropertyToEvidence(headers, dependency.getVersionEvidence(),
"Version", Confidence.HIGHEST);
addPropertyToEvidence(headers, dependency.getProductEvidence(), "Name",
Confidence.HIGHEST);
final String url = headers.getHeader("Home-page", null);
final EvidenceCollection vendorEvidence = dependency
.getVendorEvidence();
if (StringUtils.isNotBlank(url)) {
if (UrlStringUtils.isUrl(url)) {
vendorEvidence.addEvidence(METADATA, "vendor", url,
Confidence.MEDIUM);
}
}
addPropertyToEvidence(headers, vendorEvidence, "Author", Confidence.LOW);
final String summary = headers.getHeader("Summary", null);
if (StringUtils.isNotBlank(summary)) {
JarAnalyzer
.addDescription(dependency, summary, METADATA, "summary");
}
}
/**
* Adds a value to the evidence collection.
*
* @param headers the properties collection
* @param evidence the evidence collection to add the value
* @param property the property name
* @param confidence the confidence of the evidence
*/
private static void addPropertyToEvidence(InternetHeaders headers,
EvidenceCollection evidence, String property, Confidence confidence) {
final String value = headers.getHeader(property, null);
LOGGER.debug("Property: {}, Value: {}", property, value);
if (StringUtils.isNotBlank(value)) {
evidence.addEvidence(METADATA, property, value, confidence);
}
}
/**
* Returns a list of files that match the given filter, this does not recursively scan the directory.
*
* @param folder the folder to filter
* @param filter the filter to apply to the files in the directory
* @return the list of Files in the directory that match the provided filter
*/
private static File getMatchingFile(File folder, FilenameFilter filter) {
File result = null;
final File[] matches = folder.listFiles(filter);
if (null != matches && 1 == matches.length) {
result = matches[0];
}
return result;
}
/**
* Reads the manifest entries from the provided file.
*
* @param manifest the manifest
* @return the manifest entries
*/
private static InternetHeaders getManifestProperties(File manifest) {
final InternetHeaders result = new InternetHeaders();
if (null == manifest) {
LOGGER.debug("Manifest file not found.");
} else {
try {
result.load(new AutoCloseInputStream(new BufferedInputStream(
new FileInputStream(manifest))));
} catch (MessagingException e) {
LOGGER.warn(e.getMessage(), e);
} catch (FileNotFoundException e) {
LOGGER.warn(e.getMessage(), e);
}
}
return result;
}
/**
* Retrieves the next temporary destination directory for extracting an archive.
*
* @return a directory
* @throws AnalysisException thrown if unable to create temporary directory
*/
private File getNextTempDirectory() throws AnalysisException {
File directory;
// getting an exception for some directories not being able to be
// created; might be because the directory already exists?
do {
dirCount += 1;
directory = new File(tempFileLocation, String.valueOf(dirCount));
} while (directory.exists());
if (!directory.mkdirs()) {
throw new AnalysisException(String.format(
"Unable to create temp directory '%s'.",
directory.getAbsolutePath()));
}
return directory;
}
}

View File

@@ -0,0 +1,316 @@
/*
* 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 Institute for Defense Analyses. All Rights Reserved.
*/
package org.owasp.dependencycheck.analyzer;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.NameFileFilter;
import org.apache.commons.io.filefilter.SuffixFileFilter;
import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
import org.owasp.dependencycheck.dependency.Confidence;
import org.owasp.dependencycheck.dependency.Dependency;
import org.owasp.dependencycheck.dependency.EvidenceCollection;
import org.owasp.dependencycheck.utils.FileFilterBuilder;
import org.owasp.dependencycheck.utils.Settings;
import org.owasp.dependencycheck.utils.UrlStringUtils;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Used to analyze a Python package, and collect information that can be used to determine the associated CPE.
*
* @author Dale Visser <dvisser@ida.org>
*/
public class PythonPackageAnalyzer extends AbstractFileTypeAnalyzer {
/**
* Used when compiling file scanning regex patterns.
*/
private static final int REGEX_OPTIONS = Pattern.DOTALL
| Pattern.CASE_INSENSITIVE;
/**
* Filename extensions for files to be analyzed.
*/
private static final String EXTENSIONS = "py";
/**
* Pattern for matching the module docstring in a source file.
*/
private static final Pattern MODULE_DOCSTRING = Pattern.compile(
"^(['\\\"]{3})(.*?)\\1", REGEX_OPTIONS);
/**
* Matches assignments to version variables in Python source code.
*/
private static final Pattern VERSION_PATTERN = Pattern.compile(
"\\b(__)?version(__)? *= *(['\"]+)(\\d+\\.\\d+.*?)\\3",
REGEX_OPTIONS);
/**
* Matches assignments to title variables in Python source code.
*/
private static final Pattern TITLE_PATTERN = compileAssignPattern("title");
/**
* Matches assignments to summary variables in Python source code.
*/
private static final Pattern SUMMARY_PATTERN = compileAssignPattern("summary");
/**
* Matches assignments to URL/URL variables in Python source code.
*/
private static final Pattern URI_PATTERN = compileAssignPattern("ur[il]");
/**
* Matches assignments to home page variables in Python source code.
*/
private static final Pattern HOMEPAGE_PATTERN = compileAssignPattern("home_?page");
/**
* Matches assignments to author variables in Python source code.
*/
private static final Pattern AUTHOR_PATTERN = compileAssignPattern("author");
/**
* Filter that detects files named "__init__.py".
*/
private static final FileFilter INIT_PY_FILTER = new NameFileFilter("__init__.py");
/**
* The file filter for python files.
*/
private static final FileFilter PY_FILTER = new SuffixFileFilter(".py");
/**
* Returns the name of the Python Package Analyzer.
*
* @return the name of the analyzer
*/
@Override
public String getName() {
return "Python Package Analyzer";
}
/**
* Tell that we are used for information collection.
*
* @return INFORMATION_COLLECTION
*/
@Override
public AnalysisPhase getAnalysisPhase() {
return AnalysisPhase.INFORMATION_COLLECTION;
}
/**
* The file filter used to determine which files this analyzer supports.
*/
private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(EXTENSIONS).build();
/**
* Returns the FileFilter
*
* @return the FileFilter
*/
@Override
protected FileFilter getFileFilter() {
return FILTER;
}
/**
* No-op initializer implementation.
*
* @throws Exception never thrown
*/
@Override
protected void initializeFileTypeAnalyzer() throws Exception {
// Nothing to do here.
}
/**
* Utility function to create a regex pattern matcher.
*
* @param name the value to use when constructing the assignment pattern
* @return the compiled Pattern
*/
private static Pattern compileAssignPattern(String name) {
return Pattern.compile(
String.format("\\b(__)?%s(__)?\\b *= *(['\"]+)(.*?)\\3", name),
REGEX_OPTIONS);
}
/**
* Analyzes python packages and adds evidence to the dependency.
*
* @param dependency the dependency being analyzed
* @param engine the engine being used to perform the scan
* @throws AnalysisException thrown if there is an unrecoverable error analyzing the dependency
*/
@Override
protected void analyzeFileType(Dependency dependency, Engine engine)
throws AnalysisException {
final File file = dependency.getActualFile();
final File parent = file.getParentFile();
final String parentName = parent.getName();
boolean found = false;
if (INIT_PY_FILTER.accept(file)) {
final File[] fileList = parent.listFiles(PY_FILTER);
if (fileList != null) {
for (final File sourceFile : fileList) {
found |= analyzeFileContents(dependency, sourceFile);
}
}
}
if (found) {
dependency.setDisplayFileName(parentName + "/__init__.py");
dependency.getProductEvidence().addEvidence(file.getName(),
"PackageName", parentName, Confidence.MEDIUM);
} else {
// copy, alter and set in case some other thread is iterating over
final List<Dependency> dependencies = new ArrayList<Dependency>(
engine.getDependencies());
dependencies.remove(dependency);
engine.setDependencies(dependencies);
}
}
/**
* This should gather information from leading docstrings, file comments, and assignments to __version__, __title__,
* __summary__, __uri__, __url__, __home*page__, __author__, and their all caps equivalents.
*
* @param dependency the dependency being analyzed
* @param file the file name to analyze
* @return whether evidence was found
* @throws AnalysisException thrown if there is an unrecoverable error
*/
private boolean analyzeFileContents(Dependency dependency, File file)
throws AnalysisException {
String contents;
try {
contents = FileUtils.readFileToString(file).trim();
} catch (IOException e) {
throw new AnalysisException(
"Problem occurred while reading dependency file.", e);
}
boolean found = false;
if (!contents.isEmpty()) {
final String source = file.getName();
found = gatherEvidence(VERSION_PATTERN, contents, source,
dependency.getVersionEvidence(), "SourceVersion",
Confidence.MEDIUM);
found |= addSummaryInfo(dependency, SUMMARY_PATTERN, 4, contents,
source, "summary");
if (INIT_PY_FILTER.accept(file)) {
found |= addSummaryInfo(dependency, MODULE_DOCSTRING, 2,
contents, source, "docstring");
}
found |= gatherEvidence(TITLE_PATTERN, contents, source,
dependency.getProductEvidence(), "SourceTitle",
Confidence.LOW);
final EvidenceCollection vendorEvidence = dependency
.getVendorEvidence();
found |= gatherEvidence(AUTHOR_PATTERN, contents, source,
vendorEvidence, "SourceAuthor", Confidence.MEDIUM);
found |= gatherHomePageEvidence(URI_PATTERN, vendorEvidence,
source, "URL", contents);
found |= gatherHomePageEvidence(HOMEPAGE_PATTERN,
vendorEvidence, source, "HomePage", contents);
}
return found;
}
/**
* Adds summary information to the dependency
*
* @param dependency the dependency being analyzed
* @param pattern the pattern used to perform analysis
* @param group the group from the pattern that indicates the data to use
* @param contents the data being analyzed
* @param source the source name to use when recording the evidence
* @param key the key name to use when recording the evidence
* @return true if evidence was collected; otherwise false
*/
private boolean addSummaryInfo(Dependency dependency, Pattern pattern,
int group, String contents, String source, String key) {
final Matcher matcher = pattern.matcher(contents);
final boolean found = matcher.find();
if (found) {
JarAnalyzer.addDescription(dependency, matcher.group(group),
source, key);
}
return found;
}
/**
* Collects evidence from the home page URL.
*
* @param pattern the pattern to match
* @param evidence the evidence collection to add the evidence to
* @param source the source of the evidence
* @param name the name of the evidence
* @param contents the home page URL
* @return true if evidence was collected; otherwise false
*/
private boolean gatherHomePageEvidence(Pattern pattern,
EvidenceCollection evidence, String source, String name,
String contents) {
final Matcher matcher = pattern.matcher(contents);
boolean found = false;
if (matcher.find()) {
final String url = matcher.group(4);
if (UrlStringUtils.isUrl(url)) {
found = true;
evidence.addEvidence(source, name, url, Confidence.MEDIUM);
}
}
return found;
}
/**
* Gather evidence from a Python source file using the given string assignment regex pattern.
*
* @param pattern to scan contents with
* @param contents of Python source file
* @param source for storing evidence
* @param evidence to store evidence in
* @param name of evidence
* @param confidence in evidence
* @return whether evidence was found
*/
private boolean gatherEvidence(Pattern pattern, String contents,
String source, EvidenceCollection evidence, String name,
Confidence confidence) {
final Matcher matcher = pattern.matcher(contents);
final boolean found = matcher.find();
if (found) {
evidence.addEvidence(source, name, matcher.group(4), confidence);
}
return found;
}
@Override
protected String getAnalyzerEnabledSettingKey() {
return Settings.KEYS.ANALYZER_PYTHON_PACKAGE_ENABLED;
}
}

View File

@@ -0,0 +1,326 @@
/*
* 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 Institute for Defense Analyses. All Rights Reserved.
*/
package org.owasp.dependencycheck.analyzer;
import org.apache.commons.io.FileUtils;
import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
import org.owasp.dependencycheck.dependency.Confidence;
import org.owasp.dependencycheck.dependency.Dependency;
import org.owasp.dependencycheck.dependency.Reference;
import org.owasp.dependencycheck.dependency.Vulnerability;
import org.owasp.dependencycheck.utils.FileFilterBuilder;
import org.owasp.dependencycheck.utils.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.*;
/**
* Used to analyze Ruby Bundler Gemspec.lock files utilizing the 3rd party bundle-audit tool.
*
* @author Dale Visser <dvisser@ida.org>
*/
public class RubyBundleAuditAnalyzer extends AbstractFileTypeAnalyzer {
private static final Logger LOGGER = LoggerFactory.getLogger(RubyBundleAuditAnalyzer.class);
/**
* The name of the analyzer.
*/
private static final String ANALYZER_NAME = "Ruby Bundle Audit Analyzer";
/**
* The phase that this analyzer is intended to run in.
*/
private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.PRE_INFORMATION_COLLECTION;
private static final FileFilter FILTER =
FileFilterBuilder.newInstance().addFilenames("Gemfile.lock").build();
public static final String NAME = "Name: ";
public static final String VERSION = "Version: ";
public static final String ADVISORY = "Advisory: ";
public static final String CRITICALITY = "Criticality: ";
/**
* @return a filter that accepts files named Gemfile.lock
*/
@Override
protected FileFilter getFileFilter() {
return FILTER;
}
/**
* Launch bundle-audit.
*
* @return a handle to the process
*/
private Process launchBundleAudit(File folder) throws AnalysisException {
if (!folder.isDirectory()) {
throw new AnalysisException(String.format("%s should have been a directory.", folder.getAbsolutePath()));
}
final List<String> args = new ArrayList<String>();
final String bundleAuditPath = Settings.getString(Settings.KEYS.ANALYZER_BUNDLE_AUDIT_PATH);
args.add(null == bundleAuditPath ? "bundle-audit" : bundleAuditPath);
args.add("check");
args.add("--verbose");
final ProcessBuilder builder = new ProcessBuilder(args);
builder.directory(folder);
try {
return builder.start();
} catch (IOException ioe) {
throw new AnalysisException("bundle-audit failure", ioe);
}
}
/**
* Initialize the analyzer. In this case, extract GrokAssembly.exe to a temporary location.
*
* @throws Exception if anything goes wrong
*/
@Override
public void initializeFileTypeAnalyzer() throws Exception {
// Now, need to see if bundle-audit actually runs from this location.
Process process = launchBundleAudit(Settings.getTempDirectory());
int exitValue = process.waitFor();
if (0 == exitValue) {
LOGGER.warn("Unexpected exit code from bundle-audit process. Disabling {}: {}", ANALYZER_NAME, exitValue);
setEnabled(false);
throw new AnalysisException("Unexpected exit code from bundle-audit process.");
} else {
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(process.getErrorStream(), "UTF-8"));
if (!reader.ready()) {
LOGGER.warn("Bundle-audit error stream unexpectedly not ready. Disabling " + ANALYZER_NAME);
setEnabled(false);
throw new AnalysisException("Bundle-audit error stream unexpectedly not ready.");
} else {
final String line = reader.readLine();
if (!line.contains("Errno::ENOENT")) {
LOGGER.warn("Unexpected bundle-audit output. Disabling {}: {}", ANALYZER_NAME, line);
setEnabled(false);
throw new AnalysisException("Unexpected bundle-audit output.");
}
}
} finally {
if (null != reader) {
reader.close();
}
}
}
if (isEnabled()) {
LOGGER.info(ANALYZER_NAME + " is enabled. It is necessary to manually run \"bundle-audit update\" " +
"occasionally to keep its database up to date.");
}
}
/**
* Returns the name of the analyzer.
*
* @return the name of the analyzer.
*/
@Override
public String getName() {
return ANALYZER_NAME;
}
/**
* Returns the phase that the analyzer is intended to run in.
*
* @return the phase that the analyzer is intended to run in.
*/
@Override
public AnalysisPhase getAnalysisPhase() {
return ANALYSIS_PHASE;
}
/**
* Returns the key used in the properties file to reference the analyzer's enabled property.
*
* @return the analyzer's enabled property setting key
*/
@Override
protected String getAnalyzerEnabledSettingKey() {
return Settings.KEYS.ANALYZER_BUNDLE_AUDIT_ENABLED;
}
/**
* If {@link #analyzeFileType(Dependency, Engine)} is called, then we have successfully initialized, and it will
* be necessary to disable {@link RubyGemspecAnalyzer}.
*/
private boolean needToDisableGemspecAnalyzer = true;
@Override
protected void analyzeFileType(Dependency dependency, Engine engine)
throws AnalysisException {
if (needToDisableGemspecAnalyzer) {
boolean failed = true;
final String className = RubyGemspecAnalyzer.class.getName();
for (FileTypeAnalyzer analyzer : engine.getFileTypeAnalyzers()) {
if (analyzer instanceof RubyGemspecAnalyzer) {
((RubyGemspecAnalyzer) analyzer).setEnabled(false);
LOGGER.info("Disabled " + className + " to avoid noisy duplicate results.");
failed = false;
}
}
if (failed) {
LOGGER.warn("Did not find" + className + '.');
}
needToDisableGemspecAnalyzer = false;
}
final File parentFile = dependency.getActualFile().getParentFile();
final Process process = launchBundleAudit(parentFile);
try {
process.waitFor();
} catch (InterruptedException ie) {
throw new AnalysisException("bundle-audit process interrupted", ie);
}
BufferedReader rdr = null;
try {
rdr = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8"));
processBundlerAuditOutput(dependency, engine, rdr);
} catch (IOException ioe) {
LOGGER.warn("bundle-audit failure", ioe);
} finally {
if (null != rdr) {
try {
rdr.close();
} catch (IOException ioe) {
LOGGER.warn("bundle-audit close failure", ioe);
}
}
}
}
private void processBundlerAuditOutput(Dependency original, Engine engine, BufferedReader rdr) throws IOException {
final String parentName = original.getActualFile().getParentFile().getName();
final String fileName = original.getFileName();
Dependency dependency = null;
Vulnerability vulnerability = null;
String gem = null;
final Map<String, Dependency> map = new HashMap<String, Dependency>();
boolean appendToDescription = false;
while (rdr.ready()) {
final String nextLine = rdr.readLine();
if (null == nextLine) {
break;
} else if (nextLine.startsWith(NAME)) {
appendToDescription = false;
gem = nextLine.substring(NAME.length());
if (!map.containsKey(gem)) {
map.put(gem, createDependencyForGem(engine, parentName, fileName, gem));
}
dependency = map.get(gem);
LOGGER.debug(String.format("bundle-audit (%s): %s", parentName, nextLine));
} else if (nextLine.startsWith(VERSION)) {
vulnerability = createVulnerability(parentName, dependency, vulnerability, gem, nextLine);
} else if (nextLine.startsWith(ADVISORY)) {
setVulnerabilityName(parentName, dependency, vulnerability, nextLine);
} else if (nextLine.startsWith(CRITICALITY)) {
addCriticalityToVulnerability(parentName, vulnerability, nextLine);
} else if (nextLine.startsWith("URL: ")) {
addReferenceToVulnerability(parentName, vulnerability, nextLine);
} else if (nextLine.startsWith("Description:")) {
appendToDescription = true;
if (null != vulnerability) {
vulnerability.setDescription("*** Vulnerability obtained from bundle-audit verbose report. Title link may not work. CPE below is guessed. CVSS score is estimated (-1.0 indicates unknown). See link below for full details. *** ");
}
} else if (appendToDescription) {
if (null != vulnerability) {
vulnerability.setDescription(vulnerability.getDescription() + nextLine + "\n");
}
}
}
}
private void setVulnerabilityName(String parentName, Dependency dependency, Vulnerability vulnerability, String nextLine) {
final String advisory = nextLine.substring((ADVISORY.length()));
if (null != vulnerability) {
vulnerability.setName(advisory);
}
if (null != dependency) {
dependency.getVulnerabilities().add(vulnerability); // needed to wait for vulnerability name to avoid NPE
}
LOGGER.debug(String.format("bundle-audit (%s): %s", parentName, nextLine));
}
private void addReferenceToVulnerability(String parentName, Vulnerability vulnerability, String nextLine) {
final String url = nextLine.substring(("URL: ").length());
if (null != vulnerability) {
Reference ref = new Reference();
ref.setName(vulnerability.getName());
ref.setSource("bundle-audit");
ref.setUrl(url);
vulnerability.getReferences().add(ref);
}
LOGGER.debug(String.format("bundle-audit (%s): %s", parentName, nextLine));
}
private void addCriticalityToVulnerability(String parentName, Vulnerability vulnerability, String nextLine) {
if (null != vulnerability) {
final String criticality = nextLine.substring(CRITICALITY.length()).trim();
if ("High".equals(criticality)) {
vulnerability.setCvssScore(8.5f);
} else if ("Medium".equals(criticality)) {
vulnerability.setCvssScore(5.5f);
} else if ("Low".equals(criticality)) {
vulnerability.setCvssScore(2.0f);
} else {
vulnerability.setCvssScore(-1.0f);
}
}
LOGGER.debug(String.format("bundle-audit (%s): %s", parentName, nextLine));
}
private Vulnerability createVulnerability(String parentName, Dependency dependency, Vulnerability vulnerability, String gem, String nextLine) {
if (null != dependency) {
final String version = nextLine.substring(VERSION.length());
dependency.getVersionEvidence().addEvidence(
"bundler-audit",
"Version",
version,
Confidence.HIGHEST);
vulnerability = new Vulnerability(); // don't add to dependency until we have name set later
vulnerability.setMatchedCPE(
String.format("cpe:/a:%1$s_project:%1$s:%2$s::~~~ruby~~", gem, version),
null);
vulnerability.setCvssAccessVector("-");
vulnerability.setCvssAccessComplexity("-");
vulnerability.setCvssAuthentication("-");
vulnerability.setCvssAvailabilityImpact("-");
vulnerability.setCvssConfidentialityImpact("-");
vulnerability.setCvssIntegrityImpact("-");
}
LOGGER.debug(String.format("bundle-audit (%s): %s", parentName, nextLine));
return vulnerability;
}
private Dependency createDependencyForGem(Engine engine, String parentName, String fileName, String gem) throws IOException {
final File tempFile = File.createTempFile("Gemfile-" + gem, ".lock", Settings.getTempDirectory());
final String displayFileName = String.format("%s%c%s:%s", parentName, File.separatorChar, fileName, gem);
FileUtils.write(tempFile, displayFileName); // unique contents to avoid dependency bundling
final Dependency dependency = new Dependency(tempFile);
dependency.getProductEvidence().addEvidence("bundler-audit", "Name", gem, Confidence.HIGHEST);
dependency.setDisplayFileName(displayFileName);
engine.getDependencies().add(dependency);
return dependency;
}
}

View File

@@ -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) 2015 Institute for Defense Analyses. All Rights Reserved.
*/
package org.owasp.dependencycheck.analyzer;
import org.apache.commons.io.FileUtils;
import org.owasp.dependencycheck.Engine;
import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
import org.owasp.dependencycheck.dependency.Confidence;
import org.owasp.dependencycheck.dependency.Dependency;
import org.owasp.dependencycheck.dependency.EvidenceCollection;
import org.owasp.dependencycheck.utils.FileFilterBuilder;
import org.owasp.dependencycheck.utils.Settings;
import java.io.FileFilter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Used to analyze Ruby Gem specifications and collect information that can be used to determine the associated CPE.
* Regular expressions are used to parse the well-defined Ruby syntax that forms the specification.
*
* @author Dale Visser <dvisser@ida.org>
*/
public class RubyGemspecAnalyzer extends AbstractFileTypeAnalyzer {
/**
* The name of the analyzer.
*/
private static final String ANALYZER_NAME = "Ruby Gemspec Analyzer";
/**
* The phase that this analyzer is intended to run in.
*/
private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
private static final String GEMSPEC = "gemspec";
private static final FileFilter FILTER =
FileFilterBuilder.newInstance().addExtensions(GEMSPEC).addFilenames("Rakefile").build();
private static final String EMAIL = "email";
/**
* @return a filter that accepts files named Rakefile or matching the glob pattern, *.gemspec
*/
@Override
protected FileFilter getFileFilter() {
return FILTER;
}
@Override
protected void initializeFileTypeAnalyzer() throws Exception {
// NO-OP
}
/**
* Returns the name of the analyzer.
*
* @return the name of the analyzer.
*/
@Override
public String getName() {
return ANALYZER_NAME;
}
/**
* Returns the phase that the analyzer is intended to run in.
*
* @return the phase that the analyzer is intended to run in.
*/
@Override
public AnalysisPhase getAnalysisPhase() {
return ANALYSIS_PHASE;
}
/**
* Returns the key used in the properties file to reference the analyzer's enabled property.
*
* @return the analyzer's enabled property setting key
*/
@Override
protected String getAnalyzerEnabledSettingKey() {
return Settings.KEYS.ANALYZER_RUBY_GEMSPEC_ENABLED;
}
/**
* The capture group #1 is the block variable.
*/
private static final Pattern GEMSPEC_BLOCK_INIT =
Pattern.compile("Gem::Specification\\.new\\s+?do\\s+?\\|(.+?)\\|");
@Override
protected void analyzeFileType(Dependency dependency, Engine engine)
throws AnalysisException {
String contents;
try {
contents = FileUtils.readFileToString(dependency.getActualFile());
} catch (IOException e) {
throw new AnalysisException(
"Problem occurred while reading dependency file.", e);
}
final Matcher matcher = GEMSPEC_BLOCK_INIT.matcher(contents);
if (matcher.find()) {
contents = contents.substring(matcher.end());
final String blockVariable = matcher.group(1);
final EvidenceCollection vendor = dependency.getVendorEvidence();
addStringEvidence(vendor, contents, blockVariable, "author", Confidence.HIGHEST);
addListEvidence(vendor, contents, blockVariable, "authors", Confidence.HIGHEST);
final String email = addStringEvidence(vendor, contents, blockVariable, EMAIL, Confidence.MEDIUM);
if (email.isEmpty()) {
addListEvidence(vendor, contents, blockVariable, EMAIL, Confidence.MEDIUM);
}
addStringEvidence(vendor, contents, blockVariable, "homepage", Confidence.MEDIUM);
final EvidenceCollection product = dependency.getProductEvidence();
final String name = addStringEvidence(product, contents, blockVariable, "name", Confidence.HIGHEST);
if (!name.isEmpty()) {
vendor.addEvidence(GEMSPEC, "name_project", name + "_project", Confidence.LOW);
}
addStringEvidence(product, contents, blockVariable, "summary", Confidence.LOW);
addStringEvidence(dependency.getVersionEvidence(), contents, blockVariable, "version", Confidence.HIGHEST);
}
}
private void addListEvidence(EvidenceCollection evidences, String contents,
String blockVariable, String field, Confidence confidence) {
final Matcher matcher = Pattern.compile(
String.format("\\s+?%s\\.%s\\s*?=\\s*?\\[(.*?)\\]", blockVariable, field)).matcher(contents);
if (matcher.find()) {
final String value = matcher.group(1).replaceAll("['\"]", " ").trim();
evidences.addEvidence(GEMSPEC, field, value, confidence);
}
}
private String addStringEvidence(EvidenceCollection evidences, String contents,
String blockVariable, String field, Confidence confidence) {
final Matcher matcher = Pattern.compile(
String.format("\\s+?%s\\.%s\\s*?=\\s*?(['\"])(.*?)\\1", blockVariable, field)).matcher(contents);
String value = "";
if (matcher.find()) {
value = matcher.group(2);
evidences.addEvidence(GEMSPEC, field, value, confidence);
}
return value;
}
}

View File

@@ -26,7 +26,7 @@ import org.owasp.dependencycheck.suppression.SuppressionRule;
* The suppression analyzer processes an externally defined XML document that complies with the suppressions.xsd schema.
* Any identified Vulnerability entries within the dependencies that match will be removed.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class VulnerabilitySuppressionAnalyzer extends AbstractSuppressionAnalyzer {

View File

@@ -20,7 +20,7 @@ package org.owasp.dependencycheck.analyzer.exception;
/**
* An exception thrown when the analysis of a dependency fails.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class AnalysisException extends Exception {

View File

@@ -20,7 +20,7 @@ package org.owasp.dependencycheck.analyzer.exception;
/**
* An exception thrown when files in an archive cannot be extracted.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class ArchiveExtractionException extends Exception {

View File

@@ -1,12 +1,4 @@
/**
* <html>
* <head>
* <title>org.owasp.dependencycheck.analyzer.exception</title>
* </head>
* <body>
* <p>
* A collection of exception classes used within the analyzers.</p>
* </body>
* </html>
* A collection of exception classes used within the analyzers.
*/
package org.owasp.dependencycheck.analyzer.exception;

View File

@@ -1,13 +1,4 @@
/**
* <html>
* <head>
* <title>org.owasp.dependencycheck.analyzer</title>
* </head>
* <body>
* Analyzers are used to inspect the identified dependencies, collect Evidence,
* and process the dependencies.
* </body>
* </html>
*/
* Analyzers are used to inspect the identified dependencies, collect Evidence, and process the dependencies.
*/
package org.owasp.dependencycheck.analyzer;

View File

@@ -23,7 +23,6 @@ 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;
@@ -32,6 +31,8 @@ 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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
@@ -55,7 +56,7 @@ public class CentralSearch {
/**
* Used for logging.
*/
private static final Logger LOGGER = Logger.getLogger(CentralSearch.class.getName());
private static final Logger LOGGER = LoggerFactory.getLogger(CentralSearch.class);
/**
* Creates a NexusSearch for the given repository URL.
@@ -67,10 +68,10 @@ public class CentralSearch {
this.rootURL = rootURL;
if (null != Settings.getString(Settings.KEYS.PROXY_SERVER)) {
useProxy = true;
LOGGER.fine("Using proxy");
LOGGER.debug("Using proxy");
} else {
useProxy = false;
LOGGER.fine("Not using proxy");
LOGGER.debug("Not using proxy");
}
}
@@ -89,7 +90,7 @@ public class CentralSearch {
final URL url = new URL(rootURL + String.format("?q=1:\"%s\"&wt=xml", sha1));
LOGGER.fine(String.format("Searching Central url %s", url.toString()));
LOGGER.debug("Searching Central url {}", url);
// 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
@@ -115,15 +116,15 @@ public class CentralSearch {
if ("0".equals(numFound)) {
missing = true;
} else {
final ArrayList<MavenArtifact> result = new ArrayList<MavenArtifact>();
final List<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));
LOGGER.trace("GroupId: {}", g);
final String a = xpath.evaluate("./str[@name='a']", docs.item(i));
LOGGER.finest(String.format("ArtifactId: %s", a));
LOGGER.trace("ArtifactId: {}", 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);
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++) {
@@ -134,8 +135,18 @@ public class CentralSearch {
jarAvailable = true;
}
}
LOGGER.finest(String.format("Version: %s", v));
result.add(new MavenArtifact(g, a, v, jarAvailable, pomAvailable));
atts = (NodeList) xpath.evaluate("./arr[@name='tags']/str", docs.item(i), XPathConstants.NODESET);
boolean useHTTPS = false;
for (int x = 0; x < atts.getLength(); x++) {
final String tmp = xpath.evaluate(".", atts.item(x));
if ("https".equals(tmp)) {
useHTTPS = true;
}
}
LOGGER.trace("Version: {}", v);
result.add(new MavenArtifact(g, a, v, jarAvailable, pomAvailable, useHTTPS));
}
return result;
@@ -150,10 +161,9 @@ public class CentralSearch {
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);
LOGGER.debug("Could not connect to Central received response code: {} {}",
conn.getResponseCode(), conn.getResponseMessage());
throw new IOException("Could not connect to Central");
}
return null;

View File

@@ -1,14 +1,7 @@
/**
* <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>
*
* Contains classes related to searching Maven Central.<br/><br/>
*
* These are used to abstract Maven Central searching away from OWASP Dependency Check so they can be reused elsewhere.
*/
package org.owasp.dependencycheck.data.central;

View File

@@ -0,0 +1,110 @@
/*
* 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 The OWASP Foundation. All Rights Reserved.
*/
package org.owasp.dependencycheck.data.composer;
/**
* Reperesents a dependency (GAV, right now) from a Composer dependency.
*
* @author colezlaw
*/
public final class ComposerDependency {
/**
* The group
*/
private final String group;
/**
* The project
*/
private final String project;
/**
* The version
*/
private final String version;
/**
* Create a ComposerDependency from group, project, and version.
*
* @param group the group
* @param project the project
* @param version the version
*/
public ComposerDependency(String group, String project, String version) {
this.group = group;
this.project = project;
this.version = version;
}
/**
* Get the group.
*
* @return the group
*/
public String getGroup() {
return group;
}
/**
* Get the project.
*
* @return the project
*/
public String getProject() {
return project;
}
/**
* Get the version.
*
* @return the version
*/
public String getVersion() {
return version;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof ComposerDependency)) {
return false;
}
final ComposerDependency that = (ComposerDependency) o;
if (group != null ? !group.equals(that.group) : that.group != null) {
return false;
}
if (project != null ? !project.equals(that.project) : that.project != null) {
return false;
}
return !(version != null ? !version.equals(that.version) : that.version != null);
}
@Override
public int hashCode() {
int result = group != null ? group.hashCode() : 0;
result = 31 * result + (project != null ? project.hashCode() : 0);
result = 31 * result + (version != null ? version.hashCode() : 0);
return result;
}
}

View File

@@ -0,0 +1,57 @@
/*
* 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 The OWASP Foundation. All Rights Reserved.
*/
package org.owasp.dependencycheck.data.composer;
/**
* Represents an exception when handling a composer.json or composer.lock file. Generally used to wrap a downstream exception.
*
* @author colezlaw
*/
public class ComposerException extends RuntimeException {
/**
* The serial version UID for serialization.
*/
private static final long serialVersionUID = 1L;
/**
* Creates a ComposerException with default message.
*/
public ComposerException() {
super();
}
/**
* Creates a ComposerException with the specified message.
*
* @param message the exception message
*/
public ComposerException(String message) {
super(message);
}
/**
* Creates a Composer exception with the specified message and cause.
*
* @param message the message
* @param cause the underlying cause
*/
public ComposerException(String message, Throwable cause) {
super(message, cause);
}
}

View File

@@ -0,0 +1,124 @@
/*
* 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 The OWASP Foundation. All Rights Reserved.
*/
package org.owasp.dependencycheck.data.composer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonException;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.json.stream.JsonParsingException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* Parses a Composer.lock file from an input stream. In a separate class so it can hopefully be injected.
*
* @author colezlaw
*/
public class ComposerLockParser {
/**
* The JsonReader for parsing JSON
*/
private final JsonReader jsonReader;
/**
* The input stream we'll read
*/
private final InputStream inputStream; // NOPMD - it gets set in the constructor, read later
/**
* The List of ComposerDependencies found
*/
private final List<ComposerDependency> composerDependencies;
/**
* The LOGGER
*/
private static final Logger LOGGER = LoggerFactory.getLogger(ComposerLockParser.class);
/**
* Createas a ComposerLockParser from a JsonReader and an InputStream.
*
* @param inputStream the InputStream to parse
*/
public ComposerLockParser(InputStream inputStream) {
LOGGER.info("Creating a ComposerLockParser");
this.inputStream = inputStream;
this.jsonReader = Json.createReader(inputStream);
this.composerDependencies = new ArrayList<ComposerDependency>();
}
/**
* Process the input stream to create the list of dependencies.
*/
public void process() {
LOGGER.info("Beginning Composer lock processing");
try {
final JsonObject composer = jsonReader.readObject();
if (composer.containsKey("packages")) {
LOGGER.debug("Found packages");
final JsonArray packages = composer.getJsonArray("packages");
for (JsonObject pkg : packages.getValuesAs(JsonObject.class)) {
if (pkg.containsKey("name")) {
final String groupName = pkg.getString("name");
if (groupName.indexOf('/') >= 0 && groupName.indexOf('/') <= groupName.length() - 1) {
if (pkg.containsKey("version")) {
final String group = groupName.substring(0, groupName.indexOf('/'));
final String project = groupName.substring(groupName.indexOf('/') + 1);
String version = pkg.getString("version");
// Some version nubmers begin with v - which doesn't end up matching CPE's
if (version.startsWith("v")) {
version = version.substring(1);
}
LOGGER.debug("Got package {}/{}/{}", group, project, version);
composerDependencies.add(new ComposerDependency(group, project, version));
} else {
LOGGER.debug("Group/package {} does not have a version", groupName);
}
} else {
LOGGER.debug("Got a dependency with no name");
}
}
}
}
} catch (JsonParsingException jsonpe) {
throw new ComposerException("Error parsing stream", jsonpe);
} catch (JsonException jsone) {
throw new ComposerException("Error reading stream", jsone);
} catch (IllegalStateException ise) {
throw new ComposerException("Illegal state in composer stream", ise);
} catch (ClassCastException cce) {
throw new ComposerException("Not exactly composer lock", cce);
}
}
/**
* Gets the list of dependencies.
*
* @return the list of dependencies
*/
public List<ComposerDependency> getDependencies() {
return composerDependencies;
}
}

View File

@@ -0,0 +1,4 @@
/**
* Model elements for PHP Composer files
*/
package org.owasp.dependencycheck.data.composer;

View File

@@ -21,8 +21,6 @@ import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.core.KeywordAnalyzer;
import org.apache.lucene.analysis.miscellaneous.PerFieldAnalyzerWrapper;
@@ -46,19 +44,21 @@ import org.owasp.dependencycheck.data.lucene.SearchFieldAnalyzer;
import org.owasp.dependencycheck.data.nvdcve.CveDB;
import org.owasp.dependencycheck.data.nvdcve.DatabaseException;
import org.owasp.dependencycheck.utils.Pair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* An in memory lucene index that contains the vendor/product combinations from the CPE (application) identifiers within the NVD
* CVE data.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public final class CpeMemoryIndex {
/**
* The logger.
*/
private static final Logger LOGGER = Logger.getLogger(CpeMemoryIndex.class.getName());
private static final Logger LOGGER = LoggerFactory.getLogger(CpeMemoryIndex.class);
/**
* singleton instance.
*/
@@ -149,9 +149,8 @@ public final class CpeMemoryIndex {
*
* @return the CPE Analyzer.
*/
@SuppressWarnings("unchecked")
private Analyzer createIndexingAnalyzer() {
final Map fieldAnalyzers = new HashMap();
final Map<String, Analyzer> fieldAnalyzers = new HashMap<String, Analyzer>();
fieldAnalyzers.put(Fields.DOCUMENT_KEY, new KeywordAnalyzer());
return new PerFieldAnalyzerWrapper(new FieldAnalyzer(LuceneUtils.CURRENT_VERSION), fieldAnalyzers);
}
@@ -161,7 +160,6 @@ public final class CpeMemoryIndex {
*
* @return the CPE Analyzer.
*/
@SuppressWarnings("unchecked")
private Analyzer createSearchingAnalyzer() {
final Map<String, Analyzer> fieldAnalyzers = new HashMap<String, Analyzer>();
fieldAnalyzers.put(Fields.DOCUMENT_KEY, new KeywordAnalyzer());
@@ -173,24 +171,6 @@ public final class CpeMemoryIndex {
return new PerFieldAnalyzerWrapper(new FieldAnalyzer(LuceneUtils.CURRENT_VERSION), fieldAnalyzers);
}
/**
* Saves a CPE IndexEntry into the Lucene index.
*
* @param vendor the vendor to index
* @param product the product to index
* @param indexWriter the index writer to write the entry into
* @throws CorruptIndexException is thrown if the index is corrupt
* @throws IOException is thrown if an IOException occurs
*/
public void saveEntry(String vendor, String product, IndexWriter indexWriter) throws CorruptIndexException, IOException {
final Document doc = new Document();
final Field v = new TextField(Fields.VENDOR, vendor, Field.Store.YES);
final Field p = new TextField(Fields.PRODUCT, product, Field.Store.YES);
doc.add(v);
doc.add(p);
indexWriter.addDocument(doc);
}
/**
* Closes the CPE Index.
*/
@@ -203,7 +183,7 @@ public final class CpeMemoryIndex {
try {
indexReader.close();
} catch (IOException ex) {
LOGGER.log(Level.FINEST, null, ex);
LOGGER.trace("", ex);
}
indexReader = null;
}
@@ -230,12 +210,23 @@ public final class CpeMemoryIndex {
final IndexWriterConfig conf = new IndexWriterConfig(LuceneUtils.CURRENT_VERSION, analyzer);
indexWriter = new IndexWriter(index, conf);
try {
// Tip: reuse the Document and Fields for performance...
// See "Re-use Document and Field instances" from
// http://wiki.apache.org/lucene-java/ImproveIndexingSpeed
final Document doc = new Document();
final Field v = new TextField(Fields.VENDOR, Fields.VENDOR, Field.Store.YES);
final Field p = new TextField(Fields.PRODUCT, Fields.PRODUCT, Field.Store.YES);
doc.add(v);
doc.add(p);
final Set<Pair<String, String>> data = cve.getVendorProductList();
for (Pair<String, String> pair : data) {
saveEntry(pair.getLeft(), pair.getRight(), indexWriter);
v.setStringValue(pair.getLeft());
p.setStringValue(pair.getRight());
indexWriter.addDocument(doc);
}
} catch (DatabaseException ex) {
LOGGER.log(Level.FINE, null, ex);
LOGGER.debug("", ex);
throw new IndexException("Error reading CPE data", ex);
}
} catch (CorruptIndexException ex) {
@@ -287,8 +278,9 @@ public final class CpeMemoryIndex {
if (searchString == null || searchString.trim().isEmpty()) {
throw new ParseException("Query is null or empty");
}
LOGGER.debug(searchString);
final Query query = queryParser.parse(searchString);
return indexSearcher.search(query, maxQueryResults);
return search(query, maxQueryResults);
}
/**

View File

@@ -20,7 +20,7 @@ package org.owasp.dependencycheck.data.cpe;
/**
* Fields is a collection of field names used within the Lucene index for CPE entries.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public final class Fields {

View File

@@ -24,7 +24,7 @@ import java.net.URLDecoder;
/**
* A CPE entry containing the name, vendor, product, and version.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class IndexEntry implements Serializable {
@@ -48,7 +48,7 @@ public class IndexEntry implements Serializable {
*/
public String getDocumentId() {
if (documentId == null && vendor != null && product != null) {
documentId = vendor + ":" + product;
documentId = vendor + ':' + product;
}
return documentId;
}

View File

@@ -20,7 +20,7 @@ package org.owasp.dependencycheck.data.cpe;
/**
* An exception thrown when the there is an issue using the in-memory CPE Index.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class IndexException extends Exception {

View File

@@ -1,12 +1,4 @@
/**
* <html>
* <head>
* <title>org.owasp.dependencycheck.data.cpe</title>
* </head>
* <body>
* Contains classes for working with the CPE Lucene Index.
* </body>
* </html>
*/
*/
package org.owasp.dependencycheck.data.cpe;

View File

@@ -17,23 +17,25 @@
*/
package org.owasp.dependencycheck.data.cwe;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Map;
/**
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public final class CweDB {
/**
* The Logger.
*/
private static final Logger LOGGER = Logger.getLogger(CweDB.class.getName());
private static final Logger LOGGER = LoggerFactory.getLogger(CweDB.class);
/**
* Empty private constructor as this is a utility class.
@@ -44,34 +46,34 @@ public final class CweDB {
/**
* A HashMap of the CWE data.
*/
private static final HashMap<String, String> CWE = loadData();
private static final Map<String, String> CWE = loadData();
/**
* Loads a HashMap containing the CWE data from a resource found in the jar.
*
* @return a HashMap of CWE data
*/
private static HashMap<String, String> loadData() {
private static Map<String, String> loadData() {
ObjectInputStream oin = null;
try {
final String filePath = "data/cwe.hashmap.serialized";
final InputStream input = CweDB.class.getClassLoader().getResourceAsStream(filePath);
oin = new ObjectInputStream(input);
@SuppressWarnings("unchecked")
final HashMap<String, String> ret = (HashMap<String, String>) oin.readObject();
final Map<String, String> ret = (HashMap<String, String>) oin.readObject();
return ret;
} catch (ClassNotFoundException ex) {
LOGGER.log(Level.WARNING, "Unable to load CWE data. This should not be an issue.");
LOGGER.log(Level.FINE, null, ex);
LOGGER.warn("Unable to load CWE data. This should not be an issue.");
LOGGER.debug("", ex);
} catch (IOException ex) {
LOGGER.log(Level.WARNING, "Unable to load CWE data due to an IO Error. This should not be an issue.");
LOGGER.log(Level.FINE, null, ex);
LOGGER.warn("Unable to load CWE data due to an IO Error. This should not be an issue.");
LOGGER.debug("", ex);
} finally {
if (oin != null) {
try {
oin.close();
} catch (IOException ex) {
LOGGER.log(Level.FINEST, null, ex);
LOGGER.trace("", ex);
}
}
}

View File

@@ -25,7 +25,7 @@ import org.xml.sax.helpers.DefaultHandler;
/**
* A SAX Handler that will parse the CWE XML.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public class CweHandler extends DefaultHandler {

View File

@@ -1,12 +1,4 @@
/**
* <html>
* <head>
* <title>org.owasp.dependencycheck.data.cwe</title>
* </head>
* <body>
* Contains classes for working with the CWE Database.
* </body>
* </html>
*/
*/
package org.owasp.dependencycheck.data.cwe;

View File

@@ -25,7 +25,7 @@ import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
/**
* An abstract tokenizing filter that can be used as the base for a tokenizing filter.
*
* @author Jeremy Long <jeremy.long@owasp.org>
* @author Jeremy Long
*/
public abstract class AbstractTokenizingFilter extends TokenFilter {

Some files were not shown because too many files have changed in this diff Show More