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
@@ -1,60 +1,147 @@
1
- #!/usr/bin/ruby
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+
5
+ gem 'diff-lcs'
6
+
7
+ require 'cgi'
2
8
 
3
9
  require "Wiki2Go/WikiFormatter"
10
+ require "Wiki2Go/HTMLFormatter"
4
11
 
5
12
  require 'Web2Go/ERB_Interpreter'
6
13
  require 'Web2Go/MockRequest'
7
14
 
15
+ require 'diff/lcs'
16
+
8
17
  module Wiki2Go
9
18
 
19
+ class SpamException < RuntimeError
20
+ end
21
+
10
22
  class Wiki
11
23
  def initialize(config)
12
24
  @config = config
13
25
  end
14
-
15
- def view(web)
26
+
27
+ def view(web,version)
28
+ text = load_page_version(web,version)
29
+
30
+ template = @config.storage.load_template(web.name,"view.htm")
31
+
16
32
  html = @config.redirect_to_html?(web)
17
33
  formatter = Wiki2Go::Formatter.new(web,@config.storage,@config,html,@config.editable?(web))
18
-
19
- text = @config.storage.load_page(web.name,web.current_page)
20
- template = @config.storage.load_template(web.name,"view.htm")
21
-
22
- return formatter.format_page_in_template(template,text)
34
+
35
+ result = formatter.format_page_in_template(template,text,version)
36
+ return result
23
37
  end
24
-
38
+
25
39
  def versions(web)
40
+ topics = all_good_versions(web)
41
+ template = @config.storage.load_template(web.name,"versionlist.htm")
42
+
26
43
  html = @config.redirect_to_html?(web)
27
44
  formatter = Wiki2Go::Formatter.new(web,@config.storage,@config,html,@config.editable?(web))
28
-
29
- topics = @config.storage.all_versions_of(web.name,web.current_page)
30
- template = @config.storage.load_template(web.name,"versionlist.htm")
31
-
45
+
32
46
  return formatter.format_pagelist_in_template(template,topics,"","Versions of '#{web.current_page}'")
33
47
  end
