Feature #20008 » redmine-WhitelistAndBlacklist-attachment-extensions.diff
| app/models/attachment.rb (working copy) | ||
|---|---|---|
| 26 | 26 |
validates_length_of :filename, :maximum => 255 |
| 27 | 27 |
validates_length_of :disk_filename, :maximum => 255 |
| 28 | 28 |
validates_length_of :description, :maximum => 255 |
| 29 |
validate :validate_max_file_size |
|
| 29 |
validate :validate_max_file_size, :validate_file_extension
|
|
| 30 | 30 |
attr_protected :id |
| 31 | 31 | |
| 32 | 32 |
acts_as_event :title => :filename, |
| ... | ... | |
| 69 | 69 |
end |
| 70 | 70 |
end |
| 71 | 71 | |
| 72 |
def validate_file_extension |
|
| 73 |
blacklisted = false |
|
| 74 |
ext = File.extname(self.filename) |
|
| 75 | ||
| 76 |
# if defined, check whether file's extension is blacklisted |
|
| 77 |
if not Setting.attachment_extension_blacklist.empty? |
|
| 78 |
extension_blacklist = Setting.attachment_extension_blacklist.split(",").map { |s| '.' + s }
|
|
| 79 |
if extension_blacklist.include?(ext) |
|
| 80 |
blacklisted = true |
|
| 81 |
errors.add(:base, l(:error_attachment_extension_blacklisted, :blacklist => Setting.attachment_extension_blacklist)) |
|
| 82 |
end |
|
| 83 |
end |
|
| 84 | ||
| 85 |
# if defined, check whether file's extension is whitelisted |
|
| 86 |
if (not Setting.attachment_extension_whitelist.empty?) and (not blacklisted) |
|
| 87 |
extension_whitelist = Setting.attachment_extension_whitelist.split(",").map { |s| '.' + s }
|
|
| 88 |
if not extension_whitelist.include?(ext) |
|
| 89 |
errors.add(:base, l(:error_attachment_extension_not_whitelisted, :whitelist => Setting.attachment_extension_whitelist)) |
|
| 90 |
end |
|
| 91 |
end |
|
| 92 |
end |
|
| 93 | ||
| 72 | 94 |
def file=(incoming_file) |
| 73 | 95 |
unless incoming_file.nil? |
| 74 | 96 |
@temp_file = incoming_file |
| app/views/settings/_general.html.erb (working copy) | ||
|---|---|---|
| 7 | 7 |
<%= wikitoolbar_for 'settings_welcome_text' %> |
| 8 | 8 | |
| 9 | 9 |
<p><%= setting_text_field :attachment_max_size, :size => 6 %> <%= l(:"number.human.storage_units.units.kb") %></p> |
| 10 |
<p><%= setting_text_field :attachment_extension_whitelist %> |
|
| 11 |
<em class="info"><%= l(:text_comma_separated) %></em></p> |
|
| 12 |
<p><%= setting_text_field :attachment_extension_blacklist %> |
|
| 13 |
<em class="info"><%= l(:text_comma_separated) %></em></p> |
|
| 10 | 14 | |
| 11 | 15 |
<p><%= setting_text_field :per_page_options, :size => 20 %> |
| 12 | 16 |
<em class="info"><%= l(:text_comma_separated) %></em></p> |
| config/locales/en.yml (working copy) | ||
|---|---|---|
| 204 | 204 |
error_unable_delete_issue_status: 'Unable to delete issue status' |
| 205 | 205 |
error_unable_to_connect: "Unable to connect (%{value})"
|
| 206 | 206 |
error_attachment_too_big: "This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})"
|
| 207 |
error_attachment_extension_not_whitelisted: "Attachment extension not whitelisted; allowed extensions: %{whitelist}"
|
|
| 208 |
error_attachment_extension_blacklisted: "Attachment extension blacklisted; disallowed extensions: %{blacklist}"
|
|
| 207 | 209 |
error_session_expired: "Your session has expired. Please login again." |
| 208 | 210 |
warning_attachments_not_saved: "%{count} file(s) could not be saved."
|
| 209 | 211 |
error_password_expired: "Your password has expired or the administrator requires you to change it." |
| ... | ... | |
| 356 | 358 |
setting_login_required: Authentication required |
| 357 | 359 |
setting_self_registration: Self-registration |
| 358 | 360 |
setting_attachment_max_size: Maximum attachment size |
| 361 |
setting_attachment_extension_whitelist: Whitelisted attachment extensions |
|
| 362 |
setting_attachment_extension_blacklist: Blacklisted attachment extensions |
|
| 359 | 363 |
setting_issues_export_limit: Issues export limit |
| 360 | 364 |
setting_mail_from: Emission email address |
| 361 | 365 |
setting_bcc_recipients: Blind carbon copy recipients (bcc) |
| config/settings.yml (working copy) | ||
|---|---|---|
| 55 | 55 |
attachment_max_size: |
| 56 | 56 |
format: int |
| 57 | 57 |
default: 5120 |
| 58 |
attachment_extension_whitelist: |
|
| 59 |
default: |
|
| 60 |
attachment_extension_blacklist: |
|
| 61 |
default: |
|
| 58 | 62 |
issues_export_limit: |
| 59 | 63 |
format: int |
| 60 | 64 |
default: 500 |