Giter Site home page Giter Site logo

gyazz's Introduction

Gyazz - 手軽で強力なWiki

特徴

  • http://Gyazz.comで運用しているものです
  • URLにWiki名とページ名を指定してすぐにページを作成/編集できます
  • 行を長クリックすると編集可能になり、編集すると自動的にセーブされます
  • 使い方のページ推薦Wikiなどをご覧下さい

インストール

  • 必要なrubygemをインストール

      % gem install bundler
      % bundle install
    
  • データ格納ディレクトリをつくる

      % mkdir /your/data/directory
    
  • 環境にあわせて lib/config_template.rb を編集して lib/config.rb をつくる

      FILEROOT = "/your/data/directory"
      DEFAULTPAGE = "/Gyazz/index"
      SESSION_SECRET = "special_arbitrary_secret_string"
    

起動

% bundle exec rackup config.ru -p 3000

=> http://localhost:3000

gyazz's People

Contributors

henteko avatar keroxp avatar masui avatar nekobato avatar shokai avatar zakuni avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

gyazz's Issues

認証用cookieが推測できてしまう脆弱性を直す

lib/auth.rbauth_cookie関数の返り値がresponse.set_cookieにセットされているが、cookieがwiki名だけで生成される上、全ユーザー同じcookieなので公開されているソースを見れば誰でも認証つきページにログインできる脆弱性がある

タイトルのリスト

何故かページタイトルのリストを取得する方法が存在しない。
別ページからのリンクが存在するときだけタイトルを知ることができるのだが
ちょっと問題ではなかろうか?

modelを作るためのリファクタリング