34
-
48
+
49
+ def diff(web,version1,version2)
50
+ from,from_page,to,to_page = load_two_versions(web,version1,version2)
51
+
52
+ from_lines = break_on_br(from_page.lines)
53
+ to_lines = break_on_br(to_page.lines)
54
+
55
+ html = @config.redirect_to_html?(web)
56
+ formatter = Wiki2Go::Formatter.new(web,@config.storage,@config,html,@config.editable?(web))
57
+
58
+ header = "<strong>#{to_page.name} "
59
+ header << append_blank(formatter.diff_link(web.name,from_page.filename,'&lt;&lt;',from-1,to))
60
+ header << formatter.view_version_link(web.name,from_page.filename,"v#{from.to_s} (by #{from_page.alias})",from)
61
+ link = formatter.diff_link(web.name,from_page.filename,'&gt;&gt;',from+1,to)
62
+ header << (link.length > 0 ? ' ' + link : '' )
63
+ header << ' => '
64
+ header << append_blank(formatter.diff_link(web.name,from_page.filename,'&lt;&lt;',from,to-1))
65
+ header << formatter.view_version_link(web.name,to_page.filename,"v#{to.to_s} (by #{to_page.alias})",to) + ' '
66
+ header << formatter.diff_link(web.name,from_page.filename,'&gt;&gt;',from,to+1)
67
+ header << "</strong>\n<hr>\n"
68
+
69
+ lines = Array.new
70
+ lines << header
71
+ sdiff = Diff::LCS.sdiff(from_lines,to_lines,nil) do |change|
72
+ case change.action
73
+ when '='
74
+ lines << "<div class=\"diff_kept\">=&nbsp;#{CGI::escapeHTML(change.old_element).gsub(' ','&nbsp;')}</div>"
75
+ when '!'
76
+ lines << "<div class=\"diff_deleted\">&lt;&nbsp;#{CGI::escapeHTML(change.old_element).gsub(' ','&nbsp;')}</div>"
77
+ lines << "<div class=\"diff_added\">&gt;&nbsp;#{CGI::escapeHTML(change.new_element).gsub(' ','&nbsp;')}</div>"
78
+ when '-'
79
+ lines << "<div class=\"diff_deleted\">&lt;&nbsp;#{CGI::escapeHTML(change.old_element).gsub(' ','&nbsp;')}</div>"
80
+ when '+'
81
+ lines << "<div class=\"diff_added\">&gt;&nbsp;#{CGI::escapeHTML(change.new_element).gsub(' ','&nbsp;')}</div>"
82
+ end
83
+ end
84
+
85
+ to_page.lines = lines
86
+ template = @config.storage.load_template(web.name,"view.htm")
87
+
88
+ return formatter.dump_page_in_template(template,to_page,from,to)
89
+ end
90
+
91
+ def sidebyside(web,version1,version2)
92
+
93
+ from,from_page,to,to_page = load_two_versions(web,version1,version2)
94
+
95
+ template = @config.storage.load_template(web.name,"view.htm")
96
+
97
+ html = @config.redirect_to_html?(web)
98
+ formatter = Wiki2Go::Formatter.new(web,@config.storage,@config,html,@config.editable?(web))
99
+
100
+ left = formatter.format_page(from_page.content)
101
+ right = formatter.format_page(to_page.content)
102
+
103
+
104
+ leftheader = append_blank(formatter.sidebyside_link(web.name,from_page.filename,'&lt;&lt;',from-1,to))
105
+ leftheader << formatter.view_version_link(web.name,from_page.filename,"#{to_page.name} v#{from.to_s} (by #{from_page.alias})",from)
106
+ leftheader << formatter.sidebyside_link(web.name,from_page.filename,'&gt;&gt;',from+1,to)
107
+
108
+ rightheader = append_blank(formatter.sidebyside_link(web.name,from_page.filename,'&lt;&lt;',from,to-1))
109
+ rightheader << formatter.view_version_link(web.name,to_page.filename,"#{to_page.name} v#{to.to_s} (by #{to_page.alias})",to) + ' '
110
+ rightheader << formatter.sidebyside_link(web.name,from_page.filename,'&gt;&gt;',from,to+1)
111
+
112
+
113
+ content = "<table class=\"wikitable\" width=\"100%\"><tr>"
114
+ content += "<th>#{leftheader}</th><th>#{rightheader}</th></tr>\n"
115
+ content += "<tr><td width='50%' valign='top'>#{left}</td><td width='50%' valign='top'>#{right}</td></tr></table>"
116
+ to_page.lines = content.split($/)
117
+
118
+
119
+ return formatter.dump_page_in_template(template,to_page,from,to)
120
+ end
121
+
35
122
  def view_dynamic(web)
36
123
  html = false
37
124
  editable = @config.editable?(web)
38
125
  formatter = Wiki2Go::Formatter.new(web,@config.storage,@config,html,editable)
39
-
126
+
40
127
  text = @config.storage.load_page(web.name,web.current_page)
41
128
  template = @config.storage.load_template(web.name,"view.htm")
42
-
129
+
43
130
  return formatter.format_page_in_template(template,text)
44
131
  end
45
-
132
+
46
133
  def view_html(web)
47
134
  html = true
48
135
  editable = @config.editable?(web)
49
136
  web = @config.static_web(web)
50
137
  formatter = Wiki2Go::Formatter.new(web,@config.storage,@config,html,editable)
51
-
138
+
52
139
  text = @config.storage.load_page(web.name,web.current_page)
53
140
  template = @config.storage.load_template(web.name,"view.htm")
54
-
141
+
55
142
  return formatter.format_page_in_template(template,text)
56
143
  end
57
-
144
+
58
145
  def generate_rss(web,changes)
59
146
  html = @config.generate_html
60
147
  editable = false
@@ -64,7 +151,7 @@ module Wiki2Go
64
151
  rss = formatter.generate_rss(template,changes)
65
152
  return rss
66
153
  end
67
-
154
+
68
155
  def generate_rss_from_log(web,errorlog)
69
156
  html = @config.generate_html
70
157
  editable = false
@@ -73,35 +160,40 @@ module Wiki2Go
73
160
  rss = formatter.generate_rss_from_log(errorlog)
