mwmitchell-rsolr 0.6.9 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGES.txt CHANGED
@@ -1,3 +1,11 @@
1
+ 0.7.0 - February 20, 2009
2
+ Removed all param mapping behavior, code and tests
3
+ - this stuff just gunks up rsolr and should be in an extension of some sort
4
+ Can now specify the request handler in all RSolr::Connection::Base methods as the first argument:
5
+ - solr.query 'select', :q=>'ipod'
6
+ - solr.query 'catalog', :q=>'humphry'
7
+ - solr.query :q=>'big' # defaults to the /select handler
8
+
1
9
  0.6.9 - January 29, 2009
2
10
  Simplified facet response methods
3
11
  Main facet method is called #facets
data/README.rdoc CHANGED
@@ -10,8 +10,9 @@ Simple usage:
10
10
  require 'rubygems'
11
11
  require 'rsolr'
12
12
  rsolr = RSolr.connect
13
- response = rsolr.query(:q=>'*:*')
14
-
13
+ response = rsolr.query(:q=>'*:*') # becomes /solr/select?q=*:*
14
+ # can also set the request handler path like:
15
+ response = rsolr.query('catalog', :q=>'*:*') # becomes /solr/catalog?q=*:*
15
16
 
16
17
  To run tests:
17
18
 
@@ -28,41 +29,35 @@ To get a direct connection (no http) in jRuby using DirectSolrConnection:
28
29
 
29
30
  solr = RSolr.connect(:adapter=>:direct, :home_dir=>'/path/to/solr/home', :dist_dir=>'/path/to/solr/distribution')
30
31
 
31
- You can set RSolr params that will be sent on every request:
32
+ You can set the request handler paths for every request:
32
33
 
33
- solr = RSolr.connect(:global_params=>{:wt=>:ruby, :echoParams=>'EXPLICIT'})
34
+ solr = RSolr.connect(:select_path=>'select', :update_path=>'update', :luke_path=>'admin/luke')
34
35
 
35
36
 
36
37
  == Requests
37
38
  Once you have a connection, you can execute queries, updates etc..
38
39
 
40
+ You can optionally specify the request handler path by sending it in as the first argument:
41
+ solr.query 'catalog', :q=>'object_type:"book"'
42
+ solr.update 'my/update', '<xml/>'
43
+
44
+ The default request handler path value for each of the different methods are as follows:
45
+ find_by_id, query == 'select'
46
+ add, update, commit, optimize, rollback, delete_by_id, delete_by_query == 'update'
47
+ index_info == 'admin/luke'
48
+
49
+ Please note that the path you specify should be relative.
50
+
39
51
 
40
52
  === Querying
41
- Use the #query method to send requests to Solr as-is (no param mapping)
42
- Use the #search method to take advantage of some of the param mapping (currently only :page and :per_page)
43
- response = solr.query(:q=>'washington', :facet=>true, 'facet.limit'=>-1, 'facet.field'=>'cat', 'facet.field'=>'inStock')
53
+ Use the #query method to send requests to the /select handler:
54
+ response = solr.query(:q=>'washington', :facet=>true, 'facet.limit'=>-1, 'facet.field'=>'cat', 'facet.field'=>'inStock', :start=>0, :rows=>10)
44
55
  response = solr.find_by_id(1)
45
56
 
46
- ==== Search Params
47
- The #search method can accept the following params:
48
- ===== When :qt is :standard
49
- :page
50
- :per_page
51
- :queries
52
- :filters
53
- :phrase_queries
54
- :phrase_filters
55
- :facets
56
- ===== When :qt is :dismax (also includes the :standard params)
57
- :alternate_query
58
- :query_fields
59
- :phrase_fields
60
- :boost_query
61
-
62
57
  ==== Pagination
63
- Pagination is simplified by using the :page and :per_page params when using the #search method:
64
-
65
- response = solr.search(:page=>1, :per_page=>10, :q=>'*:*')
58
+ Pagination is simplified from having a few helpful response methods:
59
+
60
+ response = solr.query(:start=>0, :rows=>10, :q=>'*:*')
66
61
  response.per_page
67
62
  response.total_pages
68
63
  response.current_page
@@ -73,7 +68,6 @@ If you use WillPaginate, just pass-in the response to the #will_paginate view he
73
68
 
74
69
  <%= will_paginate(@response) %>
75
70
 
76
- The #search method automatically figures out the :start and :rows values, based on the values of :page and :per_page. The will_paginate view helper uses the methods: #current_page, #previous_page, #next_page and #total_pages to create the pagination view widget.
77
71
 
78
72
  === Updating Solr
79
73
  Updating is done using native Ruby structures. Hashes are used for single documents and arrays are used for a collection of documents (hashes). These structures get turned into simple XML "messages".
data/examples/direct.rb CHANGED
@@ -9,7 +9,8 @@ solr = RSolr.connect(:adapter=>:direct, :home_dir=>home, :dist_dir=>dist)
9
9
 
10
10
  `cd ../apache-solr/example/exampledocs && ./post.sh ./*.xml`
11
11
 
12
- response = solr.search :q=>'ipod', :fq=>'price:[0 TO 50]', :per_page=>2, :page=>1
12
+ # the 'select' here is optional
13
+ response = solr.query 'select', :q=>'ipod', :fq=>'price:[0 TO 50]', :rows=>2, :start=>0
13
14
 
14
15
  solr.delete_by_query('*:*')
15
16
 
data/examples/http.rb CHANGED
@@ -5,7 +5,7 @@ solr = RSolr.connect
5
5
 
6
6
  `cd ../apache-solr/example/exampledocs && ./post.sh ./*.xml`
7
7
 
8
- response = solr.search :q=>'ipod', :fq=>'price:[0 TO 50]', :per_page=>2, :page=>1
8
+ response = solr.query :q=>'ipod', :fq=>'price:[0 TO 50]', :rows=>2, :start=>0
9
9
 
10
10
  solr.delete_by_query('*:*')
11
11
 
data/lib/core_ext.rb CHANGED
@@ -14,4 +14,12 @@ class Hash
14
14
  self.is_a?(Mash) ? self : Mash.new(self)
15
15
  end
16
16
 
17
+ end
18
+
19
+ unless Array.respond_to?(:extract_options!)
20
+ class Array
21
+ def extract_options!
22
+ last.is_a?(::Hash) ? pop : {}
23
+ end
24
+ end
17
25
  end
@@ -4,42 +4,47 @@
4
4
  # The classes that include this module only need to provide a request method like:
5
5
  # send_request(request_path, params, data)
6
6
  # where:
7
- # request_path is a string to a handler (/select)
7
+ # request_path is a string to a handler (/select etc.)
8
8
  # params is a hash for query string params
9
9
  # data is optional string of xml
10
10
  module RSolr::Connection::Adapter::CommonMethods
11
11
 
12
12
  # send a request to the "select" handler
13
- def query(params)
14
- send_request @opts[:select_path], params
15
- end
16
-
17
- # sends data to the update handler
18
- # data can be:
19
- # string (valid solr update xml)
20
- # object with respond_to?(:to_xml)
21
- # params is a hash with valid solr update params
22
- def update(data, params={})
23
- send_request @opts[:update_path], params, data
13
+ # the first argument is the select handler path
14
+ # the last argument is a hash of params
15
+ def query(*args)
16
+ params = args.extract_options!
17
+ path = args.first || @opts[:select_path]
18
+ self.send_request "/#{path}", params
24
19
  end
25
20
 
26
21
  # sends a request to the admin luke handler to get info on the index
27
- def index_info(params={})
22
+ # the first argument is the admin/luke request handler path
23
+ # the last argument is a hash of params
24
+ def index_info(*args)
25
+ params = args.extract_options!
26
+ path = args.first || @opts[:luke_path]
28
27
  params[:numTerms]||=0
29
- send_request @opts[:luke_path], params
28
+ self.send_request "/#{path}", params
30
29
  end
31
30
 
32
- def default_options
33
- {
34
- :select_path => '/select',
35
- :update_path => '/update',
36
- :luke_path => '/admin/luke'
37
- }
38
- end
39
-
40
- # send a request to the adapter (allows requests like /admin/luke etc.)
41
- def send_request(handler_path, params={}, data=nil)
42
- @adapter.send_request(handler_path, params, data)
31
+ # sends data to the update handler
32
+ # If 2 arguments are passed in:
33
+ # - the first should be the POST data string
34
+ # - the second can be an optional url params hash
35
+ # - the path is defaulted to '/update'
36
+ # If 3 arguments are passed in:
37
+ # - the first argument should be the url path ('/my-update-handler' etc.)
38
+ # - the second should be the POST data string
39
+ # - the last/third should be an optional url params hash
40
+ # data can be:
41
+ # string (valid solr update xml)
42
+ # object with respond_to?(:to_xml)
43
+ def update(*args)
44
+ params = args.extract_options!
45
+ data = args.last
46
+ path = args.size == 2 ? args.first : @opts[:update_path]
47
+ self.send_request "/#{path}", params, data
43
48
  end
44
49
 
45
50
  end
@@ -27,7 +27,7 @@ class RSolr::Connection::Adapter::Direct
27
27
  # add the standard lib and dist directories to the :jar_paths
