diff --git a/lib/travis/api/v3/access_control/generic.rb b/lib/travis/api/v3/access_control/generic.rb index 7f006029..13e990f8 100644 --- a/lib/travis/api/v3/access_control/generic.rb +++ b/lib/travis/api/v3/access_control/generic.rb @@ -51,6 +51,10 @@ module Travis::API::V3 visible? build.repository end + def build_writable?(build) + writable? build.repository + end + def branch_visible?(branch) visible? branch.repository end diff --git a/lib/travis/api/v3/queries/build.rb b/lib/travis/api/v3/queries/build.rb index 8294a00a..f151d77c 100644 --- a/lib/travis/api/v3/queries/build.rb +++ b/lib/travis/api/v3/queries/build.rb @@ -7,13 +7,9 @@ module Travis::API::V3 raise WrongParams, 'missing build.id'.freeze end - def cancel - raise WrongParams, 'missing build.id'.freeze unless build.id - payload = { - build: { id: build.id } - } - - perform_async(:build_cancellation, type: 'api'.freeze, credentials: { token: token }, payload: JSON.dump(payload)) + def cancel(user) + payload = {build: {id: id, user_id: user.id, source: 'api'}} + perform_async(:build_cancellation, type: 'api'.freeze, payload: JSON.dump(payload)) payload end end diff --git a/lib/travis/api/v3/services/build/cancel.rb b/lib/travis/api/v3/services/build/cancel.rb index bf1ab19b..168b3ccf 100644 --- a/lib/travis/api/v3/services/build/cancel.rb +++ b/lib/travis/api/v3/services/build/cancel.rb @@ -6,8 +6,8 @@ module Travis::API::V3 raise NotFound unless build = find(:build) access_control.permissions(build).cancel! - payload = query.cancel(build) - build + query.cancel(access_control.user) + accepted(build: build, state_change: :cancel) end end end diff --git a/spec/v3/services/build/cancel_spec.rb b/spec/v3/services/build/cancel_spec.rb index 4fadd008..c40205e3 100644 --- a/spec/v3/services/build/cancel_spec.rb +++ b/spec/v3/services/build/cancel_spec.rb @@ -3,9 +3,8 @@ require 'spec_helper' describe Travis::API::V3::Services::Build::Cancel do let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first } let(:build) { repo.builds.first } - let(:sidekiq_payload) { JSON.load(Sidekiq::Client.last['args'].last[:payload]).deep_symbolize_keys } + let(:sidekiq_payload) { JSON.load(Sidekiq::Client.last['args'].last[:payload]) } let(:sidekiq_params) { Sidekiq::Client.last['args'].last.deep_symbolize_keys } - # before { build.cancel.each(&:delete) } before do Travis::Features.stubs(:owner_active?).returns(true) @@ -52,7 +51,7 @@ describe Travis::API::V3::Services::Build::Cancel do example { expect(JSON.load(body).to_s).to include( "@type", "error_type", - "insufficient access", + "insufficient_access", "error_message", "operation requires cancel access to build", "resource_type", @@ -88,59 +87,56 @@ describe Travis::API::V3::Services::Build::Cancel do example { expect(last_response.status).to be == 202 } example { expect(JSON.load(body).to_s).to include( "@type", - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "build", "@href", "@representation", "minimal", - "permission", "cancel", "id", - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx") + "state_change") } example { expect(sidekiq_payload).to be == { - build: { id: build.id } + "build" => { + "id" => "#{build.id}", + "user_id"=> repo.owner_id, + "source" => "api"} }} example { expect(Sidekiq::Client.last['queue']).to be == 'build_cancellations' } - example { expect(Sidekiq::Client.last['class']).to be == 'Travis::Sidekiq::CancellationRequest' } + example { expect(Sidekiq::Client.last['class']).to be == 'Travis::Sidekiq::BuildCancellation' } describe "setting id has no effect" do let(:params) {{ id: 42 }} example { expect(sidekiq_payload).to be == { - build: { id: build.id } - }} - end - - describe "passing the token in params" do - let(:params) {{ request: { token: 'foo-bar' }}} - example { expect(sidekiq_params[:credentials]).to be == { - token: 'foo-bar' + "build" => { + "id" => "#{build.id}", + "user_id"=> repo.owner_id, + "source" => "api"} }} end end - describe "existing repository, application with full access" do - let(:app_name) { 'travis-example' } - let(:app_secret) { '12345678' } - let(:sign_opts) { "a=#{app_name}" } - let(:signature) { OpenSSL::HMAC.hexdigest('sha256', app_secret, sign_opts) } - let(:headers) {{ 'HTTP_AUTHORIZATION' => "signature #{sign_opts}:#{signature}" }} - before { Travis.config.applications = { app_name => { full_access: true, secret: app_secret }}} - before { post("/v3/build/#{build.id}/cancel", params, headers) } + # describe "existing repository, application with full access" do + # let(:app_name) { 'travis-example' } + # let(:app_secret) { '12345678' } + # let(:sign_opts) { "a=#{app_name}" } + # let(:signature) { OpenSSL::HMAC.hexdigest('sha256', app_secret, sign_opts) } + # let(:headers) {{ 'HTTP_AUTHORIZATION' => "signature #{sign_opts}:#{signature}" }} + # before { Travis.config.applications = { app_name => { full_access: true, secret: app_secret }}} + # before { post("/v3/build/#{build.id}/cancel", params, headers) } + # + # describe 'without setting user' do + # let(:params) {{}} + # example { expect(last_response.status).to be == 400 } + # example { expect(JSON.load(body)).to be == { + # "@type" => "error", + # "error_type" => "wrong_params", + # "error_message" => "missing user" + # }} + # end - # describe 'without setting user' do - # let(:params) {{}} - # example { expect(last_response.status).to be == 400 } - # example { expect(JSON.load(body)).to be == { - # "@type" => "error", - # "error_type" => "wrong_params", - # "error_message" => "missing user" - # }} - # end - # # describe 'setting user' do # let(:params) {{ user: { id: repo.owner.id } }} # example { expect(last_response.status).to be == 202 } @@ -152,17 +148,5 @@ describe Travis::API::V3::Services::Build::Cancel do # config: {} # }} # end - # - # describe 'setting branch' do - # let(:params) {{ user: { id: repo.owner.id }, branch: 'example' }} - # example { expect(last_response.status).to be == 202 } - # example { expect(sidekiq_payload).to be == { - # repository: { id: repo.id, owner_name: 'svenfuchs', name: 'minimal' }, - # user: { id: repo.owner.id }, - # message: nil, - # branch: 'example', - # config: {} - # }} - # end - end + # end end