mwmitchell-rsolr 0.6.9 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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>