74
161
  return rss
75
162
  end
76
-
163
+
77
164
  def edit(web)
78
- html = @config.redirect_to_html?(web)
79
- formatter = Wiki2Go::Formatter.new(web,@config.storage,@config,html,@config.editable?(web))
80
-
81
- text = @config.storage.load_page(web.name,web.current_page)
82
- template = @config.storage.load_template(web.name,"edit.htm")
83
-
84
- return formatter.put_page_in_template(template,text)
165
+ do_edit(web,'edit.htm')
85
166
  end
86
-
87
- def save(web,new_content)
88
- new_content = new_content.join('\r\n') if new_content.kind_of? Array
167
+
168
+ def wikiedit(web)
169
+ do_edit(web,'wikiedit.htm')
170
+ end
171
+
172
+ def save(web,new_content,checksum="")
89
173
  new_content.gsub!(/\t/,' ')
174
+
175
+ blacklist_robots(web,checksum)
176
+
177
+ author = web.user
178
+ pagename = web.name.length > 0 ? "#{web.name}/#{web.current_page}" : web.current_page
90
179
 
91
180
  changed = true
92
181
  newfile = !@config.storage.exists(web.path)
93
182
  newpage = Page.new(web.current_page,new_content,web.user,Time.now,web.title,web.alias)
183
+ current = @config.storage.load_page(web.name,web.current_page)
184
+
94
185
  if !newfile then
95
- current = @config.storage.load_page(web.name,web.current_page)
96
186
  changed = (current.content != newpage.content) || newpage.name != current.name
97
187
  newpage.created_on = current.created_on
98
188
  end
99
-
189
+
100
190
  if changed then
191
+ if !@config.accept_edit?(web,current,checksum) then
192
+ @config.errorlog("Edit by user #{author} of page '#{pagename}' clashes with edit of #{current.alias}")
193
+ end
101
194
  if @config.accept_page?(web,new_content) then
102
195
  @config.save(web,newpage)
103
- changes = @config.storage.read_changes_in(web.name,20)
104
- save_rss(web,changes)
196
+ save_changes_in_rss(web)
105
197
  @config.instant_commit_to_repository
106
198
  if @config.generate_html then
107
199
  if newfile then
@@ -112,13 +204,15 @@ module Wiki2Go
112
204
  end
113
205
  else
114
206
  @config.storage.save_spam(web.name,web.current_page,new_content,web.user)
207
+ raise SpamException
208
+ return web.error_page
115
209
  end
116
210
  end
117
211
  html = @config.redirect_to_html?(web)
118
212
  formatter = Wiki2Go::Formatter.new(web,@config.storage,@config,html,@config.editable?(web))
119
213
  return formatter.absolute_url
120
214
  end
121
-
215
+
122
216
  def upload(web,name,content)
123
217
  if name.empty? || content.nil? then
124
218
  html = @config.redirect_to_html?(web)
@@ -133,32 +227,32 @@ module Wiki2Go
133
227
  return save(web,text)
134
228
  end
135
229
  end
136
-
230
+
137
231
  def changes(web)
138
232
  html = @config.redirect_to_html?(web)
139
233
  formatter = Wiki2Go::Formatter.new(web,@config.storage,@config,html,@config.editable?(web))
140
-
141
- topics = @config.storage.read_changes_in(web.name,20)
234
+
235
+ topics = @config.storage.read_changes_in(web.name,@config.pages_in_recent_changes)
142
236
  template = @config.storage.load_template(web.name,"pagelist.htm")
143
-
237
+
144
238
  return formatter.format_pagelist_in_template(template,topics,"","Recent Changes")
145
239
  end
146
-
240
+
147
241
  def search(web,searchtopic)
148
242
  searchtopic ||= ''
149
243
  html = @config.redirect_to_html?(web)
150
244
  formatter = Wiki2Go::Formatter.new(web,@config.storage,@config,html,@config.editable?(web))
151
-
245
+
152
246
  topics = @config.storage.search(web.name,searchtopic)
153
247
  template = @config.storage.load_template(web.name,"pagelist.htm")
154
-
248
+
155
249
  return formatter.format_pagelist_in_template(template,topics,searchtopic,"Search for '#{searchtopic}'")
