Feature #37530 » 37530-v2.patch
| app/views/settings/_display.html.erb | ||
|---|---|---|
| 28 | 28 | |
| 29 | 29 |
<p><%= setting_text_field :thumbnails_size, :size => 6 %></p> |
| 30 | 30 | |
| 31 |
<p><%= setting_text_field :thumbnails_timeout, :size => 6 %></p> |
|
| 32 | ||
| 31 | 33 |
<p><%= setting_select :new_item_menu_tab, [[l(:label_none), '0'], [l(:label_new_project_issue_tab_enabled), '1'], [l(:label_new_object_tab_enabled), '2']] %></p> |
| 32 | 34 |
</div> |
| 33 | 35 | |
| config/locales/en.yml | ||
|---|---|---|
| 494 | 494 |
setting_session_timeout: Session inactivity timeout |
| 495 | 495 |
setting_thumbnails_enabled: Display attachment thumbnails |
| 496 | 496 |
setting_thumbnails_size: Thumbnails size (in pixels) |
| 497 |
setting_thumbnails_timeout: Thumbnails creation timeout (in seconds) |
|
| 497 | 498 |
setting_non_working_week_days: Non-working days |
| 498 | 499 |
setting_jsonp_enabled: Enable JSONP support |
| 499 | 500 |
setting_default_projects_tracker_ids: Default trackers for new projects |
| config/settings.yml | ||
|---|---|---|
| 325 | 325 |
thumbnails_size: |
| 326 | 326 |
format: int |
| 327 | 327 |
default: 100 |
| 328 |
thumbnails_timeout: |
|
| 329 |
format: int |
|
| 330 |
default: 10 |
|
| 328 | 331 |
non_working_week_days: |
| 329 | 332 |
serialized: true |
| 330 | 333 |
default: |
| lib/redmine/thumbnail.rb | ||
|---|---|---|
| 18 | 18 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 19 | 19 | |
| 20 | 20 |
require 'fileutils' |
| 21 |
require 'timeout' |
|
| 21 | 22 | |
| 22 | 23 |
module Redmine |
| 23 | 24 |
module Thumbnail |
| ... | ... | |
| 51 | 52 |
else |
| 52 | 53 |
cmd = "#{shell_quote CONVERT_BIN} #{shell_quote source} -auto-orient -thumbnail #{shell_quote size_option} #{shell_quote target}"
|
| 53 | 54 |
end |
| 54 |
unless system(cmd) |
|
| 55 |
logger.error("Creating thumbnail failed (#{$?}):\nCommand: #{cmd}")
|
|
| 55 | ||
| 56 |
pid = nil |
|
| 57 |
begin |
|
| 58 |
Timeout.timeout(Setting.thumbnails_timeout.to_i) do |
|
| 59 |
pid = Process.spawn(cmd) |
|
| 60 |
_, status = Process.wait2(pid) |
|
| 61 |
unless status.success? |
|
| 62 |
logger.error("Creating thumbnail failed (#{status.exitstatus}):\nCommand: #{cmd}")
|
|
| 63 |
return nil |
|
| 64 |
end |
|
| 65 |
end |
|
| 66 |
rescue Timeout::Error |
|
| 67 |
begin |
|
| 68 |
Process.kill('TERM', pid)
|
|
| 69 |
Timeout.timeout(1) { Process.wait(pid) }
|
|
| 70 |
rescue Timeout::Error |
|
| 71 |
Process.kill('KILL', pid)
|
|
| 72 |
end |
|
| 73 |
logger.error("Creating thumbnail timed out:\nCommand: #{cmd}")
|
|
| 56 | 74 |
return nil |
| 57 | 75 |
end |
| 58 | 76 |
end |
| test/unit/attachment_test.rb | ||
|---|---|---|
| 626 | 626 |
ensure |
| 627 | 627 |
set_tmp_attachments_directory |
| 628 | 628 |
end |
| 629 | ||
| 630 |
def test_thumbnail_should_timeout |
|
| 631 |
dummy_pid = 37530 |
|
| 632 |
Process.stubs(:spawn).returns(dummy_pid) |
|
| 633 |
Process.stubs(:wait2).raises(Timeout::Error) |
|
| 634 |
Process.stubs(:kill).returns(1) |
|
| 635 |
Process.stubs(:wait).returns(dummy_pid) |
|
| 636 |
Rails.logger.expects(:error).with(regexp_matches(/Creating thumbnail timed out/)) |
|
| 637 | ||
| 638 |
set_fixtures_attachments_directory |
|
| 639 |
Attachment.clear_thumbnails |
|
| 640 | ||
| 641 |
attachment = Attachment.find(16) |
|
| 642 |
thumbnail = attachment.thumbnail |
|
| 643 | ||
| 644 |
assert_nil thumbnail |
|
| 645 |
ensure |
|
| 646 |
set_tmp_attachments_directory |
|
| 647 |
end |
|
| 629 | 648 |
else |
| 630 | 649 |
puts '(ImageMagick convert not available)' |
| 631 | 650 |
end |