Skip to content

Commit cfcd61a

Browse files
Merge pull request #1252 from travis-ci/fix_log_token_am
Fix disable job logs issues
2 parents 9db43ae + e9bbb06 commit cfcd61a

File tree

12 files changed

+59
-23
lines changed

12 files changed

+59
-23
lines changed

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,13 @@ class Logs < Endpoint
1414
repo = Travis::API::V3::Models::Repository.find(job.repository.id)
1515
repo_can_write = current_user ? !!repo.users.where(id: current_user.id, permissions: { push: true }).first : false
1616

17-
raise LogExpired if repo.user_settings.job_log_time_based_limit && job.started_at && job.started_at < Time.now - repo.user_settings.job_log_access_older_than_days.days
18-
raise LogAccessDenied if repo.user_settings.job_log_access_based_limit && !repo_can_write
17+
if !repo.user_settings.job_log_time_based_limit && job.started_at && job.started_at < Time.now - repo.user_settings.job_log_access_older_than_days.days
18+
halt 403, { error: { message: "We're sorry, but this data is not available anymore. Please check the repository settings in Travis CI." } }
19+
end
20+
21+
if repo.user_settings.job_log_access_based_limit && !repo_can_write
22+
halt 403, { error: { message: "We're sorry, but this data is not available. Please check the repository settings in Travis CI." } }
23+
end
1924

2025
if !resource || ((job.try(:private?) || !allow_public?) && !has_permission?(job))
2126
halt 404

lib/travis/api/v3/access_control/log_token.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ module Travis::API::V3
55
class AccessControl::LogToken < AccessControl::Generic
66
auth_type('log.token')
77

8-
attr_accessor :token
8+
attr_accessor :token, :repo_can_write
99

1010
def self.for_request(type, token, env)
1111
new(token)
1212
end
1313

1414
def initialize(token)
1515
self.token = token
16+
self.repo_can_write = Travis::API::V3::LogToken.find(token).repo_can_write
1617
end
1718

1819
def temp_access?

lib/travis/api/v3/log_token.rb

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
module Travis::API::V3
22
class LogToken
3-
attr_accessor :job_id
3+
attr_accessor :job_id, :repo_can_write
44

55
def self.find(token)
6-
new(redis.get("l:#{token}").to_i)
6+
key = "l:#{token}"
7+
new(redis.hget(key, :job_id).to_i, !!redis.hget(key, :repo_can_write))
78
end
89

9-
def self.create(job)
10+
def self.create(job, user_id)
11+
repo_can_write = !!job.repository.users.where(id: user_id, permissions: { push: true }).first
12+
1013
token = SecureRandom.urlsafe_base64(16)
11-
redis.set("l:#{token}", job.id)
14+
redis.hset("l:#{token}", :job_id, job.id)
15+
redis.hset("l:#{token}", :repo_can_write, repo_can_write)
1216
redis.expire("l:#{token}", 1.day)
1317
token
1418
end
@@ -17,8 +21,9 @@ def self.redis
1721
Travis.redis
1822
end
1923

20-
def initialize(job_id)
24+
def initialize(job_id, repo_can_write)
2125
self.job_id = job_id
26+
self.repo_can_write = repo_can_write
2227
end
2328

2429
def matches?(job)

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ def repository_private?
2727
job.repository.private?
2828
end
2929

30+
def repository
31+
@repository ||= Travis::API::V3::Models::Repository.find(job.repository.id)
32+
end
33+
3034
private
3135

3236
def archived_log_part

lib/travis/api/v3/renderer/log.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ def render(representation)
2525
if raw_log_href !~ /^\/v3/
2626
raw_log_href = "/v3#{raw_log_href}"
2727
end
28-
if enterprise? || model.repository_private?
29-
token = LogToken.create(model.job)
28+
if enterprise? || model.repository_private? || model.repository.user_settings.job_log_access_based_limit
29+
token = LogToken.create(model.job, access_control&.user&.id)
3030
raw_log_href += "?log.token=#{token}"
3131
end
3232
result['@raw_log_href'] = raw_log_href

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,16 @@ class Services::Log::Find < Service
44

