Skip to content

Commit 952cfd1

Browse files
committed
Fix log token working with new log settings
1 parent 9db43ae commit 952cfd1

File tree

5 files changed

+20
-10
lines changed

5 files changed

+20
-10
lines changed

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: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
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+
values = redis.smembers("l:#{token}")
7+
new(values[0].to_i, !!values[1])
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.sadd("l:#{token}", [job.id, repo_can_write])
1215
redis.expire("l:#{token}", 1.day)
1316
token
1417
end
@@ -17,8 +20,9 @@ def self.redis
1720
Travis.redis
1821
end
1922

20-
def initialize(job_id)
23+
def initialize(job_id, repo_can_write)
2124
self.job_id = job_id
25+
self.repo_can_write = repo_can_write
2226
end
2327

2428
def matches?(job)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def render(representation)
2626
raw_log_href = "/v3#{raw_log_href}"
2727
end
2828
if enterprise? || model.repository_private?
29-
token = LogToken.create(model.job)
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: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,14 @@ 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
1116
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

spec/v3/services/job/find_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@
141141
end
142142

143143
describe "fetching job on private repository, private API, with a log.token" do
144-
let(:log_token) { Travis::API::V3::LogToken.create(job).to_s }
144+
let(:log_token) { Travis::API::V3::LogToken.create(job, owner.id).to_s }
145145
before { repo.update_attribute(:private, true) }
146146
before { get("/v3/job/#{job.id}?log.token=#{log_token}", {}, {}) }
147147
after { repo.update_attribute(:private, false) }

0 commit comments

Comments
 (0)