156
250
  end
157
-
251
+
158
252
  def remove_spam(web)
159
253
  any_changes = false
160
254
  files = @config.storage.all_pages_in(web.name)
161
- blacklist = @config.storage.load_blacklist
255
+ blacklist = @config.banned_users
162
256
  files.each do |topic|
163
257
  page = @config.storage.load_page(web.name,topic)
164
258
  if blacklist.contains(page.author) then
@@ -167,147 +261,193 @@ module Wiki2Go
167
261
  end
168
262
  end
169
263
  if any_changes then
170
- changes = @config.storage.read_changes_in(web.name,20)
171
- save_rss(web,changes)
264
+ save_changes_in_rss(web)
172
265
  end
173
- return changes(web)
266
+ html = @config.redirect_to_html?(web)
267
+ formatter = Wiki2Go::Formatter.new(web,@config.storage,@config,html,@config.editable?(web))
268
+ return formatter.changes_url
174
269
  end
175
-
270
+
176
271
  def blacklist(user)
177
272
  @config.log("Adding #{user} to blacklist")
178
- list = @config.storage.load_blacklist
273
+ list = @config.banned_users
179
274
  list.add(user)
180
275
  @config.storage.save_list(list)
181
276
  end
182
-
277
+
183
278
  def log(msg)
184
279
  @config.log(msg)
185
280
  end
186
-
281
+
187
282
  def generate_html(web)
188
- report = ["Generating HTML\r\n" , "<ul>"]
283
+ report = ["Generating HTML#{$/}" , "<ul>"]
189
284
  files = @config.storage.all_pages_in(web.name)
190
285
  files.each do |file|
191
- report << "<li>#{file}</li>\r\n"
286
+ report << "<li>#{file}</li>#{$/}"
192
287
  pageweb = @config.static_web(web)
193
288
  pageweb.current_page = file
194
289
  save_html(pageweb)
195
290
  end
196
- changes = @config.storage.read_changes_in(web.name,20)
197
- save_rss(web,changes)
198
- report << "</ul>\r\n"
291
+ save_changes_in_rss(web)
292
+ report << "</ul>#{$/}"
199
293
  return report.join
200
294
  end
201
-
295
+
296
+ def prepare_for_fckeditor(web)
297
+ report = ["Generating HTML#{$/}" , "<ul>"]
298
+ files = @config.storage.all_pages_in(web.name)
299
+ files.each do |file|
300
+ report << "<li>#{file}</li>#{$/}"
301
+ pageweb = @config.static_web(web)
302
+ pageweb.current_page = file
303
+ generate_fckeditor_html(pageweb)
304
+ end
305
+ report << "</ul>#{$/}"
306
+ return report.join
307
+ end
308
+
202
309
  def admin(request)
203
-
310
+
204
311
  old_config = @config.multi_wiki
205
312
  @config.multi_wiki = false
206
313
  wikiweb = Wiki2Go::Web.from_request(request,@config)
207
314
  @config.multi_wiki = old_config
208
-
315
+
209
316
  template_name = wikiweb.current_page
210
317
  if template_name.nil? || template_name.empty?
211
318
  template_name = 'admin'
212
319
  end
213
320
  master = @config.storage.load_template(wikiweb.name,'admin.htm')
214
321
  template = @config.storage.load_template(wikiweb.name,File.join('admin_pages',template_name+'.txt'))
215
-
322
+
216
323
  master = master.gsub(/\$BODY\$/,template)
217
-
324
+
218
325
  erb = Web2Go::ERB_Interpreter.new
219
326
  erb.add_field(:@request,request)
220
327
  erb.add_field(:@config,@config)
221
328
  erb.add_field(:@web,wikiweb)
222
329
  result = erb.execute master,0
223
-
330
+
224
331
  end
225
-
332
+
226
333
  def perform(web,request)
227
-
334
+
228
335
  if @config.allow_dynamic_pages then
229
336
  html = @config.redirect_to_html?(web)
230
337
  formatter = Wiki2Go::Formatter.new(web,@config.storage,@config,html,@config.editable?(web))
231
-
338
+
232
339
  text = @config.storage.load_page(web.name,web.current_page)
