Skip to content

Commit 0387257

Browse files
committed
Add audit log for repo settings
1 parent 96a228c commit 0387257

File tree

6 files changed

+36
-4
lines changed

6 files changed

+36
-4
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ class Logs < Endpoint
88
get '/:id' do |id|
99
resource = service(:find_log, id: params[:id]).run
1010
job = resource ? Job.find(resource.job_id) : nil
11+
repo_can_write = !!job.repository.users.where(id: current_user.id, permissions: { push: true }).first
12+
13+
raise LogExpired if !job.repository.user_settings.job_log_time_based_limit && job.started_at < Time.now - job.repository.user_settings.job_log_access_older_than_days.days
14+
raise LogAccessDenied if job.repository.user_settings.job_log_access_based_limit && !repo_can_write
1115

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

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module Travis::API::V3
2+
class Models::Audit < Model
3+
belongs_to :owner, polymorphic: true
4+
belongs_to :source, polymorphic: true
5+
end
6+
end

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
module Travis::API::V3
44
class Models::JsonSlice
5-
include Virtus.model, Enumerable, Models::JsonSync, ActiveModel::Validations
5+
include Virtus.model, Enumerable, Models::JsonSync, ActiveModel::Validations, ActiveSupport::Callbacks, ActiveModel::Dirty
6+
extend ActiveSupport::Concern
7+
define_callbacks :after_save
68

79
class << self
810
attr_accessor :child_klass
@@ -30,14 +32,21 @@ def read(name)
3032

3133
def update(name, value)
3234
raise NotFound unless respond_to?(:"#{name}=")
35+
@changes = { :"#{name}" => { before: send(name), after: value } } unless value == send(name)
3336
send(:"#{name}=", value)
3437
raise UnprocessableEntity, errors.full_messages.to_sentence unless valid?
3538
sync!
39+
run_callbacks :after_save
40+
@changes = {}
3641
read(name)
3742
end
3843

3944
def to_h
4045
Hash[map { |x| [x.name, x.value] }]
4146
end
47+
48+
def changes
49+
@changes
50+
end
4251
end
4352
end

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,12 @@ class Models::UserSettings < Models::JsonSlice
2020

2121
validate :job_log_access_older_than_days_restriction
2222

23+
set_callback :after_save, :after, :save_audit
24+
2325
attr_reader :repo
2426

27+
attr_accessor :user, :change_source
28+
2529
def initialize(repo, data)
2630
@repo = repo
2731
super(data)
@@ -75,5 +79,11 @@ def job_log_access_older_than_days_restriction
7579
errors.add(:job_log_access_older_than_days, "is outside the bounds")
7680
end
7781
end
82+
83+
private
84+
85+
def save_audit
86+
Travis::API::V3::Models::Audit.create!(owner: self.user, change_source: self.change_source, source: self.repo, source_changes: { settings: self.changes })
87+
end
7888
end
7989
end

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@ def find(repository)
66
repository.user_settings.read(_name)
77
end
88

9-
def update(repository)
10-
repository.user_settings.update(_name, _value)
9+
def update(repository, user)
10+
user_settings = repository.user_settings
11+
user_settings.user = user
12+
user_settings.change_source = 'travis-api'
13+
user_settings.update(_name, _value)
1114
end
1215

1316
private

lib/travis/api/v3/services/user_setting/update.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def run!
1010
user_setting = query.find(repository)
1111
access_control.permissions(user_setting).write!
1212

13-
user_setting = query.update(repository)
13+
user_setting = query.update(repository, access_control.user)
1414
result user_setting
1515
end
1616
end

0 commit comments

Comments
 (0)