Example #1
0
def show_external_release_file(root, request):
    """
    Download a release from a download url from its package information.
    Must be used with :func:`pyshop.helpers.download.renderer_factory`
    to download the release file.

    :return: download informations
    :rtype: dict
    """
    session = DBSession()

    settings = request.registry.settings
    whlify = asbool(settings.get('pyshop.mirror.wheelify', '0'))
    release = Release.by_id(session, int(request.matchdict['release_id']))

    filename = (release.whlify_download_url_file if whlify else
                release.download_url_file)

    rv = {'url': release.download_url,
          'filename': filename,
          'original': release.download_url_file,
          'whlify': whlify
          }

    release.downloads += 1
    release.package.downloads += 1
    session.add(release.package)
    session.add(release)
    request.response.date = datetime.datetime.utcnow()
    return rv
Example #2
0
    def authenticated_userid(self, request):

        auth = request.environ.get('HTTP_AUTHORIZATION')
        try:
            authmeth, auth = auth.split(' ', 1)
        except AttributeError:  # not enough values to unpack
            return None

        if authmeth.lower() != 'basic':
            return None

        try:
            # Python 3's string is already unicode
            auth = base64.b64decode(auth.strip())
        except binascii.Error:  # can't decode
            return None

        if not isinstance(auth, unicode):
            auth = auth.decode('utf-8')

        try:
            login, password = auth.split(':', 1)
        except ValueError:  # not enough values to unpack
            return None

        if User.by_credentials(DBSession(), login, password):
            return login

        if User.by_ldap_credentials(DBSession(), login, password,
                                    request.registry.settings):
            return login

        return None
Example #3
0
 def list_packages(self):
     """
     Retrieve a list of the package names registered with the package index.
     Returns a list of name strings.
     """
     session = DBSession()
     names = [p.name for p in Package.all(session, order_by=Package.name)]
     session.rollback()
     return names
Example #4
0
 def package_releases(self, package_name, show_hidden=False):
     """
     Retrieve a list of the releases registered for the given package_name.
     Returns a list with all version strings if show_hidden is True or
     only the non-hidden ones otherwise."""
     session = DBSession()
     releases = Release.by_package_name(session, package_name, show_hidden)
     session.rollback()
     return releases
Example #5
0
 def list_packages(self):
     """
     Retrieve a list of the package names registered with the package index.
     Returns a list of name strings.
     """
     session = DBSession()
     names = [p.name for p in Package.all(session, order_by=Package.name)]
     session.rollback()
     return names
Example #6
0
 def package_releases(self, package_name, show_hidden=False):
     """
     Retrieve a list of the releases registered for the given package_name.
     Returns a list with all version strings if show_hidden is True or
     only the non-hidden ones otherwise."""
     session = DBSession()
     releases = Release.by_package_name(session, package_name, show_hidden)
     session.rollback()
     return releases
Example #7
0
 def setUp(self):
     from pyshop.config import includeme
     from .conf import settings
     super(UnauthenticatedViewTestCase, self).setUp()
     self.maxDiff = None
     authz_policy = ACLAuthorizationPolicy()
     self.config = testing.setUp(settings=settings)
     self.config.include(includeme)
     self.session = DBSession()
     transaction.begin()
Example #8
0
 def release_downloads(self, package_name, version):
     """
     Retrieve a list of files and download count for a given package and
     release version. 
     """
     session = DBSession()
     release_files = ReleaseFile.by_release(session, package_name, version)
     if release_files:
         release_files = [(f.release.package.name,
                          f.filename) for f in release_files]
     session.rollback()
     return release_files
Example #9
0
 def user_packages(self, user):
     """
     Retrieve a list of [role_name, package_name] for a given username.
     Role is either 'Maintainer' or 'Owner'. 
     """
     session = DBSession()
     owned = Package.by_owner(session, user)
     maintained = Package.by_maintainer(session, user)
     owned = [('Owner', p.name) for p in owned]
     maintained = [('Maintainer', p.name) for p in maintained]
     session.rollback()
     return owned + maintained
Example #10
0
 def release_downloads(self, package_name, version):
     """
     Retrieve a list of files and download count for a given package and
     release version. 
     """
     session = DBSession()
     release_files = ReleaseFile.by_release(session, package_name, version)
     if release_files:
         release_files = [(f.release.package.name, f.filename)
                          for f in release_files]
     session.rollback()
     return release_files
Example #11
0
class ModelTestCase(TestCase):

    def setUp(self):
        transaction.begin()
        self.session = DBSession()
        # With SQLite3 - used for tests - 'x' LIKE 'X' returns true which is
        # not the case of, for instance, PostgreSQL. Disabling this behaviour
        # makes tests more realistic.
        self.session.execute('PRAGMA case_sensitive_like = ON')

    def tearDown(self):
        transaction.commit()
Example #12
0
 def user_packages(self, user):
     """
     Retrieve a list of [role_name, package_name] for a given username.
     Role is either 'Maintainer' or 'Owner'. 
     """
     session = DBSession()
     owned = Package.by_owner(session, user)
     maintained = Package.by_maintainer(session, user)
     owned = [('Owner', p.name) for p in owned]
     maintained = [('Maintainer', p.name) for p in maintained]
     session.rollback()
     return owned + maintained
