File tree Expand file tree Collapse file tree 5 files changed +20
-10
lines changed Expand file tree Collapse file tree 5 files changed +20
-10
lines changed Original file line number Diff line number Diff line change @@ -5,14 +5,15 @@ module Travis::API::V3
5
5
class AccessControl ::LogToken < AccessControl ::Generic
6
6
auth_type ( 'log.token' )
7
7
8
- attr_accessor :token
8
+ attr_accessor :token , :repo_can_write
9
9
10
10
def self . for_request ( type , token , env )
11
11
new ( token )
12
12
end
13
13
14
14
def initialize ( token )
15
15
self . token = token
16
+ self . repo_can_write = Travis ::API ::V3 ::LogToken . find ( token ) . repo_can_write
16
17
end
17
18
18
19
def temp_access?
Original file line number Diff line number Diff line change 1
1
module Travis ::API ::V3
2
2
class LogToken
3
- attr_accessor :job_id
3
+ attr_accessor :job_id , :repo_can_write
4
4
5
5
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 ] )
7
8
end
8
9
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
+
10
13
token = SecureRandom . urlsafe_base64 ( 16 )
11
- redis . set ( "l:#{ token } " , job . id )
14
+ redis . sadd ( "l:#{ token } " , [ job . id , repo_can_write ] )
12
15
redis . expire ( "l:#{ token } " , 1 . day )
13
16
token
14
17
end
@@ -17,8 +20,9 @@ def self.redis
17
20
Travis . redis
18
21
end
19
22
20
- def initialize ( job_id )
23
+ def initialize ( job_id , repo_can_write )
21
24
self . job_id = job_id
25
+ self . repo_can_write = repo_can_write
22
26
end
23
27
24
28
def matches? ( job )
Original file line number Diff line number Diff line change @@ -26,7 +26,7 @@ def render(representation)
26
26
raw_log_href = "/v3#{ raw_log_href } "
27
27
end
28
28
if enterprise? || model . repository_private?
29
- token = LogToken . create ( model . job )
29
+ token = LogToken . create ( model . job , access_control &. user &. id )
30
30
raw_log_href += "?log.token=#{ token } "
31
31
end
32
32
result [ '@raw_log_href' ] = raw_log_href
Original file line number Diff line number Diff line change @@ -4,9 +4,14 @@ class Services::Log::Find < Service
4
4
5
5
def run!
6
6
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
-
9
7
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
+
10
15
raise ( NotFound , :log ) unless access_control . visible? log
11
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
12
17
raise LogAccessDenied if job . repository . user_settings . job_log_access_based_limit && !repo_can_write
Original file line number Diff line number Diff line change 141
141
end
142
142
143
143
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 }
145
145
before { repo . update_attribute ( :private , true ) }
146
146
before { get ( "/v3/job/#{ job . id } ?log.token=#{ log_token } " , { } , { } ) }
147
147
after { repo . update_attribute ( :private , false ) }
You can’t perform that action at this time.
0 commit comments