Commit 0111638e4bf10b3bb08876c8df5622b424d11f35
Exists in
master
and in
29 other branches
Merge branch 'stable'
Showing
19 changed files
with
118 additions
and
17 deletions
Show diff stats
app/helpers/application_helper.rb
... | ... | @@ -1121,7 +1121,7 @@ module ApplicationHelper |
1121 | 1121 | |
1122 | 1122 | (_('Welcome, %s') % link_to('<i></i><strong>{login}</strong>', @environment.top_url + '/{login}', :id => "homepage-link", :title => _('Go to your homepage'))) + |
1123 | 1123 | render_environment_features(:usermenu) + |
1124 | - link_to('<i class="icon-menu-admin"></i><strong>' + _('Administration') + '</strong>', { :host => @environment.default_hostname, :controller => 'admin_panel', :action => 'index' }, :id => "controlpanel", :title => _("Configure the environment"), :class => 'admin-link', :style => 'display: none') + | |
1124 | + link_to('<i class="icon-menu-admin"></i><strong>' + _('Administration') + '</strong>', @environment.top_url + '/admin', :id => "controlpanel", :title => _("Configure the environment"), :class => 'admin-link', :style => 'display: none') + | |
1125 | 1125 | manage_enterprises.to_s + |
1126 | 1126 | link_to('<i class="icon-menu-ctrl-panel"></i><strong>' + _('Control panel') + '</strong>', @environment.top_url + '/myprofile/{login}', :id => "controlpanel", :title => _("Configure your personal account and content")) + |
1127 | 1127 | pending_tasks_count + | ... | ... |
app/models/approve_article.rb
... | ... | @@ -77,6 +77,10 @@ class ApproveArticle < Task |
77 | 77 | true |
78 | 78 | end |
79 | 79 | |
80 | + def reject_details | |
81 | + true | |
82 | + end | |
83 | + | |
80 | 84 | def default_decision |
81 | 85 | if article |
82 | 86 | 'skip' |
... | ... | @@ -107,4 +111,11 @@ class ApproveArticle < Task |
107 | 111 | end |
108 | 112 | end |
109 | 113 | |
114 | + def task_cancelled_message | |
115 | + message = _('Your request for publishing the article "{article}" was rejected.') | |
116 | + if !reject_explanation.blank? | |
117 | + message += " " + _("Here is the reject explanation left by the administrator who rejected your article: \n\n%{reject_explanation}") % {:reject_explanation => reject_explanation} | |
118 | + end | |
119 | + end | |
120 | + | |
110 | 121 | end | ... | ... |
app/models/environment.rb
... | ... | @@ -9,6 +9,13 @@ class Environment < ActiveRecord::Base |
9 | 9 | |
10 | 10 | has_many :tasks, :dependent => :destroy, :as => 'target' |
11 | 11 | |
12 | + IDENTIFY_SCRIPTS = /(?:php[0-9s]?(\..*)?|[sp]htm[l]?(\..*)?|pl|py|cgi|rb)/ | |
13 | + | |
14 | + def self.verify_filename(filename) | |
15 | + filename += '.txt' if filename =~ IDENTIFY_SCRIPTS | |
16 | + filename | |
17 | + end | |
18 | + | |
12 | 19 | PERMISSIONS['Environment'] = { |
13 | 20 | 'view_environment_admin_panel' => N_('View environment admin panel'), |
14 | 21 | 'edit_environment_features' => N_('Edit environment features'), |
... | ... | @@ -523,9 +530,6 @@ class Environment < ActiveRecord::Base |
523 | 530 | domain = (self.domains.find_by_is_default(true) || self.domains.find(:first, :order => 'id')).name |
524 | 531 | domain = email_hostname ? domain : (force_www ? ('www.' + domain) : domain) |
525 | 532 | end |
526 | - if Noosfero.url_options.has_key?(:port) | |
527 | - domain += ":#{Noosfero.url_options[:port]}" | |
528 | - end | |
529 | 533 | domain |
530 | 534 | end |
531 | 535 | ... | ... |
app/models/image.rb
app/models/thumbnail.rb
app/models/uploaded_file.rb
... | ... | @@ -18,6 +18,8 @@ class UploadedFile < Article |
18 | 18 | |
19 | 19 | validates_size_of :title, :maximum => 60, :if => (lambda { |file| !file.title.blank? }) |
20 | 20 | |
21 | + sanitize_filename | |
22 | + | |
21 | 23 | before_create do |uploaded_file| |
22 | 24 | uploaded_file.is_image = true if uploaded_file.image? |
23 | 25 | end | ... | ... |
... | ... | @@ -0,0 +1 @@ |
1 | +require 'upload_sanitizer' | ... | ... |
debian/changelog
features/approve_article.feature
... | ... | @@ -5,9 +5,9 @@ Feature: approve article |
5 | 5 | |
6 | 6 | Background: |
7 | 7 | Given the following users |
8 | - | login | name | | |
9 | - | joaosilva | Joao Silva | | |
10 | - | mariasilva | Maria Silva | | |
8 | + | login | name | email | | |
9 | + | joaosilva | Joao Silva | joaosilva@example.com | | |
10 | + | mariasilva | Maria Silva | mariasilva@example.com | | |
11 | 11 | And the following articles |
12 | 12 | | owner | name | body | homepage | |
13 | 13 | | mariasilva | Sample Article | This is an article | true | |
... | ... | @@ -34,3 +34,20 @@ Feature: approve article |
34 | 34 | And I go to Sample Community's sitemap |
35 | 35 | And I follow "Sample Article" |
36 | 36 | Then I should see "This is an article edited" |
37 | + | |
38 | + @selenium | |
39 | + Scenario: reject an article with explanation | |
40 | + Given I am logged in as "mariasilva" | |
41 | + And I go to Maria Silva's cms | |
42 | + And I follow "Sample Article" | |
43 | + And I follow "Spread" and wait | |
44 | + And I check "Sample Community" | |
45 | + And I press "Spread this" | |
46 | + And I am logged in as "joaosilva" | |
47 | + And I go to Sample Community's control panel | |
48 | + And I follow "Process requests" and wait | |
49 | + And I choose "Reject" | |
50 | + And I fill in "Rejection explanation" with "This is not an appropriate article for this community." | |
51 | + And I press "Apply!" | |
52 | + When I go to Sample Community's sitemap | |
53 | + Then I should not see "Sample Article" | ... | ... |
features/profile_domain.feature
... | ... | @@ -69,4 +69,4 @@ Feature: domain for profile |
69 | 69 | Scenario: Compose link to administration with environment domain |
70 | 70 | Given I am logged in as "joaosilva" |
71 | 71 | When I visit "/" and wait |
72 | - Then I should see "Administration" linking to "http://127.0.0.1:3001/admin" | |
72 | + Then I should see "Administration" linking to "http://127.0.0.1/admin" | ... | ... |
lib/feed_handler.rb
... | ... | @@ -65,7 +65,12 @@ class FeedHandler |
65 | 65 | if container.update_errors > FeedHandler.max_errors |
66 | 66 | container.enabled = false |
67 | 67 | end |
68 | - container.finish_fetch | |
68 | + begin | |
69 | + container.finish_fetch | |
70 | + rescue Exception => finish_fetch_exception | |
71 | + RAILS_DEFAULT_LOGGER.warn("Unable to finish fetch from %s ID %d\n%s" % [container.class.name, container.id, finish_fetch_exception.to_s]) | |
72 | + RAILS_DEFAULT_LOGGER.warn("Backtrace:\n%s" % finish_fetch_exception.backtrace.join("\n")) | |
73 | + end | |
69 | 74 | end |
70 | 75 | end |
71 | 76 | ... | ... |
lib/noosfero.rb
... | ... | @@ -0,0 +1,13 @@ |
1 | +module UploadSanitizer | |
2 | + def self.included(base) | |
3 | + base.extend(ClassMethods) | |
4 | + end | |
5 | + | |
6 | + module ClassMethods | |
7 | + def sanitize_filename | |
8 | + before_create { |file| file.filename = Environment.verify_filename(file.filename) } | |
9 | + end | |
10 | + end | |
11 | +end | |
12 | + | |
13 | +ActiveRecord::Base.send(:include, UploadSanitizer) | ... | ... |
... | ... | @@ -0,0 +1 @@ |
1 | +<? print("Hello World"); ?> | ... | ... |
test/unit/environment_test.rb
... | ... | @@ -234,11 +234,9 @@ class EnvironmentTest < Test::Unit::TestCase |
234 | 234 | |
235 | 235 | should 'include port in default top URL for development environment' do |
236 | 236 | env = Environment.new |
237 | - env.expects(:default_hostname).returns('www.lalala.net') | |
238 | - | |
239 | 237 | Noosfero.expects(:url_options).returns({ :port => 9999 }).at_least_once |
240 | 238 | |
241 | - assert_equal 'http://www.lalala.net:9999', env.top_url | |
239 | + assert_equal 'http://localhost:9999', env.top_url | |
242 | 240 | end |
243 | 241 | |
244 | 242 | should 'use https when asked for a ssl url' do |
... | ... | @@ -1119,10 +1117,27 @@ class EnvironmentTest < Test::Unit::TestCase |
1119 | 1117 | assert_equal ["Meter", "Kilo", "Litre"], Environment.default.units.map(&:singular) |
1120 | 1118 | end |
1121 | 1119 | |
1122 | - should 'include port in default hostname for development environment' do | |
1120 | + should 'not include port in default hostname' do | |
1123 | 1121 | env = Environment.new |
1124 | - Noosfero.expects(:url_options).returns({ :port => 9999 }).at_least_once | |
1125 | - assert_equal 'localhost:9999', env.default_hostname | |
1122 | + Noosfero.stubs(:url_options).returns({ :port => 9999 }) | |
1123 | + assert_no_match /9999/, env.default_hostname | |
1124 | + end | |
1125 | + | |
1126 | + should 'identify scripts with regex' do | |
1127 | + scripts_extensions = %w[php php1 php4 phps php.bli cgi shtm phtm shtml phtml pl py rb] | |
1128 | + name = 'uploaded_file' | |
1129 | + scripts_extensions.each do |extension| | |
1130 | + assert_not_nil name+'.'+extension =~ Environment::IDENTIFY_SCRIPTS | |
1131 | + end | |
1132 | + end | |
1133 | + | |
1134 | + should 'verify filename and append .txt if script' do | |
1135 | + scripts_extensions = %w[php php1 php4 phps php.bli cgi shtm phtm shtml phtml pl py rb] | |
1136 | + name = 'uploaded_file' | |
1137 | + scripts_extensions.each do |extension| | |
1138 | + filename = name+'.'+extension | |
1139 | + assert_equal filename+'.txt', Environment.verify_filename(filename) | |
1140 | + end | |
1126 | 1141 | end |
1127 | 1142 | |
1128 | 1143 | end | ... | ... |
test/unit/feed_handler_test.rb
... | ... | @@ -114,4 +114,11 @@ class FeedHandlerTest < Test::Unit::TestCase |
114 | 114 | end |
115 | 115 | end |
116 | 116 | |
117 | + should 'not crash even when finish fetch fails' do | |
118 | + container.stubs(:finish_fetch).raises(Exception.new("crash")) | |
119 | + assert_nothing_raised do | |
120 | + handler.process(container) | |
121 | + end | |
122 | + end | |
123 | + | |
117 | 124 | end | ... | ... |
test/unit/image_test.rb
... | ... | @@ -118,4 +118,9 @@ class ImageTest < Test::Unit::TestCase |
118 | 118 | file.destroy |
119 | 119 | end |
120 | 120 | |
121 | + should 'not allow script files to be uploaded without append .txt in the end' do | |
122 | + file = Image.create!(:uploaded_data => fixture_file_upload('files/hello_world.php', 'image/png')) | |
123 | + assert_equal 'hello_world.php.txt', file.filename | |
124 | + end | |
125 | + | |
121 | 126 | end | ... | ... |
test/unit/thumbnail_test.rb
... | ... | @@ -9,5 +9,10 @@ class ThumbnailTest < Test::Unit::TestCase |
9 | 9 | assert_match 'image/', item |
10 | 10 | end |
11 | 11 | end |
12 | + | |
13 | + should 'not allow script files to be uploaded without append .txt in the end' do | |
14 | + file = Thumbnail.create!(:uploaded_data => fixture_file_upload('files/hello_world.php', 'image/png')) | |
15 | + assert_equal 'hello_world.php.txt', file.filename | |
16 | + end | |
12 | 17 | |
13 | 18 | end | ... | ... |
test/unit/uploaded_file_test.rb
... | ... | @@ -325,4 +325,9 @@ class UploadedFileTest < Test::Unit::TestCase |
325 | 325 | uses_sqlite |
326 | 326 | end |
327 | 327 | |
328 | + should 'not allow script files to be uploaded without append .txt in the end' do | |
329 | + file = UploadedFile.create!(:uploaded_data => fixture_file_upload('files/hello_world.php', 'application/x-php'), :profile => @profile) | |
330 | + assert_equal 'hello_world.php.txt', file.filename | |
331 | + end | |
332 | + | |
328 | 333 | end | ... | ... |