Commit c31de66e673411ea8536708ccff83f5866ac844a

Authored by Victor Costa
1 parent 7826abb9

virtuoso: added an option to configure a virtuoso read-only account

plugins/virtuoso/lib/virtuoso_plugin.rb
@@ -17,15 +17,25 @@ class VirtuosoPlugin < Noosfero::Plugin @@ -17,15 +17,25 @@ class VirtuosoPlugin < Noosfero::Plugin
17 end 17 end
18 18
19 def virtuoso_client 19 def virtuoso_client
20 - @virtuoso_client ||= RDF::Virtuoso::Repository.new("#{settings.virtuoso_uri}/sparql", :update_uri => "#{settings.virtuoso_uri}/sparql-auth", :username => settings.virtuoso_username, :password => settings.virtuoso_password, :auth_method => 'digest', :timeout => 30) 20 + @virtuoso_client ||= virtuoso_client_builder(settings.virtuoso_uri, settings.virtuoso_username, settings.virtuoso_password)
21 end 21 end
22 - 22 +
  23 + def virtuoso_readonly_client
  24 + @virtuoso_readonly_client ||= virtuoso_client_builder(settings.virtuoso_uri, settings.virtuoso_readonly_username, settings.virtuoso_readonly_password)
  25 + end
  26 +
23 def js_files 27 def js_files
24 ['edit-server-list'] 28 ['edit-server-list']
25 - end 29 + end
26 30
27 def stylesheet? 31 def stylesheet?
28 true 32 true
29 end 33 end
30 34
  35 + protected
  36 +
  37 + def virtuoso_client_builder(uri, username, password)
  38 + RDF::Virtuoso::Repository.new("#{uri}/sparql", :update_uri => "#{uri}/sparql-auth", :username => username, :password => password, :auth_method => 'digest', :timeout => 30)
  39 + end
  40 +
31 end 41 end
plugins/virtuoso/lib/virtuoso_plugin/triples_template.rb
@@ -37,7 +37,7 @@ class VirtuosoPlugin::TriplesTemplate < Article @@ -37,7 +37,7 @@ class VirtuosoPlugin::TriplesTemplate < Article
37 37
38 def template_content 38 def template_content
39 begin 39 begin
40 - results = plugin.virtuoso_client.query(query) 40 + results = plugin.virtuoso_readonly_client.query(query)
41 liquid_template = Liquid::Template.parse(template) 41 liquid_template = Liquid::Template.parse(template)
42 page = liquid_template.render('results' => results) 42 page = liquid_template.render('results' => results)
43 transform_html(page) 43 transform_html(page)
plugins/virtuoso/test/unit/triples_template_test.rb
@@ -10,8 +10,8 @@ class TriplesTemplateTest < ActiveSupport::TestCase @@ -10,8 +10,8 @@ class TriplesTemplateTest < ActiveSupport::TestCase
10 10
11 should 'evaluate template using query results' do 11 should 'evaluate template using query results' do
12 article.stubs(:plugin).returns(mock) 12 article.stubs(:plugin).returns(mock)
13 - article.plugin.expects(:virtuoso_client).at_least_once.returns(mock)  
14 - article.plugin.virtuoso_client.expects(:query).returns([{'var' => 'Hello '}, {'var' => 'World'}]) 13 + article.plugin.expects(:virtuoso_readonly_client).at_least_once.returns(mock)
  14 + article.plugin.virtuoso_readonly_client.expects(:query).returns([{'var' => 'Hello '}, {'var' => 'World'}])
15 article.template = "{% for row in results %}{{row.var}}{% endfor %}" 15 article.template = "{% for row in results %}{{row.var}}{% endfor %}"
16 16
17 assert_match /Hello World/, article.template_content 17 assert_match /Hello World/, article.template_content
@@ -19,8 +19,8 @@ class TriplesTemplateTest < ActiveSupport::TestCase @@ -19,8 +19,8 @@ class TriplesTemplateTest < ActiveSupport::TestCase
19 19
20 should 'display error message when failed to execute the query' do 20 should 'display error message when failed to execute the query' do
21 article.stubs(:plugin).returns(mock) 21 article.stubs(:plugin).returns(mock)
22 - article.plugin.expects(:virtuoso_client).at_least_once.returns(mock)  
23 - article.plugin.virtuoso_client.expects(:query).raises(RuntimeError.new) 22 + article.plugin.expects(:virtuoso_readonly_client).at_least_once.returns(mock)
  23 + article.plugin.virtuoso_readonly_client.expects(:query).raises(RuntimeError.new)
