From f980350997efa8f22f6e66391b899d3c51062c33 Mon Sep 17 00:00:00 2001 From: Jason Vanderhoof Date: Fri, 14 Jul 2023 15:04:45 -0600 Subject: [PATCH 1/2] Initial implementation of Policy Factories This commit includes the functional code and tests for the Policy Factory feature. --- CHANGELOG.md | 7 + Gemfile | 2 +- Gemfile.lock | 23 +- .../policy_factories_controller.rb | 69 +++ .../repository/policy_factory_repository.rb | 131 +++++ app/domain/factories/Readme.md | 555 ++++++++++++++++++ .../factories/create_from_policy_factory.rb | 200 +++++++ app/domain/factories/images/Basic-Sample.png | Bin 0 -> 27463 bytes app/domain/factories/images/Readme-5.png | Bin 0 -> 73308 bytes .../images/factory-create-request.png | Bin 0 -> 108786 bytes .../factories/images/factory-info-request.png | Bin 0 -> 37919 bytes .../factories/images/factory-list-request.png | Bin 0 -> 35335 bytes app/domain/factories/images/factory-setup.png | Bin 0 -> 30473 bytes .../factories/images/factory-upgrade.png | Bin 0 -> 22225 bytes app/domain/factories/renderer.rb | 23 + app/domain/responses.rb | 54 ++ app/presenters/policy_factories/error.rb | 28 + app/presenters/policy_factories/index.rb | 35 ++ app/presenters/policy_factories/show.rb | 20 + config/routes.rb | 5 + lib/tasks/policy_factory.rake | 70 +++ .../policy_factory_repository_spec.rb | 421 +++++++++++++ .../create_from_policy_factory_spec.rb | 397 +++++++++++++ spec/app/domain/factories/renderer_spec.rb | 98 ++++ spec/app/domain/responses_spec.rb | 142 +++++ .../presenters/policy_factories/error_spec.rb | 40 ++ .../presenters/policy_factories/index_spec.rb | 47 ++ .../presenters/policy_factories/show_spec.rb | 60 ++ .../policy_factories_controller_spec.rb | 201 +++++++ 29 files changed, 2621 insertions(+), 7 deletions(-) create mode 100644 app/controllers/policy_factories_controller.rb create mode 100644 app/db/repository/policy_factory_repository.rb create mode 100644 app/domain/factories/Readme.md create mode 100644 app/domain/factories/create_from_policy_factory.rb create mode 100644 app/domain/factories/images/Basic-Sample.png create mode 100644 app/domain/factories/images/Readme-5.png create mode 100644 app/domain/factories/images/factory-create-request.png create mode 100644 app/domain/factories/images/factory-info-request.png create mode 100644 app/domain/factories/images/factory-list-request.png create mode 100644 app/domain/factories/images/factory-setup.png create mode 100644 app/domain/factories/images/factory-upgrade.png create mode 100644 app/domain/factories/renderer.rb create mode 100644 app/domain/responses.rb create mode 100644 app/presenters/policy_factories/error.rb create mode 100644 app/presenters/policy_factories/index.rb create mode 100644 app/presenters/policy_factories/show.rb create mode 100644 lib/tasks/policy_factory.rake create mode 100644 spec/app/db/repository/policy_factory_repository_spec.rb create mode 100644 spec/app/domain/factories/create_from_policy_factory_spec.rb create mode 100644 spec/app/domain/factories/renderer_spec.rb create mode 100644 spec/app/domain/responses_spec.rb create mode 100644 spec/app/presenters/policy_factories/error_spec.rb create mode 100644 spec/app/presenters/policy_factories/index_spec.rb create mode 100644 spec/app/presenters/policy_factories/show_spec.rb create mode 100644 spec/controllers/policy_factories_controller_spec.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index 33f3642523..ea39caa348 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Added - Telemetry support [cyberark/conjur#2854](https://github.com/cyberark/conjur/pull/2854) +- Introduces support for Policy Factory, which enables resource creation + through a new `factories` API. + [cyberark/conjur#2855](https://github.com/cyberark/conjur/pull/2855/files) + +## [1.19.6] - 2023-07-05 + +### Added - New flag to `conjurctl server` command called `--no-migrate` which allows for skipping the database migration step when starting the server. [cyberark/conjur#2895](https://github.com/cyberark/conjur/pull/2895) diff --git a/Gemfile b/Gemfile index c736397b45..13ded1732c 100644 --- a/Gemfile +++ b/Gemfile @@ -76,7 +76,7 @@ gem 'openid_connect' gem "anyway_config" gem 'i18n', '~> 1.8.11' - +gem 'json_schemer' gem 'prometheus-client' group :development, :test do diff --git a/Gemfile.lock b/Gemfile.lock index b63a5c5945..ab912fa324 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -75,8 +75,8 @@ GEM minitest (>= 5.1) tzinfo (~> 2.0) zeitwerk (~> 2.3) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) + addressable (2.8.1) + public_suffix (>= 2.0.2, < 6.0) aes_key_wrap (1.1.0) anyway_config (2.2.3) ruby-next-core (>= 0.14.0) @@ -116,7 +116,7 @@ GEM coderay (1.1.3) command_class (0.0.2) concurrent-ruby (1.2.2) - conjur-api (5.3.8.pre.194) + conjur-api (5.4.0) activesupport (>= 4.2) addressable (~> 2.0) rest-client @@ -207,6 +207,8 @@ GEM dry-core (~> 0.5, >= 0.5) dry-inflector (~> 0.1, >= 0.1.2) dry-logic (~> 1.0, >= 1.0.2) + ecma-re-validator (0.4.0) + regexp_parser (~> 2.2) erubi (1.12.0) event_emitter (0.2.6) eventmachine (1.2.7) @@ -222,6 +224,7 @@ GEM globalid (1.1.0) activesupport (>= 5.0) haikunator (1.1.1) + hana (1.3.7) hashdiff (1.0.1) highline (2.0.3) http (4.2.0) @@ -230,7 +233,7 @@ GEM http-form_data (~> 2.0) http-parser (~> 1.2.0) http-accept (1.7.0) - http-cookie (1.0.4) + http-cookie (1.0.5) domain_name (~> 0.5) http-form_data (2.3.0) http-parser (1.2.3) @@ -249,6 +252,11 @@ GEM activesupport (>= 4.2) aes_key_wrap bindata + json_schemer (0.2.24) + ecma-re-validator (~> 0.3) + hana (~> 1.3) + regexp_parser (~> 2.0) + uri_template (~> 0.7) json_spec (1.1.5) multi_json (~> 1.0) rspec (>= 2.0, < 4.0) @@ -324,7 +332,7 @@ GEM pry (~> 0.13.0) pry-rails (0.3.9) pry (>= 0.10.4) - public_suffix (4.0.6) + public_suffix (5.0.1) puma (5.6.4) nio4r (~> 2.0) racc (1.7.1) @@ -387,6 +395,7 @@ GEM kwalify (~> 0.7.0) parser (~> 3.0.0) rainbow (>= 2.0, < 4.0) + regexp_parser (2.7.0) rest-client (2.1.0) http-accept (>= 1.7.0, < 2.0) http-cookie (>= 1.0.2, < 2.0) @@ -471,8 +480,9 @@ GEM concurrent-ruby (~> 1.0) unf (0.1.4) unf_ext - unf_ext (0.0.8.1) + unf_ext (0.0.8.2) unicode-display_width (1.8.0) + uri_template (0.7.0) validate_email (0.1.6) activemodel (>= 3.0) mail (>= 2.2.5) @@ -531,6 +541,7 @@ DEPENDENCIES i18n (~> 1.8.11) iso8601 jbuilder (~> 2.7.0) + json_schemer json_spec (~> 1.1) jwt (= 2.2.2) kubeclient diff --git a/app/controllers/policy_factories_controller.rb b/app/controllers/policy_factories_controller.rb new file mode 100644 index 0000000000..0e73566d4d --- /dev/null +++ b/app/controllers/policy_factories_controller.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +require './app/domain/responses' + +class PolicyFactoriesController < RestController + include AuthorizeResource + + before_action :current_user + + def create + response = DB::Repository::PolicyFactoryRepository.new.find( + role: current_user, + **relevant_params(%i[account kind version id]) + ).bind do |factory| + Factories::CreateFromPolicyFactory.new.call( + account: params[:account], + factory_template: factory, + request_body: request.body.read, + authorization: request.headers["Authorization"] + ) + end + + render_response(response) do + render(json: response.result) + end + end + + def show + allowed_params = %i[account kind version id] + response = DB::Repository::PolicyFactoryRepository.new.find( + role: current_user, + **relevant_params(allowed_params) + ) + + render_response(response) do + presenter = Presenter::PolicyFactories::Show.new(factory: response.result) + render(json: presenter.present) + end + end + + def index + response = DB::Repository::PolicyFactoryRepository.new.find_all( + role: current_user, + account: params[:account] + ) + render_response(response) do + presenter = Presenter::PolicyFactories::Index.new(factories: response.result) + render(json: presenter.present) + end + end + + private + + def render_response(response, &block) + if response.success? + block.call + else + presenter = Presenter::PolicyFactories::Error.new(response: response) + render( + json: presenter.present, + status: response.status + ) + end + end + + def relevant_params(allowed_params) + params.permit(*allowed_params).slice(*allowed_params).to_h.symbolize_keys + end +end diff --git a/app/db/repository/policy_factory_repository.rb b/app/db/repository/policy_factory_repository.rb new file mode 100644 index 0000000000..61bb003a22 --- /dev/null +++ b/app/db/repository/policy_factory_repository.rb @@ -0,0 +1,131 @@ +require 'base64' +require 'json' + +require './app/domain/responses' + +module DB + module Repository + module DataObjects + PolicyFactory = Struct.new( + :name, + :classification, + :version, + :policy, + :policy_branch, + :schema, + :description, + keyword_init: true + ) + end + + class PolicyFactoryRepository + def initialize( + data_object: DataObjects::PolicyFactory, + resource: ::Resource, + logger: Rails.logger + ) + @resource = resource + @data_object = data_object + @logger = logger + @success = ::SuccessResponse + @failure = ::FailureResponse + end + + def find_all(account:, role:) + factories = @resource.visible_to(role).where( + Sequel.like( + :resource_id, + "#{account}:variable:conjur/factories/%" + ) + ).all + .select { |factory| role.allowed_to?(:execute, factory) } + .group_by do |item| + # form is: 'conjur/factories/core/v1/groups' + _, _, classification, _, factory = item.resource_id.split('/') + [classification, factory].join('/') + end + .map do |_, versions| + versions.max { |a, b| factory_version(a.id) <=> factory_version(b.id) } + end + .map do |factory| + response = secret_to_data_object(factory) + response.result if response.success? + end + .compact + + if factories.empty? + return @failure.new( + 'Role does not have permission to use Factories', + status: :forbidden + ) + end + + @success.new(factories) + end + + def find(kind:, id:, account:, role:, version: nil) + factory = if version.present? + @resource["#{account}:variable:conjur/factories/#{kind}/#{version}/#{id}"] + else + @resource.where( + Sequel.like( + :resource_id, + "#{account}:variable:conjur/factories/#{kind}/%" + ) + ).all + .select { |i| i.resource_id.split('/').last == id } + .max { |a, b| factory_version(a.id) <=> factory_version(b.id) } + end + + resource_id = "#{kind}/#{version || 'v1'}/#{id}" + + if factory.blank? + @failure.new( + { resource: resource_id, message: 'Requested Policy Factory does not exist' }, + status: :not_found + ) + elsif !role.allowed_to?(:execute, factory) + @failure.new( + { resource: resource_id, message: 'Requested Policy Factory is not available' }, + status: :forbidden + ) + else + secret_to_data_object(factory) + end + end + + private + + def factory_version(factory_id) + version_match = factory_id.match(%r{/v(\d+)/[\w-]+}) + return 0 if version_match.nil? + + version_match[1].to_i + end + + def secret_to_data_object(variable) + _, _, classification, version, id = variable.resource_id.split('/') + factory = variable.secret&.value + if factory + decoded_factory = JSON.parse(Base64.decode64(factory)) + @success.new( + @data_object.new( + policy: Base64.decode64(decoded_factory['policy']), + policy_branch: decoded_factory['policy_branch'], + schema: decoded_factory['schema'], + version: version, + name: id, + classification: classification, + description: decoded_factory['schema']&.dig('description').to_s + ) + ) + else + @failure.new( + { resource: "#{classification}/#{version}/#{id}", message: 'Requested Policy Factory is not available' }, + status: :bad_request + ) + end + end + end + end +end diff --git a/app/domain/factories/Readme.md b/app/domain/factories/Readme.md new file mode 100644 index 0000000000..a5a95b519c --- /dev/null +++ b/app/domain/factories/Readme.md @@ -0,0 +1,555 @@ +# Policy Factory + +## Setup + +Setup will follow the following workflow: + +![Factory Setup](./images/factory-setup.png) + +```plantuml +@startuml factory-setup +start +:Step into running container; +if ("Conjur Enterprise?") then (yes) + :Run `evoke install factories --account `; +else (no) + :Run `conjurctl install factories --account `; +endif +partition "Installation (run as `admin`)" { + :Apply Factory base policy; + :Load each Factory into its\ncorresponding versioned variable; +} +:Verify factories are available via `/factories/`; +@enduml +``` + +## Factory Upgrade + +Upgrades will follow the following workflow: + +![Factory Upgrade](./images/factory-upgrade.png) + +```plantuml +@startuml factory-upgrade +start +:Step into running container; +if ("Conjur Enterprise?") then (yes) + :Run `evoke install factories --account `; +else (no) + :Run `conjurctl install factories --account `; +endif +partition "Installation (run as `admin`)" { + :Apply Factory base policy with new factory versions; + :Load each Factory into its\ncorresponding versioned variable; +} +:Verify factories are available via `/factories/`; +@enduml +``` + +## View all Policy Factories + +A role is limited to viewing the Factories they have permission (`execute`) to see. +If a role can see a factory, they will be able to see errors in mis-configured Factories. + +![Factory List Request](./images/factory-list-request.png) + +```plantuml +@startuml factory-list-request +start +:Identify target Factory based on request params; +:Gather factories the role is able to view; +partition "For each Factory Version" { + repeat + if ("Factory is present?") then (yes) + if ("Is Factory format is valid?") then (yes) + if ("Is Factory Schema is valid?") then (yes) + :Display Factory details and Schema; + else + #pink:[Error] Invalid Factory Schema; + endif + else + #pink:[Error] Invalid Factory Format; + endif + else + #pink:[Error] Factory not Defined; + endif + backward: Next Factory; + repeat while (More Factories?) +} +:Return JSON Summary; +@enduml +``` + +## Policy Factory Info Requests + +![Factory Info Request](./images/factory-info-request.png) + +```plantuml +@startuml factory-info-request +(*) --> "Identify target Factory based on request params" +if "Does Factory exist?" then + --> [yes] if "Role has permission to view factory" then + --> [yes] if "Factory is present?" then + --> "Load Factory" + --> [yes] if "Factory format is valid?" then + --> [yes] if "Factory Schema is valid?" then + --> "Return Schema" + else + --> [no] "[Error] Invalid Factory Schema" + endif + else + --> [no] "[Error] Invalid Factory Format" + endif + else + --> [no] "[Error] Factory not Defined" + endif + else + --> [no] "[Error] Factory not Available" + endif +else + --> [no] "[Error] Factory not Found" +endif +@enduml + +``` + +## Policy Factory Creation Requests + +![Factory Create Request](./images/factory-create-request.png) + +```plantuml +@startuml factory-create-request +(*) --> "Identify Factory variable based on request params" +if "Does factory variable exist?" then + --> [yes] if "Can role load factory?" then + --> [yes] "Load Factory" + --> [yes] if "Does factory variable have a value?" then + --> [yes] if "Factory format is valid?" then + --> [yes] if "Factory Schema is valid?" then + --> "Extract Schema from Factory Variable" + --> "Parse [POST] JSON Request body" + --> if "is JSON valid?" + --> [yes] if "Required keys present?" + --> [yes] if "Required values present?" + --> [yes] if "Policy rendered successfully?" + --> [yes] if "Policy namespace path rendered successfully?" + --> [yes] if "Policy successfully applied" + --> [yes] if "Factory has variables?" + --> [yes] if "Variables set successfully set?" + --> "Return Policy and Variable response" + ' note left + ' Response Code: 200 + ' Response: {"response": { + ' "code": 200, + ' "created_resources": [ + ' "::", + ' {":host:": {"api_key": ""}}, + ' ":variable:" + ' ] + ' }} + ' end note + --> (*) + else + --> [no] "[Error] Setting Variable(s) not Permitted" + ' note right + ' Response Code: 401 + ' Response {"error": { + ' "code": 401, + ' "error": "Role is not permitted to set the following secrets in this factory: 'secret-1', 'secret-2'", + ' "fields": [ + ' "secret-1", + ' "secret-2" + ' ] + ' }} + ' Log Level: Error + ' Log Message: Role '' is not permitted to create the following factory variables the '': 'secret-1', 'secret-2' + ' end note + endif + else + --> [no] " Policy Created Response" + ' note left + ' Response Code: 200 + ' Response: {"response": { + ' "code": 200, + ' "created_resources": [ + ' "::", + ' {":host:": {"api_key": ""}} + ' ] + ' }} + ' end note + endif + else + --> [no] "[Error] Policy Creation not Permitted" + ' note left + ' Response Code: 401 + ' Response {"error": { + ' "code": 401, + ' "error": "Role is not permitted to create a factory in this policy" + ' }} + ' Log Level: Error + ' Log Message: Role '' is not permitted to create a factory in the '' + ' end note + endif + else + --> [no] "[Error] Invalid Factory Namespace ERB" + ' note left + ' Response Code: 400 + ' Response: {"error": { + ' "code": 400, + ' "error": "Policy Factory Namespace Template contains invalid ERB" + ' }} + ' Log Level: Error + ' Log Message Policy Factory 'conjur/factories/core/' Namespace Template contains invalid ERB + ' end note + endif + else + --> [no] "[Error] Invalid Factory Policy ERB" + ' note left + ' Response Code: 400 + ' Response: {"error": { + ' "code": 400, + ' "error": "Policy Factory Policy Template contains invalid ERB" + ' }} + ' Log Level: Error + ' Log Message Policy Factory 'conjur/factories/core/' Policy Template contains invalid ERB + ' end note + endif + else + --> [no] "[Error] Missing Required Values" + ' note left + ' Response Code: 400 + ' Response: {"error": { + ' "code": 400, + ' "message": "The following fields are missing values: 'field-1', 'field-2'", + ' "fields": [ + ' {"field-1": { "error": "cannot be empty" }}, + ' {"field-2": { "error": "cannot be empty" }} + ' ]}} + ' Log Level: Error + ' Log Message: The following fields are missing values in the request JSON body: 'field-1', 'field-2' + ' end note + endif + else + --> [no] "[Error] Missing Required Keys" + ' note left + ' Response Code: 400 + ' Response: {"error": { + ' "code": 400, + ' "message": "The following fields are missing: 'field-1', 'field-2'", + ' "fields": [ + ' {"field-1": { "error": "must be present" }}, + ' {"field-2": { "error": "must be present" }} + ' ] + ' }} + ' Log Level: Error + ' Log Message: The following fields are missing from the request JSON body: 'field-1', 'field-2' + ' end note + endif + else + --> [no] "[Error] Bad Request Body" + ' note left + ' Response Code: 400 + ' Response: {"error": { + ' "code": 400, + ' "message": "Request JSON contains invalid syntax" + ' }} + ' Log Level: Error + ' Log Message: Request JSON contains invalid syntax + ' end note + endif + else + --> [no] "[Error] Invalid Factory Schema" + endif + else + --> [no] "[Error] Invalid Factory Format" + endif + else + --> [no] "[Error] Factory not Defined" + ' note left + ' Response Code: 400 + ' Response: {"error": { + ' "code": 400, + ' "resource": "conjur/factories/core/", + ' "message": "Requested Policy Factory is empty" + ' }} + ' Log Level: Error + ' Log Message: Policy Factory Variable "conjur/factories/core/" is empty + ' end note + endif + else + --> [no] "[Error] Factory not Available" + ' note left + ' Response Code: 403 + ' Response: {"error": { + ' "code": 403, + ' "resource": "core/", + ' "message": "Factory is not available" + ' }} + ' Log Level: Error + ' Log Message: Policy Factory "core/" is not available + ' end note + endif +else + --> [no] "[Error] Factory not Found" + ' note left + ' Response Code: 404 + ' Response: {"error": { + ' "code": 404, + ' "resource": "conjur/factories/core/", + ' "message": "Requested Policy Factory does not exist" + ' }} + ' Log Level: Error + ' Log Message: Policy Factory Variable "conjur/factories/core/" does not exist + ' end note +endif +@enduml +``` + +## Policy Factory Creation Requests (beta) + +![Policy Factory Create Request](./images/Readme-5.png) + +```plantuml +@startuml +start +:Identify Factory\nvariable based\non request params; +if (Does factory variable exist?) then (yes) + if (Can role load factory variable?) then (yes) + if (Does factory variable have a value?) then (yes) + :Load Factory; + :Extract Schema from Factory Variable; + :Parse [POST] JSON Request body; + ' :Extract Schema from Factory; + if (Parse JSON body?) then (yes) + if (Required keys missing?) then (no) + #pink: Missing Keys; + ' note right + ' Response Code: 400 + ' Response: {"error": { + ' "code": 400, + ' "message": "The following fields are missing: 'field-1', 'field-2'", + ' "fields": [ + ' {"field-1": { "error": "must be present" }}, + ' {"field-2": { "error": "must be present" }} + ' ] + ' }} + ' Log Level: Error + ' Log Message: The following fields are missing from the request JSON body: 'field-1', 'field-2' + ' end note + kill + else (yes) + if (required values empty?) then (no) + #pink: Missing Values; + ' note right + ' Response Code: 400 + ' Response: {"error": { + ' "code": 400, + ' "message": "The following fields are missing values: 'field-1', 'field-2'", + ' "fields": [ + ' {"field-1": { "error": "cannot be empty" }}, + ' {"field-2": { "error": "cannot be empty" }} + ' ]}} + ' Log Level: Error + ' Log Message: The following fields are missing values in the request JSON body: 'field-1', 'field-2' + ' end note + kill + else (yes) + if (Policy rendered?) then (yes) + if (Policy namespace path rendered?) then (yes) + if (Policy successfully applied) then (yes) + if (Factory has variables?) then (yes) + if (Variable successfully set?) then (yes) + #lightgreen: Return policy response; + ' note right + ' Response Code: 200 + ' Response: {"response": { + ' "code": 200, + ' "created_resources": [ + ' "::", + ' {":host:": {"api_key": ""}}, + ' ":variable:" + ' ] + ' }} + ' end note + end + else (no) + #pink: Setting Variable(s) not Permitted; + ' note right + ' Response Code: 401 + ' Response {"error": { + ' "code": 401, + ' "error": "Role is not permitted to set the following secrets in this factory: 'secret-1', 'secret-2'", + ' "fields": [ + ' "secret-1", + ' "secret-2" + ' ] + ' }} + ' Log Level: Error + ' Log Message: Role '' is not permitted to create the following factory variables the '': 'secret-1', 'secret-2' + ' end note + kill + endif + else (no) + #lightgreen: Return policy response; + ' note right + ' Response Code: 200 + ' Response: {"response": { + ' "code": 200, + ' "created_resources": [ + ' "::", + ' {":host:": {"api_key": ""}} + ' ] + ' }} + ' end note + kill + endif + else (no) + #pink: Policy Creation not Permitted; + ' note right + ' Response Code: 401 + ' Response {"error": { + ' "code": 401, + ' "error": "Role is not permitted to create a factory in this policy" + ' }} + ' Log Level: Error + ' Log Message: Role '' is not permitted to create a factory in the '' + ' end note + kill + endif + else (no) + #pink: Invalid Policy Namespace ERB; + ' note right + ' Response Code: 400 + ' Response: {"error": { + ' "code": 400, + ' "error": "Policy Factory Namespace Template contains invalid ERB" + ' }} + ' Log Level: Error + ' Log Message Policy Factory 'conjur/factories/core/' Namespace Template contains invalid ERB + ' end note + kill + endif + else (no) + #pink: Invalid Policy ERB; + ' note right + ' Response Code: 400 + ' Response: {"error": { + ' "code": 400, + ' "error": "Policy Factory Policy Template contains invalid ERB" + ' }} + ' Log Level: Error + ' Log Message Policy Factory 'conjur/factories/core/' Policy Template contains invalid ERB + ' end note + kill + endif + endif + endif + else (no) + #pink: Malformed JSON; + ' note right + ' Response Code: 400 + ' Response: {"error": { + ' "code": 400, + ' "message": "Request JSON contains invalid syntax" + ' }} + ' Log Level: Error + ' Log Message: Request JSON contains invalid syntax + ' end note + kill + endif + else (no) + #pink: Factory Variable empty; + ' note right + ' Response Code: 400 + ' Response: {"error": { + ' "code": 400, + ' "resource": "conjur/factories/core/", + ' "message": "Requested Policy Factory is empty" + ' }} + ' Log Level: Error + ' Log Message: Policy Factory Variable "conjur/factories/core/" is empty + ' end note + kill + endif + else (no) + #pink: Factory not available; + ' note right + ' Response Code: 403 + ' Response: {"error": { + ' "code": 403, + ' "resource": "core/", + ' "message": "Factory is not available" + ' }} + ' Log Level: Error + ' Log Message: Policy Factory "core/" is not available + ' end note + kill + endif +else (no) + #pink: Factory Variable not present; + ' note right + ' Response Code: 404 + ' Response: {"error": { + ' "code": 404, + ' "resource": "conjur/factories/core/", + ' "message": "Requested Policy Factory does not exist" + ' }} + ' Log Level: Error + ' Log Message: Policy Factory Variable "conjur/factories/core/" does not exist + ' end note + kill +endif +@enduml +``` + +### UI Workflow + +![UI Factory Setup](./images/factory-setup.png) + +```plantuml +@startuml factory-setup +start +:Login; +:Navigate to "Policy Factories" page; +if (Can view Factories) then (yes) + :Show Factory Groupings; + :Navigate to Factory Grouping; + :Select a Factory; + if ("Can view Factory") then (yes) + :View Factory form; + if ("Factory successfully created") then (yes) + :Redirect + else + end + else + end +else (no) + :Show empty Factories page\nwith "No Factories Available"; +end +@enduml +``` + +## Code Architecture + +![Basic Overview](./images/Basic-Sample.png) + +```plantuml +@startuml Basic Sample +!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml + +Component(controller, "PolicyFactoryController", "Rails", "Routes requests to Business Logic and renders results") + +Component(repository, "PolicyFactoryRepository", "Ruby", "Retrieves Factories from Conjur Variables") + +Component(data_object, "DataObjects::PolicyFactory", "Ruby") + +Component(create, "CreateFromPolicyFactory", "Ruby", "Generates Conjur elements using a Policy Factory") + +Rel(repository, controller, "loads factory from") + +' Component(repository 'PolicyFactoryRepository') + +' component PolicyFactoryController +' component PolicyFactoryRepository +@enduml +``` diff --git a/app/domain/factories/create_from_policy_factory.rb b/app/domain/factories/create_from_policy_factory.rb new file mode 100644 index 0000000000..92ded89bde --- /dev/null +++ b/app/domain/factories/create_from_policy_factory.rb @@ -0,0 +1,200 @@ +# frozen_string_literal: true + +require 'rest_client' +require 'json_schemer' +require 'factories/renderer' + +module Factories + class Utilities + def self.filter_input(str) + str.gsub(/[^0-9a-z\-_]/i, '') + end + end + class CreateFromPolicyFactory + def initialize(renderer: Factories::Renderer.new, http: RestClient, schema_validator: JSONSchemer, utilities: Factories::Utilities) + @renderer = renderer + @http = http + @schema_validator = schema_validator + @utilities = utilities + + # JSON and URI are defined here for visibility. They are not currently + # mocked in testing, thus, we're not setting them in the initializer. + @json = JSON + @uri = URI + + # Defined here for visibility. We shouldn't need to mock these. + @success = ::SuccessResponse + @failure = ::FailureResponse + end + + def call(factory_template:, request_body:, account:, authorization:) + validate_and_transform_request( + schema: factory_template.schema, + params: request_body + ).bind do |body_variables| + # Convert `dashed` keys to `underscored`. This only occurs for top-level parameters. + # Conjur variables should be use dashes rather than underscores. + # Filter non-alpha-numeric, dash or underscore characters from inputs values (to prevent injection attacks). + template_variables = body_variables + .transform_keys { |key| key.to_s.underscore } + .each_with_object({}) do |(key, value), rtn| + # Only strip values that are rendered in the policy (not Conjur secret values) + rtn[key] = if key == 'variables' + value + elsif value.is_a?(Hash) + value.transform_values { |internal_value| @utilities.filter_input(internal_value.to_s) } + else + @utilities.filter_input(value.to_s) + end + end + + # Add empty `annotations` hash unless they've previously been set + template_variables["annotations"] = {} unless template_variables.include?('annotations') + + # Push rendered policy to the desired policy branch + @renderer.render(template: factory_template.policy_branch, variables: template_variables) + .bind do |policy_load_path| + valid_variables = factory_template.schema['properties'].keys - ['variables'] + render_and_apply_policy( + policy_load_path: policy_load_path, + policy_template: factory_template.policy, + variables: template_variables.select { |k, _| valid_variables.include?(k) }, + account: account, + authorization: authorization + ).bind do |result| + return @success.new(result) unless factory_template.schema['properties'].key?('variables') + + # Set Policy Factory variables + @renderer.render(template: "#{factory_template.policy_branch}/<%= id %>", variables: template_variables) + .bind do |variable_path| + set_factory_variables( + schema_variables: factory_template.schema['properties']['variables']['properties'], + factory_variables: template_variables['variables'], + variable_path: variable_path, + authorization: authorization, + account: account + ) + end + .bind do + # If variables were added successfully, return the result so that + # we send the policy load response back to the client. + @success.new(result) + end + end + end + end + end + + private + + def validate_and_transform_request(schema:, params:) + return @failure.new('Request body must be JSON', status: :bad_request) if params.blank? + + begin + params = @json.parse(params) + rescue + return @failure.new('Request body must be valid JSON', status: :bad_request) + end + + # Strip keys without values + params = params.select{|_, v| v.present? } + validator = @schema_validator.schema(schema) + return @success.new(params) if validator.valid?(params) + + errors = validator.validate(params).map do |error| + case error['type'] + when 'required' + missing_attributes = error['details']['missing_keys'].map{|key| [ error['data_pointer'], key].reject(&:empty?).join('/') } #.join("', '") + missing_attributes.map do |attribute| + { + message: "A value is required for '#{attribute}'", + key: attribute + } + end + else + { + message: "Validation error: '#{error['data_pointer']}' must be a #{error['type']}" + } + end + end + @failure.new(errors.flatten, status: :bad_request) + end + + def render_and_apply_policy(policy_load_path:, policy_template:, variables:, account:, authorization:) + @renderer.render( + template: policy_template, + variables: variables + ).bind do |rendered_policy| + begin + response = @http.post( + "http://localhost:3000/policies/#{account}/policy/#{policy_load_path}", + rendered_policy, + 'Authorization' => authorization + ) + rescue RestClient::ExceptionWithResponse => e + case e.response.code + when 401 + return @failure.new( + { message: 'Authentication failed', + request_error: e.response.body }, status: :unauthorized + ) + when 403 + return @failure.new( + { message: "Applying generated policy to '#{policy_load_path}' is not allowed", + request_error: e.response.body }, status: :forbidden + ) + when 404 + return @failure.new( + { message: "Unable to apply generated policy to '#{policy_load_path}'", + request_error: e.response.body }, status: :not_found + ) + else + return @failure.new( + { message: "Failed to apply generated policy to '#{policy_load_path}'", + request_error: e.to_s }, status: :bad_request + ) + end + rescue => e + return @failure.new( + { message: "Failed to apply generated policy to '#{policy_load_path}'", + request_error: e.to_s }, status: :bad_request + ) + end + + @success.new(response.body) + end + end + + def set_factory_variables(schema_variables:, factory_variables:, variable_path:, authorization:, account:) + # Only set secrets defined in the policy + schema_variables.each_key do |factory_variable| + variable_id = @uri.encode_www_form_component("#{variable_path}/#{factory_variable}") + secret_path = "secrets/#{account}/variable/#{variable_id}" + + @http.post( + "http://localhost:3000/#{secret_path}", + factory_variables[factory_variable].to_s, + { 'Authorization' => authorization } + ) + rescue RestClient::ExceptionWithResponse => e + case e.response.code + when 401 + return @failure.new("Role is unauthorized to set variable: '#{secret_path}'", status: :unauthorized) + when 403 + return @failure.new("Role lacks the privilege to set variable: '#{secret_path}'", status: :forbidden) + else + return @failure.new( + "Failed to set variable: '#{secret_path}'. Status Code: '#{e.response.code}', Response: '#{e.response.body}'", + status: :bad_request + ) + end + rescue => e + return @failure.new( + { message: "Failed set variable '#{secret_path}'", + request_error: e.to_s }, status: :bad_request + ) + end + @success.new('Variables successfully set') + end + end +end diff --git a/app/domain/factories/images/Basic-Sample.png b/app/domain/factories/images/Basic-Sample.png new file mode 100644 index 0000000000000000000000000000000000000000..1f5159333206814511c37b85b0bee68db545e6e4 GIT binary patch literal 27463 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Ð%?zg2D;KXVe60ug4;#854HgossyII;}T?mSVq`mCpN98qMAq~VwaD2n~HS~85cKde@HrwSdg!VRbL97YoO-DnFi>#*-8|MdDH{Mfl{6~oU@8O^TdeIb!NO0l2I9_REmT^v2RqE@i! zsY5@G+&j<1!*mt#^Ill5Vn<7&WyE=6erOtSEp!k*`_;J^y$1Df2FxE7wcYd z$}tx4Vi72iF1UAJx#ZZW{j>!+^ZTG`nHy7c9ZD+*J}3m zPOZ(PqC>z{Mpp6i%*_Wr!IgEw#Zt5VY*K6cZ4 zrbQ*AnuAiiVl6)$8#NQ9e5jtinP*$-d1}qt%Hj6u38NR>Ph0@gc!#`radYUCbb+dSDXeOUD>)je4^U5LI z8l_&I$o}@KMwA0Wl3jbdB^aFqH9G;aD+?9x&OL>GO=HspP+F)OOYT5{x~i{&)z|<{ zx(c2lx(<5Uda>gVWxk^$u~eyX9;yG4lr{=l=uP^9MIdRH{p!-1ixl1 zT-{J2^R0wx6R9+xP!ks&6`>&UQD2hJpO<=nuyoFr2!!P>EY@`PnybZql<$dmm*FQ) zRE2n^P#}hQsFru{-qq9y0e%^pLMs~oDVTMu#K`0WD?mVmj6y3>g^Aq@7&1{j5P*wz zTPd)-5`CR?jJ7F=DaAr??Js%zcxpGw zD5%V;|5C;cqqBx?0-+Iv#TIJxwb*z=AD0_>fc{xohj1K{-_vQ0yh1mSK%ptvAx~=v zorvK*#fP3Q3cv+3cPrdy@%0)Mfm=Hg(*gUdTNCyiI4}+c?@1z|L$a^Z074}ZQcY>_ z!sElR)T_AexmE2h&`}ef)pdSGM-Vo4_6lAkhN#cpssq`h;(&SOLh;oT&f`5F03r`^ zJau23a|AB|&h8Na$LWy{?;HfSG+Y~ht8TcvI~z5;ge*kCO7SRZwI$O#f~NveF6w0` z8|2_Pzw^jVZrK|+QqU4`2yIj^2+LO;CS#ZB@n5h8hl5Z{yi%~UW+Y{@p*XQc%tjlz z5u2*aaQfGgxy!>}W&s<=*&#_s&Q2K{V+uH#s;yBFDrhJLd&Y)}_plPQho3e~`iZWY zdgVH(GoM~&>SPPDRa{z~i=fUMU;}zMU3PRNTsQ^yQFu^j@8sL^gd9f<7txzZdr&J? zo5%bnjOXo~ott~lN~)dLzBSlcx{Nxj$bkdp3KfZ=Z>y?Q#_Z7wuToj0{O|@k12(o< z6%r{}(c=XyW$KXOi2Er!kbLAnsE%^o5WWgK;Jmz`z`)HE3>fd@+YPFBJP^TRhM`GW zfo*3AN;$}pPoOd@z2(4{;4ah#lwQQU*GUxlDuJDVmcH;ckKIerC^41pin4= zS*AC}U)}G5Z282A6NAcHw>_|7-wt|!xv}kELn*38??qo0j{Y_Pjg7%lXh2ojCVURB zh4L$YB(NQjCiodg6ELV|Z|^WgGUL3?_<2iWt>en4Iz%<~&K>#$PjJ#QipKpk;oVk{ z?7!yr90t28ld!BPh~mt(b96+DtpSKR>9u0<2KhRd zfBgK}4j2q_a-Fb=#q$W6Q}pwmS#9!05Kf_M=zVgqQeE$9E;a?^z;TvXiG;)%w$7;? zi6^25hlViy7vXnF%p|3F(GOVQ1f8F{JkOx4kp4rnwzd|Hur_61=qR9MlrE);4ufup z&v|)yq3-*c)222~ox@qEE;^0bO-$B$J0#baFS$ zfGVS0dskmT1?wCQz4-GY6!6?Gn`f-nkbDvl2A|&)_Jc(7Kl$RdT4#wT;?82vc_(BA zpjbqqp({#ID6sUJ@7;il#4wTd{v?@LBOu#ekswKWb&uu3sF^wO_G=jb>-yjS@>;v{ z?t0R&4{cWDj)!;2oYRiFvFc^hw?j;J3l~$u`fY53h*)3BN1r3DNtYJU8gyeE*2=^@@|AhqwHuhcz9#D4z(A-{aMh8@N zg9!i9acWLQvQNS}(G^eFKK8D{^YvrH%C*Atb=4Uxgt8K+3n^F{&;kpm0N1WvJ^y^h z^-=u*q6yLLnaBg?e#9vBuBy1-!enRDla0@S;@A1R@Nfh2v7}o!)uJsV_qZ&q9ILe- zyuPDMUS22h#`Rk_{o-@}(VJnQwj+z{d2k|WezIOoOH=c*&YAhCA$zSXN5KDR`p!-} z?)cD8lCpo`p=fWZFCP7X|SPK)(16Ny+w#J??L=|4LNNKG*R6 zYvFXp6g3!n?&+D`p7Zg9s^@tYS;Tu?Wh$d0{~f@4%&^q_e~RFVnd4(=^TB(GId6B} z{(?s`sW<_v#uKd!Q4k35<^Qlv&OWt9JkeW-Sh?P)@^0!S2cai zTSGn*TDi|FNG9^Ahp)JkNN$zv9Gx1n)(5j<%?~2Xgb28^}xPs}( z914O9(tTZ{g@ZgZTVFbw^nd^Su0|3QowTX=ea6!L=Vy}696ii4IzCYuK;#-~_)8PE z%9%)78gZx>CL|!wC@li!MI;@Wk&%JOv$V9dKk)_HE0!Wh!HKdB_1}#({Xvf`#BJg= zXVI7!XS@sqL|@jYsj&+P2n?Z%`C@;35a75wjA8(t*OO-so&Je{3uTTbo18eZ>v#{~ zQr>8J&f=`)Z5}8*nBIi@$%f`i0&PxqcX2u2Szig zG~lQ;z60?5n6(<%W%Z8^uUOn1AM&m5OQ=K1gr~mXh1vPo(vSP7Bn3ac8Oy^rXIJ)a z4IKqrk~)~&Z&QL+yR1h1#dT|S(EVKj%|`C3DFgzHDw&ce0uf{)N*(R(?np!84xsNS zYCM22!4J@q>hU_|S!sp3%tcgsh)(qi@kd}}mV#6OniCcZI!&I31TYTHINFGMvkK}? zKjjYDN(gNl5Z|A%wMD5*PlIT{jwXL`m(`~#F0qwuwtk04;TklZCZeTD)P+yLk4ezd zZO+}T|MN}>i9D2(QUxp)VB|jjaP|41g%R+@N&LrW!fWWue6R9ahGhtyj=QcIyY#*E zqqI~g-??R|qi)K^8ZtR>L$h~tNM7^Jk;ISt@U3$iMOvKsYh0uNZDX`QFvn6fyqe#k zz~9yt} zbhFlxH9#5BhtvtRT||Ls1Iwd_;DkV@0s09ZJm`Wd$zbMMVHdcV$#ZHfqu(?;8(WBz zMuv9Ey}HA#tYvoe`jgHE^n45nrAa7BpPVK%1XWJdoM587gl^@^{z`H zzQ0in5~JUD=Rx+z=JwWBv6SxkTrK)UY2I`tITKFPCqa6)0CG|tM(*N zz~Jli!(0%qM66PG3y*$suCkTq{rGep*ZyE3Avz%J`KH-)5WYlKSDQL zt@LCO*^tlA&6P3D5q$9pRd_{vPOkVHMhedm8n$U!?ux0+NMomeCwyMGpnI+iqHA}| zvA6?3sB<)s$`{%a+2fhYOAY(2DoSWS*djv^@QHI!&Yf(N>S z>o%PPx!e7p!SaXCstvbcb^b^de`kL~DI)AO$P;gNZ^_-# zVYhgubbc7!<%F`5mSc;huLKQzU6$k69V*Z5w|iIIgR@8fHVugDxo1=G#r@}ly5x() z#wYDA9NxW~JCrBkfq4GZ4yU@78yin2|M;rh*rs>yUYlvMU&4>&(D*)y>W2@Ho_*-s zJTc~4)h*pQA={a)GW^ovtE>poa{8dPW*;^|a1#@9d5)5Ob}rQ-pUAuv6gd}l`eDD` zM1J9it*6r@8dHqAKVN0BZ_DbQkPKsX{@VKRtHi!e7Dd`v5<;I99l2Tgu`go6^te`JzEB z>NSFf8Ma>?%s$5Gu8P( zd11TrlY%+b=PiE-U;D22p}xoYX@>KFG!W9n4{?sZ3fQ?@le-4`INa{5Vm`S@dry|0q=+=QbAJ*VsjJ}=Uz*4%mALG{%I7qCVP{A3ZjK7A z3cXvbd$sK@i5e_+3}<+eFD2JbJR;;Oha@5I2-hxp9b}$JMu`aGAyhq~nNSzZrbp_B zE{ms8Uxr$%1O|J(re=67vEPq{$ZvDd!_VhT4X1KnK=^?@x+-{b0AYc)a^Mb=B9 z0_-O$A05vvzAvZu>H8rq?DH)x+779^PM+MCG+2EypxRb6NaOs8)F?{(*R^XIC&wCD zhmAOE4?edFRb*!^bC0Pa#JP{yuxVBCeEmk3;Paktzn`}#Vt;-ECe7H++~KE#Jw45t zSq(f1?3h1(35BIIgG<9J=t}hX9k;1^ZknFkts1?v^XJ5=l%Q}$`rwPC1N;@mDE`kagg;Sh9+t>UH29KP9Prk1 zp>VO$Y%MH@e2M(Y z-E`;MJ6=E|7NbFX5rE#{(;GBv;YnhTpD+4pW!w3xQQ$}X&L3K_{@Zg)Yg7EQk?s@T|>g>#jZPPQOc)x3A_uV)|0#RezaT6%TV))@b?5liCDDE)jqeNV>4 zmw7`GbJ!*0i1Jx)xL5*NQd07!8VhUYCgm$#@}p+o|7Yn4wrQ9(elM?A$50B*rJ~dj2j*Icn{`sJvY0-3GnPHXETTl^@<0rm) zqY}RV3VttmsrCzq+LIx)cOT{S#l`WUM#;~ax}3nNsSBdyIyL4{3+to`ZetwmmFvza zd0vN>2J{J~*Fl&6P<|mF)US({a^D7E5V`{vj65@Umuo%1a6pejmR|UElR|P>CRk&P z9wt}sOE%4@VmXISN^!q$lb-^n_$5b22-}sEl^yKtn1bR2+>VyoBZO3w7z>I=TYE&l z)5vBP;|IFCxt409WZiR#Ka(okDvZ6OIXMynx$(O-Tzh+ZdwFPg$*1hO60PZQJ2)U% zSy{)p+u{@@QK#sq017^jCO`Pm3b_cPx2YQBG$S2_No+*Uxo!g`gK65CQ$1;uws2F9 zK+35ji z(CDcX(q>R5wPQAs4!J(AAAsFzV(2>Lrd^z$AW-T3Gi{I2wy{5Xj74zm@qW|lj5QOi zHt!Uy%HHH~DQK-~elOfs+ucTUQ2?kEJh#^<0@wbHcwq=Q zq$#bL7DJY2%pCQnlCK3PWe)GQ#MW-eNqbIQ_UaB-1BCeJ8Jtx$<(lq3bI> ze>Sb3_w<-d)0MNjvpvas{(|evo$Pmm91pN87|bpzMTbjCTec4q0%$ zqvMKWFkvsBvaRiMrst14B|1;(0{C<%b93k9mRvrQ?T?Op-?=^vHTCp|Dc_R3O_%dK zKNZiv>u{_88U50}>-Dd{MNfz(N2a_TmiV9^>U>{ketd;yO#)eN!qruVI-ou*JO?QsmO9su-M!y9 zw%R>bz7;cSC{Z!F@?)9rFJD34D@3q$#L1e%>sEbZM;FWS(mwMRT6nj zSmb&0c^%8`At`g;BcJ-#t@lM?Bz)Lz7opDLE%ZBbCQ)EIMeT}v_`Q4fzgmQAPoXpp zRhj)*{HE7x%jHX2(`YmnO8ZIfytOAhUzELRc)i;E86!unO-|*+UntHN{C$+HxlPz* z^c(!VA=x9OcCv1hqX6%xrWhF+H!CNcLDdqqUk#LbZqjevRUvXy_-0h=`)K)?rq4)> z&;)`zhtSomCRD~Rhyqd~4szf=;POf}IwhQ>zrR~c8g_w==oOJ7Cncpf7_!w+xeYx0 z@D@5q`Jfa>AzjL*!jj*;U5Uj#<^&aVlMg6ry$GnCHzq>WSOrQ@fR$ zbsSRTh9$J*PgU&VrO5SiQSAQku~!Y0P+?kuQxW~hxMhdx5d@dQorQwvCqpv_{9K{N1}!$S4Z_hJl9jHxxc| zb92Yf+aIyGEHLmHrNzB%pguZYx^ybvKEX=JsEDw&8z*HQ3-dOxEtySh;2CKFD-RCm zp6Ete%ea1h*nNRBpl?DP0zzVld({R9USnI*D`qV(6JkP}xURiBN53smMNFlkc2C*` z&^^U#-^=FZCXw|k@}GBz48Bg#G7aNBna-UvGD7~m+*ms6LPkg%>2`KZ2i`Cth9q?( z5GpRfdmNLw^5v^npo9+n`epCn;5b_G%rzppP9LhJzu_D*eqFohYYg0OBFrCEfY% zyr398x9Ni34P+C5HG#!GJ$!Ao=I49&?{|OuMku%2=os15&o}oQJ#72K&}%ds@eP&` ze7264gdH=r5r}_%?@Zx-Fei6$a>fGPf?VoDv}s>-baZc$1u}v|YrfYb79p9i_{mXx z-A0xfMp$?$m(Mj$)h}@>rv!b!Ad!9Rj(x_-_S&yshw}AAmZFS1crtd0{b1N`__KA; zRHZV^u8z0#S!YwR>ZAL`*YL!qDN;uFbc!OQYWb4&w+E!1*2?MOJsP6;_Jlh5zdBp8-5QFz)U1P6a&YC~Fqj-`F&zwR|xkak7ZEE1Uv`L#xXf(fekpKep2+4^?D1eWwVB6zH7Muv#P_hrZ zgb?UBdU+RNe{yOfrN&G(Z4|Cb+Ucjph>ihjE-o)o;l(-A(B8PUoiEy#{UBoONmaWz zqPGyr3G)u?)^9aT!{pim{W&R1=g=V^Hhv1cxiLrUY?u4Ty}93GH5KeRW)F!qDwVS- z8b`?_^|%?Btsqjq(FK`XyuWvvZK6u-~6-wfVZdQD>2&QL|Oj zE=oQy7%R)S71GjDem5`H=fN52yCwFn{EL;r?yrbBhRMBCpFEJq`>+TzFUV{zi&~+;vr$M3%bFD$ znqOkb7)eUo{&~B*Qfj({ncXh0wb9NqvM?x;qA-PuI=(gjQ%~2?ez3nUR^0MR%89ZD zMI+sq(VpjyxUb+mV)fTHD5k%h_s>W@c<}8lwUBu=0b^S;Gp$c4e%hw-NZpnEA1JB} zHheJ_bz9{)|6=)_W|CWH6)W(KQ(>lSypDOU)ixP)z>x}u<(4fj-`}k2Jy4HK_|c}( z0b=kn*Y3GDw~*^-3)MpD&47dxj)Po{L+sY|tLdK^_kC9tA3On3$mNV6kJ7*tch4s* zdFL#pTcrUj%MY^t^z*84E;&w_&-JX)u_G7lKYT~7aD022yn=I!6)`rAJP!b`P$xRw z{|rS?^0h4GKmkK8M_$cXjBuVxWN0221^9}?&6{GE97P(f$rL7*y5SpM9md5uvK0HS zYSu`)@Z+A7v(rBhwzb=ar-#N&4YVy@(_P|Syk0Y#qwjPgmM>$^oM)_ULq%!mWJ7<+ zL+a+J0DuMU;z&vi|6E@aj%=6-l7-`uhd7NbK@oGG*D;Fl%wE2bn*FMw?@hte*H7Dh zPXdduT)(yV?8u|91>XgqMsDGHdw%JBqE+XYi1D$`&UC|K1s1w@dnqy&UIz>~a-DV3 z0|Gu>%{(@c^3NJd_{%H(FVHVS_LA9&vDSIKA*E*D4OP#|+>LV4Uq62`>@dDAmB;(x zvAubG=dw<6oBL-at=On2wz4F@8b`kb9BE7or&jGkreOX1Y|ucE`Isv-sN}7am?x%Q^I#Oj2b;2DVp>vD9sGDdygLj9UTIx*_7{nQnf-4D%JjY_bCo(z=TPt-gMVh~t7GL|GbEv1rF-~#PKVey76RDC=Ll9iI`#9jHHSW0N`= zqDF*oJ}0>kQcjQceyQh+-SMaE9IuFVJK~9uJ{a&1wIjpVTI=-$zxNLk0RZ3vFat1B zG)K9-rCbPf!+l7Mif)h|JpR_u*QI9pBWP{yccxJ7^46arxe$E^)C}8_gaetSB7}URz_9ut5e%l+GLDWz7yH+D zvr6ir5*GSDyxKaLv$FLTKqsb3>lV^&F64zVd=tQeK6+n~VW6cRxu|#wuoVS+h%&fC za5=yJ$a-H7MLRyEAnJ3lPQSFx@o+Vvf%UaNDxNbZEI1h9!LBCB{|RakJk9Xl79X3P zWk?f2cvT2g0>B6jJ@$gt+y|+%)ZeV}WPRfjEcD0E3OkPpPB(wD?V1%>&D25;KgQGz zdJVXnkls*+{Nd>3IODv-FaP|N_!>4?3qS4twf~^+jqmq26gku!J50IJYK z5{9Z3MxMD#tT{V+?R;D*pgr;12bEiB20}q))U_8FhF;94f&zz2^q{x76Nl}L;{|A6U58tDBV~&-5EngPlvJgC_$WkEpkKu6}Y;!?7 zzu-ju4ZuJ;iJx1b@TNI&$mvNGL!-j~1z@PWVE$-@xko95P?#tqoEXWZl2Z-}_!-wfAwfQL4rj`=X)LW~XE{+y}m$ zV45IH;b*DSu6&)((VqLqu^J9nm~iW4xocC%WJ^o_PjKSS#@w2HSTZwDLcbRCXjyf# z_<_gX-kZ|`$Jx)mxgU7HRT?EPKDAyKa689kQv zMOk4fSF6ILqS8%rNvbBV=3o!EJnO;7ZesJ@jdFxbD;4-j=Omxg&Qp#|Ikra=Qv9Ni z_uunq`8w=QTT&0i>@O0cmzXZVsCgI?$^+KPpiMS;C?p<0( z^I*DV=xHOt}FFy>w32hV$GpvUl-&tNdaU`eyFVL$!a zU0(wl!xEDK`9K@0r9SQ6;(deyS*0Kre-qjSmoFpl0Qd`NYE|BFt$<*F8Qa{}v%4$W zNNW|Z~c5NDTw8{Cv`v9bTx>Sm3`A~%t ze?3*iP)v|jmReg;BJYJ%o$;gT2guSX-NoMTwHh_qt#{jJbP1oXrS?bpb2{4L6q|2g zA_cKa$*mot01R_e$bn)OJihgAwLQUu*cW)4GXP>vPI3YD0$BVY*He6G{}=dhPvKfu zIq*FJ_W>J?2E^3?B*FO~phN=HK!Z8xLInn7)8pe;M(qmV?JgNe0is)dptIPb4UCSj zYjW@;T?HTJ{{H@tjf{tor%(}$rKgTfe;8URr3zHrTSB7-f@)P?s>Y|jx$!_7GPxYQ zIMmTzNVA6E@r{oc5yLFb_s*euejo$_?&?(vQ2c-~S~3T?dw|Cl#W^mjQSd)tLZ#os z0NE#=-!2_Wb7)qRD!>~Vs#iv~cfJk)9Q=3ChtTyaS8f;9H$8nyVEPoOOO-OV_YP0J zGb&Q?M}<>fOw1s7FHX~N)fI;tQ-w?8keAg{23Yov7ryXjvO7)WVBc)Env`is6gXsO z?uITxx-f<3hzkVB2*U1mVm>0JN>aceMyNiG2H zI_NjN{q1oJ13!P>=kl)towRa+C~hjG0sLfSCcVI+6>OyBxrr;TzT!4AVtm3P$YV-W0gqX(-Ky=wh0NiHX0UemP)?Bj*&Mf;9^o-P~yNHdBqYMJ%8Nt}S4d_I{NkFjHARYMxPv4Ie zmICLY9tL#P0biwhW>0sn>Y&1|7i*e`cT~&bm6Rd#UdO@`C$|rM0iv_&PAxh20$pk) z`(2C6$wJl)V+&jI7D^nfiRK z7E|8%|IpHuD+p=r%i?3mr5ji)tg##(1URYp{X-0NJC}VbJ>FHc^~ zCgGsPXQF7e_xUOz1jJubLjx2&RcCz2-&jM2-#B08{Xj6$1$kbsM*baFvwQiuFqr&t z^-I2+0F?ltoWx+NM=Ijrl||Q$KtLRpSf9Y{u)lu2t+_c^pq+j#U!c+uR#{?pSYK93 z|6h;*j)4Cw6409!lu4+I8$6MRS2gqEv5;MdI&bq$$E=q8kc+Xg>*(0qw~p+LykPNt zf!@t=-qmA0o>FtOlH!Mr%CZyGxkE^uOF+<6`qE4rU;#-~LTD&4^!UK01=tvf3*R|Z zDksQ`EkRNZ20L{0^l9I~_5-Z$=XoiP)fa=s4$zgYVVR?)rCq&cGa+72R@=kC&tC>$ zDWI!}`cd$7?3W%g6cO0sGlPIZr=O9I*1S&h60EGNbXcaN!14GGwu6kk+*BI0yW{f< zG|yjh@mQyE(N2l;>zPIKH7CcBlP)jLF;bMvjjClTUNOgBH(i37&>txDQ8g`AcSw;6qsdV*_dz~}^nnhMhg4aOo zv2=m<#+wWgxjBkS&nvMo?SSN(Oi^Bz_d3?y4Cgv19cJ5S9U@>L_0nJ1-qD`e@Su&} z&BWeL-+_`c#!Ox{_2TY>;j(OQ$*S3zLp`Zj!!;Fim98&H_5v*Z;C>1AFQKh1P&O{q z|NH&{t-^D#yd*m$M0ejQ3v?K%#gIy;1i=BR!vq}eh zSZ6KA!^7oQ{e;v5aF12Pd+tvjl$ucqm@nIL4C<<}$kMW)OE00m{Q{sIcPzvW7wGMNxw z%dJLpTv8|ZL2kt7ZdOnav9ZZ{nmM0Tg(7|prE&Us!f(*MWItSovpoTkg z^f;r>Z$K9YE+H@oNUR@#V;oT6T9V*tI?KYhjs1xP$g^iA_s%BBH@CK;kdF7$jAk%a z0x5Ocf%^!;9{?G>;syW&hu=qJEjMvC8*CZYG{d3eGP zY8MuAs9*>Av=K@eUe00$>u6q?I6e5%?&Rw_2s^9gg&#fD;MuJR^b&jIF}b6ZI!7U~ndTrO0Fd9lY~dI^Z?`8O6lM z*WcdWKCJ+5pkq>JShk59v1uEr2Zl|hGF0sY%hSAEc}xHNK*g6v*yzF?M3V}E#I z7u(;`4Q@#*#BTFx5vdCqfWjO-ent`YMlu(nRg@tD0JjRVQxXe?`XtRxbdPGkBdByT z;}4Pp)3)cOx28|Ropde-GkS>c>;-?d)>am(N)yAn#H161?ioU1@c+Lr010|=VxlWuj&k}pf{#LAo<(Z?03@S_ zMLr|5GOhpHf1(3+ipkJ-1Q!RFi7`F%h}=@A<@mKTFxf977B=8J0?Y@XKzv>U>wC>g zL$C(?1vN-Wpbc){*tZoKU+^+-6gQCy?0rKfC(LTY+aO-ofn(lnBcEo1s!)L_P96-O zgwGoJqNXM$zWQ>qgF7vrpXuN$Fd4w_2F|#rq0S^jzE?il!jy-JPPx+1R|=c_iQT55 z&ZXN7=s30z-ZLEqx9OwG;kxr(KvQ}0f)>z>THE58DNuVJ>9Zcv) z3Bi5&m6bx48>z2|M5+q7w4?MCCD?{PY;-gzfRX)+HGAYEzYNhexZxwx$KfMsv8PEJ z+_@Qz_jnzwZVS6u?ru%o^1O8x{weR_w-d*hW_2I8qF^kt^K8wcM(xhT#Uy*o&!m;~ zRZjDDv6;;;bwbV@PZ_FDoi-`J$)Agb5qn5tG-^({S5t=P35-okB5_ z9Q@pXdWl&V?(DzZ{3m)u^ACoWXGZoWt*Yj+@>={?TJIrr{Eo7~o5nFSgPb~c>XJN_{dAJd)V^TZbd}Z1NGcUm5m9;BtvXN9$R>g-%$~Hr z@iHEsGwaHlaBDw3y1EU7$hq~JaS(Z)2yD9NVKP@MpD61g;JS#=0-ro*E{o=-lf`ku zku(T?ji`cuGY+`K|96aoYm>k;2 zP(vurrxH)cjPtv{Uw6TxRSnh0h1Aff$lNBP^wd8D@GVfyQ>SY7v-ZF`OH<0XPMOc5mF>aUxmwoLFV z;GkAfS~|CuH@}O+nQ}+V#|gyUvibTXa(o*RXD{@%x3+>^zA-2b0Ifv4unXs)!wCZU z7AQ>OrBfXszI*!5+Mk{i)HzT<=ks?a1P5OUf+%^SJ$MJ}Pl0WzxaRvX2z}1Q0?~YH zuJf+Nz~G=DWZu1}!%9g=AgV|-X~k7Jo=2YvI_Ztx`egBCqo{+Ua+^+xdV&40y{0P2 zXyoEfMR7j@e?0wn@Ny#?K8p%j94N{G5F1=T$v7Xsj@^lj`hr)Jm1DerNSEMQRHEO0 z*4rr`oBHi)rZOX}ebWg0POTN^Y znVFJgE{>#+PRly*;s;Bo7U6U}=&M?4{(t&vQKi_5JfILJ&nUb8@S z@uDp-C=i?4fq|Ks8NW2(NkAPJ;mxF+fEc8&w{d|8og)^Ed_2M4hcpiQ7wv6r+*+xv zy8R;~I%bHWM2GNJY>y7uZb8?VnHvCl~ z%#Rkt$~F^qKoGr$$|7u>lkAmxY{ue!O0e;F+NzI?fI z?V3d4p>HDvwds#bnk5AV70#>4J=Sw@Hz0s44lF41@aH zP*J^OcnbYJO|@-Y@hKJ2Bq z)^vaJm8?qEpCStHbeZ}l>WHE3-+FN=Fq%`l+Eqk`6%ov?m?>cUBDyo1*9m&P;qLBrll_RuW*>SFy|~Um zbO3d5XD%5t9uL~UEUmInq0CVNVo?(g9Oabh*MX}QzG)2W_>6+OUNH=NJwyRvdOTR+ z!pgqUNx$%&zu+IY+yN%t2H$U42UI;NsJBASPl8HBTv8%T+V<2Vf$0y8-Qs8?sI^fY z^no>{dT#eBNMjeN0pcRffo8I}2W>^6--{Fzz(H_9qzB4SqZ{>_-96~sh2B^e&Mw5U zYB+ZnkiHy#RToeJB^yJzY;BLG>tNqhTP(<8qrkKU_>;z{1qqQ=q<*#zKV1AT9r}(Y z*4e0TuHMe_a{|gO+I1VhfBC6Hp z?27@41%Z8+3hd0!3xiXV)Ird8yS~Tm!l%L78WyJLf8XZ&^72-o&abIC zfXCaO@ZqaPea}l6j$p7H+OG-?0*aAQ*4x1-pt8iQR4Ed-`V#2#>GNJ&8%Ks z?Ghw%;7Aog!P7l^<2;5sp`$Febp6}6jp{E~u3&T&+vt6+BA>i*Q`T53m6b9?>)K zn+t31JzBh&qRBnLq((kGJN%99A+sdtbOfeot*eHLtMnxfH5CM>5ADl?Fsdd~nj&FWgl@*N&qb1Gjnmt&0Lska#m8E5oC$O+~!I}8EdGN~ZB?H}O zLMH(fMzX^Tc7Qm-wylMJddFk1+BoMHtxn_^5HEDHN0O7*fexczFGK0XC`l8bO_#3v zJ`>TS5IlPJ>m^U6F5xdLwesQ}w9}@Lb-x~vLiEV>kLInsY!p1f@$rAbM6;NC7)mNo zeO|x<1M0gKyG+eO_m>h0U~HM@ifC5=wS%tDEM=Aaz{(4?zBNa@VKn;z5X2F=Z%vUU zit*zBd7yXQQ*P|%5_7Sr@%8=$sM?qI%+1A0z|u52N;F+edx$6wy{bNn{q>erxPzSD z?I{%N;pxTiu#!_68W?a{etuMDY@gr+e2ZUrQJpM$ePIXi=->TE^=_DuFFOBi-o3Ru1 zflV1raJFItO+a05F^tm;n^G+M1dJ)P#I=V5Hj`n0+wL-Y0>u__Lr2x-Bq!^#h9xAw zwTD1-5pfZP=UaTIQv;(j&s~krrWj$_0Q#cRR)oE2qZHHMHnEC$plO1~ox7e&H8ZoT zxM+X0Kf>Cl74NtCWP`JL*(hjPMH2c$&w+JOoLMcB!--VBAeL6yIXGcdt#4rm6 z=fLWlRt)uHi{UfAp^*gp$&0z&In@vHEu#LhYXWc^u#6%AjNpn9r9&sMK{iq|GFW_m zd#V}*3K?g<_0`qj5#)OTDfZyw<6EuHpz>1=j)>TD(I`Ev8D^vu%3w3_k8e(ctQjD2 ztV7TwU_iht1=|t`TL7htx!v-Ju#?jk;ty`#CtF#AtZG1xo5-@Il2(%4NHvdf%n3P} z{SwirDd`!6A`W{`e}z#qGQl3g(a8xuQ4RTx;3YjgGz7BTB*3H8GJ)(o5r=_La;N5g zz>k0Y(3rj)nhc#vc}kk}a}1dmv*ik^XJ&X|x<&n(ZqfiP`1ttP-&e_0&!efaJD2E= z@cHmF5SczuYGW`m+A_5BGHkFWGUHHmG}JyS8RV~64G)DN{4jMY@%LBW-Yuk(h|{^& z83Hwy%a_FfNE|H2z*{QRU+I#5hF7qNb+ABMqF?^fb>o)@=05<>3NwZ$`kC{v+zm|x zuOuMb!1fxT!Cwf{$A@sC;mQeM611YK9&YfZjeW9FLCu&%C0}JJ-MZH2959b#*DC)4 z3!c8~1xG*#-Hw;NbEmX}$!+2LmeCx1X0qGB z_J9r{oXNXiXTmx!>XX1>;0;O~jWQ9Bo!46++0&T*EwsoDgvxtc&wXjnz6pwrtuiVQ z_?&o3H$(k;!z+c?6e7&@Y;rEiP_3{MBKt~4190bLW;T0>BcZ0o{1WH1klH+*NK>gU z7sJ^CIT;RZW}sh)$}nS)OK&(sd1GW0*eKbg!VcH=uh!9et05IHOc9m?`xg1le4Sl^16%hqhn7@&~$hrceR$I1c0DLa%{)qJG`$#YGG4vhdK*)J0|_ z`B5^6CYOHuHa`}6JRyw|Z2^%hwV#U6nn&Vi26)!Z9cH^VclSfeZrrEjQKBRY0Xhqw z3y?Je=|fL)My_&jL2+?Ck5AMB*rZ!h;o+_EZb8BBu!wD@7V&wZJf5 z5<7XgbuvWEJ!mfA6Jwjpp6Inny?|B-O1Cc~^EdOs8q&tq6e;+(jM~V;nn>_pXDvvmnu$SLZZKJbx@trs!7f+%_1xwKr(pTKkMMG$Mk}yUB<7jo*RA4j9{odFdfHtohJ0 z_ZWgREIHXN@7t7&Y`8Lfh&?Y{E~K57DcwHH6Vc-IA&;@sOV_Jr^7)%DGA|624Z1#c zg%VxB3Gw_dcqfY9A_?a`^oG^2B<_C9cO=eGgF(6QG%bP%DgK7624Y{%?YTBNeOQjB z?f;$qY`Ckf_4I(m;Ph~-oBi0)E$mi}=)qp)^2{-|bFS94ZqUDmHv$p;m!OTa*0vQ! z?I+GE(`v+{8iUvaA~UNU6_g}$?#ig;X%|W3oB&NB2t7oD6dB`49UK#us#kwVmSrrw z`w(0~4=No0O^jQ~LCm^tXQ|DuWcUpkinp#eu(+s>)=39A46PyJ`uLx!8?m1_`;8wk z4tx8Tn6jIAOvNMDmH|v5U_5d-sucfCJUL7L|3C4hFC7+K;F-9B!EM;-wdNBne9{j) z$gc@9H|&mn0; zVNuj!RK?JGe6CGWq+II7S;*)Dv8YspsEQd*is_cePT`9ewE+2to!(dR29`F{O>Act zFiu!CCk7luS#{E?%@mXrltBdE*rA(=H-}}Cz>o59W%~R-@J?K6fALP}C?LKL9NQ=Y z)4`zx!sTuPuCfp0Z>US)Z3fhFay~09uuldvbVfD-m$kwm&=P%Jk6FtvuF(*qq26punfb0RS6Z{Z~K@I|ub-jXQ~{-u}!e8{`@Oe11y z0Zz2ayFjW$>R0WGO(cq`du3(i+0hfy{*QlQJtXvL8OeIw_MKTqyaSLq83DImMi@f) zARa`(AVzVEkvDtf2=>b*XOnW#E$P=mL0+r%qzzmHA+K{Ed zs91FN9AVap`2TFKQgIi6f zH3#^s=P?Fxi+Wv=8PGpaKe#Tcx*Vn&;VwP>P?V`*MQE3AQ(&c6zrKn2+#7AYrY{Zl zrFYudAeH?hcKWpL9+QL9fHQMP!7X0MV}HVg#9$wn?T*)35Cy7p`cDK z(?XPoYaq=S3>#V&?3Fbat;*U^wgqXA)S@NKfN1uXAX|({4-2!Th@P(txJqeMxCVlQ zL23rN>JysNHTnOB=@6tn{nzzOg018K%vYJv>_;-6|DvnR;c@Fy2Y8!k@Rf3Nbp_n+ zXJ_YX#d0-~Fi3YpxXxhP(D4YNWf;Uz(I&d(_DnoHs>pMtsl9u%{HP?Mn(^lMf1*O~ zW}$N#+>wgcc99f>deZf2Io{eiM2!|)+;KfVO&Nb6&sRdmBekJYF9pi`;VLx@u+PP3 zd%Vt}JDKj$2!VfBW@x1RG)-^1`VOuRdw|(uD5oZoYhfO^D@w23u@{Zn%mZrI24S_j8kJf$g z8+I0*!a^r1ZU5(8N#AZpBRhnkbh~!y=S+}arh3Jjf|N;7-Q8W#Ql#_d@;TZY@iIi< zfDi)ek6R_^V6Yw_-tKidED{-y9WFt~`XBp$mPKA$(DqwhUkBF=#8VT@a}hKyc^IY) zVhU*9$I8j6j1KVkhuvy~m88<4o`%{4>Ek~v)F`ovo5TM@l*3=E*ztY|d=KqGfd{Ee zbrurv~2hxZ29ZVa)_ZokKezS3&idl=Gao`}ASFM#aCEFT<+ z>HYi$091N``grwB#oN-}bxYI_Ki-MQV62AglYEJ~Bqxb}F5gAP^ic{5pklaKfu0g+ z28Fv|iAffj3$Ov-dR1a=2RHplNPfkODi$r<@!Ok6-L0R2w~y zeN1&OG527+7 z*VFo*<JW|lDK?ptlCi_+fexrq&KT}hm>quZ1#td~qHwy$V|ih4jTI~1yw zLVaK>#ozd_gCDg2MX_Q!X0(=Ge`XDC2_1E`UULkut9?4Jv4(esN;c8z!j!zArY1*C zA)z-t%e2=*oO?`g)*+%L#)NEE6B$ddYd*e4jYoQ1DV@I`KMu(bx69gENHE_6jtfZ& z`h%Z#$k?wT6}*hU*>-2<%-MyJ>xv1qApr}!&w9uO=_-L(1q`3$#RQj|%EBGZh6~Ip znU}5SR)7{=tzW8?^*^Ip)4f5g52uwHr@Q zNt_^l|AZ)`9c)5hJ4Jp{t<37EKRbv?aJg=dO$P?op=jrzLQsEdiM_hKX7}^6yh}3l zz3Yri*q_{3e|QT5L^egK-?OeeTA2Yz;@Z73U^FfRI}z-5Zv7O@jG(Yug)wU|;;BBs zvVP)P5m5YoXmW^^A89ff2C(1q^Vp69%}}u2MyH!c-AU8AnGbyVrYTbDV>25K@>z$F z+C-byKh{t>+vwN>D#0l>I8@JY^JQZ6+E zbb~PIae#cf2rBO$_lcASX;!}UUxqUXx>u-{@Zn%%aY(gfeh?5~ z^7TtCT<$9^x_`>G^o{D#ZpQT>^?mTy^)Tk==-YL%pY*+tNV_OtUuqr2D>zY~{_7OoY`%aGl>raS=g7la%<6cTuLQ(45Wt1INp89HcaBs)%h7C;LdnENsDa?~R zu=IUS;ba5L!2o>z=>*bs7E1zwct%=Uv%=ZDWZjHM@H5h^M4Mz*yYt7iH?J`OUbaX_+C?}vbH4#1(+x#{U^u8<1~;;}J~ z)pG{?P|=7Go(2>1j7)|sTqg=7*N64e*g=UC!y{EyH`+#<$HeWcx1KUyqoYe!9^jG7 zdzi;p(XWiMYm)7@V&YHYY+_6iGcr?tDE*C|e_F-#^27e}Fm;r5bo9kEXHF}P85dHE zVd{R7*{00d&s*zw+IWXP9k=D86N@gJdF@BQ(gb-3C%17p5PrG1xIj`yvE`tvv-9@O zPRk2|M3rsQ2G^^SlDa=PlQzEyON4!}a(BK(XAMv?|5pwSrQ8-sqOmi5h|F*#xg}Yj*ftqCNt&DRKg51NdhGao>iA zC$C z{AmMAk=<>vxl&)n^csfDQ9@xB~&n zGcUdO-?5`!qbq$~nZ6-iwct`S`oW`GLCGvmCnWe16%B`jq@!B6JHz4aMdGWTSkGa1 zUcY|*`yeqnIo#hm1(#=-^C6@WV%5x_g~JjOY5=TDt*c8dElr(^WY+9V(wopFTSZl5 zo(d~HQ5W|%v=G|8Ah&4VYN@i@-}c?;AGsGz{*K#2t*bDK*g?~mlK$~GwBa&z>03$= z5&4r60-`D9IF(C7YNPAh~FNE)Fy%gg7PM-8&q1jFbr^A^Bp2tE&|m+UoV*k0a##={6a3cmoI zOCnn(!Y8H~_K6*GHg?Z7betTmbSZE@irfGKDt0mlo+dsL z)B{zW9}e91Iu6`*$ceV@4;@{nUD2Ln*{Lr_I|j`Ay1x%f1FKj5yTj$)-xcph+&E51 zSQ{_Q2Y!|u+q;zR?q{mpC}E;nk|h4Hy`l9-)Jli0lc5>y5-PMzV0#H&(%m%`b7<`S zXE>E7(NIXF$;^}3OYnWteKE|CUyaC^wS5EoDFPv`|)Kj{8IR$<3!iV&J_0V{jW2}OPUmz zMqeR9va_{;QsE+9))F;!ZFTSM9;|tTLr(lWa{Ykuv~Nanc}oVKqKvpfZq~;QA&Gjs zb4o8NDv(3Fj0cnQE%k_e&&ZrmF&PU5=0vL#337O3NqF=nLezb};=9wHSKpRqr^0+Q zT%p?I+~*6&N(fo)YoAQ&lI|DHbxTx@VuX#>$tERS>1Z_{(QPa3e~lTi`kwglHu?pp zAhw;a^-fA*&>B;ABzAhufwJ#Im^F}5;Rm_5pQJ`z3MFj)*&0hSg+0QzPVU}Z^d9#% z(XH^r_{Xw~Poj%*W;bR-k3<=BY1Z^Tq|Rel%cr(oG2p~<5bwPz38Xwtsi)_Cf!@mT zw|ZWunZ?mfsveORxFYq9!ppb@1cfF*h7_yJ0q3xA{az5I1iK?KZr)2YaDcnT?U@sd zr@D^1Ht|lEar7&nE}Au$S}A)+&w}-DD8aBVuKvLYmp)rPZ)86lVyjx|+s;#-0Sgm1 z85vpV{irTgX#$f949WP)wl0O(as4#?33NO`h*AX12{fjnKylTvm?|D?)I!@$z5X&< zb8~loc<{;UM7w;V^V<44Dx;%Mq%I@#qN=M(<+k-RcQ<4nh=n1u=Hp|nhSE}niK&r^ zPR#)KjWlU?;%g6AAurvwA0u5@WNYl=dVSXDQ}-tb@I%lbZlE)d!8?k*Iu74JsQ7`C z*8;yYTr}XbO{|(MP~+*gGuS#ch@jO3*+R$=GaWs^S9MT|3`aN~Oqb|R8P+G(pr%sz zLUh2r1{^<{2L}g7M@0n%HRpvuP6sgwP%{F>1!PM*Tg!QsS9{9rj6IZ6JAoIHFAX>y zNX?RJil(6@<|}uW?B>`jQXR!&JJ6Q_s0j@9p#jY+hARQ&Ty-?y_tvYfC;ROx9o<)u zddsGOusAq4*vm>HkCX@@8Ha9y?E?%-uhj{Osw@ndf;IRtqwnA3v;F$=q<)Zo@OGvn zbB;S?!zhUE6>=tkPbSmRjhWdpU|T^O2b;qGyJ+UE`%0Yy3~>2=(tfYs9lk^eGS}c; zkSH|&XiD?|7esY^Xz2&WYa9cLz~ps+I#A*185s~}f-)7|9(w_MTWQTRZzt#=)CXMq z{2PElfkc0@4}6M?LsW(0yKPZi(2l8oGXC5I2`2v%AWdEg=g@g62k}gq@BcOh_#h<7 zsOazZVA203B<;y?|l@!4+fAtlg{K$0 zPxTpDU3@_e-p!j3b3Y6m^|ai$W-#`q@!TGV=>arA%t)2y@bhc{Qh^tC@vNw54IoY| zaRcy}JGM1s-*CIww=hp^^kpjD4QzM!n`>`dhhaal!e=><>Ru>o;Q}#5t|M5cugeZN z=~HL>MXLGK8^iM;YRS&=iG5+o^2D^qRW@xwN$M=v#44ZAQCR54eJTHTL%;uslm|nQfTzZHD3=!%B0z?vIM~(jL!i|2{>K8^r6_I3^Xd1C-EP0s=I*o`@9^ z(u!z7Ki9()MLWp`xzm6XzSqc42B#dej27pQCM<$H{6ro~iJ!a<_CrHMX@p%ft=BUl z8HW>CkNFjF(|m(nxdwwbGYi`T3!m6ewDn}GvH;xrGn4}(1c`Y%8S>OFv0!X_(KD}A z{XUBJ8e3`g^7jC}6oHb}zBj>=;Z>X0+21dt%b8hc2A1B7Zc^`T7hUTR-ha9J6t+#~ z{ht)4Z@yl*I>4xgzO&i6DGVkqKK=#;0J|MR>j5J@;T3S1?;mhYOHlbX_cTt)-T;TJ#Xizm zAZWJM)=th`w}QYv)9;C2AXe$_ojaj4A%h%IJCT&8#>N>maXVWJJ-y)ItJIlyRTiY4 z21Z8dBW*(UL!lTA$*Gijc%aPMXnM4+j9Td}0pA7%a<}7Hd`?b*-O>K?XCS~-dMVK5 z99EgT8;{v_7LE{bh|><8x~}&%HN$m7x#XY))gkNZnpxN_Z#huS?@-*6WwDt%e}yfE z8`F)u-MQZSZErGu+b8nHkNx$%1iXWKI;ZV;&g~^Rd--$c2wh4w}Zf&Tr(kO{v<(6H#r?NDoy;rd>5wL1&&LmHd6xYz!LL#_B8RE~G zKlsD5@Ml2vT#i#TujK%A2>=|<0UsPN9ZG;d6k3mpu(HZ-oS_v#45@(lc?konzWv!R+q5|{+ zSg*4;O-kTpnt$`xq6!$J@+YcERZ!^(Tl}~QvK0<7e1M-{S4^OU2I*^LfoaqviGZUf(K+FI#P(4_ps`=W@}(aL`8| z`{HzjU;JrG$6NfjrYwguEDDsWc11Kl4LQSV4y$R9rX!^ja}3EI`<{W~mnGS2X=Fe1 z4&Lf`c#iC^_EOV|c4C6bYbBZJojTkmGXjKbF#L?iH}gnAlHoJsqtmHTsp~M#xcCi*_wEeVm3JG8$J$>K`VvIp!8>$HfJ1nXF}= zol%Ih{lmE5N_D5CAr09P!6t(Vev7$G%zxzHy1C5{%nguvgE1NGjTzZ%*~CRIt+;7d zOGoeAOR8_);-$#o)MeAm#XE3X{74E~S~j`Q#8!ph*Ma+xz`1#E zuS-@wcPKUeda_nr+;YxjHtR!9w(b2HD~H%vasHkgZEUhLv`#|j({klRWX~~v>ua+V zXMz(Cg&qb?vjOMuL$AG3rPUOauqiE;T!gFny zW=60$m)%C_tEo$6V`~USz%@2st%`*f^Wtvue;(=!aI&(on%` z6*CyT@u8!*R0WeSa|rJe5Fipq#dv1{3-T{PBy?+K^nae2l7c-8elr3ecfyu$+4VaJ zI_xF`q$u*%?1M&L&|*?XH#?Wz3JOTsP$f4vt-ZD^J-pZtZgho*4a8J_d}cn(W2c{o z`L<&)n$&j8T6AlhXdvn}|7#4R?ge|j+Bd?@r^CEq%G8YNJoqSR_qb+X+G@2noltzX z%wh0Mi9*NPGe%3xH9f1R&AH^u14EKMoG#*N@*V+BY;v_zheJJi`G9G3p?kO_<-gwN zYWnB2Id`T|RLDI4lp#_U<0RahqE5|_vGd_Wo)EUp+U*=g5Vy`X>xF7PFORm~pJnkf zaU2JHV#8neaWcRO4nO|tz9uitO20g~9+FCBoT&0pdsS~@{H|vGv*?L)R_?kU9O;2E zyXJYasyoK#yuLMmNmA`L@+D%(DXVWi>hn6c*TL~8aa^WV<3BECXT4;EtL#FNER9kY z#BO7dhcXnL#7O0e|6(<iOZsWl>SqIH{a) zD!ahEL||ah{Gf@wZOnH`BOz(aY;2^zqTmKJ4E3Q_7y-~qjJq2UkDC4M^E z)7w=a6z^Y98fe^dDoYpP((f_w>fS^ZtKPSx`^Wwv1XNbgvc(?B-?7)&cNoPI=lPXTO%QV z-}$}=?-)n~9sqI6`}eGI@(iAcH&Q&vm|E^0`SFKm9*g|#+g~aZA7SnyUr|L(4h~5y ze?I~KmGyNyJ3DCTLoh4s+p*B`2FJ=1M?Ny)b<|_)n&wyrMS4UUGcxu2V2Vlo-u~|2 zMPI1@vD23dO*)g|3IM|C?k)gJXJ8GiT_)gtHM-zu_b1kb;5cpn!kYf7W(_2Mc_+j-&3`uWK*Esa+{=m+! zyuEUFs-D2&d`&-z*?n8|7l~z)gn3lxs~rz($CVtECuCmYJpcAFcq?JX$HA$1Xm}V` z?UZOcwpE_Y_9xK9uuE+CX|33UnCjLv?C{s(5ML02QV2yNXbDV6NRZE%+#Pw=@)E9T z^Jn9UJB@O9bR5rs6rR{nYf$-;WZS7~S8TRB;a|XqSlNS*kDmSeV-;gN%Qe={=B7P$ z_viIEX8W!CMV2zMZU2cgEg(lF;D(xJNY%AU1Q?P@@BAPTaNd3*qcZW+`F?q=+qmT4 zB%s&?jp4huq31)$h{DgSnKCnS-oxwoCk#jwYfeyHyL$cVwQC^HoPQWzJOcxjeRC$j8`8vcD0U> zC!hrC_SlV1^=C~P%z!iH14=TsJ?86w{oAfyJg-WkMcSnVO)73a6JWxv9Yg3r1O&wp zv-f#8kzp-M{14B>(zkYcQyamZqvGbM-&-!RILa)>$c%)tgRwOHd}M+}`|-)BlkApm z_f2Q<@49d0+w5E8lJ^YugYNbdVm@Zxt>7ELdgUG95;|B6CPaMQ9_=5kK7DASJp4vl zVG1=rbY+|0>6>E7hb!DY-_!iR)Yg79?r7hqmpZe*f1H-~?(&GYKdH6mvEmtg{rX+w zGjipTsb>ip2Xp7DI%P&4(&<_pp35UaxPwhM_Lh}H>aMHjX_H`@g6NMr9cSM2h}ar- z)Q{N!2*0Mr*_Av7ao|{?j&4**|X&^M?9(^qhusJQNy}e6Y zQ*o^#uGAj>OMi3tHiY)Nu4PBVOd_V`EPW zz#}V3DdlTJnv8ce&si_L(hm{Wp0TA5=X~0uE{M{jokMwVCNfI}Ch+V79>1n~Sc(u7 z1JLyJr0)Jo+VY)I?7@RkYYEXb2Dr+H!9}M&kPeA_{0{h*m-cplvH~gAvt%o>-Jr)4 zj!g1M;O{sS>H(FYi^byC{DI7;+1w=I1p}@f++?($l=6 zmf|P&8v~R1xcu-NH3^cI6w_6oD{7O^O&IGNCC^np!G67KN{Fi*rxy^c`ROv773Zxl z4s_8CX!R?J>VStbz0K2gix(nd3W#{GiHds3 z;>j%UiK%{yj^tIsqb}=u9$v*GER4rU-Wvv5Lku>y)*N%o#JE3}E7#>CZfN%e!Q{5= z&F+O-KEOND5w~Vo*7~~nkGjVhVS+#_gJ7dqFLJ;4G&;usAcb%dOe}tU{LuPTYi#mP}7D{MzgmD1q)R5zkBzuKzf=@6g zGeL2AP15`2%g9BJ5!RV65Pw^ij{)7*=l1v|P!{Gm;;`SEdkZLXrOt zB{I$V2J-a+BRPlGWIay%3p5aE3>0LC$Yz?5iteR5gY*~`!6TMvyP38qa4kThX@Lv) zLf3WvnjuM;BfBdX7xzet{=xnpxaJKO7zf#8+}GE}c{5(YIlc^wy1;jrl2GMMw1bHn zmZDdJe!Kh83H1}0r`c+#$@G>8AZ5dkhA>QnPoIQbYJgY<`Dfn}MAGmC<142_Rw3y;vBo*unoM>-N3B2o(lXJ zJg1s2q@mJ={maOuvw}(`^`3Y@&zq?$$ z`=JYtJ~=n%JofoWr-=LZ$IvHaC4l_A-9gS6;2`MTwWPOQSRbwN@{*QDkW|S4G8_E1 z4YVB%JD~xlgYRklx|FJI;ub*obLw~5bdd)S9stdUMeY6Ea79TMeekBfmA5jQ{<!ixgq9!5 z`NduR`wGz1vOiT7`9%Sy5NMAmxlL9e%$Hdh7>zlqIejqjC3YcAy!h=eTqhzv{sa4t zYZA~a@8yW@%%vpj$|@Ar%X4vYg?aXZ3C)|~9Zfq}mey8Qw!zCVHa1pdZv)i{8q?(c zS0#XzOM7+54I0=w4Io!IYhnA_bx;z*~tIIQhlu7s#}*rn^arUY+bxGZ_2km=YjkT13|(i)|vS+^vc-E35kx73kr^8 z-)|4g1g#3YR{pqKq3aNzW%Ne9C-LQN{h1+i`vTu?{!IBj*Y$;JU&SFW)wi7P|(%AbpCwe(mmb6pYXzg$(at6 zO+7um>u$13@)f5ogF>fG7#`ig-v5OntrdreSCCdkk)Hxis5SWJ!Q+?Mg%=F4dAUYH zQ!D9c@A413Wh$o0c)YU<+5LU9tY&vl+Uqmdk^O^}AW=$MuNxz?90@h@J2|V5EH&jk zpfW5E!o=HiFsEy&{h!9JGN7ug zYhxlJGJpywF^IH)D4hl&-JKHBAc9=_G9uD4N=SnsacPFUAYc#@g5;$;6eKR)eCrbP z&b;6E<2(Q0o_)^V`>eh9TF-jcTEb~Jms|(xkx9r$`+RM7dv>AtB6c5C$14#qy=nu| z{0`^-s5mL1I8pGm?^UshVtv{b>bJ5F-lDeCtk$zy?sPR{1NAktG;Ehz8j{&dXji0_ zeokeJ5HOb7*j>GH5b*%}l`bfocQp(Yhl0p{(R2ENs3L1#)Y8=wJer1 zCg$eTBQr`V8bs4uEsj-jVLB^y(yK9D^sgkDO-_oP%U&=rq|}S+WP+|^>!!Vg_= zTz4mTAJ@-16&@dWwc5?&OE-}O{d`3kz^$m=ag7kwtzwko=+~L9&wJF2wrJahlGgX4 zDcSw+<;g5j+=`C%*W3k5Btk;96Os6W zOxh=Vr}$7d)ip+Fs54n99Trb=`m@sRKWI<0&c?*`Q%`3Xb%iAj{^e^K#Rg{q?y?~P zoKt&K)Rk!imEDNjn$|1*0+q@;nTnZ9GvH8~GL;)ZI3%m?gr98{71pJua=X#l(xR{_ z6D!@%7$LZdo~w-J8NXI?8#@%dB^tuJ8X$JfFlQ@~zDwrApFgxPT+DYKQoVLQn7FJ+ z{$?ingzN?9W#9DnZ`zi!OrKnu5OFU{U~%EDd-V%Q#+IGQwjhUVJ9fL$oM0KW} zUURi&MH;d2l6R4+<+D^d8vB|ye{xJE^Tk_}Dve1s_lR_OmAcsn<049)lFHfj4shSZ zRVu?>B@k8Yoqavw1KExmBczm|V4WIzu*oVrb7yLhD_33*ddE4s{bHWe31K;5ykIl@ zwXjXKK#}DX4duH3gZR(YVo==cCy3RQ7N(#|clQrR{76VbeyYa#aJw6RW~w}AFA1ukiok7NhsO((bKmj(}$s17vf1xe44k9*T7zZMOt7(Uo`q@xXRMdIS zi`8!_#ACjt((frZk6k7&O@2#z8t0_esG%?BX@+{TSd>Ow=68X&MJG*8O*S1)Mm8?S z=m8YMf&!#lZ5s_0KgeafLe0b%O=cVUmbeCL-H9j7G?k*B|kr3tB28Hu8|8KItUNFev?k_8nKqS zy3+GEPeeZr)f!Bv5^g8&C`z39hIYD4MSJs~$LXc3B5qEQ*CN7ip)m~6wzjxP0mUAK zFEMKlxR;pCuH_VpCFIDT%aG9^F%-XPh}Qe3R?Hj@NFQw0fZ3Runf-JU#CG5U4XK1( zlxWU}v(1b2t0*Zg8vhFF`_ntqbhYubCWKJ_bAr5MAs6Vtz`%zOADjgB!L)#?<{qA& zllShP85t^M|AhVIU_MqPa6;XZ6@+ghzhTMuKNi|YdBQ6<0j`mN?mrWZhg8{+*H1-7 zW#XtcRJx@h6Op`jSt%mzac*LCd_23M%YmR85yE;KfT*QoYLNWOS0C^5A1lorBki?l z%2M#ino{WJk&mTR z;?-|JH;|bt>_CCo$yr?71_;w>6tTCMnYlTDVLzM%AwUubX9fLn{!68K&{Wzt>I&0r zUV$W=B2opW5B$ruIAW0I)q|!zP^}%W6vwgt=>!?1mQE%;cUb66j`wpG6&e4j9bH&N za?(tf$80d%(lHHJKCG(lpxwtbfX~amJwHPTb1EYf_yI4&XuzF!rf=1{Au9~u?*dJs zsoX@{L)*B!+K%5gja!zN6B8)}xt5L6JS-3GZz9;fWmv!zgQ+EuCg2L-dPMLjBJKHg zA1A^14V1oV1w*d#edGHoD(w*O30e}PVN>Ay0Ve5y0BHvY={Bx#-@uDRWa|lVulS(G zm;ouGv$8CaeS4>QTDd8iu_d0L_wlb~u2xkIgE5&ib!RyY(EQ+KtcpAw!DG-m7@TLS z)6=Bnkqp>~uRamW`&NnJT+;p81Xd11W4_UZ=C!Rdax%?LO<{S~uG+u!!xE+Rw zmy6z=G-E5?7#K@J--FaSk(^HiNY;?85uBuhdW|5BAvFrfOX`8LP+fE6|thu5tvx7wp zvJ?FzhaFMBfFf49In9|sD`;ZTUVFpV{$!TH)8)_f zoOS~!&)*c45ry|prH41|;-b*t!f7T0p9;e2>o};g0Bw*_eH8sDt2^%vrw2j&)>N$7 zJLNv9#Y@lL&NfZX@@DI^4JRG6!^^n((9>JUg<&beRjj!~@{F2UCc!A#1fk)5NAs3F z+tzz?^e%zr+m}VyA6DHv>LL$xF>+#hIy8Vbg@^z)BC-y~1TmyR)lMzrd|2nt!eZiK zmYD=KH#HCKdGo{f^gw~nk8gN%yPI2Lat<23mZB%;G`wlJXWZ12kDWzetZ1uLJ4H~- zv!&_Pm2y?`M{hfWd)tc|KMS&xnJV4Q8_`RXoF(rwEat)xf#rS?mq-|f(~ic13on#? zT=VUF-KmI_$J8CEoA1p0F;0% z7b(0-1$CgRqJl)cjZzurdX3VF$0?W>y^EIpBPvjm$@v0-L+JK1pOx{we*_$d(BCDAvLxzwt4tm8cF z8Z%^6jQ{R6IP91OWEvG&cGFg^=lk`9B!$ZOBjRGS=Wd!rSe&fQ4vd=C&yp?(n`kn$ zVUY36ooli3Fxibpa=hu~x?!J<6 zdqR8eA!?q2Fgi9J?KOT?%*d#{rlHRZ1^)Ole!srGvA5_3D5^HoOu?J!c+Gx}!gdfF zN1;iX$8w~=;5EY%y2%1weycvI4yu`fokB~3X|nQ=nJK;D-h$lm2d$#vE?mk^<-88+ z1{X+Icb2BRF4sz0^Vrgzw$-Pjt)^Tgh-4^kJT~YraMsr!{DbRM*E3l`^Ev77cDW}&)_c-~ z;XOue;n5*8gP3IH@l$!}EV|o|I`BiqdgOywfEW;I<@kKxb1@*RaJfEjusIGV0>PVO zbC6MLvFrDBMnNWgKfe$Ci5~VT zPhDfPjuzHZ9{Wwy(-AG$a3;*$pQZr&nCM#S2Vsdh@;f9_>0WA$1E>ualh&jJ!Mp>GHZ#N8Co!KWL-7u&`WK7Bl7{I#A`) zkY%ZN5JdpHv^p7z*hm_TOd%m5d`-Wr#a8?nM8fi9TxT+$LMA4g#)11jCE3P3BhU4% z#*wl2qF`Bs@QJSXqfru^q`ehA*A{fBlYXgnZghc#XUBZiVYn7JF7k7*!FUUn8LLqOCzHqa?5|q zxhoQugB!0k-NnKRd#TCYC`0G@JnfXa&DH)0E^YgptKWHeq7=`)@08kn6MICdkZ-f! zerU5ZP;T2eGKbBJZYH?+AwdJvE8+TXVswrA&HiR4_sI8T#MQEHo`F7Dp!UdAH+&Vp zx-%HF9FkWXHZ%~HtT36y+{|*{{^;C#`jb`4-5u5O8KuOu z>}B&8H)Ys0l5~l1ex`jd_f&MRRck;wq9D>DNT1DC)7*SqB<91bv&-oc0x!T@&AL10 z5%VFY?g$0IQ{n+VE;5{ZRe3CI!x1~TRWd7-nrGp+!zLc^+)jfUKiy5C&ZpRRym~Qh zunbEvP8ttbj;h#Mv$MTITz;uiOUophJs{t_VRNyKdA=ba^Z)R7W6Il%lU9aY-hS)P?zx z53{EE^!7~I)n=yCQ`b*35c31C%Hd)cwP&$SF*@#Jp>~k^BQE0w9_!Ap=+*hQHnf!ZA3daj~_ zf-g5E;Wg#P0UP!>vS$l*wvKP*Y=Nh-_FJ>QJk%aI)FS@ggisP_3ET8Ou+zt?g2>{> z(z#vMMtf&QzSF;hou^T=Pp*#_)rks?$GYFKuH&;Y8>^&T^}K33Lx$w7(peRg%8YQK zYb(gbAte0Q=Ts~cre0~XJ47i;3TqF~O%W=l#um0mDm=$VF7OlC4u;|UM>2s+*ZsZv zrGT5MIdqXLcbu&|3+3(5ulFKp;zVOV-Ha|hFjz<~b4}ImyZ;znoUYr?u|}j$1I5YM zhc=C)3OhRbC1^N;l<=8Uqm-l1T=39p@0GVRz1hB4ovDi&YCtvv8kOG6hY}$+Ai_n; zpEvYSZv4Eym0>%s`py&kb;C5K-(O|wvGsf$vn?Si6m4x~Ck0aqa#Rsxb%Z_QsmZ?= z^=1H;h`6iBOc&A_+4e&?!x2NGACXrVAbe%BJ?*VZP*q4>OAE)&?31>H^)JHiFLjR@Y(U3B*} z7~IV)ci`Gjn~M=${CcWgA+;;ww(AEHDS89F^<@5!;j%0~r1(4*y?3=sog6j#8l`Wc z&2SV=1p8`3@5;Sj8%S0<@u6-{VDm`25YnMG;bn0x70+tI$YAgLU-`B$D6uwg_%1Epc&QG^&a9*tsobto3ZyDNbf_^l7 z?t)cUQMBNR0xZTLI`iOYbxGD8eLI$6c$<3~?eMZ+F%2D(VfM6SswJQu2cB1?O*xw~ z3!a|Tjj5q?TA#C+x61slWzDckxjavSVax@eES0r zgWYT1DU1%&#_nNP9_0}`X3uI3=j?q%pOTH=@;_lLv>JmcL=-Ft{*|?~^k>EovNr0o zPQS$~tP8AC3_p--aPg_reI-KO|MRDUv4-(&Vv+4X%dr5vL6}WIh^$bAhGydgwq^6_ zD=BZks0VP60u&pDkki1h*Zu>Z>I8i#*JgV$ddM@D$7aI99%)F8!ErK&N52lcjwGJK z$EgoNDXQ1_5IkKjt|Py}4gsvW#Ol?AzM)I;76Pm2G6(Z&?_3~a+760bkxLl;HIfk@ ztRk{2*yV^)&97MO_Y98_*byi&&Pw}6%A`;dx1~j~vlgsWS|>llFHpHyiqz|mXUH*| zHxdI{;r8+yUa(o?)1y;GD&}qrGPo-WaKly>huVB%11j^{~@pmhr6F=Y7 zYCsK#F{R2IHWqxYKA$(KlqHV5mBX+8&XL0sOz+0G)je-M%RuGMu*Rs^?41yv*o;3y zh0Ez5Rh1a#ydVe*f9uEWc)&mUmyy&Qn3x)ZpIykxeedULtHFr}r;2vXvd_mmN?W@P zIBhPG>#B%{uN7>I@p>LS{x=C^ z&vn$D>ejv-o^&HlF&|NYasBzZig{mE`JN+({+W9GCR|^Wr>$r!hL;5w-D3Q5QDHt` zJfG>+gVF+eh(*0pMDd&JDUSqE5Q z!VXh4iO4bv9;7K-pURgtT5l@BSwE$rWb&E;cZD#%_GU(xB+yy*DcL{z87cKv!1pZoF zYRGTQ{h2JYX>zf5=Ah>65)TJ)qNm62P6IW0L)s~x+yHtgA99j%ll~s}i%xvzXlqO! zL!JT+)oqvNH(X%e7dxCZ`^GaJB+%N5^fLZY)9e$yl*+D&LGF8g(UnbMRFEMK5~%j7 zSmT0N!%Bs`hKGa~L!$)gh1g`P&Kz0)3~=J4u0VdClt>BrI3Wj{=ALPjggm*_j-N&G zCI1CgUH-X)CHt9I`I`IA4a=?U_m+29GCgDll<6EbINjGd{vPsE9HuWAuP}co>PL>~ z+eZ$FW6=M2(H?o)j`ah)k5`~ie;%KNc!!>qgG^KhAM?OTbdY5E;LigHo(^)mZlr{7 zJ(N8h79L(V>;&F)A|fJeY_hu+aa+LlQ`jHi(9x8l18lxPTx*bbMo@_O92Pz&y0O#TLF%Twk zL)FFI3@||= zAzm#gxig_yc_c30T>$@PCId7NeFahv+X6O<(5v$+u41I|dkW5O(pi}=$It8ru2e=K zBp3$HO7+$Z+m|`}WeR+;y4RuYoOMCPHRUtMv*o>t>tr(I1SF#3SK7@W@+x{AdOw?? zTV3pUWn|;S-ZBYbAC5-^(V=|v+!wu|Hj%uf=yNUE>?T^*L+%tF9vcXpn!vEvwk=fW zy>t8adoP|1Wea-Rd)W+E0@xq!9#4$>E9ltv!Q82w~0y+BT8bhQXl& z5#$xt&s}w>1d;^Fl`?5V=xG_Il-=KtNd51jT~19+b#-&|TJ6$2s|tg^w&RaAW-rJU zJVcYh%`O64b0#y0+wZ>{L6U1A8t_nVG6(z6a;XH9TVtmOj|TQp5TseX6DW}p{PlVh zDYq_q)hHH33Lnp;5jE~XZ2bH^5X0sgDrN9k+?DoW@TKudv*Rz91+mU*`cSGQQN-OD zX3>wBb`P>FHU$OYwufL6`dXL&tPd-|Mb!u4b&zod>L~Aasw%QWY&I-+IHktYErMvE zbnBAe-`(4S?%mp1YT|?pl;H7zJdrk@L5FuW9uhR68`+Rm&|7SBdK$Sth&X&s6D~LU z!KD#=7#M{6Bk4AX&f&lD@G>s^y*Wad_o=`4Q9SQPT!84&_5W=$vVVfCly)ja@WL-# OOKAxO@!b1H&;JJ!hnGG8 literal 0 HcmV?d00001 diff --git a/app/domain/factories/images/factory-create-request.png b/app/domain/factories/images/factory-create-request.png new file mode 100644 index 0000000000000000000000000000000000000000..d27a669fa7512507dcb1f1b48e5e328a53881617 GIT binary patch literal 108786 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

=EjbU8|)qT$-ht`mu!!_t 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

uil=| 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 W#?lTvu-a@;6ul~S<;|Zu_x=xo@MjJH literal 0 HcmV?d00001 diff --git a/app/domain/factories/images/factory-info-request.png b/app/domain/factories/images/factory-info-request.png new file mode 100644 index 0000000000000000000000000000000000000000..bceab0368c425bc9e91efcea5c3438a3a24e3e3a GIT binary patch literal 37919 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 AH2?qr literal 0 HcmV?d00001 diff --git a/app/domain/factories/images/factory-list-request.png b/app/domain/factories/images/factory-list-request.png new file mode 100644 index 0000000000000000000000000000000000000000..9559793b65375aadc52a16cf0f38bbea4dad3eb6 GIT binary patch literal 35335 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 aLyrWPF?k&K1b&kip{=QZrdZwT*8c!7{JFXS literal 0 HcmV?d00001 diff --git a/app/domain/factories/images/factory-upgrade.png b/app/domain/factories/images/factory-upgrade.png new file mode 100644 index 0000000000000000000000000000000000000000..05e0f50bfb1937e53e4cdebb504f0381ac13e0fb GIT binary patch literal 22225 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 e + @failure.new("Required template variable '#{e.name}' is missing") + rescue => e + # Need to add tests to understand what exceptions are thrown when + # variables are missing. This may not be enough. + @failure.new(e) + end + end +end diff --git a/app/domain/responses.rb b/app/domain/responses.rb new file mode 100644 index 0000000000..4fc9948f17 --- /dev/null +++ b/app/domain/responses.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +# These response objects provide a mechanism for passing more complex response +# information upstream + +# Responsible for handling "successful" requests. The +# response is returned via the `.result` method. +class SuccessResponse + attr_reader :result + + def initialize(result) + @result = result + end + + def success? + true + end + + # The result of bind should always be another Response object, if the current + # response object is successful, #bind will call the next operation + def bind(&_block) + yield(result) + end +end + +# Responsible for handling "failed" requests. +# Log level and Response code are both option. +class FailureResponse + attr_reader :message, :status + + def initialize(message, level: :warn, status: :unauthorized) + @message = message + @level = level + @status = status + end + + def success? + false + end + + def level + @level.to_sym + end + + def to_s + @message.to_s + end + + # If the current response is a failure, further attempts to bind will just + # return this response again. + def bind + self + end +end diff --git a/app/presenters/policy_factories/error.rb b/app/presenters/policy_factories/error.rb new file mode 100644 index 0000000000..ed84a45ca0 --- /dev/null +++ b/app/presenters/policy_factories/error.rb @@ -0,0 +1,28 @@ +module Presenter + module PolicyFactories + # Returns a Hash representation of an Failure Response to be used by the controller + class Error + # Response is always a FailureResponse + def initialize(response:, response_codes: HTTP::Response::Status::SYMBOL_CODES) + @response = response + @response_codes = response_codes + end + + def present + { + code: @response_codes[@response.status] + }.tap do |rtn| + rtn[:error] = format_error_message(@response.message) + end + end + + private + + def format_error_message(message) + return message if message.is_a?(Array) || message.is_a?(Hash) + + { message: message.to_s } + end + end + end +end diff --git a/app/presenters/policy_factories/index.rb b/app/presenters/policy_factories/index.rb new file mode 100644 index 0000000000..36fea65755 --- /dev/null +++ b/app/presenters/policy_factories/index.rb @@ -0,0 +1,35 @@ +module Presenter + module PolicyFactories + # returns a Hash representation to be used by the controller + class Index + def initialize(factories:) + @factories = factories + end + + def present + {}.tap do |rtn| + @factories + .group_by(&:classification) + .sort_by {|classification, _| classification } + .map do |classification, factories| + rtn[classification] = factories + .map { |factory| factory_to_hash(factory) } + .sort { |x, y| x[:name] <=> y[:name] } + end + end + end + + private + + def factory_to_hash(factory) + { + name: factory.name, + namespace: factory.classification, + 'full-name': "#{factory.classification}/#{factory.name}", + 'current-version': factory.version, + description: factory.description || '' + } + end + end + end +end diff --git a/app/presenters/policy_factories/show.rb b/app/presenters/policy_factories/show.rb new file mode 100644 index 0000000000..1bfdcd2f00 --- /dev/null +++ b/app/presenters/policy_factories/show.rb @@ -0,0 +1,20 @@ +module Presenter + module PolicyFactories + # returns a hash representation to be used by the controller + class Show + def initialize(factory:) + @factory = factory + end + + def present + { + title: @factory.schema['title'], + version: @factory.version, + description: @factory.schema['description'], + properties: @factory.schema['properties'], + required: @factory.schema['required'] + } + end + end + end +end diff --git a/config/routes.rb b/config/routes.rb index e1f4db4a66..702ed3277e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -51,6 +51,11 @@ def matches?(request) post '/authn-k8s/:service_id/inject_client_cert' => 'authenticate#k8s_inject_client_cert' end + # Factories + post "/factories/:account/:kind/(:version)/:id" => "policy_factories#create" + get "/factories/:account/:kind/(:version)/:id" => "policy_factories#show" + get "/factories/:account" => "policy_factories#index" + get "/roles/:account/:kind/*identifier" => "roles#graph", :constraints => QueryParameterActionRecognizer.new("graph") get "/roles/:account/:kind/*identifier" => "roles#all_memberships", :constraints => QueryParameterActionRecognizer.new("all") get "/roles/:account/:kind/*identifier" => "roles#direct_memberships", :constraints => QueryParameterActionRecognizer.new("memberships") diff --git a/lib/tasks/policy_factory.rake b/lib/tasks/policy_factory.rake new file mode 100644 index 0000000000..2f726cb7d2 --- /dev/null +++ b/lib/tasks/policy_factory.rake @@ -0,0 +1,70 @@ +# frozen_string_literal: true + +module Factory + module Templates + class ValidateTemplate + def initialize(renderer: Factories::RenderPolicy.new) + @renderer = renderer + end + + def test(factory:, template_params:) + puts('template:') + puts(factory.policy_template) + puts('--------------') + puts('') + puts('rendered template:') + puts(@renderer.render(policy_template: factory.policy_template, variables: template_params)) + + # puts(ERB.new(@factory.policy_template, nil, '-').result_with_hash(args)) + end + end + end +end + +namespace :policy_factory do + def api_key + return ENV['CONJUR_AUTHN_API_KEY'] if ENV.key?('CONJUR_AUTHN_API_KEY') + + raise 'Conjur `admin` user API key must be provided via `CONJUR_AUTHN_API_KEY` environment variable' + end + + def client + @client ||= begin + Conjur.configuration.account = 'cucumber' + Conjur.configuration.appliance_url = 'http://localhost:3000/' + Conjur::API.new_from_key('admin', api_key) + end + end + + task test: :environment do + binding.pry + # tester = Factories::Templates::ValidateTemplate.new + # tester.test( + # factory: Factories::Templates::Core::Group, + # template_params: { "id"=>"test-group", "branch"=>"root", "annotations"=>{ "one"=>1, "two"=>2, "test/three"=>3 } } + # ) + # tester.test( + # factory: Factories::Templates::Core::Group, + # template_params: { "id"=>"test-group", "branch"=>"root" } + # ) + end + + task load: :environment do + binding.pry + client.load_policy('root', Factories::Templates::Base::V1::BasePolicy.policy) + client.resource('cucumber:variable:conjur/factories/core/v1/group').add_value(Factories::Templates::Core::V1::Group.data) + client.resource('cucumber:variable:conjur/factories/core/v1/managed-policy').add_value(Factories::Templates::Core::V1::ManagedPolicy.data) + client.resource('cucumber:variable:conjur/factories/core/v1/policy').add_value(Factories::Templates::Core::V1::Policy.data) + client.resource('cucumber:variable:conjur/factories/core/v1/user').add_value(Factories::Templates::Core::V1::User.data) + client.resource('cucumber:variable:conjur/factories/authenticators/v1/authn-oidc').add_value(Factories::Templates::Authenticators::V1::AuthnOidc.data) + client.resource('cucumber:variable:conjur/factories/connections/v1/database').add_value(Factories::Templates::Connections::V1::Database.data) + end + + task retrieve_auth_token: :environment do + url = 'http://localhost:3000/' + username = 'admin' + + response = RestClient.post("#{url}/authn/cucumber/#{username}/authenticate", api_key, 'Accept-Encoding' => 'base64') + puts response.body + end +end diff --git a/spec/app/db/repository/policy_factory_repository_spec.rb b/spec/app/db/repository/policy_factory_repository_spec.rb new file mode 100644 index 0000000000..df89cf4be5 --- /dev/null +++ b/spec/app/db/repository/policy_factory_repository_spec.rb @@ -0,0 +1,421 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe(DB::Repository::PolicyFactoryRepository) do + # Ensure the variables below have not been set in previous tests + before(:all) do + ::Resource['rspec:variable:conjur/factories/core/v1/group']&.destroy + ::Resource['rspec:variable:conjur/factories/core/v1/user']&.destroy + end + subject { DB::Repository::PolicyFactoryRepository.new } + + describe 'find_all' do + context 'when no factories exist' do + before(:each) do + ::Role.create(role_id: 'rspec:group:conjur/policy-factory-users') + end + after(:each) do + ::Role['rspec:group:conjur/policy-factory-users'].destroy + end + it 'returns an error' do + response = subject.find_all( + account: 'foo-bar', + role: ::Role['rspec:group:conjur/policy-factory-users'] + ) + expect(response.success?).to eq(false) + expect(response.status).to eq(:forbidden) + expect(response.message).to eq('Role does not have permission to use Factories') + end + end + + context 'when factories exist' do + let(:role_id) { 'rspec:group:conjur/policy-factory-users' } + let(:owner_id) { role_id } + let(:factory1) { 'rspec:variable:conjur/factories/core/v1/group' } + let(:factory2) { 'rspec:variable:conjur/factories/core/v1/user' } + + before(:each) do + ::Role.create(role_id: role_id) + end + after(:each) do + ::Role[role_id].destroy + end + + context 'when role does not have execute permission on any factories' do + let(:owner_id) { 'rspec:group:admin' } + before(:each) do + ::Role.create(role_id: owner_id) + ::Resource.create(resource_id: factory1, owner_id: owner_id) + ::Secret.create( + resource_id: factory1, + value: Factories::Templates::Core::V1::Group.data + ) + ::Resource.create(resource_id: factory2, owner_id: owner_id) + ::Secret.create( + resource_id: factory2, + value: Factories::Templates::Core::V1::User.data + ) + end + after(:each) do + ::Resource[factory1].destroy + ::Resource[factory2].destroy + ::Role[owner_id].destroy + end + it 'returns an error' do + response = subject.find_all( + account: 'rspec', + role: ::Role[role_id] + ) + expect(response.success?).to eq(false) + expect(response.status).to eq(:forbidden) + expect(response.message).to eq('Role does not have permission to use Factories') + end + end + context 'when role has execute permission on some factories' do + let(:owner_id) { 'rspec:group:admin' } + before(:each) do + ::Role.create(role_id: owner_id) + ::Resource.create(resource_id: factory1, owner_id: role_id) + ::Secret.create( + resource_id: factory1, + value: Factories::Templates::Core::V1::Group.data + ) + ::Resource.create(resource_id: factory2, owner_id: owner_id) + ::Secret.create( + resource_id: factory2, + value: Factories::Templates::Core::V1::User.data + ) + end + after(:each) do + ::Resource[factory1].destroy + ::Resource[factory2].destroy + ::Role[owner_id].destroy + end + it 'returns permitted factories' do + response = subject.find_all( + account: 'rspec', + role: ::Role[role_id] + ) + expect(response.success?).to eq(true) + expect(response.result.count).to eq(1) + expect(response.result.first.name).to eq('group') + expect(response.result.first.description).to eq('Creates a Conjur Group') + end + end + context 'when role has execute permission on all factories' do + before(:each) do + ::Resource.create(resource_id: factory1, owner_id: role_id) + ::Secret.create( + resource_id: factory1, + value: Factories::Templates::Core::V1::Group.data + ) + ::Resource.create(resource_id: factory2, owner_id: role_id) + ::Secret.create( + resource_id: factory2, + value: Factories::Templates::Core::V1::User.data + ) + end + after(:each) do + ::Resource[factory1].destroy + ::Resource[factory2].destroy + end + it 'returns all factories' do + response = subject.find_all( + account: 'rspec', + role: ::Role[role_id] + ) + expect(response.success?).to eq(true) + expect(response.result.count).to eq(2) + expect(response.result.map(&:name)).to include('group') + expect(response.result.map(&:name)).to include('user') + end + end + context 'when multiple versions of a factory exist' do + let(:factory1) { 'rspec:variable:conjur/factories/core/v1/group' } + let(:factory2) { 'rspec:variable:conjur/factories/core/v2/group' } + before(:each) do + ::Resource.create(resource_id: factory1, owner_id: role_id) + ::Secret.create( + resource_id: factory1, + value: Factories::Templates::Core::V1::Group.data + ) + ::Resource.create(resource_id: factory2, owner_id: role_id) + ::Secret.create( + resource_id: factory2, + value: Factories::Templates::Core::V1::Group.data + ) + end + after(:each) do + ::Resource[factory1].destroy + ::Resource[factory2].destroy + end + it 'returns the latest version' do + response = subject.find_all( + account: 'rspec', + role: ::Role[role_id] + ) + expect(response.success?).to eq(true) + expect(response.result.count).to eq(1) + expect(response.result.first.version).to eq('v2') + end + context 'when there are more than 10 factory versions' do + let(:factory1) { 'rspec:variable:conjur/factories/core/v9/group' } + let(:factory2) { 'rspec:variable:conjur/factories/core/v10/group' } + it 'returns the latest version' do + response = subject.find_all( + account: 'rspec', + role: ::Role[role_id] + ) + expect(response.success?).to eq(true) + expect(response.result.count).to eq(1) + expect(response.result.first.version).to eq('v10') + end + end + end + context 'when some factories are empty' do + before(:each) do + ::Resource.create(resource_id: factory1, owner_id: role_id) + ::Resource.create(resource_id: factory2, owner_id: role_id) + ::Secret.create( + resource_id: factory2, + value: Factories::Templates::Core::V1::User.data + ) + end + after(:each) do + ::Resource[factory1].destroy + ::Resource[factory2].destroy + end + it 'does not return empty factories' do + response = subject.find_all( + account: 'rspec', + role: ::Role[role_id] + ) + expect(response.success?).to eq(true) + expect(response.result.count).to eq(1) + expect(response.result.first.name).to eq('user') + end + end + context 'when all factories are empty' do + # TODO: this error is a bit weird... I'd expect a specific error if no factories were configured. + before(:each) do + ::Resource.create(resource_id: factory1, owner_id: role_id) + ::Resource.create(resource_id: factory2, owner_id: role_id) + end + after(:each) do + ::Resource[factory1].destroy + ::Resource[factory2].destroy + end + it 'does not return any factories' do + response = subject.find_all( + account: 'rspec', + role: ::Role[role_id] + ) + expect(response.success?).to eq(false) + expect(response.status).to eq(:forbidden) + expect(response.message).to eq('Role does not have permission to use Factories') + end + end + end + end + + describe '.find' do + context 'when factory does not exist' do + before(:each) do + ::Role.create(role_id: 'rspec:group:conjur/policy-factory-users') + end + after(:each) do + ::Role['rspec:group:conjur/policy-factory-users'].destroy + end + it 'returns an error' do + response = subject.find( + kind: 'foo', + id: 'bar', + account: 'foo-bar', + role: ::Role['rspec:group:conjur/policy-factory-users'] + ) + expect(response.success?).to eq(false) + expect(response.status).to eq(:not_found) + expect(response.message).to include( + { + resource: 'foo/v1/bar', + message: 'Requested Policy Factory does not exist' + } + ) + end + end + context 'when factory exists' do + context 'when requesting role does not have permission' do + let(:role_id) { 'rspec:group:conjur/policy-factory-users' } + let(:resource_id) { 'rspec:variable:conjur/factories/core/v1/group' } + before(:each) do + ::Role.create(role_id: role_id) + admin = ::Role.create(role_id: 'rspec:user:policy_admin') + ::Resource.create(resource_id: resource_id, owner: admin) + end + after(:each) do + ::Role[role_id].destroy + ::Resource[resource_id].destroy + ::Role['rspec:user:policy_admin'].destroy + end + it 'returns an error' do + response = subject.find( + kind: 'core', + id: 'group', + account: 'rspec', + role: ::Role[role_id] + ) + expect(response.success?).to eq(false) + expect(response.status).to eq(:forbidden) + expect(response.message).to include( + { + resource: 'core/v1/group', + message: 'Requested Policy Factory is not available' + } + ) + end + end + context 'when factory is empty' do + let(:role_id) { 'rspec:group:conjur/policy-factory-users' } + let(:resource_id) { 'rspec:variable:conjur/factories/core/v1/group' } + before(:each) do + ::Role.create(role_id: role_id) + ::Resource.create(resource_id: resource_id, owner_id: role_id) + end + after(:each) do + ::Resource[resource_id].destroy + ::Role[role_id].destroy + end + it 'returns an error' do + response = subject.find( + kind: 'core', + id: 'group', + account: 'rspec', + role: ::Role[role_id] + ) + expect(response.success?).to eq(false) + expect(response.status).to eq(:bad_request) + expect(response.message).to include( + { + resource: 'core/v1/group', + message: 'Requested Policy Factory is not available' + } + ) + end + end + context 'requesting role has permission' do + let(:role_id) { 'rspec:group:conjur/policy-factory-users' } + let(:resource_id) { 'rspec:variable:conjur/factories/core/v1/group' } + before(:each) do + ::Role.create(role_id: role_id) + ::Resource.create(resource_id: resource_id, owner_id: role_id) + ::Secret.create( + resource_id: resource_id, + value: Factories::Templates::Core::V1::Group.data + ) + end + after(:each) do + ::Resource[resource_id].destroy + ::Role[role_id].destroy + end + it 'returns the policy factory' do + response = subject.find( + kind: 'core', + id: 'group', + account: 'rspec', + role: ::Role[role_id] + ) + expect(response.success?).to eq(true) + expect(response.result.class).to eq(DB::Repository::DataObjects::PolicyFactory) + expect(response.result.name).to eq('group') + end + context 'when description attribute is missing' do + before(:each) do + data = Factories::Templates::Core::V1::Group.data + decoded_data = JSON.parse(Base64.decode64(data)) + decoded_data['schema'].delete('description') + + ::Secret.create( + resource_id: resource_id, + value: Base64.encode64(decoded_data.to_json) + ) + end + it 'includes an empty description' do + response = subject.find( + kind: 'core', + id: 'group', + account: 'rspec', + role: ::Role[role_id] + ) + expect(response.success?).to eq(true) + expect(response.result.description).to eq('') + end + end + end + context 'when multiple versions exist' do + let(:owner_id) { 'rspec:group:conjur/policy-factory-users' } + let(:version1) { 'rspec:variable:conjur/factories/core/v1/group' } + let(:version2) { 'rspec:variable:conjur/factories/core/v2/group' } + before(:each) do + ::Role.create(role_id: owner_id) + ::Resource.create(resource_id: version1, owner_id: owner_id) + ::Secret.create( + resource_id: version1, + value: Factories::Templates::Core::V1::Group.data + ) + ::Resource.create(resource_id: version2, owner_id: owner_id) + ::Secret.create( + resource_id: version2, + value: Factories::Templates::Core::V1::Group.data + ) + end + after(:each) do + ::Resource[version1].destroy + ::Resource[version2].destroy + ::Role[owner_id].destroy + end + context 'when no version is provided' do + it 'returns the latest version' do + response = subject.find( + kind: 'core', + id: 'group', + account: 'rspec', + role: ::Role[owner_id] + ) + expect(response.success?).to eq(true) + expect(response.result.version).to eq('v2') + end + end + context 'when a version is provided' do + it 'returns the requested version' do + response = subject.find( + kind: 'core', + id: 'group', + account: 'rspec', + role: ::Role[owner_id], + version: 'v1' + ) + expect(response.success?).to eq(true) + expect(response.result.version).to eq('v1') + end + end + + context 'when there are more than 10 factory versions' do + let(:version1) { 'rspec:variable:conjur/factories/core/v9/group' } + let(:version2) { 'rspec:variable:conjur/factories/core/v10/group' } + it 'returns the latest version' do + response = subject.find( + kind: 'core', + id: 'group', + account: 'rspec', + role: ::Role[owner_id] + ) + expect(response.success?).to eq(true) + expect(response.result.version).to eq('v10') + end + end + + end + end + end +end diff --git a/spec/app/domain/factories/create_from_policy_factory_spec.rb b/spec/app/domain/factories/create_from_policy_factory_spec.rb new file mode 100644 index 0000000000..f2ac6bd029 --- /dev/null +++ b/spec/app/domain/factories/create_from_policy_factory_spec.rb @@ -0,0 +1,397 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe(Factories::CreateFromPolicyFactory) do + let(:rest_client) { spy(RestClient) } + subject do + Factories::CreateFromPolicyFactory + .new(http: rest_client) + .call( + factory_template: factory_template, + request_body: request, + account: 'rspec', + authorization: 'foo-bar' + ) + end + + describe('.call') do + context 'when using a simple factory' do + let(:factory_template) do + decoded_factory = JSON.parse(Base64.decode64(Factories::Templates::Core::V1::User.data)) + DB::Repository::DataObjects::PolicyFactory.new( + schema: decoded_factory['schema'], + policy: Base64.decode64(decoded_factory['policy']), + policy_branch: decoded_factory['policy_branch'] + ) + end + context 'when request is invalid' do + context 'when request body is missing' do + let(:request) { nil } + it 'returns a failure response' do + expect(subject.success?).to be(false) + expect(subject.message).to eq('Request body must be JSON') + expect(subject.status).to eq(:bad_request) + end + end + context 'when request body is empty' do + let(:request) { '' } + it 'returns a failure response' do + expect(subject.success?).to be(false) + expect(subject.message).to eq('Request body must be JSON') + expect(subject.status).to eq(:bad_request) + end + end + context 'when request body is malformed JSON' do + let(:request) { '{"foo": "bar }' } + it 'returns a failure response' do + expect(subject.success?).to be(false) + expect(subject.message).to eq('Request body must be valid JSON') + expect(subject.status).to eq(:bad_request) + end + end + context 'when request body is missing keys' do + let(:request) { { id: 'foo' }.to_json } + it 'returns a failure response' do + expect(subject.success?).to be(false) + expect(subject.message).to eq([{ message: "A value is required for 'branch'", key: 'branch' }]) + expect(subject.status).to eq(:bad_request) + end + end + context 'when request body is missing values' do + let(:request) { { id: '', branch: 'foo' }.to_json } + it 'returns a failure response' do + expect(subject.success?).to be(false) + expect(subject.message).to eq([{ message: "A value is required for 'id'", key: 'id' }]) + expect(subject.status).to eq(:bad_request) + end + end + context 'when the request body includes invalid values' do + let(:request) { { id: 'foo%', branch: 'b@r' }.to_json } + it 'submits the expected policy to Conjur with invalid characters removed' do + expect(subject.success?).to be(true) + expect(rest_client).to have_received(:post).with('http://localhost:3000/policies/rspec/policy/br', "- !user\n id: foo\n annotations:\n factory: core/v1/user\n", { 'Authorization' => 'foo-bar' }) + end + end + context 'when request body is valid' do + let(:request) { { id: 'foo', branch: 'bar' }.to_json } + it 'submits the expected policy to Conjur' do + expect(subject.success?).to be(true) + expect(rest_client).to have_received(:post).with('http://localhost:3000/policies/rspec/policy/bar', "- !user\n id: foo\n annotations:\n factory: core/v1/user\n", { 'Authorization' => 'foo-bar' }) + end + context 'when inputs include a hash (ex. for annotations)' do + let(:request) { { id: 'foo', branch: 'bar', annotations: { 'foo' => 'bar', 'bing' => 'bang' } }.to_json } + it 'submits the expected policy to Conjur' do + expect(subject.success?).to be(true) + expect(rest_client).to have_received(:post).with('http://localhost:3000/policies/rspec/policy/bar', "- !user\n id: foo\n annotations:\n factory: core/v1/user\n foo: bar\n bing: bang\n", { 'Authorization' => 'foo-bar' }) + end + end + context 'when the Conjur API returns an error' do + context 'when credentials are invalid' do + it 'returns a failure response' do + allow(rest_client).to receive(:post).and_raise( + RestClient::BadRequest.new( + double(RestClient::Response, code: 401, body: 'foo') + ) + ) + + expect(subject.success?).to be(false) + expect(subject.message[:message]).to eq('Authentication failed') + expect(subject.status).to eq(:unauthorized) + end + end + context 'when role is not permitted to apply the policy' do + it 'returns a failure response' do + allow(rest_client).to receive(:post).and_raise( + RestClient::BadRequest.new( + double(RestClient::Response, code: 403, body: 'foo') + ) + ) + + expect(subject.success?).to be(false) + expect(subject.message).to include({ + message: "Applying generated policy to 'bar' is not allowed", + request_error: 'foo' + }) + expect(subject.status).to eq(:forbidden) + end + end + context 'when policy refers to invalid roles or resources' do + it 'returns a failure response' do + allow(rest_client).to receive(:post).and_raise( + RestClient::BadRequest.new( + double(RestClient::Response, code: 404, body: 'foo') + ) + ) + + expect(subject.success?).to be(false) + expect(subject.message[:message]).to eq("Unable to apply generated policy to 'bar'") + expect(subject.status).to eq(:not_found) + end + end + context 'when policy load is currently in progress' do + it 'returns a failure response' do + allow(rest_client).to receive(:post).and_raise( + RestClient::BadRequest.new( + double(RestClient::Response, code: 409, body: 'foo') + ) + ) + + expect(subject.success?).to be(false) + expect(subject.message[:message]).to eq("Failed to apply generated policy to 'bar'") + expect(subject.status).to eq(:bad_request) + end + end + context 'when a connection timeout error occurs' do + it 'returns a failure response' do + allow(rest_client).to receive(:post).and_raise( + RestClient::ServerBrokeConnection.new + ) + + expect(subject.success?).to be(false) + expect(subject.message[:message]).to eq("Failed to apply generated policy to 'bar'") + expect(subject.status).to eq(:bad_request) + end + end + end + end + end + end + context 'when using a complex factory' do + let(:factory_template) do + decoded_factory = JSON.parse(Base64.decode64(Factories::Templates::Connections::V1::Database.data)) + DB::Repository::DataObjects::PolicyFactory.new( + schema: decoded_factory['schema'], + policy: Base64.decode64(decoded_factory['policy']), + policy_branch: decoded_factory['policy_branch'] + ) + end + let(:request) { { id: 'bar', branch: 'foo', variables: variables }.to_json } + context 'when request body is missing values' do + let(:variables) { { port: '1234', url: 'http://localhost', username: 'super-user' } } + it 'returns a failure response' do + expect(subject.success?).to be(false) + expect(subject.message).to eq([{ message: "A value is required for '/variables/password'", key: '/variables/password' }]) + expect(subject.status).to eq(:bad_request) + end + end + context 'when variable value is not a string' do + context 'when value is an integer' do + let(:variables) { { port: 1234, url: 'http://localhost', username: 'super-user', password: 'foo-bar' } } + it 'returns a failure response' do + expect(subject.success?).to be(false) + expect(subject.message).to eq([{ message: "Validation error: '/variables/port' must be a string" }]) + expect(subject.status).to eq(:bad_request) + end + end + context 'when value is a boolean' do + let(:variables) { { port: true, url: 'http://localhost', username: 'super-user', password: 'foo-bar' } } + it 'returns a failure response' do + expect(subject.success?).to be(false) + expect(subject.message).to eq([{ message: "Validation error: '/variables/port' must be a string" }]) + expect(subject.status).to eq(:bad_request) + end + end + context 'when value is null' do + let(:variables) { { port: nil, url: 'http://localhost', username: 'super-user', password: 'foo-bar' } } + it 'returns a failure response' do + expect(subject.success?).to be(false) + expect(subject.message).to eq([{ message: "Validation error: '/variables/port' must be a string" }]) + expect(subject.status).to eq(:bad_request) + end + end + end + context 'when request body includes required values' do + let(:variables) { { port: '1234', url: 'http://localhost', username: 'super-user', password: 'foo-bar' } } + it 'applies policy and variables' do + allow(rest_client).to receive(:post) + .with( + 'http://localhost:3000/policies/rspec/policy/foo', + "- !policy\n id: bar\n annotations:\n factory: connections/v1/database\n \n body:\n - &variables\n - !variable url\n - !variable port\n - !variable username\n - !variable password\n\n - !group consumers\n - !group administrators\n\n # consumers can read and execute\n - !permit\n resource: *variables\n privileges: [ read, execute ]\n role: !group consumers\n\n # administrators can update (and read and execute, via role grant)\n - !permit\n resource: *variables\n privileges: [ update ]\n role: !group administrators\n\n # administrators has role consumers\n - !grant\n member: !group administrators\n role: !group consumers\n", + { 'Authorization' => 'foo-bar' } + ).and_return( + double(RestClient::Response, code: 201, body: '{"created_roles":{},"version":13}') + ) + + variables.each do |variable, value| + allow(rest_client).to receive(:post) + .with( + "http://localhost:3000/secrets/rspec/variable/foo%2Fbar%2F#{variable}", + value, + { 'Authorization' => 'foo-bar' } + ).and_return( + double(RestClient::Response, code: 201, body: '') + ) + end + expect(subject.success?).to be(true) + end + end + context 'when request body includes extra variable values' do + let(:variables) { { foo: 'bar', port: '1234', url: 'http://localhost', username: 'super-user', password: 'foo-bar' } } + # let(:request) { { id: 'bar', branch: 'foo', variables: variables }.to_json } + it 'only saves variables defined in the factory' do + allow(rest_client).to receive(:post) + .with( + 'http://localhost:3000/policies/rspec/policy/foo', + "- !policy\n id: bar\n annotations:\n factory: connections/v1/database\n \n body:\n - &variables\n - !variable url\n - !variable port\n - !variable username\n - !variable password\n\n - !group consumers\n - !group administrators\n\n # consumers can read and execute\n - !permit\n resource: *variables\n privileges: [ read, execute ]\n role: !group consumers\n\n # administrators can update (and read and execute, via role grant)\n - !permit\n resource: *variables\n privileges: [ update ]\n role: !group administrators\n\n # administrators has role consumers\n - !grant\n member: !group administrators\n role: !group consumers\n", + { 'Authorization' => 'foo-bar' } + ).and_return( + double(RestClient::Response, code: 201, body: '{"created_roles":{},"version":13}') + ) + + variables.delete(:foo) + variables.each do |variable, value| + allow(rest_client).to receive(:post) + .with( + "http://localhost:3000/secrets/rspec/variable/foo%2Fbar%2F#{variable}", + value, + { 'Authorization' => 'foo-bar' } + ).and_return( + double(RestClient::Response, code: 201, body: '') + ) + end + expect(subject.success?).to be(true) + end + end + context 'when role is not permitted to set variables' do + let(:variables) { { port: '1234', url: 'http://localhost', username: 'super-user', password: 'foo-bar' } } + context 'when role is not authorized' do + it 'applies policy and variables' do + allow(rest_client).to receive(:post) + .with( + 'http://localhost:3000/policies/rspec/policy/foo', + "- !policy\n id: bar\n annotations:\n factory: connections/v1/database\n \n body:\n - &variables\n - !variable url\n - !variable port\n - !variable username\n - !variable password\n\n - !group consumers\n - !group administrators\n\n # consumers can read and execute\n - !permit\n resource: *variables\n privileges: [ read, execute ]\n role: !group consumers\n\n # administrators can update (and read and execute, via role grant)\n - !permit\n resource: *variables\n privileges: [ update ]\n role: !group administrators\n\n # administrators has role consumers\n - !grant\n member: !group administrators\n role: !group consumers\n", + { 'Authorization' => 'foo-bar' } + ).and_return( + double(RestClient::Response, code: 201, body: '{"created_roles":{},"version":13}') + ) + + allow(rest_client).to receive(:post) + .with( + "http://localhost:3000/secrets/rspec/variable/foo%2Fbar%2Furl", + 'http://localhost', + { 'Authorization' => 'foo-bar' } + ).and_raise( + RestClient::BadRequest.new( + double(RestClient::Response, code: 401, body: '') + ) + ) + + expect(subject.success?).to be(false) + expect(subject.message).to eq("Role is unauthorized to set variable: 'secrets/rspec/variable/foo%2Fbar%2Furl'") + expect(subject.status).to eq(:unauthorized) + end + end + context 'when role lacks required privileges' do + it 'applies policy and variables' do + allow(rest_client).to receive(:post) + .with( + 'http://localhost:3000/policies/rspec/policy/foo', + "- !policy\n id: bar\n annotations:\n factory: connections/v1/database\n \n body:\n - &variables\n - !variable url\n - !variable port\n - !variable username\n - !variable password\n\n - !group consumers\n - !group administrators\n\n # consumers can read and execute\n - !permit\n resource: *variables\n privileges: [ read, execute ]\n role: !group consumers\n\n # administrators can update (and read and execute, via role grant)\n - !permit\n resource: *variables\n privileges: [ update ]\n role: !group administrators\n\n # administrators has role consumers\n - !grant\n member: !group administrators\n role: !group consumers\n", + { 'Authorization' => 'foo-bar' } + ).and_return( + double(RestClient::Response, code: 201, body: '{"created_roles":{},"version":13}') + ) + + allow(rest_client).to receive(:post) + .with( + "http://localhost:3000/secrets/rspec/variable/foo%2Fbar%2Furl", + 'http://localhost', + { 'Authorization' => 'foo-bar' } + ).and_raise( + RestClient::BadRequest.new( + double(RestClient::Response, code: 403, body: '') + ) + ) + + expect(subject.success?).to be(false) + expect(subject.message).to eq("Role lacks the privilege to set variable: 'secrets/rspec/variable/foo%2Fbar%2Furl'") + expect(subject.status).to eq(:forbidden) + end + end + context 'when variable is missing' do + it 'fails with an appropriate error' do + allow(rest_client).to receive(:post) + .with( + 'http://localhost:3000/policies/rspec/policy/foo', + "- !policy\n id: bar\n annotations:\n factory: connections/v1/database\n \n body:\n - &variables\n - !variable url\n - !variable port\n - !variable username\n - !variable password\n\n - !group consumers\n - !group administrators\n\n # consumers can read and execute\n - !permit\n resource: *variables\n privileges: [ read, execute ]\n role: !group consumers\n\n # administrators can update (and read and execute, via role grant)\n - !permit\n resource: *variables\n privileges: [ update ]\n role: !group administrators\n\n # administrators has role consumers\n - !grant\n member: !group administrators\n role: !group consumers\n", + { 'Authorization' => 'foo-bar' } + ).and_return( + double(RestClient::Response, code: 201, body: '{"created_roles":{},"version":13}') + ) + + allow(rest_client).to receive(:post) + .with( + "http://localhost:3000/secrets/rspec/variable/foo%2Fbar%2Furl", + 'http://localhost', + { 'Authorization' => 'foo-bar' } + ).and_raise( + RestClient::BadRequest.new( + double(RestClient::Response, code: 404, body: '') + ) + ) + + expect(subject.success?).to be(false) + expect(subject.message).to eq("Failed to set variable: 'secrets/rspec/variable/foo%2Fbar%2Furl'. Status Code: '404', Response: ''") + expect(subject.status).to eq(:bad_request) + end + end + context 'when there is a variable missing' do + it 'applies policy and variables' do + allow(rest_client).to receive(:post) + .with( + 'http://localhost:3000/policies/rspec/policy/foo', + "- !policy\n id: bar\n annotations:\n factory: connections/v1/database\n \n body:\n - &variables\n - !variable url\n - !variable port\n - !variable username\n - !variable password\n\n - !group consumers\n - !group administrators\n\n # consumers can read and execute\n - !permit\n resource: *variables\n privileges: [ read, execute ]\n role: !group consumers\n\n # administrators can update (and read and execute, via role grant)\n - !permit\n resource: *variables\n privileges: [ update ]\n role: !group administrators\n\n # administrators has role consumers\n - !grant\n member: !group administrators\n role: !group consumers\n", + { 'Authorization' => 'foo-bar' } + ).and_return( + double(RestClient::Response, code: 201, body: '{"created_roles":{},"version":13}') + ) + + allow(rest_client).to receive(:post) + .with( + "http://localhost:3000/secrets/rspec/variable/foo%2Fbar%2Furl", + 'http://localhost', + { 'Authorization' => 'foo-bar' } + ).and_raise( + RestClient::BadRequest.new( + double(RestClient::Response, code: 404, body: '') + ) + ) + + expect(subject.success?).to be(false) + expect(subject.message).to eq("Failed to set variable: 'secrets/rspec/variable/foo%2Fbar%2Furl'. Status Code: '404', Response: ''") + expect(subject.status).to eq(:bad_request) + end + end + context 'when there is a timeout attempting to set the secret' do + it 'returns the appropriate error' do + allow(rest_client).to receive(:post) + .with( + 'http://localhost:3000/policies/rspec/policy/foo', + "- !policy\n id: bar\n annotations:\n factory: connections/v1/database\n \n body:\n - &variables\n - !variable url\n - !variable port\n - !variable username\n - !variable password\n\n - !group consumers\n - !group administrators\n\n # consumers can read and execute\n - !permit\n resource: *variables\n privileges: [ read, execute ]\n role: !group consumers\n\n # administrators can update (and read and execute, via role grant)\n - !permit\n resource: *variables\n privileges: [ update ]\n role: !group administrators\n\n # administrators has role consumers\n - !grant\n member: !group administrators\n role: !group consumers\n", + { 'Authorization' => 'foo-bar' } + ).and_return( + double(RestClient::Response, code: 201, body: '{"created_roles":{},"version":13}') + ) + + allow(rest_client).to receive(:post) + .with( + "http://localhost:3000/secrets/rspec/variable/foo%2Fbar%2Furl", + 'http://localhost', + { 'Authorization' => 'foo-bar' } + ).and_raise( + RestClient::ServerBrokeConnection.new + ) + + expect(subject.success?).to be(false) + expect(subject.message).to include({ + message: "Failed set variable 'secrets/rspec/variable/foo%2Fbar%2Furl'", + request_error: 'Server broke connection' + }) + expect(subject.status).to eq(:bad_request) + end + end + end + end + end +end diff --git a/spec/app/domain/factories/renderer_spec.rb b/spec/app/domain/factories/renderer_spec.rb new file mode 100644 index 0000000000..810f1d906b --- /dev/null +++ b/spec/app/domain/factories/renderer_spec.rb @@ -0,0 +1,98 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe(Factories::Renderer) do + subject { Factories::Renderer.new } + describe '.render' do + context 'when template is valid' do + let(:template) do + <<~TEMPLATE + - !policy + id: <%= id %> + TEMPLATE + end + context 'when all variables are present' do + it 'successfully renders template' do + response = subject.render(template: template, variables: { id: 'foo' }) + expect(response.success?).to be_truthy + expect(response.result).to eq("- !policy\n id: foo\n") + end + end + context 'when variables are missing' do + it 'returns an error' do + response = subject.render(template: template, variables: {}) + expect(response.success?).to be_falsey + expect(response.message).to eq("Required template variable 'id' is missing") + end + end + context 'when variable is nil' do + it 'successfully renders template' do + response = subject.render(template: template, variables: { id: nil }) + expect(response.success?).to be_truthy + expect(response.result).to eq("- !policy\n id: \n") + end + end + context 'when extra variables are present' do + it 'successfully renders template' do + response = subject.render(template: template, variables: { id: 'foo', bar: 'baz' }) + expect(response.success?).to be_truthy + expect(response.result).to eq("- !policy\n id: foo\n") + end + end + context 'when variables are not strings' do + context 'when variable is an integer' do + it 'successfully renders template' do + response = subject.render(template: template, variables: { id: 1 }) + expect(response.success?).to be_truthy + expect(response.result).to eq("- !policy\n id: 1\n") + end + end + context 'when variable is a boolean' do + it 'successfully renders template' do + response = subject.render(template: template, variables: { id: false }) + expect(response.success?).to be_truthy + expect(response.result).to eq("- !policy\n id: false\n") + end + end + context 'when variable is an array' do + it 'successfully renders template' do + response = subject.render(template: template, variables: { id: %w[foo bar] }) + expect(response.success?).to be_truthy + expect(response.result).to eq("- !policy\n id: [\"foo\", \"bar\"]\n") + end + end + end + end + context 'when template is invalid' do + context 'when there is not ERB closing tag' do + let(:template) do + <<~TEMPLATE + - !policy + id: <%= id + bar: baz + TEMPLATE + end + it 'the result is successful, does not perform substitution, and does not include the opening tag' do + response = subject.render(template: template, variables: { id: 'foo' }) + expect(response.success?).to be_truthy + expect(response.result).to eq("- !policy\n id: id\n bar: baz\n") + end + end + context 'when the template is missing an ERB opening tag' do + let(:template) do + <<~TEMPLATE + - !policy + id: id %> + bar: baz + TEMPLATE + end + it 'the result is successful, does not perform substitution, and includes the closing tag' do + response = subject.render(template: template, variables: { id: 'foo' }) + expect(response.success?).to be_truthy + expect(response.result).to eq("- !policy\n id: id %>\n bar: baz\n") + end + end + end + end +end diff --git a/spec/app/domain/responses_spec.rb b/spec/app/domain/responses_spec.rb new file mode 100644 index 0000000000..f3ad1b35db --- /dev/null +++ b/spec/app/domain/responses_spec.rb @@ -0,0 +1,142 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe SuccessResponse do + context 'when initialized' do + let(:success) { SuccessResponse.new('foo') } + + describe '.result' do + it 'is the message set in the initializer' do + expect(success.result).to eq('foo') + end + end + + describe '.success?' do + it 'is true' do + expect(success.success?).to be(true) + end + end + + describe '.bind' do + it 'binds this response message to the next operation' do + expect(success.bind { |response| "#{response}-bar"}).to eq('foo-bar') + end + end + end +end + +describe FailureResponse do + context 'when initialized with only a message' do + let(:failure) { FailureResponse.new('bar') } + + describe '.message' do + it 'is the message set in the initializer' do + expect(failure.message).to eq('bar') + end + end + + describe '.level' do + it 'is at `warn` level by default' do + expect(failure.level).to eq(:warn) + end + end + + describe '.success?' do + it 'is false' do + expect(failure.success?).to be(false) + end + end + + describe '.bind' do + it "doesn't bind the response message to the next operation" do + expect(failure.bind { |response| "foo-#{response}"}).to eq(failure) + end + end + end + + context 'when initialized with all options' do + let(:message) { 'baz' } + let(:initialize_arguments) { { level: :debug, status: :forbidden } } + let(:failure) { FailureResponse.new(message, **initialize_arguments) } + + describe '.message' do + context 'when message is set in the initializer' do + context 'when it is a string' do + it "is returned as a string" do + expect(failure.message).to eq('baz') + end + end + context 'when it is a hash' do + let(:message) { { foo: 'baz' } } + it 'is returned as a hash' do + expect(failure.message).to eq({ foo: 'baz' }) + end + end + context 'when it is an array' do + let(:message) { [{ foo: 'baz' }] } + it 'is returned as an array' do + expect(failure.message).to eq([{ foo: 'baz' }]) + end + end + end + end + + describe '.to_s' do + context 'when message is a string' do + let(:message) { 'baz' } + it 'returns the expected string' do + expect(failure.to_s).to eq('baz') + end + end + context 'when message is a hash' do + let(:message) { { foo: 'baz' } } + it 'returns the expected string' do + expect(failure.to_s).to eq('{:foo=>"baz"}') + end + end + context 'when message is an array' do + let(:message) { ['baz'] } + it 'returns the expected string' do + expect(failure.to_s).to eq('["baz"]') + end + end + end + + describe '.level' do + context 'when level is a symbol' do + let(:initialize_arguments) { { level: :warn, status: :forbidden } } + it 'is the level set in the initializer' do + expect(failure.level).to eq(:warn) + end + end + + context 'when level is a string' do + let(:initialize_arguments) { { level: 'warn', status: :forbidden } } + it 'is the level set in the initializer' do + expect(failure.level).to eq(:warn) + end + end + end + + describe '.status' do + context 'when set in initializer' do + it 'is the message set in the initializer' do + expect(failure.status).to eq(:forbidden) + end + end + context 'when set by default' do + let(:initialize_arguments) { {} } + it 'is the default option' do + expect(failure.status).to eq(:unauthorized) + end + end + end + + describe '.success?' do + it 'is false' do + expect(failure.success?).to be(false) + end + end + end +end diff --git a/spec/app/presenters/policy_factories/error_spec.rb b/spec/app/presenters/policy_factories/error_spec.rb new file mode 100644 index 0000000000..8c4f4a27b5 --- /dev/null +++ b/spec/app/presenters/policy_factories/error_spec.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe(Presenter::PolicyFactories::Error) do + subject do + Presenter::PolicyFactories::Error.new(response: response) + end + + describe '.present' do + context 'when response message is a string' do + let(:response) { FailureResponse.new('foo-bar') } + it 'returns the expected value' do + expect(subject.present).to eq({ + code: 401, + error: { message: 'foo-bar' } + }) + end + end + context 'when response message is a hash' do + let(:response) { FailureResponse.new({ message: 'foo-bar' }) } + it 'returns the expected value' do + expect(subject.present).to eq({ + code: 401, + error: { message: 'foo-bar' } + }) + end + end + context 'when response message is an array' do + let(:response) { FailureResponse.new([{ message: 'foo-bar' }]) } + it 'returns the expected value' do + expect(subject.present).to eq({ + code: 401, + error: [{ message: 'foo-bar' }] + }) + end + end + + end +end diff --git a/spec/app/presenters/policy_factories/index_spec.rb b/spec/app/presenters/policy_factories/index_spec.rb new file mode 100644 index 0000000000..32e1e23d60 --- /dev/null +++ b/spec/app/presenters/policy_factories/index_spec.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe(Presenter::PolicyFactories::Index) do + describe '.present' do + subject do + Presenter::PolicyFactories::Index.new( + factories: [ + DB::Repository::DataObjects::PolicyFactory.new( + name: 'foo1', + classification: 'foo', + version: 'v1', + description: 'This is foo' + ), + DB::Repository::DataObjects::PolicyFactory.new( + name: 'bar1', + classification: 'foo', + version: 'v1' + ) + ] + ) + end + + it 'returns the expected hash' do + expect(subject.present).to include( + { + "foo" => [ + { + name: 'bar1', + namespace: 'foo', + 'full-name': 'foo/bar1', + 'current-version': 'v1', + description: '' + }, { + name: 'foo1', + namespace: 'foo', + 'full-name': 'foo/foo1', + 'current-version': 'v1', + description: 'This is foo' + } + ] + } + ) + end + end +end diff --git a/spec/app/presenters/policy_factories/show_spec.rb b/spec/app/presenters/policy_factories/show_spec.rb new file mode 100644 index 0000000000..ca93784abe --- /dev/null +++ b/spec/app/presenters/policy_factories/show_spec.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe(Presenter::PolicyFactories::Show) do + describe '.present' do + subject { Presenter::PolicyFactories::Show.new(factory: factory) } + context 'when factory is composed of string keys' do + let(:factory) do + DB::Repository::DataObjects::PolicyFactory.new( + schema: { + 'title' => 'foo-bar', + 'description' => 'some factory', + 'properties' => { + 'id' => { + 'description' => 'Group ID', + 'type' => 'string' + }, + 'branch' => { + 'description' => 'Policy branch to load this group into', + 'type' => 'string' + }, + 'annotations' => { + 'description' => 'Additional annotations to add to the group', + 'type' => 'object' + } + }, + 'required' => %w[id branch] + }, + version: 'v1' + ) + end + + it 'returns the expected hash' do + expect(subject.present).to include( + { + title: 'foo-bar', + version: 'v1', + description: 'some factory', + properties: { + 'annotations' => { + 'description' => 'Additional annotations to add to the group', + 'type' => 'object' + }, + 'branch' => { + 'description' => 'Policy branch to load this group into', + 'type' => 'string' + }, + 'id' => { + 'description' => 'Group ID', + 'type' => 'string' + } + }, + required: %w[id branch] + } + ) + end + end + end +end diff --git a/spec/controllers/policy_factories_controller_spec.rb b/spec/controllers/policy_factories_controller_spec.rb new file mode 100644 index 0000000000..4768235930 --- /dev/null +++ b/spec/controllers/policy_factories_controller_spec.rb @@ -0,0 +1,201 @@ +# frozen_string_literal: true + +require 'spec_helper' + +DatabaseCleaner.strategy = :truncation + +describe PolicyFactoriesController, type: :request do + before(:all) do + Slosilo['authn:rspec'] ||= Slosilo::Key.new + + admin_user = Role.find_or_create(role_id: 'rspec:user:admin') + post( + '/policies/rspec/policy/root', + env: token_auth_header(role: admin_user).merge({ 'RAW_POST_DATA' => Factories::Templates::Base::V1::BasePolicy.policy }) + ) + { + 'core/v1/group' => Factories::Templates::Core::V1::Group.data, + 'core/v1/user' => Factories::Templates::Core::V1::User.data + }.each do |factory, data| + post( + "/secrets/rspec/variable/conjur/factories/#{factory}", + env: token_auth_header(role: admin_user).merge({ 'RAW_POST_DATA' => data }) + ) + end + end + + let(:current_user) { Role.find_or_create(role_id: 'rspec:user:admin') } + + describe '#index' do + context 'when user has permission' do + context 'it shows available factories' do + it 'displays expected values' do + get( + '/factories/rspec', + env: token_auth_header(role: current_user) + ) + result = JSON.parse(response.body) + expect(response.code).to eq('200') + expect(result['core'].length).to eq(2) + expect(result['core']).to include({ + 'name' => 'group', + 'namespace' => 'core', + 'full-name' => 'core/group', + 'current-version' => 'v1', + 'description' => 'Creates a Conjur Group' + }) + expect(result['core']).to include({ + 'name' => 'user', + 'namespace' => 'core', + 'full-name' => 'core/user', + 'current-version' => 'v1', + 'description' => 'Creates a Conjur User' + }) + end + end + end + context 'when role does not have permission' do + let(:current_user) { Role.find_or_create(role_id: 'rspec:user:foo-bar') } + it 'returns an appropriate error response' do + get( + '/factories/rspec', + env: token_auth_header(role: current_user) + ) + result = JSON.parse(response.body) + expect(response.code).to eq('403') + expect(result).to eq({ + 'code' => 403, + 'error' => { + 'message' => 'Role does not have permission to use Factories' + } + }) + end + end + end + + describe '#show' do + let(:desired_result) do + { + 'title' => 'User Template', + 'version' => 'v1', + 'description' => 'Creates a Conjur User', + 'properties' => { + 'id' => { + 'description' => 'User ID', + 'type' => 'string' + }, + 'branch' => { + 'description' => 'Policy branch to load this user into', + 'type' => 'string' + }, + 'owner_role' => { + 'description' => 'The Conjur Role that will own this user', + 'type' => 'string' + }, + 'owner_type' => { + 'description' => 'The resource type of the owner of this user', + 'type' => 'string' + }, + 'ip_range' => { + 'description' => 'Limits the network range the user is allowed to authenticate from', + 'type' => 'string' + }, + 'annotations' => { + 'description' => 'Additional annotations', + 'type' => 'object' + } + }, + 'required' => %w[id branch] + } + end + context 'when role has permission to access' do + context 'when version is included in request' do + it 'returns the expected response' do + get( + '/factories/rspec/core/v1/user', + env: token_auth_header(role: current_user) + ) + result = JSON.parse(response.body) + expect(response.code).to eq('200') + expect(result).to eq(desired_result) + end + end + context 'when version is not present in request' do + it 'returns the latest version' do + get( + '/factories/rspec/core/user', + env: token_auth_header(role: current_user) + ) + result = JSON.parse(response.body) + expect(response.code).to eq('200') + expect(result).to eq(desired_result) + end + end + end + context 'when factory does not exist' do + it 'returns the expected response' do + get( + '/factories/rspec/core/v1/fake-factory', + env: token_auth_header(role: current_user) + ) + result = JSON.parse(response.body) + expect(response.code).to eq('404') + expect(result).to eq({ + 'code' => 404, + 'error' => { + 'message' => 'Requested Policy Factory does not exist', + 'resource' => 'core/v1/fake-factory' + } + }) + end + end + end + describe '#create' do + context 'when a factory exists' do + context 'when role has permission to create from the factory' do + let(:policy_creator) { instance_double(Factories::CreateFromPolicyFactory) } + let(:double_class) { class_double(Factories::CreateFromPolicyFactory).as_stubbed_const } + + before do + allow(double_class).to receive(:new).and_return(policy_creator) + allow(policy_creator).to receive(:call).and_return(::SuccessResponse.new('success!!')) + end + + it 'creates the desire resource' do + auth_headers = token_auth_header(role: current_user) + request_body = { + 'id': 'test-user-1', + 'branch': 'root' + }.to_json + post( + '/factories/rspec/core/user', + env: auth_headers.merge({ 'RAW_POST_DATA' => request_body }) + ) + + # We're really only checking that the Factories::CreateFromPolicyFactory.call method + # is called with expected arguements. We're testing this class separately. + decoded_factory = JSON.parse(Base64.decode64(Factories::Templates::Core::V1::User.data)) + expect(policy_creator).to have_received(:call).with({ + account: 'rspec', + factory_template: DB::Repository::DataObjects::PolicyFactory.new( + policy: Base64.decode64(decoded_factory['policy']), + policy_branch: decoded_factory['policy_branch'], + schema: decoded_factory['schema'], + version: 'v1', + name: 'user', + classification: 'core', + description: decoded_factory['schema']&.dig('description').to_s + ), + request_body: { id: 'test-user-1', branch: 'root' }.to_json, + authorization: auth_headers['HTTP_AUTHORIZATION'] + }) + expect(response.code).to eq('200') + # This response is mocked. We're not really returning this in real life. + # Tests on Factories::CreateFromPolicyFactory verify that we always receive + # a success of failure object. + expect(response.body).to eq('success!!') + end + end + end + end +end From b30637d469f70dff9d31bad317355ab82f50379e Mon Sep 17 00:00:00 2001 From: Jason Vanderhoof Date: Fri, 14 Jul 2023 15:06:12 -0600 Subject: [PATCH 2/2] Initial set of Factory templates This commit includes an initial set of Factory templates. These may need some work before the official release. --- .../templates/authenticators/v1/authn_oidc.rb | 112 ++++++++++++++++++ .../templates/base/v1/base_policy.rb | 50 ++++++++ .../templates/connections/v1/database.rb | 105 ++++++++++++++++ .../factories/templates/core/v1/grant.rb | 60 ++++++++++ .../factories/templates/core/v1/group.rb | 67 +++++++++++ .../templates/core/v1/managed_policy.rb | 58 +++++++++ .../factories/templates/core/v1/policy.rb | 68 +++++++++++ .../factories/templates/core/v1/user.rb | 74 ++++++++++++ lib/tasks/policy_factory.rake | 2 +- 9 files changed, 595 insertions(+), 1 deletion(-) create mode 100644 app/domain/factories/templates/authenticators/v1/authn_oidc.rb create mode 100644 app/domain/factories/templates/base/v1/base_policy.rb create mode 100644 app/domain/factories/templates/connections/v1/database.rb create mode 100644 app/domain/factories/templates/core/v1/grant.rb create mode 100644 app/domain/factories/templates/core/v1/group.rb create mode 100644 app/domain/factories/templates/core/v1/managed_policy.rb create mode 100644 app/domain/factories/templates/core/v1/policy.rb create mode 100644 app/domain/factories/templates/core/v1/user.rb diff --git a/app/domain/factories/templates/authenticators/v1/authn_oidc.rb b/app/domain/factories/templates/authenticators/v1/authn_oidc.rb new file mode 100644 index 0000000000..f71f3460e0 --- /dev/null +++ b/app/domain/factories/templates/authenticators/v1/authn_oidc.rb @@ -0,0 +1,112 @@ +# frozen_string_literal: true + +require 'base64' + +module Factories + module Templates + module Authenticators + module V1 + class AuthnOidc + class << self + def policy_template + <<~TEMPLATE + - !policy + id: <%= id %> + annotations: + factory: authenticators/v1/authn-oidc + <% annotations.each do |key, value| -%> + <%= key %>: <%= value %> + <% end -%> + + body: + - !webservice + + - !variable provider-uri + - !variable client-id + - !variable client-secret + - !variable redirect-uri + - !variable claim-mapping + + - !group + id: authenticatable + annotations: + description: Group with permission to authenticate using this authenticator + + - !permit + role: !group authenticatable + privilege: [ read, authenticate ] + resource: !webservice + + - !webservice + id: status + annotations: + description: Web service for checking authenticator status + + - !group + id: operators + annotations: + description: Group with permission to check the authenticator status + + - !permit + role: !group operators + privilege: [ read ] + resource: !webservice status + TEMPLATE + end + + def data + Base64.encode64({ + version: 'v1', + policy: Base64.encode64(policy_template), + policy_branch: "conjur/authn-oidc", + schema: { + "$schema": "http://json-schema.org/draft-06/schema#", + "title": "Authn-OIDC Template", + "description": "Create a new Authn-OIDC Authenticator", + "type": "object", + "properties": { + "id": { + "description": "Service ID of the Authenticator", + "type": "string" + }, + "annotations": { + "description": "Additional annotations", + "type": "object" + }, + "variables": { + "type": "object", + "properties": { + "provider-uri": { + "description": "OIDC Provider endpoint", + "type": "string" + }, + "client-id": { + "description": "OIDC Client ID", + "type": "string" + }, + "client-secret": { + "description": "OIDC Client Secret", + "type": "string" + }, + "redirect-uri": { + "description": "Target URL to redirect to after successful authentication", + "type": "string" + }, + "claim-mapping": { + "description": "OIDC JWT claim mapping. This value must match to a Conjur Host ID.", + "type": "string" + } + }, + "required": %w[provider-uri client-id client-secret claim-mapping] + } + }, + "required": %w[id variables] + } + }.to_json) + end + end + end + end + end + end +end diff --git a/app/domain/factories/templates/base/v1/base_policy.rb b/app/domain/factories/templates/base/v1/base_policy.rb new file mode 100644 index 0000000000..f114963d2f --- /dev/null +++ b/app/domain/factories/templates/base/v1/base_policy.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +module Factories + module Templates + module Base + module V1 + class BasePolicy + class << self + def policy + <<~TEMPLATE + - !policy + id: conjur + body: + - !policy + id: factories + body: + - !policy + id: core + annotations: + description: "Create Conjur primatives and manage permissions" + body: + - !variable v1/grant + - !variable v1/group + - !variable v1/host + - !variable v1/layer + - !variable v1/managed-policy + - !variable v1/policy + - !variable v1/user + + - !policy + id: authenticators + annotations: + description: "Generate new Authenticators" + body: + - !variable v1/authn-oidc + - !policy + id: connections + annotations: + description: "Create connections to external services" + body: + - !variable v1/database + - !variable v2/database + TEMPLATE + end + end + end + end + end + end +end diff --git a/app/domain/factories/templates/connections/v1/database.rb b/app/domain/factories/templates/connections/v1/database.rb new file mode 100644 index 0000000000..6a7b01ab02 --- /dev/null +++ b/app/domain/factories/templates/connections/v1/database.rb @@ -0,0 +1,105 @@ +# frozen_string_literal: true + +require 'base64' + +module Factories + module Templates + module Connections + module V1 + class Database + class << self + def policy_template + <<~TEMPLATE + - !policy + id: <%= id %> + annotations: + factory: connections/v1/database + <% annotations.each do |key, value| -%> + <%= key %>: <%= value %> + <% end -%> + + body: + - &variables + - !variable url + - !variable port + - !variable username + - !variable password + + - !group consumers + - !group administrators + + # consumers can read and execute + - !permit + resource: *variables + privileges: [ read, execute ] + role: !group consumers + + # administrators can update (and read and execute, via role grant) + - !permit + resource: *variables + privileges: [ update ] + role: !group administrators + + # administrators has role consumers + - !grant + member: !group administrators + role: !group consumers + TEMPLATE + end + + def data + Base64.encode64({ + version: 1, + policy: Base64.encode64(policy_template), + policy_branch: "<%= branch %>", + schema: { + "$schema": "http://json-schema.org/draft-06/schema#", + "title": "Database Connection Template", + "description": "All information for connecting to a database", + "type": "object", + "properties": { + "id": { + "description": "Database Connection Identifier", + "type": "string" + }, + "branch": { + "description": "Policy branch to load this connection into", + "type": "string" + }, + "annotations": { + "description": "Additional annotations", + "type": "object" + }, + "variables": { + "type": "object", + "properties": { + "url": { + "description": "Database URL", + "type": "string" + }, + "port": { + "description": "Database Port", + "type": "string" + }, + "username": { + "description": "Database Username", + "type": "string" + }, + "password": { + "description": "Database Password", + "type": "string" + }, + }, + "required": %w[url port username password] + } + }, + "required": %w[id branch variables] + } + }.to_json) + end + end + end + end + end + end +end diff --git a/app/domain/factories/templates/core/v1/grant.rb b/app/domain/factories/templates/core/v1/grant.rb new file mode 100644 index 0000000000..6fdc2613d5 --- /dev/null +++ b/app/domain/factories/templates/core/v1/grant.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +require 'base64' + +module Factories + module Templates + module Core + module V1 + class Grant + class << self + def policy_template + <<~TEMPLATE + - !grant + member: !<%= member_resource_type %> <%= member_resource_id %> + role: !<%= role_resource_type %> <%= role_resource_id %> + TEMPLATE + end + + def data + Base64.encode64({ + version: 1, + policy: Base64.encode64(policy_template), + policy_branch: "<%= branch %>", + schema: { + "$schema": "http://json-schema.org/draft-06/schema#", + "title": "Grant Template", + "description": "Assigns a Role to another Role", + "type": "object", + "properties": { + "branch": { + "description": "Policy branch to load this grant into", + "type": "string" + }, + "member_resource_type": { + "description": "The member type (group, host, user, etc.) for the grant", + "type": "string" + }, + "member_resource_id": { + "description": "The member resource identifier for the grant", + "type": "string" + }, + "role_resource_type": { + "description": "The role type (group, host, user, etc.) for the grant", + "type": "string" + }, + "role_resource_id": { + "description": "The role resource identifier for the grant", + "type": "string" + } + }, + "required": %w[branch member_resource_type member_resource_id role_resource_type role_resource_id] + } + }.to_json) + end + end + end + end + end + end +end diff --git a/app/domain/factories/templates/core/v1/group.rb b/app/domain/factories/templates/core/v1/group.rb new file mode 100644 index 0000000000..c299b9e356 --- /dev/null +++ b/app/domain/factories/templates/core/v1/group.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true + +require 'base64' + +module Factories + module Templates + module Core + module V1 + class Group + class << self + def policy_template + <<~TEMPLATE + - !group + id: <%= id %> + <% if defined?(owner_role) && defined?(owner_type) -%> + owner: !<%= owner_type %> <%= owner_role %> + <% end -%> + annotations: + factory: core/v1/group + <% annotations.each do |key, value| -%> + <%= key %>: <%= value %> + <% end -%> + TEMPLATE + end + + def data + Base64.encode64({ + version: 1, + policy: Base64.encode64(policy_template), + policy_branch: "<%= branch %>", + schema: { + "$schema": "http://json-schema.org/draft-06/schema#", + "title": "Group Template", + "description": "Creates a Conjur Group", + "type": "object", + "properties": { + "id": { + "description": "Group Identifier", + "type": "string" + }, + "branch": { + "description": "Policy branch to load this group into", + "type": "string" + }, + "owner_role": { + "description": "The Conjur Role that will own this group", + "type": "string" + }, + "owner_type": { + "description": "The resource type of the owner of this group", + "type": "string" + }, + "annotations": { + "description": "Additional annotations", + "type": "object" + } + }, + "required": %w[id branch] + } + }.to_json) + end + end + end + end + end + end +end diff --git a/app/domain/factories/templates/core/v1/managed_policy.rb b/app/domain/factories/templates/core/v1/managed_policy.rb new file mode 100644 index 0000000000..84095c7f35 --- /dev/null +++ b/app/domain/factories/templates/core/v1/managed_policy.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true + +require 'base64' + +module Factories + module Templates + module Core + module V1 + class ManagedPolicy + class << self + def policy_template + <<~TEMPLATE + - !group <%= name %>-admins + - !policy + id: <%= name %> + owner: !group <%= name %>-admins + annotations: + factory: core/v1/managed-policy + <% annotations.each do |key, value| -%> + <%= key %>: <%= value %> + <% end -%> + TEMPLATE + end + + def data + Base64.encode64({ + version: 1, + policy: Base64.encode64(policy_template), + policy_branch: "<%= branch %>", + schema: { + "$schema": "http://json-schema.org/draft-06/schema#", + "title": "Managed Policy Template", + "description": "Policy with an owner group", + "type": "object", + "properties": { + "name": { + "description": "Policy name (used to create the policy ID and the -admins owner group)", + "type": "string" + }, + "branch": { + "description": "Policy branch to load this policy into", + "type": "string" + }, + "annotations": { + "description": "Additional annotations", + "type": "object" + } + }, + "required": %w[name branch] + } + }.to_json) + end + end + end + end + end + end +end diff --git a/app/domain/factories/templates/core/v1/policy.rb b/app/domain/factories/templates/core/v1/policy.rb new file mode 100644 index 0000000000..a5d8aad9a3 --- /dev/null +++ b/app/domain/factories/templates/core/v1/policy.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true + +require 'base64' + +module Factories + module Templates + module Core + module V1 + class Policy + class << self + def policy_template + <<~TEMPLATE + - !policy + id: <%= id %> + <% if defined?(owner_role) && defined?(owner_type) -%> + owner: !<%= owner_type %> <%= owner_role %> + <% end -%> + annotations: + factory: core/v1/policy + <% annotations.each do |key, value| -%> + <%= key %>: <%= value %> + <% end -%> + TEMPLATE + end + + def data + Base64.encode64({ + version: 1, + policy: Base64.encode64(policy_template), + policy_branch: "<%= branch %>", + schema: { + "$schema": "http://json-schema.org/draft-06/schema#", + "title": "User Template", + "description": "Creates a Conjur Policy", + "type": "object", + "properties": { + "id": { + "description": "Policy ID", + "type": "string" + }, + "branch": { + "description": "Policy branch to load this policy into", + "type": "string" + }, + "owner_role": { + "description": "The Conjur Role that will own this policy", + "type": "string" + }, + "owner_type": { + "description": "The resource type of the owner of this policy", + "type": "string" + }, + "annotations": { + "description": "Additional annotations", + "type": "object" + } + }, + "required": %w[id branch] + } + }.to_json) + end + end + end + + end + end + end +end diff --git a/app/domain/factories/templates/core/v1/user.rb b/app/domain/factories/templates/core/v1/user.rb new file mode 100644 index 0000000000..c293a30d70 --- /dev/null +++ b/app/domain/factories/templates/core/v1/user.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +require 'base64' + +module Factories + module Templates + module Core + module V1 + class User + class << self + def policy_template + <<~TEMPLATE + - !user + id: <%= id %> + <% if defined?(owner_role) && defined?(owner_type) -%> + owner: !<%= owner_type %> <%= owner_role %> + <% end -%> + <% if defined?(ip_range) -%> + restricted_to: <%= ip_range %> + <% end -%> + annotations: + factory: core/v1/user + <% annotations.each do |key, value| -%> + <%= key %>: <%= value %> + <% end -%> + TEMPLATE + end + + def data + Base64.encode64({ + version: 1, + policy: Base64.encode64(policy_template), + policy_branch: "<%= branch %>", + schema: { + "$schema": "http://json-schema.org/draft-06/schema#", + "title": "User Template", + "description": "Creates a Conjur User", + "type": "object", + "properties": { + "id": { + "description": "User ID", + "type": "string" + }, + "branch": { + "description": "Policy branch to load this user into", + "type": "string" + }, + "owner_role": { + "description": "The Conjur Role that will own this user", + "type": "string" + }, + "owner_type": { + "description": "The resource type of the owner of this user", + "type": "string" + }, + "ip_range": { + "description": "Limits the network range the user is allowed to authenticate from", + "type": "string" + }, + "annotations": { + "description": "Additional annotations", + "type": "object" + } + }, + "required": %w[id branch] + } + }.to_json) + end + end + end + end + end + end +end diff --git a/lib/tasks/policy_factory.rake b/lib/tasks/policy_factory.rake index 2f726cb7d2..a40b266e28 100644 --- a/lib/tasks/policy_factory.rake +++ b/lib/tasks/policy_factory.rake @@ -1,6 +1,6 @@ # frozen_string_literal: true -module Factory +module Factories module Templates class ValidateTemplate def initialize(renderer: Factories::RenderPolicy.new)