zen 0.2.5 → 0.2.6
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/.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
|