diff --git a/lib/travis/api/app/endpoint/requests.rb b/lib/travis/api/app/endpoint/requests.rb index 590ec331..3c9c96f2 100644 --- a/lib/travis/api/app/endpoint/requests.rb +++ b/lib/travis/api/app/endpoint/requests.rb @@ -1,5 +1,6 @@ require 'travis/api/app' require 'travis/api/app/services/schedule_request' +require 'travis/api/enqueue/services/restart_model' class Travis::Api::App class Endpoint @@ -29,16 +30,18 @@ class Travis::Api::App # I think we need to properly deprecate this by publishing a blog post. Metriks.meter("api.request.restart").mark - service = Travis::Enqueue::Services::RestartModel.new(current_user, { build_id: params[:build_id] }) + service = Travis::Enqueue::Services::RestartModel.new(current_user, params) repository_owner = service.target.repository.owner if !Travis::Features.enabled_for_all?(:enqueue_to_hub) && !Travis::Features.owner_active?(:enqueue_to_hub, repository_owner) respond_with service(:reset_model, params) elsif service.respond_to?(:push) - payload = {id: params[:build_id], user_id: current_user.id} - service.push("job:restart", payload) - status 202 - true + params[:user_id] = repository_owner.id + type ||= params[:build_id] ? 'build' : 'job' + params[:id] = params[:build_id] || params[:job_id] + + service.push("#{type}:restart", params) + respond_with(result: true, flash: service.messages) end end end diff --git a/lib/travis/api/v3/github.rb b/lib/travis/api/v3/github.rb index 9ec3f6fc..cb9c389c 100644 --- a/lib/travis/api/v3/github.rb +++ b/lib/travis/api/v3/github.rb @@ -49,5 +49,15 @@ module Travis::API::V3 gh.post(hooks_url, payload) end end + + def upload_key(repository) + keys_path = "repos/#{repository.slug}/keys" + key = gh[keys_path]. + detect { |e| e['key'] == repository.key.encoded_public_key } + + unless key + gh.post keys_path, title: Travis.config.host.to_s, key: repository.key.encoded_public_key + end + end end end diff --git a/lib/travis/api/v3/models/repository.rb b/lib/travis/api/v3/models/repository.rb index dfbd1eba..bc513fcd 100644 --- a/lib/travis/api/v3/models/repository.rb +++ b/lib/travis/api/v3/models/repository.rb @@ -12,6 +12,7 @@ module Travis::API::V3 belongs_to :last_build, class_name: 'Travis::API::V3::Models::Build'.freeze belongs_to :current_build, class_name: 'Travis::API::V3::Models::Build'.freeze + has_one :key, class_name: 'Travis::API::V3::Models::SSLKey'.freeze has_one :default_branch, foreign_key: [:repository_id, :name], primary_key: [:id, :default_branch], diff --git a/lib/travis/api/v3/models/ssl_key.rb b/lib/travis/api/v3/models/ssl_key.rb index eb45758c..75e1e8a2 100644 --- a/lib/travis/api/v3/models/ssl_key.rb +++ b/lib/travis/api/v3/models/ssl_key.rb @@ -1,5 +1,29 @@ module Travis::API::V3 class Models::SSLKey < Model belongs_to :repository + + serialize :private_key, Travis::API::V3::Extensions::EncryptedColumn.new + + def encoded_public_key + key = build_key.public_key + ['ssh-rsa ', "\0\0\0\assh-rsa#{sized_bytes(key.e)}#{sized_bytes(key.n)}"].pack('a*m').gsub("\n", '') + end + + private + + def build_key + @build_key ||= OpenSSL::PKey::RSA.new(private_key) + end + + def sized_bytes(value) + bytes = to_byte_array(value.to_i) + [bytes.size, *bytes].pack('NC*') + end + + def to_byte_array(num, *significant) + return significant if num.between?(-1, 0) and significant[0][7] == num[7] + to_byte_array(*num.divmod(256)) + significant + end + end end diff --git a/lib/travis/api/v3/services/repository/enable.rb b/lib/travis/api/v3/services/repository/enable.rb index 5d43bbe7..d27d73f5 100644 --- a/lib/travis/api/v3/services/repository/enable.rb +++ b/lib/travis/api/v3/services/repository/enable.rb @@ -1,7 +1,14 @@ module Travis::API::V3 class Services::Repository::Enable < Services::Repository::Disable def run! - super(true) + repository = super(true) + + if repository.private? + admin = access_control.admin_for(repository) + github(admin).upload_key(repository) + end + + repository end def check_access(repository) diff --git a/spec/integration/v2/requests_spec.rb b/spec/integration/v2/requests_spec.rb index cd023599..a51e45e6 100644 --- a/spec/integration/v2/requests_spec.rb +++ b/spec/integration/v2/requests_spec.rb @@ -33,11 +33,18 @@ describe 'Requests', set_app: true do response.status.should be(200) end - it 'triggers a build request using Hub' do - Travis::Features.activate_owner(:enqueue_to_hub, repo.owner) + describe 'enqueues for Hub' do + it 'triggers a build request' do + payload = { build_id: build.id, user_id: repo.owner.id } + response = post "/requests", payload, headers + response.status.should be(200) + end - response = post "/requests", { build_id: build.id }, headers - response.status.should be(202) + it 'triggers a job request' do + payload = { job_id: build.matrix.first.id, user_id: repo.owner.id } + response = post "/requests", payload, headers + response.status.should be(200) + end end end end