lib/*.rb内のロジックにSDBMの操作が含まれているので、modelに切り出すべきか

  1. それぞれが勝手にSDBMを開いているのが悪い、modelに集約すべき
  2. controllerから呼ばれてるライブラリがerbでHTMLをレンダリングして文字列として返しているのをなんとかした方が良いかもしれない。controllerがviewの機能を持っている。
  3. 認証しているかどうかをライブラリやviewやcontrollerがそれぞれ勝手にcookie見たりcheck_auth(name)という関数使ったりして調べているのもおかしい

model作るより先に、認証状態を取得するヘルパークラスから書くべきかもしれない

lib/*.rbのコードを読んでみた

lib/の中身のmodelにできる部分はmodels/に移動したい

各ファイルの行数

     242 lib/search.rb
     230 lib/writedata.rb
     147 lib/auth.rb
     126 lib/pair.rb
     108 lib/related.rb
      84 lib/history.rb
      78 lib/keyword.rb
      76 lib/contenttype.rb
      73 lib/png.rb
      57 lib/rss.rb
      54 lib/page.rb
      53 lib/lib.rb
      32 lib/readdata.rb
      20 lib/access.rb
      19 lib/edit.rb
       9 lib/config_template.rb
       9 lib/attr.rb

lib/search.rb

  • wiki内のページ一覧を返すtitles関数がある
  • wiki内のページを検索するsearch関数があるが、なぜか関数内でerbレンダリングしているのでcontrollerともども修正必要

lib/writedata.rb

  • writedataと__writedataという関数がある
  • writedataは書き込み、__writedataは無条件書き込みらしい
  • __writedataにはバックアップせずに書き込むオプションがある(第二引数)
  • 第一引数が巨大な配列で、[wiki名, ページ名, 以後ページの行データ]となっている
  • writedataはpost '__write'から呼ばれる、旧式の書き込みらしい
  • **writedataはpost '__write**'から呼ばれる
  • writedataは"conflict""noconflict"という文字列を返す。これをresponse bodyとして返すことにより、jsは書き込み衝突を検出している
  • __writedataはなぜかリダイレクト先のpathを返すので、controllerからsinatraのredirect関数に渡される

lib/auth.rb

  • protected!, password_required?, password_authorized?, auth_page_exists?, auth_cookie, cookie_authorized? 関数を持っている
  • 全部呼び出し元がcontrollerなので、helperに移動するべき
  • auth_cookie関数はresponse.set_cookieにセットされるが、cookieがwiki名だけで生成される上、全ユーザー同じcookieなので公開されているソースを見れば誰でも認証つきページにログインできる脆弱性がある

lib/pair.rb

  • class Pairが定義されている
  • 最古のKVSであるSDBMを、KVSではなく要素数2の配列の配列として扱うためのクラス
  • Gyazz.topdir/wiki名/pairに保存される
    -関連検索に使っている。[ページ名, リンク先]で保存する
  • [[ページ名,リンク先], [ページ名,リンク先], [ページ名,リンク先]...]のようになる
  • Gyazz::Pairに移動し、これを直接使わずGyazz::Pageモデルから扱うようにするべき
  • ページ内にどのページヘのリンクがあるか管理すればいいのだから、Gyazz::Page.new('ページ名').relatesで取得するとか

lib/related.rb

  • pairを使った関連検索の関数がある
  • _weight(name,title) で重み付けして related(name,title) で重要な順に返す
  • related_html(name,title)がviewのerbから直接呼ばれているがescapeされていないのでページ名がそのままHTMLに出力される
  • #56 で報告、 #57 で修正した
  • related_htmlの呼び出し元が、controller->related.erb->related_html()->icon.erbとtexticon.erb となっていてマジでヤバイ

lib/history.rb

  • 履歴の視覚化関係の関数がある。ページ履歴を遡る機能には使われていない?
  • history_json(name, title)はto_json使った方がいい
  • history_png(name, title)はページの編集履歴をしましまのpng画像にして返す
  • 全部Gyazz::Pageモデルに移動させる
  • Gyazz::Page.new('ページ名').histories, Gyazz::Page.new('ページ名').history_pngとか

lib/keyword.rb

  • String#keywordsを定義している
  • string.rbにしたほうがいいような
  • testが下の方に書かれているので、tests/に移動させる

lib/contenttype.rb

  • get "/upload/:filename"から呼ばれている、つまりアップロードされたファイルを配信する時に使われる
  • そもそも静的ファイル配信にsinatraでFile.readして返さないほうがいい
  • とりあえずGyazz::ContentTypeに移動させる

lib/png.rb

  • zlibでPNG画像を生成するライブラリ
  • ようやくライブラリらしいライブラリがでてきた
  • これはこのままでもいいかも

lib/rss.rb

  • rss(name)という関数がある
  • wiki名を与えるとrssを生成する
  • パスワードが必要なwikiの場合、本文は空にする(password_required?関数を使っている)
  • Gyazz::Wiki.new('wiki名').rssとかにしたほうがいい

lib/page.rb

  • page(wiki名, ページ名, 認証確認フラグ) という関数1つがある
  • get '/__random'get '/wiki名/ページ名'で使われる重要な関数
  • SDBMを開いてページ内容を読み取り、認証を確認して履歴をバックアップ保存しerbでHTMLを返す、色々詰め込みすぎ
  • readdata()と役割が重複しているが、内部でreaddataを使っているわけではない

lib/lib.rb

  • topdirとかbackupdirとかがある
  • Gyazz.topdirとかGyazz.backupdirとかに直す(直した)

lib/readdata.rb

  • readdata(wiki名, ページ名, バージョン)という関数だけがある
  • ページのデータを返す。lib/page.rbからは使われていない。
  • バージョン指定された時になんかやってるけど全然理解できない

lib/access.rb

  • access(wiki名, ページ名)
    • アクセス履歴
    • jsonで返る
  • modify(wiki名, ページ名)
    • 変更履歴
    • jsonで返る
  • どちらもPage modelが持つべき
  • どちらもjsonで返さないべき。データ構造で返して、json化するのはcontrollerの仕事

lib/edit.rb

  • edit(wiki名, ページ名, バージョン)
  • get '/:name/*/__edit'get '/:name/*/__edit/:version'から使われる
  • 編集をする関数ではなく、編集画面のHTMLを生成するための関数(名前がおかしい)
  • erb :editを返している、良くない
  • 異なる日付入りのコメントアウトが大量にある
  • 書き込み可能認証してるかどうかも判定している
  • 書き込み可能認証しているかをviewに伝えるんじゃなくて、認証しているかでviewを切り替えるか問答無用でredirectすればいいだけだと思う

lib/config_template.rb

  • 設定ファイルのテンプレート
  • できればGyazz::FILEROOTとかGyazz::DEFAULTPAGEとかになってほしい

lib/attr.rb

  • attr(wiki名)
  • get "/:name/.settings"から使われている
  • ライブラリなのにerbでHTMLをレンダリングして返していておかしい

Rack::Session::Cookieに塩が付いていない

起動時にwarningが出ています

[2013-06-06 14:03:11] INFO  WEBrick::HTTPServer#start: pid=19385 port=5000
        SECURITY WARNING: No secret option provided to Rack::Session::Cookie.
        This poses a security threat. It is strongly recommended that you
        provide a secret to prevent exploits that may be possible from crafted
        cookies. This will not be supported in future versions of Rack, and
        future versions will even invalidate your existing user cookies.

        Called from: /Users/sho/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:86:in `new'.

行の古さの視覚化

それぞれの行の編集日時を表示し、色でも大体わかるようにしたい。
Ctrl + 左右矢印キーでできるようになっているのだが、昔のものしか視覚化されないし日時が表示されないので。

一行の長さの制限

行データをSDBMに格納しているので1000文字以上の行を貼り付けるとコケる

プログラムを書きやすくする

ページをプログラムテキストそのものとして使えるようにする
拡張子があれば箇条書きの「・」を表示しないようにするとか

テストを書く

テストが全然無いのでどうにかせねばなりますまい

ページリストの高速化

毎回ディレクトリを見てファイルを捜したりアクセス時刻を取ったりしているのが遅いのでキャッシュすべき

リンク先画像をJavaScriptで生成する

現在サーバで生成してるが、1リンク先, 2リンク先ページのタイトルだけ返すようにして画像はJavaScriptで生成するようにしたい
1リンク先だけ表示したり、ブラウザ側でいろんな細工ができるので

意味の無い逆リンクの重要度を下げる

個人ページに「[[Windows]]が好きです」などと書くとWindowsのページから個人ページへのリンクができてしまうのが嫌である。
逆リンクを作らない記法を使えばいいのかもしれないが... (e.g. [[増井研:::Windows]])
#36 と関係してるかも

認証関連の整理

現状のcheck_auth()を削除したので、beforeを使って新たに綺麗に作りなおす

Ruby1.9/2.0でアクセス履歴視覚化が強制終了する

ページリストにアクセスした時に、アクセス履歴視覚化の画像生成がRuby1.9/2.0で動かず
エラーが出ます。

最近のlinuxのRubyはデフォルトで1.9系になっているので、対応した方がいいです
他にもバイナリを扱っている部分はRuby1.9以上だと動かない部分があるかもしれません。

Encoding::CompatibilityError - incompatible character encodings: UTF-8 and ASCII-8BIT:
        /Users/sho/src/sinatra/gyazz/lib/png.rb:19:in `png'
        /Users/sho/src/sinatra/gyazz/lib/history.rb:87:in `history_png'
        /Users/sho/src/sinatra/gyazz/gyazz.rb:268:in `block in <top (required)>'
        /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sinatra-1.4.2/lib/sinatra/base.rb:1415:in `call'
        /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sinatra-1.4.2/lib/sinatra/base.rb:1415:in `block in compile!'
        /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sinatra-1.4.2/lib/sinatra/base.rb:944:in `[]'
        /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sinatra-1.4.2/lib/sinatra/base.rb:944:in `block (3 levels) in route!'
        /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/sinatra-1.4.2/lib/sinatra/base.rb:960:in `route_eval'

RSSフィードのメタタグを埋め込む

これを埋め込めば、各種RSSリーダーでフィードを登録できるようになります

<link rel="alternate" type="application/rss+xml" title="#{wiki_name} RSS Feed" href="http://gyazz.com/#{wiki_name}/rss.xml" />

video/audioタグ埋め込み

gyazzにファイルを保存できるようになっているのだから、

videoタグになるのはどうでしょうか

[[動画URL.mp4]]

サムネイルも付けられる

[[動画URL.mp4 サムネイルURL.(gif|jpe?g|png)]]

mp3はaudioタグになる

[[URL.mp3]]

どちらもクリックしたら再生です

API整理

統一がとれるAPIを決める

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.