Пример #1
0
 def __init__(self, *args, **kwargs):
     self.__dict__['__warning'] = kwargs.pop('warning')
     StackedObjectProxy.__init__(self, *args, **kwargs)
Пример #2
0
 def _current_obj(self, *args, **kwargs):
     warnings.warn(self.__dict__['__warning'], DeprecationWarning, 3)
     return StackedObjectProxy._current_obj(self, *args, **kwargs)
Пример #3
0
 def _current_obj(*args, **kwargs):
     warnings.warn(pylons_h_warning, DeprecationWarning, 3)
     return StackedObjectProxy._current_obj(*args, **kwargs)
Пример #4
0
 def _push_object(self, obj):
     warnings.warn('paste.wsgiwrappers.settings is deprecated: Please use '
                   'paste.wsgiwrappers.WSGIRequest.defaults instead',
                   DeprecationWarning, 3)
     WSGIResponse.defaults._push_object(obj)
     StackedObjectProxy._push_object(self, obj)
Пример #5
0
import warnings

try:
    from paste.registry import StackedObjectProxy
    beaker_session = StackedObjectProxy(name="Beaker Session")
    beaker_cache = StackedObjectProxy(name="Cache Manager")
except:
    beaker_cache = None
    beaker_session = None

from beaker.cache import CacheManager
from beaker.session import Session, SessionObject
from beaker.util import coerce_cache_params, coerce_session_params, \
    parse_cache_config_options


