Wiki2Go 1.17.5 → 1.22.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/bin/Wiki2Go_firewall_blacklist.rb +8 -0
  2. data/bin/Wiki2Go_make_cvs_repository.rb +1 -0
  3. data/bin/Wiki2Go_make_site.rb +1 -2
  4. data/bin/Wiki2Go_update_site.rb +1 -2
  5. data/lib/Web2Go/CGIRequest.rb +8 -2
  6. data/lib/Web2Go/CGIResponse.rb +17 -14
  7. data/lib/Web2Go/MockRequest.rb +12 -2
  8. data/lib/Web2Go/MockResponse.rb +10 -7
  9. data/lib/Web2Go/WebrickRequest.rb +106 -101
  10. data/lib/Web2Go/WebrickResponse.rb +4 -8
  11. data/lib/Wiki2Go/BlackList.rb +48 -25
  12. data/lib/Wiki2Go/DotGraphics.rb +1 -1
  13. data/lib/Wiki2Go/FileStorage.rb +266 -266
  14. data/lib/Wiki2Go/HTMLFormatter.rb +28 -0
  15. data/lib/Wiki2Go/Install/config/chonqed_blacklist.txt +418 -0
  16. data/lib/Wiki2Go/Install/config/passwords +1 -1
  17. data/lib/Wiki2Go/Install/config/url_blacklist.txt +3855 -0
  18. data/lib/Wiki2Go/Install/make_repository.rb +32 -26
  19. data/lib/Wiki2Go/Install/make_site.rb +197 -111
  20. data/lib/Wiki2Go/Install/site/error.html +1 -1
  21. data/lib/Wiki2Go/Install/site/robots.txt +10 -1
  22. data/lib/Wiki2Go/Install/site/style.css +129 -64
  23. data/lib/Wiki2Go/Install/templates/admin.htm +1 -1
  24. data/lib/Wiki2Go/Install/templates/admin_pages/edit.txt +2 -1
  25. data/lib/Wiki2Go/Install/templates/admin_pages/format_for_fck.txt +31 -0
  26. data/lib/Wiki2Go/Install/templates/admin_pages/passwords.txt +1 -1
  27. data/lib/Wiki2Go/Install/templates/edit.htm +62 -46
  28. data/lib/Wiki2Go/Install/templates/full_footer.htm +31 -33
  29. data/lib/Wiki2Go/Install/templates/header.htm +0 -1
  30. data/lib/Wiki2Go/Install/templates/menu.htm +29 -0
  31. data/lib/Wiki2Go/Install/templates/pagelist.htm +46 -43
  32. data/lib/Wiki2Go/Install/templates/simple_footer.htm +20 -16
  33. data/lib/Wiki2Go/Install/templates/versionlist.htm +52 -40
  34. data/lib/Wiki2Go/Install/templates/view.htm +46 -29
  35. data/lib/Wiki2Go/Install/templates/wikiedit.htm +63 -0
  36. data/lib/Wiki2Go/Install/wiki/delete.png +0 -0
  37. data/lib/Wiki2Go/Install/wiki/style.css +133 -63
  38. data/lib/Wiki2Go/LineFormatter.rb +345 -197
  39. data/lib/Wiki2Go/Page.rb +16 -3
  40. data/lib/Wiki2Go/PrivateWikiConfig.rb +5 -5
  41. data/lib/Wiki2Go/PublicWikiConfig.rb +83 -37
  42. data/lib/Wiki2Go/ReadWriteWikiConfig.rb +8 -8
  43. data/lib/Wiki2Go/Server.rb +6 -1
  44. data/lib/Wiki2Go/SpamFilter.rb +32 -41
  45. data/lib/Wiki2Go/Web.rb +10 -3
  46. data/lib/Wiki2Go/Wiki2Go.rb +301 -94
  47. data/lib/Wiki2Go/Wiki2GoConfig.rb +87 -6
  48. data/lib/Wiki2Go/Wiki2GoServlet.rb +66 -12
  49. data/lib/Wiki2Go/WikiFormatter.rb +60 -30
  50. data/lib/Wiki2Go/cgi/diff.rb +20 -0
  51. data/lib/Wiki2Go/cgi/secure/log_rss.rb +21 -0
  52. data/lib/Wiki2Go/cgi/sidebyside.rb +20 -0
  53. data/lib/Wiki2Go/cgi/wikiedit.rb +20 -0
  54. data/lib/Wiki2Go/firewall_blacklist.rb +88 -0
  55. data/test/All.rb +5 -2
  56. data/test/TestBlackList.rb +70 -14
  57. data/test/TestConfig.rb +5 -5
  58. data/test/TestDiff.rb +95 -0
  59. data/test/TestFormatter.rb +14 -16
  60. data/test/TestHTMLFormatter.rb +37 -0
  61. data/test/TestInstall.rb +70 -27
  62. data/test/TestLineFormatter.rb +71 -15
  63. data/test/TestRSS.rb +8 -7
  64. data/test/TestRepository.rb +50 -0
  65. data/test/TestServer.rb +3 -8
  66. data/test/TestSpamFilter.rb +33 -1
  67. data/test/TestStorage.rb +11 -0
  68. data/test/TestWeb.rb +2 -2
  69. data/test/TestWiki2Go.rb +766 -166
  70. data/test/TestWiki2GoServlet.rb +1122 -524
  71. data/test/UnitTestFiles.rb +7 -3
  72. data/test/Wiki2GoConfigForTest.rb +40 -6
  73. data/test/checksite.rb +17 -50
  74. data/test/test_firewall_blacklist.rb +131 -0
  75. data/test/test_page.rb +45 -0
  76. data/test/testdata/Registration.rbl.txt +7 -0
  77. data/test/testdata/config/url_blacklist.txt +38822 -0
  78. data/test/testdata/expected_changes.html +1 -2
  79. data/test/testdata/expected_edit.html +108 -59
  80. data/test/testdata/expected_full_rss.xml +2 -2
  81. data/test/testdata/expected_out.html +97 -61
  82. data/test/testdata/expected_put.html +88 -53
  83. data/test/testdata/expected_save.html +88 -52
  84. data/test/testdata/expected_savehtml.html +88 -52
  85. data/test/testdata/expected_search.html +68 -53
  86. data/test/testdata/expected_upload.html +88 -53
  87. data/test/testdata/expected_versions.html +97 -82
  88. data/test/testdata/expected_view.html +97 -61
  89. data/test/testdata/firewall/iptables.config +37 -0
  90. data/test/testdata/firewall/user_blacklist.txt +162 -0
  91. data/test/testdata/logs/wiki.log +652 -0
  92. data/test/testdata/logs/wiki.log.0 +113 -0
  93. data/test/testdata/logs/wiki.log.1 +113 -0
  94. data/test/testdata/logs/wiki.log.2 +113 -0
  95. data/test/testdata/logs/wiki.log.3 +115 -0
  96. data/test/testdata/logs/wiki.log.4 +5 -0
  97. data/test/testdata/logs/wiki.log.5 +7 -0
  98. data/test/testdata/logs/wiki.log.6 +5 -0
  99. data/test/testdata/logs/wiki.log.7 +118 -0
  100. data/test/testdata/logs/wiki.log.8 +12 -0
  101. data/test/testdata/site/html/Xpday/rss.xml +53 -103
  102. data/test/testdata/texts/Bugs/FrontPage.txt +6 -0
  103. data/test/testdata/texts/Bugs/NoHidden.spam +17850 -0
  104. data/test/testdata/texts/Bugs/PairProgrammingParties.spam +102 -0
  105. data/test/testdata/texts/Bugs/PairProgrammingParties.txt +99 -0
  106. metadata +53 -7
  107. data/test/TestMail.rb +0 -29
  108. data/test/gc.log +0 -2
