ログイン
編集不可のページディスカッション情報添付ファイル
"ytoku/ReadingMoin"の差分

MMA
4と15のリビジョン間の差分 (その間の編集: 11回)
2010-01-27 06:26:47時点のリビジョン4
サイズ: 392
編集者: ytoku
コメント:
2010-12-31 19:01:12時点のリビジョン15
サイズ: 4252
編集者: ytoku
コメント: QUERY_STRINGやらPATH_INFOがついた場合に違うじゃないか
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 1: 行 1:
ytoku/ReadingMoinについて、ここに記述してください。 = Reading MoinMoin =
行 7: 行 7:
   * どこから来るのかよく分からないけれどweb/request.pyのクラスのメソッドも併せ持つらしい?
   * web/request.pyのRequestの親クラスはwerkzeugからやってくる。
 * werkzeugはsupport/werkzeug/以下にある
行 11: 行 13:

== Groups and ACL ==
[[MoinMoin:Groups2009]]で再構築された。

`request.groups`は`web/contexts.py`の`AuxilaryMixin`から来る。
{{{#!highlight py
    def groups(self):
        """ Lazy initialize the groups on the first access """
        groups = self.cfg.groups(self)
        return groups
    groups = EnvironProxy(groups)
}}}
cfg.groupsには関数が登録されており、config/multiconfig.pyで`lambda cfg, request: datastruct.WikiGroups(request)`がデフォルト値となっている。
これらの組み合わせで`request.groups`は`WikiGroups(request)`というオブジェクトを指している。

`MoinMoin.auth.*`に`*Group`と`*GroupsBackend`があり、`WikiGroups`はバックエンドの実装である。バックエンドは`__getitem__`にグループ名を与えて呼び出すと`Group`オブジェクトを生成する。その際`Group`オブジェクトにはバックエンドオブジェクトが渡され、`Group`オブジェクトから`__iter__`メソッドなどを呼び出すときにバックエンドが呼び出される。

権限のチェックは`security/__init__.py`の`AccessControlList.may`あたりで行われる。`may`の引数はリクエスト・ユーザ名・権限名である。
`acl`変数は`_addLine`メソッドで構築される配列で、{{{[ ('User', {"read": 0, ...}), ... ]}}}の形式で格納されている。
ユーザがグループに属しているかの判定は、`acl`の各要素を調べてユーザ/グループ名の入っている左側(entry)がグループバックエンド(`groups`)の生成するグループ名リストの中にあったときに行われる。
`groups[entry]`としてグループに属するユーザの一覧を得て、その中にユーザ名が含まれていたときに権限が確定する。

`CompositeGroups`は組み合わせ方が浅い。複数のバックエンドに同じ名前のグループがあったとき、最初のバックエンドのみが処理対象になる。


== 購読のメールやURLに現れるmoin.cgiを消し去る ==
[[renda]]さんによれば購読のメールのURL部分は
  * pagelink = request.getQualifiedURL(page.url(request, {}))
   * programs/MoinMoin/lib/python2.6/site-packages/MoinMoin/events/emailnotify.py
で与えられているとのこと。
このURLがどこから来るのか読んだところ、page.urlはrequest.script_rootからスクリプトのURLを取得している。
{{{#!highlight python
    def url(self, request, querystr=None, anchor=None, relative=False, **kw):
        ...
        if not relative:
            url = '%s/%s' % (request.script_root, url)
        ...
        return url
}}}
Requestオブジェクトはいろいろなクラスが入り交じって出来ており追いにくいのだが、web/request.pyよりRequestクラスはwerkzeug.Requestをスーパクラスの一つとしており、その中でscript_rootメソッドが定義されている。
{{{#!highlight python
    @cached_property
    def script_root(self):
        """The root path of the script without the trailing slash."""
        path = (self.environ.get('SCRIPT_NAME') or '').rstrip('/')
        return _decode_unicode(path, self.charset, self.encoding_errors)
}}}
つまりmoin.cgiでSCRIPT_NAME環境変数を上書きしてやればよいことになる。
そこで、moin.cgiに次のコードを加える。
{{{#!highlight python
import re
os.environ['SCRIPT_NAME'] = re.sub("moin\.cgi$", "", os.environ['SCRIPT_NAME'])
}}}
これにより、ログインのリンクからmoin.cgiが消えた。

