def test_Skin_default(self):
        from plone.app.caching.operations.etags import Skin

        environ = {'SERVER_NAME': 'example.com', 'SERVER_PORT': '80'}
        response = HTTPResponse()
        request = HTTPRequest(StringIO(), environ, response)
        published = DummyPublished(DummyContext())

        class DummyPortalSkins(object):
            def getRequestVarname(self):
                return 'skin_name'

            def getDefaultSkin(self):
                return 'defaultskin'

        published.__parent__.portal_skins = DummyPortalSkins()

        etag = Skin(published, request)

        self.assertEqual('defaultskin', etag())
Beispiel #2
0
def makeTestRequest(environ=None):
    """Return an HTTPRequest object suitable for testing views."""
    from sys import stdin, stdout
    from zope.publisher.browser import setDefaultSkin
    from ZPublisher.HTTPRequest import HTTPRequest
    from ZPublisher.HTTPResponse import HTTPResponse

    if environ is None:
        environ = {}
    environ.setdefault('SERVER_NAME', 'foo')
    environ.setdefault('SERVER_PORT', '80')
    environ.setdefault('REQUEST_METHOD', 'GET')

    resp = HTTPResponse(stdout=stdout)
    req = HTTPRequest(stdin, environ, resp)
    req._steps = ['noobject']  # Fake a published object.
    req['ACTUAL_URL'] = req.get('URL')
    setDefaultSkin(req)

    return req
Beispiel #3
0
 def do_fake_request(self, request_method, headers=None):
     if headers is None:
         headers = {}
     __version__ = "0.1"
     env = {}
     env['SERVER_NAME'] = 'bobo.server'
     env['SERVER_PORT'] = '80'
     env['REQUEST_METHOD'] = request_method
     env['REMOTE_ADDR'] = '204.183.226.81 '
     env['REMOTE_HOST'] = 'bobo.remote.host'
     env['HTTP_USER_AGENT'] = 'Bobo/%s' % __version__
     env['HTTP_HOST'] = '127.0.0.1'
     env['SERVER_SOFTWARE'] = 'Bobo/%s' % __version__
     env['SERVER_PROTOCOL'] = 'HTTP/1.0 '
     env['HTTP_ACCEPT'] = 'image/gif, image/x-xbitmap, image/jpeg, */* '
     env['SERVER_HOSTNAME'] = 'bobo.server.host'
     env['GATEWAY_INTERFACE'] = 'CGI/1.1 '
     env['SCRIPT_NAME'] = 'Main'
     env.update(headers)
     return HTTPRequest(StringIO.StringIO(), env, HTTPResponse())
def makerequest(environ=None, stdin=''):
    stdout = StringIO()
    stdin = StringIO(stdin)
    if environ is None:
        environ = {}

    # Header-Name -> HEADER_NAME
    _ = {}
    for k, v in environ.items():
        k = k.replace('-', '_').upper()
        _[k] = v
    environ = _

    response = HTTPResponse(stdout=stdout)
    environ.setdefault('SERVER_NAME', 'foo')
    environ.setdefault('SERVER_PORT', '80')
    request = HTTPRequest(stdin, environ, response)
    # process stdin data
    request.processInputs()
    return request