@@ -2,6 +2,7 @@
2
2
 
3
3
 
4
4
  require "Wiki2Go/FileStorage.rb"
5
+ require "Wiki2Go/Install/make_repository.rb"
5
6
  require 'fileutils'
6
7
  require 'logger'
7
8
 
@@ -18,6 +19,9 @@ module Wiki2Go
18
19
  attr_accessor :root_directory
19
20
  attr_accessor :site_directory
20
21
 
22
+ attr_accessor :user
23
+ attr_accessor :group
24
+
21
25
  attr_accessor :generate_html
22
26
  attr_accessor :debug
23
27
  attr_accessor :multi_wiki
@@ -27,6 +31,16 @@ module Wiki2Go
27
31
  attr_accessor :subsite
28
32
  attr_accessor :blog_style
29
33
  attr_accessor :maximum_urls
34
+ attr_accessor :pages_in_recent_changes
35
+ attr_accessor :pages_in_rss
36
+ attr_accessor :editor
37
+ attr_accessor :delete_spam
38
+ # User must submit a checksum of the original page when saving
39
+ attr_accessor :checksum_required
40
+ # Salt to make checksum unique and unguessable
41
+ attr_accessor :checksum_salt
42
+ # When a document is submitted without a checksum, blacklist the sender (default = false)
43
+ attr_accessor :blacklist_when_no_checksum
30
44
 
