zen 0.2.5 → 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
- data/.gems +34 -0
- data/.travis.yml +7 -0
- data/AUTHORS +5 -0
- data/CHANGELOG +14 -0
- data/{license.txt → LICENSE} +0 -0
- data/MANIFEST +67 -51
- data/README.md +18 -25
- data/Rakefile +2 -3
- data/bin/zen +2 -2
- data/lib/zen.rb +93 -57
- data/lib/zen/asset.rb +7 -8
- data/lib/zen/bin/app.rb +0 -2
- data/lib/zen/controller/admin_controller.rb +4 -9
- data/lib/zen/controller/base_controller.rb +0 -25
- data/lib/zen/controller/main_controller.rb +5 -5
- data/lib/zen/controller/preview.rb +50 -0
- data/lib/zen/helper/common.rb +4 -68
- data/lib/zen/helper/message.rb +82 -0
- data/lib/zen/helper/theme.rb +2 -2
- data/lib/zen/language.rb +68 -38
- data/lib/zen/language/en/zen_general.yml +1 -4
- data/lib/zen/language/nl/zen_general.yml +28 -0
- data/lib/zen/language/nl/zen_models.yml +13 -0
- data/lib/zen/layout/admin.xhtml +1 -1
- data/lib/zen/layout/login.xhtml +1 -1
- data/lib/zen/model/settings.rb +2 -0
- data/lib/zen/package.rb +29 -25
- data/lib/zen/package/all.rb +1 -1
- data/lib/zen/package/categories/lib/categories/controller/categories.rb +51 -63
- data/lib/zen/package/categories/lib/categories/controller/category_groups.rb +45 -52
- data/lib/zen/package/categories/lib/categories/language/en/categories.yml +2 -2
- data/lib/zen/package/categories/lib/categories/language/nl/categories.yml +39 -0
- data/lib/zen/package/categories/lib/categories/language/nl/category_groups.yml +33 -0
- data/lib/zen/package/categories/lib/categories/plugin/categories.rb +2 -2
- data/lib/zen/package/comments/lib/comments.rb +31 -2
- data/lib/zen/package/comments/lib/comments/controller/comments.rb +42 -57
- data/lib/zen/package/comments/lib/comments/controller/comments_form.rb +36 -51
- data/lib/zen/package/comments/lib/comments/language/en/comments.yml +7 -3
- data/lib/zen/package/comments/lib/comments/language/nl/comments.yml +48 -0
- data/lib/zen/package/comments/lib/comments/model/comment.rb +45 -4
- data/lib/zen/package/comments/lib/comments/plugin/anti_spam.rb +152 -0
- data/lib/zen/package/comments/lib/comments/plugin/comments.rb +5 -6
- data/lib/zen/package/comments/lib/comments/view/admin/comments/index.xhtml +2 -2
- data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_field_groups.rb +43 -52
- data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_fields.rb +68 -67
- data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_fields.yml +1 -1
- data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_field_groups.yml +32 -0
- data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_fields.yml +52 -0
- data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field.rb +3 -3
- data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_group.rb +4 -7
- data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_value.rb +3 -3
- data/lib/zen/package/menus/lib/menus/controller/menu_items.rb +37 -44
- data/lib/zen/package/menus/lib/menus/controller/menus.rb +33 -43
- data/lib/zen/package/menus/lib/menus/helper/menu_item.rb +5 -10
- data/lib/zen/package/menus/lib/menus/language/nl/menu_items.yml +41 -0
- data/lib/zen/package/menus/lib/menus/language/nl/menus.yml +39 -0
- data/lib/zen/package/menus/lib/menus/model/menu.rb +3 -3
- data/lib/zen/package/menus/lib/menus/model/menu_item.rb +3 -3
- data/lib/zen/package/menus/lib/menus/plugin/menus.rb +5 -6
- data/lib/zen/package/menus/migrations/1297184342_create_schema.rb +1 -1
- data/lib/zen/package/sections/lib/sections.rb +20 -0
- data/lib/zen/package/sections/lib/sections/controller/section_entries.rb +85 -79
- data/lib/zen/package/sections/lib/sections/controller/sections.rb +58 -66
- data/lib/zen/package/sections/lib/sections/language/en/sections.yml +0 -1
- data/lib/zen/package/sections/lib/sections/language/nl/section_entries.yml +43 -0
- data/lib/zen/package/sections/lib/sections/language/nl/sections.yml +47 -0
- data/lib/zen/package/sections/lib/sections/model/section.rb +11 -15
- data/lib/zen/package/sections/lib/sections/model/section_entry.rb +9 -5
- data/lib/zen/package/sections/lib/sections/plugin/section_entries.rb +7 -8
- data/lib/zen/package/sections/lib/sections/plugin/sections.rb +3 -4
- data/lib/zen/package/sections/lib/sections/view/admin/section-entries/form.xhtml +0 -4
- data/lib/zen/package/sections/lib/sections/view/admin/section-entries/index.xhtml +8 -2
- data/lib/zen/package/sections/migrations/1306772479_remove_unique_slug.rb +28 -0
- data/lib/zen/package/settings/lib/settings.rb +21 -34
- data/lib/zen/package/settings/lib/settings/controller/settings.rb +29 -22
- data/lib/zen/package/settings/lib/settings/language/en/settings.yml +7 -5
- data/lib/zen/package/settings/lib/settings/language/nl/settings.yml +39 -0
- data/lib/zen/package/settings/lib/settings/model/setting.rb +3 -5
- data/lib/zen/package/settings/lib/settings/plugin/group_base.rb +3 -4
- data/lib/zen/package/settings/lib/settings/plugin/setting_base.rb +3 -5
- data/lib/zen/package/settings/lib/settings/plugin/settings.rb +11 -4
- data/lib/zen/package/settings/lib/settings/view/admin/settings/index.xhtml +5 -5
- data/lib/zen/package/settings/migrations/1299538742_add_language_key.rb +8 -8
- data/lib/zen/package/settings/migrations/1303196915_settings_plugin.rb +2 -5
- data/lib/zen/package/users/lib/users/controller/access_rules.rb +54 -61
- data/lib/zen/package/users/lib/users/controller/user_groups.rb +49 -57
- data/lib/zen/package/users/lib/users/controller/users.rb +58 -73
- data/lib/zen/package/users/lib/users/language/en/users.yml +6 -0
- data/lib/zen/package/users/lib/users/language/nl/access_rules.yml +37 -0
- data/lib/zen/package/users/lib/users/language/nl/user_groups.yml +31 -0
- data/lib/zen/package/users/lib/users/language/nl/users.yml +56 -0
- data/lib/zen/package/users/lib/users/model/user.rb +16 -1
- data/lib/zen/package/users/lib/users/view/admin/users/form.xhtml +27 -2
- data/lib/zen/package/users/lib/users/view/admin/users/index.xhtml +15 -3
- data/lib/zen/package/users/migrations/1304939855_user_settings.rb +15 -0
- data/lib/zen/plugin.rb +7 -9
- data/lib/zen/public/admin/css/{buttons.css → zen/buttons.css} +11 -7
- data/lib/zen/public/admin/css/{datepicker.css → zen/datepicker.css} +0 -0
- data/lib/zen/public/admin/css/{editor.css → zen/editor.css} +10 -5
- data/lib/zen/public/admin/css/{forms.css → zen/forms.css} +1 -1
- data/lib/zen/public/admin/css/{general.css → zen/general.css} +7 -7
- data/lib/zen/public/admin/css/{grid.css → zen/grid.css} +0 -0
- data/lib/zen/public/admin/css/{layout.css → zen/layout.css} +4 -5
- data/lib/zen/public/admin/css/zen/messages.css +61 -0
- data/lib/zen/public/admin/css/{notifications.css → zen/notifications.css} +4 -4
- data/lib/zen/public/admin/css/{reset.css → zen/reset.css} +0 -0
- data/lib/zen/public/admin/css/{tables.css → zen/tables.css} +3 -3
- data/lib/zen/public/admin/css/{tabs.css → zen/tabs.css} +5 -5
- data/lib/zen/public/admin/css/zen/window.css +79 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/accept.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/add.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/back.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/bold.png +0 -0
- data/lib/zen/public/admin/images/zen/icons/close.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/delete.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/edit.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/error.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/help.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/info.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/italic.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/large/error.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/large/notice.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/large/success.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/link.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/logout.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/ol.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/pdf.png +0 -0
- data/lib/zen/public/admin/images/zen/icons/preview.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/ul.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/user.png +0 -0
- data/lib/zen/public/admin/images/{icons → zen/icons}/view.png +0 -0
- data/lib/zen/public/admin/js/zen/core.js +73 -0
- data/lib/zen/public/admin/js/zen/editor.js +527 -0
- data/lib/zen/public/admin/js/zen/editor/markdown.js +84 -0
- data/lib/zen/public/admin/js/zen/editor/textile.js +84 -0
- data/lib/zen/public/admin/js/zen/init.js +12 -66
- data/lib/zen/public/admin/js/zen/tabs.js +5 -0
- data/lib/zen/public/admin/js/zen/window.js +206 -0
- data/lib/zen/task/build.rake +23 -6
- data/lib/zen/task/clean.rake +6 -7
- data/lib/zen/task/db.rake +7 -9
- data/lib/zen/task/package.rake +6 -6
- data/lib/zen/task/test.rake +6 -0
- data/lib/zen/task/theme.rake +3 -3
- data/lib/zen/theme.rb +3 -4
- data/lib/zen/validation.rb +7 -9
- data/lib/zen/version.rb +3 -4
- data/lib/zen/view/bottom.xhtml +0 -5
- data/lib/zen/view/main.xhtml +2 -0
- data/proto/app/app.rb +6 -4
- data/proto/app/config/config.rb +1 -7
- data/proto/app/config/database.rb +47 -43
- data/proto/app/config/middlewares.rb +0 -40
- data/proto/app/start.rb +1 -6
- data/proto/app/{vendor → theme}/.gitkeep +0 -0
- data/proto/migration.rb +3 -3
- data/proto/package/lib/package.rb +0 -1
- data/proto/package/lib/package/controller/controllers.rb +7 -40
- data/proto/package/lib/package/model/model.rb +3 -3
- metadata +106 -79
- data/CHANGELOG.md +0 -27
- data/ROADMAP.md +0 -53
- data/lib/zen/database.rb +0 -112
- data/lib/zen/logger.rb +0 -56
- data/lib/zen/public/admin/css/modals.css +0 -63
- data/lib/zen/public/admin/images/icons/close.png +0 -0
- data/lib/zen/public/admin/js/vendor/yepnope.js +0 -1
- data/lib/zen/public/admin/js/zen/editor/base.js +0 -262
- data/lib/zen/public/admin/js/zen/editor/drivers/html.js +0 -89
- data/lib/zen/public/admin/js/zen/editor/drivers/markdown.js +0 -87
- data/lib/zen/public/admin/js/zen/editor/drivers/textile.js +0 -87
- data/lib/zen/public/admin/js/zen/modal.js +0 -146
- data/lib/zen/public/admin/js/zen/notification.js +0 -211
- data/proto/app/config/requires.rb +0 -10
- data/proto/app/vendor/theme/.gitkeep +0 -0
- data/proto/package/lib/package/view/admin/package/edit.xhtml +0 -0
- data/proto/package/lib/package/view/admin/package/form.xhtml +0 -0
- data/proto/package/lib/package/view/admin/package/new.xhtml +0 -0
@@ -9,18 +9,18 @@ module Comments
|
|
9
9
|
#
|
10
10
|
# @author Yorick Peterse
|
11
11
|
# @since 0.1
|
12
|
-
#
|
12
|
+
#
|
13
13
|
class CommentsForm < Zen::Controller::FrontendController
|
14
14
|
include ::Comments::Model
|
15
|
-
|
15
|
+
|
16
16
|
map('/comments-form')
|
17
|
-
|
17
|
+
|
18
18
|
before_all do
|
19
19
|
csrf_protection(:save) do
|
20
20
|
respond(lang('zen_general.errors.not_authorized'), 403)
|
21
21
|
end
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
##
|
25
25
|
# Creates a new comment for the section entry. Once the comment has been saved
|
26
26
|
# the user will be redirected back to the previous page.
|
@@ -32,19 +32,22 @@ module Comments
|
|
32
32
|
Zen::Language.load('comments')
|
33
33
|
|
34
34
|
comment = Comment.new
|
35
|
-
post = request.
|
36
|
-
|
37
|
-
|
35
|
+
post = request.subset(
|
36
|
+
:section_entry, :user_id, :comment, :name, :website, :email
|
37
|
+
)
|
38
|
+
|
39
|
+
entry = ::Sections::Model::SectionEntry[post['section_entry']]
|
40
|
+
|
38
41
|
# Remove empty values
|
39
42
|
post.each { |k, v| post.delete(k) if v.empty? }
|
40
|
-
|
43
|
+
|
41
44
|
if post.key?('user_id')
|
42
45
|
comment.user_id = post['user_id']
|
43
46
|
end
|
44
|
-
|
47
|
+
|
45
48
|
# Set the comment data
|
46
49
|
comment.comment = post['comment']
|
47
|
-
|
50
|
+
|
48
51
|
if !post.key?('user_id')
|
49
52
|
['name', 'website', 'email'].each do |k|
|
50
53
|
if post.key?(k)
|
@@ -52,83 +55,65 @@ module Comments
|
|
52
55
|
end
|
53
56
|
end
|
54
57
|
end
|
55
|
-
|
58
|
+
|
56
59
|
comment.section_entry_id = entry.id
|
57
|
-
|
60
|
+
|
58
61
|
# Validate the section entry
|
59
62
|
if entry.nil?
|
60
|
-
|
63
|
+
message(:error, lang('comments.errors.invalid_entry'))
|
61
64
|
redirect_referrer
|
62
65
|
end
|
63
|
-
|
66
|
+
|
64
67
|
section = entry.section
|
65
|
-
|
68
|
+
|
66
69
|
# Comments allowed?
|
67
70
|
if section.comment_allow == false
|
68
|
-
|
71
|
+
message(:error, lang('comments.errors.comments_not_allowed'))
|
69
72
|
redirect_referrer
|
70
73
|
end
|
71
|
-
|
74
|
+
|
72
75
|
# Comments require an account?
|
73
76
|
if section.comment_require_account == true and session[:user].nil?
|
74
|
-
|
77
|
+
message(:error, lang('comments.errors.comments_require_account'))
|
75
78
|
redirect_referrer
|
76
79
|
end
|
77
|
-
|
80
|
+
|
78
81
|
# Require moderation?
|
79
82
|
if section.comment_moderate == true
|
80
83
|
comment.status = 'closed'
|
81
84
|
end
|
82
|
-
|
85
|
+
|
83
86
|
# Require anti-spam validation?
|
84
|
-
if ::Zen
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
if api_key.nil?
|
89
|
-
flash[:error] = lang('comments.errors.no_api_key')
|
90
|
-
redirect_referrer
|
91
|
-
end
|
92
|
-
|
93
|
-
defensio = ::Defensio.new(api_key)
|
94
|
-
status, response = defensio.post_document(
|
95
|
-
:content => post['comment'],
|
96
|
-
:platform => 'zen',
|
97
|
-
:type => 'comment'
|
98
|
-
)
|
99
|
-
|
100
|
-
if status != 200
|
101
|
-
flash[:error] = lang('comments.errors.defensio_status')
|
102
|
-
redirect_referrer
|
103
|
-
end
|
104
|
-
|
87
|
+
if ::Zen.settings[:enable_antispam] == '1'
|
88
|
+
engine = ::Zen.settings[:anti_spam_system].to_sym
|
89
|
+
spam = plugin(:anti_spam, engine, nil, nil, nil, post['comment'])
|
90
|
+
|
105
91
|
# Time to validate the Defensio response
|
106
|
-
if
|
92
|
+
if spam === false
|
107
93
|
if section.comment_moderate == true
|
108
94
|
comment.status = 'closed'
|
109
95
|
else
|
110
96
|
comment.status = 'open'
|
111
97
|
end
|
112
|
-
|
113
|
-
comment.defensio_signature = response['signature']
|
114
98
|
else
|
115
99
|
comment.status = 'spam'
|
116
100
|
end
|
117
101
|
end
|
118
|
-
|
102
|
+
|
119
103
|
# Save the comment
|
120
104
|
begin
|
121
105
|
comment.save
|
122
|
-
|
106
|
+
|
123
107
|
if section.comment_moderate == true
|
124
|
-
|
108
|
+
message(:success, lang('comments.success.moderate'))
|
125
109
|
else
|
126
|
-
|
110
|
+
message(:success, lang('comments.success.new'))
|
127
111
|
end
|
128
|
-
rescue
|
129
|
-
|
112
|
+
rescue => e
|
113
|
+
Ramaze::Log.error(e.inspect)
|
114
|
+
message(:error, lang('comments.errors.new'))
|
130
115
|
end
|
131
|
-
|
116
|
+
|
132
117
|
redirect_referrer
|
133
118
|
end
|
134
119
|
end
|
@@ -13,14 +13,20 @@ labels:
|
|
13
13
|
name : 'Name'
|
14
14
|
created_at : 'Created'
|
15
15
|
updated_at : 'Updated'
|
16
|
-
|
16
|
+
defensio : 'Defensio'
|
17
|
+
anti_spam_system : 'Anti-spam system'
|
17
18
|
open : 'Open'
|
18
19
|
closed : 'Closed'
|
19
20
|
spam : 'Spam'
|
21
|
+
defensio_key : 'Defensio key'
|
20
22
|
|
21
23
|
messages:
|
22
24
|
no_comments: 'No comments have been added yet.'
|
23
25
|
|
26
|
+
placeholders:
|
27
|
+
anti_spam_system : 'The anti-spam system to use for validating comments.'
|
28
|
+
defensio_key : 'The API key for the Defensio anti-spam system.'
|
29
|
+
|
24
30
|
success:
|
25
31
|
new : 'The new comment has been created.'
|
26
32
|
save : 'The comment has been modified.'
|
@@ -34,8 +40,6 @@ errors:
|
|
34
40
|
no_delete : "You haven't specified any comments to delete."
|
35
41
|
invalid_entry : 'The specified section entry is invalid.'
|
36
42
|
comments_not_allowed : "Comments aren't allowed for this section."
|
37
|
-
no_api_key : 'You need to specify an API key for the Defensio system in your settings panel.'
|
38
|
-
defensio_status : 'The comment could not be saved due to a problem with the Defensio server.'
|
39
43
|
|
40
44
|
buttons:
|
41
45
|
delete : 'Delete selected comments'
|
@@ -0,0 +1,48 @@
|
|
1
|
+
---
|
2
|
+
titles:
|
3
|
+
index: 'Reacties'
|
4
|
+
edit : 'Reactie aanpassen'
|
5
|
+
|
6
|
+
labels:
|
7
|
+
id : '#'
|
8
|
+
website : 'Website'
|
9
|
+
entry : 'Sectie artikelen'
|
10
|
+
email : 'Email'
|
11
|
+
status : 'Status'
|
12
|
+
comment : 'Reactie'
|
13
|
+
name : 'Naam'
|
14
|
+
created_at : 'Aangemaakt'
|
15
|
+
updated_at : 'Aangepast'
|
16
|
+
defensio : 'Defensio'
|
17
|
+
anti_spam_system: 'Anti-spam systeem'
|
18
|
+
open : 'Open'
|
19
|
+
closed : 'Gesloten'
|
20
|
+
spam : 'Spam'
|
21
|
+
defensio_key : 'Defensio sleutel'
|
22
|
+
|
23
|
+
messages:
|
24
|
+
no_comments: 'Er zijn nog geen reacties toegevoegd.'
|
25
|
+
|
26
|
+
placeholders:
|
27
|
+
anti_spam_system: 'Het anti-spam systeem dat gebruikt moet worden voor het verifiëren
|
28
|
+
van reacties.'
|
29
|
+
defensio_key: 'De API sleutel voor het Defensio anti-spam systeem.'
|
30
|
+
|
31
|
+
success:
|
32
|
+
new : 'De reactie is aangemaakt.'
|
33
|
+
save : 'De reactie is aangepast.'
|
34
|
+
delete : 'Alle geselecteerde reacties zijn verwijderd.'
|
35
|
+
moderate: 'De reactie moet eerst worden goedgekeurd door een beheerder voordat het kan
|
36
|
+
worden weergegeven'
|
37
|
+
|
38
|
+
errors:
|
39
|
+
new : 'De reactie kon niet worden aangemaakt.'
|
40
|
+
save : 'De reactie kon niet worden aangepast.'
|
41
|
+
delete : 'De reactie met ID #%s kon niet worden verwijderd.'
|
42
|
+
no_delete : 'U moet ten minste 1 reactie specificeren om te verwijderen.'
|
43
|
+
invalid_entry : 'Het gespecificeerde artikel is ongeldig.'
|
44
|
+
comments_not_allowed: 'Reacties zijn niet toegestaan voor deze sectie.'
|
45
|
+
|
46
|
+
buttons:
|
47
|
+
delete: 'Geselecteerde reacties verwijderen'
|
48
|
+
save : 'Reactie opslaan'
|
@@ -31,7 +31,10 @@ module Comments
|
|
31
31
|
#
|
32
32
|
def validate
|
33
33
|
validates_presence :comment
|
34
|
-
|
34
|
+
|
35
|
+
if user_id.nil?
|
36
|
+
validates_presence :email
|
37
|
+
end
|
35
38
|
end
|
36
39
|
|
37
40
|
##
|
@@ -53,6 +56,44 @@ module Comments
|
|
53
56
|
'spam' => lang('comments.labels.spam')
|
54
57
|
}
|
55
58
|
end
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
+
|
60
|
+
##
|
61
|
+
# Hook run before creating a new comment.
|
62
|
+
#
|
63
|
+
# @author Yorick Peterse
|
64
|
+
# @since 0.2.6
|
65
|
+
#
|
66
|
+
def before_create
|
67
|
+
super
|
68
|
+
sanitize
|
69
|
+
end
|
70
|
+
|
71
|
+
##
|
72
|
+
# Hook run before saving an existing comment.
|
73
|
+
#
|
74
|
+
# @author Yorick Peterse
|
75
|
+
# @since 0.2.6
|
76
|
+
#
|
77
|
+
def before_save
|
78
|
+
super
|
79
|
+
sanitize
|
80
|
+
end
|
81
|
+
|
82
|
+
##
|
83
|
+
# Cleans all the input data of nasty stuff.
|
84
|
+
#
|
85
|
+
# @author Yorick Peterse
|
86
|
+
# @since 0.2.6
|
87
|
+
#
|
88
|
+
def sanitize
|
89
|
+
[:name, :website, :email, :comment].each do |field|
|
90
|
+
got = send(field)
|
91
|
+
|
92
|
+
if !got.nil?
|
93
|
+
send("#{field}=", Loofah.fragment(got).scrub!(:whitewash).scrub!(:nofollow).to_s)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end # Comment
|
98
|
+
end # Model
|
99
|
+
end # Comments
|
@@ -0,0 +1,152 @@
|
|
1
|
+
#:nodoc:
|
2
|
+
module Comments
|
3
|
+
#:nodoc:
|
4
|
+
module Plugin
|
5
|
+
##
|
6
|
+
# A plugin that can be used to verify a comment against an external (or internal)
|
7
|
+
# service to see if it's spam or ham.
|
8
|
+
#
|
9
|
+
# ## Usage
|
10
|
+
#
|
11
|
+
# plugin(:anti_spam, engine, author, email, url, comment)
|
12
|
+
#
|
13
|
+
# Note that all variables are required. This is because certain anti-spam systems may
|
14
|
+
# verify the name of the author or the entered Email address besides just the comment.
|
15
|
+
# When using Defensio you're only required to set the comment:
|
16
|
+
#
|
17
|
+
# plugin(:anti_spam, :defensio, nil, nil, nil, 'Hello, this is a comment.')
|
18
|
+
#
|
19
|
+
# ## Supported Systems
|
20
|
+
#
|
21
|
+
# Currently the plugin only supports Defensio, this engine requires the setting
|
22
|
+
# "defensio_key" to contain a valid Defensio API key.
|
23
|
+
#
|
24
|
+
# ## Adding Systems
|
25
|
+
#
|
26
|
+
# Adding a system is done in two steps. First you should update the hash
|
27
|
+
# Comments::PLugin::AntiSpam::Registered so that it includes your system. The keys of
|
28
|
+
# this hash are symbols that match the name of the engine used when calling the
|
29
|
+
# plugin() method. The values are the Gems to require.
|
30
|
+
#
|
31
|
+
# Once this has been done you should add a method to the class
|
32
|
+
# Comments::Plugin::AntiSpam who's name matches the key set in the Registered hash. If
|
33
|
+
# your anti-spam solution is called "cake" then you'd do something like the following:
|
34
|
+
#
|
35
|
+
# Comments::Plugin::AntiSpam::Registered[:cake] = 'cake-gem'
|
36
|
+
#
|
37
|
+
# module Comments
|
38
|
+
# module Plugin
|
39
|
+
# class AntiSpam
|
40
|
+
# def cake
|
41
|
+
#
|
42
|
+
# end
|
43
|
+
# end
|
44
|
+
# end
|
45
|
+
# end
|
46
|
+
#
|
47
|
+
# The return value of the method added should be a boolean, true for spam and false
|
48
|
+
# for ham.
|
49
|
+
#
|
50
|
+
# @author Yorick Peterse
|
51
|
+
# @since 0.2.6
|
52
|
+
#
|
53
|
+
class AntiSpam
|
54
|
+
include ::Zen::Plugin::Helper
|
55
|
+
|
56
|
+
##
|
57
|
+
# Hash containing all the supported anti-spam engines and their Gems to load.
|
58
|
+
#
|
59
|
+
# @author Yorick Peterse
|
60
|
+
# @since 0.2.6
|
61
|
+
#
|
62
|
+
Registered = {
|
63
|
+
:defensio => 'defensio',
|
64
|
+
}
|
65
|
+
|
66
|
+
##
|
67
|
+
# Creates a new instance of the plugin and saves the passed parameters.
|
68
|
+
#
|
69
|
+
# @author Yorick Peterse
|
70
|
+
# @since 0.2.6
|
71
|
+
# @param [Symbol] engine The anti-spam engine to use.
|
72
|
+
# @param [String] author The name of the person that wrote the comment.
|
73
|
+
# @param [String] email The email address of the author.
|
74
|
+
# @param [String] url The website of the author (if any).
|
75
|
+
# @param [String] comment The comment.
|
76
|
+
#
|
77
|
+
def initialize(engine, author, email, url, comment)
|
78
|
+
@engine, @author, @email, @url, @comment = engine, author, email, url, comment
|
79
|
+
|
80
|
+
validate_type(engine, :engine, [Symbol])
|
81
|
+
|
82
|
+
# Load the correct gem
|
83
|
+
if !Registered.key?(@engine) or !respond_to?(@engine)
|
84
|
+
raise(::Zen::PluginError, "The anti-spam engine \"#{@engine}\" is invalid")
|
85
|
+
end
|
86
|
+
|
87
|
+
begin
|
88
|
+
require Registered[@engine]
|
89
|
+
rescue ::LoadError
|
90
|
+
raise(
|
91
|
+
::Zen::PluginError,
|
92
|
+
"You need to install the gem \"#{Registered[@engine]}\" in order to " +
|
93
|
+
"use the anti-spam engine \"#{@engine}\""
|
94
|
+
)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
##
|
99
|
+
# Validates the comment to see if it's spam or ham.
|
100
|
+
#
|
101
|
+
# @author Yorick Peterse
|
102
|
+
# @since 0.2.6
|
103
|
+
# @return [TrueClass/FalseClass]
|
104
|
+
#
|
105
|
+
def call
|
106
|
+
return send(@engine)
|
107
|
+
end
|
108
|
+
|
109
|
+
##
|
110
|
+
# Validates the comment using the Defensio anti-spam system.
|
111
|
+
#
|
112
|
+
# @author Yorick Peterse
|
113
|
+
# @since 0.2.6
|
114
|
+
# @return [TrueClass/FalseClass]
|
115
|
+
#
|
116
|
+
def defensio
|
117
|
+
spam = true
|
118
|
+
|
119
|
+
if !::Zen.settings.key?(:defensio_key)
|
120
|
+
raise(::Zen::PluginError, "The setting \"defensio_key\" is missing")
|
121
|
+
end
|
122
|
+
|
123
|
+
api_key = ::Zen.settings[:defensio_key]
|
124
|
+
|
125
|
+
if api_key.nil? or api_key.empty?
|
126
|
+
raise(
|
127
|
+
::Zen::PluginError,
|
128
|
+
"You need to specify an API key for the defensio system"
|
129
|
+
)
|
130
|
+
end
|
131
|
+
|
132
|
+
client = ::Defensio.new(api_key)
|
133
|
+
status, response = client.post_document(
|
134
|
+
:content => @comment,
|
135
|
+
:platform => 'zen',
|
136
|
+
:type => 'comment'
|
137
|
+
)
|
138
|
+
|
139
|
+
# Not likely to happen but just in case we'll flag the comment as spam
|
140
|
+
return spam if status != 200
|
141
|
+
|
142
|
+
if response['allow'] === true and response['spaminess'] <= 0.85
|
143
|
+
spam = false
|
144
|
+
else
|
145
|
+
spam = true
|
146
|
+
end
|
147
|
+
|
148
|
+
return spam
|
149
|
+
end
|
150
|
+
end # AntiSpam
|
151
|
+
end # Plugin
|
152
|
+
end # Comments
|