Beispiel #5
0
    def test_default_viewname_but_no_view_doesnt_override_fti(self):
        response = HTTPResponse()
        environment = {'URL': '',
                       'PARENTS': [self.site],
                       'REQUEST_METHOD': 'GET',
                       'SERVER_PORT': '80',
                       'REQUEST_METHOD': 'GET',
                       'steps': [],
                       'SERVER_NAME': 'localhost',
                       '_hacked_path': 0}
        r = HTTPRequest(StringIO(), environment, response)
        r.other.update(environment)
        alsoProvides(r, IBrowserRequest)

        # we define a Zope3-style default view name, but no
        # corresponding view, no change in behaviour expected
        defineDefaultViewName('index.html', DummyContent)
        r.traverse('foo')
        self.assertEqual(r.URL, '/foo/dummy_view')
        self.assertEqual(r.response.base, '/foo/')
    def test_cookie(self):
        """Test cookies"""
        # by default, the tree sets a cookie, so test for that
        request = self.request
        response = request.RESPONSE
        self.assertTrue(self.varname in response.cookies)

        # now make a tree that doesn't set a cookie
        treeexp = response.cookies[self.varname]['value']
        environ = {'SERVER_NAME': "", 'SERVER_PORT': '0'}
        response = HTTPResponse(stdout=BytesIO())
        request = HTTPRequest(BytesIO(), environ, response)
        request.other[self.varname] = treeexp
        self.tree = ZopeTree(self.root_obj,
                             'id',
                             'children',
                             request,
                             self.varname,
                             set_cookie=0)
        self.assertFalse(self.varname in response.cookies)
Beispiel #7
0
    def test_enabled_accepted(self):
        provideUtility(Registry(), IRegistry)
        registry = getUtility(IRegistry)
        registry.registerInterface(IPloneCacheSettings)

        ploneSettings = registry.forInterface(IPloneCacheSettings)
        ploneSettings.enableCompression = True

        environ = {
            'SERVER_NAME': 'example.com',
            'SERVER_PORT': '80',
            'HTTP_ACCEPT_ENCODING': 'gzip'
        }
        response = HTTPResponse()
        request = HTTPRequest(StringIO(), environ, response)

        published = DummyPublished()
        GZipTransform(published, request).transformUnicode(u"", "utf-8")

        self.assertEqual(1, response.enableHTTPCompression(query=True))
    def _getFauxRequest(self, payload, content_type):
        # environ['method'] = 'POST'
        # environ['content-disposition'] = disposition
        # environ['CONTENT_DISPOSITION']
        # environ['slug'] = 'The Beach'
        # environ['charset']= 'utf-8'
        # environ['BODY'] = payload

        resp = HTTPResponse(stdout=sys.stdout)

        environ = {}
        environ['SERVER_NAME'] = 'foo'
        environ['SERVER_PORT'] = '80'
        environ['REQUEST_METHOD'] = 'POST'
        environ['METHOD'] = 'POST'
        environ['CONTENT_TYPE'] = content_type
        environ['CONTENT_LENGTH'] = len(payload)

        file = StringIO(payload)
        req = HTTPRequest(stdin=file, environ=environ, response=resp)
        return req
Beispiel #9
0
    def test_default_view_from_fti(self):
        response = HTTPResponse()
        environment = {
            'URL': '',
            'PARENTS': [self.site],
            'REQUEST_METHOD': 'GET',
            'SERVER_NAME': 'localhost',
            'SERVER_PORT': '80',
            'REQUEST_METHOD': 'GET',
            'steps': [],
            '_hacked_path': 0
        }
        r = HTTPRequest(StringIO(), environment, response)
        r.other.update(environment)

        r.traverse('foo')
        self.assertEqual(r.URL, '/foo/dummy_view')
        self.assertEqual(
            r.response.base, '/foo/',
            'CMF Collector issue #192 (wrong base): %s' %
            (r.response.base or 'empty', ))
Beispiel #10
0
    def test_challenge_redirect(self):
        # Prepare the plugin.
        from pas.plugins.headers.plugins import HeaderPlugin

        plugin = HeaderPlugin()
        url = "https://example.org/saml-login"
        plugin.redirect_url = url

        # Prepare the request.
        request = HeaderRequest()
        out = BytesIO()
        response = HTTPResponse(stdout=out)

        # When the plugin makes a challenge, it must return a True value.
        self.assertTrue(plugin.challenge(request, response))

        # Check the response.
        out.seek(0)
        self.assertEqual(out.read(), b"")
        self.assertEqual(response.headers["location"],
                         "{}?came_from={}".format(url, request.URL))
