pact_broker 2.53.0 → 2.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +78 -0
- data/lib/pact_broker/api/contracts/webhook_contract.rb +8 -6
- data/lib/pact_broker/api/decorators/reason_decorator.rb +17 -0
- data/lib/pact_broker/api/pact_broker_urls.rb +2 -2
- data/lib/pact_broker/api/renderers/html_pact_renderer.rb +14 -14
- data/lib/pact_broker/api/resources/base_resource.rb +5 -0
- data/lib/pact_broker/api/resources/latest_pact.rb +1 -1
- data/lib/pact_broker/api/resources/pact.rb +3 -3
- data/lib/pact_broker/app.rb +24 -4
- data/lib/pact_broker/configuration.rb +15 -0
- data/lib/pact_broker/db.rb +9 -1
- data/lib/pact_broker/doc/controllers/app.rb +11 -1
- data/lib/pact_broker/doc/views/layouts/main.haml +1 -1
- data/lib/pact_broker/domain/verification.rb +13 -0
- data/lib/pact_broker/integrations/service.rb +2 -2
- data/lib/pact_broker/locale/en.yml +4 -0
- data/lib/pact_broker/logging.rb +3 -1
- data/lib/pact_broker/matrix/deployment_status_summary.rb +23 -1
- data/lib/pact_broker/matrix/reason.rb +9 -0
- data/lib/pact_broker/pacts/content.rb +26 -2
- data/lib/pact_broker/pacts/repository.rb +2 -2
- data/lib/pact_broker/tasks/migration_task.rb +20 -1
- data/lib/pact_broker/test/test_data_builder.rb +1 -1
- data/lib/pact_broker/ui/app.rb +1 -0
- data/lib/pact_broker/ui/controllers/base_controller.rb +1 -1
- data/lib/pact_broker/ui/controllers/clusters.rb +2 -2
- data/lib/pact_broker/ui/controllers/groups.rb +3 -2
- data/lib/pact_broker/ui/controllers/index.rb +3 -2
- data/lib/pact_broker/ui/controllers/matrix.rb +5 -3
- data/lib/pact_broker/ui/helpers/url_helper.rb +4 -4
- data/lib/pact_broker/ui/view_models/index_item.rb +16 -11
- data/lib/pact_broker/ui/view_models/index_items.rb +2 -2
- data/lib/pact_broker/ui/view_models/matrix_line.rb +12 -7
- data/lib/pact_broker/ui/view_models/matrix_lines.rb +2 -2
- data/lib/pact_broker/ui/views/groups/show.html.erb +3 -3
- data/lib/pact_broker/ui/views/index/_css_and_js.haml +9 -9
- data/lib/pact_broker/ui/views/index/_navbar.haml +3 -3
- data/lib/pact_broker/ui/views/index/_pagination.haml +1 -1
- data/lib/pact_broker/ui/views/index/show-with-tags.haml +3 -3
- data/lib/pact_broker/ui/views/index/show.haml +3 -3
- data/lib/pact_broker/ui/views/layouts/main.haml +4 -4
- data/lib/pact_broker/ui/views/matrix/show.haml +10 -10
- data/lib/pact_broker/verifications/repository.rb +2 -2
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/webhooks/service.rb +4 -3
- data/lib/pact_broker/webhooks/webhook_event.rb +1 -1
- data/lib/rack/pact_broker/invalid_uri_protection.rb +25 -4
- data/lib/rack/pact_broker/use_when.rb +55 -0
- data/pact_broker.gemspec +2 -2
- data/public/javascripts/pact.js +7 -6
- data/script/foo-bar-verification.json +3 -1
- data/script/foo-bar.json +11 -0
- data/script/seed.rb +1 -1
- data/spec/features/create_webhook_spec.rb +1 -1
- data/spec/features/delete_integration_spec.rb +2 -2
- data/spec/fixtures/webhook_valid.json +1 -1
- data/spec/fixtures/webhook_valid_with_pacticipants.json +1 -1
- data/spec/integration/ui/index_spec.rb +16 -0
- data/spec/integration/ui/matrix_spec.rb +1 -1
- data/spec/lib/pact_broker/api/contracts/webhook_contract_spec.rb +12 -0
- data/spec/lib/pact_broker/api/decorators/reason_decorator_spec.rb +18 -1
- data/spec/lib/pact_broker/api/renderers/html_pact_renderer_spec.rb +1 -1
- data/spec/lib/pact_broker/api/resources/latest_pact_spec.rb +1 -0
- data/spec/lib/pact_broker/api/resources/pact_spec.rb +1 -0
- data/spec/lib/pact_broker/doc/controllers/app_spec.rb +16 -0
- data/spec/lib/pact_broker/integrations/service_spec.rb +6 -0
- data/spec/lib/pact_broker/matrix/deployment_status_summary_spec.rb +6 -2
- data/spec/lib/pact_broker/matrix/integration_spec.rb +43 -0
- data/spec/lib/pact_broker/pacts/content_spec.rb +125 -0
- data/spec/lib/rack/pact_broker/invalid_uri_protection_spec.rb +23 -3
- data/spec/lib/rack/pact_broker/use_when_spec.rb +49 -0
- data/vendor/hal-browser/README.adoc +169 -0
- data/vendor/hal-browser/browser.html +36 -22
- data/vendor/hal-browser/js/hal.js +30 -7
- data/vendor/hal-browser/js/hal/http/client.js +14 -6
- data/vendor/hal-browser/js/hal/resource.js +4 -2
- data/vendor/hal-browser/js/hal/views/documentation.js +1 -1
- data/vendor/hal-browser/js/hal/views/embedded_resource.js +10 -4
- data/vendor/hal-browser/js/hal/views/links.js +3 -2
- data/vendor/hal-browser/js/hal/views/non_safe_request_dialog.js +1 -1
- data/vendor/hal-browser/js/hal/views/properties.js +101 -2
- data/vendor/hal-browser/js/hal/views/query_uri_dialog.js +1 -1
- data/vendor/hal-browser/js/hal/views/request_headers.js +1 -1
- data/vendor/hal-browser/js/hal/views/resource.js +4 -3
- data/vendor/hal-browser/js/hal/views/response_headers.js +12 -1
- data/vendor/hal-browser/login.html +76 -0
- data/vendor/hal-browser/styles.css +3 -1
- data/vendor/hal-browser/vendor/js/URI.min.js +84 -0
- metadata +20 -9
- data/vendor/hal-browser/README.md +0 -41
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1de4cab3f4fb99ade4806255fb8e1ea1745429fdac8302154d092c99c36c7d76
|
|
4
|
+
data.tar.gz: 910569291d130d66d73b3a557a983ba4563a70ae7d3c581ad9ebc770958ea56e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2df74e9cbdfa705a1221f4422fb9dc18e33106b25a68b9b2013f649e8d35ad015b344251d2aacd7e9b22d73d50435eb3cdc2e773843de0b49792859e5daa83c6
|
|
7
|
+
data.tar.gz: 2f5255f3ba8292bd2df960db95c40b86196872c49f3080afb8cdb398dd96b22022bd6bd28ca73a221881322112fa9f9da6bf9d1b870dba6a59cd286bfb45fbeb
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,81 @@
|
|
|
1
|
+
<a name="v2.57.0"></a>
|
|
2
|
+
### v2.57.0 (2020-06-16)
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
#### Features
|
|
6
|
+
|
|
7
|
+
* add Content Security Policy header ([fd2e81fb](/../../commit/fd2e81fb))
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
#### Bug Fixes
|
|
11
|
+
|
|
12
|
+
* upgrade Rack for vulnerability CVE-2020-8184 ([99b78b3c](/../../commit/99b78b3c))
|
|
13
|
+
* fix Home link on pact page ([081d1586](/../../commit/081d1586))
|
|
14
|
+
* return a 422 if the URL path contains a new line or tab ([db9f7f4d](/../../commit/db9f7f4d))
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
<a name="v2.56.1"></a>
|
|
18
|
+
### v2.56.1 (2020-06-01)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
#### Bug Fixes
|
|
22
|
+
|
|
23
|
+
* **matrix ui**
|
|
24
|
+
* fix home link ([67065b7d](/../../commit/67065b7d))
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
<a name="v2.56.0"></a>
|
|
28
|
+
### v2.56.0 (2020-06-01)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
#### Features
|
|
32
|
+
|
|
33
|
+
* **database**
|
|
34
|
+
* log schema versions and migration info on startup ([b385e535](/../../commit/b385e535))
|
|
35
|
+
* allow options to be passed to Sequel migrate via the MigrationTask ([143613e7](/../../commit/143613e7))
|
|
36
|
+
|
|
37
|
+
* allow Pactflow messages in logs to be hidden by setting PACT_BROKER_HIDE_PACTFLOW_MESSAGES=true ([a7550105](/../../commit/a7550105))
|
|
38
|
+
|
|
39
|
+
* **can-i-deploy**
|
|
40
|
+
* experimental - add a warning message if there are interactions missing verification test results. ([f7ab8cc5](/../../commit/f7ab8cc5))
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
#### Bug Fixes
|
|
44
|
+
|
|
45
|
+
* use relative URLs when base_url not explictly set to ensure app is not vulnerable to host header attacks ([92c45a0a](/../../commit/92c45a0a))
|
|
46
|
+
* raise PactBroker::Error when either pacticipant is not found in the business layer while attempting to delete an integration ([3c209a46](/../../commit/3c209a46))
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
<a name="v2.55.0"></a>
|
|
50
|
+
### v2.55.0 (2020-05-22)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
#### Features
|
|
54
|
+
|
|
55
|
+
* support non root context (#344) ([dc480499](/../../commit/dc480499))
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
<a name="v2.54.0"></a>
|
|
59
|
+
### v2.54.0 (2020-05-13)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
#### Features
|
|
63
|
+
|
|
64
|
+
* **hal browser**
|
|
65
|
+
* update to latest code ([a79ad290](/../../commit/a79ad290))
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
#### Bug Fixes
|
|
69
|
+
|
|
70
|
+
* update rack for CVE-2020-8161 ([96c3386a](/../../commit/96c3386a))
|
|
71
|
+
|
|
72
|
+
* **hal browser**
|
|
73
|
+
* fix xss vulnerability ([ac564412](/../../commit/ac564412))
|
|
74
|
+
|
|
75
|
+
* **webhooks**
|
|
76
|
+
* add missing validation for event names when creating webhooks ([5fc0563c](/../../commit/5fc0563c))
|
|
77
|
+
|
|
78
|
+
|
|
1
79
|
<a name="v2.53.0"></a>
|
|
2
80
|
### v2.53.0 (2020-05-12)
|
|
3
81
|
|
|
@@ -2,6 +2,7 @@ require 'pact_broker/api/contracts/base_contract'
|
|
|
2
2
|
require 'pact_broker/webhooks/check_host_whitelist'
|
|
3
3
|
require 'pact_broker/webhooks/render'
|
|
4
4
|
require 'pact_broker/pacticipants/service'
|
|
5
|
+
require 'pact_broker/webhooks/webhook_event'
|
|
5
6
|
|
|
6
7
|
module PactBroker
|
|
7
8
|
module Api
|
|
@@ -13,11 +14,13 @@ module PactBroker
|
|
|
13
14
|
# I just cannot seem to get the validation to stop on the first error.
|
|
14
15
|
# If one rule fails, they all come back failed, and it's driving me nuts.
|
|
15
16
|
# Why on earth would I want that behaviour?
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
# I cannot believe I have to do this shit.
|
|
18
|
+
@first_errors = errors
|
|
19
|
+
@first_errors.messages.keys.each do | key |
|
|
20
|
+
@first_errors.messages[key] = @first_errors.messages[key][0...1]
|
|
19
21
|
end
|
|
20
|
-
|
|
22
|
+
|
|
23
|
+
def self.errors; @first_errors end
|
|
21
24
|
result
|
|
22
25
|
end
|
|
23
26
|
|
|
@@ -46,7 +49,6 @@ module PactBroker
|
|
|
46
49
|
|
|
47
50
|
required(:name).filled(:pacticipant_exists?)
|
|
48
51
|
end
|
|
49
|
-
|
|
50
52
|
end
|
|
51
53
|
|
|
52
54
|
property :provider do
|
|
@@ -155,7 +157,7 @@ module PactBroker
|
|
|
155
157
|
property :name
|
|
156
158
|
|
|
157
159
|
validation do
|
|
158
|
-
required(:name).filled
|
|
160
|
+
required(:name).filled(included_in?: PactBroker::Webhooks::WebhookEvent::EVENT_NAMES)
|
|
159
161
|
end
|
|
160
162
|
end
|
|
161
163
|
end
|
|
@@ -22,6 +22,11 @@ module PactBroker
|
|
|
22
22
|
"There are no missing dependencies"
|
|
23
23
|
when PactBroker::Matrix::Successful
|
|
24
24
|
"All required verification results are published and successful"
|
|
25
|
+
when PactBroker::Matrix::InteractionsMissingVerifications
|
|
26
|
+
descriptions = reason.interactions.collect do | interaction |
|
|
27
|
+
interaction_description(interaction)
|
|
28
|
+
end.join('; ')
|
|
29
|
+
"WARNING: Although the verification was reported as successful, the results for #{reason.consumer_selector.description} and #{reason.provider_selector.description} may be missing tests for the following interactions: #{descriptions}"
|
|
25
30
|
else
|
|
26
31
|
reason
|
|
27
32
|
end
|
|
@@ -44,6 +49,18 @@ module PactBroker
|
|
|
44
49
|
""
|
|
45
50
|
end
|
|
46
51
|
end
|
|
52
|
+
|
|
53
|
+
# TODO move this somewhere else
|
|
54
|
+
def interaction_description(interaction)
|
|
55
|
+
if interaction['providerState'] && interaction['providerState'] != ''
|
|
56
|
+
"#{interaction['description']} given #{interaction['providerState']}"
|
|
57
|
+
elsif interaction['providerStates'] && interaction['providerStates'].is_a?(Array) && interaction['providerStates'].any?
|
|
58
|
+
provider_states = interaction['providerStates'].collect{ |ps| ps['name'] }.compact.join(', ')
|
|
59
|
+
"#{interaction['description']} given #{provider_states}"
|
|
60
|
+
else
|
|
61
|
+
interaction['description']
|
|
62
|
+
end
|
|
63
|
+
end
|
|
47
64
|
end
|
|
48
65
|
end
|
|
49
66
|
end
|
|
@@ -284,8 +284,8 @@ module PactBroker
|
|
|
284
284
|
"#{base_url}/groups/#{pacticipant_name}"
|
|
285
285
|
end
|
|
286
286
|
|
|
287
|
-
def hal_browser_url target_url
|
|
288
|
-
"/hal-browser/browser.html#" + target_url
|
|
287
|
+
def hal_browser_url target_url, base_url = ''
|
|
288
|
+
"#{base_url}/hal-browser/browser.html#" + target_url
|
|
289
289
|
end
|
|
290
290
|
|
|
291
291
|
def url_encode param
|
|
@@ -37,18 +37,18 @@ module PactBroker
|
|
|
37
37
|
|
|
38
38
|
def head
|
|
39
39
|
"<title>#{title}</title>
|
|
40
|
-
<link rel='stylesheet' type='text/css' href='/stylesheets/github.css'>
|
|
41
|
-
<link rel='stylesheet' type='text/css' href='/stylesheets/pact.css'>
|
|
42
|
-
<link rel='stylesheet' type='text/css' href='/stylesheets/github-json.css'>
|
|
43
|
-
<link rel='stylesheet' type='text/css' href='/css/bootstrap.min.css'>
|
|
44
|
-
<link rel='stylesheet' type='text/css' href='/stylesheets/material-menu.css'>
|
|
45
|
-
<link rel='stylesheet' type='text/css' href='/stylesheets/jquery-confirm.min.css'>
|
|
46
|
-
<script src='/javascripts/highlight.pack.js'></script>
|
|
47
|
-
<script src='/javascripts/jquery-3.3.1.min.js'></script>
|
|
48
|
-
<script src='/js/bootstrap.min.js'></script>
|
|
49
|
-
<script src='/javascripts/material-menu.js'></script>
|
|
50
|
-
<script src='/javascripts/pact.js'></script>
|
|
51
|
-
<script src='/javascripts/jquery-confirm.min.js'></script>
|
|
40
|
+
<link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/github.css'>
|
|
41
|
+
<link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/pact.css'>
|
|
42
|
+
<link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/github-json.css'>
|
|
43
|
+
<link rel='stylesheet' type='text/css' href='#{base_url}/css/bootstrap.min.css'>
|
|
44
|
+
<link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/material-menu.css'>
|
|
45
|
+
<link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/jquery-confirm.min.css'>
|
|
46
|
+
<script src='#{base_url}/javascripts/highlight.pack.js'></script>
|
|
47
|
+
<script src='#{base_url}/javascripts/jquery-3.3.1.min.js'></script>
|
|
48
|
+
<script src='#{base_url}/js/bootstrap.min.js'></script>
|
|
49
|
+
<script src='#{base_url}/javascripts/material-menu.js'></script>
|
|
50
|
+
<script src='#{base_url}/javascripts/pact.js'></script>
|
|
51
|
+
<script src='#{base_url}/javascripts/jquery-confirm.min.js'></script>
|
|
52
52
|
<script>hljs.initHighlightingOnLoad();</script>"
|
|
53
53
|
end
|
|
54
54
|
|
|
@@ -72,7 +72,7 @@ module PactBroker
|
|
|
72
72
|
<a href=\"#{matrix_url}\">View Matrix</a>
|
|
73
73
|
</li>
|
|
74
74
|
<li>
|
|
75
|
-
<a href=\"/\">Home</a>
|
|
75
|
+
<a href=\"#{base_url}/\">Home</a>
|
|
76
76
|
</li>
|
|
77
77
|
<li>
|
|
78
78
|
<span data-consumer-name=\"#{@pact.consumer.name}\"
|
|
@@ -129,7 +129,7 @@ module PactBroker
|
|
|
129
129
|
end
|
|
130
130
|
|
|
131
131
|
def json_url
|
|
132
|
-
PactBroker::Api::PactBrokerUrls.hal_browser_url pact_url
|
|
132
|
+
PactBroker::Api::PactBrokerUrls.hal_browser_url pact_url, base_url
|
|
133
133
|
end
|
|
134
134
|
|
|
135
135
|
def pact_url
|
|
@@ -62,6 +62,11 @@ module PactBroker
|
|
|
62
62
|
PactBroker.configuration.base_url || request.base_uri.to_s.chomp('/')
|
|
63
63
|
end
|
|
64
64
|
|
|
65
|
+
# See comments for base_url in lib/pact_broker/doc/controllers/app.rb
|
|
66
|
+
def ui_base_url
|
|
67
|
+
PactBroker.configuration.base_url || ''
|
|
68
|
+
end
|
|
69
|
+
|
|
65
70
|
def charsets_provided
|
|
66
71
|
[['utf-8', :encode]]
|
|
67
72
|
end
|
|
@@ -77,8 +77,8 @@ module PactBroker
|
|
|
77
77
|
def to_html
|
|
78
78
|
PactBroker.configuration.html_pact_renderer.call(
|
|
79
79
|
pact, {
|
|
80
|
-
base_url:
|
|
81
|
-
badge_url: badge_url_for_latest_pact(pact,
|
|
80
|
+
base_url: ui_base_url,
|
|
81
|
+
badge_url: badge_url_for_latest_pact(pact, ui_base_url)
|
|
82
82
|
})
|
|
83
83
|
end
|
|
84
84
|
|
|
@@ -100,7 +100,7 @@ module PactBroker
|
|
|
100
100
|
|
|
101
101
|
def set_post_deletion_response
|
|
102
102
|
latest_pact = pact_service.find_latest_pact(pact_params)
|
|
103
|
-
response_body = { "_links" => {} }
|
|
103
|
+
response_body = { "_links" => { index: { href: base_url } } }
|
|
104
104
|
if latest_pact
|
|
105
105
|
response_body["_links"]["pb:latest-pact-version"] = {
|
|
106
106
|
href: latest_pact_url(base_url, latest_pact),
|
data/lib/pact_broker/app.rb
CHANGED
|
@@ -15,12 +15,14 @@ require 'rack/pact_broker/no_auth'
|
|
|
15
15
|
require 'rack/pact_broker/convert_404_to_hal'
|
|
16
16
|
require 'rack/pact_broker/reset_thread_data'
|
|
17
17
|
require 'rack/pact_broker/add_vary_header'
|
|
18
|
+
require 'rack/pact_broker/use_when'
|
|
18
19
|
require 'sucker_punch'
|
|
19
20
|
|
|
20
21
|
module PactBroker
|
|
21
22
|
|
|
22
23
|
class App
|
|
23
24
|
include PactBroker::Logging
|
|
25
|
+
using Rack::PactBroker::UseWhen
|
|
24
26
|
|
|
25
27
|
attr_accessor :configuration
|
|
26
28
|
|
|
@@ -81,11 +83,18 @@ module PactBroker
|
|
|
81
83
|
end
|
|
82
84
|
|
|
83
85
|
def prepare_database
|
|
86
|
+
logger.info "Database schema version is #{PactBroker::DB.version(configuration.database_connection)}"
|
|
84
87
|
if configuration.auto_migrate_db
|
|
85
|
-
|
|
86
|
-
PactBroker::DB.
|
|
88
|
+
migration_options = { allow_missing_migration_files: configuration.allow_missing_migration_files }
|
|
89
|
+
if PactBroker::DB.is_current?(configuration.database_connection, migration_options)
|
|
90
|
+
logger.info "Skipping database migrations as the latest migration has already been applied"
|
|
91
|
+
else
|
|
92
|
+
logger.info "Migrating database schema"
|
|
93
|
+
PactBroker::DB.run_migrations configuration.database_connection, migration_options
|
|
94
|
+
logger.info "Database schema version is now #{PactBroker::DB.version(configuration.database_connection)}"
|
|
95
|
+
end
|
|
87
96
|
else
|
|
88
|
-
logger.info "Skipping database migrations"
|
|
97
|
+
logger.info "Skipping database schema migrations as database auto migrate is disabled"
|
|
89
98
|
end
|
|
90
99
|
|
|
91
100
|
if configuration.auto_migrate_db_data
|
|
@@ -155,6 +164,15 @@ module PactBroker
|
|
|
155
164
|
# NOTE THAT NONE OF THIS IS PROTECTED BY AUTH - is that ok?
|
|
156
165
|
if configuration.use_rack_protection
|
|
157
166
|
@app_builder.use Rack::Protection, except: [:path_traversal, :remote_token, :session_hijacking, :http_origin]
|
|
167
|
+
|
|
168
|
+
is_hal_browser = ->(env) { env['PATH_INFO'] == '/hal-browser/browser.html' }
|
|
169
|
+
not_hal_browser = ->(env) { env['PATH_INFO'] != '/hal-browser/browser.html' }
|
|
170
|
+
|
|
171
|
+
@app_builder.use_when not_hal_browser,
|
|
172
|
+
Rack::Protection::ContentSecurityPolicy, configuration.content_security_policy
|
|
173
|
+
@app_builder.use_when is_hal_browser,
|
|
174
|
+
Rack::Protection::ContentSecurityPolicy,
|
|
175
|
+
configuration.content_security_policy.merge(configuration.hal_browser_content_security_policy_overrides)
|
|
158
176
|
end
|
|
159
177
|
@app_builder.use Rack::PactBroker::InvalidUriProtection
|
|
160
178
|
@app_builder.use Rack::PactBroker::ResetThreadData
|
|
@@ -232,7 +250,9 @@ module PactBroker
|
|
|
232
250
|
end
|
|
233
251
|
|
|
234
252
|
def print_startup_message
|
|
235
|
-
|
|
253
|
+
if ENV['PACT_BROKER_HIDE_PACTFLOW_MESSAGES'] != 'true'
|
|
254
|
+
logger.info "\n\n#{'*' * 80}\n\nWant someone to manage your Pact Broker for you? Check out https://pactflow.io/oss for a hardened, fully supported SaaS version of the Pact Broker with an improved UI + more.\n\n#{'*' * 80}\n"
|
|
255
|
+
end
|
|
236
256
|
end
|
|
237
257
|
end
|
|
238
258
|
end
|
|
@@ -43,6 +43,7 @@ module PactBroker
|
|
|
43
43
|
attr_accessor :semver_formats
|
|
44
44
|
attr_accessor :enable_public_badge_access, :shields_io_base_url, :badge_provider_mode
|
|
45
45
|
attr_accessor :disable_ssl_verification
|
|
46
|
+
attr_accessor :content_security_policy, :hal_browser_content_security_policy_overrides
|
|
46
47
|
attr_accessor :base_equality_only_on_content_that_affects_verification_results
|
|
47
48
|
attr_reader :api_error_reporters
|
|
48
49
|
attr_reader :custom_logger
|
|
@@ -90,6 +91,20 @@ module PactBroker
|
|
|
90
91
|
config.webhook_http_method_whitelist = ['POST']
|
|
91
92
|
config.webhook_scheme_whitelist = ['https']
|
|
92
93
|
config.webhook_host_whitelist = []
|
|
94
|
+
# TODO get rid of unsafe-inline
|
|
95
|
+
config.content_security_policy = {
|
|
96
|
+
script_src: "'self' 'unsafe-inline'",
|
|
97
|
+
style_src: "'self' 'unsafe-inline'",
|
|
98
|
+
img_src: "'self' data:",
|
|
99
|
+
font_src: "'self' data:",
|
|
100
|
+
base_uri: "'self'",
|
|
101
|
+
frame_src: "'self'",
|
|
102
|
+
frame_ancestors: "'self'"
|
|
103
|
+
}
|
|
104
|
+
config.hal_browser_content_security_policy_overrides = {
|
|
105
|
+
script_src: "'self' 'unsafe-inline' 'unsafe-eval'",
|
|
106
|
+
frame_ancestors: "'self'"
|
|
107
|
+
}
|
|
93
108
|
config
|
|
94
109
|
end
|
|
95
110
|
|
data/lib/pact_broker/db.rb
CHANGED
|
@@ -2,12 +2,12 @@ require 'sequel'
|
|
|
2
2
|
require 'pact_broker/db/validate_encoding'
|
|
3
3
|
require 'pact_broker/db/migrate'
|
|
4
4
|
require 'pact_broker/db/migrate_data'
|
|
5
|
+
require 'pact_broker/db/version'
|
|
5
6
|
|
|
6
7
|
Sequel.datetime_class = DateTime
|
|
7
8
|
|
|
8
9
|
module PactBroker
|
|
9
10
|
module DB
|
|
10
|
-
|
|
11
11
|
MIGRATIONS_DIR = File.expand_path("../../../db/migrations", __FILE__)
|
|
12
12
|
|
|
13
13
|
def self.connection= connection
|
|
@@ -27,6 +27,14 @@ module PactBroker
|
|
|
27
27
|
PactBroker::DB::MigrateData.(database_connection)
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
+
def self.is_current? database_connection, options = {}
|
|
31
|
+
Sequel::TimestampMigrator.is_current?(database_connection, PactBroker::DB::MIGRATIONS_DIR, options)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def self.version database_connection
|
|
35
|
+
PactBroker::DB::Version.call(database_connection)
|
|
36
|
+
end
|
|
37
|
+
|
|
30
38
|
def self.validate_connection_config
|
|
31
39
|
PactBroker::DB::ValidateEncoding.(connection)
|
|
32
40
|
end
|
|
@@ -33,7 +33,7 @@ module PactBroker
|
|
|
33
33
|
get ":rel_name" do
|
|
34
34
|
rel_name = params[:rel_name]
|
|
35
35
|
context = params[:context]
|
|
36
|
-
view_params = {:layout_engine => :haml, layout: :'layouts/main'}
|
|
36
|
+
view_params = {:layout_engine => :haml, layout: :'layouts/main', locals: { base_url: base_url }}
|
|
37
37
|
if resource_exists? rel_name, context
|
|
38
38
|
markdown view_name_for(rel_name, context).to_sym, view_params, {}
|
|
39
39
|
elsif resource_exists? rel_name
|
|
@@ -42,6 +42,16 @@ module PactBroker
|
|
|
42
42
|
markdown :not_found, view_params, {}
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
def base_url
|
|
49
|
+
# Using the X-Forwarded headers in the UI can leave the app vulnerable
|
|
50
|
+
# https://www.acunetix.com/blog/articles/automated-detection-of-host-header-attacks/
|
|
51
|
+
# Either use the explicitly configured base url or an empty string,
|
|
52
|
+
# rather than request.base_url, which uses the X-Forwarded headers.
|
|
53
|
+
PactBroker.configuration.base_url || ''
|
|
54
|
+
end
|
|
45
55
|
end
|
|
46
56
|
end
|
|
47
57
|
end
|
|
@@ -2,6 +2,7 @@ require 'json'
|
|
|
2
2
|
require 'sequel'
|
|
3
3
|
require 'pact_broker/repositories/helpers'
|
|
4
4
|
require 'pact_broker/tags/tag_with_latest_flag'
|
|
5
|
+
require 'pact_broker/pacts/content'
|
|
5
6
|
|
|
6
7
|
|
|
7
8
|
module PactBroker
|
|
@@ -83,6 +84,18 @@ module PactBroker
|
|
|
83
84
|
def latest_pact_publication
|
|
84
85
|
pact_version.latest_pact_publication
|
|
85
86
|
end
|
|
87
|
+
|
|
88
|
+
def interactions_missing_test_results
|
|
89
|
+
@interactions_missing_test_results ||= pact_content_with_test_results.interactions_missing_test_results
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def all_interactions_missing_test_results?
|
|
93
|
+
pact_content_with_test_results.interactions.count == pact_content_with_test_results.interactions_missing_test_results.count
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def pact_content_with_test_results
|
|
97
|
+
@pact_content_with_test_results = PactBroker::Pacts::Content.from_json(pact_version.content).with_test_results(test_results)
|
|
98
|
+
end
|
|
86
99
|
end
|
|
87
100
|
|
|
88
101
|
Verification.plugin :timestamps
|