28
28
  opts[:jar_paths] = [File.join(opts[:dist_dir], 'lib'), File.join(opts[:dist_dir], 'dist')]
29
29
  end
30
- @opts = default_options.merge(opts)
30
+ @opts = opts
31
31
  end
32
32
 
33
33
  # loads/imports the java dependencies
@@ -21,7 +21,7 @@ class RSolr::Connection::Adapter::HTTP
21
21
  #
22
22
  def initialize(opts={}, &block)
23
23
  opts[:url]||='http://127.0.0.1:8983/solr'
24
- @opts = default_options.merge(opts).to_mash # default_options are coming from RSolr::Connection::Adapter::CommonMethods
24
+ @opts = opts
25
25
  end
26
26
 
27
27
  def connection
@@ -5,33 +5,14 @@ class RSolr::Connection::Base
5
5
 
6
6
  attr_reader :adapter, :opts
7
7
 
8
- attr_accessor :param_mappers
9
-
10
8
  # "adapter" is instance of:
11
9
  # RSolr::Adapter::HTTP
12
10
  # RSolr::Adapter::Direct (jRuby only)
13
11
  def initialize(adapter, opts={})
14
12
  @adapter = adapter
15
- @param_mappers = {
16
- :standard=>RSolr::Connection::ParamMapping::Standard,
17
- :dismax=>RSolr::Connection::ParamMapping::Dismax
18
- }
19
- opts[:global_params]||={}
20
- default_global_params = {
21
- :wt=>:ruby,
22
- :echoParams=>'EXPLICIT',
23
- :debugQuery=>true
24
- }
25
- opts[:global_params] = default_global_params.merge(opts[:global_params])
26
13
  @opts = opts
27
14
  end
28
15
 
29
- # sets default params etc.. - could be used as a mapping hook
30
- # type of request should be passed in here? -> map_params(:query, {})
31
- def map_params(params)
32
- {}.merge(@opts[:global_params]).merge(params)
33
- end
34
-
35
16
  # send request (no param mapping) to the select handler
36
17
  # params is hash with valid solr request params (:q, :fl, :qf etc..)
37
18
  # if params[:wt] is not set, the default is :ruby (see opts[:global_params])
@@ -39,106 +20,68 @@ class RSolr::Connection::Base
39
20
  # otherwise, an instance of RSolr::Response::Query is returned
40
21
  # NOTE: to get raw ruby, use :wt=>'ruby'
41
22
  # There is NO param mapping here, what you put it is what gets sent to Solr
42
- def query(params)
43
- p = map_params(params)
44
- response = @adapter.query(p)
45
- p[:wt]==:ruby ? RSolr::Response::Query::Base.new(response) : response
46
- end
47
-
48
- # The #search method uses a param mapper to prepare the request for solr.
49
- # For example, instead of doing your fq params by hand,
50
- # you can use the simplified :filters param instead.
51
- # The 2 built in mappers are for dismax and standard: RSolr::Connection::ParamMapping::*
52
- # The default is :dismax
53
- # If you create your own request handler in solrconfig.xml,
54
- # you can use it by setting the :qt=>:my_handler
55
- # You'll need to set the correct param mapper class (when using the search method)
56
- # To take advantage of the param mapping
57
- # If your request handler uses the solr dismax class, then do nothing
58
- # if it uses the standard, you'll need to set it like:
59
- # solr.param_mappers[:my_search_handler] = :standard
60
- # The value can also be a custom class constant that must have a #map method
61
- # The initialize method must accept a hash of input params
62
- # The #map method must handle a block being passed in and return a new hash of raw solr params
63
- def search(params,&blk)
64
- qt = params[:qt] ? params[:qt].to_sym : :dismax
65
- mapper_class = @param_mappers[qt]
66
- mapper_class = RSolr::Connection::ParamMapping::Dismax if mapper_class==:dismax
67
- mapper_class = RSolr::Connection::ParamMapping::Standard if mapper_class==:standard
68
- mapper = mapper_class.new(params)
69
- query(mapper.map(&blk))
70
- end
71
-
72
- # "facet_field" -- the name of a facet field: language_facet
73
- # "params" -- the standard #search method params
74
- # Returns an instance of RSolr::Response::Query::Base
75
- def search_facet_by_name(facet_field, params, &blk)
76
- params[:per_page] = 0
77
- params[:rows] = 0
78
- params[:facets] ||= {}
79
- params[:facets][:fields] = [facet_field]
80
- params[:facets][:mincount] ||= 1
81
- params[:facets][:prefix] ||= nil
82
- params[:facets][:missing] ||= false
83
- params[:facets][:sort] ||= :count
84
- params[:facets][:offset] ||= 0
85
- self.search(params, &blk)
23
+ def query(*args)
24
+ params = map_params(args.extract_options!)
25
+ args << params
26
+ response = @adapter.query(*args)
27
+ params[:wt] == :ruby ? RSolr::Response::Query::Base.new(response) : response
86
28
  end
87
29
 
88
30
  # Finds a document by its id
89
- def find_by_id(id, params={})
90
- params = map_params(params)
31
+ def find_by_id(*args)
32
+ params = map_params(args.extract_options!)
91
33
  params[:q] = 'id:"#{id}"'
92
- query params
34
+ args << params
35
+ self.query(*args)
93
36
  end
94
37
 
95
- def index_info(params={})
96
- params = map_params(params)
97
- response = @adapter.index_info(params)
98
- params[:wt] == :ruby ? RSolr::Response::IndexInfo.new(response) : response
38
+ #
39
+ def update(*args)
40
+ params = map_params(args.extract_options!)
41
+ args << params
42
+ response = @adapter.update(*args)
43
+ params[:wt] == :ruby ? RSolr::Response::Update.new(response) : response
99
44
  end
100
45
 
101
- # if :ruby is the :wt, then Solr::Response::Base is returned
102
- # -- there's not really a way to figure out what kind of handler request this is.
103
-
104
- def update(data, params={})
105
- params = map_params(params)
106
- response = @adapter.update(data, params)
107
- params[:wt]==:ruby ? RSolr::Response::Update.new(response) : response
46
+ def index_info(*args)
47
+ params = map_params(args.extract_options!)
48
+ args << params
49
+ response = @adapter.index_info(*args)
50
+ params[:wt] == :ruby ? RSolr::Response::IndexInfo.new(response) : response
108
51
  end
109
52
 
110
- def add(hash_or_array, opts={}, &block)
111
- update message.add(hash_or_array, opts, &block)
53
+ def add(*args, &block)
54
+ update message.add(*args, &block)
112
55
  end
113
56
 
114
57
  # send </commit>
115
- def commit(opts={})
116
- update message.commit, opts
58
+ def commit(*args)
59
+ update message.commit, *args
117
60
  end
118
61
 
119
62
  # send </optimize>
120
- def optimize(opts={})
121
- update message.optimize, opts
63
+ def optimize(*args)
64
+ update message.optimize, *args
122
65
  end
123
66
 
124
67
  # send </rollback>
125
68
  # NOTE: solr 1.4 only
126
- def rollback(opts={})
127
- update message.rollback, opts
69
+ def rollback(*args)
70
+ update message.rollback, *args
128
71
  end
129
72
 
130
73
  # Delete one or many documents by id
131
74
  # solr.delete_by_id 10
132
75
  # solr.delete_by_id([12, 41, 199])
133
- def delete_by_id(ids, opts={})
134
- update message.delete_by_id(ids), opts
76
+ def delete_by_id(*args)
77
+ update message.delete_by_id(args.shift), *args
135
78
  end
136
79
 
137
80
  # delete one or many documents by query
138
81
  # solr.delete_by_query 'available:0'
139
82
  # solr.delete_by_query ['quantity:0', 'manu:"FQ"']
140
- def delete_by_query(queries, opts={})
141
- update message.delete_by_query(queries), opts
83
+ def delete_by_query(*args)
84
+ update message.delete_by_query(args.shift), *args
142
85
  end
143
86
 
144
87
  protected
@@ -148,4 +91,11 @@ class RSolr::Connection::Base
148
91
  RSolr::Message
149
92
  end
150
93
 
94
+ # sets default params etc.. - could be used as a mapping hook
95
+ # type of request should be passed in here? -> map_params(:query, {})
96
+ def map_params(params)
97
+ params||={}
98
+ {:wt=>:ruby}.merge(params)
99
+ end
100
+
151
101
  end
@@ -2,6 +2,5 @@ module RSolr::Connection
2
2
 
3
3
  autoload :Base, 'rsolr/connection/base'
4
4
  autoload :Adapter, 'rsolr/connection/adapter'
5
- autoload :ParamMapping, 'rsolr/connection/param_mapping'
6
5
 
7
6
  end
data/lib/rsolr.rb CHANGED
@@ -7,7 +7,7 @@ proc {|base, files|
7
7
 
8
8
  module RSolr
9
9
 
10
- VERSION = '0.6.9'
10
+ VERSION = '0.7.0'
11
11
 
12
12
  autoload :Message, 'rsolr/message'
13
13
  autoload :Response, 'rsolr/response'
@@ -25,6 +25,9 @@ module RSolr
25
25
  :http=>'HTTP',
26
26
  :direct=>'Direct'
27
27
  }