Beispiel #11
0
    def _makeOne(self, stdin=None, environ=None, response=None, clean=1):
        from ZPublisher.HTTPResponse import HTTPResponse
        if stdin is None:
            stdin = BytesIO()

        if environ is None:
            environ = {}

        if 'REQUEST_METHOD' not in environ:
            environ['REQUEST_METHOD'] = 'GET'

        if 'SERVER_NAME' not in environ:
            environ['SERVER_NAME'] = 'http://localhost'

        if 'SERVER_PORT' not in environ:
            environ['SERVER_PORT'] = '8080'

        if response is None:
            response = HTTPResponse(stdout=BytesIO())

        return self._getTargetClass()(stdin, environ, response, clean)
Beispiel #12
0
 def testUrlBrowserIdIsFound(self):
     bid = '43295340A0bpcu4nkCI'
     name = '_ZopeId'
     resp = HTTPResponse()
     environ = {}
     environ['SERVER_NAME'] = 'fred'
     environ['SERVER_PORT'] = '80'
     self.req = HTTPRequest(stdin, environ, resp)
     self.req['TraversalRequestNameStack'] = ['foo', 'bar', bid, name]
     self.app.REQUEST = self.req
     self.m.setAutoUrlEncoding(1)
     self.m.setBrowserIdNamespaces(('url', ))
     self.m.updateTraversalData()
     traverser = BrowserIdManagerTraverser()
     traverser(self.app, self.req)
     self.failUnless(isAWellFormedBrowserId(self.req.browser_id_))
     self.failUnless(self.req.browser_id_ns_ == 'url')
     self.failUnless(self.req._script[-1] == self.req.browser_id_)
     self.failUnless(self.req._script[-2] == '_ZopeId')
     self.failUnless(
         self.req['TraversalRequestNameStack'] == ['foo', 'bar'])
Beispiel #13
0
    def openWithForm(self, form, editmode=False):
        """ Display the document using the given form's layouts.
        First, check if the user has proper access rights.
        """

        db = self.getParentDatabase()
        if editmode:
            if not db.isCurrentUserAuthor(self):
                raise Unauthorized, "You cannot edit this document."
        else:
            if not self.isReader():
                raise Unauthorized, "You cannot read this content"

        onOpenDocument_error = self._onOpenDocument(form)

        if onOpenDocument_error:
            html_content = onOpenDocument_error
        else:
            # we use the specified form's layout
            request = getattr(self, 'REQUEST', None)
            if not request:
                import sys
                from ZPublisher.HTTPResponse import HTTPResponse
                from ZPublisher.HTTPRequest import HTTPRequest
                response = HTTPResponse(stdout=sys.stdout)
                env = {
                    'SERVER_NAME': 'fake_server',
                    'SERVER_PORT': '80',
                    'REQUEST_METHOD': 'GET'
                }
                request = HTTPRequest(sys.stdin, env, response)
            html_content = form.displayDocument(self,
                                                editmode=editmode,
                                                request=request)

        plone_tools = getToolByName(db, 'plone_utils')
        encoding = plone_tools.getSiteEncoding()
        html_content = html_content.encode(encoding)

        return html_content
Beispiel #14
0
    def test_UserID_anonymous(self):
        from plone.app.caching.operations.etags import UserID

        @implementer(Interface)
        @adapter(DummyContext, Interface)
        class DummyPortalState(object):
            def __init__(self, context, request):
                pass

            def member(self):
                return None

        provideAdapter(DummyPortalState, name=u'plone_portal_state')

        environ = {'SERVER_NAME': 'example.com', 'SERVER_PORT': '80'}
        response = HTTPResponse()
        request = HTTPRequest(StringIO(), environ, response)
        published = DummyPublished(DummyContext())

        etag = UserID(published, request)

        self.assertIsNone(etag())
