codeclimate 0.40.3 → 0.41.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fb2ee072af1aff320f630ac305b572a12b919091
4
- data.tar.gz: 4d4913ba436236aa7bcb2b62f7aa1cd1a624a526
3
+ metadata.gz: 6f2b2dcd339b86ee8c2046bcc25bc473a6f00bed
4
+ data.tar.gz: 96ac5a4abeddbce089aaee654c08e0489fbcf3f4
5
5
  SHA512:
6
- metadata.gz: cff6882ffb5abb353561af8d33abe8549d4dbb599dfce01d7bc266db16f1a98b740b935b67e9533a394748e81a09eb0a4da47977b6440764c9a8c2ff8e7fbaeb
7
- data.tar.gz: 23f2ac74969aefbb816460ec048039c5195f1559c16a36a0a70f1f983432eb2002afd07fdd1d289c2b05b8b23ca805e4f02fa67dc67ff51f644edc67737fad1c
6
+ metadata.gz: 7440d7ea2157ba191d71c851f93542dbdb5bffa29678709536848505606f122b167bdf8ebe77059f65c2ac82223b6a0c4e079617da9c3ba941fd3015014b5e21
7
+ data.tar.gz: 7d1cc4c413306c30124164a5e88f425969ef106afe0eb6eb6aafc0b90c5914447fd6804e8a9afeb46a1992d8d0176bc1626dc230df6f325b0324d91d263f20bd
data/lib/cc/cli.rb CHANGED
@@ -11,6 +11,7 @@ module CC
11
11
  autoload :Command, "cc/cli/command"
12
12
  autoload :Console, "cc/cli/console"
13
13
  autoload :Engines, "cc/cli/engines"
14
+ autoload :Dependencies, "cc/cli/dependencies"
14
15
  autoload :Help, "cc/cli/help"
15
16
  autoload :Init, "cc/cli/init"
16
17
  autoload :Runner, "cc/cli/runner"
@@ -0,0 +1,94 @@
1
+ require "cc/cli/config"
2
+ require "cc/resolv"
3
+ require "fileutils"
4
+ require "ipaddr"
5
+ require "json"
6
+ require "net/http"
7
+ require "pathname"
8
+ require "uri"
9
+
10
+ module CC
11
+ module CLI
12
+ class Dependencies < Command
13
+ InternalHostError = Class.new(StandardError)
14
+ FetchError = Class.new(StandardError)
15
+
16
+ PRIVATE_ADDRESS_SUBNETS = [
17
+ IPAddr.new("10.0.0.0/8"),
18
+ IPAddr.new("172.16.0.0/12"),
19
+ IPAddr.new("192.168.0.0/16"),
20
+ IPAddr.new("fd00::/8"),
21
+ IPAddr.new("127.0.0.1"),
22
+ IPAddr.new("0:0:0:0:0:0:0:1"),
23
+ ].freeze
24
+
25
+ def run
26
+ require_codeclimate_yml
27
+ fatal("No file dependencies configured") unless files.present?
28
+
29
+ ::CC::Resolv.with_fixed_dns { fetch_all }
30
+ success("All file dependencies fetched")
31
+ rescue FetchError, InternalHostError => ex
32
+ fatal(ex.message)
33
+ end
34
+
35
+ private
36
+
37
+ def allow_internal_ips?
38
+ @args.include?("--allow-internal-ips")
39
+ end
40
+
41
+ def files
42
+ @files ||= config.dependencies && config.dependencies.files
43
+ end
44
+
45
+ def config
46
+ @config ||= CC::Yaml.parse(filesystem.read_path(CODECLIMATE_YAML))
47
+ end
48
+
49
+ def fetch_all
50
+ files.each do |entry|
51
+ fetch(entry.url, entry.path)
52
+ end
53
+ end
54
+
55
+ def fetch(url, target_path)
56
+ ensure_external!(url) unless allow_internal_ips?
57
+
58
+ uri = URI.parse(url)
59
+ resp = Net::HTTP.get_response(uri)
60
+ if resp.code == "200"
61
+ write_file(target_path, resp.body)
62
+ say("Wrote #{url} to #{target_path}")
63
+ else
64
+ raise FetchError, "Failed fetching #{url}: code=#{resp.code} body=#{resp.body}"
65
+ end
66
+ end
67
+
68
+ def write_file(target_path, content)
69
+ FileUtils.mkdir_p(Pathname.new(target_path).parent.to_s)
70
+ File.write(target_path, content)
71
+ end
72
+
73
+ def ensure_external!(url)
74
+ uri = URI.parse(url)
75
+
76
+ if internal?(uri.host)
77
+ raise InternalHostError, "Won't fetch #{url.inspect}: it maps to an internal address"
78
+ end
79
+ end
80
+
81
+ # rubocop:disable Style/CaseEquality
82
+ def internal?(host)
83
+ address = ::Resolv.getaddress(host)
84
+
85
+ PRIVATE_ADDRESS_SUBNETS.any? do |subnet|
86
+ subnet === IPAddr.new(address.to_s)
87
+ end
88
+ rescue ::Resolv::ResolvError
89
+ true # localhost
90
+ end
91
+ # rubocop:enable Style/CaseEquality
92
+ end
93
+ end
94
+ end
data/lib/cc/cli/help.rb CHANGED
@@ -21,6 +21,7 @@ module CC
21
21
  "engines:install",
