diffend-monitor 0.2.40 → 0.2.46

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
  SHA256:
3
- metadata.gz: f88e005924b71bf6f49c352bb8a94c3c86cf1a9af15f011ba357e2dc25cb0dbc
4
- data.tar.gz: 7f8b7badc3e62ca223adf7170941986c7d55d2f0ec8fea62889c2ce9898d2024
3
+ metadata.gz: d7a9ce0136a3adc532898cdabc5972be7ed152c0479a7ad724ec66a5a563777a
4
+ data.tar.gz: ece9ff8f2226deff51cb670b0cb985247fd4b497d0538015d736192bb0548b01
5
5
  SHA512:
6
- metadata.gz: 4f1349f7a42b8eb9edc0cdfa3e73c607d3f523955fcd2051d09901035f3731195632be70575e8f0e4f5b129dace9b9a350f353da223a1c75566561159bcc7968
7
- data.tar.gz: efec99d3c42273b5ad96b51bcadf2e3a33db5d49b88f728bc30da461174c4bf07edda96f7470aaa6b5faed58c0c194620296ebe421d00571a22e41a6a13171c7
6
+ metadata.gz: a2b69a6ca6aacb8a99d45c6333f6da252b4a952d939d704b75f6d122e9cb5c383bb222992488226ebc3a400bd9db91a310365279141d612524c191b67a5b2d69
7
+ data.tar.gz: fe78cb956b12566737ab17dd092c2a42eab82cafd9dd5ca81f409978b0f837c28b4ff99d0617aeae847085390dc173736f3786d31d5973b54f856cfa7cc35261
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -2,6 +2,27 @@
2
2
 
3
3
  ## [Unreleased][master]
4
4
 
