diff --git a/app/models/article.rb b/app/models/article.rb index 0d4cf59991..1cdb26d515 100644 --- a/app/models/article.rb +++ b/app/models/article.rb @@ -1,8 +1,9 @@ require 'uri' require 'net/http' -require 'md5' class Article < ActiveRecord::Base + include TypoGuid + has_many :pings, :dependent => true, :order => "created_at ASC" has_many :comments, :dependent => true, :order => "created_at ASC" has_many :trackbacks, :dependent => true, :order => "created_at ASC" @@ -121,7 +122,7 @@ def keywords_to_tags protected - before_save :set_defaults + before_save :set_defaults, :create_guid def set_defaults begin @@ -138,10 +139,6 @@ def set_defaults self.permalink = self.stripped_title if self.attributes.include?("permalink") and self.permalink.blank? end - if schema_version >= 9 - self.guid = Digest::MD5.new(self.body.to_s+self.extended.to_s+self.title.to_s+self.permalink.to_s+self.author.to_s+Time.now.to_f.to_s).to_s if self.guid.blank? - end - if schema_version >= 10 keywords_to_tags end diff --git a/app/models/comment.rb b/app/models/comment.rb index 5ed99c18a9..bac4f4dbf3 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -1,6 +1,8 @@ require_dependency 'transforms' class Comment < ActiveRecord::Base + include TypoGuid + belongs_to :article belongs_to :user @@ -10,7 +12,7 @@ class Comment < ActiveRecord::Base protected - before_save :correct_url, :make_nofollow + before_save :correct_url, :make_nofollow, :create_guid def correct_url unless url.to_s.empty? diff --git a/app/models/trackback.rb b/app/models/trackback.rb index 56b1a16c5e..371a3eac45 100644 --- a/app/models/trackback.rb +++ b/app/models/trackback.rb @@ -1,6 +1,7 @@ require_dependency 'transforms' class Trackback < ActiveRecord::Base + include TypoGuid belongs_to :article validates_age_of :article_id @@ -8,7 +9,7 @@ class Trackback < ActiveRecord::Base validates_presence_of :title, :excerpt, :blog_name, :url protected - before_save :make_nofollow, :process_trackback + before_save :make_nofollow, :process_trackback, :create_guid def make_nofollow self.blog_name = strip_html(blog_name) diff --git a/app/views/xml/_atom10_item_comment.rxml b/app/views/xml/_atom10_item_comment.rxml index be314550c4..4ded9ab838 100644 --- a/app/views/xml/_atom10_item_comment.rxml +++ b/app/views/xml/_atom10_item_comment.rxml @@ -1,6 +1,6 @@ xm.entry do xm.author { xm.name item.author } - xm.id "tag:#{controller.request.host},2005:Typo-#{item.id}" + xm.id "urn:uuid:#{item.guid}" xm.published item.created_at.xmlschema xm.updated item.updated_at.xmlschema diff --git a/app/views/xml/_atom10_item_trackback.rxml b/app/views/xml/_atom10_item_trackback.rxml index eb2cda11cb..d1fda2c5df 100644 --- a/app/views/xml/_atom10_item_trackback.rxml +++ b/app/views/xml/_atom10_item_trackback.rxml @@ -1,5 +1,5 @@ xm.entry do - xm.id "tag:#{controller.request.host},2005:Typo-#{item.id}" + xm.id "urn:uuid:#{item.guid}" xm.author do xm.name item.blog_name diff --git a/config/environment.rb b/config/environment.rb index a09406a355..89b0699772 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -97,6 +97,7 @@ require_dependency 'configuration' require_dependency 'spam_protection' require_dependency 'xmlrpc_fix' +require_dependency 'guid' ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS.update(:database_manager => CGI::Session::ActiveRecordStore) ActionController::Base.fragment_cache_store = ActionController::Caching::Fragments::FileStore.new("#{RAILS_ROOT}/cache/fragment/") diff --git a/db/migrate/18_add_guids.rb b/db/migrate/18_add_guids.rb new file mode 100644 index 0000000000..4f344da163 --- /dev/null +++ b/db/migrate/18_add_guids.rb @@ -0,0 +1,21 @@ +class AddGuids < ActiveRecord::Migration + def self.up + STDERR.puts "Adding GUIDs to Comments and Trackbacks" + Comment.transaction do + add_column :comments, :guid, :string + add_column :trackbacks, :guid, :string + + Comment.find(:all).each do |c| + c.save if c.guid.blank? + end + Trackback.find(:all).each do |t| + t.save if t.guid.blank? + end + end + end + + def self.down + remove_column :comments, :guid + remove_column :trackbacks, :guid + end +end diff --git a/db/schema.mysql-v3.sql b/db/schema.mysql-v3.sql index 02072dfb6e..5f63b8ecd1 100644 --- a/db/schema.mysql-v3.sql +++ b/db/schema.mysql-v3.sql @@ -64,7 +64,8 @@ CREATE TABLE comments ( body_html text, created_at datetime, updated_at datetime, - user_id int(11) + user_id int(11), + guid varchar(255) ) ENGINE=MyISAM; CREATE TABLE page_caches ( @@ -150,7 +151,8 @@ CREATE TABLE trackbacks ( url varchar(255), ip varchar(255), created_at datetime, - updated_at datetime + updated_at datetime, + guid varchar(255) ) ENGINE=MyISAM; CREATE TABLE users ( @@ -191,4 +193,4 @@ CREATE TABLE schema_info ( version int(11) ) ENGINE=MyISAM; -insert into schema_info (version) values (17); +insert into schema_info (version) values (18); diff --git a/db/schema.mysql.sql b/db/schema.mysql.sql index d9cd7d5776..78a9705358 100644 --- a/db/schema.mysql.sql +++ b/db/schema.mysql.sql @@ -64,7 +64,8 @@ CREATE TABLE comments ( body_html text, created_at datetime, updated_at datetime, - user_id int(11) + user_id int(11), + guid varchar(255) ) ENGINE=InnoDB; CREATE TABLE page_caches ( @@ -150,7 +151,8 @@ CREATE TABLE trackbacks ( url varchar(255), ip varchar(255), created_at datetime, - updated_at datetime + updated_at datetime, + guid varchar(255) ) ENGINE=InnoDB; CREATE TABLE users ( @@ -191,4 +193,4 @@ CREATE TABLE schema_info ( version int(11) ) ENGINE=InnoDB; -insert into schema_info (version) values (17); +insert into schema_info (version) values (18); diff --git a/db/schema.postgresql.sql b/db/schema.postgresql.sql index c1726464b7..500c989ac4 100644 --- a/db/schema.postgresql.sql +++ b/db/schema.postgresql.sql @@ -64,7 +64,8 @@ CREATE TABLE comments ( body_html text, created_at timestamp, updated_at timestamp, - user_id integer + user_id integer, + guid character varying(255) ); CREATE TABLE page_caches ( @@ -150,7 +151,8 @@ CREATE TABLE trackbacks ( url character varying(255), ip character varying(255), created_at timestamp, - updated_at timestamp + updated_at timestamp, + guid character varying(255) ); CREATE TABLE users ( @@ -191,4 +193,4 @@ CREATE TABLE schema_info ( version integer ); -insert into schema_info (version) values (17); +insert into schema_info (version) values (18); diff --git a/db/schema.sqlite.sql b/db/schema.sqlite.sql index 6b349b5a55..bb6b6c9125 100644 --- a/db/schema.sqlite.sql +++ b/db/schema.sqlite.sql @@ -64,7 +64,8 @@ CREATE TABLE comments ( body_html text, created_at datetime, updated_at datetime, - user_id integer + user_id integer, + guid varchar(255) ); CREATE TABLE page_caches ( @@ -150,7 +151,8 @@ CREATE TABLE trackbacks ( url varchar(255), ip varchar(255), created_at datetime, - updated_at datetime + updated_at datetime, + guid varchar(255) ); CREATE TABLE users ( @@ -191,4 +193,4 @@ CREATE TABLE schema_info ( version integer ); -insert into schema_info (version) values (17); +insert into schema_info (version) values (18); diff --git a/lib/guid.rb b/lib/guid.rb new file mode 100644 index 0000000000..1d262f9051 --- /dev/null +++ b/lib/guid.rb @@ -0,0 +1,16 @@ +require 'md5' + +module TypoGuid + def create_guid + self.guid rescue return true + return true unless self.guid.blank? + + guid_text = self.inspect+Time.now.to_f.to_s + begin + guid_text += File.open("/dev/urandom",'r').read(16) + rescue => err + end + self.guid = Digest::MD5.new(guid_text).to_s + true + end +end diff --git a/test/fixtures/comments.yml b/test/fixtures/comments.yml index c4b5e3b5e6..66a8183d2d 100644 --- a/test/fixtures/comments.yml +++ b/test/fixtures/comments.yml @@ -8,6 +8,7 @@ spam_comment: body: Test body created_at: 2005-01-01 02:00:00 updated_at: 2005-01-01 02:00:00 + guid: 12313123123123123 comment2: id: 2 @@ -19,3 +20,4 @@ comment2: body: Comment body _italic_ *bold* created_at: 2005-01-01 02:00:01 updated_at: 2005-01-01 02:00:01 + guid: 453456456456456 diff --git a/test/fixtures/trackbacks.yml b/test/fixtures/trackbacks.yml index 07cf6dc80f..19654a0fbb 100644 --- a/test/fixtures/trackbacks.yml +++ b/test/fixtures/trackbacks.yml @@ -7,6 +7,7 @@ trackback1: excerpt: This is an excerpt created_at: 2005-01-01 03:00:00 updated_at: 2005-01-01 03:00:00 + guid: dsafsadffsdsf trackback2: id: 2 @@ -17,3 +18,4 @@ trackback2: excerpt: This is an excerpt created_at: 2005-01-01 03:00:01 updated_at: 2005-01-01 03:00:01 + guid: qweqweqddsfcs diff --git a/test/unit/comment_test.rb b/test/unit/comment_test.rb index ae9e700530..d57054c4c1 100644 --- a/test/unit/comment_test.rb +++ b/test/unit/comment_test.rb @@ -19,6 +19,17 @@ def test_save_spam assert_equal "http://fakeurl.com", @spam_comment.url end + def test_create_comment + c = Comment.new + c.author = 'Bob' + c.article_id = 1 + c.body = 'nice post' + c.ip = '1.2.3.4' + + assert c.save + assert c.guid.size > 15 + end + def test_reject_spam_rbl c = Comment.new c.author "Spammer" diff --git a/test/unit/trackback_test.rb b/test/unit/trackback_test.rb index f0b0e9c8ba..810f300511 100644 --- a/test/unit/trackback_test.rb +++ b/test/unit/trackback_test.rb @@ -21,6 +21,7 @@ def test_incomplete tb.url = "http://foo.com" assert tb.save assert tb.errors.empty? + assert tb.guid.size > 15 end def test_reject_spam_rbl