Example #13
0
class UnauthenticatedViewTestCase(fake_filesystem_unittest.TestCase):
    def setUp(self):
        from pyshop.config import includeme
        from .conf import settings
        super(UnauthenticatedViewTestCase, self).setUp()
        self.maxDiff = None
        authz_policy = ACLAuthorizationPolicy()
        self.config = testing.setUp(settings=settings)
        self.config.include('pyramid_rpc.xmlrpc')
        self.config.include(includeme)
        self.session = DBSession()
        transaction.begin()

        # NB: testing.setUp() etc. depend on the real filesystem, so leave
        # pyfakefs setup until last.
        self.setUpPyfakefs()

    def tearDown(self):
        super(UnauthenticatedViewTestCase, self).tearDown()
        self.session.flush()
        transaction.commit()
        testing.tearDown()

    def create_request(self,
                       params=None,
                       environ=None,
                       matchdict=None,
                       headers=None,
                       path='/',
                       cookies=None,
                       post=None,
                       **kw):
        if params and not isinstance(params, MultiDict):
            mparams = MultiDict()
            for k, v in params.items():
                if isinstance(v, (list, tuple)):
                    [mparams.add(k, vv) for vv in v]
                else:
                    mparams.add(k, v)
                params = mparams
        rv = DummyRequest(params,
                          environ,
                          headers,
                          path,
                          cookies,
                          post,
                          matchdict=(matchdict or {}),
                          **kw)
        return rv

    def assertIsRedirect(self, view):
        self.assertIsInstance(view, HTTPFound)
Example #14
0
    def search(self, spec, operator='and'):
        """
        Search the package database using the indicated search spec. 

        The spec may include any of the keywords described in the above list
        (except 'stable_version' and 'classifiers'),
        for example: {'description': 'spam'} will search description fields.
        Within the spec, a field's value can be a string or a list of strings
        (the values within the list are combined with an OR),
        for example: {'name': ['foo', 'bar']}.
        Valid keys for the spec dict are listed here. Invalid keys are ignored:
            name
            version
            author
            author_email
            maintainer
            maintainer_email
            home_page
            license
            summary
            description
            keywords
            platform
            download_url 
        Arguments for different fields are combined using either "and"
        (the default) or "or".
        Example: search({'name': 'foo', 'description': 'bar'}, 'or').
        The results are returned as a list of dicts
        {'name': package name,
         'version': package release version,
         'summary': package release summary} 
        """
        api = pypi.proxy
        rv = []
        # search in proxy
        for k, v in spec.items():
            rv += api.search({k: v}, True)

        # search in local
        session = DBSession()
        release = Release.search(session, spec, operator)
        session.rollback()
        rv += [
            {
                'name': r.package.name,
                'version': r.version,
                'summary': r.summary,
                # hack https://mail.python.org/pipermail/catalog-sig/2012-October/004633.html
                '_pypi_ordering': '',
            } for r in release
        ]
        return rv
Example #15
0
def show_release_file(root, request):
    """
    Download a release file.
    Must be used with :func:`pyshop.helpers.download.renderer_factory`
    to download the release file.

    :return: download informations
    :rtype: dict
    """
    settings = request.registry.settings
    whlify = asbool(settings.get('pyshop.mirror.wheelify', '0'))
    session = DBSession()

    f = ReleaseFile.by_id(session, int(request.matchdict['file_id']))
    whlify = whlify and f.package_type == 'sdist'

    filename = f.filename_whlified if whlify else f.filename
    url = f.url
    if url and url.startswith('http://pypi.python.org'):
        url = 'https' + url[4:]

    rv = {
        'url': url,
        'filename': filename,
        'original': f.filename,
        'whlify': whlify
    }
    f.downloads += 1
    f.release.downloads += 1
    f.release.package.downloads += 1
    session.add(f.release.package)
    session.add(f.release)
    session.add(f)
    return rv
Example #16
0
    def search(self, spec, operator='and'):
        """
        Search the package database using the indicated search spec. 

        The spec may include any of the keywords described in the above list
        (except 'stable_version' and 'classifiers'),
        for example: {'description': 'spam'} will search description fields.
        Within the spec, a field's value can be a string or a list of strings
        (the values within the list are combined with an OR),
        for example: {'name': ['foo', 'bar']}.
        Valid keys for the spec dict are listed here. Invalid keys are ignored:
            name
            version
            author
            author_email
            maintainer
            maintainer_email
            home_page
            license
            summary
            description
            keywords
            platform
            download_url 
        Arguments for different fields are combined using either "and"
        (the default) or "or".
        Example: search({'name': 'foo', 'description': 'bar'}, 'or').
        The results are returned as a list of dicts
        {'name': package name,
         'version': package release version,
         'summary': package release summary} 
        """
        api = pypi.proxy
        rv = []
         # search in proxy
        for k, v in spec.items():
            rv += api.search({k: v}, True)

        # search in local
        session = DBSession()
        release = Release.search(session, spec, operator)
        session.rollback()
        rv += [{'name': r.package.name,
                'version': r.version,
                'summary': r.summary,
                # hack https://mail.python.org/pipermail/catalog-sig/2012-October/004633.html
                '_pypi_ordering':'',
                } for r in release]
        return rv