31
45
  # directory = base directory of the wiki. Current directory by default
32
46
  def initialize(directory=nil)
@@ -50,8 +64,25 @@ module Wiki2Go
50
64
  @subsite = ''
51
65
  @blog_style = false
52
66
  @maximum_urls = 5
53
-
67
+
68
+ @pages_in_recent_changes = 20
69
+ @pages_in_rss = 20
70
+ @editor = 'wikiedit'
71
+ @delete_spam = false
72
+
73
+ @checksum_required = false
74
+ @checksum_salt = '^$%wiki#§}'
75
+ @blacklist_when_no_checksum = false
76
+
54
77
  @logger = nil
78
+
79
+ @user = nil
80
+ @group = nil
81
+
82
+ @banned_users = nil
83
+ @banned_urls = nil
84
+ @chonqed_urls = nil
85
+ @greylist = nil
55
86
  end
56
87
 
57
88
  # return current Storage object.
@@ -68,6 +99,26 @@ module Wiki2Go
68
99
  @logger
69
100
  end
70
101
 
102
+ def banned_users
103
+ @banned_users ||= storage.load_blacklist('user')
104
+ @banned_users
105
+ end
106
+
107
+ def banned_urls
108
+ @banned_urls ||= storage.load_blacklist('url',true)
109
+ @banned_urls
110
+ end
111
+
112
+ def chonqed_urls
113
+ @chonqed_urls ||= storage.load_blacklist('chonqed')
114
+ @chonqed_urls
115
+ end
116
+
117
+ def greylist
118
+ @greylist ||= storage.load_greylist
119
+ @greylist
120
+ end
121
+
71
122
  # Discard configuration. Closes logger object, if present
72
123
  def close
73
124
  @logger.close unless @logger.nil?
@@ -126,8 +177,38 @@ module Wiki2Go
126
177
  true
127
178
  end
128
179
 