Reading MoinMoin

  • action一覧: action/__init__.pyのget_names

  • requestはweb/contexts.pyから来ているらしい
    • 要確認。多分HTTPContextクラスのオブジェクト
    • web/request.pyは何?
      • どこから来るのかよく分からないけれどweb/request.pyのクラスのメソッドも併せ持つらしい?
      • web/request.pyのRequestの親クラスはwerkzeugからやってくる。
  • werkzeugはsupport/werkzeug/以下にある

session

  • requestからは request.session でとれる
  • セッションID session.sid でとれる

Groups and ACL

Groups2009で再構築された。

request.groupsweb/contexts.pyAuxilaryMixinから来る。

   1     def groups(self):
   2         """ Lazy initialize the groups on the first access """
   3         groups = self.cfg.groups(self)
   4         return groups
   5     groups = EnvironProxy(groups)

cfg.groupsには関数が登録されており、config/multiconfig.pyでlambda cfg, request: datastruct.WikiGroups(request)がデフォルト値となっている。 これらの組み合わせでrequest.groupsWikiGroups(request)というオブジェクトを指している。

MoinMoin.auth.**Group*GroupsBackendがあり、WikiGroupsはバックエンドの実装である。バックエンドは__getitem__にグループ名を与えて呼び出すとGroupオブジェクトを生成する。その際Groupオブジェクトにはバックエンドオブジェクトが渡され、Groupオブジェクトから__iter__メソッドなどを呼び出すときにバックエンドが呼び出される。

権限のチェックはsecurity/__init__.pyAccessControlList.mayあたりで行われる。mayの引数はリクエスト・ユーザ名・権限名である。 acl変数は_addLineメソッドで構築される配列で、[ ('User', {"read": 0, ...}), ... ]の形式で格納されている。 ユーザがグループに属しているかの判定は、aclの各要素を調べてユーザ/グループ名の入っている左側(entry)がグループバックエンド(groups)の生成するグループ名リストの中にあったときに行われる。 groups[entry]としてグループに属するユーザの一覧を得て、その中にユーザ名が含まれていたときに権限が確定する。

CompositeGroupsは組み合わせ方が浅い。複数のバックエンドに同じ名前のグループがあったとき、最初のバックエンドのみが処理対象になる。

購読のメールやURLに現れるmoin.cgiを消し去る

rendaさんによれば購読のメールのURL部分は

  • pagelink = request.getQualifiedURL(page.url(request, {}))
    • programs/MoinMoin/lib/python2.6/site-packages/MoinMoin/events/emailnotify.py

で与えられているとのこと。 このURLがどこから来るのか読んだところ、page.urlはrequest.script_rootからスクリプトのURLを取得している。

   1     def url(self, request, querystr=None, anchor=None, relative=False, **kw):
   2         ...
   3         if not relative:
   4             url = '%s/%s' % (request.script_root, url)
   5         ...
   6         return url

Requestオブジェクトはいろいろなクラスが入り交じって出来ており追いにくいのだが、web/request.pyよりRequestクラスはwerkzeug.Requestをスーパクラスの一つとしており、その中でscript_rootメソッドが定義されている。

   1     @cached_property
   2     def script_root(self):
   3         """The root path of the script without the trailing slash."""
   4         path = (self.environ.get('SCRIPT_NAME') or '').rstrip('/')
   5         return _decode_unicode(path, self.charset, self.encoding_errors)

つまりmoin.cgiでSCRIPT_NAME環境変数を上書きしてやればよいことになる。 そこで、moin.cgiに次のコードを加える。

   1 import re
   2 os.environ['SCRIPT_NAME'] = re.sub("moin\.cgi$", "", os.environ['SCRIPT_NAME'])

これにより、ログインのリンクからmoin.cgiが消えた。

ytoku/ReadingMoin (最終更新日時 2011-05-02 14:45:37 更新者 ytoku)