Example #17
0
    def setUp(self):
        from pyshop.config import includeme
        from .conf import settings
        super(UnauthenticatedViewTestCase, self).setUp()
        self.maxDiff = None
        authz_policy = ACLAuthorizationPolicy()
        self.config = testing.setUp(settings=settings)
        self.config.include('pyramid_rpc.xmlrpc')
        self.config.include(includeme)
        self.session = DBSession()
        transaction.begin()

        # NB: testing.setUp() etc. depend on the real filesystem, so leave
        # pyfakefs setup until last.
        self.setUpPyfakefs()
Example #18
0
 def release_urls(self, package_name, version):
     """
     Retrieve a list of download URLs for the given package release.
     Returns a list of dicts with the following keys:
         url
         packagetype ('sdist', 'bdist', etc)
         filename
         size
         md5_digest
         downloads
         has_sig
         python_version (required version, or 'source', or 'any')
         comment_text
     """
     session = DBSession()
     release_files = ReleaseFile.by_release(session, package_name, version)
     return [{
         'url': f.url,
         'packagetype': f.package_type,
         'filename': f.filename,
         'size': f.size,
         'md5_digest': f.md5_digest,
         'downloads': f.downloads,
         'has_sig': f.has_sig,
         'comment_text': f.comment_text,
         'python_version': f.python_version
     } for f in release_files]
Example #19
0
 def package_releases(self, package_name, show_hidden=False):
     """
     Retrieve a list of the releases registered for the given package_name.
     Returns a list with all version strings if show_hidden is True or
     only the non-hidden ones otherwise."""
     session = DBSession()
     package = Package.by_name(session, package_name)
     return [rel.version for rel in package.sorted_releases]
Example #20
0
def show_release_file(root, request):
    """
    Download a release file.
    Must be used with :func:`pyshop.helpers.download.renderer_factory`
    to download the release file.

    :return: download informations
    :rtype: dict
    """
    settings = request.registry.settings
    whlify = asbool(settings.get('pyshop.mirror.wheelify', '0'))
    session = DBSession()

    f = ReleaseFile.by_id(session, int(request.matchdict['file_id']))
    whlify = whlify and f.package_type == 'sdist'

    filename = f.filename_whlified if whlify else f.filename
    url = f.url
    if url and url.startswith('http://pypi.python.org'):
        url = 'https' + url[4:]

    rv = {'url': url,
          'filename': filename,
          'original': f.filename,
          'whlify': whlify
          }
    f.downloads += 1
    f.release.downloads += 1
    f.release.package.downloads += 1
    session.add(f.release.package)
    session.add(f.release)
    session.add(f)
    return rv
Example #21
0
def show_release_file(root, request):
    """
    Download a release file.
    Must be used with :func:`pyshop.helpers.download.renderer_factory`
    to download the release file.

    :return: download informations
    :rtype: dict
    """
    session = DBSession()

    f = ReleaseFile.by_id(session, int(request.matchdict['file_id']))

    url = f.url
    if url and url.startswith('http://pypi.python.org'):
        url = 'https' + url[4:]

    rv = {'url': url,
          'filename': f.filename,
          }
    f.downloads += 1
    f.release.downloads += 1
    f.release.package.downloads += 1
    session.add(f.release.package)
    session.add(f.release)
    session.add(f)
    return rv
Example #22
0
 def package_roles(self, package_name):
     """
     Retrieve a list of users and their attributes roles for a given
     package_name. Role is either 'Maintainer' or 'Owner'.
     """
     session = DBSession()
     package = Package.by_name(session, package_name)
     owners = [('Owner', o.name) for o in package.owners]
     maintainers = [('Maintainer', o.name) for o in package.maintainers]
     return owners + maintainers
Example #23
0
File: case.py Project: disko/pyshop
 def setUp(self):
     from pyshop.config import includeme
     from .conf import settings
     super(UnauthenticatedViewTestCase, self).setUp()
     self.maxDiff = None
     authz_policy = ACLAuthorizationPolicy()
     self.config = testing.setUp(settings=settings)
     self.config.include(includeme)
     self.session = DBSession()
     transaction.begin()
Example #24
0
class UnauthenticatedViewTestCase(fake_filesystem_unittest.TestCase):

    def setUp(self):
        from pyshop.config import includeme
        from .conf import settings
        super(UnauthenticatedViewTestCase, self).setUp()
        self.maxDiff = None
        authz_policy = ACLAuthorizationPolicy()
        self.config = testing.setUp(settings=settings)
        self.config.include('pyramid_rpc.xmlrpc')
        self.config.include(includeme)
        self.session = DBSession()
        transaction.begin()

        # NB: testing.setUp() etc. depend on the real filesystem, so leave
        # pyfakefs setup until last.
        self.setUpPyfakefs()

    def tearDown(self):
        super(UnauthenticatedViewTestCase, self).tearDown()
        self.session.flush()
        transaction.commit()
        testing.tearDown()

    def create_request(self, params=None, environ=None, matchdict=None,
                       headers=None,
                       path='/', cookies=None, post=None, **kw):
        if params and not isinstance(params, MultiDict):
            mparams = MultiDict()
            for k, v in params.items():
                if isinstance(v, (list, tuple)):
                    [mparams.add(k, vv) for vv in v]
                else:
                    mparams.add(k, v)
                params = mparams
        rv = DummyRequest(params, environ, headers, path, cookies,
                          post, matchdict=(matchdict or {}), **kw)
        return rv

    def assertIsRedirect(self, view):
        self.assertIsInstance(view, HTTPFound)