180
+ # Check if we want to accept calls from the user before doing anything
181
+ # web:: a Web object describing the request
182
+ # true by default, subclasses can override
183
+ def accept_user?(web)
184
+ true
185
+ end
186
+
187
+ # Check if the edit is correct (not by a spammer, no editing clash)
188
+ # old_page:: the page as it is on disk
189
+ # checksum:: the checksum submitted with the edit
190
+ def accept_edit?(web,old_page,checksum)
191
+ checksum = checksum.strip
192
+ if @checksum_required then
193
+ check = old_page.checksum(@checksum_salt)
194
+ if check != checksum then
195
+ author = web.user
196
+ pagename = web.name.length > 0 ? "#{web.name}/#{web.current_page}" : web.current_page
197
+
198
+ log("User #{author} gave wrong checksum when editing '#{pagename}': #{checksum} vs #{check}.")
199
+ end
200
+ return check == checksum
201
+ end
202
+ true
203
+ end
204
+
205
+ # Add the spammer IP address to the blacklist
206
+ def blacklist_user(spammer)
207
+
208
+ end
209
+
129
210
  def redirect_to_html?(web)
130
- @generate_html && !web.secure
211
+ @generate_html && !web.secure?
131
212
  end
132
213
 
133
214
  def add_processor(type,proc)
@@ -180,7 +261,7 @@ module Wiki2Go
180
261
  require 'Wiki2Go/Install/make_repository'
181
262
 
182
263
  def update_from_repository
183
- cvs = RepositoryMaker.new(@root,logger)
264
+ cvs = Wiki2Go::RepositoryMaker.new(@root,logger)
184
265
  updated,clashed = cvs.update(@root_directory,@modulename)
185
266
  log("UPDATE: Updated files : #{updated.join(', ')}")
186
267
  log("UPDATE: Clashed files : #{clashed.join(', ')}")
@@ -188,14 +269,14 @@ module Wiki2Go
188
269
  end
189
270
 
190
271
  def commit_to_repository(comment='No Comment')
191
- cvs = RepositoryMaker.new(@root,logger)
272
+ cvs = Wiki2Go::RepositoryMaker.new(@root,logger)
192
273
  report = cvs.add_wiki(@root_directory,@modulename,comment)
193
274
  log("COMMIT: #{report.join}")
194
275
  return report
195
276
  end
196
277
 
197
278
  def instant_commit_to_repository(comment='No Comment')
198
- cvs = RepositoryMaker.new(@root,logger)
279
+ cvs = Wiki2Go::RepositoryMaker.new(@root,logger)
199
280
  if cvs.is_local?(@root_directory,@modulename) then
200
281
  report = cvs.add_wiki(@root_directory,@modulename,comment)
201
282
  log("COMMIT: #{report.join}")
@@ -229,7 +310,7 @@ module Wiki2Go
229
310
  def make_logger
230
311
  dir = File.dirname(logfile)
231
312
  FileUtils::mkdir_p(dir, { :mode => 0775 }) unless File.exists?(dir)
232
- @logger = Logger.new(logfile, 10, 64000)
313
+ @logger = Logger.new(logfile, 10, 256000)
233
314
  @logger.datetime_format = "%Y-%m-%d %H:%M:%S"
234
315
  @logger
235
316
  end
@@ -20,14 +20,17 @@ module Wiki2Go
20
20
  result
21
21
  end
22
22
 
23
- def perform_view(req,res,wikiweb)
23
+ def perform_view(req,res,web)
24
24
  wiki = Wiki2Go::Wiki.new(@config)
25
25
 
26
+ version = -1
27
+ version = web.request.parameter('version',-1).to_i unless web.request.nil?
28
+
26
29
  res.content_type = 'text/html'
27
- if @config.allow_dynamic_pages && wikiweb.current_page =~ /\.rbl$/i then
28
- res.body = wiki.perform(wikiweb,req)
30
+ if @config.allow_dynamic_pages && web.current_page =~ /\.rbl$/i then
31
+ res.body = wiki.perform(web,req)
29
32
  else
30
- res.body = wiki.view(wikiweb)
33
+ res.body = wiki.view(web,version)
31
34
  end
32
35
  true
33
36
  end
@@ -39,15 +42,46 @@ module Wiki2Go
39
42
  res.body = wiki.perform(wikiweb,req)
40
43
  true
41
44
  end