24 article.template = "{% for row in results %}{{row.var}}{% endfor %}" 24 article.template = "{% for row in results %}{{row.var}}{% endfor %}"
25 25
26 assert_equal "Failed to process the template", article.template_content 26 assert_equal "Failed to process the template", article.template_content
@@ -28,8 +28,8 @@ class TriplesTemplateTest < ActiveSupport::TestCase @@ -28,8 +28,8 @@ class TriplesTemplateTest < ActiveSupport::TestCase
28 28
29 should 'transform css into inline stylesheet' do 29 should 'transform css into inline stylesheet' do
30 article.stubs(:plugin).returns(mock) 30 article.stubs(:plugin).returns(mock)
31 - article.plugin.expects(:virtuoso_client).at_least_once.returns(mock)  
32 - article.plugin.virtuoso_client.expects(:query).returns([{'var' => 'Hello '}, {'var' => 'World'}]) 31 + article.plugin.expects(:virtuoso_readonly_client).at_least_once.returns(mock)
  32 + article.plugin.virtuoso_readonly_client.expects(:query).returns([{'var' => 'Hello '}, {'var' => 'World'}])
33 article.template = "{% for row in results %}<p>{{row.var}}</p>{% endfor %}" 33 article.template = "{% for row in results %}<p>{{row.var}}</p>{% endfor %}"
34 article.stylesheet = "p {color: red}" 34 article.stylesheet = "p {color: red}"
35 35
@@ -40,8 +40,8 @@ class TriplesTemplateTest &lt; ActiveSupport::TestCase @@ -40,8 +40,8 @@ class TriplesTemplateTest &lt; ActiveSupport::TestCase
40 40
41 should 'do not allow js injection' do 41 should 'do not allow js injection' do
42 article.stubs(:plugin).returns(mock) 42 article.stubs(:plugin).returns(mock)
43 - article.plugin.expects(:virtuoso_client).at_least_once.returns(mock)  
44 - article.plugin.virtuoso_client.expects(:query).returns([{'var' => RDF::Literal.new('<script>alert("hello");</script>')}]) 43 + article.plugin.expects(:virtuoso_readonly_client).at_least_once.returns(mock)
  44 + article.plugin.virtuoso_readonly_client.expects(:query).returns([{'var' => RDF::Literal.new('<script>alert("hello");</script>')}])
45 article.template = "{% for row in results %}{{row.var}}{% endfor %}" 45 article.template = "{% for row in results %}{{row.var}}{% endfor %}"
46 46
47 assert_no_match /<script>/, article.template_content 47 assert_no_match /<script>/, article.template_content
plugins/virtuoso/test/unit/virtuoso_plugin_test.rb
@@ -4,13 +4,29 @@ class VirtuosoPluginTest &lt; ActiveSupport::TestCase @@ -4,13 +4,29 @@ class VirtuosoPluginTest &lt; ActiveSupport::TestCase
4 4
5 def setup 5 def setup
6 @environment = Environment.default 6 @environment = Environment.default
7 - @plugin = VirtuosoPlugin.new 7 + @plugin = VirtuosoPlugin.new(self)
8 end 8 end
9 9
10 - attr_reader :plugin 10 + attr_reader :plugin, :environment
11 11
12 should 'define a new content' do 12 should 'define a new content' do
13 assert_equal [VirtuosoPlugin::TriplesTemplate], plugin.content_types 13 assert_equal [VirtuosoPlugin::TriplesTemplate], plugin.content_types
14 end 14 end
15 15
  16 + should 'create a client for virtuoso using admin account' do
  17 + plugin.stubs(:settings).returns(mock)
  18 + plugin.settings.expects(:virtuoso_uri)
  19 + plugin.settings.expects(:virtuoso_username)
  20 + plugin.settings.expects(:virtuoso_password)
  21 + plugin.virtuoso_client
  22 + end
  23 +
  24 + should 'create a client for virtuoso using a read-only account' do
  25 + plugin.stubs(:settings).returns(mock)
  26 + plugin.settings.expects(:virtuoso_uri)
  27 + plugin.settings.expects(:virtuoso_readonly_username)
  28 + plugin.settings.expects(:virtuoso_readonly_password)
  29 + plugin.virtuoso_readonly_client
  30 + end
  31 +
16 end 32 end
plugins/virtuoso/views/virtuoso_plugin_admin/index.html.erb
@@ -6,8 +6,10 @@ @@ -6,8 +6,10 @@
6 6
7 <strong> 7 <strong>
8 <%= labelled_form_field _('Virtuoso URL:'), f.text_field(:virtuoso_uri) %> 8 <%= labelled_form_field _('Virtuoso URL:'), f.text_field(:virtuoso_uri) %>
9 - <%= labelled_form_field _('Virtuoso Username:'), f.text_field(:virtuoso_username) %>  
10 - <%= labelled_form_field _('Virtuoso Password:'), f.password_field(:virtuoso_password) %> 9 + <%= labelled_form_field _('Virtuoso Admin Username:'), f.text_field(:virtuoso_username) %>
  10 + <%= labelled_form_field _('Virtuoso Admin Password:'), f.password_field(:virtuoso_password) %>
  11 + <%= labelled_form_field _('Virtuoso Read-Only Username:'), f.text_field(:virtuoso_readonly_username) %>
  12 + <%= labelled_form_field _('Virtuoso Read-Only Password:'), f.password_field(:virtuoso_readonly_password) %>
11 <%= labelled_form_field _('DSpace URL:'), f.text_field(:dspace_uri) %> 13 <%= labelled_form_field _('DSpace URL:'), f.text_field(:dspace_uri) %>
12 </strong> 14 </strong>
13 15