euax_gems_validator 1.0.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/Dockerfile +7 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +24 -0
- data/Makefile +2 -0
- data/README.md +25 -0
- data/Rakefile +8 -0
- data/docker-compose.yml +9 -0
- data/lib/euax_gems_validator/audit-service.rb +62 -0
- data/lib/euax_gems_validator/gems-service.rb +78 -0
- data/lib/euax_gems_validator/output-message.rb +17 -0
- data/lib/euax_gems_validator/validate.rb +75 -0
- data/lib/euax_gems_validator/version.rb +5 -0
- data/lib/euax_gems_validator.rb +28 -0
- data/plugins.rb +2 -0
- metadata +57 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: be1d4e909fe11107bb534a59ac2b4b7abc304d1c3d023781f89d1e9bfc6f3e09
|
4
|
+
data.tar.gz: cde3ec65c292ca2236f0f288e668014053d575a687d59ebf46ab14f279c6f93d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8da6269f85753c5b5c69c62b70897603eee2421203df42d23cf446a7e8164c9107adbb373fa9dfd6457d68fe01b37899f33507a4bc67ff1c97aabf6511f66f41
|
7
|
+
data.tar.gz: 6dc0add79e2228f541fa400887ce6dd6e047bc9c409d37bee8d38b5e6c6ce7903dc2e2198c9d9ba593a313d0bce618d5a171ba545462a29d2742ea9df155aec8
|
data/.rspec
ADDED
data/Dockerfile
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
gems-validator (0.7.4)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
bundler-audit (0.9.1)
|
10
|
+
bundler (>= 1.2.0, < 3)
|
11
|
+
thor (~> 1.0)
|
12
|
+
rake (13.0.6)
|
13
|
+
thor (1.2.1)
|
14
|
+
|
15
|
+
PLATFORMS
|
16
|
+
ruby
|
17
|
+
|
18
|
+
DEPENDENCIES
|
19
|
+
bundler-audit
|
20
|
+
gems-validator!
|
21
|
+
rake (~> 13.0)
|
22
|
+
|
23
|
+
BUNDLED WITH
|
24
|
+
1.17.3
|
data/Makefile
ADDED
data/README.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# Gems validator
|
2
|
+
|
3
|
+
Um plugin Bundle para validar gems homologadas nas aplicações do grupo EUAX.
|
4
|
+
|
5
|
+
## 📦 **Instalação**
|
6
|
+
|
7
|
+
Execute `bundle plugin install euax_gems_validator` para adicionar o plugin ao seu bundle.
|
8
|
+
|
9
|
+
## 🤷♂️ **Como funciona?**
|
10
|
+
|
11
|
+
Após instalar o plugin ele irá rodar toda vez que `bundle install` for executado. O plugin utiliza da [API de bibliotecas homologadas](https://github.com/Artia/euax-homologated-libraries)
|
12
|
+
para validar as gems de um produto, verificando se elas podem ou não serem instaladas. Ao detectar que uma gem não pode ser instalada o processo de instalação
|
13
|
+
é interrompido e uma mensagem de erro com o motivo da falha é apresentada no terminal.
|
14
|
+
|
15
|
+
## 🤝 **Contribuindo**
|
16
|
+
|
17
|
+
Todo tipo de contribuição é muito bem vinda e apreciada!
|
18
|
+
|
19
|
+
- ⭐️ Dê uma estrela ao projeto
|
20
|
+
- 🐛 Encontre e reporte issues
|
21
|
+
- 📥 Envie PRs e ajude a resolver issues e adição de features
|
22
|
+
|
23
|
+
---
|
24
|
+
|
25
|
+
Feito com ❤️ por **Henrique Schmeller**.
|
data/Rakefile
ADDED
data/docker-compose.yml
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GemsValidator
|
4
|
+
class AuditService
|
5
|
+
def initialize()
|
6
|
+
@audit_response = %x[bundle audit check --format json]
|
7
|
+
parse_response()
|
8
|
+
|
9
|
+
@audit_data = {}
|
10
|
+
generate_data()
|
11
|
+
end
|
12
|
+
|
13
|
+
def is_a_vulnerable_gem?(gem)
|
14
|
+
name = gem.name
|
15
|
+
version = gem.version.to_s
|
16
|
+
unless @audit_data[name].nil?
|
17
|
+
generate_messages(name, version)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def get_translate_criticality(criticality)
|
23
|
+
translate_default_criticalities = { "critical" => "crítica", "high" => "alta", "medium" => "média", "low" => "baixa" }
|
24
|
+
translate_default_criticalities[criticality] || 'não definido'
|
25
|
+
end
|
26
|
+
|
27
|
+
def generate_messages(name, version)
|
28
|
+
GemsValidator::OutputMessage.warn("A gem #{name} na versão #{version} apresenta #{@audit_data[name]["vulnerabilities"].size} vulnerabilidade#{@audit_data[name]["vulnerabilities"].size > 1 ? "s" : ""}")
|
29
|
+
@audit_data[name]["vulnerabilities"].map.with_index do |vulnerability, number|
|
30
|
+
GemsValidator::OutputMessage.warn("* Título: #{vulnerability[:title]} \n Nível: #{get_translate_criticality(vulnerability[:level])} \n URL: #{vulnerability[:url]}")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def generate_data()
|
35
|
+
|
36
|
+
@audit_response["results"]&.map do |audit_item|
|
37
|
+
gem_name = audit_item["gem"]["name"]
|
38
|
+
if (@audit_data[gem_name])
|
39
|
+
@audit_data[gem_name]["vulnerabilities"].push({"title": audit_item["advisory"]["title"], "level": audit_item["advisory"]["criticality"], "url": audit_item["advisory"]["url"]})
|
40
|
+
else
|
41
|
+
@audit_data[gem_name] = {
|
42
|
+
"vulnerabilities" => [
|
43
|
+
{
|
44
|
+
"title": audit_item["advisory"]["title"],
|
45
|
+
"level": audit_item["advisory"]["criticality"],
|
46
|
+
"url": audit_item["advisory"]["url"]
|
47
|
+
}
|
48
|
+
]
|
49
|
+
}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def parse_response()
|
55
|
+
begin
|
56
|
+
@audit_response = JSON.parse(@audit_response)
|
57
|
+
rescue => exception
|
58
|
+
GemsValidator::OutputMessage.error("Erro ao gerar dados de pacotes vulneráveis.")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GemsValidator
|
4
|
+
API_BASE_URL = "https://c1cc-2804-14c-f288-9d8e-6f0c-1c9a-fd64-a09b.sa.ngrok.io"
|
5
|
+
class GemsService
|
6
|
+
def initialize()
|
7
|
+
@pwd = Dir.pwd
|
8
|
+
end
|
9
|
+
|
10
|
+
# Response:
|
11
|
+
# {
|
12
|
+
# allowed_gems: {
|
13
|
+
# [name]: {
|
14
|
+
# approved_at: Date,
|
15
|
+
# version?: String
|
16
|
+
# }
|
17
|
+
# },
|
18
|
+
# blocked_gems: {
|
19
|
+
# [name]: {
|
20
|
+
# blocked_at: Date,
|
21
|
+
# version?: String
|
22
|
+
# }
|
23
|
+
# },
|
24
|
+
# pending_gems: {
|
25
|
+
# [name]: {
|
26
|
+
# requested_at: Date
|
27
|
+
# }
|
28
|
+
# }
|
29
|
+
# }
|
30
|
+
def get_gems()
|
31
|
+
gems_formatted_request
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
def get_token
|
36
|
+
uri = URI("#{GemsValidator::API_BASE_URL}/sessions/token")
|
37
|
+
request = Net::HTTP::Post.new(uri)
|
38
|
+
request.body = { username: 'viewer', password: 'viewer@euax' }.to_json
|
39
|
+
request['Content-Type'] = 'application/json'
|
40
|
+
|
41
|
+
Net::HTTP.start(uri.host, uri.port) do |http|
|
42
|
+
response = http.request request
|
43
|
+
response.header['access_token']
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def gems_formatted_request
|
48
|
+
uri = URI("#{GemsValidator::API_BASE_URL}/gems/formatted")
|
49
|
+
begin
|
50
|
+
access_token = get_token
|
51
|
+
|
52
|
+
Net::HTTP.start(uri.host, uri.port) do |http|
|
53
|
+
request = Net::HTTP::Get.new uri
|
54
|
+
request["Authorization"] = access_token
|
55
|
+
response = http.request request
|
56
|
+
parse_body = JSON.parse(response.body)["data"]
|
57
|
+
generate_file("#{@pwd}/.euax-homologated-libraries", parse_body.to_json)
|
58
|
+
parse_body
|
59
|
+
end
|
60
|
+
rescue
|
61
|
+
puts " "
|
62
|
+
GemsValidator::OutputMessage.warn("A API das bibliotecas homologadas esta fora do ar. Para prosseguir, nesse momento os dados serão coletados do cache.")
|
63
|
+
puts " "
|
64
|
+
sleep(3)
|
65
|
+
begin
|
66
|
+
JSON.parse(File.read("#{@pwd}/.euax-homologated-libraries/gems-response.json"))
|
67
|
+
rescue
|
68
|
+
{ "allowed_gems" => {}, "blocked_gems" => {}, "pending_gems" => {} }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def generate_file(base_url, data)
|
74
|
+
Dir.mkdir(base_url) unless File.exists?(base_url)
|
75
|
+
File.write("#{base_url}/gems-response.json", data)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GemsValidator
|
4
|
+
class OutputMessage
|
5
|
+
def self.error(message)
|
6
|
+
Bundler::GemspecError.new("[GemsValidator::Error] - #{message}")
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.warn(message)
|
10
|
+
Bundler.ui.warn("[GemsValidator::Warning] - #{message}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.success(message)
|
14
|
+
Bundler.ui.confirm("[GemsValidator::Success] - #{message}")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GemsValidator
|
4
|
+
module Validate
|
5
|
+
class << self
|
6
|
+
def exec(gem)
|
7
|
+
@gem = gem
|
8
|
+
begin
|
9
|
+
is_blocked?
|
10
|
+
is_pending?
|
11
|
+
is_allowed?
|
12
|
+
GemsValidator::OutputMessage.success("A gem #{@gem.name} está homologada e pode ser instalada!")
|
13
|
+
rescue => error
|
14
|
+
raise GemsValidator::OutputMessage.error("Não foi possível instalar a gem #{@gem.name}. Motivo: #{error.to_s}")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def is_blocked?
|
20
|
+
if gems_from_service["blocked_gems"].keys.include?(@gem.name)
|
21
|
+
is_version_blocked?
|
22
|
+
raise "Essa gem foi bloqueada."
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def is_version_blocked?
|
27
|
+
if gems_from_service["blocked_gems"][@gem.name]["version"]
|
28
|
+
blocked_version = gems_from_service["blocked_gems"][@gem.name]["version"]
|
29
|
+
if @gem.version.to_s == blocked_version
|
30
|
+
raise "A versão #{blocked_version} foi bloqueada."
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def is_pending?
|
36
|
+
if gems_from_service["pending_gems"].keys.include?(@gem.name)
|
37
|
+
raise "Essa gem está aguardando aprovação."
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def is_allowed?
|
42
|
+
if gems_from_service["allowed_gems"].keys.include?(@gem.name)
|
43
|
+
is_version_allowed?
|
44
|
+
is_deprecated?
|
45
|
+
else
|
46
|
+
raise "Essa gem não foi homologada."
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def is_version_allowed?
|
51
|
+
if gems_from_service["allowed_gems"][@gem.name]["version"]
|
52
|
+
required_version = gems_from_service["allowed_gems"][@gem.name]["version"]
|
53
|
+
if @gem.version.to_s != required_version
|
54
|
+
raise "Essa gem só pode ser instalada na versão #{required_version}."
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def is_deprecated?
|
60
|
+
if gems_from_service["allowed_gems"][@gem.name]["deprecated"]
|
61
|
+
message = gems_from_service["allowed_gems"][@gem.name]["deprecated_message"]
|
62
|
+
GemsValidator::OutputMessage.warn("A gem #{@gem.name} está depreciada. Motivo: #{message}")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def gems_service
|
67
|
+
@gems_service ||= GemsValidator::GemsService.new()
|
68
|
+
end
|
69
|
+
|
70
|
+
def gems_from_service
|
71
|
+
@gems_from_service ||= gems_service.get_gems()
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler'
|
4
|
+
require 'net/http'
|
5
|
+
require 'uri'
|
6
|
+
require 'json'
|
7
|
+
|
8
|
+
require_relative "euax_gems_validator/audit-service"
|
9
|
+
require_relative "euax_gems_validator/output-message"
|
10
|
+
require_relative "euax_gems_validator/gems-service"
|
11
|
+
require_relative "euax_gems_validator/validate"
|
12
|
+
require_relative "euax_gems_validator/version"
|
13
|
+
|
14
|
+
module GemsValidator
|
15
|
+
class << self
|
16
|
+
def register
|
17
|
+
return if defined?(@registered) && @registered
|
18
|
+
@registered = true
|
19
|
+
|
20
|
+
auditService = GemsValidator::AuditService.new
|
21
|
+
|
22
|
+
Bundler::Plugin.add_hook('before-install') do |gem|
|
23
|
+
GemsValidator::Validate.exec(gem.spec)
|
24
|
+
auditService.is_a_vulnerable_gem?(gem.spec)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/plugins.rb
ADDED
metadata
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: euax_gems_validator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0.beta
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- henriquesml
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-11-23 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: euax_gems_validator
|
14
|
+
email:
|
15
|
+
- henrique_schmeller@hotmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- ".rspec"
|
21
|
+
- Dockerfile
|
22
|
+
- Gemfile
|
23
|
+
- Gemfile.lock
|
24
|
+
- Makefile
|
25
|
+
- README.md
|
26
|
+
- Rakefile
|
27
|
+
- docker-compose.yml
|
28
|
+
- lib/euax_gems_validator.rb
|
29
|
+
- lib/euax_gems_validator/audit-service.rb
|
30
|
+
- lib/euax_gems_validator/gems-service.rb
|
31
|
+
- lib/euax_gems_validator/output-message.rb
|
32
|
+
- lib/euax_gems_validator/validate.rb
|
33
|
+
- lib/euax_gems_validator/version.rb
|
34
|
+
- plugins.rb
|
35
|
+
homepage:
|
36
|
+
licenses: []
|
37
|
+
metadata: {}
|
38
|
+
post_install_message:
|
39
|
+
rdoc_options: []
|
40
|
+
require_paths:
|
41
|
+
- lib
|
42
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 2.3.8
|
47
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">"
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: 1.3.1
|
52
|
+
requirements: []
|
53
|
+
rubygems_version: 3.0.3
|
54
|
+
signing_key:
|
55
|
+
specification_version: 4
|
56
|
+
summary: euax_gems_validator
|
57
|
+
test_files: []
|