Ejemplo n.º 1
0
def _serve_symlink_docs(request, project, privacy_level, filename=''):
    """Serve a file by symlink, or a 404 if not found."""
    # Handle indexes
    if filename == '' or filename[-1] == '/':
        filename += 'index.html'

    # This breaks path joining, by ignoring the root when given an "absolute" path
    if filename[0] == '/':
        filename = filename[1:]

    log.info('Serving %s for %s', filename, project)

    files_tried = []

    if (settings.DEBUG or constants.PUBLIC in settings.SERVE_DOCS) and privacy_level != constants.PRIVATE:  # yapf: disable  # noqa
        public_symlink = PublicSymlink(project)
        basepath = public_symlink.project_root
        if os.path.exists(os.path.join(basepath, filename)):
            return _serve_file(request, filename, basepath)

        files_tried.append(os.path.join(basepath, filename))

    if (settings.DEBUG or constants.PRIVATE in settings.SERVE_DOCS) and privacy_level == constants.PRIVATE:  # yapf: disable  # noqa
        # Handle private
        private_symlink = PrivateSymlink(project)
        basepath = private_symlink.project_root

        if os.path.exists(os.path.join(basepath, filename)):
            return _serve_file(request, filename, basepath)

        files_tried.append(os.path.join(basepath, filename))

    raise Http404(
        'File not found. Tried these files: {}'.format(
            ','.join(files_tried)), )
Ejemplo n.º 2
0
 def test_symlink_single_version_missing(self):
     project = get(Project)
     project.versions.update(privacy_level='private')
     symlink = PublicSymlink(project)
     # Set because *something* triggers project symlinking on get(Project)
     self.commands = []
     symlink.symlink_single_version()
     self.assertEqual([], self.commands)
 def setUp(self):
     super(TestPublicSymlinkUnicode, self).setUp()
     self.project = get(Project, slug='kong', name=u'foo-∫',
                        main_language_project=None)
     self.project.save()
     self.stable = get(Version, slug='foo-a', verbose_name=u'foo-∂',
                       active=True, project=self.project)
     self.symlink = PublicSymlink(self.project)
Ejemplo n.º 4
0
 def setUp(self):
     self.project = get(Project, slug='kong')
     self.subproject = get(Project, slug='sub')
     self.symlink = PublicSymlink(self.project)
     self.args = {
         'web_root': self.symlink.WEB_ROOT,
         'subproject_root': self.symlink.subproject_root,
     }
     self.commands = []
Ejemplo n.º 5
0
 def setUp(self):
     self.project = get(Project, slug='kong')
     self.version = get(Version,
                        verbose_name='latest',
                        active=True,
                        project=self.project)
     self.symlink = PublicSymlink(self.project)
     self.args = {
         'cname_root': self.symlink.CNAME_ROOT,
         'project_root': self.symlink.project_root,
     }
     self.commands = []
Ejemplo n.º 6
0
 def setUp(self):
     self.project = get(Project, slug='kong')
     self.version = get(Version,
                        verbose_name='latest',
                        active=True,
                        project=self.project)
     self.symlink = PublicSymlink(self.project)
     self.args = {
         'project_root': self.symlink.project_root,
         'doc_path': self.project.rtd_build_path(),
     }
     self.commands = []
Ejemplo n.º 7
0
def robots_txt(request, project):
    """
    Serve custom user's defined ``/robots.txt``.

    If the user added a ``robots.txt`` in the "default version" of the project,
    we serve it directly.
    """
    # Use the ``robots.txt`` file from the default version configured
    version_slug = project.get_default_version()
    version = project.versions.get(slug=version_slug)

    no_serve_robots_txt = any([
        # If project is private or,
        project.privacy_level == constants.PRIVATE,
        # default version is private or,
        version.privacy_level == constants.PRIVATE,
        # default version is not active or,
        not version.active,
        # default version is not built
        not version.built,
    ])
    if no_serve_robots_txt:
        # ... we do return a 404
        raise Http404()

    filename = resolve_path(
        project,
        version_slug=version_slug,
        filename='robots.txt',
        subdomain=
        True,  # subdomain will make it a "full" path without a URL prefix
    )

    # This breaks path joining, by ignoring the root when given an "absolute" path
    if filename[0] == '/':
        filename = filename[1:]

    basepath = PublicSymlink(project).project_root
    fullpath = os.path.join(basepath, filename)

    if os.path.exists(fullpath):
        return HttpResponse(open(fullpath).read(), content_type='text/plain')

    sitemap_url = '{scheme}://{domain}/sitemap.xml'.format(
        scheme='https',
        domain=project.subdomain(),
    )
    return HttpResponse(
        'User-agent: *\nAllow: /\nSitemap: {}\n'.format(sitemap_url),
        content_type='text/plain',
    )