22
22
  "engines:list",
23
23
  "engines:remove #{underline("engine_name")}",
24
+ "dependencies",
24
25
  "help",
25
26
  "init",
26
27
  "validate-config",
data/lib/cc/resolv.rb ADDED
@@ -0,0 +1,39 @@
1
+ require "resolv-replace"
2
+
3
+ module CC
4
+ class Resolv
5
+ def self.with_fixed_dns(dns = ::Resolv::DNS.new)
6
+ ::Resolv::DefaultResolver.replace_resolvers([Fixed.new(dns)])
7
+
8
+ yield if block_given?
9
+ ensure
10
+ # There's no way to ask what the current values are before we override
11
+ # them; hopefully going by the source is good enough.
12
+ # https://docs.ruby-lang.org/en/2.0.0/Resolv.html#method-c-new
13
+ default_resolvers = [::Resolv::Hosts.new, ::Resolv::DNS.new]
14
+ ::Resolv::DefaultResolver.replace_resolvers(default_resolvers)
15
+ end
16
+
17
+ class Fixed
18
+ def initialize(fallback)
19
+ @addresses = {}
20
+ @fallback = fallback
21
+ end
22
+
23
+ def each_address(name)
24
+ if addresses.key?(name)
25
+ yield addresses.fetch(name)
26
+ else
27
+ fallback.each_address(name) do |address|
28
+ addresses[name] ||= address
29
+ yield address
30
+ end
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ attr_reader :addresses, :fallback
37
+ end
38
+ end
39
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: codeclimate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.40.3
4
+ version: 0.41.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code Climate
@@ -212,6 +212,7 @@ files:
212
212
  - lib/cc/cli/config.rb
213
213
  - lib/cc/cli/config_generator.rb
214
214
  - lib/cc/cli/console.rb
215
+ - lib/cc/cli/dependencies.rb
215
216
  - lib/cc/cli/engines.rb
216
217
  - lib/cc/cli/engines/disable.rb
217
218
  - lib/cc/cli/engines/enable.rb
@@ -226,6 +227,7 @@ files:
226
227
  - lib/cc/cli/upgrade_config_generator.rb
227
228
  - lib/cc/cli/validate_config.rb
228
229
  - lib/cc/cli/version.rb
230
+ - lib/cc/resolv.rb
229
231
  - lib/cc/workspace.rb
230
232
  - lib/cc/workspace/exclusion.rb
231
233
  - lib/cc/workspace/path_tree.rb