Wiki2Go 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/Wiki2GoServer.rb +11 -0
- data/bin/Wiki2Go_make_site.rb +10 -0
- data/bin/Wiki2Go_make_wiki.rb +10 -0
- data/bin/Wiki2Go_update_site.rb +10 -0
- data/lib/Web2Go/CGIRequest.rb +99 -0
- data/lib/Web2Go/CGIResponse.rb +64 -0
- data/lib/Web2Go/ERB_Interpreter.rb +47 -0
- data/lib/Web2Go/MockCookie.rb +17 -0
- data/lib/Web2Go/MockRequest.rb +131 -0
- data/lib/Web2Go/MockResponse.rb +35 -0
- data/lib/Web2Go/Web2Go.rb +0 -0
- data/lib/Web2Go/WebrickRequest.rb +124 -0
- data/lib/Web2Go/WebrickResponse.rb +50 -0
- data/lib/Wiki2Go.rb +2 -0
- data/lib/Wiki2Go/BlackList.rb +52 -0
- data/lib/Wiki2Go/DotGraphics.rb +69 -0
- data/lib/Wiki2Go/FileStorage.rb +267 -0
- data/lib/Wiki2Go/GreyList.rb +88 -0
- data/lib/Wiki2Go/Install/config/chonqed_blacklist.txt +4743 -0
- data/lib/Wiki2Go/Install/config/passwords +1 -0
- data/lib/Wiki2Go/Install/make_site.rb +515 -0
- data/lib/Wiki2Go/Install/site/error.html +77 -0
- data/lib/Wiki2Go/Install/site/html/admin.css +135 -0
- data/lib/Wiki2Go/Install/site/html/xml.gif +0 -0
- data/lib/Wiki2Go/Install/site/robots.txt +13 -0
- data/lib/Wiki2Go/Install/site/style.css +135 -0
- data/lib/Wiki2Go/Install/templates/admin.htm +48 -0
- data/lib/Wiki2Go/Install/templates/admin_pages/admin.txt +1 -0
- data/lib/Wiki2Go/Install/templates/admin_pages/greylist.txt +72 -0
- data/lib/Wiki2Go/Install/templates/admin_pages/passwords.txt +67 -0
- data/lib/Wiki2Go/Install/templates/admin_pages/regenerate.txt +26 -0
- data/lib/Wiki2Go/Install/templates/admin_pages/removespam.txt +19 -0
- data/lib/Wiki2Go/Install/templates/admin_pages/update.txt +13 -0
- data/lib/Wiki2Go/Install/templates/edit.htm +74 -0
- data/lib/Wiki2Go/Install/templates/pagelist.htm +82 -0
- data/lib/Wiki2Go/Install/templates/rss.xml +11 -0
- data/lib/Wiki2Go/Install/templates/versionlist.htm +84 -0
- data/lib/Wiki2Go/Install/templates/view.htm +72 -0
- data/lib/Wiki2Go/Install/wiki/style.css +135 -0
- data/lib/Wiki2Go/Page.rb +69 -0
- data/lib/Wiki2Go/PrivateWikiConfig.rb +27 -0
- data/lib/Wiki2Go/PublicWikiConfig.rb +52 -0
- data/lib/Wiki2Go/ReadWriteWikiConfig.rb +23 -0
- data/lib/Wiki2Go/Server.rb +94 -0
- data/lib/Wiki2Go/SpamFilter.rb +95 -0
- data/lib/Wiki2Go/UrlFinder.rb +26 -0
- data/lib/Wiki2Go/Web.rb +185 -0
- data/lib/Wiki2Go/WebrickServlet.rb +211 -0
- data/lib/Wiki2Go/WhiteList.rb +29 -0
- data/lib/Wiki2Go/Wiki2Go.rb +274 -0
- data/lib/Wiki2Go/Wiki2GoConfig.rb +144 -0
- data/lib/Wiki2Go/Wiki2GoServlet.rb +197 -0
- data/lib/Wiki2Go/WikiFormatter.rb +597 -0
- data/lib/Wiki2Go/WikiLogFile.rb +43 -0
- data/lib/Wiki2Go/cgi/changes.rb +20 -0
- data/lib/Wiki2Go/cgi/display.rb +20 -0
- data/lib/Wiki2Go/cgi/edit.rb +20 -0
- data/lib/Wiki2Go/cgi/redirect.rb +20 -0
- data/lib/Wiki2Go/cgi/save.rb +20 -0
- data/lib/Wiki2Go/cgi/search.rb +20 -0
- data/lib/Wiki2Go/cgi/secure/admin.rb +20 -0
- data/lib/Wiki2Go/cgi/secure/generate_static.rb +20 -0
- data/lib/Wiki2Go/cgi/secure/removespam.rb +20 -0
- data/lib/Wiki2Go/cgi/upload.rb +20 -0
- data/lib/Wiki2Go/cgi/versions.rb +20 -0
- data/lib/Wiki2Go/cgi/view.rb +20 -0
- metadata +113 -0
@@ -0,0 +1,135 @@
|
|
1
|
+
body
|
2
|
+
{
|
3
|
+
margin-top: 10px;
|
4
|
+
margin-left: 2em ;
|
5
|
+
margin-right: 2em ;
|
6
|
+
font-size: 11pt;
|
7
|
+
color: black;
|
8
|
+
font-family: verdana, helvetica, arial, sans-serif, sans;
|
9
|
+
background-color: #f1f1f1;
|
10
|
+
text-align: justify;
|
11
|
+
}
|
12
|
+
|
13
|
+
ul
|
14
|
+
{
|
15
|
+
margin-left:0.5em;
|
16
|
+
padding-top : 0.5em ;
|
17
|
+
padding-left : 0em ;
|
18
|
+
padding-right : 0em ;
|
19
|
+
padding-bottom : 0.5em ;
|
20
|
+
margin-right:1em
|
21
|
+
}
|
22
|
+
|
23
|
+
li
|
24
|
+
{
|
25
|
+
margin-left:0.5em;
|
26
|
+
margin-right:1em ;
|
27
|
+
padding : 0em 0em 0em 0em ;
|
28
|
+
}
|
29
|
+
|
30
|
+
h1
|
31
|
+
{
|
32
|
+
font-weight: bold;
|
33
|
+
font-size: 28pt;
|
34
|
+
color: black;
|
35
|
+
margin : 0em ;
|
36
|
+
}
|
37
|
+
|
38
|
+
h2,h3,h4,h5,h6
|
39
|
+
{
|
40
|
+
color:black
|
41
|
+
}
|
42
|
+
|
43
|
+
h2,h3.frontpage {
|
44
|
+
text-align: center ;
|
45
|
+
}
|
46
|
+
|
47
|
+
table.Header
|
48
|
+
{
|
49
|
+
padding-right: 0.1em;
|
50
|
+
padding-left: 0.5em;
|
51
|
+
padding-bottom: 0.1em;
|
52
|
+
padding-top: 0em;
|
53
|
+
color: black;
|
54
|
+
background-color: white;
|
55
|
+
text-align: left;
|
56
|
+
border-bottom: 1px solid #ccc;
|
57
|
+
}
|
58
|
+
|
59
|
+
table.Footer
|
60
|
+
{
|
61
|
+
|
62
|
+
clear: both;
|
63
|
+
margin: 100px 0 0 0;
|
64
|
+
padding: 6px;
|
65
|
+
color: #000;
|
66
|
+
background: #fff;
|
67
|
+
border-top: 1px solid #ccc;
|
68
|
+
}
|
69
|
+
|
70
|
+
hr {
|
71
|
+
color: #ccc;
|
72
|
+
}
|
73
|
+
|
74
|
+
table.Body
|
75
|
+
{
|
76
|
+
text-align: left;
|
77
|
+
}
|
78
|
+
|
79
|
+
td[class=search] {
|
80
|
+
text-align: right;
|
81
|
+
}
|
82
|
+
|
83
|
+
a:link
|
84
|
+
{
|
85
|
+
color: #a50a11;
|
86
|
+
font-weight: bolder ;
|
87
|
+
text-decoration: none;
|
88
|
+
}
|
89
|
+
|
90
|
+
a:visited {
|
91
|
+
color: #a50a11;
|
92
|
+
text-decoration: none;
|
93
|
+
font-weight: normal ;
|
94
|
+
}
|
95
|
+
|
96
|
+
a:hover {
|
97
|
+
text-decoration: underline;
|
98
|
+
}
|
99
|
+
|
100
|
+
#container {
|
101
|
+
width: 800px;
|
102
|
+
margin: 0;
|
103
|
+
margin-left: auto;
|
104
|
+
margin-right: auto;
|
105
|
+
margin-bottom: 40px;
|
106
|
+
margin-top: 5px;
|
107
|
+
padding-left: 15px;
|
108
|
+
padding-right: 15px;
|
109
|
+
padding-top: 5px;
|
110
|
+
padding-bottom: 5px;
|
111
|
+
background: #fff;
|
112
|
+
border-left: 1px solid #ccc;
|
113
|
+
border-right: 1px solid #ccc;
|
114
|
+
border-top: 1px solid #ccc;
|
115
|
+
border-bottom: 1px solid #ccc;
|
116
|
+
}
|
117
|
+
|
118
|
+
table.topiclist
|
119
|
+
{
|
120
|
+
width: 100%;
|
121
|
+
}
|
122
|
+
|
123
|
+
table.topiclist tr.date
|
124
|
+
{
|
125
|
+
font-weight: bold;
|
126
|
+
}
|
127
|
+
|
128
|
+
table.topiclist tr.odd
|
129
|
+
{
|
130
|
+
background-color: #ffffcc;
|
131
|
+
}
|
132
|
+
|
133
|
+
table.topiclist tr.even
|
134
|
+
{
|
135
|
+
}
|
data/lib/Wiki2Go/Page.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
module Wiki2Go
|
2
|
+
|
3
|
+
class Page
|
4
|
+
|
5
|
+
attr_reader :title
|
6
|
+
attr_reader :name
|
7
|
+
attr_accessor :author
|
8
|
+
attr_reader :alias
|
9
|
+
attr_reader :lines
|
10
|
+
attr_reader :lastmodified
|
11
|
+
|
12
|
+
def initialize(title,lines, author, time,name,aliasname=nil)
|
13
|
+
@title = title
|
14
|
+
@name = name
|
15
|
+
@lines = lines
|
16
|
+
@author = author
|
17
|
+
@lastmodified = time
|
18
|
+
@alias = aliasname || author
|
19
|
+
end
|
20
|
+
|
21
|
+
def Page.make_page(title, lines,default_time)
|
22
|
+
author = "unknown"
|
23
|
+
lastmodified = default_time
|
24
|
+
name = File.basename(title)
|
25
|
+
|
26
|
+
last = lines.last
|
27
|
+
while !last.nil? and last =~ /\$([^:]+):(.*)\$/ do
|
28
|
+
keyword = $1
|
29
|
+
value = $2
|
30
|
+
case keyword
|
31
|
+
when 'AUTHOR' then author = value
|
32
|
+
when 'LASTMODIFIED' then lastmodified = Time.at(value.to_i)
|
33
|
+
when 'NAME' then name = value
|
34
|
+
when 'ALIAS' then aliasname = value
|
35
|
+
end
|
36
|
+
lines.slice!(-1)
|
37
|
+
last = lines.last
|
38
|
+
end
|
39
|
+
|
40
|
+
return Page.new(title, lines, author, lastmodified,name,aliasname)
|
41
|
+
end
|
42
|
+
|
43
|
+
def Page.make_default(title, lines, author, time)
|
44
|
+
return Page.new(title, lines, author, time,File.basename(title))
|
45
|
+
end
|
46
|
+
|
47
|
+
def write(file)
|
48
|
+
file.puts @lines
|
49
|
+
file.puts "$ALIAS:#{@alias}$" unless @alias.nil?
|
50
|
+
file.puts "$NAME:#{@name}$"
|
51
|
+
file.puts "$LASTMODIFIED:#{@lastmodified.to_i}$"
|
52
|
+
file.puts "$AUTHOR:#{@author}$"
|
53
|
+
end
|
54
|
+
|
55
|
+
def length
|
56
|
+
return @lines.length
|
57
|
+
end
|
58
|
+
|
59
|
+
def content
|
60
|
+
return @lines.join
|
61
|
+
end
|
62
|
+
|
63
|
+
def set_modified(author,date)
|
64
|
+
@author = author
|
65
|
+
@lastmodified = date
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require "Wiki2Go/FileStorage.rb"
|
4
|
+
require "Wiki2Go/Wiki2GoConfig.rb"
|
5
|
+
|
6
|
+
class PrivateWikiConfig < Wiki2Go::Config
|
7
|
+
|
8
|
+
def initialize(directory)
|
9
|
+
super(directory)
|
10
|
+
@generate_html = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def editable?(web)
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
def redirect_url?(web,url)
|
18
|
+
false
|
19
|
+
end
|
20
|
+
|
21
|
+
def redirect_to_html?(web)
|
22
|
+
@generate_html
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require "Wiki2Go/FileStorage.rb"
|
4
|
+
require "Wiki2Go/Wiki2GoConfig.rb"
|
5
|
+
|
6
|
+
require 'Wiki2Go/SpamFilter'
|
7
|
+
|
8
|
+
class PublicWikiConfig < Wiki2Go::Config
|
9
|
+
|
10
|
+
def initialize(directory)
|
11
|
+
super(directory)
|
12
|
+
@generate_html = true
|
13
|
+
end
|
14
|
+
|
15
|
+
def accept_page?(web,content)
|
16
|
+
|
17
|
+
return true if web.secure
|
18
|
+
|
19
|
+
author = web.user
|
20
|
+
filter = Wiki2Go::SpamFilter.new(self)
|
21
|
+
|
22
|
+
if filter.edit_by_banned_user?(author) ||
|
23
|
+
filter.edit_contains_banned_url?(content) then
|
24
|
+
|
25
|
+
current_page = storage.load_page(web.name,web.current_page)
|
26
|
+
filter.blacklist_user_and_urls_added(author,current_page.content,content)
|
27
|
+
|
28
|
+
tarpit
|
29
|
+
false
|
30
|
+
else
|
31
|
+
current_page = storage.load_page(web.name,web.current_page)
|
32
|
+
filter.greylist_new_urls(author,current_page.content,content)
|
33
|
+
return true
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def tarpit
|
38
|
+
sleep(60)
|
39
|
+
end
|
40
|
+
|
41
|
+
def editable?(web)
|
42
|
+
true
|
43
|
+
end
|
44
|
+
|
45
|
+
def redirect_url?(web,url)
|
46
|
+
return false if web.secure
|
47
|
+
|
48
|
+
greylist = storage.load_greylist
|
49
|
+
greylist.contains_url(url)
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require "Wiki2Go/FileStorage.rb"
|
4
|
+
require "Wiki2Go/Wiki2GoConfig.rb"
|
5
|
+
|
6
|
+
class ReadWriteWikiConfig < Wiki2Go::Config
|
7
|
+
|
8
|
+
def initialize(directory)
|
9
|
+
super(directory)
|
10
|
+
@generate_html = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def editable?(web)
|
14
|
+
web.secure
|
15
|
+
end
|
16
|
+
|
17
|
+
def redirect_url?(web,url)
|
18
|
+
false
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
|
@@ -0,0 +1,94 @@
|
|
1
|
+
#!/usr/local/bin/ruby
|
2
|
+
|
3
|
+
require 'webrick'
|
4
|
+
require 'webrick/httpservlet/filehandler'
|
5
|
+
require 'webrick/httpstatus'
|
6
|
+
require 'webrick/cgi'
|
7
|
+
|
8
|
+
require 'net/http'
|
9
|
+
|
10
|
+
require "Wiki2Go/WebrickServlet"
|
11
|
+
require "Wiki2Go/Wiki2GoConfig"
|
12
|
+
require "Wiki2Go/PublicWikiConfig"
|
13
|
+
require 'Wiki2Go/DotGraphics'
|
14
|
+
|
15
|
+
require 'optparse'
|
16
|
+
|
17
|
+
module Wiki2Go
|
18
|
+
|
19
|
+
class LocalConfig < PublicWikiConfig
|
20
|
+
|
21
|
+
def initialize(dir)
|
22
|
+
super(dir)
|
23
|
+
@generate_html = false
|
24
|
+
@multi_wiki = true
|
25
|
+
@debug = true
|
26
|
+
add_processor('GRAPH',Wiki2Go::DotGraphics.new('c:/Program Files/ATT/Graphviz/bin/'))
|
27
|
+
end
|
28
|
+
|
29
|
+
def redirect_url?(web,url)
|
30
|
+
result = super(web,url)
|
31
|
+
return result
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
class Server
|
38
|
+
|
39
|
+
def initialize(args)
|
40
|
+
puts "Args = #{args.inspect}"
|
41
|
+
opts = OptionParser.new
|
42
|
+
dir = Dir.pwd
|
43
|
+
port = 8081
|
44
|
+
wiki = 'Wiki2Go'
|
45
|
+
single = false
|
46
|
+
opts.on("-d",'--dir <directory>','(default is current directory)',String) { |val| dir = val }
|
47
|
+
opts.on("-p",'--port <nb>',"(default is port 8081)",String) { |val| port = val }
|
48
|
+
opts.on("-w",'--wiki <wikiname>',"(default is 'Wiki2Go')",String) { |val| wiki = val }
|
49
|
+
opts.on("-s","--single","Single or multi-wiki (default)") { |val|
|
50
|
+
puts "In -s option"
|
51
|
+
single = true
|
52
|
+
}
|
53
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
54
|
+
puts opts
|
55
|
+
exit
|
56
|
+
end
|
57
|
+
opts.parse(args)
|
58
|
+
|
59
|
+
@config = LocalConfig.new(dir)
|
60
|
+
@config.port = port
|
61
|
+
@config.default_web = wiki
|
62
|
+
@config.generate_html = false
|
63
|
+
@config.multi_wiki = !single
|
64
|
+
puts "Multi wiki = #{@config.multi_wiki}"
|
65
|
+
end
|
66
|
+
|
67
|
+
def start
|
68
|
+
begin
|
69
|
+
|
70
|
+
yield @config if block_given?
|
71
|
+
|
72
|
+
web_thread = Thread.new(@config) do |config|
|
73
|
+
s = WEBrick::HTTPServer.new( :Port => config.port)
|
74
|
+
|
75
|
+
s.mount("/", WikiServlet,config)
|
76
|
+
|
77
|
+
trap("INT"){ s.shutdown }
|
78
|
+
s.start
|
79
|
+
end
|
80
|
+
web_thread
|
81
|
+
rescue
|
82
|
+
puts "Error during startup: #{$!}"
|
83
|
+
puts $@
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def stop
|
88
|
+
Net::HTTP.start( @config.server, @config.port) { |http|
|
89
|
+
response = http.get('/stop/' + @config.default_web + '/')
|
90
|
+
page = response.body
|
91
|
+
}
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'Wiki2Go/UrlFinder'
|
2
|
+
|
3
|
+
require "uri"
|
4
|
+
|
5
|
+
module Wiki2Go
|
6
|
+
class SpamFilter
|
7
|
+
|
8
|
+
def initialize(config)
|
9
|
+
@config = config
|
10
|
+
end
|
11
|
+
|
12
|
+
def edit_by_banned_user?(author)
|
13
|
+
banned_users.contains(author)
|
14
|
+
end
|
15
|
+
|
16
|
+
def edit_contains_banned_url?(content)
|
17
|
+
banned_urls.found_in(content) || chonqed_urls.found_in(content)
|
18
|
+
end
|
19
|
+
|
20
|
+
def too_many_new_urls?(original_content, modified_content,max_new_urls)
|
21
|
+
return added_urls(original_content,modified_content).size > max_new_urls
|
22
|
+
end
|
23
|
+
|
24
|
+
def added_urls(original_content, modified_content)
|
25
|
+
url_finder = Wiki2Go::UrlFinder.new
|
26
|
+
|
27
|
+
old_urls = url_finder.urls_in(original_content)
|
28
|
+
new_urls = url_finder.urls_in(modified_content)
|
29
|
+
urls = new_urls - old_urls
|
30
|
+
urls
|
31
|
+
end
|
32
|
+
|
33
|
+
def blacklist_user(author)
|
34
|
+
bad_users = banned_users
|
35
|
+
bad_users.add(author)
|
36
|
+
@config.storage.save_list(bad_users)
|
37
|
+
end
|
38
|
+
|
39
|
+
def blacklist_url(url)
|
40
|
+
banned_urls.add(host_of(url))
|
41
|
+
@config.storage.save_list(banned_urls)
|
42
|
+
end
|
43
|
+
|
44
|
+
def blacklist_urls(urls)
|
45
|
+
urls.each do |url|
|
46
|
+
banned_urls.add(url)
|
47
|
+
end
|
48
|
+
@config.storage.save_list(banned_urls)
|
49
|
+
end
|
50
|
+
|
51
|
+
def blacklist_user_and_urls_added(author,original,new_content)
|
52
|
+
blacklist_user(author)
|
53
|
+
new_urls = added_urls(original,new_content)
|
54
|
+
blacklist_urls(new_urls)
|
55
|
+
end
|
56
|
+
|
57
|
+
def greylist_new_urls(author,original,new_content)
|
58
|
+
new_urls = added_urls(original,new_content)
|
59
|
+
if new_urls.length > 0 then
|
60
|
+
list = greylist
|
61
|
+
new_urls.each do |url|
|
62
|
+
list.add(author,host_of(url))
|
63
|
+
end
|
64
|
+
@config.storage.save_list(list)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def host_of(url)
|
71
|
+
return '://' + URI::parse(url).host
|
72
|
+
end
|
73
|
+
|
74
|
+
def banned_users
|
75
|
+
@banned_users ||= @config.storage.load_blacklist('user')
|
76
|
+
@banned_users
|
77
|
+
end
|
78
|
+
|
79
|
+
def banned_urls
|
80
|
+
@banned_urls ||= @config.storage.load_blacklist('url')
|
81
|
+
@banned_urls
|
82
|
+
end
|
83
|
+
|
84
|
+
def chonqed_urls
|
85
|
+
@chonqed_urls ||= @config.storage.load_blacklist('chonqed')
|
86
|
+
@chonqed_urls
|
87
|
+
end
|
88
|
+
|
89
|
+
def greylist
|
90
|
+
@greylist ||= @config.storage.load_greylist
|
91
|
+
@greylist
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
end
|