Skip to content

Commit ff65e10

Browse files
AndriiMyskovitalie
authored and
vitalie
committed
[PRD] TCI/Assembla Handshake with SVN/P4 (#1282)
1 parent a6385dd commit ff65e10

File tree

21 files changed

+476
-17
lines changed

21 files changed

+476
-17
lines changed

lib/travis/api/app/endpoint/authorization.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,8 @@ def vcs_handshake
232232
vcs_data = remote_vcs_user.authenticate(
233233
provider: params[:provider],
234234
code: params[:code],
235-
redirect_uri: oauth_endpoint
235+
redirect_uri: oauth_endpoint,
236+
cluster: params[:cluster]
236237
)
237238

238239
if vcs_data['redirect_uri'].present?

lib/travis/api/v3/models/repository.rb

+10
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class Models::Repository < Model
2121
primary_key: [:id, :default_branch],
2222
class_name: 'Travis::API::V3::Models::Branch'.freeze
2323

24+
scope :by_server_type, ->(server_type) { where(server_type: server_type) }
25+
2426
alias last_started_build current_build
2527

2628
after_initialize do
@@ -198,5 +200,13 @@ def admin
198200
def allow_migration?
199201
Travis::Features.owner_active?(:allow_migration, self.owner)
200202
end
203+
204+
def perforce?
205+
server_type == 'perforce'
206+
end
207+
208+
def subversion?
209+
server_type == 'subversion'
210+
end
201211
end
202212
end

lib/travis/api/v3/queries/repository.rb

+9-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
module Travis::API::V3
22
class Queries::Repository < Query
33
setup_sidekiq(:repo_sync, queue: :sync, class_name: "Travis::GithubSync::Worker")
4-
params :id, :slug
4+
params :id, :slug, :server_type
55

66
def find
77
@find ||= find!
@@ -37,27 +37,30 @@ def update(attrs)
3737

3838
def find!
3939
return by_slug if slug
40-
return Models::Repository.find_by_id(id) if id
40+
return Models::Repository.find_by_id(id) if id && !id.match(/\D/)
4141
raise WrongParams, 'missing repository.id'.freeze
4242
end
4343

4444
def by_slug
4545
owner_name, repo_name = slug.split('/')
46-
Models::Repository.where(
46+
repos = Models::Repository.where(
4747
"(lower(repositories.vcs_slug) = ? "\
4848
"or (lower(repositories.owner_name) = ? and lower(repositories.name) = ?)) "\
4949
"and lower(repositories.vcs_type) = ? "\
5050
"and repositories.invalidated_at is null",
5151
slug.downcase,
5252
owner_name.downcase,
5353
repo_name.downcase,
54-
provider.downcase + 'repository'
55-
).order("updated_at desc, vcs_slug asc, owner_name asc, name asc, vcs_type asc").first
54+
"#{provider.downcase}repository"
55+
)
56+
repos = repos.by_server_type(server_type) if server_type && provider == 'assembla'
57+
58+
repos.order("updated_at desc, vcs_slug asc, owner_name asc, name asc, vcs_type asc")
59+
.first
5660
end
5761

5862
def provider
5963
params['provider'] || 'github'
6064
end
61-
6265
end
6366
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
module Travis::API::V3
2+
class Queries::RepositoryVcs < Query
3+
params :vcs_id
4+
5+
def find
6+
@find ||= find!
7+
end
8+
9+
private
10+
11+
def find!
12+
return by_vcs_id if vcs_id
13+
raise WrongParams, 'missing repository_vcs.vcs_id'.freeze
14+
end
15+
16+
def by_vcs_id
17+
Models::Repository.where(
18+
"repositories.vcs_id = ? "\
19+
"and lower(repositories.vcs_type) = ? "\
20+
"and repositories.invalidated_at is null",
21+
vcs_id,
22+
"#{provider.downcase}repository"
23+
)
24+
.order("updated_at desc, vcs_slug asc, owner_name asc, name asc, vcs_type asc")
25+
.first
26+
end
27+
28+
def provider
29+
params['provider'] || 'github'
30+
end
31+
end
32+
end

lib/travis/api/v3/result.rb

+7-2
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,19 @@ def render(params, env)
2929
href = self.href
3030
href = V3.location(env) if href.nil? and env['REQUEST_METHOD'.freeze] == 'GET'.freeze
3131
include = params.to_h['include'.freeze].to_s.split(?,.freeze)
32-
add_info Renderer[type].render(resource,
32+
result = Renderer[type].render(
33+
resource,
3334
href: href,
3435
script_name: env['SCRIPT_NAME'.freeze],
3536
params: params,
3637
include: include,
3738
access_control: access_control,
3839
meta_data: meta_data,
39-
accept: env.fetch('HTTP_ACCEPT'.freeze, 'application/json'.freeze))
40+
accept: env.fetch('HTTP_ACCEPT'.freeze, 'application/json'.freeze)
41+
)
42+
Travis.logger.error("#{self.class}#render: Render failed! type=#{type.inspect} resource=#{resource.inspect} href=#{href} params=#{params.inspect} env=#{env}") if result.nil?
43+
44+
add_info(result)
4045
end
4146

4247
def add_info(payload)

lib/travis/api/v3/routes.rb

+5
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,11 @@ module Routes
282282
end
283283
end
284284

285+
hidden_resource :repository_vcs do
286+
route '/repo_vcs/{provider}/{repository_vcs.vcs_id}'
287+
get :find
288+
end
289+
285290
resource :scan_results do
286291
route '/scan_results'
287292
get :all

lib/travis/api/v3/services.rb

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ module Services
5353
Queues = Module.new { extend Services }
5454
Repositories = Module.new { extend Services }
5555
Repository = Module.new { extend Services }
56+
RepositoryVcs = Module.new { extend Services }
5657
Request = Module.new { extend Services }
5758
Requests = Module.new { extend Services }
5859
SslKey = Module.new { extend Services }

lib/travis/api/v3/services/repository/activate.rb

+27-2
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,26 @@ def run!
1616

1717
repository.update_attributes(active: true)
1818

19-
if repository.private? || access_control.enterprise?
19+
if repository.perforce?
20+
remote_vcs_repository.create_perforce_group(
21+
repository_id: repository.id,
22+
user_id: admin.id
23+
)
24+
25+
remote_vcs_repository.set_perforce_ticket(
26+
repository_id: repository.id,
27+
user_id: admin.id
28+
)
29+
elsif repository.private? || access_control.enterprise?
2030
remote_vcs_repository.upload_key(
2131
repository_id: repository.id,
2232
user_id: admin.id,
23-
read_only: !Travis::Features.owner_active?(:read_write_github_keys, repository.owner)
33+
read_only: !repository.subversion? && !Travis::Features.owner_active?(:read_write_github_keys, repository.owner)
2434
)
2535
end
2636

2737
query.sync(access_control.user || access_control.admin_for(repository))
38+
save_audit(repository)
2839
result repository
2940
end
3041

@@ -33,7 +44,21 @@ def check_access(repository)
3344
end
3445

3546
def check_repo_key(repository)
47+
if repository.subversion? && repository.key.nil?
48+
key = Travis::API::V3::Models::SslKey.new(repository: repository)
49+
key.generate_keys!
50+
key.save!
51+
52+
return
53+
end
54+
3655
raise RepoSshKeyMissing if repository.key.nil?
3756
end
57+
58+
def save_audit(repository)
59+
app_id = Travis::Api::App::AccessToken.find_by_token(access_control.token)&.app_id
60+
change_source = (app_id.nil? || app_id == 2) ? 'admin-v2' : 'travis-api'
61+
Travis::API::V3::Models::Audit.create!(owner: access_control.user, change_source: change_source, source: repository, source_changes: { active: [false, true] })
62+
end
3863
end
3964
end

lib/travis/api/v3/services/repository/deactivate.rb

+37
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,49 @@ def run!(activate = false)
1212
user_id: admin.id,
1313
activate: activate
1414
)
15+
16+
if repository.perforce?
17+
begin
18+
remote_vcs_repository.delete_perforce_group(
19+
repository_id: repository.id,
20+
user_id: admin.id
21+
)
22+
rescue Travis::RemoteVCS::ResponseError
23+
# Do nothing, the group is already removed
24+
end
25+
26+
if repository.key.present?
27+
repository.key.generate_keys!
28+
repository.key.save!
29+
end
30+
elsif repository.key.present?
31+
keys = remote_vcs_repository.keys(
32+
repository_id: repository.id,
33+
user_id: admin.id
34+
)
35+
fingerprint = PrivateKey.new(repository.key.private_key).fingerprint.gsub(':', '')
36+
matched_key = keys.detect { |key| key['fingerprint'] == fingerprint }
37+
remote_vcs_repository.delete_key(
38+
repository_id: repository.id,
39+
user_id: admin.id,
40+
id: matched_key['id']
41+
) if matched_key.present?
42+
repository.key.destroy if repository.subversion?
43+
end
44+
1545
repository.update_attributes(active: activate)
46+
save_audit(repository)
1647
result repository
1748
end
1849