45
+
46
+ def perform_diff(req,res,wikiweb)
47
+ from = -1
48
+ from = wikiweb.request.parameter('from',-1).to_i unless wikiweb.request.nil?
49
+
50
+ to = -1
51
+ to = wikiweb.request.parameter('to',-1).to_i unless wikiweb.request.nil?
52
+
53
+ wiki = Wiki2Go::Wiki.new(@config)
54
+
55
+ res.content_type = 'text/html'
56
+ res.body = wiki.diff(wikiweb,from,to)
57
+ true
58
+ end
42
59
 
60
+ def perform_sidebyside(req,res,wikiweb)
61
+ from = -1
62
+ from = wikiweb.request.parameter('from',-1).to_i unless wikiweb.request.nil?
63
+
64
+ to = -1
65
+ to = wikiweb.request.parameter('to',-1).to_i unless wikiweb.request.nil?
66
+
67
+ wiki = Wiki2Go::Wiki.new(@config)
68
+
69
+ res.content_type = 'text/html'
70
+ res.body = wiki.sidebyside(wikiweb,from,to)
71
+ true
72
+ end
73
+
43
74
  def perform_save(req,res,wikiweb)
44
75
 
76
+ return false if req.request_method != 'POST'
77
+
45
78
  content = req.parameter('text','')
46
79
  name = req.parameter('title',wikiweb.current_page)
47
80
  author = req.parameter('author')
48
81
  remember_me = req.parameter('remember_me')
49
-
50
- if !author.nil? && author.length > 0 then # !wikiweb.secure &&
82
+ checksum = req.parameter('iznorobot','')
83
+
84
+ if !author.nil? && author.length > 0 then # !wikiweb.secure? &&
51
85
  wikiweb.alias = author
52
86
  timeout = Time.now + 7 * 24 * 3600
53
87
  res.add_cookie(USER_COOKIE,author,nil,'/',timeout) unless remember_me.nil?
@@ -57,7 +91,7 @@ module Wiki2Go
57
91
 
58
92
  wikiweb.title = name
59
93
 
60
- redirect_to = wiki.save(wikiweb,content)
94
+ redirect_to = wiki.save(wikiweb,content,checksum)
61
95
  res.redirect_to = redirect_to
62
96
  res.content_type = "text/html"
63
97
  res.body = "Redirect to #{redirect_to}"
@@ -98,6 +132,14 @@ module Wiki2Go
98
132
  true
99
133
  end
100
134
 
135
+ def perform_wikiedit(req,res,wikiweb)
136
+ wiki = Wiki2Go::Wiki.new(@config)
137
+
138
+ res.content_type = "text/html"
139
+ res.body = wiki.wikiedit(wikiweb)
140
+ true
141
+ end
142
+
101
143
  def perform_redirect(req,res,wikiweb)
102
144
  redirect_to = req.parameter('url')
103
145
 
@@ -128,8 +170,11 @@ module Wiki2Go
128
170
  wiki.blacklist(user)
129
171
  end
130
172
 
173
+ redirect_to = wiki.remove_spam(wikiweb)
174
+ res.redirect_to = redirect_to
131
175
  res.content_type = "text/html"
132
- res.body = wiki.remove_spam(wikiweb)
176
+ res.body = "Redirect to #{redirect_to}"
177
+ @config.log("Remove spam done. Redirecting to #{redirect_to}")
133
178
  true
134
179
  end
135
180
 
@@ -175,6 +220,11 @@ module Wiki2Go
175
220
 
176
221
  def execute_command(req,res)
177
222
  wikiweb = Wiki2Go::Web.from_request(req,@config)
223
+ if !@config.accept_user?(wikiweb) then
224
+ res.failed
225
+ return false
226
+ end
227
+
178
228
  command = wikiweb.verb
179
229
  begin
180
230
  if command =~ /^([^\.]+)\./ then
@@ -191,18 +241,19 @@ module Wiki2Go
191
241
  end
192
242
  end