Example #25
0
def authbasic(request):
    """
    Authentification basic, Upload pyshop repository access
    """
    if len(request.environ.get('HTTP_AUTHORIZATION','')) > 0:
        auth = request.environ.get('HTTP_AUTHORIZATION')
        scheme, data = auth.split(None, 1)
        assert scheme.lower() == 'basic'
        data = base64.b64decode(data)
        if not isinstance(data, unicode):
            data = data.decode('utf-8')
        username, password = data.split(':', 1)
        if User.by_ldap_credentials(DBSession(), username, password, request.registry.settings):
            return HTTPFound(location=request.url)
        if User.by_credentials(DBSession(), username, password):
            return HTTPFound(location=request.url)
    return Response(status=401,
                    headerlist=[(b'WWW-Authenticate',
                                 b'Basic realm="pyshop repository access"'
                                 )],
                    )
Example #26
0
def show_external_release_file(root, request):
    """
    Download a release from a download url from its package information.
    Must be used with :func:`pyshop.helpers.download.renderer_factory`
    to download the release file.

    :return: download informations
    :rtype: dict
    """
    session = DBSession()

    settings = request.registry.settings
    whlify = asbool(settings.get('pyshop.mirror.wheelify', '0'))
    release = Release.by_id(session, int(request.matchdict['release_id']))

    filename = (release.whlify_download_url_file
                if whlify else release.download_url_file)

    rv = {
        'url': release.download_url,
        'filename': filename,
        'original': release.download_url_file,
        'whlify': whlify
    }

    release.downloads += 1
    release.package.downloads += 1
    session.add(release.package)
    session.add(release)
    request.response.date = datetime.datetime.utcnow()
    return rv
Example #27
0
def show_external_release_file(root, request):
    """
    Download a release from a download url from its package information.
    Must be used with :func:`pyshop.helpers.download.renderer_factory`
    to download the release file.

    :return: download informations
    :rtype: dict
    """
    session = DBSession()

    release = Release.by_id(session, int(request.matchdict['release_id']))

    rv = {'url': release.download_url,
          'filename': release.download_url_file,
          }

    release.downloads += 1
    release.package.downloads += 1
    session.add(release.package)
    session.add(release)
    return rv
Example #28
0
    def search(self, spec, operator='and'):
        """
        Search the package database using the indicated search spec. 

        The spec may include any of the keywords described in the above list
        (except 'stable_version' and 'classifiers'),
        for example: {'description': 'spam'} will search description fields.
        Within the spec, a field's value can be a string or a list of strings
        (the values within the list are combined with an OR),
        for example: {'name': ['foo', 'bar']}.
        Valid keys for the spec dict are listed here. Invalid keys are ignored:
            name
            version
            author
            author_email
            maintainer
            maintainer_email
            home_page
            license
            summary
            description
            keywords
            platform
            download_url 
        Arguments for different fields are combined using either "and"
        (the default) or "or".
        Example: search({'name': 'foo', 'description': 'bar'}, 'or').
        The results are returned as a list of dicts
        {'name': package name,
         'version': package release version,
         'summary': package release summary} 
        """
        session = DBSession()
        release = Release.search(session, spec, operator)
        session.rollback()
        rv = [{'name': r.package.name,
               'version': r.version,
               'summary': r.summary} for r in release]
        return rv
Example #29
0
    def setUp(self):
        from pyshop.config import includeme
        from .conf import settings
        super(UnauthenticatedViewTestCase, self).setUp()
        self.maxDiff = None
        authz_policy = ACLAuthorizationPolicy()
        self.config = testing.setUp(settings=settings)
        self.config.include('pyramid_rpc.xmlrpc')
        self.config.include(includeme)
        self.session = DBSession()
        transaction.begin()

        # NB: testing.setUp() etc. depend on the real filesystem, so leave
        # pyfakefs setup until last.
        self.setUpPyfakefs()
Example #30
0
File: case.py Project: disko/pyshop
class UnauthenticatedViewTestCase(unittest.TestCase):

    def setUp(self):
        from pyshop.config import includeme
        from .conf import settings
        super(UnauthenticatedViewTestCase, self).setUp()
        self.maxDiff = None
        authz_policy = ACLAuthorizationPolicy()
        self.config = testing.setUp(settings=settings)
        self.config.include(includeme)
        self.session = DBSession()
        transaction.begin()

    def tearDown(self):
        super(UnauthenticatedViewTestCase, self).tearDown()
        self.session.flush()
        transaction.commit()
        testing.tearDown()

    def create_request(self, params=None, environ=None, matchdict=None,
                headers=None,
                path='/', cookies=None, post=None, **kw):
        if params and not isinstance(params, MultiDict):
            mparams = MultiDict()
            for k, v in params.items():
                if hasattr(v, '__iter__'):
                    [mparams.add(k, vv) for vv in v]
                else:
                    mparams.add(k, v)
                params = mparams
        rv  = DummyRequest(params, environ, headers, path, cookies,
                post, matchdict=(matchdict or {}), **kw)
        return rv

    def assertIsRedirect(self, view):
        self.assertIsInstance(view, HTTPFound)