1950
def check_access(repository)
2051
access_control.permissions(repository).deactivate!
2152
end
53+
54+
def save_audit(repository)
55+
app_id = Travis::Api::App::AccessToken.find_by_token(access_control.token)&.app_id
56+
change_source = (app_id.nil? || app_id == 2) ? 'admin-v2' : 'travis-api'
57+
Travis::API::V3::Models::Audit.create!(owner: access_control.user, change_source: change_source, source: repository, source_changes: { active: [true, false] })
58+
end
2259
end
2360
end

lib/travis/api/v3/services/repository/find.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
module Travis::API::V3
22
class Services::Repository::Find < Service
3+
params :server_type
4+
35
def run!
46
result find
57
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module Travis::API::V3
2+
class Services::RepositoryVcs::Find < Service
3+
def run!
4+
result find, type: :repository
5+
end
6+
end
7+
end

lib/travis/remote_vcs/repository.rb

+24-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def set_hook(repository_id:, user_id:, activate: true)
1515
end
1616

1717
def keys(repository_id:, user_id:)
18-
request(:get, __method__) do |req|
18+
request(:get, __method__, false) do |req|
1919
req.url "repos/#{repository_id}/keys"
2020
req.params['user_id'] = user_id
2121
end
@@ -50,6 +50,29 @@ def show(repository_id:, admin_id: nil)
5050
rescue ResponseError
5151
nil
5252
end
53+
54+
def create_perforce_group(repository_id:, user_id:)
55+
request(:post, __method__) do |req|
56+
req.url "repos/#{repository_id}/perforce_groups"
57+
req.params['user_id'] = user_id
58+
end
59+
end
60+
61+
def delete_perforce_group(repository_id:, user_id:)
62+
request(:delete, __method__) do |req|
63+
req.url "repos/#{repository_id}/perforce_groups"
64+
req.params['user_id'] = user_id
65+
end
66+
end
67+
68+
def set_perforce_ticket(repository_id:, user_id:)
69+
request(:post, __method__, false) do |req|
70+
req.url "repos/#{repository_id}/perforce_ticket"
71+
req.params['user_id'] = user_id
72+
end
73+
rescue ResponseError
74+
{}
75+
end
5376
end
5477
end
5578
end

lib/travis/remote_vcs/user.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ def auth_request(provider: :github, redirect_uri:, state:, signup:)
1616
end
1717
end
1818

19-
def authenticate(provider: :github, code:, redirect_uri:)
19+
def authenticate(provider: :github, code:, redirect_uri:, cluster: nil)
2020
request(:post, __method__) do |req|
2121
req.url 'users/session'
2222
req.params['provider'] = provider
2323
req.params['code'] = code
2424
req.params['redirect_uri'] = redirect_uri
25+
req.params['cluster'] = cluster unless cluster.nil?
2526
end
2627
end
2728

spec/lib/github/services/set_key_spec.rb

+1-3
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@
1414
WebMock.stub_request(:get, "http://vcsfake.travis-ci.com/repos/#{repo.id}/keys?user_id=#{owner.id}")
1515
.to_return(
1616
status: 200,
17-
body: JSON.dump(
18-
data: keys,
19-
)
17+
body: JSON.dump(keys)
2018
)
2119
end
2220
let!(:delete_request) do

0 commit comments

Comments
 (0)