Beispiel #15
0
    def test_ObjectLocked_false(self):
        from plone.app.caching.operations.etags import ObjectLocked

        @implementer(Interface)
        @adapter(DummyContext, Interface)
        class DummyContextState(object):
            def __init__(self, context, request):
                pass

            def is_locked(self):
                return False

        provideAdapter(DummyContextState, name=u'plone_context_state')

        environ = {'SERVER_NAME': 'example.com', 'SERVER_PORT': '80'}
        response = HTTPResponse()
        request = HTTPRequest(StringIO(), environ, response)
        published = DummyPublished(DummyContext())

        etag = ObjectLocked(published, request)

        self.assertEqual('0', etag())
Beispiel #16
0
    def test_LastModified_None(self):
        from plone.app.caching.operations.etags import LastModified

        @implementer(ILastModified)
        @adapter(DummyPublished)
        class DummyLastModified(object):
            def __init__(self, context):
                self.context = context

            def __call__(self):
                return None

        provideAdapter(DummyLastModified)

        environ = {'SERVER_NAME': 'example.com', 'SERVER_PORT': '80'}
        response = HTTPResponse()
        request = HTTPRequest(StringIO(), environ, response)
        published = DummyPublished(DummyContext())

        etag = LastModified(published, request)

        self.assertIsNone(etag())
    def testSwordServiceStatement(self):
        self.folder.invokeFactory('Folder', 'workspace')
        xml = os.path.join(DIRNAME, 'data', 'entry.xml')
        file = open(xml, 'rb')
        content = file.read()
        file.close()
        env = {
            'REQUEST_METHOD': 'POST',
            'CONTENT_LENGTH': len(content),
            'CONTENT_TYPE': 'application/atom+xml;type=entry',
            'CONTENT_DISPOSITION': 'attachment; filename=entry.xml',
            'SERVER_NAME': 'nohost',
            'SERVER_PORT': '80'
        }
        uploadresponse = HTTPResponse(stdout=StringIO())
        uploadrequest = clone_request(self.app.REQUEST, uploadresponse, env)
        uploadrequest.set('BODYFILE', StringIO(content))
        uploadrequest.set('PARENTS', [self.folder.workspace])
        adapter = getMultiAdapter(
                (self.folder.workspace, uploadrequest), Interface, 'atompub')
        xml = adapter()
        assert "<sword:error" not in xml, xml

        id = self.folder.workspace.objectIds()[0]
        file = self.folder.workspace[id]
        adapter = getMultiAdapter((file, self.portal.REQUEST), ISWORDStatement)
        xml = adapter()
        assert "<sword:error" not in xml, xml
        dom = parseString(xml)
        returned_statement = dom.toxml()

        obj = self.folder.workspace.objectValues()[0]
        file = open(os.path.join(DIRNAME, 'data', 'entry_statement.xml'), 'r')
        dom = parse(file)
        file.close()
        dates = dom.getElementsByTagName('updated')
        dates[0].firstChild.nodeValue = obj.modified()
        reference_statement = dom.toxml()
    def testContentRetrieve(self):
        id = self.folder.invokeFactory('Folder', 'workspace')
        workspace = self.folder[id]

        id = workspace.invokeFactory('File', 'content_file')
        content_file = workspace[id]
        zipfilename = os.path.join(DIRNAME, 'data', 'multipart.txt')
        file = open(zipfilename, 'r')
        content_file.setFile(file)
    
        env = {
            'REQUEST_METHOD': 'GET',
            'SERVER_NAME': 'nohost',
            'SERVER_PORT': '80'
        }
        getresponse = HTTPResponse(stdout=StringIO())
        getrequest = clone_request(self.app.REQUEST, getresponse, env)

        self.setRoles(('Manager',))
        adapter = getMultiAdapter(
            (content_file, getrequest), Interface, 'sword')
        zipfile = adapter()
        file.close()