Example #31
0
    def browse(self, classifiers):
        """
        Retrieve a list of (name, version) pairs of all releases classified
        with all of the given classifiers. 'classifiers' must be a list of
        Trove classifier strings.

        changelog(since)
        Retrieve a list of four-tuples (name, version, timestamp, action)
        since the given timestamp. All timestamps are UTC values.
        The argument is a UTC integer seconds since the epoch.
        """
        session = DBSession()
        release = Release.by_classifiers(session, classifiers)
        rv = [(r.package.name, r.version) for r in release]
        return rv
Example #32
0
def get_release_file(root, request):
    session = DBSession()

    f = ReleaseFile.by_id(session, int(request.matchdict['file_id']))

    url = f.url
    if url and url.startswith('http://pypi.python.org'):
        url = 'https' + url[4:]

    rv = {'id': f.id,
          'url': url,
          'filename': f.filename,
          }
    f.downloads += 1
    f.release.downloads += 1
    f.release.package.downloads += 1
    session.add(f.release.package)
    session.add(f.release)
    session.add(f)
    return rv
Example #33
0
def main(argv=sys.argv):
    if len(argv) != 2:
        usage(argv)
    config_uri = argv[1]
    settings = get_appsettings(config_uri)
    engine = create_engine('pyshop', settings, scoped=False)

    config = Configurator(settings=settings)
    config.end()

    from pyshop.models import (User, Group, Classifier, Package, Release,
                               ReleaseFile)

    session = DBSession()
    try:
        from IPython import embed
        from IPython.config.loader import Config
        cfg = Config()
        cfg.InteractiveShellEmbed.confirm_exit = False
        embed(config=cfg, banner1="Welcome to PyShop shell.")
    except ImportError:
        import code
        code.interact("pyshop shell", local=locals())
Example #34
0
def setUpModule():

    engine = create_engine(settings)
    populate(engine, interactive=False)

    session = DBSession()
    admin_user = User.by_login(session, u'admin')
    local_user = User(login=u'local_user',
                      password=u'secret',
                      local=True,
                      firstname=u'Local',
                      lastname=u'User')
    local_user.groups.append(Group.by_name(session, u'developer'))
    jdo = User(login=u'johndo', local=False)
    jdoe = User(login=u'janedoe', local=False)

    session.add(jdo)
    session.add(jdoe)
    session.add(local_user)

    classifiers_names = [
        u'Programming Language :: Python',
        u'Programming Language :: Python :: 2.6',
        u'Programming Language :: Python :: 2.7',
        u'Topic :: Software Development',
        u'Topic :: System :: Archiving :: Mirroring',
        u'Topic :: System :: Archiving :: Packaging',
        u'Intended Audience :: Developers',
        u'Intended Audience :: System Administrators'
    ]
    classifiers = [
        Classifier.by_name(session, name=c, create_if_not_exists=True)
        for c in classifiers_names
    ]

    pack1 = Package(name=u'mirrored_package1')
    pack1.owners.append(jdo)
    pack1.owners.append(jdoe)
    pack1.downloads = 7
    session.add(pack1)

    release1 = Release(package=pack1,
                       version=u'0.1',
                       summary=u'Common Usage Library',
                       author=jdoe)
    for c in classifiers[:3]:
        release1.classifiers.append(c)
    session.add(release1)
    release1.files.append(
        ReleaseFile(filename=u'mirrored_package1-0.1.tar.gz',
                    package_type=u'sdist'))
    session.add(release1)

    release2 = Release(package=pack1,
                       version=u'0.2',
                       summary=u'Common Usage Library')
    for c in classifiers[:5]:
        release2.classifiers.append(c)
    release2.files.append(
        ReleaseFile(filename=u'mirrored_package1-0.2.tar.gz',
                    package_type=u'sdist'))
    release2.files.append(
        ReleaseFile(filename=u'mirrored_package1-0.2.egg',
                    package_type=u'bdist_egg'))
    session.add(release2)

    pack2 = Package(name=u'mirrored_package2')
    pack2.owners.append(jdo)
    pack2.maintainers.append(jdoe)
    pack2.downloads = 1
    session.add(pack2)

    release3 = Release(package=pack2,
                       version=u'1.0',
                       summary=u'Web Framework For Everybody')
    for c in classifiers[:3] + classifiers[-2:-2]:
        release3.classifiers.append(c)
    session.add(release3)
    release3.files.append(
        ReleaseFile(filename=u'mirrored_package2-1.0.tar.gz',
                    package_type=u'sdist'))
    session.add(release3)

    pack3 = Package(name=u'local_package1', local=True)
    pack3.owners.append(local_user)
    pack3.owners.append(admin_user)
    session.add(pack3)

    release4 = Release(package=pack3,
                       version=u'0.1',
                       summary=u'Pet Shop Application')
    for c in classifiers:
        release4.classifiers.append(c)
    release4.files.append(
        ReleaseFile(filename=u'local_package1-0.1.tar.gz',
                    package_type=u'sdist'))
    session.add(release4)

    session.commit()