28
+ opts[:select_path] ||= 'select'
29
+ opts[:update_path] ||= 'update'
30
+ opts[:luke_path] ||= 'admin/luke'
28
31
  adapter_class = RSolr::Connection::Adapter.const_get(types[adapter_name])
29
32
  RSolr::Connection::Base.new(adapter_class.new(opts), opts)
30
33
  end
@@ -12,18 +12,6 @@ module ConnectionTestMethods
12
12
  # assert_equal 0, @solr.query(:q=>'*:*').docs.size
13
13
  #end
14
14
 
15
- def test_default_options
16
- assert_equal '/select', @solr.adapter.default_options[:select_path]
17
- assert_equal '/update', @solr.adapter.default_options[:update_path]
18
- assert_equal '/admin/luke', @solr.adapter.default_options[:luke_path]
19
- end
20
-
21
- # setting adapter options in Solr.connect method should set them in the adapter
22
- def test_set_adapter_options
23
- solr = RSolr.connect(:select_path=>'/select2')
24
- assert_equal '/select2', solr.adapter.opts[:select_path]
25
- end
26
-
27
15
  # setting connection options in Solr.connect method should set them in the connection
28
16
  def test_set_connection_options
29
17
  solr = RSolr.connect(:default_wt=>:json)
@@ -116,23 +104,4 @@ module ConnectionTestMethods
116
104
  assert [true, false].include?(response.has_deletions?)
117
105
  end
118
106
 
119
- def test_search_facet_by_name
120
- @solr.add([{:id=>1, :cat=>'eletronics'}, {:id=>2, :cat=>'software'}]) and @solr.commit
121
- response = @solr.search_facet_by_name('cat', {:q=>'*:*'})
122
-
123
- response.facets.each do |facet|
124
- puts facet.field
125
- puts facet.values.inspect
126
- facet.values.each do |value|
127
- puts value.value
128
- puts value.hits
129
- end
130
- end
131
-
132
- assert_equal 2, response.facet_by_field_name(:cat).values.size
133
- #
134
- response = @solr.search_facet_by_name('cat', {:q=>'*:*'})
135
- assert_equal 0, response.docs.size
136
- end
137
-
138
107
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mwmitchell-rsolr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.9
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Mitchell
@@ -14,6 +14,7 @@ default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: builder
17
+ type: :runtime
17
18
  version_requirement:
18
19
  version_requirements: !ruby/object:Gem::Requirement
19
20
  requirements:
@@ -43,9 +44,6 @@ files:
43
44
  - lib/rsolr/connection/adapter/http.rb
44
45
  - lib/rsolr/connection/adapter.rb
45
46
  - lib/rsolr/connection/base.rb
46
- - lib/rsolr/connection/param_mapping.rb
47
- - lib/rsolr/connection/param_mapping/dismax.rb
48
- - lib/rsolr/connection/param_mapping/standard.rb
49
47
  - lib/rsolr/connection.rb
50
48
  - lib/rsolr/http_client/adapter/curb.rb
51
49
  - lib/rsolr/http_client/adapter/net_http.rb
@@ -92,7 +90,6 @@ summary: A Ruby client for Apache Solr
92
90
  test_files:
93
91
  - test/connection/direct_test.rb
94
92
  - test/connection/http_test.rb
95
- - test/connection/param_mapping_test.rb
96
93
  - test/connection/test_methods.rb
97
94
  - test/http_client/curb_test.rb
98
95
  - test/http_client/net_http_test.rb