55
def run!
66
job = Models::Job.find(params['job.id'])
7-
repo_can_write = access_control.user ? !!job.repository.users.where(id: access_control.user.id, permissions: { push: true }).first : false
8-
97
log = query.find(job)
8+
repo_can_write = false
9+
if access_control.is_a?(Travis::API::V3::AccessControl::LogToken)
10+
repo_can_write = access_control.repo_can_write
11+
elsif access_control.user
12+
repo_can_write = !!job.repository.users.where(id: access_control.user.id, permissions: { push: true }).first
13+
end
14+
1015
raise(NotFound, :log) unless access_control.visible? log
11-
raise LogExpired if job.repository.user_settings.job_log_time_based_limit && job.started_at && job.started_at < Time.now - job.repository.user_settings.job_log_access_older_than_days.days
16+
raise LogExpired if !job.repository.user_settings.job_log_time_based_limit && job.started_at && job.started_at < Time.now - job.repository.user_settings.job_log_access_older_than_days.days
1217
raise LogAccessDenied if job.repository.user_settings.job_log_access_based_limit && !repo_can_write
1318

1419
result log

spec/auth/v1/logs_spec.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@
66
let(:log) { double(id: 1) }
77

88
let(:log_url) { "#{Travis.config[:logs_api][:url]}/logs/1?by=id&source=api" }
9-
before { stub_request(:get, log_url).to_return(status: 200, body: %({"job_id": #{job.id}, "content": "content"})) }
9+
before do
10+
stub_request(:get, log_url).to_return(status: 200, body: %({"job_id": #{job.id}, "content": "content"}))
11+
repository = Travis::API::V3::Models::Repository.find(repo.id)
12+
repository.user_settings.update(:job_log_time_based_limit, true)
13+
repository.save!
14+
end
1015

1116
describe 'in public mode, with a private repo', mode: :public, repo: :private do
1217
describe 'GET /logs/%{log.id}' do

spec/auth/v2.1/logs_spec.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232
allow(remote).to receive(:find_by_job_id).and_return(Travis::RemoteLog.new(log_from_api))
3333
allow(remote).to receive(:find_by_id).and_return(Travis::RemoteLog.new(log_from_api))
3434
allow(remote).to receive(:fetch_archived_log_content).and_return(archived_content)
35+
repository = Travis::API::V3::Models::Repository.find(repo.id)
36+
repository.user_settings.update(:job_log_time_based_limit, true)
37+
repository.save!
3538
end
3639

3740
describe 'in public mode, with a private repo', mode: :public, repo: :private do

spec/auth/v2/logs_spec.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232
allow(remote).to receive(:find_by_job_id).and_return(Travis::RemoteLog.new(log_from_api))
3333
allow(remote).to receive(:find_by_id).and_return(Travis::RemoteLog.new(log_from_api))
3434
allow(remote).to receive(:fetch_archived_log_content).and_return(archived_content)
35+
repository = Travis::API::V3::Models::Repository.find(repo.id)
36+
repository.user_settings.update(:job_log_time_based_limit, true)
37+
repository.save!
3538
end
3639

3740
describe 'in public mode, with a private repo', mode: :public, repo: :private do

spec/integration/visibility_spec.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
before { requests[0].update_attributes(private: false) }
1717
before { builds[0].update_attributes(private: false) }
1818
before { jobs[0].update_attributes(private: false) }
19+
before do
20+
repository = Travis::API::V3::Models::Repository.find(repo.id)
21+
repository.user_settings.update(:job_log_time_based_limit, true)
22+
repository.save!
23+
end
1924
before :each do
2025
Fog.mock!
2126
storage = Fog::Storage.new({

0 commit comments

Comments
 (0)