Beispiel #19
0
    def test_UserLanguage(self):
        from plone.app.caching.operations.etags import UserLanguage

        class DummyPortalState(object):
            implements(Interface)
            adapts(DummyContext, Interface)

            def __init__(self, context, request):
                pass

            def language(self):
                return 'en'

        provideAdapter(DummyPortalState, name=u"plone_portal_state")

        environ = {'SERVER_NAME': 'example.com', 'SERVER_PORT': '80'}
        response = HTTPResponse()
        request = HTTPRequest(StringIO(), environ, response)
        published = DummyPublished(DummyContext())

        etag = UserLanguage(published, request)

        self.assertEqual('en', etag())
Beispiel #20
0
    def test_default_viewname_overrides_fti(self):
        response = HTTPResponse()
        environment = { 'URL': '',
                        'PARENTS': [self.site],
                        'REQUEST_METHOD': 'GET',
                        'SERVER_PORT': '80',
                        'REQUEST_METHOD': 'GET',
                        'steps': [],
                        'SERVER_NAME': 'localhost',
                        '_hacked_path': 0 }
        r = HTTPRequest(StringIO(), environment, response)
        r.other.update(environment)

        # we define a Zope3-style default view name for which a view
        # actually exists
        defineDefaultViewName('index.html', DummyContent)
        zope.component.provideAdapter(
            DummyView, (DummyContent, IBrowserRequest), IBrowserView,
            'index.html')

        r.traverse('foo')
        self.assertEqual( r.URL, '/foo/index.html' )
        self.assertEqual( r.response.base, '/foo/' )
Beispiel #21
0
    def testCSRF(self):
        """ test CSRF check on data clear """

        # create a saver and add a record
        self.ff1.invokeFactory('FormSaveDataAdapter', 'saver')
        saver = self.ff1.saver
        self.ff1.setActionAdapter(('saver', ))
        request = FakeRequest(topic='test subject',
                              replyto='*****@*****.**',
                              comments='test comments')
        errors = self.ff1.fgvalidate(REQUEST=request)
        self.assertEqual(errors, {})

        # for the rest of this test, we need a bit more serious request simulation
        environ = {}
        environ.setdefault('SERVER_NAME', 'foo')
        environ.setdefault('SERVER_PORT', '80')
        environ.setdefault('REQUEST_METHOD', 'POST')
        request = HTTPRequest(sys.stdin, environ,
                              HTTPResponse(stdout=sys.stdout))

        # clearSavedFormInput is part of the API, so it should work if there's no
        # request
        saver.clearSavedFormInput()

        # But, if this is from a form, we should need a valid authenticator
        request.form = {
            'clearSavedFormInput': '1',
        }
        self.assertRaises(zExceptions.Forbidden, saver.clearSavedFormInput,
                          **{'request': request})

        # with authenticator... no error
        tag = AuthenticatorView('context', 'request').authenticator()
        token = tag.split('"')[5]
        request.form['_authenticator'] = token
        saver.clearSavedFormInput(request=request)
Beispiel #22
0
    def test_LastModified(self):
        from plone.app.caching.operations.etags import LastModified

        mod = datetime(2010, 1, 2, 3, 4, 5, 6, tzlocal())
        utcStamp = time.mktime(mod.utctimetuple())

        @implementer(ILastModified)
        @adapter(DummyPublished)
        class DummyLastModified(object):
            def __init__(self, context):
                self.context = context

            def __call__(self):
                return mod

        provideAdapter(DummyLastModified)

        environ = {'SERVER_NAME': 'example.com', 'SERVER_PORT': '80'}
        response = HTTPResponse()
        request = HTTPRequest(StringIO(), environ, response)
        published = DummyPublished(DummyContext())

        etag = LastModified(published, request)
        self.assertEqual(str(utcStamp), etag())
 def test_setHeader_drops_LF(self):
     from ZPublisher.HTTPResponse import HTTPResponse
     response = HTTPResponse()
     response.setHeader('Location', 'http://www.ietf.org/rfc/\nrfc2616.txt')
     self.assertEqual(response.headers['location'],
                      'http://www.ietf.org/rfc/rfc2616.txt')