233
-
340
+
234
341
  erb = Web2Go::ERB_Interpreter.new
235
342
  erb.add_field(:@config,@config)
236
343
  erb.add_field(:@web,web)
237
344
  erb.add_field(:@request,request)
238
-
239
- script = text.lines.join
345
+ erb.add_field(:@formatter,formatter)
346
+
347
+ script = text.lines.join($/)
240
348
  output = erb.execute(script,1)
241
- text.lines = output.split($/).collect {|line| line + $/ }
242
-
349
+ text.lines = output.split($/)
350
+
243
351
  template = @config.storage.load_template(web.name,"view.htm")
244
-
352
+
245
353
  return formatter.format_page_in_template(template,text)
246
354
  else
247
- view(web)
355
+ log("Perform not allowed")
356
+ self.view(web,-1)
248
357
  end
249
358
  end
250
-
359
+
251
360
  private
252
-
361
+
362
+ def append_blank(str)
363
+ return str.length == 0 ? '' : str + ' '
364
+ end
365
+
366
+ def generate_fckeditor_html(web)
367
+ formatter = Wiki2Go::HTMLFormatter.new(web,@config.storage,@config,true,@config.editable?(web))
368
+ pagename = web.current_page
369
+ @config.storage.backup_page(web.name,web.current_page)
370
+ page = @config.storage.load_page(web.name,web.current_page)
371
+ updated = formatter.format_page(page.content)
372
+ page.lines = updated.split($/)
373
+ @config.storage.save_page(web.name,page)
374
+ end
375
+
376
+ def select(changes,maximum_amount)
377
+ if maximum_amount < changes.length then
378
+ changes[0,maximum_amount]
379
+ else
380
+ changes
381
+ end
382
+ end
383
+
384
+ def save_changes_in_rss(web)
385
+ nb_changes = (@config.pages_in_rss > @config.pages_in_recent_changes ? @config.pages_in_rss : @config.pages_in_recent_changes )
386
+ changes = @config.storage.read_changes_in(web.name,nb_changes)
387
+ save_rss(web,select(changes,@config.pages_in_rss))
388
+ save_changes(web,select(changes,@config.pages_in_recent_changes))
389
+ end
390
+
253
391
  def save_rss(web,changes)
254
392
  static_web = @config.static_web(web)
255
393
  rss = generate_rss(static_web,changes)
256
394
  @config.storage.store_web_file(web.name,"rss.xml",rss)
257
- save_changes(static_web,changes)
258
395
  end
259
-
396
+
260
397
  def save_changes(web,changes)
398
+ web = @config.static_web(web)
261
399
  if @config.generate_html then
262
400
  html = true
263
401
  formatter = Wiki2Go::Formatter.new(web,@config.storage,@config,html,@config.editable?(web))
264
-
402
+
265
403
  template = @config.storage.load_template(web.name,"pagelist.htm")
266
-
404
+
267
405
  content = formatter.format_pagelist_in_template(template,changes,"","Recent Changes")
268
406
  @config.storage.save_html(web.name,'recent_changes',content)
269
407
  end
270
408
  end
271
-
409
+
272
410
  def save_html(web)
273
- if @config.generate_html then
411
+ if @config.generate_html && !Page.is_dynamic?(web.current_page) then
274
412
  static_web = @config.static_web(web)
275
413
  @config.storage.save_html(static_web.name,static_web.current_page, view_html(static_web))
276
414
  end
277
415
  end
278
-
416
+
279
417
  # Optimized method of regenerating only the HTML of pages that are affected by a new page
280
418
  # Search for all pages containing the title of the new page and render those + the new page
281
419
  def generate_html_for_page(web,pagename)
282
420
  files = @config.storage.search(web.name,pagename)
283
421
  files << @config.storage.load_page(web.name,pagename)
284
422
  files.each do |file|
285
- static_web = @config.static_web(web)
286
- static_web.current_page = file.filename
287
- @config.storage.save_html(static_web.name,static_web.current_page, view_html_of_page(static_web,file))
423
+ if !Page.is_dynamic?(file.filename) then
424
+ static_web = @config.static_web(web)
425
+ static_web.current_page = file.filename
426
+ @config.storage.save_html(static_web.name,static_web.current_page, view_html_of_page(static_web,file))
427
+ end
288
428
  end