193
243
  end
244
+
194
245
  return false
195
246
  end
196
247
 
197
248
  def perform(method,req,res,wikiweb)
198
- @config.log(">> #{method} #{req.cookies.inspect}")
249
+ @config.log(">> #{method}(#{wikiweb.name},#{wikiweb.current_page}) #{req.cookies.inspect}")
199
250
  start_time = Time.now.to_f
200
251
  begin
201
252
  cookie = req.cookie(USER_COOKIE)
202
-
253
+
203
254
  author = cookie.value.to_s unless cookie.nil?
204
255
 
205
- if !author.nil? && author.length > 0 then # !wikiweb.secure &&
256
+ if !author.nil? && author.length > 0 then # !wikiweb.secure? &&
206
257
  wikiweb.alias = author
207
258
  end
208
259
 
@@ -210,9 +261,12 @@ module Wiki2Go
210
261
  return result
211
262
  rescue WEBrick::HTTPStatus::Redirect => redirect then
212
263
  raise redirect
264
+ rescue Wiki2Go::SpamException then
265
+ res.failed
266
+ return false
213
267
  rescue Exception => e then
214
268
  @config.errorlog("Caught exception in #{method}: #{e.inspect}" + $/ + "Stack: #{$@}")
215
- redirect_url = "#{wikiweb.base_url}error.html"
269
+ redirect_url = wikiweb.error_page
216
270
 
217
271
  res.redirect_to = redirect_url
218
272
  res.body = "redirect to view <a href=\"#{redirect_url}\">view</a><br>"
@@ -17,6 +17,8 @@ module Wiki2Go
17
17
  attr_reader :searchtopic
18
18
  attr_reader :config
19
19
  attr_accessor :title
20
+ attr_reader :from
21
+ attr_reader :to
20
22
 
21
23
  def initialize(config,formatter,text,page,web,pages,searchtopic,title)
22
24
  @config = config
@@ -26,7 +28,19 @@ module Wiki2Go
26
28
  @text = text
27
29
  @pages = pages
28
30
  @searchtopic = searchtopic
29
- @title = title
31
+ @title = title
32
+ @from = -1
33
+ @to = -1
34
+ end
35
+
36
+ def versions(from,to)
37
+ if to > 0 then
38
+ @to = to
39
+ @from = from
40
+ else
41
+ @from = -1
42
+ @to = -1
43
+ end
30
44
  end
31
45
  end
32
46
 
@@ -38,11 +52,12 @@ module Wiki2Go
38
52
 
39
53
  public
40
54
 
41
- def format_page_in_template(template,page)
55
+ def format_page_in_template(template,page,version=-1)
42
56
  formatted_page = format_page(page.content)
43
57
  template = splice_variable_values(template,page,formatted_page)
44
58
  erb = ERB.new(template)
45
59
  context = PageContext.new(@config,self,formatted_page,page,@web,nil,nil,nil)
60
+ context.versions(version-1,version)
46
61
  template = evaluate(erb,context)
47
62
  return template
48
63
  end
@@ -56,7 +71,7 @@ module Wiki2Go
56
71
  end
57
72
 
58
73
  def put_page_in_template(template,page)
