Wiki2Go 1.17.5 → 1.22.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/Wiki2Go_firewall_blacklist.rb +8 -0
- data/bin/Wiki2Go_make_cvs_repository.rb +1 -0
- data/bin/Wiki2Go_make_site.rb +1 -2
- data/bin/Wiki2Go_update_site.rb +1 -2
- data/lib/Web2Go/CGIRequest.rb +8 -2
- data/lib/Web2Go/CGIResponse.rb +17 -14
- data/lib/Web2Go/MockRequest.rb +12 -2
- data/lib/Web2Go/MockResponse.rb +10 -7
- data/lib/Web2Go/WebrickRequest.rb +106 -101
- data/lib/Web2Go/WebrickResponse.rb +4 -8
- data/lib/Wiki2Go/BlackList.rb +48 -25
- data/lib/Wiki2Go/DotGraphics.rb +1 -1
- data/lib/Wiki2Go/FileStorage.rb +266 -266
- data/lib/Wiki2Go/HTMLFormatter.rb +28 -0
- data/lib/Wiki2Go/Install/config/chonqed_blacklist.txt +418 -0
- data/lib/Wiki2Go/Install/config/passwords +1 -1
- data/lib/Wiki2Go/Install/config/url_blacklist.txt +3855 -0
- data/lib/Wiki2Go/Install/make_repository.rb +32 -26
- data/lib/Wiki2Go/Install/make_site.rb +197 -111
- data/lib/Wiki2Go/Install/site/error.html +1 -1
- data/lib/Wiki2Go/Install/site/robots.txt +10 -1
- data/lib/Wiki2Go/Install/site/style.css +129 -64
- data/lib/Wiki2Go/Install/templates/admin.htm +1 -1
- data/lib/Wiki2Go/Install/templates/admin_pages/edit.txt +2 -1
- data/lib/Wiki2Go/Install/templates/admin_pages/format_for_fck.txt +31 -0
- data/lib/Wiki2Go/Install/templates/admin_pages/passwords.txt +1 -1
- data/lib/Wiki2Go/Install/templates/edit.htm +62 -46
- data/lib/Wiki2Go/Install/templates/full_footer.htm +31 -33
- data/lib/Wiki2Go/Install/templates/header.htm +0 -1
- data/lib/Wiki2Go/Install/templates/menu.htm +29 -0
- data/lib/Wiki2Go/Install/templates/pagelist.htm +46 -43
- data/lib/Wiki2Go/Install/templates/simple_footer.htm +20 -16
- data/lib/Wiki2Go/Install/templates/versionlist.htm +52 -40
- data/lib/Wiki2Go/Install/templates/view.htm +46 -29
- data/lib/Wiki2Go/Install/templates/wikiedit.htm +63 -0
- data/lib/Wiki2Go/Install/wiki/delete.png +0 -0
- data/lib/Wiki2Go/Install/wiki/style.css +133 -63
- data/lib/Wiki2Go/LineFormatter.rb +345 -197
- data/lib/Wiki2Go/Page.rb +16 -3
- data/lib/Wiki2Go/PrivateWikiConfig.rb +5 -5
- data/lib/Wiki2Go/PublicWikiConfig.rb +83 -37
- data/lib/Wiki2Go/ReadWriteWikiConfig.rb +8 -8
- data/lib/Wiki2Go/Server.rb +6 -1
- data/lib/Wiki2Go/SpamFilter.rb +32 -41
- data/lib/Wiki2Go/Web.rb +10 -3
- data/lib/Wiki2Go/Wiki2Go.rb +301 -94
- data/lib/Wiki2Go/Wiki2GoConfig.rb +87 -6
- data/lib/Wiki2Go/Wiki2GoServlet.rb +66 -12
- data/lib/Wiki2Go/WikiFormatter.rb +60 -30
- data/lib/Wiki2Go/cgi/diff.rb +20 -0
- data/lib/Wiki2Go/cgi/secure/log_rss.rb +21 -0
- data/lib/Wiki2Go/cgi/sidebyside.rb +20 -0
- data/lib/Wiki2Go/cgi/wikiedit.rb +20 -0
- data/lib/Wiki2Go/firewall_blacklist.rb +88 -0
- data/test/All.rb +5 -2
- data/test/TestBlackList.rb +70 -14
- data/test/TestConfig.rb +5 -5
- data/test/TestDiff.rb +95 -0
- data/test/TestFormatter.rb +14 -16
- data/test/TestHTMLFormatter.rb +37 -0
- data/test/TestInstall.rb +70 -27
- data/test/TestLineFormatter.rb +71 -15
- data/test/TestRSS.rb +8 -7
- data/test/TestRepository.rb +50 -0
- data/test/TestServer.rb +3 -8
- data/test/TestSpamFilter.rb +33 -1
- data/test/TestStorage.rb +11 -0
- data/test/TestWeb.rb +2 -2
- data/test/TestWiki2Go.rb +766 -166
- data/test/TestWiki2GoServlet.rb +1122 -524
- data/test/UnitTestFiles.rb +7 -3
- data/test/Wiki2GoConfigForTest.rb +40 -6
- data/test/checksite.rb +17 -50
- data/test/test_firewall_blacklist.rb +131 -0
- data/test/test_page.rb +45 -0
- data/test/testdata/Registration.rbl.txt +7 -0
- data/test/testdata/config/url_blacklist.txt +38822 -0
- data/test/testdata/expected_changes.html +1 -2
- data/test/testdata/expected_edit.html +108 -59
- data/test/testdata/expected_full_rss.xml +2 -2
- data/test/testdata/expected_out.html +97 -61
- data/test/testdata/expected_put.html +88 -53
- data/test/testdata/expected_save.html +88 -52
- data/test/testdata/expected_savehtml.html +88 -52
- data/test/testdata/expected_search.html +68 -53
- data/test/testdata/expected_upload.html +88 -53
- data/test/testdata/expected_versions.html +97 -82
- data/test/testdata/expected_view.html +97 -61
- data/test/testdata/firewall/iptables.config +37 -0
- data/test/testdata/firewall/user_blacklist.txt +162 -0
- data/test/testdata/logs/wiki.log +652 -0
- data/test/testdata/logs/wiki.log.0 +113 -0
- data/test/testdata/logs/wiki.log.1 +113 -0
- data/test/testdata/logs/wiki.log.2 +113 -0
- data/test/testdata/logs/wiki.log.3 +115 -0
- data/test/testdata/logs/wiki.log.4 +5 -0
- data/test/testdata/logs/wiki.log.5 +7 -0
- data/test/testdata/logs/wiki.log.6 +5 -0
- data/test/testdata/logs/wiki.log.7 +118 -0
- data/test/testdata/logs/wiki.log.8 +12 -0
- data/test/testdata/site/html/Xpday/rss.xml +53 -103
- data/test/testdata/texts/Bugs/FrontPage.txt +6 -0
- data/test/testdata/texts/Bugs/NoHidden.spam +17850 -0
- data/test/testdata/texts/Bugs/PairProgrammingParties.spam +102 -0
- data/test/testdata/texts/Bugs/PairProgrammingParties.txt +99 -0
- metadata +53 -7
- data/test/TestMail.rb +0 -29
- data/test/gc.log +0 -2
data/lib/Wiki2Go/BlackList.rb
CHANGED
@@ -2,41 +2,48 @@
|
|
2
2
|
module Wiki2Go
|
3
3
|
|
4
4
|
class BlackList
|
5
|
-
|
5
|
+
|
6
6
|
attr_reader :name
|
7
|
-
|
8
|
-
def initialize(name,items)
|
7
|
+
|
8
|
+
def initialize(name,items,normalize_urls=false)
|
9
9
|
@name = name
|
10
10
|
@banned = []
|
11
11
|
items = items.collect {|line|
|
12
12
|
line.strip!
|
13
|
-
(line.empty? || line[0] == '#' ? nil : line)
|
13
|
+
(line.empty? || line[0] == '#'[0] ? nil : (normalize_urls ? normalize(line) : line ))
|
14
14
|
}
|
15
|
-
@banned = items.compact
|
15
|
+
@banned = items.compact.sort.uniq
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
def all
|
19
19
|
return @banned
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
|
+
def each(&block)
|
23
|
+
@banned.each(&block)
|
24
|
+
end
|
25
|
+
|
22
26
|
def add(item)
|
23
|
-
if item =~ /(:\/\/[^\/:]+)/ then
|
24
|
-
item = $
|
27
|
+
if item =~ /(:\/\/([^\/:]+))/ then
|
28
|
+
item = extract_domain($2)
|
29
|
+
else
|
30
|
+
item = escape_regex(item)
|
31
|
+
end
|
32
|
+
if !item.nil? then
|
33
|
+
@banned << item
|
34
|
+
@banned = @banned.sort.uniq
|
25
35
|
end
|
26
|
-
item = escape_regex(item)
|
27
|
-
@banned << item
|
28
|
-
@banned = @banned.sort.uniq
|
29
36
|
end
|
30
|
-
|
37
|
+
|
31
38
|
def length
|
32
39
|
return @banned.length
|
33
40
|
end
|
34
|
-
|
41
|
+
|
35
42
|
def contains(user)
|
36
43
|
match = @banned.find { |ban| user =~ Regexp.new(ban,Regexp::IGNORECASE) }
|
37
44
|
! match.nil?
|
38
45
|
end
|
39
|
-
|
46
|
+
|
40
47
|
def found_in(lines)
|
41
48
|
lines = lines.join(' ') if lines.kind_of? Array
|
42
49
|
@banned.each do | pattern |
|
@@ -45,21 +52,37 @@ module Wiki2Go
|
|
45
52
|
end
|
46
53
|
return false
|
47
54
|
end
|
48
|
-
|
55
|
+
|
49
56
|
private
|
50
|
-
|
57
|
+
|
51
58
|
def escape_regex(item)
|
52
59
|
item.gsub(/\./,'\.')
|
53
60
|
end
|
54
|
-
|
55
|
-
def
|
56
|
-
|
57
|
-
|
61
|
+
|
62
|
+
def extract_domain(host)
|
63
|
+
parts = host.split('.')
|
64
|
+
if parts.length >= 3 then
|
65
|
+
if parts[-2] == 'co' || parts[-2] == 'ac' then
|
66
|
+
url = "#{parts[-3]}\\.#{parts[-2]}\\.#{parts[-1]}"
|
67
|
+
else
|
68
|
+
url = "#{parts[-2]}\\.#{parts[-1]}"
|
69
|
+
end
|
70
|
+
else
|
71
|
+
return nil if parts.length < 2
|
72
|
+
url = parts.join('\.')
|
58
73
|
end
|
59
|
-
|
60
|
-
|
74
|
+
'https?:\/\/([^\/]*\.)?' + url
|
75
|
+
end
|
76
|
+
|
77
|
+
def normalize(item)
|
78
|
+
item = item.gsub('https?:\/\/([^\/]*\.)?','://').gsub('\.','.')
|
79
|
+
if item =~ /(:\/\/([^\/:]+))/ then
|
80
|
+
item = extract_domain($2)
|
81
|
+
else
|
82
|
+
item = escape_regex(item)
|
83
|
+
end
|
84
|
+
item
|
61
85
|
end
|
62
|
-
|
63
86
|
end
|
64
|
-
|
87
|
+
|
65
88
|
end
|
data/lib/Wiki2Go/DotGraphics.rb
CHANGED
@@ -79,7 +79,7 @@ module Wiki2Go
|
|
79
79
|
|
80
80
|
def write(graph,format,output)
|
81
81
|
command = @path.empty? ? 'dot' : File.join(@path,'dot')
|
82
|
-
cmdline = "#{command} -T#{format} -o#{output}"
|
82
|
+
cmdline = "#{command} -T#{format} -o\"#{output}\""
|
83
83
|
IO.popen(cmdline,"w+") do |f|
|
84
84
|
f.puts graph
|
85
85
|
f.close_write
|
data/lib/Wiki2Go/FileStorage.rb
CHANGED
@@ -9,281 +9,281 @@ require 'fileutils.rb'
|
|
9
9
|
|
10
10
|
module Wiki2Go
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
@cached_templates = Hash.new
|
18
|
-
end
|
19
|
-
|
20
|
-
def exists?(path)
|
21
|
-
return FileTest.exists?(text_path(path,"txt"))
|
22
|
-
end
|
23
|
-
|
24
|
-
alias :exists :exists?
|
25
|
-
|
26
|
-
def load_page(subwiki,name)
|
27
|
-
lines = Array.new(1)
|
28
|
-
lines[0] = ""
|
29
|
-
modified_time = Time.now
|
30
|
-
if exists?(File.join(subwiki,name)) then
|
31
|
-
path = text_filename(subwiki,name,"txt")
|
32
|
-
File.open(path) do |f|
|
33
|
-
lines = f.readlines
|
34
|
-
modified_time = File.mtime(path)
|
12
|
+
class FileStorage
|
13
|
+
|
14
|
+
def initialize(dynamic_files,static_files)
|
15
|
+
@path = dynamic_files
|
16
|
+
@html = static_files
|
35
17
|
end
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
def save_page(subwiki,page)
|
41
|
-
path = text_filename(subwiki,page.filename,"txt")
|
42
|
-
logfile = text_filename(subwiki,page.filename,"log")
|
43
|
-
ensure_directory_exists(path)
|
44
|
-
append_current_text_to_logfile(path,logfile,page.author)
|
45
|
-
File.open(path,File::CREAT|File::TRUNC|File::RDWR) do |file|
|
46
|
-
page.write(file)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def save_spam(subwiki,name,content,author)
|
51
|
-
path = text_filename(subwiki,name,"spam")
|
52
|
-
ensure_directory_exists(path)
|
53
|
-
File.open(path,File::CREAT|File::APPEND|File::WRONLY) do |file|
|
54
|
-
file.puts("=== SPAM by #{author} on #{Time.now.strftime("%d/%m/%Y %H:%M")} ===")
|
55
|
-
file.puts(content)
|
56
|
-
file.puts("$LASTMODIFIED:#{Time.now.to_i}$")
|
57
|
-
file.puts("$AUTHOR:#{author}$")
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def delete_spam(subwiki,page)
|
62
|
-
text = text_filename(subwiki,page.filename,"txt")
|
63
|
-
spam_path = text_filename(subwiki,page.filename,"spam")
|
64
|
-
FileUtils::mv text,spam_path,:force => true
|
65
|
-
end
|
66
|
-
|
67
|
-
def save_html(subwiki,page, content)
|
68
|
-
path = File.join(@html,subwiki,page + ".html")
|
69
|
-
ensure_directory_exists(path)
|
70
|
-
File.open(path,File::CREAT|File::TRUNC|File::RDWR) do |file|
|
71
|
-
file.puts content
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def store_page(subwiki,page)
|
76
|
-
save_page(subwiki,page)
|
77
|
-
end
|
78
|
-
|
79
|
-
def load_template(subwiki,name)
|
80
|
-
path = template_filename(subwiki,name)
|
81
|
-
template = @cached_templates.fetch(path,nil)
|
82
|
-
if template.nil? then
|
83
|
-
template = ""
|
84
|
-
File.open(path) do |f|
|
85
|
-
template = f.gets(nil)
|
18
|
+
|
19
|
+
def exists?(path)
|
20
|
+
return FileTest.exists?(text_path(path,"txt"))
|
86
21
|
end
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
pages = Array.new
|
103
|
-
to_search_for = Regexp.new(phrase,Regexp::IGNORECASE)
|
104
|
-
topics = all_pages_in(subwiki)
|
105
|
-
topics.each do |topic|
|
106
|
-
page = load_page(subwiki,topic)
|
107
|
-
page.lines.each do |line|
|
108
|
-
if line =~ to_search_for then
|
109
|
-
pages << page
|
110
|
-
break
|
111
|
-
end
|
22
|
+
|
23
|
+
alias :exists :exists?
|
24
|
+
|
25
|
+
def load_page(subwiki,name)
|
26
|
+
lines = Array.new(1,"")
|
27
|
+
modified_time = Time.now
|
28
|
+
if exists?(File.join(subwiki,name)) then
|
29
|
+
path = text_filename(subwiki,name,"txt")
|
30
|
+
File.open(path) do |f|
|
31
|
+
lines = f.read
|
32
|
+
lines = lines.split($/)
|
33
|
+
modified_time = File.mtime(path)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
return Page.make_page(name,lines,modified_time)
|
112
37
|
end
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
files = Dir[pattern]
|
122
|
-
dirlen = pattern.length - 8
|
123
|
-
|
124
|
-
files = files.collect {|file| file[dirlen..-5] }
|
125
|
-
return files
|
126
|
-
end
|
127
|
-
|
128
|
-
def wikis
|
129
|
-
textdir = text_directory('')
|
130
|
-
pattern = File.join(textdir,"*")
|
131
|
-
dirs = Dir[pattern]
|
132
|
-
dirs = dirs.find_all { |name|
|
133
|
-
FileTest.directory?(name) && name[0] != '.' && File.basename(name) != 'CVS'
|
134
|
-
}
|
135
|
-
dirs = dirs.collect { |name| File.basename(name) }
|
136
|
-
end
|
137
|
-
|
138
|
-
def read_changes_in(subwiki,max_number)
|
139
|
-
files = all_pages_in(subwiki)
|
140
|
-
nbfiles = (max_number < files.length ? max_number : files.length)
|
141
|
-
|
142
|
-
changed_pages = files.collect { |file| load_page(subwiki,file) }
|
143
|
-
changed_pages.sort! { |a,b| b.lastmodified <=> a.lastmodified }
|
144
|
-
return changed_pages[0..nbfiles-1]
|
145
|
-
end
|
146
|
-
|
147
|
-
def all_versions_of(subwiki,topic)
|
148
|
-
logfile = text_filename(subwiki,topic,"log")
|
149
|
-
versions = Array.new
|
150
|
-
if File.exists?(logfile) then
|
151
|
-
pattern = /^\*\*\* Modified by (.*) \*\*$/
|
152
|
-
lines = Array.new
|
153
|
-
File.open(logfile,"r") do |f|
|
154
|
-
f.each do |line|
|
155
|
-
if line =~ pattern then
|
156
|
-
add_new_version_to(versions,topic,lines,File.mtime(logfile))
|
157
|
-
lines = Array.new
|
158
|
-
else
|
159
|
-
lines << line
|
38
|
+
|
39
|
+
def save_page(subwiki,page)
|
40
|
+
path = text_filename(subwiki,page.filename,"txt")
|
41
|
+
logfile = text_filename(subwiki,page.filename,"log")
|
42
|
+
ensure_directory_exists(path)
|
43
|
+
append_current_text_to_logfile(path,logfile,page.author)
|
44
|
+
File.open(path,File::CREAT|File::TRUNC|File::RDWR) do |file|
|
45
|
+
page.write(file)
|
160
46
|
end
|
161
|
-
end
|
162
47
|
end
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
def load_blacklist(type = 'user')
|
171
|
-
filename = config_filename(type + "_blacklist","txt")
|
172
|
-
banned = Array.new
|
173
|
-
if File.exists?(filename) then
|
174
|
-
File.open(filename,"r") do |f|
|
175
|
-
banned = f.readlines
|
48
|
+
|
49
|
+
def backup_page(subwiki,pagename)
|
50
|
+
text = text_filename(subwiki,pagename,"txt")
|
51
|
+
backup = text_filename(subwiki,pagename,"bak")
|
52
|
+
ensure_directory_exists(text)
|
53
|
+
FileUtils::cp text,backup
|
176
54
|
end
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
55
|
+
|
56
|
+
def save_spam(subwiki,name,content,author)
|
57
|
+
path = text_filename(subwiki,name,"spam")
|
58
|
+
ensure_directory_exists(path)
|
59
|
+
File.open(path,File::CREAT|File::APPEND|File::WRONLY) do |file|
|
60
|
+
file.puts("=== SPAM by #{author} on #{Time.now.strftime("%d/%m/%Y %H:%M")} ===")
|
61
|
+
file.puts(content)
|
62
|
+
file.puts("$LASTMODIFIED:#{Time.now.to_i}$")
|
63
|
+
file.puts("$AUTHOR:#{author}$")
|
64
|
+
end
|
187
65
|
end
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
if File.exists?(filename) then
|
196
|
-
File.open(filename,"r") do |f|
|
197
|
-
listed = f.readlines
|
66
|
+
|
67
|
+
def delete_spam(subwiki,page)
|
68
|
+
text = text_filename(subwiki,page.filename,"txt")
|
69
|
+
spam_path = text_filename(subwiki,page.filename,"spam")
|
70
|
+
FileUtils::mv text,spam_path,:force => true
|
71
|
+
cached = File.join(@html,subwiki,page.filename + ".html")
|
72
|
+
FileUtils::rm cached if File.exists?(cached)
|
198
73
|
end
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
File.open(filename,File::CREAT|File::TRUNC|File::RDWR) do |f|
|
207
|
-
f.puts list.all
|
208
|
-
end
|
209
|
-
end
|
210
|
-
|
211
|
-
def update_chongqed_spamlist(content)
|
212
|
-
filename = config_filename('chonqed_blacklist','txt')
|
213
|
-
ensure_directory_exists(filename)
|
214
|
-
File.open(filename,File::CREAT|File::TRUNC|File::RDWR) do |f|
|
215
|
-
f.puts content
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
private
|
220
|
-
|
221
|
-
def add_new_version_to(versions,topic,lines,modified_time)
|
222
|
-
if !lines.empty? then
|
223
|
-
page = Page.make_page(topic,lines,modified_time)
|
224
|
-
versions << page
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
def append_current_text_to_logfile(file,logfile,author)
|
229
|
-
if File.exists?(file) then
|
230
|
-
File.open(file,"r") do |f|
|
231
|
-
text = f.read
|
232
|
-
File.open(logfile,"a") do |log|
|
233
|
-
log.puts "*** Modified by #{author} **"
|
234
|
-
log.puts text
|
235
|
-
end
|
74
|
+
|
75
|
+
def save_html(subwiki,page, content)
|
76
|
+
path = File.join(@html,subwiki,page + ".html")
|
77
|
+
ensure_directory_exists(path)
|
78
|
+
File.open(path,File::CREAT|File::TRUNC|File::RDWR) do |file|
|
79
|
+
file.puts content
|
80
|
+
end
|
236
81
|
end
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
def ensure_directory_exists(path)
|
241
|
-
dir,filename = File.split(path)
|
242
|
-
FileUtils.mkdir_p(dir,{ :mode => 0775}) unless File.directory?(dir)
|
243
|
-
end
|
244
|
-
|
245
|
-
def text_path(path,ext)
|
246
|
-
dir = File.dirname(path)
|
247
|
-
file = File.basename(path) + '.' + ext
|
248
|
-
File.join(text_directory(dir),file)
|
249
|
-
end
|
250
|
-
|
251
|
-
def text_filename(subwiki,page,ext)
|
252
|
-
return File.join(text_directory(subwiki),"#{page}.#{ext}")
|
253
|
-
end
|
254
|
-
|
255
|
-
def text_directory(subwiki)
|
256
|
-
dir = File.join(@path,"texts",subwiki)
|
257
|
-
ensure_directory_exists(dir)
|
258
|
-
return dir
|
259
|
-
end
|
260
|
-
|
261
|
-
def config_filename(page,ext)
|
262
|
-
return File.join(config_directory,"#{page}.#{ext}")
|
263
|
-
end
|
264
|
-
|
265
|
-
def config_directory
|
266
|
-
dir = File.join(@path,"config")
|
267
|
-
ensure_directory_exists(dir)
|
268
|
-
return dir
|
269
|
-
end
|
270
|
-
|
271
|
-
def template_filename(subwiki,name)
|
272
|
-
template_dir = File.join(@path,"templates")
|
273
|
-
path = File.join(template_dir,subwiki,name)
|
274
|
-
if !File.exists?(path) then
|
275
|
-
path = File.join(template_dir,name)
|
276
|
-
if !File.exists?(path) then
|
277
|
-
path = File.join(File.dirname(__FILE__),"Install","templates",name)
|
82
|
+
|
83
|
+
def store_page(subwiki,page)
|
84
|
+
save_page(subwiki,page)
|
278
85
|
end
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
86
|
+
|
87
|
+
def load_template(subwiki,name)
|
88
|
+
path = template_filename(subwiki,name)
|
89
|
+
template = ""
|
90
|
+
File.open(path) do |f|
|
91
|
+
template = f.gets(nil)
|
92
|
+
end
|
93
|
+
template.gsub!(/\<!--\s*include=(\S*)\s*--\>/i) { load_template(subwiki,$1).rstrip }
|
94
|
+
template
|
95
|
+
end
|
96
|
+
|
97
|
+
def store_web_file(subwiki,page,content)
|
98
|
+
path = static_filename(subwiki,page)
|
99
|
+
ensure_directory_exists(path)
|
100
|
+
File.open(path,"wb") do |f|
|
101
|
+
f.puts content
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def search(subwiki,phrase)
|
106
|
+
pages = Array.new
|
107
|
+
to_search_for = Regexp.new(Regexp.escape(phrase),Regexp::IGNORECASE)
|
108
|
+
topics = all_pages_in(subwiki)
|
109
|
+
topics.each do |topic|
|
110
|
+
page = load_page(subwiki,topic)
|
111
|
+
if page.author =~ to_search_for || page.name =~ to_search_for || page.alias =~ to_search_for then
|
112
|
+
pages << page
|
113
|
+
else
|
114
|
+
page.lines.each do |line|
|
115
|
+
if line =~ to_search_for then
|
116
|
+
pages << page
|
117
|
+
break
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
pages.sort! { |a,b| b.lastmodified <=> a.lastmodified }
|
123
|
+
return pages
|
124
|
+
end
|
125
|
+
|
126
|
+
def all_pages_in(subwiki)
|
127
|
+
textdir = text_directory(subwiki)
|
128
|
+
pattern = File.join(textdir,"**/*.txt")
|
129
|
+
files = Dir[pattern]
|
130
|
+
dirlen = pattern.length - 8
|
131
|
+
|
132
|
+
files = files.collect {|file| file[dirlen..-5] }.sort
|
133
|
+
return files
|
134
|
+
end
|
135
|
+
|
136
|
+
def wikis
|
137
|
+
textdir = text_directory('')
|
138
|
+
pattern = File.join(textdir,"*")
|
139
|
+
dirs = Dir[pattern]
|
140
|
+
dirs = dirs.find_all { |name|
|
141
|
+
FileTest.directory?(name) && name[0] != '.' && File.basename(name) != 'CVS'
|
142
|
+
}
|
143
|
+
dirs = dirs.collect { |name| File.basename(name) }
|
144
|
+
end
|
145
|
+
|
146
|
+
def read_changes_in(subwiki,max_number)
|
147
|
+
files = all_pages_in(subwiki)
|
148
|
+
nbfiles = (max_number < files.length ? max_number : files.length)
|
149
|
+
|
150
|
+
changed_pages = files.collect { |file| load_page(subwiki,file) }
|
151
|
+
changed_pages.sort! { |a,b| b.lastmodified <=> a.lastmodified }
|
152
|
+
return changed_pages[0..nbfiles-1]
|
153
|
+
end
|
154
|
+
|
155
|
+
def all_versions_of(subwiki,topic)
|
156
|
+
logfile = text_filename(subwiki,topic,"log")
|
157
|
+
versions = Array.new
|
158
|
+
if File.exists?(logfile) then
|
159
|
+
pattern = /^\*\*\* Modified by (.*) \*\*$/
|
160
|
+
mtime = File.mtime(logfile)
|
161
|
+
lines = Array.new
|
162
|
+
File.open(logfile,"r") do |f|
|
163
|
+
readlines = f.read
|
164
|
+
readlines = readlines.split($/)
|
165
|
+
readlines.each do |line|
|
166
|
+
if line =~ pattern then
|
167
|
+
add_new_version_to(versions,topic,lines,mtime)
|
168
|
+
lines = Array.new
|
169
|
+
else
|
170
|
+
lines << line#.chomp
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
add_new_version_to(versions,topic,lines,mtime)
|
175
|
+
end
|
176
|
+
|
177
|
+
versions << load_page(subwiki,topic)
|
178
|
+
return versions.reverse
|
179
|
+
end
|
180
|
+
|
181
|
+
def load_blacklist(type = 'user',normalize_urls=false)
|
182
|
+
filename = config_filename(type + "_blacklist","txt")
|
183
|
+
banned = Array.new
|
184
|
+
if File.exists?(filename) then
|
185
|
+
File.open(filename,"r") do |f|
|
186
|
+
banned = f.readlines
|
187
|
+
end
|
188
|
+
end
|
189
|
+
return BlackList.new(filename,banned,normalize_urls)
|
190
|
+
end
|
191
|
+
|
192
|
+
|
193
|
+
def load_greylist
|
194
|
+
filename = config_filename("greylist","txt")
|
195
|
+
listed = Array.new
|
196
|
+
if File.exists?(filename) then
|
197
|
+
File.open(filename,"r") do |f|
|
198
|
+
listed = f.readlines
|
199
|
+
end
|
200
|
+
end
|
201
|
+
return GreyList.new(filename,listed)
|
202
|
+
end
|
203
|
+
|
204
|
+
def save_list(list)
|
205
|
+
filename = list.name
|
206
|
+
ensure_directory_exists(filename)
|
207
|
+
File.open(filename,File::CREAT|File::TRUNC|File::RDWR) do |f|
|
208
|
+
f.puts list.all
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
def update_chongqed_spamlist(content)
|
213
|
+
filename = config_filename('chonqed_blacklist','txt')
|
214
|
+
ensure_directory_exists(filename)
|
215
|
+
File.open(filename,File::CREAT|File::TRUNC|File::RDWR) do |f|
|
216
|
+
f.puts content
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
private
|
221
|
+
|
222
|
+
def add_new_version_to(versions,topic,lines,modified_time)
|
223
|
+
if !lines.empty? then
|
224
|
+
page = Page.make_page(topic,lines,modified_time)
|
225
|
+
versions << page
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
def append_current_text_to_logfile(file,logfile,author)
|
230
|
+
if File.exists?(file) then
|
231
|
+
File.open(file,"r") do |f|
|
232
|
+
text = f.read
|
233
|
+
File.open(logfile,"a") do |log|
|
234
|
+
log.puts "*** Modified by #{author} **"
|
235
|
+
log.puts text
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
def ensure_directory_exists(path)
|
242
|
+
dir,filename = File.split(path)
|
243
|
+
FileUtils.mkdir_p(dir,{ :mode => 0775}) unless File.directory?(dir)
|
244
|
+
end
|
245
|
+
|
246
|
+
def text_path(path,ext)
|
247
|
+
dir = File.dirname(path)
|
248
|
+
file = File.basename(path) + '.' + ext
|
249
|
+
File.join(text_directory(dir),file)
|
250
|
+
end
|
251
|
+
|
252
|
+
def text_filename(subwiki,page,ext)
|
253
|
+
return File.join(text_directory(subwiki),"#{page}.#{ext}")
|
254
|
+
end
|
255
|
+
|
256
|
+
def text_directory(subwiki)
|
257
|
+
dir = File.join(@path,"texts",subwiki)
|
258
|
+
return dir
|
259
|
+
end
|
260
|
+
|
261
|
+
def config_filename(page,ext)
|
262
|
+
return File.join(config_directory,"#{page}.#{ext}")
|
263
|
+
end
|
264
|
+
|
265
|
+
def config_directory
|
266
|
+
dir = File.join(@path,"config")
|
267
|
+
ensure_directory_exists(dir)
|
268
|
+
return dir
|
269
|
+
end
|
270
|
+
|
271
|
+
def template_filename(subwiki,name)
|
272
|
+
template_dir = File.join(@path,"templates")
|
273
|
+
path = File.join(template_dir,subwiki,name)
|
274
|
+
if !File.exists?(path) then
|
275
|
+
path = File.join(template_dir,name)
|
276
|
+
if !File.exists?(path) then
|
277
|
+
path = File.join(File.dirname(__FILE__),"Install","templates",name)
|
278
|
+
end
|
279
|
+
end
|
280
|
+
return path
|
281
|
+
end
|
282
|
+
|
283
|
+
def static_filename(subwiki,name)
|
284
|
+
return File.join(@html,"html",subwiki,name)
|
285
|
+
end
|
286
|
+
|
285
287
|
end
|
286
|
-
|
287
|
-
end
|
288
|
-
|
288
|
+
|
289
289
|
end
|