サイズ: 392
コメント:
|
サイズ: 4252
コメント: 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.groupsはweb/contexts.pyのAuxilaryMixinから来る。
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を取得している。
Requestオブジェクトはいろいろなクラスが入り交じって出来ており追いにくいのだが、web/request.pyよりRequestクラスはwerkzeug.Requestをスーパクラスの一つとしており、その中でscript_rootメソッドが定義されている。
つまりmoin.cgiでSCRIPT_NAME環境変数を上書きしてやればよいことになる。 そこで、moin.cgiに次のコードを加える。
これにより、ログインのリンクからmoin.cgiが消えた。