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,26 @@
|
|
1
|
+
module Wiki2Go
|
2
|
+
|
3
|
+
class UrlFinder
|
4
|
+
def old_number_of_urls_in( content )
|
5
|
+
counter = 0
|
6
|
+
content.scan( /((http|ftp|gopher|news|https)\:\/\/((\w|\/|\.|_|-|\?|\=|&|;|\~)+))/ ) {
|
7
|
+
puts $1 + " => " + $3
|
8
|
+
counter+=1
|
9
|
+
}
|
10
|
+
return counter
|
11
|
+
end
|
12
|
+
|
13
|
+
def number_of_urls_in(content)
|
14
|
+
urls_in(content).size
|
15
|
+
end
|
16
|
+
|
17
|
+
def urls_in( content )
|
18
|
+
urls = []
|
19
|
+
content.scan( /((http|ftp|gopher|news|https)\:\/\/((\w|\/|\.|_|-|\?|\=|&|;|\~)+))/ ) {
|
20
|
+
urls << $1
|
21
|
+
}
|
22
|
+
urls
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/lib/Wiki2Go/Web.rb
ADDED
@@ -0,0 +1,185 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require "uri"
|
4
|
+
require "resolv"
|
5
|
+
|
6
|
+
module Wiki2Go
|
7
|
+
|
8
|
+
# A Wiki2Go::Web object contains all the information about the (sub)wiki we're working in
|
9
|
+
# The different fields are to be filled in by the webserver interface (Webrick or CGI or...)
|
10
|
+
|
11
|
+
class Web
|
12
|
+
# The name of the subwiki
|
13
|
+
attr_reader :name
|
14
|
+
# The page of the subwiki
|
15
|
+
attr_accessor :current_page
|
16
|
+
# The 'verb' (action) that was executed
|
17
|
+
attr_reader :verb
|
18
|
+
# URL to be used as the base for all URLs
|
19
|
+
attr_reader :server
|
20
|
+
attr_reader :port
|
21
|
+
# extension for scripts
|
22
|
+
attr_reader :script_extension
|
23
|
+
# directory containing scripts
|
24
|
+
attr_reader :script_prefix
|
25
|
+
|
26
|
+
MARKER = "#-#"
|
27
|
+
|
28
|
+
def initialize(server,port,before,verb,web,page,request=nil)
|
29
|
+
@name = Web.clean(web)
|
30
|
+
@current_page = Web.clean(page)
|
31
|
+
@server = server
|
32
|
+
@port = port
|
33
|
+
|
34
|
+
@verb = verb
|
35
|
+
@script_extension = Web.extension_of(verb)
|
36
|
+
@script_prefix = Web.clean(before)
|
37
|
+
|
38
|
+
@request = request
|
39
|
+
@alias = nil
|
40
|
+
@title = nil
|
41
|
+
end
|
42
|
+
|
43
|
+
def user
|
44
|
+
@request.nil? ? 'unknown' : @request.user
|
45
|
+
end
|
46
|
+
|
47
|
+
def secure
|
48
|
+
@request.nil? ? false : @request.authenticated
|
49
|
+
end
|
50
|
+
|
51
|
+
def alias=(name)
|
52
|
+
@alias = name
|
53
|
+
end
|
54
|
+
|
55
|
+
def alias
|
56
|
+
@alias || user
|
57
|
+
end
|
58
|
+
|
59
|
+
def title=(name)
|
60
|
+
@title = name
|
61
|
+
end
|
62
|
+
|
63
|
+
def title
|
64
|
+
@title || @current_page
|
65
|
+
end
|
66
|
+
|
67
|
+
def base_url
|
68
|
+
if @port.nil? || @port.to_s.empty? || @port.to_s == "80" then
|
69
|
+
url = "http://#{@server}/"
|
70
|
+
elsif port.to_s == "443" then
|
71
|
+
url = "https://#{@server}/"
|
72
|
+
else
|
73
|
+
url = "http://#{@server}:#{@port}/"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def path
|
78
|
+
if @name.empty? then
|
79
|
+
@current_page
|
80
|
+
else
|
81
|
+
File.join(@name,@current_page)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def Web.page_url(server,port,url,verb,multiwiki=true)
|
86
|
+
before,verb,web,page = Web.parse_url(url,verb,multiwiki)
|
87
|
+
if !web.nil? && !page.nil? then
|
88
|
+
return Web.new(server,port,before,verb,web,page)
|
89
|
+
else
|
90
|
+
return Web.new(server,port,before,verb,"Wiki2go","Frontpage")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def Web.from_page_url(url,verb)
|
95
|
+
uri = URI::parse(url)
|
96
|
+
return Web.page_url(uri.host,uri.port,uri.path,verb)
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
def Web.from_request(request,multiwiki)
|
101
|
+
server = request.host
|
102
|
+
port = request.port
|
103
|
+
before,verb = Web.parse_scriptpath(request.server_variable['SCRIPT_NAME'])
|
104
|
+
web,page = Web.parse_path(request.path,multiwiki)
|
105
|
+
web = Web.new(server,port,before,verb,web,page,request)
|
106
|
+
return web
|
107
|
+
end
|
108
|
+
|
109
|
+
def Web.extension_of(verb)
|
110
|
+
verb =~ /(\.[^\.]*)$/
|
111
|
+
return ($1.nil? ? "" : $1)
|
112
|
+
end
|
113
|
+
|
114
|
+
def read_env(env)
|
115
|
+
@secure = env.has_key?("AUTH_TYPE")
|
116
|
+
|
117
|
+
user = env['REMOTE_USER']
|
118
|
+
if user.nil? or user.empty? then
|
119
|
+
user = env['REMOTE_ADDR']
|
120
|
+
begin
|
121
|
+
# addr = Resolv.getname(user)
|
122
|
+
if !addr.nil? and !addr.empty? then
|
123
|
+
user = addr
|
124
|
+
end
|
125
|
+
rescue
|
126
|
+
end
|
127
|
+
end
|
128
|
+
@user = user
|
129
|
+
end
|
130
|
+
|
131
|
+
|
132
|
+
private
|
133
|
+
|
134
|
+
def Web.parse_url(path,verb,multiwiki)
|
135
|
+
scriptprefix , webpath = path.split(verb)
|
136
|
+
web, name = parse_path(webpath,multiwiki)
|
137
|
+
return scriptprefix , verb, web, name
|
138
|
+
end
|
139
|
+
|
140
|
+
def Web.parse_path(path,multi_wiki=true)
|
141
|
+
path = Web.clean(path)
|
142
|
+
if multi_wiki then
|
143
|
+
Web.separate_subwiki_and_page(path)
|
144
|
+
else
|
145
|
+
return "",path
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def Web.separate_subwiki_and_page(path)
|
150
|
+
if path =~ /\// then
|
151
|
+
path =~ /^([^\/]+)\/(.*)$/
|
152
|
+
return $1,$2
|
153
|
+
else
|
154
|
+
return path,""
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def Web.parse_scriptpath(path)
|
159
|
+
if path =~ /\// then
|
160
|
+
path =~ /^(.*)(\/+)([^\/]*)$/
|
161
|
+
return $1,$3
|
162
|
+
else
|
163
|
+
return "",path
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def Web.parse_host(host)
|
168
|
+
host =~ /^([^:]*)\:?(.*)$/
|
169
|
+
|
170
|
+
return $1,$2
|
171
|
+
end
|
172
|
+
|
173
|
+
def Web.clean(path)
|
174
|
+
if path.nil? then
|
175
|
+
return ""
|
176
|
+
else
|
177
|
+
return path.squeeze('/').gsub(/^\//,'').gsub(/\/$/,'')
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
end
|
182
|
+
|
183
|
+
|
184
|
+
end
|
185
|
+
|
@@ -0,0 +1,211 @@
|
|
1
|
+
require 'webrick'
|
2
|
+
require 'webrick/httpservlet/filehandler'
|
3
|
+
require 'webrick/httpstatus'
|
4
|
+
require 'webrick/cgi'
|
5
|
+
include WEBrick
|
6
|
+
|
7
|
+
require "Wiki2Go/Web"
|
8
|
+
require "Wiki2Go/Wiki2Go"
|
9
|
+
|
10
|
+
require 'Web2Go/WebrickRequest'
|
11
|
+
require 'Web2Go/WebrickResponse'
|
12
|
+
require 'Wiki2Go/Wiki2GoServlet'
|
13
|
+
|
14
|
+
class WikiServlet < HTTPServlet::AbstractServlet
|
15
|
+
|
16
|
+
def initialize(server,config)
|
17
|
+
super(server)
|
18
|
+
@server = server
|
19
|
+
@config = config
|
20
|
+
@file_servlet = WEBrick::HTTPServlet::FileHandler.new(@server,@config.site_directory)
|
21
|
+
@servlet = Wiki2Go::Servlet.new(config)
|
22
|
+
end
|
23
|
+
|
24
|
+
def do_GET(req, res)
|
25
|
+
request = Web2Go::WebrickRequest.new(req)
|
26
|
+
response = Web2Go::WebrickResponse.new(res)
|
27
|
+
if !@servlet.execute(request,response) then
|
28
|
+
@file_servlet.do_GET(req,res)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def do_POST(req, res)
|
33
|
+
request = Web2Go::WebrickRequest.new(req)
|
34
|
+
response = Web2Go::WebrickResponse.new(res)
|
35
|
+
if !@servlet.execute(request,response) then
|
36
|
+
@file_servlet.do_GET(req,res)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def perform_save(req,res,wikiweb)
|
43
|
+
|
44
|
+
content = get_parameter(req,'text')
|
45
|
+
name = get_parameter(req,'title') || wikiweb.current_page
|
46
|
+
|
47
|
+
wiki = Wiki2Go::Wiki.new(@config)
|
48
|
+
wiki.title = name
|
49
|
+
|
50
|
+
redirect_to = wiki.save(wikiweb,content)
|
51
|
+
res.body = "Redirect to #{redirect_to}"
|
52
|
+
res['Content-Type'] = "text/html"
|
53
|
+
res.set_redirect(WEBrick::HTTPStatus[300],redirect_to)
|
54
|
+
end
|
55
|
+
|
56
|
+
def perform_removespam(req,res,wikiweb)
|
57
|
+
|
58
|
+
user = get_parameter(req,'user')
|
59
|
+
|
60
|
+
wiki = Wiki2Go::Wiki.new(@config)
|
61
|
+
|
62
|
+
if !user.nil? && !user.empty? then
|
63
|
+
wiki.blacklist(user)
|
64
|
+
end
|
65
|
+
|
66
|
+
res.body = wiki.remove_spam(wikiweb)
|
67
|
+
res['Content-Type'] = "text/html"
|
68
|
+
end
|
69
|
+
|
70
|
+
def perform_upload(req,res,wikiweb)
|
71
|
+
|
72
|
+
uploaded_file = req.query['FILE']
|
73
|
+
wiki = Wiki2Go::Wiki.new(@config)
|
74
|
+
|
75
|
+
res.body = wiki.upload(wikiweb,uploaded_file.filename,uploaded_file.list[0])
|
76
|
+
res['Content-Type'] = "text/html"
|
77
|
+
end
|
78
|
+
|
79
|
+
def perform_view(req,res,wikiweb)
|
80
|
+
wiki = Wiki2Go::Wiki.new(@config)
|
81
|
+
|
82
|
+
res.body = wiki.view(wikiweb)
|
83
|
+
res['Content-Type'] = "text/html"
|
84
|
+
end
|
85
|
+
|
86
|
+
def perform_versions(req,res,wikiweb)
|
87
|
+
wiki = Wiki2Go::Wiki.new(@config)
|
88
|
+
|
89
|
+
res.body = wiki.versions(wikiweb)
|
90
|
+
res['Content-Type'] = "text/html"
|
91
|
+
end
|
92
|
+
|
93
|
+
def perform_changes(req,res,wikiweb)
|
94
|
+
wiki = Wiki2Go::Wiki.new(@config)
|
95
|
+
|
96
|
+
res.body = wiki.changes(wikiweb)
|
97
|
+
res['Content-Type'] = "text/html"
|
98
|
+
end
|
99
|
+
|
100
|
+
def perform_search(req,res,wikiweb)
|
101
|
+
topic = get_parameter(req,'text')
|
102
|
+
|
103
|
+
wiki = Wiki2Go::Wiki.new(@config)
|
104
|
+
|
105
|
+
res.body = wiki.search(wikiweb,topic)
|
106
|
+
res['Content-Type'] = "text/html"
|
107
|
+
end
|
108
|
+
|
109
|
+
def perform_redirect(req,res,wikiweb)
|
110
|
+
redirect_to = get_parameter(req,'url')
|
111
|
+
|
112
|
+
wiki = Wiki2Go::Wiki.new(@config)
|
113
|
+
|
114
|
+
res.body = "Redirect to #{redirect_to}"
|
115
|
+
res['Content-Type'] = "text/html"
|
116
|
+
res.set_redirect(WEBrick::HTTPStatus[300],redirect_to)
|
117
|
+
end
|
118
|
+
|
119
|
+
def perform_generate_static(req,res,wikiweb)
|
120
|
+
wiki = Wiki2Go::Wiki.new(@config)
|
121
|
+
|
122
|
+
res.body = wiki.generate_html(wikiweb)
|
123
|
+
res['Content-Type'] = "text/html"
|
124
|
+
end
|
125
|
+
|
126
|
+
|
127
|
+
def perform_edit(req,res,wikiweb)
|
128
|
+
wiki = Wiki2Go::Wiki.new(@config)
|
129
|
+
|
130
|
+
res.body = wiki.edit(wikiweb)
|
131
|
+
res['Content-Type'] = "text/html"
|
132
|
+
end
|
133
|
+
|
134
|
+
def perform_stop(req,res,wikiweb)
|
135
|
+
res.body = "<HTML>STOPPING...</HTML>"
|
136
|
+
res['Content-Type'] = "text/html"
|
137
|
+
@server.shutdown
|
138
|
+
end
|
139
|
+
|
140
|
+
def perform_admin(req,res,wikiweb)
|
141
|
+
request = Web2Go::WebrickRequest.new(req)
|
142
|
+
wiki = Wiki2Go::Wiki.new(@config)
|
143
|
+
result = wiki.admin(request)
|
144
|
+
|
145
|
+
res.body = result
|
146
|
+
res['Content-Type'] = "text/html"
|
147
|
+
end
|
148
|
+
|
149
|
+
def perform_unknown_verb(req,res,wikiweb)
|
150
|
+
res.body = "<HTML><BODY>Unknown command #{wikiweb.verb}</BODY></HTML>"
|
151
|
+
res['Content-Type'] = "text/html"
|
152
|
+
end
|
153
|
+
|
154
|
+
private
|
155
|
+
|
156
|
+
def get_parameter(req,name)
|
157
|
+
form = WEBrick::HTTPUtils::parse_query(req.body)
|
158
|
+
value = form[name]
|
159
|
+
if value.nil? || value.empty? then
|
160
|
+
form = WEBrick::HTTPUtils::parse_query(req.query_string)
|
161
|
+
value = form[name]
|
162
|
+
end
|
163
|
+
value
|
164
|
+
end
|
165
|
+
|
166
|
+
def execute_command(req,res)
|
167
|
+
if req.path =~ /\/([^\/\?]*)(\/|\?|$)/ then
|
168
|
+
command = $1
|
169
|
+
method = 'perform_' + command
|
170
|
+
if self.private_methods.include?(method) then
|
171
|
+
wikiweb = Wiki2Go::Web.page_url(req.host,req.port,req.path,command,@config.multi_wiki)
|
172
|
+
find_user(req,wikiweb)
|
173
|
+
return self.send(method,req,res,wikiweb)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
execute_default_command(req,res)
|
177
|
+
end
|
178
|
+
|
179
|
+
def execute_default_command(req,res)
|
180
|
+
if req.path == "" or req.path == "/" then
|
181
|
+
wikiweb = @config.default_wiki
|
182
|
+
perform_view(req,res,wikiweb)
|
183
|
+
else
|
184
|
+
@file_servlet.do_GET(req,res)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
def execute_default_command(req,res)
|
189
|
+
if req.path == "" or req.path == "/" then
|
190
|
+
wikiweb = @config.default_wiki
|
191
|
+
perform_view(req,res,wikiweb)
|
192
|
+
else
|
193
|
+
@file_servlet.do_GET(req,res)
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def find_user(req,wikiweb)
|
198
|
+
user = ENV['USER'] || ENV['USERNAME']
|
199
|
+
if user.nil? or user.length == 0 then
|
200
|
+
user = req.peeraddr[2]
|
201
|
+
if user.nil? or user.length == 0 then
|
202
|
+
user = req.peeraddr[3]
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
wikiweb.user = user
|
207
|
+
wikiweb.secure = true
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
module Wiki2Go
|
3
|
+
|
4
|
+
class WhiteList
|
5
|
+
|
6
|
+
def initialize(items)
|
7
|
+
@allowed = items.collect {|line| line.chomp }
|
8
|
+
end
|
9
|
+
|
10
|
+
def all
|
11
|
+
return @allowed
|
12
|
+
end
|
13
|
+
|
14
|
+
def add(item)
|
15
|
+
@allowed << item
|
16
|
+
@allowed = @allowed.sort.uniq
|
17
|
+
end
|
18
|
+
|
19
|
+
def length
|
20
|
+
return @allowed.length
|
21
|
+
end
|
22
|
+
|
23
|
+
def contains(url)
|
24
|
+
match = @allowed.find { |allowed| url =~ Regexp.new(allowed) }
|
25
|
+
! match.nil?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|