Wiki2Go 1.17.5 → 1.22.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/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 
         |