Example #35
0
    def release_data(self, package_name, version):
        """
        Retrieve metadata describing a specific package release.
        Returns a dict with keys for:
            name
            version
            stable_version
            author
            author_email
            maintainer
            maintainer_email
            home_page
            license
            summary
            description
            keywords
            platform
            download_url
            classifiers (list of classifier strings)
            requires
            requires_dist
            provides
            provides_dist
            requires_external
            requires_python
            obsoletes
            obsoletes_dist
            project_url
            docs_url (URL of the packages.python.org docs
                      if they've been supplied)
        If the release does not exist, an empty dictionary is returned.
        """
        session = DBSession()
        release = Release.by_version(session, package_name, version)

        if release:
            result = {
                'name': release.package.name,
                'version': release.version,
                'stable_version': '',
                'author': release.author.name,
                'author_email': release.author.email,
                'home_page': release.home_page,
                'license': release.license,
                'summary': release.summary,
                'description': release.description,
                'keywords': release.keywords,
                'platform': release.platform,
                'download_url': release.download_url,
                'classifiers': [c.name for c in release.classifiers],
                #'requires': '',
                #'requires_dist': '',
                #'provides': '',
                #'provides_dist': '',
                #'requires_external': '',
                #'requires_python': '',
                #'obsoletes': '',
                #'obsoletes_dist': '',
                'bugtrack_url': release.bugtrack_url,
                'docs_url': release.docs_url,
            }

        if release.maintainer:
            result.update({
                'maintainer': release.maintainer.name,
                'maintainer_email': release.maintainer.email,
            })

        return dict([(key, val or '') for key, val in result.items()])
Example #36
0
def main(argv=sys.argv):

    session = DBSession()
    session.execute("""
    CREATE TABLE release_file_new (
            id INTEGER NOT NULL,
            created_at DATETIME,
            release_id INTEGER NOT NULL,
            filename VARCHAR(200) NOT NULL,
            md5_digest VARCHAR(50),
            size INTEGER,
            package_type VARCHAR(13) NOT NULL,
            python_version VARCHAR(25),
            url VARCHAR(1024),
            downloads INTEGER,
            has_sig BOOLEAN,
            comment_text TEXT,
            PRIMARY KEY (id),
            FOREIGN KEY(release_id) REFERENCES release (id),
            UNIQUE (filename),
            CHECK (package_type IN ('sdist', 'bdist_egg', 'bdist_msi',
                                    'bdist_dmg', 'bdist_rpm', 'bdist_dumb',
                                    'bdist_wininst', 'bdist_wheel'))
            CHECK (has_sig IN (0, 1))
    );
    """)
    session.execute("""
    INSERT INTO release_file_new (
            id, created_at, release_id, filename,
            md5_digest, size, package_type, python_version,
            url, downloads, has_sig, comment_text)
    SELECT  id, created_at, release_id, filename,
            md5_digest, size, package_type, python_version,
            url, downloads, has_sig, comment_text
    FROM release_file;
    """)
    session.execute("""
    DROP TABLE release_file;
    """)
    session.execute("""
    ALTER TABLE release_file_new RENAME TO release_file;
    """)
    session.commit()
Example #37
0
def populate(engine, interactive=True):

    Base.metadata.create_all(engine)
    session = DBSession()
    user_perm = Permission(name=u'user_view')
    admin_perm = Permission(name=u'admin_view')
    download_perm = Permission(name=u'download_releasefile')
    upload_perm = Permission(name=u'upload_releasefile')
    session.add(user_perm)
    session.add(upload_perm)
    session.add(download_perm)
    session.add(admin_perm)

    admin_group = Group(name=u'admin')
    admin_group.permissions.append(user_perm)
    admin_group.permissions.append(download_perm)
    admin_group.permissions.append(upload_perm)
    admin_group.permissions.append(admin_perm)
    session.add(admin_group)

    user_group = Group(name=u'developer')
    user_group.permissions.append(user_perm)
    user_group.permissions.append(download_perm)
    user_group.permissions.append(upload_perm)
    session.add(user_group)

    pip_group = Group(name=u'installer')
    pip_group.permissions.append(download_perm)
    session.add(pip_group)

    if interactive:
        login = (raw_input('administrator login [admin]:')
                 or 'admin')
        password = (raw_input('administrator password [changeme]:')
                    or 'changeme')
        email = (raw_input('administrator email [[email protected]]')
                 or '*****@*****.**')
        piplogin = (raw_input('installer login [pip]:') or 'pip')
        pippassword = (raw_input('installer password [changeme]:') or
                       'changeme')
    else:
        login = '******'
        password = '******'
        email = '*****@*****.**'

        piplogin = '******'
        pippassword = '******'

    admin = User(login=unicode(login),
                 password=unicode(password),
                 email=unicode(email))
    admin.groups.append(admin_group)
    session.add(admin)
    pip = User(login=unicode(piplogin),
               password=unicode(pippassword),
               )
    pip.groups.append(pip_group)
    session.add(pip)

    session.commit()
Example #38
0
 def setUp(self):
     transaction.begin()
     self.session = DBSession()
