¿Cómo busco contenido Plone no publicado en un shell de depuración de IPython?

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

  •  07-07-2019
  •  | 
  •  

Pregunta

Me gusta usar el perfil zope de IPython para inspeccionar mi instancia de Plone, pero surgen algunas molestas diferencias de permisos en comparación con insertar un punto de interrupción y golpearlo con el usuario administrador.

Por ejemplo, me gustaría iterar sobre los objetos de contenido en una carpeta de prueba no publicada. Esta consulta no devolverá resultados en el shell, pero funciona desde un punto de interrupción.

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

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

¿Puedo autenticarme como administrador o volver a activar los permisos para manipular completamente mi sitio desde ipython?

¿Fue útil?

Solución 2

Solo use catalog.search ({'ruta': 'Plone / testing'}). Realiza la misma consulta que catalog () pero no filtra los resultados según los permisos del usuario actual.

El perfil zope de IPython proporciona un método utils.su ('nombre de usuario') para cambiar el usuario actual, pero no reconoce al usuario administrador (definido en / acl_users en lugar de / Plone / acl_users) y después de llamarlo llamadas posteriores to catalog () falla con AttributeError: el objeto 'module' no tiene el atributo 'checkPermission'.

Otros consejos

aquí está el código ( muy sucio) que uso para administrar mi aplicación plone desde el shell de depuración. Puede requerir algunas actualizaciones dependiendo de sus versiones de Zope y 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

Esto vive en un producto wshelpers Zope. Una vez que se inicia el shell de depuración, solo es cuestión de;

>> from Products.wshelpers import wsdebug
>> app = wsdebug.debug_init(app)
>> # now you're logged in as admin
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top