Commit 218cf0a55a36f477d65d498202d1d60efa39ae5f
Committed by
Joenio Costa
1 parent
01fecce0
Exists in
send_email_to_admins
and in
5 other branches
Set feed configurations as Environment attributes
As ENV vars are not the settings implementation choice through the, project, this is should turn this aspect of the feed fetching proxy functionality compliant with Noosfero's design choices.
Showing
10 changed files
with
129 additions
and
18 deletions
Show diff stats
app/models/environment.rb
@@ -13,7 +13,9 @@ class Environment < ActiveRecord::Base | @@ -13,7 +13,9 @@ class Environment < ActiveRecord::Base | ||
13 | :reports_lower_bound, :noreply_email, | 13 | :reports_lower_bound, :noreply_email, |
14 | :signup_welcome_screen_body, :members_whitelist_enabled, | 14 | :signup_welcome_screen_body, :members_whitelist_enabled, |
15 | :members_whitelist, :highlighted_news_amount, | 15 | :members_whitelist, :highlighted_news_amount, |
16 | - :portal_news_amount, :date_format, :signup_intro | 16 | + :portal_news_amount, :date_format, :signup_intro, |
17 | + :enable_feed_proxy, :http_feed_proxy, :https_feed_proxy, | ||
18 | + :disable_feed_ssl | ||
17 | 19 | ||
18 | has_many :users | 20 | has_many :users |
19 | 21 |
app/views/features/index.html.erb
@@ -49,6 +49,25 @@ Check all the features you want to enable for your environment, uncheck all the | @@ -49,6 +49,25 @@ Check all the features you want to enable for your environment, uncheck all the | ||
49 | </div> | 49 | </div> |
50 | <hr/> | 50 | <hr/> |
51 | 51 | ||
52 | +<h3><%= _('Feed') %></h3> | ||
53 | + <div class="option"> | ||
54 | + <%= check_box :environment, :enable_feed_proxy %> | ||
55 | + <label><%= _('Enable feed proxy') %></label> | ||
56 | + </div> | ||
57 | + <div class="input"> | ||
58 | + <div class="info"><%= _('HTTP feed proxy address:') %></div> | ||
59 | + <%= text_field :environment, :http_feed_proxy %> | ||
60 | + </div> | ||
61 | + <div class="input"> | ||
62 | + <div class="info"><%= _('HTTPS feed proxy address:') %></div> | ||
63 | + <%= text_field :environment, :https_feed_proxy %> | ||
64 | + </div> | ||
65 | + <div class="option"> | ||
66 | + <%= check_box :environment, :disable_feed_ssl %> | ||
67 | + <label><%= _('Disable feed SSL') %></label> | ||
68 | + </div> | ||
69 | +<hr/> | ||
70 | + | ||
52 | <div> | 71 | <div> |
53 | <% button_bar do %> | 72 | <% button_bar do %> |
54 | <%= submit_button('save', _('Save changes')) %> | 73 | <%= submit_button('save', _('Save changes')) %> |
db/migrate/20160408011124_add_enable_feed_proxy_to_environments.rb
0 → 100644
db/migrate/20160408011622_add_http_feed_proxy_to_environments.rb
0 → 100644
db/migrate/20160408011635_add_https_feed_proxy_to_environments.rb
0 → 100644
db/migrate/20160408011720_add_disable_feed_ssl_to_environments.rb
0 → 100644
db/schema.rb
@@ -11,7 +11,7 @@ | @@ -11,7 +11,7 @@ | ||
11 | # | 11 | # |
12 | # It's strongly recommended that you check this file into your version control system. | 12 | # It's strongly recommended that you check this file into your version control system. |
13 | 13 | ||
14 | -ActiveRecord::Schema.define(version: 20160324132518) do | 14 | +ActiveRecord::Schema.define(version: 20160408011720) do |
15 | 15 | ||
16 | # These are extensions that must be enabled in order to support this database | 16 | # These are extensions that must be enabled in order to support this database |
17 | enable_extension "plpgsql" | 17 | enable_extension "plpgsql" |
@@ -390,6 +390,10 @@ ActiveRecord::Schema.define(version: 20160324132518) do | @@ -390,6 +390,10 @@ ActiveRecord::Schema.define(version: 20160324132518) do | ||
390 | t.string "noreply_email" | 390 | t.string "noreply_email" |
391 | t.string "redirection_after_signup", default: "keep_on_same_page" | 391 | t.string "redirection_after_signup", default: "keep_on_same_page" |
392 | t.string "date_format", default: "month_name_with_year" | 392 | t.string "date_format", default: "month_name_with_year" |
393 | + t.boolean "enable_feed_proxy", default: false | ||
394 | + t.string "http_feed_proxy" | ||
395 | + t.string "https_feed_proxy" | ||
396 | + t.boolean "disable_feed_ssl", default: false | ||
393 | end | 397 | end |
394 | 398 | ||
395 | create_table "external_feeds", force: :cascade do |t| | 399 | create_table "external_feeds", force: :cascade do |t| |
lib/feed_handler.rb
@@ -42,13 +42,21 @@ class FeedHandler | @@ -42,13 +42,21 @@ class FeedHandler | ||
42 | if !valid_url?(address) | 42 | if !valid_url?(address) |
43 | raise InvalidUrl.new("\"%s\" is not a valid URL" % address) | 43 | raise InvalidUrl.new("\"%s\" is not a valid URL" % address) |
44 | end | 44 | end |
45 | + | ||
45 | header = {"User-Agent" => "Noosfero/#{Noosfero::VERSION}"} | 46 | header = {"User-Agent" => "Noosfero/#{Noosfero::VERSION}"} |
46 | - if address.starts_with?("https://") | ||
47 | - header.merge!(:proxy => ENV['FEED_HTTPS_PROXY']) if ENV['FEED_HTTPS_PROXY'] | ||
48 | - else | ||
49 | - header.merge!(:proxy => ENV['FEED_HTTP_PROXY']) if ENV['FEED_HTTP_PROXY'] | 47 | + |
48 | + environment = Environment.default | ||
49 | + | ||
50 | + if environment.enable_feed_proxy | ||
51 | + if address.starts_with?("https://") | ||
52 | + header.merge!(:proxy => environment.https_feed_proxy) if environment.https_feed_proxy | ||
53 | + else | ||
54 | + header.merge!(:proxy => environment.http_feed_proxy) if environment.http_feed_proxy | ||
55 | + end | ||
50 | end | 56 | end |
51 | - header.merge!(:ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE) if ENV['SSL_VERIFY_NONE'] | 57 | + |
58 | + header.merge!(:ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE) if environment.disable_feed_ssl | ||
59 | + | ||
52 | open(address, header, &block) | 60 | open(address, header, &block) |
53 | end | 61 | end |
54 | return content | 62 | return content |
test/unit/environment_test.rb
@@ -1723,4 +1723,42 @@ class EnvironmentTest < ActiveSupport::TestCase | @@ -1723,4 +1723,42 @@ class EnvironmentTest < ActiveSupport::TestCase | ||
1723 | refute environment.errors[:date_format.to_s].present? | 1723 | refute environment.errors[:date_format.to_s].present? |
1724 | end | 1724 | end |
1725 | 1725 | ||
1726 | + should 'respond to enable_feed_proxy' do | ||
1727 | + assert_respond_to Environment.new, :enable_feed_proxy | ||
1728 | + end | ||
1729 | + | ||
1730 | + should 'set enable_feed_proxy on environment' do | ||
1731 | + e = fast_create(Environment, :name => 'Enterprise test') | ||
1732 | + e.enable_feed_proxy = true | ||
1733 | + e.save | ||
1734 | + assert_equal true, e.enable_feed_proxy | ||
1735 | + end | ||
1736 | + | ||
1737 | + should 'not enable feed proxy when enable by default' do | ||
1738 | + assert_equal false, Environment.new.enable_feed_proxy | ||
1739 | + end | ||
1740 | + | ||
1741 | + should 'respond to disable_feed_ssl' do | ||
1742 | + assert_respond_to Environment.new, :disable_feed_ssl | ||
1743 | + end | ||
1744 | + | ||
1745 | + should 'set disable_feed_ssl on environment' do | ||
1746 | + e = fast_create(Environment, :name => 'Enterprise test') | ||
1747 | + e.disable_feed_ssl = true | ||
1748 | + e.save | ||
1749 | + assert_equal true, e.disable_feed_ssl | ||
1750 | + end | ||
1751 | + | ||
1752 | + should 'not disable feed ssl when enable by default' do | ||
1753 | + assert_equal false, Environment.new.disable_feed_ssl | ||
1754 | + end | ||
1755 | + | ||
1756 | + should 'respond to http_feed_proxy' do | ||
1757 | + assert_respond_to Environment.new, :http_feed_proxy | ||
1758 | + end | ||
1759 | + | ||
1760 | + should 'respond to https_feed_proxy' do | ||
1761 | + assert_respond_to Environment.new, :https_feed_proxy | ||
1762 | + end | ||
1763 | + | ||
1726 | end | 1764 | end |
test/unit/feed_handler_test.rb
@@ -5,14 +5,13 @@ class FeedHandlerTest < ActiveSupport::TestCase | @@ -5,14 +5,13 @@ class FeedHandlerTest < ActiveSupport::TestCase | ||
5 | def setup | 5 | def setup |
6 | @handler = FeedHandler.new | 6 | @handler = FeedHandler.new |
7 | @container = nil | 7 | @container = nil |
8 | - ENV.stubs('[]').with(anything) | ||
9 | end | 8 | end |
10 | attr_reader :handler | 9 | attr_reader :handler |
11 | def container | 10 | def container |
12 | @container ||= create(:feed_reader_block) | 11 | @container ||= create(:feed_reader_block) |
13 | end | 12 | end |
14 | 13 | ||
15 | - should 'fetch feed content' do | 14 | + should 'fetch feed content with proxy disabled and SSL enabled' do |
16 | content = handler.fetch(container.address) | 15 | content = handler.fetch(container.address) |
17 | assert_match /<description>Feed content<\/description>/, content | 16 | assert_match /<description>Feed content<\/description>/, content |
18 | assert_match /<title>Feed for unit tests<\/title>/, content | 17 | assert_match /<title>Feed for unit tests<\/title>/, content |
@@ -84,7 +83,11 @@ class FeedHandlerTest < ActiveSupport::TestCase | @@ -84,7 +83,11 @@ class FeedHandlerTest < ActiveSupport::TestCase | ||
84 | end | 83 | end |
85 | 84 | ||
86 | should 'identifies itself as noosfero user agent' do | 85 | should 'identifies itself as noosfero user agent' do |
86 | + Environment.any_instance.expects(:enable_feed_proxy).returns(false) | ||
87 | + Environment.any_instance.expects(:disable_feed_ssl).returns(false) | ||
88 | + | ||
87 | handler.expects(:open).with('http://site.org/feed.xml', {"User-Agent" => "Noosfero/#{Noosfero::VERSION}"}, anything).returns('bli content') | 89 | handler.expects(:open).with('http://site.org/feed.xml', {"User-Agent" => "Noosfero/#{Noosfero::VERSION}"}, anything).returns('bli content') |
90 | + | ||
88 | assert_equal 'bli content', handler.fetch('http://site.org/feed.xml') | 91 | assert_equal 'bli content', handler.fetch('http://site.org/feed.xml') |
89 | end | 92 | end |
90 | 93 | ||
@@ -150,35 +153,52 @@ class FeedHandlerTest < ActiveSupport::TestCase | @@ -150,35 +153,52 @@ class FeedHandlerTest < ActiveSupport::TestCase | ||
150 | end | 153 | end |
151 | end | 154 | end |
152 | 155 | ||
153 | - should 'set proxy when FEED_HTTP_PROXY is setted from env' do | ||
154 | - ENV.stubs('[]').with('FEED_HTTP_PROXY').returns('http://127.0.0.1:3128') | 156 | + should 'set proxy when http_feed_proxy is setted from env' do |
157 | + Environment.any_instance.expects(:enable_feed_proxy).returns(true) | ||
158 | + Environment.any_instance.expects(:disable_feed_ssl).returns(false) | ||
159 | + Environment.any_instance.expects(:http_feed_proxy).twice.returns('http://127.0.0.1:3128') | ||
160 | + | ||
155 | handler.expects(:open).with('http://site.org/feed.xml', {"User-Agent" => "Noosfero/#{Noosfero::VERSION}", :proxy => 'http://127.0.0.1:3128'}, anything).returns('bli content') | 161 | handler.expects(:open).with('http://site.org/feed.xml', {"User-Agent" => "Noosfero/#{Noosfero::VERSION}", :proxy => 'http://127.0.0.1:3128'}, anything).returns('bli content') |
162 | + | ||
156 | assert_equal 'bli content', handler.fetch('http://site.org/feed.xml') | 163 | assert_equal 'bli content', handler.fetch('http://site.org/feed.xml') |
157 | end | 164 | end |
158 | 165 | ||
159 | - should 'set proxy when FEED_HTTPS_PROXY is setted from env' do | ||
160 | - ENV.stubs('[]').with('FEED_HTTPS_PROXY').returns('http://127.0.0.1:3128') | 166 | + should 'set proxy when https_feed_proxy is setted from env' do |
167 | + Environment.any_instance.expects(:enable_feed_proxy).returns(true) | ||
168 | + Environment.any_instance.expects(:disable_feed_ssl).returns(false) | ||
169 | + Environment.any_instance.expects(:https_feed_proxy).twice.returns('http://127.0.0.1:3128') | ||
170 | + | ||
161 | handler.expects(:open).with('https://site.org/feed.xml', {"User-Agent" => "Noosfero/#{Noosfero::VERSION}", :proxy => 'http://127.0.0.1:3128'}, anything).returns('bli content') | 171 | handler.expects(:open).with('https://site.org/feed.xml', {"User-Agent" => "Noosfero/#{Noosfero::VERSION}", :proxy => 'http://127.0.0.1:3128'}, anything).returns('bli content') |
172 | + | ||
162 | assert_equal 'bli content', handler.fetch('https://site.org/feed.xml') | 173 | assert_equal 'bli content', handler.fetch('https://site.org/feed.xml') |
163 | end | 174 | end |
164 | 175 | ||
165 | should 'use https proxy for https address when both env variables were defined' do | 176 | should 'use https proxy for https address when both env variables were defined' do |
166 | - ENV.stubs('[]').with('FEED_HTTPS_PROXY').returns('http://127.0.0.2:3128') | ||
167 | - ENV.stubs('[]').with('FEED_HTTP_PROXY').returns('http://127.0.0.1:3128') | 177 | + Environment.any_instance.expects(:enable_feed_proxy).returns(true) |
178 | + Environment.any_instance.expects(:disable_feed_ssl).returns(false) | ||
179 | + Environment.any_instance.expects(:https_feed_proxy).twice.returns('http://127.0.0.2:3128') | ||
180 | + | ||
168 | handler.expects(:open).with('https://site.org/feed.xml', {"User-Agent" => "Noosfero/#{Noosfero::VERSION}", :proxy => 'http://127.0.0.2:3128'}, anything).returns('bli content') | 181 | handler.expects(:open).with('https://site.org/feed.xml', {"User-Agent" => "Noosfero/#{Noosfero::VERSION}", :proxy => 'http://127.0.0.2:3128'}, anything).returns('bli content') |
182 | + | ||
169 | assert_equal 'bli content', handler.fetch('https://site.org/feed.xml') | 183 | assert_equal 'bli content', handler.fetch('https://site.org/feed.xml') |
170 | end | 184 | end |
171 | 185 | ||
172 | should 'use http proxy for http address when both env variables were defined' do | 186 | should 'use http proxy for http address when both env variables were defined' do |
173 | - ENV.stubs('[]').with('FEED_HTTPS_PROXY').returns('http://127.0.0.2:3128') | ||
174 | - ENV.stubs('[]').with('FEED_HTTP_PROXY').returns('http://127.0.0.1:3128') | 187 | + Environment.any_instance.expects(:enable_feed_proxy).returns(true) |
188 | + Environment.any_instance.expects(:disable_feed_ssl).returns(false) | ||
189 | + Environment.any_instance.expects(:http_feed_proxy).twice.returns('http://127.0.0.1:3128') | ||
190 | + | ||
175 | handler.expects(:open).with('http://site.org/feed.xml', {"User-Agent" => "Noosfero/#{Noosfero::VERSION}", :proxy => 'http://127.0.0.1:3128'}, anything).returns('bli content') | 191 | handler.expects(:open).with('http://site.org/feed.xml', {"User-Agent" => "Noosfero/#{Noosfero::VERSION}", :proxy => 'http://127.0.0.1:3128'}, anything).returns('bli content') |
192 | + | ||
176 | assert_equal 'bli content', handler.fetch('http://site.org/feed.xml') | 193 | assert_equal 'bli content', handler.fetch('http://site.org/feed.xml') |
177 | end | 194 | end |
178 | 195 | ||
179 | should 'not verify ssl when define env parameter SSL_VERIFY_NONE' do | 196 | should 'not verify ssl when define env parameter SSL_VERIFY_NONE' do |
180 | - ENV.stubs('[]').with('SSL_VERIFY_NONE').returns(true) | 197 | + Environment.any_instance.expects(:enable_feed_proxy).returns(false) |
198 | + Environment.any_instance.expects(:disable_feed_ssl).returns(true) | ||
199 | + | ||
181 | handler.expects(:open).with('http://site.org/feed.xml', {"User-Agent" => "Noosfero/#{Noosfero::VERSION}", :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE}, anything) | 200 | handler.expects(:open).with('http://site.org/feed.xml', {"User-Agent" => "Noosfero/#{Noosfero::VERSION}", :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE}, anything) |
201 | + | ||
182 | handler.fetch('http://site.org/feed.xml') | 202 | handler.fetch('http://site.org/feed.xml') |
183 | end | 203 | end |
184 | 204 |