Example #39
0
def authbasic(request):
    """
    Authentification basic, Upload pyshop repository access
    """
    if len(request.environ.get('HTTP_AUTHORIZATION', '')) > 0:
        transaction.manager
        auth = request.environ.get('HTTP_AUTHORIZATION')
        scheme, data = auth.split(None, 1)
        assert scheme.lower() == 'basic'
        data = base64.b64decode(data)
        if not isinstance(data, unicode):
            data = data.decode('utf-8')
        username, password = data.split(':', 1)
        # if User.by_ldap_credentials(
        #         DBSession(), username, password, request.registry.settings):
        #     return HTTPFound(location=request.url)
        # if User.by_credentials(DBSession(), username, password):
        #     return HTTPFound(location=request.url)

        # if user:
        #     return HTTPFound(location=request.url)
        user = None
        session = DBSession()
        if request.registry.settings["pyshop.ldap.use_for_auth"]:
            user = User.by_ldap_credentials(session, username, password,
                                            request.registry.settings)
            if user:
                user = User.by_login(session, username)
            else:
                user = User.by_login(session, username)
                if user:
                    session.delete(user)
                    user = None
        else:
            user = User.by_credentials(session, username, password)

        # if user:
        #     return HTTPFound(location=request.url)

        if user:
            group_names = []
            for group in user.groups:
                group_names.append(group.name)

            transaction.commit()

            if request.matched_route:
                print("*" * 200)
                print(request.matched_route.name)
                if request.matched_route.name in ["upload_releasefile"]:
                    if not "developer" in group_names:
                        return Response(
                            status=401,
                            headerlist=[
                                (b'WWW-Authenticate',
                                 b'Basic realm="pyshop repository access"')
                            ],
                        )

                return HTTPFound(location=request.url)

            else:
                return Response(
                    status=402,
                    headerlist=[(b'WWW-Authenticate',
                                 b'Basic realm="pyshop repository access"')],
                )

    return Response(
        status=401,
        headerlist=[(b'WWW-Authenticate',
                     b'Basic realm="pyshop repository access"')],
    )
Example #40
0
def populate(engine, interactive=True):

    Base.metadata.create_all(engine)
    session = DBSession()
    if Group.by_name(session, u'admin'):
        return

    user_perm = Permission(name=u'user_view')
    admin_perm = Permission(name=u'admin_view')
    download_perm = Permission(name=u'download_releasefile')
    upload_perm = Permission(name=u'upload_releasefile')
    session.add(user_perm)
    session.add(upload_perm)
    session.add(download_perm)
    session.add(admin_perm)

    admin_group = Group(name=u'admin')
    admin_group.permissions.append(user_perm)
    admin_group.permissions.append(download_perm)
    admin_group.permissions.append(upload_perm)
    admin_group.permissions.append(admin_perm)
    session.add(admin_group)

    user_group = Group(name=u'developer')
    user_group.permissions.append(user_perm)
    user_group.permissions.append(download_perm)
    user_group.permissions.append(upload_perm)
    session.add(user_group)

    pip_group = Group(name=u'installer')
    pip_group.permissions.append(download_perm)
    session.add(pip_group)

    if interactive:
        login = (input('administrator login [admin]:') or 'admin')
        password = (input('administrator password [changeme]:') or 'changeme')
        email = (input('administrator email [[email protected]]')
                 or '*****@*****.**')
        piplogin = (input('installer login [pip]:') or 'pip')
        pippassword = (input('installer password [changeme]:') or 'changeme')
    else:
        login = '******'
        password = '******'
        email = '*****@*****.**'

        piplogin = '******'
        pippassword = '******'

    admin = User(login=unicode(login),
                 password=unicode(password),
                 email=unicode(email))
    admin.groups.append(admin_group)
    session.add(admin)
    pip = User(
        login=unicode(piplogin),
        password=unicode(pippassword),
    )
    pip.groups.append(pip_group)
    session.add(pip)

    session.commit()
Example #41
0
def setUpModule():

    engine = create_engine(settings)
    populate(engine, interactive=False)

    session = DBSession()
    admin_user = User.by_login(session, u"admin")
    local_user = User(login=u"local_user", password=u"secret", local=True, firstname=u"Local", lastname=u"User")
    local_user.groups.append(Group.by_name(session, u"developer"))
    jdo = User(login=u"johndo", local=False)
    jdoe = User(login=u"janedoe", local=False)

    session.add(jdo)
    session.add(jdoe)
    session.add(local_user)

    classifiers_names = [
        u"Programming Language :: Python",
        u"Programming Language :: Python :: 2.6",
        u"Programming Language :: Python :: 2.7",
        u"Topic :: Software Development",
        u"Topic :: System :: Archiving :: Mirroring",
        u"Topic :: System :: Archiving :: Packaging",
        u"Intended Audience :: Developers",
        u"Intended Audience :: System Administrators",
    ]
    classifiers = [Classifier.by_name(session, name=c) for c in classifiers_names]

    pack1 = Package(name=u"mirrored_package1")
    pack1.owners.append(jdo)
    pack1.owners.append(jdoe)
    pack1.downloads = 7
    session.add(pack1)

    release1 = Release(package=pack1, version=u"0.1", summary=u"Common Usage Library", author=jdoe)
    for c in classifiers[:3]:
        release1.classifiers.append(c)
    session.add(release1)
    release1.files.append(ReleaseFile(filename=u"mirrored_package1-0.1.tar.gz", package_type=u"sdist"))
    session.add(release1)

    release2 = Release(package=pack1, version=u"0.2", summary=u"Common Usage Library")
    for c in classifiers[:5]:
        release2.classifiers.append(c)
    release2.files.append(ReleaseFile(filename=u"mirrored_package1-0.2.tar.gz", package_type=u"sdist"))
    release2.files.append(ReleaseFile(filename=u"mirrored_package1-0.2.egg", package_type=u"bdist_egg"))
    session.add(release2)

    pack2 = Package(name=u"mirrored_package2")
    pack2.owners.append(jdo)
    pack2.maintainers.append(jdoe)
    pack2.downloads = 1
    session.add(pack2)

    release3 = Release(package=pack2, version=u"1.0", summary=u"Web Framework For Everybody")
    for c in classifiers[:3] + classifiers[-2:-2]:
        release3.classifiers.append(c)
    session.add(release3)
    release3.files.append(ReleaseFile(filename=u"mirrored_package2-1.0.tar.gz", package_type=u"sdist"))
    session.add(release3)

    pack3 = Package(name=u"local_package1", local=True)
    pack3.owners.append(local_user)
    pack3.owners.append(admin_user)
    session.add(pack3)

    release4 = Release(package=pack3, version=u"0.1", summary=u"Pet Shop Application")
    for c in classifiers:
        release4.classifiers.append(c)
    release4.files.append(ReleaseFile(filename=u"local_package1-0.1.tar.gz", package_type=u"sdist"))
    session.add(release4)

    session.commit()