class CacheMiddleware(object):
    cache = beaker_cache

    def __init__(self, app, config=None, environ_key='beaker.cache', **kwargs):
        """Initialize the Cache Middleware

        The Cache middleware will make a CacheManager instance available
        every request under the ``environ['beaker.cache']`` key by
        default. The location in environ can be changed by setting
        ``environ_key``.

        ``config``
            dict  All settings should be prefixed by 'cache.'. This
            method of passing variables is intended for Paste and other
            setups that accumulate multiple component settings in a
Пример #6
0
class WSGIResponse(object):
    """A basic HTTP response with content, headers, and out-bound cookies

    The class variable ``defaults`` specifies default values for
    ``content_type``, ``charset`` and ``errors``. These can be overridden
    for the current request via the registry.

    """
    defaults = StackedObjectProxy(
        default=dict(content_type='text/html',
                     charset='utf-8',
                     errors='strict',
                     headers={'Cache-Control': 'no-cache'}))

    def __init__(self, content='', mimetype=None, code=200):
        self._iter = None
        self._is_str_iter = True

        self.content = content
        self.headers = HeaderDict()
        self.cookies = SimpleCookie()
        self.status_code = code

        defaults = self.defaults._current_obj()
        if not mimetype:
            mimetype = defaults.get('content_type', 'text/html')
            charset = defaults.get('charset')
            if charset:
                mimetype = '%s; charset=%s' % (mimetype, charset)
        self.headers.update(defaults.get('headers', {}))
        self.headers['Content-Type'] = mimetype
        self.errors = defaults.get('errors', 'strict')

    def __str__(self):
        """Returns a rendition of the full HTTP message, including headers.

        When the content is an iterator, the actual content is replaced with the
        output of str(iterator) (to avoid exhausting the iterator).
        """
        if self._is_str_iter:
            content = ''.join(self.get_content())
        else:
            content = str(self.content)
        return '\n'.join(['%s: %s' % (key, value)
            for key, value in self.headers.headeritems()]) \
            + '\n\n' + content

    def __call__(self, environ, start_response):
        """Convenience call to return output and set status information
        
        Conforms to the WSGI interface for calling purposes only.
        
        Example usage:
        
        .. code-block:: Python

            def wsgi_app(environ, start_response):
                response = WSGIResponse()
                response.write("Hello world")
                response.headers['Content-Type'] = 'latin1'
                return response(environ, start_response)
        
        """
        status_text = STATUS_CODE_TEXT[self.status_code]
        status = '%s %s' % (self.status_code, status_text)
        response_headers = self.headers.headeritems()
        for c in self.cookies.values():
            response_headers.append(('Set-Cookie', c.output(header='')))
        start_response(status, response_headers)
        is_file = isinstance(self.content, file)
        if 'wsgi.file_wrapper' in environ and is_file:
            return environ['wsgi.file_wrapper'](self.content)
        elif is_file:
            return iter(lambda: self.content.read(), '')
        return self.get_content()

    def determine_charset(self):
        """
        Determine the encoding as specified by the Content-Type's charset
        parameter, if one is set
        """
        charset_match = _CHARSET_RE.match(self.headers.get('Content-Type', ''))
        if charset_match:
            return charset_match.group(1)

    def has_header(self, header):
        """
        Case-insensitive check for a header
        """
        warnings.warn(
            'WSGIResponse.has_header is deprecated, use '
            'WSGIResponse.headers.has_key instead', DeprecationWarning, 2)
        return self.headers.has_key(header)

    def set_cookie(self,
                   key,
                   value='',
                   max_age=None,
                   expires=None,
                   path='/',
                   domain=None,
                   secure=None):
        """
        Define a cookie to be sent via the outgoing HTTP headers
        """
        self.cookies[key] = value
        for var_name, var_value in [('max_age', max_age), ('path', path),
                                    ('domain', domain), ('secure', secure),
                                    ('expires', expires)]:
            if var_value is not None and var_value is not False:
                self.cookies[key][var_name.replace('_', '-')] = var_value

    def delete_cookie(self, key, path='/', domain=None):
        """
        Notify the browser the specified cookie has expired and should be
        deleted (via the outgoing HTTP headers)
        """
        self.cookies[key] = ''
        if path is not None:
            self.cookies[key]['path'] = path
        if domain is not None:
            self.cookies[key]['domain'] = path
        self.cookies[key]['expires'] = 0
        self.cookies[key]['max-age'] = 0

    def _set_content(self, content):
        if hasattr(content, '__iter__'):
            self._iter = content
            if isinstance(content, list):
                self._is_str_iter = True
            else:
                self._is_str_iter = False
        else:
            self._iter = [content]
            self._is_str_iter = True

    content = property(lambda self: self._iter,
                       _set_content,
                       doc='Get/set the specified content, where content can '
                       'be: a string, a list of strings, a generator function '
                       'that yields strings, or an iterable object that '
                       'produces strings.')

    def get_content(self):
        """
        Returns the content as an iterable of strings, encoding each element of
        the iterator from a Unicode object if necessary.
        """
        charset = self.determine_charset()
        if charset:
            return encode_unicode_app_iter(self.content, charset, self.errors)
        else:
            return self.content

    def wsgi_response(self):
        """
        Return this WSGIResponse as a tuple of WSGI formatted data, including:
        (status, headers, iterable)
        """
        status_text = STATUS_CODE_TEXT[self.status_code]
        status = '%s %s' % (self.status_code, status_text)
        response_headers = self.headers.headeritems()
        for c in self.cookies.values():
            response_headers.append(('Set-Cookie', c.output(header='')))
        return status, response_headers, self.get_content()

    # The remaining methods partially implement the file-like object interface.
    # See http://docs.python.org/lib/bltin-file-objects.html
    def write(self, content):
        if not self._is_str_iter:
            raise IOError, "This %s instance's content is not writable: (content " \
                'is an iterator)' % self.__class__.__name__
        self.content.append(content)

    def flush(self):
        pass

    def tell(self):
        if not self._is_str_iter:
            raise IOError, 'This %s instance cannot tell its position: (content ' \
                'is an iterator)' % self.__class__.__name__
        return sum([len(chunk) for chunk in self._iter])

    ########################################
    ## Content-type and charset

    def charset__get(self):
        """
        Get/set the charset (in the Content-Type)
        """
        header = self.headers.get('content-type')
        if not header:
            return None
        match = _CHARSET_RE.search(header)
        if match:
            return match.group(1)
        return None

    def charset__set(self, charset):
        if charset is None:
            del self.charset
            return
        try:
            header = self.headers.pop('content-type')
        except KeyError:
            raise AttributeError(
                "You cannot set the charset when on content-type is defined")
        match = _CHARSET_RE.search(header)
        if match:
            header = header[:match.start()] + header[match.end():]
        header += '; charset=%s' % charset
        self.headers['content-type'] = header

    def charset__del(self):
        try:
            header = self.headers.pop('content-type')
        except KeyError:
            # Don't need to remove anything
            return
        match = _CHARSET_RE.search(header)
        if match:
            header = header[:match.start()] + header[match.end():]
        self.headers['content-type'] = header

    charset = property(charset__get,
                       charset__set,
                       charset__del,
                       doc=charset__get.__doc__)

    def content_type__get(self):
        """
        Get/set the Content-Type header (or None), *without* the
        charset or any parameters.

        If you include parameters (or ``;`` at all) when setting the
        content_type, any existing parameters will be deleted;
        otherwise they will be preserved.
        """
        header = self.headers.get('content-type')
        if not header:
            return None
        return header.split(';', 1)[0]

    def content_type__set(self, value):
        if ';' not in value:
            header = self.headers.get('content-type', '')
            if ';' in header:
                params = header.split(';', 1)[1]
                value += ';' + params
        self.headers['content-type'] = value

    def content_type__del(self):
        try:
            del self.headers['content-type']
        except KeyError:
            pass

    content_type = property(content_type__get,
                            content_type__set,
                            content_type__del,
                            doc=content_type__get.__doc__)
Пример #7
0
__all__ = ['app_globals', 'cache', 'config', 'request', 'response',
           'session', 'tmpl_context', 'url']

def __figure_version():
    try:
        from pkg_resources import require
        import os
        # NOTE: this only works when the package is either installed,
        # or has an .egg-info directory present (i.e. wont work with raw
        # SVN checkout)
        info = require('pylons')[0]
        if os.path.dirname(os.path.dirname(__file__)) == info.location:
            return info.version
        else:
            return '(not installed)'
    except:
        return '(not installed)'
        
__version__ = __figure_version()

app_globals = StackedObjectProxy(name="app_globals")
cache = StackedObjectProxy(name="cache")
request = StackedObjectProxy(name="request")
response = StackedObjectProxy(name="response")
session = StackedObjectProxy(name="session")
tmpl_context = StackedObjectProxy(name="tmpl_context or C")
url = StackedObjectProxy(name="url")

translator = StackedObjectProxy(name="translator")
Пример #8
0
from facebook import Facebook

__docformat__ = "restructuredtext"


# Setup Paste, if available.  This needs to stay in the same module as
# FacebookWSGIMiddleware below.

try:
    from paste.registry import StackedObjectProxy
    from webob.exc import _HTTPMove
    from paste.util.quoting import strip_html, html_quote, no_quote
except ImportError:
    pass
else:
    facebook = StackedObjectProxy(name="PyFacebook Facebook Connection")


    class CanvasRedirect(_HTTPMove):

        """This is for canvas redirects."""

        title = "See Other"
        code = 200
        template = '<fb:redirect url="%(location)s" />'

        def html(self, environ):
            """ text/html representation of the exception """
            body = self.make_body(environ, self.template, html_quote, no_quote)
            return body
Пример #9
0
import Cookie
from datetime import datetime, timedelta
import hmac
import md5
import os
import random
import re
import sys
import time
import UserDict
import warnings

try:
    from paste.registry import StackedObjectProxy
    beaker_session = StackedObjectProxy(name="Beaker Session")
except:
    beaker_session = None

from beaker.container import namespace_registry
from beaker.util import coerce_session_params

__all__ = ['SignedCookie', 'Session']


class SignedCookie(Cookie.BaseCookie):
    "extends python cookie to give digital signature support"

    def __init__(self, secret, input=None):
        self.secret = secret
        Cookie.BaseCookie.__init__(self, input)
Пример #10
0
from linotp.lib.ext.pbkdf2 import PBKDF2

from Cryptodome.Hash import HMAC
from Cryptodome.Hash import SHA as SHA1
from Cryptodome.Hash import SHA256 as SHA256

from linotp.lib.ocra import OcraSuite
from linotp.lib.crypt import kdf2, createActivationCode, check
from linotp.lib.crypt import geturandom
from linotp.lib.crypt import encrypt, decrypt

from linotp.lib.crypt import check

from paste.registry import RegistryManager, StackedObjectProxy
myglobal = StackedObjectProxy()

from linotp.tests import *
from linotp.lib.selftest import isSelfTest
from simplejson import loads

from datetime import datetime
from datetime import timedelta
import time
import os

try:
    import json
except ImportError:
    import simplejson as json
Пример #11
0
class WSGIRequest(object):
    """WSGI Request API Object

    This object represents a WSGI request with a more friendly interface.
    This does not expose every detail of the WSGI environment, and attempts
    to express nothing beyond what is available in the environment
    dictionary.

    The only state maintained in this object is the desired ``charset``,
    its associated ``errors`` handler, and the ``decode_param_names``
    option.

    The incoming parameter values will be automatically coerced to unicode
    objects of the ``charset`` encoding when ``charset`` is set. The
    incoming parameter names are not decoded to unicode unless the
    ``decode_param_names`` option is enabled.

    When unicode is expected, ``charset`` will overridden by the the
    value of the ``Content-Type`` header's charset parameter if one was
    specified by the client.

    The class variable ``defaults`` specifies default values for
    ``charset``, ``errors``, and ``langauge``. These can be overridden for the
    current request via the registry.

    The ``language`` default value is considered the fallback during i18n
    translations to ensure in odd cases that mixed languages don't occur should
    the ``language`` file contain the string but not another language in the
    accepted languages list. The ``language`` value only applies when getting
    a list of accepted languages from the HTTP Accept header.

    This behavior is duplicated from Aquarium, and may seem strange but is
    very useful. Normally, everything in the code is in "en-us".  However,
    the "en-us" translation catalog is usually empty.  If the user requests
    ``["en-us", "zh-cn"]`` and a translation isn't found for a string in
    "en-us", you don't want gettext to fallback to "zh-cn".  You want it to
    just use the string itself.  Hence, if a string isn't found in the
    ``language`` catalog, the string in the source code will be used.

    *All* other state is kept in the environment dictionary; this is
    essential for interoperability.

    You are free to subclass this object.

    """
    defaults = StackedObjectProxy(default=dict(charset=None,
                                               errors='replace',
                                               decode_param_names=False,
                                               language='en-us'))

    def __init__(self, environ):
        self.environ = environ
        # This isn't "state" really, since the object is derivative:
        self.headers = EnvironHeaders(environ)

        defaults = self.defaults._current_obj()
        self.charset = defaults.get('charset')
        if self.charset:
            # There's a charset: params will be coerced to unicode. In that
            # case, attempt to use the charset specified by the browser
            browser_charset = self.determine_browser_charset()
            if browser_charset:
                self.charset = browser_charset
        self.errors = defaults.get('errors', 'strict')
        self.decode_param_names = defaults.get('decode_param_names', False)
        self._languages = None

    body = environ_getter('wsgi.input')
    scheme = environ_getter('wsgi.url_scheme')
    method = environ_getter('REQUEST_METHOD')
    script_name = environ_getter('SCRIPT_NAME')
    path_info = environ_getter('PATH_INFO')

    def urlvars(self):
        """
        Return any variables matched in the URL (e.g.,
        ``wsgiorg.routing_args``).
        """
        if 'paste.urlvars' in self.environ:
            return self.environ['paste.urlvars']
        elif 'wsgiorg.routing_args' in self.environ:
            return self.environ['wsgiorg.routing_args'][1]
        else:
            return {}

    urlvars = property(urlvars, doc=urlvars.__doc__)

    def is_xhr(self):
        """Returns a boolean if X-Requested-With is present and a XMLHttpRequest"""
        return self.environ.get('HTTP_X_REQUESTED_WITH',
                                '') == 'XMLHttpRequest'

    is_xhr = property(is_xhr, doc=is_xhr.__doc__)

    def host(self):
        """Host name provided in HTTP_HOST, with fall-back to SERVER_NAME"""
        return self.environ.get('HTTP_HOST', self.environ.get('SERVER_NAME'))

    host = property(host, doc=host.__doc__)

    def languages(self):
        """Return a list of preferred languages, most preferred first.

        The list may be empty.
        """
        if self._languages is not None:
            return self._languages
        acceptLanguage = self.environ.get('HTTP_ACCEPT_LANGUAGE')
        langs = ACCEPT_LANGUAGE.parse(self.environ)
        fallback = self.defaults.get('language', 'en-us')
        if not fallback:
            return langs
        if fallback not in langs:
            langs.append(fallback)
        index = langs.index(fallback)
        langs[index + 1:] = []
        self._languages = langs
        return self._languages

    languages = property(languages, doc=languages.__doc__)

    def _GET(self):
        return parse_dict_querystring(self.environ)

    def GET(self):
        """
        Dictionary-like object representing the QUERY_STRING
        parameters. Always present, if possibly empty.

        If the same key is present in the query string multiple times, a
        list of its values can be retrieved from the ``MultiDict`` via
        the ``getall`` method.

        Returns a ``MultiDict`` container or a ``UnicodeMultiDict`` when
        ``charset`` is set.
        """
        params = self._GET()
        if self.charset:
            params = UnicodeMultiDict(params,
                                      encoding=self.charset,
                                      errors=self.errors,
                                      decode_keys=self.decode_param_names)
        return params

    GET = property(GET, doc=GET.__doc__)

    def _POST(self):
        return parse_formvars(self.environ, include_get_vars=False)

    def POST(self):
        """Dictionary-like object representing the POST body.

        Most values are encoded strings, or unicode strings when
        ``charset`` is set. There may also be FieldStorage objects
        representing file uploads. If this is not a POST request, or the
        body is not encoded fields (e.g., an XMLRPC request) then this
        will be empty.

        This will consume wsgi.input when first accessed if applicable,
        but the raw version will be put in
        environ['paste.parsed_formvars'].

        Returns a ``MultiDict`` container or a ``UnicodeMultiDict`` when
        ``charset`` is set.
        """
        params = self._POST()
        if self.charset:
            params = UnicodeMultiDict(params,
                                      encoding=self.charset,
                                      errors=self.errors,
                                      decode_keys=self.decode_param_names)
        return params

    POST = property(POST, doc=POST.__doc__)

    def params(self):
        """Dictionary-like object of keys from POST, GET, URL dicts

        Return a key value from the parameters, they are checked in the
        following order: POST, GET, URL

        Additional methods supported:

        ``getlist(key)``
            Returns a list of all the values by that key, collected from
            POST, GET, URL dicts

        Returns a ``MultiDict`` container or a ``UnicodeMultiDict`` when
        ``charset`` is set.
        """
        params = MultiDict()
        params.update(self._POST())
        params.update(self._GET())
        if self.charset:
            params = UnicodeMultiDict(params,
                                      encoding=self.charset,
                                      errors=self.errors,
                                      decode_keys=self.decode_param_names)
        return params

    params = property(params, doc=params.__doc__)

    def cookies(self):
        """Dictionary of cookies keyed by cookie name.

        Just a plain dictionary, may be empty but not None.

        """
        return get_cookie_dict(self.environ)

    cookies = property(cookies, doc=cookies.__doc__)

    def determine_browser_charset(self):
        """
        Determine the encoding as specified by the browser via the
        Content-Type's charset parameter, if one is set
        """
        charset_match = _CHARSET_RE.search(self.headers.get(
            'Content-Type', ''))
        if charset_match:
            return charset_match.group(1)

    def match_accept(self, mimetypes):
        """Return a list of specified mime-types that the browser's HTTP Accept
        header allows in the order provided."""
        return desired_matches(mimetypes,
                               self.environ.get('HTTP_ACCEPT', '*/*'))

    def __repr__(self):
        """Show important attributes of the WSGIRequest"""
        pf = pformat
        msg = '<%s.%s object at 0x%x method=%s,' % \
            (self.__class__.__module__, self.__class__.__name__,
             id(self), pf(self.method))
        msg += '\nscheme=%s, host=%s, script_name=%s, path_info=%s,' % \
            (pf(self.scheme), pf(self.host), pf(self.script_name),
             pf(self.path_info))
        msg += '\nlanguages=%s,' % pf(self.languages)
        if self.charset:
            msg += ' charset=%s, errors=%s,' % (pf(
                self.charset), pf(self.errors))
        msg += '\nGET=%s,' % pf(self.GET)
        msg += '\nPOST=%s,' % pf(self.POST)
        msg += '\ncookies=%s>' % pf(self.cookies)
        return msg
Пример #12
0
feed_storage = None

# All loaded moksha applications
_apps = None

# All loaded ToscaWidgets
_widgets = None

# All WSGI applications
wsgiapps = None

# All loaded moksha menus
menus = None

# Per-request topic callbacks registered by rendered live widgets
livewidgets = StackedObjectProxy(name="livewidgets")


def get_widget(name):
    """ Get a widget instance by name """
    if _widgets:
        return _widgets[name]['widget']


def get_widgets():
    """ Return a dictionary of all widgets """
    from pkg_resources import iter_entry_points
    return _widgets or [
        widget.load() for widget in iter_entry_points('moksha.widget')
    ]
Пример #13
0
from blazeweb.globals import settings, rg
from blazeweb.hierarchy import visitmods
from blazeweb.utils import registry_has_object
from paste.registry import StackedObjectProxy
from sqlalchemy import engine_from_config, MetaData
from sqlalchemy.orm import sessionmaker, scoped_session, Session

db = StackedObjectProxy(name="db")


class DebugSession(Session):
    """
        This was helpful in troubleshooting a deadlock condition that
        occured during testing.
    """
    def __init__(self, *args, **kwargs):
        self.dbg_label = kwargs.pop('dbg_label')
        Session.__init__(self, *args, **kwargs)

    def execute(self, clause, params=None, mapper=None, **kw):
        try:
            print('E>>> ' + self.dbg_label)
            return Session.execute(self, clause, params, mapper, **kw)
        finally:
            print('<<<E')

    def _flush(self, objects=None):
        try:
            print('>>>F ' + self.dbg_label)
            return Session._flush(self, objects)
        finally:
Пример #14
0
 def _current_obj(*args, **kwargs):
     warnings.warn(pylons_h_warning, DeprecationWarning, 3)
     return StackedObjectProxy._current_obj(*args, **kwargs)
Пример #15
0
# -*- coding: utf-8 -*-
"""The allura package"""
from paste.registry import StackedObjectProxy

credentials = StackedObjectProxy(name='credentials')