Ejemplo n.º 8
0
 def setUp(self):
     self.project = get(Project, slug='kong', name=u'foo-∫')
     self.stable = get(Version,
                       slug='stable',
                       verbose_name=u'foo-∂',
                       active=True,
                       project=self.project)
     self.symlink = PublicSymlink(self.project)
     self.args = {
         'project_root': self.symlink.project_root,
         'latest_path': self.project.rtd_build_path('latest'),
         'stable_path': self.project.rtd_build_path('stable'),
     }
     self.commands = []
Ejemplo n.º 9
0
    def resolve_404_path(project,
                         version_slug=None,
                         language=None,
                         filename='404.html'):
        """
        Helper to resolve the path of ``404.html`` for project.

        The resolution is based on ``project`` object, version slug and
        language.

        :returns: tuple containing the (basepath, filename)
        :rtype: tuple
        """
        filename = resolve_path(
            project,
            version_slug=version_slug,
            language=language,
            filename=filename,
            subdomain=
            True,  # subdomain will make it a "full" path without a URL prefix
        )

        # This breaks path joining, by ignoring the root when given an "absolute" path
        if filename[0] == '/':
            filename = filename[1:]

        version = None
        if version_slug:
            version_qs = project.versions.filter(slug=version_slug)
            if version_qs.exists():
                version = version_qs.first()

        private = any([
            version and version.privacy_level == PRIVATE,
            not version and project.privacy_level == PRIVATE,
        ])
        if private:
            symlink = PrivateSymlink(project)
        else:
            symlink = PublicSymlink(project)
        basepath = symlink.project_root
        fullpath = os.path.join(basepath, filename)
        return (basepath, filename, fullpath)
Ejemplo n.º 10
0
def _serve_symlink_docs(request, project, privacy_level, filename=''):

    # Handle indexes
    if filename == '' or filename[-1] == '/':
        filename += 'index.html'

    # This breaks path joining, by ignoring the root when given an "absolute" path
    if filename[0] == '/':
        filename = filename[1:]

    log.info('Serving %s for %s' % (filename, project))

    files_tried = []

    serve_docs = getattr(settings, 'SERVE_DOCS', [constants.PRIVATE])

    if (settings.DEBUG or constants.PUBLIC
            in serve_docs) and privacy_level != constants.PRIVATE:
        public_symlink = PublicSymlink(project)
        basepath = public_symlink.project_root
        if os.path.exists(os.path.join(basepath, filename)):
            return _serve_file(request, filename, basepath)
        else:
            files_tried.append(os.path.join(basepath, filename))

    if (settings.DEBUG or constants.PRIVATE
            in serve_docs) and privacy_level == constants.PRIVATE:

        # Handle private
        private_symlink = PrivateSymlink(project)
        basepath = private_symlink.project_root

        if os.path.exists(os.path.join(basepath, filename)):
            if not AdminPermission.is_member(user=request.user, obj=project):
                return _serve_401(request, project)
            return _serve_file(request, filename, basepath)
        else:
            files_tried.append(os.path.join(basepath, filename))

    raise Http404('File not found. Tried these files: %s' %
                  ','.join(files_tried))
Ejemplo n.º 11
0
 def setUp(self):
     self.project = get(Project, slug='kong')
     self.translation = get(Project, slug='pip')
     self.translation.language = 'de'
     self.translation.main_language_project = self.project
     self.project.translations.add(self.translation)
     self.translation.save()
     self.project.save()
     self.symlink = PublicSymlink(self.project)
     get(Version, verbose_name='master', active=True, project=self.project)
     get(Version,
         verbose_name='master',
         active=True,
         project=self.translation)
     self.args = {
         'project_root':
         self.symlink.project_root,
         'translation_root':
         os.path.join(self.symlink.WEB_ROOT, self.translation.slug),
     }
     self.assertIn(self.translation, self.project.translations.all())
     self.commands = []