59
- formatted_page = page.content.gsub(/&/n, '&amp;').gsub(/\"/n, '&quot;').gsub(/>/n, '&gt;').gsub(/</n, '&lt;')
74
+ formatted_page = CGI::escapeHTML(page.content)
60
75
 
61
76
  template = splice_variable_values(template,page,formatted_page)
62
77
  erb = ERB.new(template)
@@ -65,6 +80,17 @@ module Wiki2Go
65
80
  return template
66
81
  end
67
82
 
83
+ def dump_page_in_template(template,page,from,to)
84
+ formatted_page = page.content
85
+
86
+ template = splice_variable_values(template,page,formatted_page)
87
+ erb = ERB.new(template)
88
+ context = PageContext.new(@config,self,formatted_page,page,@web,nil,nil,nil)
89
+ context.versions(from,to)
90
+ template = evaluate(erb,context)
91
+ return template
92
+ end
93
+
68
94
  def format_page(content)
69
95
  result = format_page_content(content)
70
96
  result += formatting_done
@@ -73,41 +99,45 @@ module Wiki2Go
73
99
 
74
100
 
75
101
  def generate_rss(template,changes)
76
-
77
- # RSS must contain absolute URLs because some feedreaders don't honor the relative
78
- # URLs to the content of the <link> tag
79
- old_absolute_urls = @absolute_urls
80
- @absolute_urls = true
81
-
82
- template_after_items = <<-END_OF_AFTER_ITEMS_XML
102
+
103
+ # RSS must contain absolute URLs because some feedreaders don't honor the relative
104
+ # URLs to the content of the <link> tag
105
+ old_absolute_urls = @absolute_urls
106
+ @absolute_urls = true
107
+
108
+ template_after_items = <<-END_OF_AFTER_ITEMS_XML
83
109
  </channel>
84
110
  </rss>
85
111
  END_OF_AFTER_ITEMS_XML
86
-
87
- items = ""
88
-
89
- changes.each do |page|
90
- items = items + <<-END_OF_ITEMS
112
+
113
+ items = ""
114
+
115
+ changes.each do |page|
116
+ items = items + <<-END_OF_ITEMS
91
117
  <item>
92
118
  <title>#{CGI::escapeHTML(page.name)}</title>
93
119
  <author>#{page.alias}</author>
94
120
  <pubDate>#{@config.blog_style ? page.created_on.strftime("%d %B %Y %H:%M GMT") : page.lastmodified.strftime("%d %B %Y %H:%M GMT")}</pubDate>
95
121
  <link>#{absolute_url_of_topic(page.filename)}</link>
96
- <guid isPermaLink="true">#{@web.name}/#{page.filename}</guid>
97
- <description><![CDATA[#{format_page(page.content).strip}]]></description>
98
- </item>
122
+ <guid isPermaLink="true">#{absolute_url_of_topic(page.filename)}</guid>
99
123
  END_OF_ITEMS
100
- end
101
-
102
- template = template + items + template_after_items
103
-
104
- # We're using hard coded GMT, because %Z returns something strange
105
- time = Time.new.gmtime.strftime("%d %B %Y %H:%M GMT")
106
- template.gsub!(/\$DATE\$/, time)
107
- template = splice_web_values(template)
108
-
109
- @absolute_urls = old_absolute_urls
110
- return template
124
+
125
+ if !Page.is_dynamic?(page.filename) then
126
+ items += "<description><![CDATA[#{format_page(page.content).strip}]]></description>\n"
127
+ end
128
+ items += "</item>\n"
129
+
130
+ end
131
+
132
+ template = template + items + template_after_items
133
+
134
+ # We're using hard coded GMT, because %Z returns something strange
135
+ time = Time.new.gmtime.strftime("%d %B %Y %H:%M GMT")
136
+ template.gsub!(/\$DATE\$/, time)
137
+ template = splice_web_values(template)
138
+
139
+ @absolute_urls = old_absolute_urls
140
+ return template
111
141
  end
112
142
 
113
143
  def generate_rss_from_log(log)
@@ -143,7 +173,7 @@ END_OF_HEADER
143
173
  <link>#{File.join(@web.base_url,'scripts/secure/admin/show_log')}</link>
144
174
  <author>Wiki2Go</author>
145
175
  <pubDate>#{parse_log_date(datetime).strftime("%d %B %Y %H:%M GMT")}</pubDate>
146
- <description><![CDATA[#{message}]]></description>
176
+ <description><![CDATA[#{CGI::escapeHTML(message)}]]></description>
147
177
  </item>
148
178
  END_OF_ITEMS
149
179
  end