@@ -1,41 +0,0 @@
1
- class RSolr::Connection::ParamMapping::Dismax < RSolr::Connection::ParamMapping::Standard
2
-
3
- def setup_mappings
4
- super
5
-
6
- mapping_for :alternate_query, 'q.alt' do |val|
7
- format_query(val).join(' ')
8
- end
9
-
10
- mapping_for :query_fields, :qf do |val|
11
- create_boost_query(val)
12
- end
13
-
14
- mapping_for :phrase_fields, :pf do |val|
15
- create_boost_query(val)
16
- end
17
-
18
- mapping_for :boost_query, :bq do |val|
19
- format_query(val).join(' ')
20
- end
21
-
22
- end
23
-
24
- protected
25
-
26
- def create_boost_query(input)
27
- case input
28
- when Hash
29
- qf = []
30
- input.each_pair do |k,v|
31
- qf << (v.to_s.empty? ? k : "#{k}^#{v}")
32
- end
33
- qf.join(' ')
34
- when Array
35
- input.join(' ')
36
- when String
37
- input
38
- end
39
- end
40
-
41
- end
@@ -1,127 +0,0 @@
1
- class RSolr::Connection::ParamMapping::Standard
2
-
3
- include RSolr::Connection::ParamMapping::MappingMethods
4
-
5
- attr_reader :input, :output
6
-
7
- def initialize(input)
8
- @output = {}
9
- @input = input
10
- setup_mappings
11
- end
12
-
13
- def setup_mappings
14
-
15
- mapping_for :per_page, :rows do |val|
16
- val = val.to_s.to_i
17
- val < 0 ? 0 : val
18
- end
19
-
20
- mapping_for :page, :start do |val|
21
- val = val.to_s.to_i
22
- page = val > 0 ? val : 1
23
- ((page - 1) * (@output[:rows] || 0))
24
- end
25
-
26
- mapping_for :queries, :q do |val|
27
- format_query(val)
28
- end
29
-
30
- mapping_for :phrase_queries, :q do |val|
31
- values = [@output[:q], format_query(val, true)]
32
- # remove blank items
33
- values.reject!{|v|v.to_s.empty?}
34
- # join all items on a space
35
- values.join(' ')
36
- end
37
-
38
- mapping_for :filters, :fq do |val|
39
- format_query(val)
40
- end
41
-
42
- # this must come after the :filter/:fq mapper
43
- mapping_for :phrase_filters, :fq do |val|
44
- # use the previously set fq queries and generate the new phrased based ones
45
- values = [@output[:fq], format_query(val, true)]
46
- # flatten (need to do this because the previous fq could have been an array)
47
- values = values.flatten
48
- # remove blank items
49
- values.reject!{|v|v.to_s.empty?} # don't join -- instead create multiple fq params
50
- # don't join... fq needs to be an array so multiple fq params are sent to solr
51
- values
52
- end
53
-
54
- mapping_for :facets do |input|
55
- next if input.to_s.empty?
56
- @output[:facet] = true
57
- @output['facet.field'] = []
58
- if input[:queries]
59
- # convert to an array if needed
60
- input[:queries] = [input[:queries]] unless input[:queries].is_a?(Array)
61
- @output[:facet.query] = input[:queries].map{|q|format_query(q)}
62
- end
63
- common_sub_fields = [:sort, :limit, :missing, :mincount, :prefix, :offset, :method, 'enum.cache.minDf']
64
- (common_sub_fields).each do |subfield|
65
- next unless input[subfield]
66
- @output["facet.#{subfield}"] = input[subfield]
67
- end
68
- if input[:fields]
69
- input[:fields].each do |f|
70
- if f.kind_of? Hash
71
- key = f.keys[0]
72
- value = f[key]
73
- @output[:facet.field] << key
74
- common_sub_fields.each do |subfield|
75
- next unless value[subfield]
76
- @output["f.#{key}.facet.#{subfield}"] = input[subfield]
77
- end
78
- else
79
- @output['facet.field'] << f
80
- end
81
- end
82
- end
83
- end
84
- end
85
-
86
- # takes an input and returns a formatted value
87
- def format_query(input, quote=false)
88
- case input
89
- when Array
90
- format_array_query(input, quote)
91
- when Hash
92
- format_hash_query(input, quote)
93
- else
94
- prep_value(input, quote)
95
- end
96
- end
97
-
98
- def format_array_query(input, quote)
99
- input.collect do |v|
100
- v.is_a?(Hash) ? format_hash_query(v, quote) : prep_value(v, quote)
101
- end
102
- end
103
-
104
- # groups values to a single field: title:(value1 value2) instead of title:value1 title:value2
105
- # a value can be a range or a string
106
- def format_hash_query(input, quote=false)
107
- q = []
108
- input.each_pair do |field,value|
109
- next if value.to_s.empty? # skip blank values!
110
- # create the field plus the delimiter if the field is not blank
111
- value = [value] unless value.is_a?(Array)
112
- fielded_queries = value.collect do |vv|
113
- vv.is_a?(Range) ? "[#{vv.min} TO #{vv.max}]" : prep_value(vv, quote)
114
- end
115
- field = field.to_s.empty? ? '' : "#{field}:"
116
- fielded_queries.each do |fq|
117
- q << "#{field}(#{fq})"
118
- end
119
- end
120
- q
121
- end
122
-
123
- def prep_value(val, quote=false)
124
- quote ? %(\"#{val}\") : val.to_s
125
- end
126
-
127
- end
@@ -1,39 +0,0 @@
1
- module RSolr::Connection::ParamMapping
2
-
3
- autoload :Standard, 'rsolr/connection/param_mapping/standard'
4
- autoload :Dismax, 'rsolr/connection/param_mapping/dismax'
5
-
6
- module MappingMethods
7
-
8
- def mappers
9
- @mappers ||= []
10
- end
11
-
12
- def mapping_for(user_param_name, solr_param_name=nil, &block)
13
- return unless @input[user_param_name]
14
- if (m = self.mappers.detect{|m|m[:input_name] == user_param_name})
15
- self.mappers.delete m
16
- end
17
- self.mappers << {:input_name=>user_param_name, :output_name=>solr_param_name, :block=>block}
18
- end
19
-
20
- def map(&blk)
21
- input = @input.dup
22
- mappers.each do |m|
23
- input_value = input[m[:input_name]]
24
- input.delete m[:input_name]
25
- if m[:block]
26
- value = m[:block].call(input_value)
27
- else
28
- value = input_value
29
- end
30
- if m[:output_name]
31
- @output[m[:output_name]] = value
32
- end
33
- end
34
- @output.merge(input)
35
- end
36
-
37
- end
38
-
39
- end
@@ -1,61 +0,0 @@
1
- require File.join(File.dirname(__FILE__), '..', 'test_helpers')
2
-
3
- class ParamMappingTest < RSolrBaseTest
4
-
5
- include RSolr::Connection::ParamMapping
6
-
7
- def test_standard_simple
8
- input = {
9
- :queries=>'a query',
10
- :filters=>'a filter',
11
- :page=>1,
12
- :per_page=>10,
13
- :phrase_queries=>'a phrase query',
14
- :phrase_filters=>'a phrase filter',
15
- :facets=>{
16
- :fields=>[:one,:two]
17
- }
18
- }
19
- mapper = Standard.new(input)
20
- output = mapper.map
21
-
22
- assert_equal "a query \"a phrase query\"", output[:q]
23
- assert_equal ["a filter", "\"a phrase filter\""], output[:fq]
24
- assert_equal 0, output[:start]
25
- assert_equal 10, output[:rows]
26
- # facet.field can be specified multiple times, so we need an array
27
- # the url builder automatically adds multiple params for arrays
28
- assert_equal [:one, :two], output['facet.field']
29
- end
30
-
31
- def test_standard_complex
32
- input = {
33
- :queries=>['a query', {:field=>'value'}, 'blah'],
34
- :filters=>['a filter', {:filter=>'field'}, 'blah'],
35
- :phrase_queries=>['a phrase', {:phrase_field=>'phrase value'}],
36
- :phrase_filters=>{:can_also_be_a=>'hash'}
37
- }
38
- mapper = Standard.new(input)
39
- output = mapper.map
40
-
41
- assert_equal "a query field:(value) blah \"a phrase\" phrase_field:(\"phrase value\")", output[:q]
42
- assert_equal ["a filter", "filter:(field)", "blah", "can_also_be_a:(\"hash\")"], output[:fq]
43
- end
44
-
45
- def test_dismax
46
- input = {
47
- :alternate_query=>{:can_be_a_string_hash_or_array=>'OK'},
48
- :query_fields=>{:a_field_to_boost=>20, :another_field_to_boost=>200},
49
- :phrase_fields=>{:phrase_field=>20},
50
- :boost_query=>[{:field_to_use_for_boost_query=>'a'}, 'test']
51
- }
52
- mapper = Dismax.new(input)
53
- output = mapper.map
54
- assert_equal 'can_be_a_string_hash_or_array:(OK)', output['q.alt']
55
- assert output[:qf]=~/another_field_to_boost\^200/
56
- assert output[:qf]=~/a_field_to_boost\^20/
57
- assert_equal 'phrase_field^20', output[:pf]
58
- assert_equal 'field_to_use_for_boost_query:(a) test', output[:bq]
59
- end
60
-
61
- end
@@ -1,391 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
3
- <channel>
4
- <title>Ruby News</title>
5
- <link>http://www.ruby-lang.org/en/feeds/news.rss/</link>
6
- <language>en-us</language>
7
- <ttl>40</ttl>
8
- <description>The latest news from Ruby-Lang.org.</description>
9
-
10
-
11
- <item>
12
- <title>Scotland on Rails 2009</title>
13
- <description>&lt;p&gt;&lt;a href=&quot;http://scotlandonrails.com&quot;&gt;Scotland on Rails&lt;/a&gt; is pleased to announce that Conference2009 will be held March 26-28 in Edinburgh, Scotland.&lt;/p&gt;
14
-
15
-
16
- &lt;p&gt;We are now accepting submissions. The closing date for submissions is December 1st 2008, so there&amp;#8217;s still time! Please mail your plaintext proposals for 45 minute sessions to &lt;a href=&quot;mailto:submissions@scotlandonrails.com&quot;&gt;submissions@scotlandonrails.com&lt;/a&gt;.&lt;/p&gt;
17
-
18
-
19
- &lt;p&gt;Alternatively, if you are interested in sponsoring the conference, please mail &lt;a href=&quot;mailto:sponsorship@scotlandonrails.com&quot;&gt;sponsorship@scotlandonrails.com&lt;/a&gt; for a prospectus.&lt;/p&gt;
20
-
21
-
22
- &lt;p&gt;Lastly, if you wish to be notified when we open for registration, you can sign up on the site.&lt;/p&gt;
23
-
24
-
25
- &lt;p&gt;Come and enjoy all that Edinburgh has to offer (whisky! castle! volcano! ruby! whisky!) in March. We hope to see you there.&lt;/p&gt; </description>
26
- <pubDate>Mon, 10 Nov 2008 14:55:53 GMT</pubDate>
27
- <guid>http://www.ruby-lang.org/en/news/2008/11/10/scotland-on-rails-2009/</guid>
28
- <link>http://www.ruby-lang.org/en/news/2008/11/10/scotland-on-rails-2009/</link>
29
- </item>
30
-
31
- <item>
32
- <title>MountainWest RubyConf 2009 dates and CFP</title>
33
- <description>&lt;p&gt;&lt;a href=&quot;http://mtnwestrubyconf.org&quot;&gt;MountainWest RubyConf 2009&lt;/a&gt; will be held March 13-14, 2009, in Salt Lake City, Utah, &lt;span class=&quot;caps&quot;&gt;USA&lt;/span&gt;.&lt;/p&gt;
34
-
35
-
36
- &lt;p&gt;Proposals to speak at this regional conference are now being accepted. Please send your proposal to proposals@mtnwestrubyconf.org.&lt;/p&gt;
37
-
38
-
39
- &lt;p&gt;The submission deadline is midnight (MST) on December 31st, 2008.&lt;/p&gt;
40
-
41
-
42
- &lt;p&gt;There are sponsorship opportunities available as well. Please contact sponsorship@mtnwestruby.org if you are interested.&lt;/p&gt;
43
-
44
-
45
- &lt;p&gt;Please see &lt;a href=&quot;http://mtnwestrubyconf.org&quot;&gt;mtnwestrubyconf.org/&lt;/a&gt; for more details as they become available.&lt;/p&gt; </description>
46
- <pubDate>Sat, 08 Nov 2008 15:03:32 GMT</pubDate>
47
- <guid>http://www.ruby-lang.org/en/news/2008/11/08/mountainwest-rubyconf-2009-dates-and-cfp/</guid>
48
- <link>http://www.ruby-lang.org/en/news/2008/11/08/mountainwest-rubyconf-2009-dates-and-cfp/</link>
49
- </item>
50
-
51
- <item>
52
- <title> Ruby 1.9.1-preview 1 released</title>
53
- <description>&lt;p&gt;Yugui (Yuki Sonoda) announced the release of Ruby 1.9.1-preview 1:&lt;/p&gt;
54
-
55
-
56
- &lt;blockquote&gt;
57
- This is a preview release of Ruby 1.9.1, which will be the first stable version of the Ruby 1.9 series. Try it out now and get an early taste of a modern, faster, multilingualized, and much improved Ruby with clearer syntax.&lt;br&gt;&lt;br&gt;
58
-
59
- &lt;p&gt;If you encounter any bugs or problems, please let us know via the official issue tracking system:&lt;/p&gt;
60
-
61
-
62
- &lt;p&gt;&lt;a href=&quot;http://redmine.ruby-lang.org&quot;&gt;http://redmine.ruby-lang.org&lt;/a&gt;&lt;/p&gt;
63
-
64
-
65
- &lt;/blockquote&gt;
66
-
67
- &lt;p&gt;You can download the release from;&lt;/p&gt;
68
-
69
-
70
- &lt;ul&gt;
71
- &lt;li&gt;&lt;a href=&quot;ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-preview1.tar.bz2&quot;&gt;ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-preview1.tar.bz2&lt;/a&gt;
72
-
73
- &lt;p&gt;&lt;span class=&quot;caps&quot;&gt;SIZE&lt;/span&gt;: 6169022 bytes
74
- &lt;span class=&quot;caps&quot;&gt;MD5&lt;/span&gt;: 0d51dc949bb6b438ad4ebfabbb5f6754
75
- &lt;span class=&quot;caps&quot;&gt;SHA256&lt;/span&gt;: dc39000537d7c7528ef26af8e1c3a6215b30b6c579c615eaec7013513410456a&lt;/p&gt;&lt;/li&gt;
76
- &lt;/ul&gt;
77
-
78
-
79
- &lt;ul&gt;
80
- &lt;li&gt;&lt;a href=&quot;ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-preview1.tar.gz&quot;&gt;ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-preview1.tar.gz&lt;/a&gt;
81
-
82
- &lt;p&gt;&lt;span class=&quot;caps&quot;&gt;SIZE&lt;/span&gt;: 7409682 bytes
83
- &lt;span class=&quot;caps&quot;&gt;MD5&lt;/span&gt;: 738f701532452fd5d36f5c155f3ba692
84
- &lt;span class=&quot;caps&quot;&gt;SHA256&lt;/span&gt;: 99443bdae9f94ba7b08de187881f8cbee172379edf9c5fa85fc04c869150ff6d&lt;/p&gt;&lt;/li&gt;
85
- &lt;/ul&gt;
86
-
87
-
88
- &lt;ul&gt;
89
- &lt;li&gt;&lt;a href=&quot;ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-preview1.zip&quot;&gt;ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-preview1.zip&lt;/a&gt;
90
-
91
- &lt;p&gt;&lt;span class=&quot;caps&quot;&gt;SIZE&lt;/span&gt;: 8569116 bytes
92
- &lt;span class=&quot;caps&quot;&gt;MD5&lt;/span&gt;: 5f68246246c4cd29d8a3b6b34b29b6ac
93
- &lt;span class=&quot;caps&quot;&gt;SHA256&lt;/span&gt;: a6c3a7bf7ea83b595024764926353e08596a78e40c57ac58c568662e5e88df95&lt;/p&gt;&lt;/li&gt;
94
- &lt;/ul&gt; </description>
95
- <pubDate>Tue, 28 Oct 2008 19:45:27 GMT</pubDate>
96
- <guid>http://www.ruby-lang.org/en/news/2008/10/28/ruby-1-9-1-preview-1-released/</guid>
97
- <link>http://www.ruby-lang.org/en/news/2008/10/28/ruby-1-9-1-preview-1-released/</link>
98
- </item>
99
-
100
- <item>
101
- <title>RubyConf 2008 is Sold-out</title>
102
- <description>&lt;p&gt;&lt;a href=&quot;http://rubyconf.org/&quot;&gt;RubyConf 2008&lt;/a&gt; is sold out&lt;/p&gt;
103
-
104
-
105
- &lt;p&gt;However, there is a &lt;a href=&quot;http://www.regonline.com/builder/site/Default.aspx?eventid=636797&quot;&gt;waiting list&lt;/a&gt; you can join in case of cancellations.&lt;/p&gt; </description>
106
- <pubDate>Thu, 02 Oct 2008 23:21:06 GMT</pubDate>
107
- <guid>http://www.ruby-lang.org/en/news/2008/10/02/rubyconf-2008-is-sold-out/</guid>
108
- <link>http://www.ruby-lang.org/en/news/2008/10/02/rubyconf-2008-is-sold-out/</link>
109
- </item>
110
-
111
- <item>
112
- <title>Voices That Matter 2008</title>
113
- <description>&lt;p&gt;Pearson Education is running a &lt;a href=&quot;http://www.voicesthatmatter.com/ruby2008/&quot;&gt;Voices That Matter&lt;/a&gt; Ruby conference this fall in Boston. The conference, from the same people who Addison-Wesley's Professional Ruby Series, will give you a chance to meet and learn from those very same authors. Don't miss a chance to interact with so many Ruby professionals.&lt;/p&gt; </description>
114
- <pubDate>Tue, 09 Sep 2008 02:49:37 GMT</pubDate>
115
- <guid>http://www.ruby-lang.org/en/news/2008/09/09/voices-that-matter-2008/</guid>
116
- <link>http://www.ruby-lang.org/en/news/2008/09/09/voices-that-matter-2008/</link>
117
- </item>
118
-
119
- <item>
120
- <title>DoS vulnerability in REXML</title>
121
- <description>&lt;p&gt;There is a DoS vulnerability in the REXML library included in the Ruby
122
- Standard Library. A so-called &quot;XML entity explosion&quot; attack technique
123
- can be used for remotely bringing down (disabling) any application
124
- which parses user-provided XML using REXML.&lt;/p&gt;&lt;p&gt;Most Rails applications will be vulnerable because Rails parses
125
- user-provided XML using REXML by default. &lt;/p&gt; &lt;h2&gt;&lt;a name=&quot;label-0&quot; id=&quot;label-0&quot;&gt;Impact&lt;/a&gt;&lt;/h2&gt;&lt;!-- RDLabel: &quot;Impact&quot; --&gt;&lt;p&gt;An attacker can cause a denial of service by causing REXML to parse a
126
- document containing recursively nested entities such as:&lt;/p&gt;&lt;pre&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
127
- &amp;lt;!DOCTYPE member [
128
- &amp;lt;!ENTITY a &quot;&amp;amp;b;&amp;amp;b;&amp;amp;b;&amp;amp;b;&amp;amp;b;&amp;amp;b;&amp;amp;b;&amp;amp;b;&amp;amp;b;&amp;amp;b;&quot;&amp;gt;
129
- &amp;lt;!ENTITY b &quot;&amp;amp;c;&amp;amp;c;&amp;amp;c;&amp;amp;c;&amp;amp;c;&amp;amp;c;&amp;amp;c;&amp;amp;c;&amp;amp;c;&amp;amp;c;&quot;&amp;gt;
130
- &amp;lt;!ENTITY c &quot;&amp;amp;d;&amp;amp;d;&amp;amp;d;&amp;amp;d;&amp;amp;d;&amp;amp;d;&amp;amp;d;&amp;amp;d;&amp;amp;d;&amp;amp;d;&quot;&amp;gt;
131
- &amp;lt;!ENTITY d &quot;&amp;amp;e;&amp;amp;e;&amp;amp;e;&amp;amp;e;&amp;amp;e;&amp;amp;e;&amp;amp;e;&amp;amp;e;&amp;amp;e;&amp;amp;e;&quot;&amp;gt;
132
- &amp;lt;!ENTITY e &quot;&amp;amp;f;&amp;amp;f;&amp;amp;f;&amp;amp;f;&amp;amp;f;&amp;amp;f;&amp;amp;f;&amp;amp;f;&amp;amp;f;&amp;amp;f;&quot;&amp;gt;
133
- &amp;lt;!ENTITY f &quot;&amp;amp;g;&amp;amp;g;&amp;amp;g;&amp;amp;g;&amp;amp;g;&amp;amp;g;&amp;amp;g;&amp;amp;g;&amp;amp;g;&amp;amp;g;&quot;&amp;gt;
134
- &amp;lt;!ENTITY g &quot;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&quot;&amp;gt;
135
- ]&amp;gt;
136
- &amp;lt;member&amp;gt;
137
- &amp;amp;a;
138
- &amp;lt;/member&amp;gt;&lt;/pre&gt;&lt;h2&gt;&lt;a name=&quot;label-1&quot; id=&quot;label-1&quot;&gt;Vulnerable versions&lt;/a&gt;&lt;/h2&gt;&lt;!-- RDLabel: &quot;Vulnerable versions&quot; --&gt;&lt;h3&gt;&lt;a name=&quot;label-2&quot; id=&quot;label-2&quot;&gt;1.8 series&lt;/a&gt;&lt;/h3&gt;&lt;!-- RDLabel: &quot;1.8 series&quot; --&gt;&lt;ul&gt;
139
- &lt;li&gt;1.8.6-p287 and all prior versions&lt;/li&gt;
140
- &lt;li&gt;1.8.7-p72 and all prior versions&lt;/li&gt;
141
- &lt;/ul&gt;&lt;h3&gt;&lt;a name=&quot;label-3&quot; id=&quot;label-3&quot;&gt;1.9 series&lt;/a&gt;&lt;/h3&gt;&lt;!-- RDLabel: &quot;1.9 series&quot; --&gt;&lt;ul&gt;
142
- &lt;li&gt;all versions&lt;/li&gt;
143
- &lt;/ul&gt;&lt;h2&gt;&lt;a name=&quot;label-4&quot; id=&quot;label-4&quot;&gt;Solution&lt;/a&gt;&lt;/h2&gt;&lt;!-- RDLabel: &quot;Solution&quot; --&gt;&lt;p&gt;Please download the following monkey patch to fix this problem.&lt;/p&gt;&lt;ul&gt;
144
- &lt;li&gt;&lt;a href=&quot;http://www.ruby-lang.org/security/20080823rexml/rexml-expansion-fix2.rb&quot;&gt;&amp;lt;URL:http://www.ruby-lang.org/security/20080823rexml/rexml-expansion-fix2.rb&amp;gt;&lt;/a&gt;&lt;/li&gt;
145
- &lt;/ul&gt;&lt;p&gt;Then fix your application to load rexml-expansion-fix2.rb before using
146
- REXML.&lt;/p&gt;&lt;pre&gt;require &quot;rexml-expansion-fix2&quot;
147
- ...
148
- doc = REXML::Document.new(str)
149
- ...&lt;/pre&gt;&lt;p&gt;If you have a Rails application, copy rexml-expansion-fix2.rb into a
150
- directory on the load path (such as RAILS_ROOT/lib/), and put the
151
- following line into config/environment.rb.&lt;/p&gt;&lt;pre&gt;require &quot;rexml-expansion-fix2&quot;&lt;/pre&gt;&lt;p&gt;If your application is Rails 2.1 or later, you can simply copy
152
- rexml-expansion-fix2.rb to RAILS_ROOT/config/initializers and it will
153
- be required automatically.&lt;/p&gt;&lt;p&gt;By default, XML entity expansion limit is 10000. You can change it by
154
- changing REXML::Document.entity_expansion_limit. e.g.&lt;/p&gt;&lt;pre&gt;REXML::Document.entity_expansion_limit = 1000&lt;/pre&gt;&lt;p&gt;This fix will be made available as a gem and used by future versions of
155
- rails, but users should take corrective action immediately.&lt;/p&gt;&lt;h2&gt;&lt;a name=&quot;label-5&quot; id=&quot;label-5&quot;&gt;Credit&lt;/a&gt;&lt;/h2&gt;&lt;!-- RDLabel: &quot;Credit&quot; --&gt;&lt;p&gt;Credit to Luka Treiber and Mitja Kolsek of ACROS Security for
156
- disclosing the problem to Ruby and Rails Security Teams.&lt;/p&gt;&lt;p&gt;Credit to Michael Koziarski of Rails Core Team for creating the monkey
157
- patch to fix the vulnerability.&lt;/p&gt;&lt;h2&gt;&lt;a name=&quot;label-6&quot; id=&quot;label-6&quot;&gt;Changes&lt;/a&gt;&lt;/h2&gt;&lt;!-- RDLabel: &quot;Changes&quot; --&gt;&lt;ul&gt;
158
- &lt;li&gt;2008-08-29 18:46 +09:00 fixed the summary not to mislead that this vulnerability is Rails specific.&lt;/li&gt;
159
- &lt;li&gt;2008-11-09 12:40 +09:00 fixed &lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=502535&quot;&gt;a bug of the monkey patch&lt;/a&gt;.&lt;/li&gt;
160
- &lt;/ul&gt;</description>
161
- <pubDate>Sat, 23 Aug 2008 07:56:11 GMT</pubDate>
162
- <guid>http://www.ruby-lang.org/en/news/2008/08/23/dos-vulnerability-in-rexml/</guid>
163
- <link>http://www.ruby-lang.org/en/news/2008/08/23/dos-vulnerability-in-rexml/</link>
164
- </item>
165
-
166
- <item>
167
- <title>Ruby 1.8.7-p72 and 1.8.6-p287 released</title>
168
- <description>&lt;p&gt;Ruby 1.8.7-p72 and 1.8.6-p287 have been released.
169
- The last releases were incomplete, and the new releases include fixes of &lt;a href=&quot;http://www.ruby-lang.org/en/news/2008/08/08/multiple-vulnerabilities-in-ruby/#label-3&quot;&gt;the previously announced vulnerability of dl&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The released source archives are available at:&lt;/p&gt;&lt;ul&gt;
170
- &lt;li&gt;&lt;a href=&quot;ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p287.tar.gz&quot;&gt;&amp;lt;URL:ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p287.tar.gz&amp;gt;&lt;/a&gt;&lt;/li&gt;
171
- &lt;li&gt;&lt;a href=&quot;ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p287.tar.bz2&quot;&gt;&amp;lt;URL:ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p287.tar.bz2&amp;gt;&lt;/a&gt;&lt;/li&gt;
172
- &lt;li&gt;&lt;a href=&quot;ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p287.zip&quot;&gt;&amp;lt;URL:ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p287.zip&amp;gt;&lt;/a&gt;&lt;/li&gt;
173
- &lt;li&gt;&lt;a href=&quot;ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p72.tar.gz&quot;&gt;&amp;lt;URL:ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p72.tar.gz&amp;gt;&lt;/a&gt;&lt;/li&gt;
174
- &lt;li&gt;&lt;a href=&quot;ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p72.tar.bz2&quot;&gt;&amp;lt;URL:ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p72.tar.bz2&amp;gt;&lt;/a&gt;&lt;/li&gt;
175
- &lt;li&gt;&lt;a href=&quot;ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p72.zip&quot;&gt;&amp;lt;URL:ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p72.zip&amp;gt;&lt;/a&gt;&lt;/li&gt;
176
- &lt;/ul&gt; &lt;p&gt;Checksums:&lt;/p&gt;&lt;pre&gt;MD5(ruby-1.8.6-p287.tar.gz)= f6cd51001534ced5375339707a757556
177
- SHA256(ruby-1.8.6-p287.tar.gz)= 6463d1932c34ff72b79174ac7d2c28940d29d147928250928a00a0dbee43db57
178
- SIZE(ruby-1.8.6-p287.tar.gz)= 4590393
179
-
180
- MD5(ruby-1.8.6-p287.tar.bz2)= 80b5f3db12531d36e6c81fac6d05dda9
181
- SHA256(ruby-1.8.6-p287.tar.bz2)= ac15a1cb78c50ec9cc7e831616a143586bdd566bc865c6b769a0c47b3b3936ce
182
- SIZE(ruby-1.8.6-p287.tar.bz2)= 3956902
183
-
184
- MD5(ruby-1.8.6-p287.zip)= e555d51f5b387fdd52ae53d9bafa13f5
185
- SHA256(ruby-1.8.6-p287.zip)= 844c66c015565839531a34b83e0526cd4fa2a71cc0f5cc8ddb0d4c158403543a
186
- SIZE(ruby-1.8.6-p287.zip)= 5606238
187
-
188
- MD5(ruby-1.8.7-p72.tar.gz)= 5e5b7189674b3a7f69401284f6a7a36d
189
- SHA256(ruby-1.8.7-p72.tar.gz)= e15ca005076f5d6f91fc856fdfbd071698a4cadac3c6e25855899dba1f6fc5ef
190
- SIZE(ruby-1.8.7-p72.tar.gz)= 4805594
191
-
192
- MD5(ruby-1.8.7-p72.tar.bz2)= 0b215c46b89b28d7ab8d56d96e72d5b9
193
- SHA256(ruby-1.8.7-p72.tar.bz2)= a8f8a28e286dd76747d8e97ea5cfe7a315eb896906ab8c8606d687d9f6f6146e
194
- SIZE(ruby-1.8.7-p72.tar.bz2)= 4127450
195
-
196
- MD5(ruby-1.8.7-p72.zip)= b44fe5a12d4bf138ba0d3660e13a8216
197
- SHA256(ruby-1.8.7-p72.zip)= 77e67be4aa8c3e041e1d20d24e5fcf2e33ad9bccb3da3332b6c0a5b648334903
198
- SIZE(ruby-1.8.7-p72.zip)= 5855902&lt;/pre&gt;&lt;p&gt;For a full list of all changes, see the bundled files named ChangeLog, which are also available at the following locations:&lt;/p&gt;&lt;ul&gt;
199
- &lt;li&gt;&lt;a href=&quot;http://svn.ruby-lang.org/repos/ruby/tags/v1_8_6_287/ChangeLog&quot;&gt;&amp;lt;URL:http://svn.ruby-lang.org/repos/ruby/tags/v1_8_6_287/ChangeLog&amp;gt;&lt;/a&gt;&lt;/li&gt;
200
- &lt;li&gt;&lt;a href=&quot;http://svn.ruby-lang.org/repos/ruby/tags/v1_8_7_72/ChangeLog&quot;&gt;&amp;lt;URL:http://svn.ruby-lang.org/repos/ruby/tags/v1_8_7_72/ChangeLog&amp;gt;&lt;/a&gt;&lt;/li&gt;
201
- &lt;/ul&gt;</description>
202
- <pubDate>Mon, 11 Aug 2008 02:01:00 GMT</pubDate>
203
- <guid>http://www.ruby-lang.org/en/news/2008/08/11/ruby-1-8-7-p72-and-1-8-6-p287-released/</guid>
204
- <link>http://www.ruby-lang.org/en/news/2008/08/11/ruby-1-8-7-p72-and-1-8-6-p287-released/</link>
205
- </item>
206
-
207
- <item>
208
- <title>Multiple vulnerabilities in Ruby</title>
209
- <description>&lt;p&gt;Multiple vulnerabilities have been discovered in Ruby. It's
210
- recommended that you upgrade to the latest versions.&lt;/p&gt; &lt;h2&gt;&lt;a name=&quot;label-0&quot; id=&quot;label-0&quot;&gt;Details&lt;/a&gt;&lt;/h2&gt;&lt;!-- RDLabel: &quot;Details&quot; --&gt;&lt;p&gt;The following vulnerabilities have been discovered.&lt;/p&gt;&lt;h3&gt;&lt;a name=&quot;label-1&quot; id=&quot;label-1&quot;&gt;Several vulnerabilities in safe level&lt;/a&gt;&lt;/h3&gt;&lt;!-- RDLabel: &quot;Several vulnerabilities in safe level&quot; --&gt;&lt;p&gt;Several vulnerabilities in safe level have been discovered.&lt;/p&gt;&lt;ul&gt;
211
- &lt;li&gt;&lt;p&gt;untrace_var is permitted at safe level 4.&lt;/p&gt;
212
- &lt;pre&gt;trace_var(:$VAR) {|val| puts &quot;$VAR = #{val}&quot; }
213
-
214
- Thread.new do
215
- $SAFE = 4
216
- eval %q{
217
- proc = untrace_var :$VAR
218
- proc.first.call(&quot;aaa&quot;)
219
- }
220
- end.join&lt;/pre&gt;&lt;/li&gt;
221
- &lt;li&gt;&lt;p&gt;$PROGRAM_NAME may be modified at safe level 4.&lt;/p&gt;
222
- &lt;pre&gt;Thread.new do
223
- $SAFE = 4
224
- eval %q{$PROGRAM_NAME.replace &quot;Hello, World!&quot;}
225
- end.join
226
-
227
- $PROGRAM_NAME #=&amp;gt; &quot;Hello, World!&quot;&lt;/pre&gt;&lt;/li&gt;
228
- &lt;li&gt;&lt;p&gt;Insecure methods may be called at safe level 1-3.&lt;/p&gt;
229
- &lt;pre&gt;class Hello
230
- def world
231
- Thread.new do
232
- $SAFE = 4
233
- msg = &quot;Hello, World!&quot;
234
- def msg.size
235
- self.replace self*10 # replace string
236
- 1 # return wrong size
237
- end
238
- msg
239
- end.value
240
- end
241
- end
242
-
243
- $SAFE = 1 # or 2, or 3
244
- s = Hello.new.world
245
- if s.kind_of?(String)
246
- puts s if s.size &amp;lt; 20 # print string which size is less than 20
247
- end&lt;/pre&gt;&lt;/li&gt;
248
- &lt;li&gt;&lt;p&gt;Syslog operations are permitted at safe level 4.&lt;/p&gt;
249
- &lt;pre&gt;require &quot;syslog&quot;
250
-
251
- Syslog.open
252
-
253
- Thread.new do
254
- $SAFE = 4
255
- eval %q{
256
- Syslog.log(Syslog::LOG_WARNING, &quot;Hello, World!&quot;)
257
- Syslog.mask = Syslog::LOG_UPTO(Syslog::LOG_EMERG)
258
- Syslog.info(&quot;masked&quot;)
259
- Syslog.close
260
- }
261
- end.join&lt;/pre&gt;&lt;/li&gt;
262
- &lt;/ul&gt;&lt;p&gt;These vulnerabilities were reported by Keita Yamaguchi.&lt;/p&gt;&lt;h3&gt;&lt;a name=&quot;label-2&quot; id=&quot;label-2&quot;&gt;DoS vulnerability in WEBrick&lt;/a&gt;&lt;/h3&gt;&lt;!-- RDLabel: &quot;DoS vulnerability in WEBrick&quot; --&gt;&lt;p&gt;WEBrick::HTTP::DefaultFileHandler is faulty of exponential time taking
263
- requests due to a backtracking regular expression in
264
- WEBrick::HTTPUtils.split_header_value.&lt;/p&gt;&lt;p&gt;Exploitable server:&lt;/p&gt;&lt;pre&gt;require 'webrick'
265
- WEBrick::HTTPServer.new(:Port =&amp;gt; 2000, :DocumentRoot =&amp;gt; &quot;/etc&quot;).start&lt;/pre&gt;&lt;p&gt;Attack:&lt;/p&gt;&lt;pre&gt;require 'net/http'
266
- res = Net::HTTP.start(&quot;localhost&quot;, 2000) { |http|
267
- req = Net::HTTP::Get.new(&quot;/passwd&quot;)
268
- req['If-None-Match'] = %q{meh=&quot;&quot;} + %q{foo=&quot;bar&quot; } * 100
269
- http.request(req)
270
- }
271
- p res&lt;/pre&gt;&lt;p&gt;The request likely won't finish in this universe.&lt;/p&gt;&lt;p&gt;This vulnerability was reported by Christian Neukirchen.&lt;/p&gt;&lt;h3&gt;&lt;a name=&quot;label-3&quot; id=&quot;label-3&quot;&gt;Lack of taintness check in dl&lt;/a&gt;&lt;/h3&gt;&lt;!-- RDLabel: &quot;Lack of taintness check in dl&quot; --&gt;&lt;p&gt;dl doesn't check taintness, so it could allow attackers to call
272
- dangerous functions.&lt;/p&gt;&lt;pre&gt;require 'dl'
273
- $SAFE = 1
274
- h = DL.dlopen(nil)
275
- sys = h.sym('system', 'IP')
276
- uname = 'uname -rs'.taint
277
- sys[uname]&lt;/pre&gt;&lt;p&gt;This vulnerability was reported by sheepman.&lt;/p&gt;&lt;h3&gt;&lt;a name=&quot;label-4&quot; id=&quot;label-4&quot;&gt;DNS spoofing vulnerability in resolv.rb&lt;/a&gt;&lt;/h3&gt;&lt;!-- RDLabel: &quot;DNS spoofing vulnerability in resolv.rb&quot; --&gt;&lt;p&gt;resolv.rb allow remote attackers to spoof DNS answers. This risk can be
278
- reduced by randomness of DNS transaction IDs and source ports, so resolv.rb
279
- is fixed to randomize them.&lt;/p&gt;&lt;ul&gt;
280
- &lt;li&gt;see also: &lt;a href=&quot;http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-1447&quot;&gt;CVE-2008-1447&lt;/a&gt;&lt;/li&gt;
281
- &lt;/ul&gt;&lt;p&gt;This vulnerability was reported by Tanaka Akira.&lt;/p&gt;&lt;h2&gt;&lt;a name=&quot;label-5&quot; id=&quot;label-5&quot;&gt;Vulnerable versions&lt;/a&gt;&lt;/h2&gt;&lt;!-- RDLabel: &quot;Vulnerable versions&quot; --&gt;&lt;dl&gt;
282
- &lt;dt&gt;&lt;a name=&quot;label-6&quot; id=&quot;label-6&quot;&gt;1.8 series&lt;/a&gt;&lt;/dt&gt;&lt;!-- RDLabel: &quot;1.8 series&quot; --&gt;
283
- &lt;dd&gt;
284
- &lt;ul&gt;
285
- &lt;li&gt;1.8.5 and all prior versions&lt;/li&gt;
286
- &lt;li&gt;1.8.6-p286 and all prior versions&lt;/li&gt;
287
- &lt;li&gt;1.8.7-p71 and all prior versions&lt;/li&gt;
288
- &lt;/ul&gt;
289
- &lt;/dd&gt;
290
- &lt;dt&gt;&lt;a name=&quot;label-7&quot; id=&quot;label-7&quot;&gt;1.9 series&lt;/a&gt;&lt;/dt&gt;&lt;!-- RDLabel: &quot;1.9 series&quot; --&gt;
291
- &lt;dd&gt;
292
- &lt;ul&gt;
293
- &lt;li&gt;r18423 and all prior revisions&lt;/li&gt;
294
- &lt;/ul&gt;
295
- &lt;/dd&gt;
296
- &lt;/dl&gt;&lt;h2&gt;&lt;a name=&quot;label-8&quot; id=&quot;label-8&quot;&gt;Solution&lt;/a&gt;&lt;/h2&gt;&lt;!-- RDLabel: &quot;Solution&quot; --&gt;&lt;dl&gt;
297
- &lt;dt&gt;&lt;a name=&quot;label-9&quot; id=&quot;label-9&quot;&gt;1.8 series&lt;/a&gt;&lt;/dt&gt;&lt;!-- RDLabel: &quot;1.8 series&quot; --&gt;
298
- &lt;dd&gt;
299
- Please upgrade to 1.8.6-p287, or 1.8.7-p72.
300
- &lt;ul&gt;
301
- &lt;li&gt;&lt;a href=&quot;ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p287.tar.gz&quot;&gt;&amp;lt;URL:ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p287.tar.gz&amp;gt;&lt;/a&gt;&lt;/li&gt;
302
- &lt;li&gt;&lt;a href=&quot;ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p72.tar.gz&quot;&gt;&amp;lt;URL:ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p72.tar.gz&amp;gt;&lt;/a&gt;&lt;/li&gt;
303
- &lt;/ul&gt;
304
- &lt;/dd&gt;
305
- &lt;dt&gt;&lt;a name=&quot;label-10&quot; id=&quot;label-10&quot;&gt;1.9 series&lt;/a&gt;&lt;/dt&gt;&lt;!-- RDLabel: &quot;1.9 series&quot; --&gt;
306
- &lt;dd&gt;
307
- &lt;p&gt;Please check out the latest version using Subversion.&lt;/p&gt;
308
- &lt;pre&gt;$ svn co http://svn.ruby-lang.org/repos/ruby/trunk ruby&lt;/pre&gt;
309
- &lt;/dd&gt;
310
- &lt;/dl&gt;&lt;p&gt;Please note that a package that corrects this weakness may already be
311
- available through your package management software.&lt;/p&gt;&lt;h2&gt;&lt;a name=&quot;label-11&quot; id=&quot;label-11&quot;&gt;Credit&lt;/a&gt;&lt;/h2&gt;&lt;!-- RDLabel: &quot;Credit&quot; --&gt;&lt;p&gt;Credit to Keita Yamaguchi, Christian Neukirchen, sheepman, and Tanaka
312
- Akira for disclosing these problems to Ruby Security Team.&lt;/p&gt;&lt;h2&gt;&lt;a name=&quot;label-12&quot; id=&quot;label-12&quot;&gt;Changes&lt;/a&gt;&lt;/h2&gt;&lt;!-- RDLabel: &quot;Changes&quot; --&gt;&lt;ul&gt;
313
- &lt;li&gt;2008-08-08 12:21 +09:00 fixed the revision number of ruby 1.9.&lt;/li&gt;
314
- &lt;li&gt;2008-08-11 11:23 +09:00 fixed the patchlevel of ruby 1.8. see &lt;a href=&quot;http://www.ruby-lang.org/en/news/2008/08/11/ruby-1-8-7-p72-and-1-8-6-p287-released/&quot;&gt;the release announcement of Ruby 1.8.7-p72 and 1.8.6-p287&lt;/a&gt;&lt;/li&gt;
315
- &lt;/ul&gt;</description>
316
- <pubDate>Fri, 08 Aug 2008 02:59:49 GMT</pubDate>
317
- <guid>http://www.ruby-lang.org/en/news/2008/08/08/multiple-vulnerabilities-in-ruby/</guid>
318
- <link>http://www.ruby-lang.org/en/news/2008/08/08/multiple-vulnerabilities-in-ruby/</link>
319
- </item>
320
-
321
- <item>
322
- <title>RubyConf 2008 Proposals Now Being Accepted</title>
323
- <description>&lt;p&gt;&lt;a href=&quot;http://www.rubyconf.org&quot;&gt;RubyConf 2008&lt;/a&gt; will be held in Orlando, Florida, &lt;span class=&quot;caps&quot;&gt;USA&lt;/span&gt;, from November 6 to November 8.&lt;/p&gt;
324
-
325
-
326
- &lt;p&gt;&lt;a href=&quot;http://www.rubyconf.org/proposals/new&quot;&gt;Proposals for presentations&lt;/a&gt; are now begin accepted. All proposals must be received by August 21.&lt;/p&gt; </description>
327
- <pubDate>Mon, 04 Aug 2008 20:26:29 GMT</pubDate>
328
- <guid>http://www.ruby-lang.org/en/news/2008/08/04/rubyconf-2008-proposals-now-being-accepted/</guid>
329
- <link>http://www.ruby-lang.org/en/news/2008/08/04/rubyconf-2008-proposals-now-being-accepted/</link>
330
- </item>
331
-
332
- <item>
333
- <title>Arbitrary code execution vulnerabilities</title>
334
- <description>&lt;p&gt;Multiple vulnerabilities in Ruby may lead to a denial of service (DoS)
335
- condition or allow execution of arbitrary code.&lt;/p&gt; &lt;h2&gt;&lt;a name=&quot;label-0&quot; id=&quot;label-0&quot;&gt;Impact&lt;/a&gt;&lt;/h2&gt;&lt;!-- RDLabel: &quot;Impact&quot; --&gt;&lt;p&gt;With the following vulnerabilities, an attacker can lead to denial of
336
- service condition or execute arbitrary code.&lt;/p&gt;&lt;ul&gt;
337
- &lt;li&gt;&lt;a href=&quot;http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-2662&quot;&gt;CVE-2008-2662&lt;/a&gt;&lt;/li&gt;
338
- &lt;li&gt;&lt;a href=&quot;http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-2663&quot;&gt;CVE-2008-2663&lt;/a&gt;&lt;/li&gt;
339
- &lt;li&gt;&lt;a href=&quot;http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-2725&quot;&gt;CVE-2008-2725&lt;/a&gt;&lt;/li&gt;
340
- &lt;li&gt;&lt;a href=&quot;http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-2726&quot;&gt;CVE-2008-2726&lt;/a&gt;&lt;/li&gt;
341
- &lt;li&gt;&lt;a href=&quot;http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-2664&quot;&gt;CVE-2008-2664&lt;/a&gt;&lt;/li&gt;
342
- &lt;/ul&gt;&lt;h2&gt;&lt;a name=&quot;label-1&quot; id=&quot;label-1&quot;&gt;Vulnerable versions&lt;/a&gt;&lt;/h2&gt;&lt;!-- RDLabel: &quot;Vulnerable versions&quot; --&gt;&lt;dl&gt;
343
- &lt;dt&gt;&lt;a name=&quot;label-2&quot; id=&quot;label-2&quot;&gt;1.8 series&lt;/a&gt;&lt;/dt&gt;&lt;!-- RDLabel: &quot;1.8 series&quot; --&gt;
344
- &lt;dd&gt;
345
- &lt;ul&gt;
346
- &lt;li&gt;1.8.4 and all prior versions&lt;/li&gt;
347
- &lt;li&gt;1.8.5-p230 and all prior versions&lt;/li&gt;
348
- &lt;li&gt;1.8.6-p229 and all prior versions&lt;/li&gt;
349
- &lt;li&gt;1.8.7-p21 and all prior versions&lt;/li&gt;
350
- &lt;/ul&gt;
351
- &lt;/dd&gt;
352
- &lt;dt&gt;&lt;a name=&quot;label-3&quot; id=&quot;label-3&quot;&gt;1.9 series&lt;/a&gt;&lt;/dt&gt;&lt;!-- RDLabel: &quot;1.9 series&quot; --&gt;
353
- &lt;dd&gt;
354
- &lt;ul&gt;
355
- &lt;li&gt;1.9.0-1 and all prior versions&lt;/li&gt;
356
- &lt;/ul&gt;
357
- &lt;/dd&gt;
358
- &lt;/dl&gt;&lt;h2&gt;&lt;a name=&quot;label-4&quot; id=&quot;label-4&quot;&gt;Solution&lt;/a&gt;&lt;/h2&gt;&lt;!-- RDLabel: &quot;Solution&quot; --&gt;&lt;dl&gt;
359
- &lt;dt&gt;&lt;a name=&quot;label-5&quot; id=&quot;label-5&quot;&gt;1.8 series&lt;/a&gt;&lt;/dt&gt;&lt;!-- RDLabel: &quot;1.8 series&quot; --&gt;
360
- &lt;dd&gt;
361
- Please upgrade to 1.8.5-p231, or 1.8.6-p230, or 1.8.7-p22.
362
- &lt;ul&gt;
363
- &lt;li&gt;&lt;a href=&quot;ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.5-p231.tar.gz&quot;&gt;&amp;lt;URL:ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.5-p231.tar.gz&amp;gt;&lt;/a&gt;
364
- (md5sum: e900cf225d55414bffe878f00a85807c)&lt;/li&gt;
365
- &lt;li&gt;&lt;a href=&quot;ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p230.tar.gz&quot;&gt;&amp;lt;URL:ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p230.tar.gz&amp;gt;&lt;/a&gt;
366
- (md5sum: 5e8247e39be2dc3c1a755579c340857f)&lt;/li&gt;
367
- &lt;li&gt;&lt;a href=&quot;ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p22.tar.gz&quot;&gt;&amp;lt;URL:ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p22.tar.gz&amp;gt;&lt;/a&gt;
368
- (md5sum: fc3ede83a98f48d8cb6de2145f680ef2)&lt;/li&gt;
369
- &lt;/ul&gt;
370
- &lt;/dd&gt;
371
- &lt;dt&gt;&lt;a name=&quot;label-6&quot; id=&quot;label-6&quot;&gt;1.9 series&lt;/a&gt;&lt;/dt&gt;&lt;!-- RDLabel: &quot;1.9 series&quot; --&gt;
372
- &lt;dd&gt;
373
- Please upgrade to 1.9.0-2.
374
- &lt;ul&gt;
375
- &lt;li&gt;&lt;a href=&quot;ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.0-2.tar.gz&quot;&gt;&amp;lt;URL:ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.0-2.tar.gz&amp;gt;&lt;/a&gt;
376
- (md5sum: 2a848b81ed1d6393b88eec8aa6173b75)&lt;/li&gt;
377
- &lt;/ul&gt;
378
- &lt;/dd&gt;
379
- &lt;/dl&gt;&lt;p&gt;These versions also fix the vulnerability of WEBrick (&lt;a href=&quot;http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-1891&quot;&gt;CVE-2008-1891&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;Please note that a package that corrects this weakness may already be
380
- available through your package management software.&lt;/p&gt;&lt;h2&gt;&lt;a name=&quot;label-7&quot; id=&quot;label-7&quot;&gt;Credit&lt;/a&gt;&lt;/h2&gt;&lt;!-- RDLabel: &quot;Credit&quot; --&gt;&lt;p&gt;Credit to Drew Yao of Apple Product Security for disclosing the problem to Ruby
381
- Security Team.&lt;/p&gt;&lt;h2&gt;&lt;a name=&quot;label-8&quot; id=&quot;label-8&quot;&gt;Changes&lt;/a&gt;&lt;/h2&gt;&lt;!-- RDLabel: &quot;Changes&quot; --&gt;&lt;ul&gt;
382
- &lt;li&gt;2008-06-21 00:29 +09:00 removed wrong CVE IDs (CVE-2008-2727, CVE-2008-2728).&lt;/li&gt;
383
- &lt;/ul&gt;</description>
384
- <pubDate>Fri, 20 Jun 2008 12:54:43 GMT</pubDate>
385
- <guid>http://www.ruby-lang.org/en/news/2008/06/20/arbitrary-code-execution-vulnerabilities/</guid>
386
- <link>http://www.ruby-lang.org/en/news/2008/06/20/arbitrary-code-execution-vulnerabilities/</link>
387
- </item>
388
-
389
-
390
- </channel>
391
- </rss>