IPythonデバッグシェルで未公開のPloneコンテンツを検索するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/279119

  •  07-07-2019
  •  | 
  •  

質問

IPythonのzopeプロファイルを使用してPloneインスタンスを検査しますが、ブレークポイントを挿入して管理ユーザーでヒットする場合と比べて、いくつかの面倒な権限の違いが生じます。

たとえば、未公開のテストフォルダー内のコンテンツオブジェクトを反復処理したいと思います。このクエリはシェルで結果を返しませんが、ブレークポイントから機能します。

$ bin/instance shell
$ ipython --profile=zope

from Products.CMFPlone.utils import getToolByName
catalog = getToolByName(context, 'portal_catalog')
catalog({'path':'Plone/testing'})

管理者として認証するか、ipythonからサイトを完全に操作する権限を再設定できますか?

役に立ちましたか?

解決 2

catalog.search({'path': 'Plone / testing'})を使用するだけです。 catalog()と同じクエリを実行しますが、現在のユーザーの権限に基づいて結果をフィルタリングしません。

IPythonのzopeプロファイルは、現在のユーザーを変更するためのメソッドutils.su( 'username')を提供しますが、管理ユーザー(/ Plone / acl_usersではなく/ acl_usersで定義される)を認識せず、後続の呼び出しを呼び出した後catalog()にAttributeErrorで失敗します: 'module'オブジェクトには属性 'checkPermission'がありません。

他のヒント

これは、デバッグシェルからPloneアプリを管理するために使用する(非常に汚い)コードです。 ZopeとPloneのバージョンによっては、更新が必要になる場合があります。

from sys import stdin, stdout, exit
import base64
from thread import get_ident
from ZPublisher.HTTPRequest import HTTPRequest
from ZPublisher.HTTPResponse import HTTPResponse
from ZPublisher.BaseRequest import RequestContainer
from ZPublisher import Publish

from AccessControl import ClassSecurityInfo, getSecurityManager
from AccessControl.SecurityManagement import newSecurityManager
from AccessControl.User import UnrestrictedUser

def loginAsUnrestrictedUser():
    """Exemple of use :
        old_user = loginAsUnrestrictedUser()
        # Manager stuff
        loginAsUser(old_user)
    """
    current_user = getSecurityManager().getUser()
    newSecurityManager(None, UnrestrictedUser('manager', '', ['Manager'], []))
    return current_user

def loginAsUser(user):
    newSecurityManager(None, user)

def makerequest(app, stdout=stdout, query_string=None, user_pass=None):
    """Make a request suitable for CMF sites & Plone
      - user_pass = "user:pass"
    """
    # copy from Testing.makerequest
    resp = HTTPResponse(stdout=stdout)
    env = {}
    env['SERVER_NAME'] = 'lxtools.makerequest.fr'
    env['SERVER_PORT'] = '80'
    env['REQUEST_METHOD'] = 'GET'
    env['REMOTE_HOST'] = 'a.distant.host'
    env['REMOTE_ADDR'] = '77.77.77.77'
    env['HTTP_HOST']   = '127.0.0.1'
    env['HTTP_USER_AGENT'] = 'LxToolsUserAgent/1.0'
    env['HTTP_ACCEPT']='image/gif, image/x-xbitmap, image/jpeg, */* '
    if user_pass:
        env['HTTP_AUTHORIZATION']="Basic %s" % base64.encodestring(user_pass)
    if query_string:
        p_q = query_string.split('?')
        if   len(p_q) == 1: 
            env['PATH_INFO'] = p_q[0]
        elif len(p_q) == 2: 
            (env['PATH_INFO'], env['QUERY_STRING'])=p_q
        else: 
            raise TypeError, ''
    req = HTTPRequest(stdin, env, resp)
    req['URL1']=req['URL'] # fix for CMFQuickInstaller
    #
    # copy/hacked from Localizer __init__ patches
    # first put the needed values in the request
    req['HTTP_ACCEPT_CHARSET'] = 'latin-9'
    #req.other['AcceptCharset'] = AcceptCharset(req['HTTP_ACCEPT_CHARSET'])
    #
    req['HTTP_ACCEPT_LANGUAGE'] = 'fr'
    #accept_language = AcceptLanguage(req['HTTP_ACCEPT_LANGUAGE'])
    #req.other['AcceptLanguage'] = accept_language 
    # XXX For backwards compatibility
    #req.other['USER_PREF_LANGUAGES'] = accept_language
    #req.other['AcceptLanguage'] = accept_language 
    #
    # Plone stuff
    #req['plone_skin'] = 'Plone Default'
    #
    # then store the request in Publish._requests
    # with the thread id
    id = get_ident()
    if hasattr(Publish, '_requests'):
        # we do not have _requests inside ZopeTestCase
        Publish._requests[id] = req
    # add a brainless session container
    req['SESSION'] = {}
    #
    # ok, let's wrap
    return app.__of__(RequestContainer(REQUEST = req))


def debug_init(app):
    loginAsUnrestrictedUser()
    app = makerequest(app)
    return app

これはwshelpers Zope製品にあります。デバッグシェルが起動したら、それはただの問題です;

>> from Products.wshelpers import wsdebug
>> app = wsdebug.debug_init(app)
>> # now you're logged in as admin
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top