Beispiel #24
0
 def _createResponse(self):
     return HTTPResponse()
Beispiel #25
0
def get_fake_request():
    return HTTPRequest(StringIO.StringIO(), {
        'SERVER_NAME': 'jucon',
        'SERVER_PORT': '8080'
    }, HTTPResponse())
Beispiel #26
0
 def test_timeout(self):
     response = HTTPResponse()
     self.setCookie(response, "secret", "euphorie", "123", 3600)
     cookie = response.cookies['euphorie']
     self.assertTrue('expires' in cookie)
Beispiel #27
0
def process_wrapper(pid, request_body, request_environ):
    # Sets up everything we need to run a view method in a new Zope-ish
    # context, then runs it and stores the result for later retrieval.

    _process = None

    def my_mapply(object,
                  positional=(),
                  keyword={},
                  debug=None,
                  maybe=None,
                  missing_name=None,
                  handle_class=None,
                  context=None,
                  bind=0):

        if not isinstance(keyword, Mapping):
            keyword = {}
        keyword['process_id'] = pid

        args = (getattr(object, '__run__', object), )
        kwargs = dict(positional=positional,
                      keyword=keyword,
                      debug=debug,
                      maybe=maybe,
                      context=context,
                      bind=bind)
        if missing_name is not None:
            kwargs['missing_name'] = missing_name
        if handle_class is not None:
            kwargs['handle_class'] = handle_class
        return mapply(*args, **kwargs)

    response = HTTPResponse(stdout=StringIO(), stderr=StringIO())
    request = HTTPRequest(StringIO(request_body), request_environ, response)

    request.set('process_id', pid)

    import Zope2
    app = Zope2.bobo_application.__bobo_traverse__(request)
    reg = getProcessRegistry(app)
    _process = reg.get(pid)

    # Run
    try:
        try:
            response = publish(request, 'Zope2', [None], mapply=my_mapply)

            # We can't just pass the response back, as the data streams will not
            # be set up right.
            attr = (hasattr(response, 'cookies') and 'cookies') or \
                   (hasattr(response, '_cookies') and '_cookies')
            cookies = deepcopy(getattr(response, attr))

            if IHTTPResponse.providedBy(response):
                _process['result'] = (response.getStatus(),
                                      dict(response.getHeaders()), cookies,
                                      response.consumeBody())
            else:
                # Currently, ZPublisher.HTTPResponse doesn't implement
                # IHTTPResponse, even though HTTPRequest implements
                # IHTTPRequest.
                _process['result'] = (response.getStatus(),
                                      dict(response.headers), cookies,
                                      response.body)

        except Exception, e:
            # Set result to the exception raised
            _process['result'] = e
            raise
        else:
Beispiel #28
0
        try:
            if form.getOnOpenDocument():
                #RunFormula(self, form.getOnOpenDocument())
                valid = self.runFormulaScript("form_" + form.id + "_onopen",
                                              self, form.onOpenDocument)
        except PlominoScriptException, e:
            e.reportError('onOpen event failed')

        if not valid:
            # we use the specified form's layout
            request = getattr(self, 'REQUEST', None)
            if not request:
                import sys
                from ZPublisher.HTTPResponse import HTTPResponse
                from ZPublisher.HTTPRequest import HTTPRequest
                response = HTTPResponse(stdout=sys.stdout)
                env = {
                    'SERVER_NAME': 'fake_server',
                    'SERVER_PORT': '80',
                    'REQUEST_METHOD': 'GET'
                }
                request = HTTPRequest(sys.stdin, env, response)
            html_content = form.displayDocument(self,
                                                editmode=editmode,
                                                request=request)
        else:
            html_content = valid

        plone_tools = getToolByName(db, 'plone_utils')
        encoding = plone_tools.getSiteEncoding()
        html_content = html_content.encode(encoding)