289
429
  end
290
-
430
+
291
431
  def view_html_of_page(web,text)
292
432
  html = true
293
433
  editable = @config.editable?(web)
294
434
  formatter = Wiki2Go::Formatter.new(web,@config.storage,@config,html,editable)
295
-
435
+
296
436
  template = @config.storage.load_template(web.name,"view.htm")
297
-
437
+
298
438
  return formatter.format_page_in_template(template,text)
299
439
  end
300
-
440
+
301
441
  def view_text(web,text)
302
- html = @config.generate_html && !web.secure
442
+ html = @config.generate_html && !web.secure?
303
443
  formatter = Wiki2Go::Formatter.new(web,@config.storage,@config,html,@config.editable?(web))
304
-
444
+
305
445
  template = @config.storage.load_template(web.name,"view.htm")
306
-
446
+
307
447
  page = Wiki2Go::Page.new("Report",text,"system",Time.now,Time.now,"Report")
308
448
  return formatter.format_page_in_template(template,page)
309
449
  end
310
-
450
+
311
451
  def restore_last_good_version(web,topic,blacklist)
312
452
  versions = @config.storage.all_versions_of(web.name,topic)
313
453
  first_good_version = versions.find do |v|
@@ -325,5 +465,72 @@ module Wiki2Go
325
465
  save_html(thispage)
326
466
  end
327
467
  end
468
+
469
+ def do_edit(web,template)
470
+ html = @config.redirect_to_html?(web)
471
+ formatter = Wiki2Go::Formatter.new(web,@config.storage,@config,html,@config.editable?(web))
472
+
473
+ text,version = load_page_version(web,-1)
474
+
475
+ template = @config.storage.load_template(web.name,template)
476
+
477
+ return formatter.put_page_in_template(template,text)
478
+ end
479
+
480
+ def break_on_br(lines)
481
+ content = lines.join($/)
482
+ content.gsub!(/<br>/i,$/)
483
+ content.gsub!(/<br \/>/i,$/)
484
+ return content.split($/)
485
+ end
486
+
487
+ def load_page_version(web,version)
488
+
489
+ if version == -1 then
490
+ text = @config.storage.load_page(web.name,web.current_page)
491
+ else
492
+ topics = all_good_versions(web)
493
+ topics.reverse!
494
+ text = topics[version] || @config.storage.load_page(web.name,web.current_page)
495
+ end
496
+
497
+ return text
498
+ end
499
+
500
+ def load_two_versions(web,version1,version2)
501
+ from = (version1 < version2 ? version1 : version2)
502
+ to = (version1 < version2 ? version2 : version1)
503
+
504
+ topics = all_good_versions(web)
505
+ topics.reverse!
506
+
507
+ to = topics.length - 1 if to < 0 || to >= topics.length
508
+ from = to > 0 ? to -1 : 0 if from < 0 || from >= topics.length
509
+
510
+ from_page = topics[from] || topics[-2] || @config.storage.load_page(web.name,web.current_page)
511
+ to_page = topics[to] || @config.storage.load_page(web.name,web.current_page)
512
+
513
+ return from,from_page,to,to_page
514
+ end
515
+
516
+ def all_good_versions(web)
517
+ topics = @config.storage.all_versions_of(web.name,web.current_page)
518
+ blacklist = @config.banned_users
519
+ topics = topics.reject { |version| blacklist.contains(version.author) }
520
+
521
+ topics
522
+ end
523
+
524
+ def blacklist_robots(web,checksum)
525
+ if @config.checksum_required && @config.blacklist_when_no_checksum && checksum.length == 0 then
526
+ author = web.user
527
+ pagename = web.name.length > 0 ? "#{web.name}/#{web.current_page}" : web.current_page
528
+
529
+ @config.blacklist_user(author)
530
+ @config.errorlog("Edit by user #{author} of page '#{pagename}' does not have a checksum. Suspected robot blacklisted")
531
+ raise SpamException
532
+ end
533
+ end
534
+
328
535
  end
329
536
  end