Skip to content

Commit a323de0

Browse files
author
Ang Ming Yi
committed
Add a new rule type that allows matching patterns in specific files
This allows one to specify pattern for files that are important such as CHANGELOG, and pattern to match such as Security Fix.
1 parent 49e26bd commit a323de0

File tree

10 files changed

+46
-5
lines changed

10 files changed

+46
-5
lines changed

app/controllers/rules_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,6 @@ def destroy
5757
private
5858

5959
def rule_params
60-
params.require(:rule).permit(:name, :rule_type_id, :value, :description, :notification_id)
60+
params.require(:rule).permit(:name, :rule_type_id, :value, :value2, :description, :notification_id)
6161
end
6262
end

app/views/rules/edit.html.erb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ limitations under the License.
4747
<%= f.text_area :value %>
4848
</p>
4949

50+
<p>
51+
<%= f.label :value2 %><br>
52+
<%= f.text_area :value2 %>
53+
</p>
54+
5055
<p>
5156
<%= f.label :description %><br>
5257
<%= f.text_field :description %>

app/views/rules/index.html.erb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ limitations under the License.
2424
<th>Name</th>
2525
<th>Rule Type Id</th>
2626
<th>Value</th>
27+
<th>Value 2</th>
2728
<th>Description</th>
2829
<th>Notification</th>
2930
<th colspan="2"></th>
@@ -34,6 +35,7 @@ limitations under the License.
3435
<td><%= rule.name %></td>
3536
<td><%= rule.rule_type_id %></td>
3637
<td><code><%= rule.value %></code></td>
38+
<td><code><%= rule.value2 %></code></td>
3739
<td><%= rule.description %></td>
3840
<td><%= rule.notification_id %></td>
3941
<td><%= link_to 'Edit', edit_rule_path(rule.id) %></td>

app/views/rules/new.html.erb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ limitations under the License.
4949
<%= f.text_area :value %>
5050
</p>
5151

52+
<p>
53+
<%= f.label :value2 %><br>
54+
<%= f.text_area :value2 %>
55+
</p>
56+
5257
<p>
5358
<%= f.label :description %><br>
5459
<%= f.text_field :description %>

config/rule_types.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,7 @@
2626
:name: 'expression'
2727
:requires_diff: true
2828
:description: 'Boolean expression referencing one or more rules'
29+
8:
30+
:name: 'specific_file_changes'
31+
:requires_diff: true
32+
:description: 'Regular expression for any code in a specified file'
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Sequel.migration do
2+
change do
3+
alter_table :rules do
4+
add_column :value2, 'longtext'
5+
end
6+
end
7+
end

db/schema.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
column :value, "longtext", :null=>false
6565
column :description, "text"
6666
foreign_key :notification_id, :notifications, :type=>"int(11) unsigned", :key=>[:id]
67+
column :value2, "longtext"
6768

6869
index [:name], :name=>:name, :unique=>true
6970
index [:notification_id], :name=>:notification_id
@@ -74,5 +75,6 @@
7475
change do
7576
self << "INSERT INTO `schema_migrations` (`filename`) VALUES ('20170118000000_initial_migration.rb')"
7677
self << "INSERT INTO `schema_migrations` (`filename`) VALUES ('20170119020524_add_credentials_to_projects.rb')"
78+
self << "INSERT INTO `schema_migrations` (`filename`) VALUES ('20171117075335_add_value_2_to_rules.rb')"
7779
end
7880
end

db/seeds.rb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -573,5 +573,3 @@
573573

574574
RuleSets.create(name: 'vulns', rules: ['strong_vuln_patterns'].to_json, description: 'Finds fixes for vulnerabilities')
575575
RuleSets.create(name: 'sensitive', rules: sensitive_rules.to_json, description: 'Finds files which may contain sensitive information')
576-
577-
Projects.create(name: 'srcclr/commit_watcher', rule_sets: ['vulns'].to_json)

lib/audit_results_builder.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@ def build(project_id, commit, diff, rules)
2727
audit_results = []
2828
auditor = RuleAuditor.new(@all_rules)
2929
rules.each do |r|
30+
value2 = r[:value2] || ''
3031
audit_result = auditor.audit(
3132
commit,
3233
r[:rule_type_id],
3334
r[:value],
34-
diff
35+
diff,
36+
value2
3537
)
3638
next unless audit_result
3739

lib/rules/rule_auditor.rb

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def initialize(all_rules)
2626
@all_rules = all_rules
2727
end
2828

29-
def audit(commit, rule_type_id, rule_value, diff)
29+
def audit(commit, rule_type_id, rule_value, diff, rule_value_2='')
3030
case rule_type_id
3131
when 1
3232
return unless diff
@@ -45,6 +45,8 @@ def audit(commit, rule_type_id, rule_value, diff)
4545
audit_commit_pattern(commit, Regexp.new(rule_value), diff)
4646
when 7
4747
audit_expression(commit, rule_value, diff)
48+
when 8
49+
audit_specific_file_changes_pattern(Regexp.new(rule_value), Regexp.new(rule_value_2), diff)
4850
end
4951
end
5052

@@ -157,4 +159,18 @@ def audit_commit_pattern(commit, pattern, diff)
157159
results.compact!
158160
results.empty? ? nil : results
159161
end
162+
163+
def audit_specific_file_changes_pattern(pattern, filename, diff)
164+
results = []
165+
return results if filename.blank?
166+
diff.each do |d|
167+
next if d.file.empty? || (d.file =~ filename).blank?
168+
next if d.body.empty? || (d.body =~ pattern).blank?
169+
results << {
170+
file: d.file,
171+
body: d.body,
172+
}
173+
end
174+
results.empty? ? nil : results
175+
end
160176
end

0 commit comments

Comments
 (0)