Example #42
0
def setUpModule():

    engine = create_engine(settings)
    populate(engine, interactive=False)


    session = DBSession()
    admin_user = User.by_login(session, u'admin')
    local_user = User(login=u'local_user', password=u'secret', local=True,
                      firstname=u'Local', lastname=u'User')
    local_user.groups.append(Group.by_name(session, u'developer'))
    jdo = User(login=u'johndo', local=False)
    jdoe = User(login=u'janedoe', local=False)

    session.add(jdo)
    session.add(jdoe)
    session.add(local_user)

    classifiers_names = [u'Programming Language :: Python',
                         u'Programming Language :: Python :: 2.6',
                         u'Programming Language :: Python :: 2.7',
                         u'Topic :: Software Development',
                         u'Topic :: System :: Archiving :: Mirroring',
                         u'Topic :: System :: Archiving :: Packaging',
                         u'Intended Audience :: Developers',
                         u'Intended Audience :: System Administrators'
                         ]
    classifiers = [Classifier.by_name(session, name=c,
                                      create_if_not_exists=True)
                   for c in classifiers_names]

    pack1 = Package(name=u'mirrored_package1')
    pack1.owners.append(jdo)
    pack1.owners.append(jdoe)
    pack1.downloads = 7
    session.add(pack1)

    release1 = Release(package=pack1, version=u'0.1',
                       summary=u'Common Usage Library',
                       author=jdoe)
    for c in classifiers[:3]:
        release1.classifiers.append(c)
    session.add(release1)
    release1.files.append(ReleaseFile(filename=u'mirrored_package1-0.1.tar.gz',
                                      package_type=u'sdist'))
    session.add(release1)

    release2 = Release(package=pack1, version=u'0.2',
                       summary=u'Common Usage Library')
    for c in classifiers[:5]:
        release2.classifiers.append(c)
    release2.files.append(ReleaseFile(filename=u'mirrored_package1-0.2.tar.gz',
                                      package_type=u'sdist'))
    release2.files.append(ReleaseFile(filename=u'mirrored_package1-0.2.egg',
                                      package_type=u'bdist_egg'))
    session.add(release2)

    pack2 = Package(name=u'mirrored_package2')
    pack2.owners.append(jdo)
    pack2.maintainers.append(jdoe)
    pack2.downloads = 1
    session.add(pack2)

    release3 = Release(package=pack2, version=u'1.0',
                       summary=u'Web Framework For Everybody')
    for c in classifiers[:3] + classifiers[-2:-2]:
        release3.classifiers.append(c)
    session.add(release3)
    release3.files.append(ReleaseFile(filename=u'mirrored_package2-1.0.tar.gz',
                                      package_type=u'sdist'))
    session.add(release3)

    pack3 = Package(name=u'local_package1', local=True)
    pack3.owners.append(local_user)
    pack3.owners.append(admin_user)
    session.add(pack3)

    release4 = Release(package=pack3, version=u'0.1',
                       summary=u'Pet Shop Application')
    for c in classifiers:
        release4.classifiers.append(c)
    release4.files.append(ReleaseFile(filename=u'local_package1-0.1.tar.gz',
                                      package_type=u'sdist'))
    session.add(release4)

    session.commit()
Example #43
0
def main(argv=sys.argv):

    session = DBSession()

    # Create temp table
    session.execute("""
    CREATE TABLE classifier__release_new (
            classifier_id integer REFERENCES classifier ON DELETE CASCADE,
            release_id integer REFERENCES release
    );
    """)

    # Copy data to new table
    session.execute("""
    INSERT INTO classifier__release_new (
            classifier_id, release_id)
    SELECT  classifier_id, release_id
    FROM classifier__release;
    """)

    # Swap the tables
    session.execute("""
    DROP TABLE classifier__release;
    """)
    session.execute("""
    ALTER TABLE classifier__release_new RENAME TO classifier__release;
    """)
    session.commit()