5
+ ## [0.2.46] (2021-05-05)
6
+ - Optimized file selection to make releases smaller and easier to read through.
7
+
8
+ ## [0.2.45] (2021-05-05)
9
+ - Bundler 2.2.17 support
10
+
11
+ ## [0.2.44] (2021-03-31)
12
+ - `project_id`, `shareable_id` and `shareable_key` need to be a valid UUID
13
+
14
+ ## [0.2.43] (2021-03-16)
15
+ - introduce `DIFFEND_TAGS` ([#119](https://github.com/diffend-io/diffend-ruby/pull/119))
16
+ - add support for `bundle add` command ([#118](https://github.com/diffend-io/diffend-ruby/pull/118))
17
+
18
+ ## [0.2.42] (2021-03-09)
19
+ - introduce `DIFFEND_SKIP_DENY` flag
20
+ - fix config not being passed properly to `build_error` in `Diffend::Execute` ([#116](https://github.com/diffend-io/diffend-ruby/pull/116))
21
+
22
+ ## [0.2.41] (2021-03-09)
23
+ - introduce integration specs ([#107](https://github.com/diffend-io/diffend-ruby/pull/107))
24
+ - use `Bundler::Definition.resolve` for specs ([#112](https://github.com/diffend-io/diffend-ruby/pull/112))
25
+
5
26
  ## [0.2.40] (2021-02-23)
6
27
  - don't expose ips, we can identify instance by a hostname ([#108](https://github.com/diffend-io/diffend-ruby/pull/108))
7
28
  - don't set `verify_mode` when creating request in `Diffend::Request`, use default value set by `use_ssl` flag instead ([#109](https://github.com/diffend-io/diffend-ruby/pull/109))
@@ -126,7 +147,11 @@
126
147
 
127
148
  - initial release
128
149
 
129
- [master]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.40...HEAD
150
+ [master]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.44...HEAD
151
+ [0.2.44]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.43...v0.2.44
152
+ [0.2.43]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.42...v0.2.43
153
+ [0.2.42]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.41...v0.2.42
154
+ [0.2.41]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.40...v0.2.41
130
155
  [0.2.40]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.39...v0.2.40
131
156
  [0.2.39]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.38...v0.2.39
132
157
  [0.2.38]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.37...v0.2.38
data/certs/mensfeld.pem CHANGED
@@ -1,25 +1,25 @@
1
1
  -----BEGIN CERTIFICATE-----
2
2
  MIIEODCCAqCgAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMSEwHwYDVQQDDBhtYWNp
3
- ZWovREM9bWVuc2ZlbGQvREM9cGwwHhcNMTkwNzMwMTQ1NDU0WhcNMjAwNzI5MTQ1
4
- NDU0WjAjMSEwHwYDVQQDDBhtYWNpZWovREM9bWVuc2ZlbGQvREM9cGwwggGiMA0G
5
- CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC9fCwtaHZG2SyyNXiH8r0QbJQx/xxl
6
- dkvwWz9QGJO+O8rEx20FB1Ab+MVkfOscwIv5jWpmk1U9whzDPl1uFtIbgu+sk+Zb
7
- uQlZyK/DPN6c+/BbBL+RryTBRyvkPLoCVwm7uxc/JZ1n4AI6eF4cCZ2ieZ9QgQbU
8
- MQs2QPqs9hT50Ez/40GnOdadVfiDDGz+NME2C4ms0BriXwZ1tcRTfJIHe2xjIbbb
9
- y5qRGfsLKcgMzvLQR24olixyX1MR0s4+Wveq3QL/gBhL4veUcv+UABJA8IJR0kyB
10
- seHHutusiwZ1v3SjjjW1xLLrc2ARV0mgCb0WaK2T4iA3oFTGLh6Ydz8LNl31KQFv
11
- 94nRd8IhmJxrhQ6dQ/WT9IXoa5S9lfT5lPJeINemH4/6QPABzf9W2IZlCdI9wCdB
12
- TBaw57MKneGAYZiKjw6OALSy2ltQUCl3RqFl3VP7n8uFy1U987Q5VIIQ3O1UUsQD
13
- Oe/h+r7GUU4RSPKgPlrwvW9bD/UQ+zF51v8CAwEAAaN3MHUwCQYDVR0TBAIwADAL
14
- BgNVHQ8EBAMCBLAwHQYDVR0OBBYEFJNIBHdfEUD7TqHqIer2YhWaWhwcMB0GA1Ud
3
+ ZWovREM9bWVuc2ZlbGQvREM9cGwwHhcNMjAwODExMDkxNTM3WhcNMjEwODExMDkx
4
+ NTM3WjAjMSEwHwYDVQQDDBhtYWNpZWovREM9bWVuc2ZlbGQvREM9cGwwggGiMA0G
5
+ CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDCpXsCgmINb6lHBXXBdyrgsBPSxC4/
6
+ 2H+weJ6L9CruTiv2+2/ZkQGtnLcDgrD14rdLIHK7t0o3EKYlDT5GhD/XUVhI15JE
7
+ N7IqnPUgexe1fbZArwQ51afxz2AmPQN2BkB2oeQHXxnSWUGMhvcEZpfbxCCJH26w
8
+ hS0Ccsma8yxA6hSlGVhFVDuCr7c2L1di6cK2CtIDpfDaWqnVNJEwBYHIxrCoWK5g
9
+ sIGekVt/admS9gRhIMaIBg+Mshth5/DEyWO2QjteTodItlxfTctrfmiAl8X8T5JP
10
+ VXeLp5SSOJ5JXE80nShMJp3RFnGw5fqjX/ffjtISYh78/By4xF3a25HdWH9+qO2Z
11
+ tx0wSGc9/4gqNM0APQnjN/4YXrGZ4IeSjtE+OrrX07l0TiyikzSLFOkZCAp8oBJi
12
+ Fhlosz8xQDJf7mhNxOaZziqASzp/hJTU/tuDKl5+ql2icnMv5iV/i6SlmvU29QNg
13
+ LCV71pUv0pWzN+OZbHZKWepGhEQ3cG9MwvkCAwEAAaN3MHUwCQYDVR0TBAIwADAL
14
+ BgNVHQ8EBAMCBLAwHQYDVR0OBBYEFImGed2AXS070ohfRidiCEhXEUN+MB0GA1Ud
15
15
  EQQWMBSBEm1hY2llakBtZW5zZmVsZC5wbDAdBgNVHRIEFjAUgRJtYWNpZWpAbWVu
16
- c2ZlbGQucGwwDQYJKoZIhvcNAQELBQADggGBAKA4eqko6BTNhlysip6rfBkVTGri
17
- ZXsL+kRb2hLvsQJS/kLyM21oMlu+LN0aPj3qEFR8mE/YeDD8rLAfruBRTltPNbR7
18
- xA5eE1gkxY5LfExUtK3b2wPqfmo7mZgfcsMwfYg/tUXw1WpBCnrhAJodpGH6SXmp
19
- A40qFUZst0vjiOoO+aTblIHPmMJXoZ3K42dTlNKlEiDKUWMRKSgpjjYGEYalFNWI
20
- hHfCz2r8L2t+dYdMZg1JGbEkq4ADGsAA8ioZIpJd7V4hI17u5TCdi7X5wh/0gN0E
21
- CgP+nLox3D+l2q0QuQEkayr+auFYkzTCkF+BmEk1D0Ru4mcf3F4CJvEmW4Pzbjqt
22
- i1tsCWPtJ4E/UUKnKaWKqGbjrjHJ0MuShYzHkodox5IOiCXIQg+1+YSzfXUV6WEK
23
- KJG/fhg1JV5vVDdVy6x+tv5SQ5ctU0feCsVfESi3rE3zRd+nvzE9HcZ5aXeL1UtJ
24
- nT5Xrioegu2w1jPyVEgyZgTZC5rvD0nNS5sFNQ==
16
+ c2ZlbGQucGwwDQYJKoZIhvcNAQELBQADggGBAKiHpwoENVrMi94V1zD4o8/6G3AU
17
+ gWz4udkPYHTZLUy3dLznc/sNjdkJFWT3E6NKYq7c60EpJ0m0vAEg5+F5pmNOsvD3
18
+ 2pXLj9kisEeYhR516HwXAvtngboUcb75skqvBCU++4Pu7BRAPjO1/ihLSBexbwSS
19
+ fF+J5OWNuyHHCQp+kGPLtXJe2yUYyvSWDj3I2//Vk0VhNOIlaCS1+5/P3ZJThOtm
20
+ zJUBI7h3HgovwRpcnmk2mXTmU4Zx/bCzX8EA6VY0khEvnmiq7S6eBF0H9qH8KyQ6
21
+ EkVLpvmUDFcf/uNaBQdazEMB5jYtwoA8gQlANETNGPi51KlkukhKgaIEDMkBDJOx
22
+ 65N7DzmkcyY0/GwjIVIxmRhcrCt1YeCUElmfFx0iida1/YRm6sB2AXqScc1+ECRi
23
+ 2DND//YJUikn1zwbz1kT70XmHd97B4Eytpln7K+M1u2g1pHVEPW4owD/ammXNpUy
24
+ nt70FcDD4yxJQ+0YNiHd0N8IcVBM1TMIVctMNQ==
25
25
  -----END CERTIFICATE-----
data/diffend.gemspec CHANGED
@@ -4,10 +4,19 @@ lib = File.expand_path('lib', __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require 'diffend/version'
6
6
 
7
+ files_locations = %w[
8
+ *.md
9
+ lib/**/*.rb
10
+ config/*
11
+ certs/*
12
+ diffend.gemspec
13
+ plugins.rb
14
+ ]
15
+
7
16
  Gem::Specification.new do |spec|
8
- spec.name = 'diffend'
17
+ spec.name = 'diffend-monitor'
9
18
  spec.version = Diffend::VERSION
10
- spec.authors = ['Tomasz Pajor']
19
+ spec.authors = ['Tomasz Pajor', 'Maciej Mensfeld']
11
20
  spec.email = ['contact@diffend.io']
12
21
 
13
22
  spec.summary = 'OSS supply chain security and management platform'
@@ -18,10 +27,11 @@ Gem::Specification.new do |spec|
18
27
  spec.signing_key = File.expand_path('~/.ssh/gem-private_key.pem')
19
28
  end
20
29
 
21
- spec.cert_chain = %w[certs/tomaszpajor.pem]
22
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec)/}) }
30
+ spec.cert_chain = %w[certs/mensfeld.pem]
23
31
  spec.require_paths = %w[lib]
24
32
 
33
+ files_locations.each { |location| spec.files += Dir[location] }
34
+
25
35
  spec.add_development_dependency 'bundler'
26
36
  spec.add_development_dependency 'rake'
27
37
  end
@@ -11,5 +11,7 @@ module Diffend
11
11
  EXEC = 'exec'
12
12
  # Bundler secure command introduced by diffend plugin
13
13
  SECURE = 'secure'
14
+ # Bundler add command
15
+ ADD = 'add'
14
16
  end
15
17
  end
@@ -32,6 +32,17 @@ module Diffend
32
32
  Expected #{Validator::KNOWN_KEYS[key].join(' or ')}, was #{config.public_send(key).class}.
33
33
  MSG
34
34
  end
35
+
36
+ # Invalid uuid value message
37
+ #
38
+ # @param key [String] invalid key
39
+ #
40
+ # @return [String]
41
+ def invalid_uuid(key)
42
+ <<~MSG
43
+ Diffend configuration value for #{key} is invalid.
44
+ MSG
45
+ end
35
46
  end
36
47
  end
37
48
  end
@@ -17,6 +17,14 @@ module Diffend
17
17
  development?: [TrueClass, FalseClass]
18
18
  }.freeze
19
19
 
20
+ # List of known uuid keys
21
+ UUID_KEYS = %i[project_id shareable_id shareable_key].freeze
22
+
23
+ # Imported from https://github.com/assaf/uuid/blob/master/lib/uuid.rb#L199
24
+ UUID_FORMAT = /\A[\da-f]{8}-([\da-f]{4}-){3}[\da-f]{12}\z/i
25
+
26
+ private_constant :UUID_KEYS, :UUID_FORMAT
27
+
20
28
  class << self
21
29
  # @param config [Diffend::Config]
22
30
  def call(config)
@@ -28,6 +36,12 @@ module Diffend
28
36
 
29
37
  config.errors << ErrorMessages.invalid_key(config, key) if invalid?(config, key)
30
38
  end
39
+
40
+ UUID_KEYS.each do |key|
41
+ next if valid_uuid?(config, key)
42
+
43
+ config.errors << ErrorMessages.invalid_uuid(key)
44
+ end
31
45
  end
32
46
 
33
47
  private
@@ -49,6 +63,14 @@ module Diffend
49
63
  def invalid?(config, key)
50
64
  !KNOWN_KEYS[key].include?(config.public_send(key).class)
51
65
  end
66
+
67
+ # @param config [Diffend::Config]
68
+ # @param key [String]
69
+ #
70
+ # @return [Boolean] true if key has a valid uuid, false otherwise
71
+ def valid_uuid?(config, key)
72
+ UUID_FORMAT.match?(config.public_send(key))
73
+ end
52
74
  end
53
75
  end
54
76
  end
@@ -21,5 +21,7 @@ module Diffend
21
21
  HandledException = Class.new(BaseError)
22
22
  # Raised when we are unable to resolve dependencies
23
23
  DependenciesResolveException = Class.new(BaseError)
24
+ # Failure of a shell command execution
25
+ FailedShellCommand = Class.new(BaseError)
24
26
  end
25
27
  end
@@ -30,7 +30,7 @@ module Diffend
30
30
  # @param response [Hash] response from diffend API
31
31
  def build_message(config, response)
32
32
  if response.key?('error')
33
- build_error(response)
33
+ build_error(config, response)
34
34
  elsif response.key?('action')
35
35
  build_verdict(config, response)
36
36
  else
@@ -43,8 +43,9 @@ module Diffend
43
43
  end
44
44
  end
45
45
 
46
+ # @param config [Diffend::Config]
46
47
  # @param response [Hash] response from diffend API
47
- def build_error(response)
48
+ def build_error(config, response)
48
49
  build_error_message(response)
49
50
  .tap(&config.logger.method(:error))
50
51
 
@@ -65,7 +66,7 @@ module Diffend
65
66
  build_deny_message(config.command, response)
66
67
  .tap(&config.logger.method(:error))
67
68
 
68
- exit 1
69
+ exit 1 unless ENV.key?('DIFFEND_SKIP_DENY')
69
70
  else
70
71
  Diffend::HandleErrors::Report.call(
71
72
  config: config,
@@ -39,10 +39,10 @@ module Diffend
39
39
  # @return [Diffend::RequestObject]
40
40
  def build_request_object(config, payload)
41
41
  Diffend::RequestObject.new(
42
- config: config,
43
- url: config.errors_url,
44
- payload: payload,
45
- request_method: :post
42
+ config,
43
+ config.errors_url,
44
+ payload,
45
+ :post
46
46
  )
47
47
  end
48
48
 
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Diffend
4
+ # Repository for integrations
5
+ class IntegrationRepository
6
+ # Plugin code entry in Gemfile
7
+ GEMFILE_PLUGIN_ENTRY = 'plugin \'diffend\''
8
+ # Gemfile file name
9
+ GEMFILE_FILE_NAME = 'Gemfile'
10
+ # Gemfile backup file name
11
+ GEMFILE_BACKUP_FILE_NAME = 'Gemfile.backup'
12
+ # Plugin install command
13
+ PLUGIN_INSTALL_COMMAND = 'bundle plugin install diffend'
14
+
15
+ attr_reader :command, :name, :repository
16
+
17
+ # @param command [String] command executed via bundler
18
+ # @param name [String] repository name
19
+ def initialize(command, name)
20
+ @command = command
21
+ @name = name
22
+ @repository = Diffend::Repository.new(command, name)
23
+ end
24
+
25
+ # @return [String] full name of the repository with command
26
+ def full_name
27
+ "#{command}_#{name}"
28
+ end
29
+
30
+ # @param path [String] path to the repository
31
+ def config?(path)
32
+ # check if .diffend.yml exists
33
+ return if File.exist?(File.join(path, Diffend::Config::FILENAME))
34
+
35
+ puts "Diffend configuration does not exist for #{command} #{name}"
36
+ exit 1
37
+ end
38
+
39
+ # @param path [String] path to the repository
40
+ def install_plugin(path)
41
+ cmd = Diffend::Shell.call_in_path(path, PLUGIN_INSTALL_COMMAND)
42
+
43
+ unless cmd[:exit_code].zero?
44
+ puts "#{PLUGIN_INSTALL_COMMAND} failed"
45
+ puts cmd[:stderr]
46
+ exit 1
47
+ end
48
+
49
+ switch_plugin_to_development(path, cmd[:stdout])
50
+ add_plugin_to_gemfile(path)
51
+ end
52
+
53
+ private
54
+
55
+ # @param path [String] path to the repository
56
+ # @param stdout [String] stdout from plugin install command
57
+ def switch_plugin_to_development(path, stdout)
58
+ installed_version = stdout.scan(/Installing diffend (\d*\.\d*\.\d*)/)[0][0]
59
+ diffend_working_path = File.expand_path('..', Bundler.bin_path)
60
+ bundler_plugins_path = File.join(path, '.bundle/plugin/gems')
61
+ bundler_diffend_plugin_path = File.join(bundler_plugins_path, "diffend-#{installed_version}")
62
+ FileUtils.mv(bundler_diffend_plugin_path, "#{bundler_diffend_plugin_path}-")
63
+ FileUtils.ln_s(diffend_working_path, bundler_diffend_plugin_path)
64
+ end
65
+
66
+ # @param path [String] path to the repository
67
+ def add_plugin_to_gemfile(path)
68
+ gemfile_path = File.join(path, GEMFILE_FILE_NAME)
69
+
70
+ FileUtils.mv(gemfile_path, File.join(path, GEMFILE_BACKUP_FILE_NAME))
71
+ file = File.open(gemfile_path, 'w')
72
+ source_detected = nil
73
+
74
+ File.readlines(
75
+ File.join(path, GEMFILE_BACKUP_FILE_NAME)
76
+ ).each do |line|
77
+ if line.start_with?('source') && source_detected.nil?
78
+ source_detected = true
79
+ elsif source_detected
80
+ source_detected = false
81
+ file.write("\n#{GEMFILE_PLUGIN_ENTRY}\n")
82
+ end
83
+
84
+ file.write(line)
85
+ end
86
+
87
+ file.close
88
+
89
+ FileUtils.rm(File.join(path, GEMFILE_BACKUP_FILE_NAME))
90
+ end
91
+ end
92
+ end
@@ -56,7 +56,7 @@ module Diffend
56
56
  #
57
57
  # @return [Array]
58
58
  def tags
59
- tags = []
59
+ tags = prepare_user_tags
60
60
 
61
61
  if ENV.key?('GITHUB_ACTIONS')
62
62
  tags << 'ci'
@@ -71,6 +71,17 @@ module Diffend
71
71
  tags
72
72
  end
73
73
 
74
+ # Prepare user tags
75
+ #
76
+ # @return [Array]
77
+ def prepare_user_tags
78
+ if ENV.key?('DIFFEND_TAGS')
79
+ ENV['DIFFEND_TAGS'].split(',')
80
+ else
81
+ []
82
+ end
83
+ end
84
+
74
85
  # @param str [String] that we want to clean and truncate
75
86
  def clean(str)
76
87
  str
@@ -39,8 +39,7 @@ module Diffend
39
39
  ::Bundler.ui.silence { instance.resolve }
40
40
 
41
41
  case command
42
- when Commands::INSTALL, Commands::EXEC, Commands::SECURE then instance.build_install
43
- when Commands::UPDATE then instance.build_update
42
+ when Commands::INSTALL, Commands::EXEC, Commands::SECURE, Commands::UPDATE, Commands::ADD then instance.build
44
43
  else
45
44
  raise ArgumentError, "invalid command: #{command}"
46
45
  end
@@ -63,37 +62,21 @@ module Diffend
63
62
  # Resolve definition
64
63
  def resolve
65
64
  @cached ? @definition.resolve_with_cache! : @definition.resolve_remotely!
66
- end
67
-
68
- # Build install specification
69
- #
70
- # @return [Hash]
71
- def build_install
72
- hash = build_main
73
-
74
- @definition.specs.each do |spec|
75
- next if skip?(spec.source)
76
-
77
- locked_spec = @locked_specs.find { |s| s.name == spec.name }
78
-
79
- hash['dependencies'][spec.name] = {
80
- 'platform' => build_spec_platform(spec, locked_spec),
81
- 'source' => build_spec_source(spec),
82
- 'type' => build_dependency_type(spec.name),
83
- 'versions' => build_versions(spec, locked_spec)
84
- }
85
- end
86
65
 
87
- hash
66
+ # Despite bundler not materializing resolution, we always need to do so to get all the
67
+ # gems details
68
+ @definition.specs
88
69
  end
89
70
 
90
- # Build update specification
71
+ # Build specification
91
72
  #
92
73
  # @return [Hash]
93
- def build_update
74
+ def build
94
75
  hash = build_main
95
76
 
96
- @definition.specs.each do |spec|
77
+ @definition.resolve.each do |spec|
78
+ # Skip metadata
79
+ next if spec.instance_variable_get(:@specification).nil?
97
80
  next if skip?(spec.source)
98
81
 
99
82
  locked_spec = @locked_specs.find { |s| s.name == spec.name }
@@ -117,8 +100,8 @@ module Diffend
117
100
  def build_main
118
101
  {
119
102
  'dependencies' => {},
120
- 'sources' => build_sources,
121
103
  'plugins' => {},
104
+ 'sources' => build_sources,
122
105
  'platforms' => @definition.platforms.map(&:to_s)
123
106
  }
124
107
  end