typo 4.0.2 → 4.0.3
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/app/controllers/admin/feedback_controller.rb +6 -1
- data/app/controllers/articles_controller.rb +3 -1
- data/app/controllers/backend_controller.rb +2 -0
- data/app/helpers/admin/base_helper.rb +2 -2
- data/app/helpers/admin/feedback_helper.rb +6 -3
- data/app/models/article.rb +2 -1
- data/app/models/comment.rb +1 -1
- data/app/models/content_state/base.rb +4 -0
- data/app/models/content_state/ham.rb +6 -1
- data/app/models/content_state/just_marked_as_ham.rb +5 -0
- data/app/models/content_state/just_marked_as_spam.rb +1 -0
- data/app/models/content_state/just_presumed_ham.rb +1 -0
- data/app/models/content_state/presumed_ham.rb +5 -0
- data/app/models/content_state/presumed_spam.rb +1 -0
- data/app/models/content_state/spam.rb +5 -0
- data/app/models/feedback.rb +4 -0
- data/app/views/admin/categories/show.rhtml +1 -0
- data/app/views/admin/feedback/_item.rhtml +3 -1
- data/app/views/admin/feedback/list.rhtml +7 -5
- data/bin/typo +1 -0
- data/db/migrate/050_add_status_confirmed_field_to_content.rb +19 -0
- data/db/schema.mysql-v3.sql +3 -2
- data/db/schema.mysql.sql +3 -2
- data/db/schema.postgresql.sql +3 -2
- data/db/schema.rb +2 -1
- data/db/schema.sqlite.sql +3 -2
- data/db/schema.sqlserver.sql +3 -2
- data/db/schema_version +1 -1
- data/lib/spam_protection.rb +1 -1
- data/lib/tasks/release.rake +2 -2
- data/lib/typo_version.rb +1 -1
- data/test/fixtures/contents.yml +53 -0
- data/test/functional/admin/feedback_controller_test.rb +36 -1
- data/test/functional/xml_controller_test.rb +4 -4
- data/test/unit/article_test.rb +2 -1
- data/test/unit/blog_test.rb +1 -1
- data/test/unit/comment_test.rb +21 -0
- data/test/unit/user_test.rb +3 -3
- data/vendor/akismet/akismet.rb +23 -14
- metadata +4 -4
- data/.DS_Store +0 -0
@@ -4,7 +4,7 @@ class Admin::FeedbackController < Admin::BaseController
|
|
4
4
|
model :comment, :trackback
|
5
5
|
|
6
6
|
def index
|
7
|
-
conditions = ['
|
7
|
+
conditions = ['blog_id = :blog_id', {:blog_id => Blog.default.id}]
|
8
8
|
|
9
9
|
if params[:search]
|
10
10
|
conditions.first << ' and (url like :pattern or author like :pattern or title like :pattern or ip like :pattern or email like :pattern)'
|
@@ -16,6 +16,11 @@ class Admin::FeedbackController < Admin::BaseController
|
|
16
16
|
conditions.last.merge!(:published => false)
|
17
17
|
end
|
18
18
|
|
19
|
+
if params[:confirmed] == 'f'
|
20
|
+
conditions.first << ' AND (status_confirmed = :status_confirmed)'
|
21
|
+
conditions.last.merge!(:status_confirmed => false)
|
22
|
+
end
|
23
|
+
|
19
24
|
@pages, @feedback = paginate(:feedback,
|
20
25
|
:order => 'contents.created_at desc',
|
21
26
|
:conditions => conditions,
|
@@ -101,7 +101,9 @@ class ArticlesController < ContentController
|
|
101
101
|
:user_agent => request.env['HTTP_USER_AGENT'],
|
102
102
|
:referrer => request.env['HTTP_REFERER'],
|
103
103
|
:permalink => this_blog.article_url(@article, false)})
|
104
|
-
@comment = @article.comments.
|
104
|
+
@comment = @article.comments.build(params[:comment])
|
105
|
+
@comment.author ||= 'Anonymous'
|
106
|
+
@comment.save!
|
105
107
|
add_to_cookies(:author, @comment.author)
|
106
108
|
add_to_cookies(:url, @comment.url)
|
107
109
|
|
@@ -3,6 +3,8 @@ class BackendController < ContentController
|
|
3
3
|
session :off
|
4
4
|
|
5
5
|
web_service_dispatching_mode :layered
|
6
|
+
web_service_exception_reporting false
|
7
|
+
|
6
8
|
web_service(:metaWeblog) { MetaWeblogService.new(self) }
|
7
9
|
web_service(:mt) { MovableTypeService.new(self) }
|
8
10
|
web_service(:blogger) { BloggerService.new(self) }
|
@@ -26,9 +26,9 @@ module Admin::BaseHelper
|
|
26
26
|
|
27
27
|
def current_user_notice
|
28
28
|
unless session[:user]
|
29
|
-
link_to "log in", :controller => "accounts", :action=>"login"
|
29
|
+
link_to "log in", :controller => "/accounts", :action=>"login"
|
30
30
|
else
|
31
|
-
link_to "log out", :controller => "accounts", :action=>"logout"
|
31
|
+
link_to "log out", :controller => "/accounts", :action=>"logout"
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
@@ -2,8 +2,11 @@ module Admin::FeedbackHelper
|
|
2
2
|
def link_to_article_edit(article)
|
3
3
|
link_to truncate(article.title, 60), :controller => 'content', :action => 'edit', :id => article.id
|
4
4
|
end
|
5
|
-
|
5
|
+
|
6
6
|
def task_showmod(title)
|
7
|
-
content_tag :li,
|
8
|
-
|
7
|
+
content_tag :li,
|
8
|
+
link_to(title, :published => (title =~ /spam/ ? 'f' : ''),
|
9
|
+
:confirmed => (title =~ /unconfirmed/ ? 'f' : ''),
|
10
|
+
:search => params[:search])
|
11
|
+
end
|
9
12
|
end
|
data/app/models/article.rb
CHANGED
data/app/models/comment.rb
CHANGED
@@ -42,7 +42,7 @@ class Comment < Feedback
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def body_html_postprocess(value, controller)
|
45
|
-
sanitize(controller.send(:auto_link, value),'a href, b, br, i, p, em, strong, pre, code, ol, ul, li')
|
45
|
+
sanitize(controller.send(:auto_link, value),'a href, b, br, i, p, em, strong, pre, code, ol, ul, li, blockquote')
|
46
46
|
end
|
47
47
|
|
48
48
|
def default_text_filter_config_key
|
@@ -5,13 +5,18 @@ module ContentState
|
|
5
5
|
|
6
6
|
def enter_hook(content)
|
7
7
|
super
|
8
|
-
content[:published]
|
8
|
+
content[:published] = true
|
9
|
+
content[:status_confirmed] = true
|
9
10
|
end
|
10
11
|
|
11
12
|
def published?(content)
|
12
13
|
true
|
13
14
|
end
|
14
15
|
|
16
|
+
def status_confirmed?(content)
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
15
20
|
def before_save(content)
|
16
21
|
content.report_as_ham
|
17
22
|
true
|
@@ -6,6 +6,7 @@ module ContentState
|
|
6
6
|
def enter_hook(content)
|
7
7
|
super
|
8
8
|
content[:published] = true
|
9
|
+
content[:status_confirmed] = false
|
9
10
|
end
|
10
11
|
|
11
12
|
def published?(content)
|
@@ -20,6 +21,10 @@ module ContentState
|
|
20
21
|
content.mark_as_ham
|
21
22
|
end
|
22
23
|
|
24
|
+
def mark_as_ham(content)
|
25
|
+
content.state = Factory.new(:ham)
|
26
|
+
end
|
27
|
+
|
23
28
|
def to_s
|
24
29
|
'Ham?'
|
25
30
|
end
|
@@ -6,12 +6,17 @@ module ContentState
|
|
6
6
|
def enter_hook(content)
|
7
7
|
super
|
8
8
|
content[:published] = false
|
9
|
+
content[:status_confirmed] = true
|
9
10
|
end
|
10
11
|
|
11
12
|
def is_spam?(content)
|
12
13
|
true
|
13
14
|
end
|
14
15
|
|
16
|
+
def status_confirmed?(content)
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
15
20
|
def to_s
|
16
21
|
'Spam'
|
17
22
|
end
|
data/app/models/feedback.rb
CHANGED
@@ -54,6 +54,10 @@ class Feedback < Content
|
|
54
54
|
state.is_spam?(self)
|
55
55
|
end
|
56
56
|
|
57
|
+
def status_confirmed?
|
58
|
+
state.status_confirmed?(self)
|
59
|
+
end
|
60
|
+
|
57
61
|
# is_spam? checks to see if this is spam.
|
58
62
|
#
|
59
63
|
# options are passed on to Akismet. Recommended options (when available) are:
|
@@ -5,7 +5,9 @@
|
|
5
5
|
<td class="field"><%= link_to_article_edit item.article %></td>
|
6
6
|
<td class="field">
|
7
7
|
<%=h (item.author || '(unknown)').slice(0,40) %><br/>
|
8
|
-
|
8
|
+
<% if item.url -%>
|
9
|
+
<%= link_to h(truncate(item.url.to_s)), item.url %><br/>
|
10
|
+
<% end -%>
|
9
11
|
<%=h item.email.to_s.slice(0,40) %>
|
10
12
|
</td>
|
11
13
|
<td class="field"><%=h truncate(item.body,80)%></td>
|
@@ -1,13 +1,15 @@
|
|
1
1
|
<% @page_heading = "Comments and Trackbacks for #{ this_blog.settings['blog_name'] }" %>
|
2
2
|
|
3
3
|
<% content_for('tasks') do %>
|
4
|
-
<%= task_showmod '
|
4
|
+
<%= task_showmod 'Limit to spam' %>
|
5
|
+
<%= task_showmod 'Limit to unconfirmed' %>
|
6
|
+
<%= task_showmod 'Limit to unconfirmed spam' %>
|
5
7
|
<% end %>
|
6
8
|
|
7
|
-
<div
|
8
|
-
|
9
|
-
<label for="search">Feedback Search:</label><input type="text" id="
|
10
|
-
|
9
|
+
<div class="search">
|
10
|
+
<%= form_tag({:action => 'index'}, :method => :get) %>
|
11
|
+
<label for="search">Feedback Search:</label><input type="text" id="feedback_search" name="search" value="<%=h params[:search] %>" size="15" />
|
12
|
+
<%= end_form_tag %>
|
11
13
|
</div>
|
12
14
|
|
13
15
|
<div class="list">
|
data/bin/typo
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
class AddStatusConfirmedFieldToContent < ActiveRecord::Migration
|
2
|
+
class Content < ActiveRecord::Base
|
3
|
+
include BareMigration
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.up
|
7
|
+
modify_tables_and_update \
|
8
|
+
[:add_column, Content, :status_confirmed, :boolean] do |a|
|
9
|
+
if not $schema_generator
|
10
|
+
a.status_confirmed = (a.state =~ /ContentState::(Sp|H)am/ ? true : false)
|
11
|
+
a.save!
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.down
|
17
|
+
remove_column :contents, :status_confirmed
|
18
|
+
end
|
19
|
+
end
|
data/db/schema.mysql-v3.sql
CHANGED
@@ -65,7 +65,8 @@ CREATE TABLE contents (
|
|
65
65
|
`allow_comments` tinyint(1),
|
66
66
|
`blog_id` int(11) NOT NULL,
|
67
67
|
`published_at` datetime,
|
68
|
-
`state` text
|
68
|
+
`state` text,
|
69
|
+
`status_confirmed` tinyint(1)
|
69
70
|
) TYPE=MyISAM;
|
70
71
|
|
71
72
|
CREATE TABLE notifications (
|
@@ -214,4 +215,4 @@ CREATE TABLE schema_info (
|
|
214
215
|
`version` int(11)
|
215
216
|
) TYPE=MyISAM;
|
216
217
|
|
217
|
-
insert into schema_info (version) values (
|
218
|
+
insert into schema_info (version) values (50);
|
data/db/schema.mysql.sql
CHANGED
@@ -65,7 +65,8 @@ CREATE TABLE contents (
|
|
65
65
|
`allow_comments` tinyint(1),
|
66
66
|
`blog_id` int(11) NOT NULL,
|
67
67
|
`published_at` datetime,
|
68
|
-
`state` text
|
68
|
+
`state` text,
|
69
|
+
`status_confirmed` tinyint(1)
|
69
70
|
) ENGINE=InnoDB;
|
70
71
|
|
71
72
|
CREATE TABLE notifications (
|
@@ -214,4 +215,4 @@ CREATE TABLE schema_info (
|
|
214
215
|
`version` int(11)
|
215
216
|
) ENGINE=InnoDB;
|
216
217
|
|
217
|
-
insert into schema_info (version) values (
|
218
|
+
insert into schema_info (version) values (50);
|
data/db/schema.postgresql.sql
CHANGED
@@ -65,7 +65,8 @@ CREATE TABLE contents (
|
|
65
65
|
"allow_comments" boolean,
|
66
66
|
"blog_id" integer NOT NULL,
|
67
67
|
"published_at" timestamp,
|
68
|
-
"state" text
|
68
|
+
"state" text,
|
69
|
+
"status_confirmed" boolean
|
69
70
|
);
|
70
71
|
|
71
72
|
CREATE TABLE notifications (
|
@@ -214,4 +215,4 @@ CREATE TABLE schema_info (
|
|
214
215
|
"version" integer
|
215
216
|
);
|
216
217
|
|
217
|
-
insert into schema_info (version) values (
|
218
|
+
insert into schema_info (version) values (50);
|
data/db/schema.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# migrations feature of ActiveRecord to incrementally modify your database, and
|
3
3
|
# then regenerate this schema definition.
|
4
4
|
|
5
|
-
ActiveRecord::Schema.define(:version =>
|
5
|
+
ActiveRecord::Schema.define(:version => 50) do
|
6
6
|
|
7
7
|
create_table "articles_categories", :id => false, :force => true do |t|
|
8
8
|
t.column "article_id", :integer
|
@@ -63,6 +63,7 @@ ActiveRecord::Schema.define(:version => 49) do
|
|
63
63
|
t.column "blog_id", :integer, :null => false
|
64
64
|
t.column "published_at", :datetime
|
65
65
|
t.column "state", :text
|
66
|
+
t.column "status_confirmed", :boolean
|
66
67
|
end
|
67
68
|
|
68
69
|
add_index "contents", ["article_id"], :name => "contents_article_id_index"
|
data/db/schema.sqlite.sql
CHANGED
@@ -65,7 +65,8 @@ CREATE TABLE contents (
|
|
65
65
|
"allow_comments" boolean,
|
66
66
|
"blog_id" integer NOT NULL,
|
67
67
|
"published_at" datetime,
|
68
|
-
"state" text
|
68
|
+
"state" text,
|
69
|
+
"status_confirmed" boolean
|
69
70
|
);
|
70
71
|
|
71
72
|
CREATE TABLE notifications (
|
@@ -214,4 +215,4 @@ CREATE TABLE schema_info (
|
|
214
215
|
"version" integer
|
215
216
|
);
|
216
217
|
|
217
|
-
insert into schema_info (version) values (
|
218
|
+
insert into schema_info (version) values (50);
|
data/db/schema.sqlserver.sql
CHANGED
@@ -69,7 +69,8 @@ CREATE TABLE contents (
|
|
69
69
|
[allow_comments] bit,
|
70
70
|
[blog_id] int NOT NULL,
|
71
71
|
[published_at] datetime,
|
72
|
-
[state] text
|
72
|
+
[state] text,
|
73
|
+
[status_confirmed] bit
|
73
74
|
);
|
74
75
|
|
75
76
|
CREATE TABLE notifications (
|
@@ -228,4 +229,4 @@ CREATE TABLE schema_info (
|
|
228
229
|
[version] int
|
229
230
|
);
|
230
231
|
|
231
|
-
insert into schema_info (version) values (
|
232
|
+
insert into schema_info (version) values (50);
|
data/db/schema_version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
50
|
data/lib/spam_protection.rb
CHANGED
@@ -13,7 +13,7 @@ class SpamProtection
|
|
13
13
|
def article_closed?(record)
|
14
14
|
return false if this_blog.sp_article_auto_close.zero? or not record.new_record?
|
15
15
|
|
16
|
-
if record.article.
|
16
|
+
if record.article.published_at.to_i < this_blog.sp_article_auto_close.days.ago.to_i
|
17
17
|
logger.info("[SP] Blocked interaction with #{record.article.title}")
|
18
18
|
return true
|
19
19
|
end
|
data/lib/tasks/release.rake
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'rake/gempackagetask'
|
2
2
|
require 'rake/contrib/rubyforgepublisher'
|
3
3
|
|
4
|
-
PKG_VERSION = "4.0.
|
4
|
+
PKG_VERSION = "4.0.3"
|
5
5
|
PKG_NAME = "typo"
|
6
6
|
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
|
7
7
|
RUBY_FORGE_PROJECT = 'typo'
|
@@ -34,7 +34,7 @@ spec = Gem::Specification.new do |s|
|
|
34
34
|
s.add_dependency("mongrel", ">= 0.3.13.3")
|
35
35
|
s.add_dependency("mongrel_cluster", ">= 0.2.0")
|
36
36
|
s.add_dependency("sqlite3-ruby", ">= 1.1.0")
|
37
|
-
s.add_dependency("rails-app-installer", ">= 0.
|
37
|
+
s.add_dependency("rails-app-installer", ">= 0.2.0")
|
38
38
|
end
|
39
39
|
|
40
40
|
Rake::GemPackageTask.new(spec) do |p|
|
data/lib/typo_version.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
TYPO_VERSION = '4.0.
|
1
|
+
TYPO_VERSION = '4.0.3'
|
data/test/fixtures/contents.yml
CHANGED
@@ -121,6 +121,7 @@ comment3:
|
|
121
121
|
id: 12
|
122
122
|
published: false
|
123
123
|
state: ContentState::PresumedSpam
|
124
|
+
status_confirmed: false
|
124
125
|
article_id: 1
|
125
126
|
author: Foo Bar
|
126
127
|
body: Zzzzzz
|
@@ -136,6 +137,7 @@ trackback1:
|
|
136
137
|
article_id: 2
|
137
138
|
published: false
|
138
139
|
state: ContentState::PresumedSpam
|
140
|
+
status_confirmed: false
|
139
141
|
blog_name: Trackback Blog
|
140
142
|
title: Trackback Entry
|
141
143
|
url: http://www.example.com
|
@@ -318,3 +320,54 @@ xmltest:
|
|
318
320
|
guid: urn:uuid:0d676c66-4135-4a8b-9d65-b6a3248d3032
|
319
321
|
published: true
|
320
322
|
state: ContentState::Published
|
323
|
+
|
324
|
+
spammed_article:
|
325
|
+
type: Article
|
326
|
+
blog_id: 1
|
327
|
+
id: 19
|
328
|
+
title: C'mon Spam Me!
|
329
|
+
body: A bunch of innocuous content
|
330
|
+
body_html: <p>A bunch of innocuous content</p>
|
331
|
+
allow_comments: true
|
332
|
+
allow_pings: true
|
333
|
+
permalink: cmon-spam-me
|
334
|
+
created_at: 2001-01-01
|
335
|
+
updated_at: 2001-01-01
|
336
|
+
published_at: 2001-01-01
|
337
|
+
user_id: 1
|
338
|
+
author: Tobi
|
339
|
+
guid: urn:uuid:0d676c66-4135-4a8b-9d65-b6a3248d3023
|
340
|
+
published: true
|
341
|
+
state: ContentState::Published
|
342
|
+
|
343
|
+
probably_spam_comment:
|
344
|
+
type: Comment
|
345
|
+
blog_id: 1
|
346
|
+
id: 20
|
347
|
+
published: false
|
348
|
+
article_id: 19
|
349
|
+
author: Bob Foo
|
350
|
+
url: http://fakeurl.com
|
351
|
+
body: Test <a href="http://fakeurl.co.uk">body</a>
|
352
|
+
created_at: 2005-01-01 02:00:00
|
353
|
+
updated_at: 2005-01-01 02:00:00
|
354
|
+
published_at: 2005-01-01 02:00:00
|
355
|
+
guid: 12313123123123124
|
356
|
+
state: ContentState::PresumedSpam
|
357
|
+
status_confirmed: false
|
358
|
+
|
359
|
+
definitely_spam_comment:
|
360
|
+
type: Comment
|
361
|
+
blog_id: 1
|
362
|
+
id: 21
|
363
|
+
published: false
|
364
|
+
article_id: 19
|
365
|
+
author: Bob Foo
|
366
|
+
url: http://fakeurl.com
|
367
|
+
body: Test <a href="http://fakeurl.co.uk">body</a>
|
368
|
+
created_at: 2005-01-01 02:00:01
|
369
|
+
updated_at: 2005-01-01 02:00:01
|
370
|
+
published_at: 2005-01-01 02:00:01
|
371
|
+
guid: 12313123123123125
|
372
|
+
state: ContentState::Spam
|
373
|
+
status_confirmed: true
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../test_helper'
|
2
2
|
require 'admin/feedback_controller'
|
3
|
+
require 'comment'
|
4
|
+
require 'trackback'
|
3
5
|
|
4
6
|
# Re-raise errors caught by the controller.
|
5
7
|
class Admin::FeedbackController; def rescue_action(e) raise e end; end
|
@@ -17,8 +19,41 @@ class Admin::FeedbackControllerTest < Test::Unit::TestCase
|
|
17
19
|
|
18
20
|
def test_index
|
19
21
|
get :index
|
20
|
-
|
22
|
+
|
21
23
|
assert_success
|
22
24
|
assert_rendered_file 'list'
|
25
|
+
assert_equal Feedback.count, assigns(:feedback).size
|
23
26
|
end
|
27
|
+
|
28
|
+
def test_list_unconfirmed
|
29
|
+
get :index, :confirmed => 'f'
|
30
|
+
|
31
|
+
assert_success
|
32
|
+
assert_rendered_file 'list'
|
33
|
+
|
34
|
+
assert_equal(Feedback.count(['blog_id = 1 AND status_confirmed = ?', false]),
|
35
|
+
assigns(:feedback).size)
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_list_spam
|
40
|
+
get :index, :published => 'f'
|
41
|
+
|
42
|
+
assert_success
|
43
|
+
assert_rendered_file 'list'
|
44
|
+
|
45
|
+
assert_equal(Feedback.count(['blog_id = 1 AND published = ?', false]),
|
46
|
+
assigns(:feedback).size)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_list_unconfirmed_spam
|
50
|
+
get :index, :published => 'f', :confirmed => 'f'
|
51
|
+
|
52
|
+
assert_success
|
53
|
+
assert_rendered_file 'list'
|
54
|
+
|
55
|
+
assert_equal(Feedback.count(['blog_id = 1 AND published = ? AND status_confirmed = ?', false, false]),
|
56
|
+
assigns(:feedback).size)
|
57
|
+
end
|
58
|
+
|
24
59
|
end
|
@@ -87,7 +87,7 @@ class XmlControllerTest < Test::Unit::TestCase
|
|
87
87
|
assert_xml @response.body
|
88
88
|
assert_feedvalidator @response.body, :todo
|
89
89
|
|
90
|
-
assert_rss20(
|
90
|
+
assert_rss20(7)
|
91
91
|
end
|
92
92
|
|
93
93
|
def test_feed_rss20_comments
|
@@ -145,7 +145,7 @@ class XmlControllerTest < Test::Unit::TestCase
|
|
145
145
|
assert_equal(assigns(:items).sort { |a, b| b.created_at <=> a.created_at },
|
146
146
|
assigns(:items))
|
147
147
|
|
148
|
-
assert_atom10(
|
148
|
+
assert_atom10(7)
|
149
149
|
end
|
150
150
|
|
151
151
|
def test_feed_atom10_comments
|
@@ -338,11 +338,11 @@ class XmlControllerTest < Test::Unit::TestCase
|
|
338
338
|
assert_xml @response.body
|
339
339
|
assert_feedvalidator @response.body, :todo
|
340
340
|
end
|
341
|
-
|
341
|
+
|
342
342
|
# TODO(laird): make this more robust
|
343
343
|
def test_sitemap
|
344
344
|
get :feed, :format => 'googlesitemap', :type => 'sitemap'
|
345
|
-
|
345
|
+
|
346
346
|
assert_response :success
|
347
347
|
assert_xml @response.body
|
348
348
|
end
|
data/test/unit/article_test.rb
CHANGED
@@ -137,7 +137,8 @@ class ArticleTest < Test::Unit::TestCase
|
|
137
137
|
def test_find_published
|
138
138
|
@articles = this_blog.articles.find_published
|
139
139
|
assert_results_are(:search_target, :article1, :article2,
|
140
|
-
:article3, :inactive_article,:xmltest
|
140
|
+
:article3, :inactive_article,:xmltest,
|
141
|
+
:spammed_article)
|
141
142
|
|
142
143
|
@articles = this_blog.articles.find_published(:all,
|
143
144
|
:conditions => "title = 'Article 1!'")
|
data/test/unit/blog_test.rb
CHANGED
@@ -35,7 +35,7 @@ class BlogTest < Test::Unit::TestCase
|
|
35
35
|
assert articles = @blog.find_already_published(:articles)
|
36
36
|
assert_kind_of Array, articles
|
37
37
|
assert articles.all? { |a| a.is_a?(Article) }
|
38
|
-
assert_equal
|
38
|
+
assert_equal 7, articles.size
|
39
39
|
|
40
40
|
assert comments = @blog.find_already_published(:comments)
|
41
41
|
assert_kind_of Array, comments
|
data/test/unit/comment_test.rb
CHANGED
@@ -34,6 +34,7 @@ class CommentTest < Test::Unit::TestCase
|
|
34
34
|
c.ip = "212.42.230.206"
|
35
35
|
end
|
36
36
|
assert cmt.spam?
|
37
|
+
assert !cmt.status_confirmed?
|
37
38
|
end
|
38
39
|
|
39
40
|
def test_not_spam_but_rbl_lookup_succeeds
|
@@ -44,6 +45,7 @@ class CommentTest < Test::Unit::TestCase
|
|
44
45
|
c.ip = "10.10.10.10"
|
45
46
|
end
|
46
47
|
assert !cmt.spam?
|
48
|
+
assert !cmt.status_confirmed?
|
47
49
|
end
|
48
50
|
|
49
51
|
def test_reject_spam_pattern
|
@@ -53,6 +55,7 @@ class CommentTest < Test::Unit::TestCase
|
|
53
55
|
c.url = "http://texas.hold-em.us"
|
54
56
|
end
|
55
57
|
assert cmt.spam?
|
58
|
+
assert !cmt.status_confirmed?
|
56
59
|
end
|
57
60
|
|
58
61
|
def test_reject_spam_uri_limit
|
@@ -64,6 +67,7 @@ class CommentTest < Test::Unit::TestCase
|
|
64
67
|
end
|
65
68
|
|
66
69
|
assert c.spam?
|
70
|
+
assert !c.status_confirmed?
|
67
71
|
end
|
68
72
|
|
69
73
|
def test_reject_article_age
|
@@ -118,9 +122,11 @@ class CommentTest < Test::Unit::TestCase
|
|
118
122
|
assert c.withdraw!
|
119
123
|
assert ! c.published?
|
120
124
|
assert c.spam?
|
125
|
+
assert c.status_confirmed?
|
121
126
|
c.reload
|
122
127
|
assert ! c.published?
|
123
128
|
assert c.spam?
|
129
|
+
assert c.status_confirmed?
|
124
130
|
end
|
125
131
|
|
126
132
|
def test_published
|
@@ -139,4 +145,19 @@ class CommentTest < Test::Unit::TestCase
|
|
139
145
|
a = Article.new(:title => 'foo', :blog_id => 1)
|
140
146
|
assert_equal 0, a.published_comments.size
|
141
147
|
end
|
148
|
+
|
149
|
+
def test_status_confirmed
|
150
|
+
a = contents(:spammed_article)
|
151
|
+
assert !a.comments[0].status_confirmed?
|
152
|
+
assert a.comments[1].status_confirmed?
|
153
|
+
|
154
|
+
a.reload
|
155
|
+
assert_equal 1,
|
156
|
+
a.comments.find_all_by_status_confirmed(true).size
|
157
|
+
assert_equal 1,
|
158
|
+
a.comments.find_all_by_status_confirmed(true).size
|
159
|
+
a.comments[0].withdraw!
|
160
|
+
assert_equal 2,
|
161
|
+
a.comments.find_all_by_status_confirmed(true).size
|
162
|
+
end
|
142
163
|
end
|
data/test/unit/user_test.rb
CHANGED
@@ -10,9 +10,9 @@ class UserTest < Test::Unit::TestCase
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def test_articles_link
|
13
|
-
assert_equal
|
14
|
-
assert_equal
|
15
|
-
assert_equal
|
13
|
+
assert_equal 8, User.find(1).articles.size
|
14
|
+
assert_equal 7, User.find(1).articles.find_published.size
|
15
|
+
assert_equal 7, User.find(1).articles.published.size
|
16
16
|
|
17
17
|
articles = User.find(1).articles.published
|
18
18
|
assert_equal articles.sort_by { |a| a.created_at }.reverse, articles
|
data/vendor/akismet/akismet.rb
CHANGED
@@ -7,9 +7,9 @@
|
|
7
7
|
# Heavily modified for Typo by Scott Laird
|
8
8
|
#
|
9
9
|
class Akismet
|
10
|
-
|
11
10
|
require 'net/http'
|
12
11
|
require 'uri'
|
12
|
+
require 'timeout'
|
13
13
|
|
14
14
|
STANDARD_HEADERS = {
|
15
15
|
'User-Agent' => "Typo/#{TYPO_VERSION} | Akismet Ruby API/1.0",
|
@@ -97,24 +97,33 @@ class Akismet
|
|
97
97
|
#options[:comment_content] = comment_content
|
98
98
|
|
99
99
|
def callAkismet(akismet_function, options = {})
|
100
|
-
|
101
|
-
|
100
|
+
result = false
|
101
|
+
begin
|
102
|
+
Timeout.timeout(5) do
|
103
|
+
http = Net::HTTP.new("#{@apiKey}.rest.akismet.com", 80, @proxyHost, @proxyPort)
|
104
|
+
path = "/1.1/#{akismet_function}"
|
102
105
|
|
103
|
-
|
104
|
-
|
106
|
+
options[:blog] = @blog
|
107
|
+
params=[]
|
105
108
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
+
options.each_key do |key|
|
110
|
+
params.push "#{key}=#{CGI.escape(options[key].to_s)}"
|
111
|
+
end
|
109
112
|
|
110
|
-
|
111
|
-
|
113
|
+
data = params.join('&')
|
114
|
+
resp, data = http.post(path, data, STANDARD_HEADERS)
|
112
115
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
+
unless data == 'true' or data == 'false' or data == ''
|
117
|
+
STDERR.puts "AKISMET error: #{data}"
|
118
|
+
end
|
116
119
|
|
117
|
-
|
120
|
+
result = (data == "true" or data == '')
|
121
|
+
end
|
122
|
+
rescue => err
|
123
|
+
STDERR.puts "AKISMET exception: #{err}"
|
124
|
+
end
|
125
|
+
|
126
|
+
return result
|
118
127
|
end
|
119
128
|
|
120
129
|
protected :callAkismet
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: typo
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 4.0.
|
7
|
-
date: 2006-08-
|
6
|
+
version: 4.0.3
|
7
|
+
date: 2006-08-17 00:00:00 -07:00
|
8
8
|
summary: Modern weblog engine.
|
9
9
|
require_paths:
|
10
10
|
- .
|
@@ -29,7 +29,6 @@ post_install_message:
|
|
29
29
|
authors:
|
30
30
|
- Tobias Luetke
|
31
31
|
files:
|
32
|
-
- .DS_Store
|
33
32
|
- app
|
34
33
|
- bin
|
35
34
|
- components
|
@@ -497,6 +496,7 @@ files:
|
|
497
496
|
- db/migrate/047_add_content_state_field.rb
|
498
497
|
- db/migrate/048_remove_count_caching.rb
|
499
498
|
- db/migrate/049_move_feedback_to_new_state_machine.rb
|
499
|
+
- db/migrate/050_add_status_confirmed_field_to_content.rb
|
500
500
|
- db/scripts/fix_permalinks.rb
|
501
501
|
- db/updates/update.168.to.200.mysql.sql
|
502
502
|
- db/updates/update.168.to.200.psql.sql
|
@@ -1050,5 +1050,5 @@ dependencies:
|
|
1050
1050
|
requirements:
|
1051
1051
|
- - ">="
|
1052
1052
|
- !ruby/object:Gem::Version
|
1053
|
-
version: 0.
|
1053
|
+
version: 0.2.0
|
1054
1054
|
version:
|
data/.DS_Store
DELETED
Binary file
|