zen 0.2.5 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
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