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.
Files changed (178) hide show
  1. data/.gems +34 -0
  2. data/.travis.yml +7 -0
  3. data/AUTHORS +5 -0
  4. data/CHANGELOG +14 -0
  5. data/{license.txt → LICENSE} +0 -0
  6. data/MANIFEST +67 -51
  7. data/README.md +18 -25
  8. data/Rakefile +2 -3
  9. data/bin/zen +2 -2
  10. data/lib/zen.rb +93 -57
  11. data/lib/zen/asset.rb +7 -8
  12. data/lib/zen/bin/app.rb +0 -2
  13. data/lib/zen/controller/admin_controller.rb +4 -9
  14. data/lib/zen/controller/base_controller.rb +0 -25
  15. data/lib/zen/controller/main_controller.rb +5 -5
  16. data/lib/zen/controller/preview.rb +50 -0
  17. data/lib/zen/helper/common.rb +4 -68
  18. data/lib/zen/helper/message.rb +82 -0
  19. data/lib/zen/helper/theme.rb +2 -2
  20. data/lib/zen/language.rb +68 -38
  21. data/lib/zen/language/en/zen_general.yml +1 -4
  22. data/lib/zen/language/nl/zen_general.yml +28 -0
  23. data/lib/zen/language/nl/zen_models.yml +13 -0
  24. data/lib/zen/layout/admin.xhtml +1 -1
  25. data/lib/zen/layout/login.xhtml +1 -1
  26. data/lib/zen/model/settings.rb +2 -0
  27. data/lib/zen/package.rb +29 -25
  28. data/lib/zen/package/all.rb +1 -1
  29. data/lib/zen/package/categories/lib/categories/controller/categories.rb +51 -63
  30. data/lib/zen/package/categories/lib/categories/controller/category_groups.rb +45 -52
  31. data/lib/zen/package/categories/lib/categories/language/en/categories.yml +2 -2
  32. data/lib/zen/package/categories/lib/categories/language/nl/categories.yml +39 -0
  33. data/lib/zen/package/categories/lib/categories/language/nl/category_groups.yml +33 -0
  34. data/lib/zen/package/categories/lib/categories/plugin/categories.rb +2 -2
  35. data/lib/zen/package/comments/lib/comments.rb +31 -2
  36. data/lib/zen/package/comments/lib/comments/controller/comments.rb +42 -57
  37. data/lib/zen/package/comments/lib/comments/controller/comments_form.rb +36 -51
  38. data/lib/zen/package/comments/lib/comments/language/en/comments.yml +7 -3
  39. data/lib/zen/package/comments/lib/comments/language/nl/comments.yml +48 -0
  40. data/lib/zen/package/comments/lib/comments/model/comment.rb +45 -4
  41. data/lib/zen/package/comments/lib/comments/plugin/anti_spam.rb +152 -0
  42. data/lib/zen/package/comments/lib/comments/plugin/comments.rb +5 -6
  43. data/lib/zen/package/comments/lib/comments/view/admin/comments/index.xhtml +2 -2
  44. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_field_groups.rb +43 -52
  45. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_fields.rb +68 -67
  46. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_fields.yml +1 -1
  47. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_field_groups.yml +32 -0
  48. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_fields.yml +52 -0
  49. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field.rb +3 -3
  50. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_group.rb +4 -7
  51. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_value.rb +3 -3
  52. data/lib/zen/package/menus/lib/menus/controller/menu_items.rb +37 -44
  53. data/lib/zen/package/menus/lib/menus/controller/menus.rb +33 -43
  54. data/lib/zen/package/menus/lib/menus/helper/menu_item.rb +5 -10
  55. data/lib/zen/package/menus/lib/menus/language/nl/menu_items.yml +41 -0
  56. data/lib/zen/package/menus/lib/menus/language/nl/menus.yml +39 -0
  57. data/lib/zen/package/menus/lib/menus/model/menu.rb +3 -3
  58. data/lib/zen/package/menus/lib/menus/model/menu_item.rb +3 -3
  59. data/lib/zen/package/menus/lib/menus/plugin/menus.rb +5 -6
  60. data/lib/zen/package/menus/migrations/1297184342_create_schema.rb +1 -1
  61. data/lib/zen/package/sections/lib/sections.rb +20 -0
  62. data/lib/zen/package/sections/lib/sections/controller/section_entries.rb +85 -79
  63. data/lib/zen/package/sections/lib/sections/controller/sections.rb +58 -66
  64. data/lib/zen/package/sections/lib/sections/language/en/sections.yml +0 -1
  65. data/lib/zen/package/sections/lib/sections/language/nl/section_entries.yml +43 -0
  66. data/lib/zen/package/sections/lib/sections/language/nl/sections.yml +47 -0
  67. data/lib/zen/package/sections/lib/sections/model/section.rb +11 -15
  68. data/lib/zen/package/sections/lib/sections/model/section_entry.rb +9 -5
  69. data/lib/zen/package/sections/lib/sections/plugin/section_entries.rb +7 -8
  70. data/lib/zen/package/sections/lib/sections/plugin/sections.rb +3 -4
  71. data/lib/zen/package/sections/lib/sections/view/admin/section-entries/form.xhtml +0 -4
  72. data/lib/zen/package/sections/lib/sections/view/admin/section-entries/index.xhtml +8 -2
  73. data/lib/zen/package/sections/migrations/1306772479_remove_unique_slug.rb +28 -0
  74. data/lib/zen/package/settings/lib/settings.rb +21 -34
  75. data/lib/zen/package/settings/lib/settings/controller/settings.rb +29 -22
  76. data/lib/zen/package/settings/lib/settings/language/en/settings.yml +7 -5
  77. data/lib/zen/package/settings/lib/settings/language/nl/settings.yml +39 -0
  78. data/lib/zen/package/settings/lib/settings/model/setting.rb +3 -5
  79. data/lib/zen/package/settings/lib/settings/plugin/group_base.rb +3 -4
  80. data/lib/zen/package/settings/lib/settings/plugin/setting_base.rb +3 -5
  81. data/lib/zen/package/settings/lib/settings/plugin/settings.rb +11 -4
  82. data/lib/zen/package/settings/lib/settings/view/admin/settings/index.xhtml +5 -5
  83. data/lib/zen/package/settings/migrations/1299538742_add_language_key.rb +8 -8
  84. data/lib/zen/package/settings/migrations/1303196915_settings_plugin.rb +2 -5
  85. data/lib/zen/package/users/lib/users/controller/access_rules.rb +54 -61
  86. data/lib/zen/package/users/lib/users/controller/user_groups.rb +49 -57
  87. data/lib/zen/package/users/lib/users/controller/users.rb +58 -73
  88. data/lib/zen/package/users/lib/users/language/en/users.yml +6 -0
  89. data/lib/zen/package/users/lib/users/language/nl/access_rules.yml +37 -0
  90. data/lib/zen/package/users/lib/users/language/nl/user_groups.yml +31 -0
  91. data/lib/zen/package/users/lib/users/language/nl/users.yml +56 -0
  92. data/lib/zen/package/users/lib/users/model/user.rb +16 -1
  93. data/lib/zen/package/users/lib/users/view/admin/users/form.xhtml +27 -2
  94. data/lib/zen/package/users/lib/users/view/admin/users/index.xhtml +15 -3
  95. data/lib/zen/package/users/migrations/1304939855_user_settings.rb +15 -0
  96. data/lib/zen/plugin.rb +7 -9
  97. data/lib/zen/public/admin/css/{buttons.css → zen/buttons.css} +11 -7
  98. data/lib/zen/public/admin/css/{datepicker.css → zen/datepicker.css} +0 -0
  99. data/lib/zen/public/admin/css/{editor.css → zen/editor.css} +10 -5
  100. data/lib/zen/public/admin/css/{forms.css → zen/forms.css} +1 -1
  101. data/lib/zen/public/admin/css/{general.css → zen/general.css} +7 -7
  102. data/lib/zen/public/admin/css/{grid.css → zen/grid.css} +0 -0
  103. data/lib/zen/public/admin/css/{layout.css → zen/layout.css} +4 -5
  104. data/lib/zen/public/admin/css/zen/messages.css +61 -0
  105. data/lib/zen/public/admin/css/{notifications.css → zen/notifications.css} +4 -4
  106. data/lib/zen/public/admin/css/{reset.css → zen/reset.css} +0 -0
  107. data/lib/zen/public/admin/css/{tables.css → zen/tables.css} +3 -3
  108. data/lib/zen/public/admin/css/{tabs.css → zen/tabs.css} +5 -5
  109. data/lib/zen/public/admin/css/zen/window.css +79 -0
  110. data/lib/zen/public/admin/images/{icons → zen/icons}/accept.png +0 -0
  111. data/lib/zen/public/admin/images/{icons → zen/icons}/add.png +0 -0
  112. data/lib/zen/public/admin/images/{icons → zen/icons}/back.png +0 -0
  113. data/lib/zen/public/admin/images/{icons → zen/icons}/bold.png +0 -0
  114. data/lib/zen/public/admin/images/zen/icons/close.png +0 -0
  115. data/lib/zen/public/admin/images/{icons → zen/icons}/delete.png +0 -0
  116. data/lib/zen/public/admin/images/{icons → zen/icons}/edit.png +0 -0
  117. data/lib/zen/public/admin/images/{icons → zen/icons}/error.png +0 -0
  118. data/lib/zen/public/admin/images/{icons → zen/icons}/help.png +0 -0
  119. data/lib/zen/public/admin/images/{icons → zen/icons}/info.png +0 -0
  120. data/lib/zen/public/admin/images/{icons → zen/icons}/italic.png +0 -0
  121. data/lib/zen/public/admin/images/{icons → zen/icons}/large/error.png +0 -0
  122. data/lib/zen/public/admin/images/{icons → zen/icons}/large/notice.png +0 -0
  123. data/lib/zen/public/admin/images/{icons → zen/icons}/large/success.png +0 -0
  124. data/lib/zen/public/admin/images/{icons → zen/icons}/link.png +0 -0
  125. data/lib/zen/public/admin/images/{icons → zen/icons}/logout.png +0 -0
  126. data/lib/zen/public/admin/images/{icons → zen/icons}/ol.png +0 -0
  127. data/lib/zen/public/admin/images/{icons → zen/icons}/pdf.png +0 -0
  128. data/lib/zen/public/admin/images/zen/icons/preview.png +0 -0
  129. data/lib/zen/public/admin/images/{icons → zen/icons}/ul.png +0 -0
  130. data/lib/zen/public/admin/images/{icons → zen/icons}/user.png +0 -0
  131. data/lib/zen/public/admin/images/{icons → zen/icons}/view.png +0 -0
  132. data/lib/zen/public/admin/js/zen/core.js +73 -0
  133. data/lib/zen/public/admin/js/zen/editor.js +527 -0
  134. data/lib/zen/public/admin/js/zen/editor/markdown.js +84 -0
  135. data/lib/zen/public/admin/js/zen/editor/textile.js +84 -0
  136. data/lib/zen/public/admin/js/zen/init.js +12 -66
  137. data/lib/zen/public/admin/js/zen/tabs.js +5 -0
  138. data/lib/zen/public/admin/js/zen/window.js +206 -0
  139. data/lib/zen/task/build.rake +23 -6
  140. data/lib/zen/task/clean.rake +6 -7
  141. data/lib/zen/task/db.rake +7 -9
  142. data/lib/zen/task/package.rake +6 -6
  143. data/lib/zen/task/test.rake +6 -0
  144. data/lib/zen/task/theme.rake +3 -3
  145. data/lib/zen/theme.rb +3 -4
  146. data/lib/zen/validation.rb +7 -9
  147. data/lib/zen/version.rb +3 -4
  148. data/lib/zen/view/bottom.xhtml +0 -5
  149. data/lib/zen/view/main.xhtml +2 -0
  150. data/proto/app/app.rb +6 -4
  151. data/proto/app/config/config.rb +1 -7
  152. data/proto/app/config/database.rb +47 -43
  153. data/proto/app/config/middlewares.rb +0 -40
  154. data/proto/app/start.rb +1 -6
  155. data/proto/app/{vendor → theme}/.gitkeep +0 -0
  156. data/proto/migration.rb +3 -3
  157. data/proto/package/lib/package.rb +0 -1
  158. data/proto/package/lib/package/controller/controllers.rb +7 -40
  159. data/proto/package/lib/package/model/model.rb +3 -3
  160. metadata +106 -79
  161. data/CHANGELOG.md +0 -27
  162. data/ROADMAP.md +0 -53
  163. data/lib/zen/database.rb +0 -112
  164. data/lib/zen/logger.rb +0 -56
  165. data/lib/zen/public/admin/css/modals.css +0 -63
  166. data/lib/zen/public/admin/images/icons/close.png +0 -0
  167. data/lib/zen/public/admin/js/vendor/yepnope.js +0 -1
  168. data/lib/zen/public/admin/js/zen/editor/base.js +0 -262
  169. data/lib/zen/public/admin/js/zen/editor/drivers/html.js +0 -89
  170. data/lib/zen/public/admin/js/zen/editor/drivers/markdown.js +0 -87
  171. data/lib/zen/public/admin/js/zen/editor/drivers/textile.js +0 -87
  172. data/lib/zen/public/admin/js/zen/modal.js +0 -146
  173. data/lib/zen/public/admin/js/zen/notification.js +0 -211
  174. data/proto/app/config/requires.rb +0 -10
  175. data/proto/app/vendor/theme/.gitkeep +0 -0
  176. data/proto/package/lib/package/view/admin/package/edit.xhtml +0 -0
  177. data/proto/package/lib/package/view/admin/package/form.xhtml +0 -0
  178. 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.params.dup
36
- entry = ::Sections::Model::SectionEntry[h(post['section_entry']).to_i]
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
- flash[:error] = lang('comments.errors.invalid_entry')
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
- flash[:error] = lang('comments.errors.comments_not_allowed')
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
- flash[:error] = lang('comments.errors.comments_require_account')
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::Settings[:enable_antispam] == '1'
85
- # Validate the comment
86
- api_key = ::Zen::Settings[:defensio_key]
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 response['allow'] == true and response['spaminess'] <= 0.85
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
- flash[:success] = lang('comments.success.moderate')
108
+ message(:success, lang('comments.success.moderate'))
125
109
  else
126
- flash[:success] = lang('comments.success.new')
110
+ message(:success, lang('comments.success.new'))
127
111
  end
128
- rescue
129
- flash[:error] = lang('comments.errors.new')
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
- defensio_signature : 'Defensio Signature'
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
- validates_presence :email
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
- end
57
- end
58
- end
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