Ejemplo n.º 1
0
    def get_repository_hook_instructions(self, request, repository):
        """Returns instructions for setting up incoming webhooks."""
        webhook_endpoint_url = build_server_url(local_site_reverse(
            'bitbucket-hooks-close-submitted',
            local_site=repository.local_site,
            kwargs={
                'repository_id': repository.pk,
                'hosting_service_id': repository.hosting_account.service_name,
                'hooks_uuid': repository.get_or_create_hooks_uuid(),
            }))
        add_webhook_url = (
            'https://bitbucket.org/%s/%s/admin/hooks?service=POST&url=%s'
            % (self._get_repository_owner(repository),
               self._get_repository_name(repository),
               webhook_endpoint_url))

        example_id = 123
        example_url = build_server_url(local_site_reverse(
            'review-request-detail',
            local_site=repository.local_site,
            kwargs={
                'review_request_id': example_id,
            }))

        return render_to_string(
            'hostingsvcs/bitbucket/repo_hook_instructions.html',
            RequestContext(request, {
                'example_id': example_id,
                'example_url': example_url,
                'repository': repository,
                'server_url': get_server_url(),
                'add_webhook_url': add_webhook_url,
            }))
Ejemplo n.º 2
0
    def get_repository_hook_instructions(self, request, repository):
        """Returns instructions for setting up incoming webhooks."""
        webhook_endpoint_url = build_server_url(local_site_reverse(
            'googlecode-hooks-close-submitted',
            local_site=repository.local_site,
            kwargs={
                'repository_id': repository.pk,
                'hosting_service_id': repository.hosting_account.service_name,
                'hooks_uuid': repository.get_or_create_hooks_uuid(),
            }))
        add_webhook_url = (
            'https://code.google.com/p/%s/adminSource'
            % repository.extra_data['googlecode_project_name'])

        example_id = 123
        example_url = build_server_url(local_site_reverse(
            'review-request-detail',
            local_site=repository.local_site,
            kwargs={
                'review_request_id': example_id,
            }))

        return render_to_string(
            'hostingsvcs/googlecode/repo_hook_instructions.html',
            RequestContext(request, {
                'example_id': example_id,
                'example_url': example_url,
                'repository': repository,
                'server_url': get_server_url(),
                'add_webhook_url': add_webhook_url,
                'webhook_endpoint_url': webhook_endpoint_url,
            }))
Ejemplo n.º 3
0
    def test_registration_with_urls(self):
        """Testing HostingService registration with URLs"""
        register_hosting_service('dummy-service', self.DummyServiceWithURLs)

        self.assertEqual(
            local_site_reverse(
                'dummy-service-post-commit-hook',
                kwargs={
                    'repository_id': 1,
                    'hosting_service_id': 'dummy-service',
                }),
            '/repos/1/dummy-service/hooks/pre-commit/')

        self.assertEqual(
            local_site_reverse(
                'dummy-service-post-commit-hook',
                local_site_name='test-site',
                kwargs={
                    'repository_id': 1,
                    'hosting_service_id': 'dummy-service',
                }),
            '/s/test-site/repos/1/dummy-service/hooks/pre-commit/')

        # Once registered, should not be able to register again
        with self.assertRaises(AlreadyRegisteredError):
            register_hosting_service('dummy-service',
                                     self.DummyServiceWithURLs)
Ejemplo n.º 4
0
    def get_context_data(self, **kwargs):
        """Return data for the template.

        This will return information on the user, along with information from
        any extension hooks used for the page.

        Args:
            **kwargs (tuple):
                Additional keyword arguments from the URL pattern.

        Returns:
            dict:
            Context data for the template.
        """
        from reviewboard.extensions.hooks import UserInfoboxHook

        # These are accessed several times, so bring them in to reduce
        # attribute lookups.
        user = self._lookup_user
        username = user.username
        local_site = self.local_site

        extra_content = []

        for hook in UserInfoboxHook.hooks:
            try:
                extra_content.append(hook.render(
                    user=user,
                    request=self.request,
                    local_site=local_site))
            except Exception as e:
                logging.exception('Error when running UserInfoboxHook.'
                                  'render method in extension "%s": %s',
                                  hook.extension.id, e)

        review_requests_url = local_site_reverse('user', local_site=local_site,
                                                 args=[username])
        reviews_url = local_site_reverse('user-grid', local_site=local_site,
                                         args=[username, 'reviews'])

        has_avatar = (
            avatar_services.avatars_enabled and
            avatar_services.for_user(user) is not None
        )

        return {
            'extra_content': mark_safe(''.join(extra_content)),
            'full_name': user.get_full_name(),
            'has_avatar': has_avatar,
            'infobox_user': user,
            'review_requests_url': review_requests_url,
            'reviews_url': reviews_url,
            'show_profile': self._show_profile,
            'timezone': self._timezone,
        }
Ejemplo n.º 5
0
    def test_local_site_reverse_with_no_local_site(self):
        """Testing local_site_reverse with no local site"""
        request = HttpRequest()

        self.assertEqual(local_site_reverse('dashboard'),
                         '/dashboard/')
        self.assertEqual(local_site_reverse('dashboard', request=request),
                         '/dashboard/')
        self.assertEqual(local_site_reverse('user', args=['sample-user']),
                         '/users/sample-user/')
        self.assertEqual(
            local_site_reverse('user', kwargs={'username': '******'}),
            '/users/sample-user/')
Ejemplo n.º 6
0
    def test_unregistration_with_urls(self):
        """Testing HostingService unregistration with URLs"""
        register_hosting_service("dummy-service", self.DummyServiceWithURLs)
        unregister_hosting_service("dummy-service")

        with self.assertRaises(NoReverseMatch):
            local_site_reverse(
                "dummy-service-post-commit-hook", kwargs={"repository_id": 1, "hosting_service_id": "dummy-service"}
            ),

        # Once unregistered, should not be able to unregister again
        with self.assertRaises(ItemLookupError):
            unregister_hosting_service("dummy-service")
Ejemplo n.º 7
0
    def test_local_site_reverse_with_local_site(self):
        """Testing local_site_reverse with a local site"""
        request = HttpRequest()
        request.GET['local_site_name'] = 'test'

        self.assertEqual(local_site_reverse('dashboard', request=request),
                         '/dashboard/')
        self.assertEqual(local_site_reverse('user', args=['sample-user'],
                                            request=request),
                         '/users/sample-user/')
        self.assertEqual(
            local_site_reverse('user', kwargs={'username': '******'},
                               request=request),
            '/users/sample-user/')
    def test_close_submitted_hook_with_invalid_hooks_uuid(self):
        """Testing Google Code close_submitted hook with invalid hooks UUID"""
        account = self._get_hosting_account()
        account.save()
        repository = self.create_repository(hosting_account=account)

        review_request = self.create_review_request(repository=repository,
                                                    publish=True)
        self.assertTrue(review_request.public)
        self.assertEqual(review_request.status, review_request.PENDING_REVIEW)

        url = local_site_reverse(
            'googlecode-hooks-close-submitted',
            kwargs={
                'repository_id': repository.pk,
                'hosting_service_id': 'googlecode',
                'hooks_uuid': 'abc123',
            })

        response = self._post_commit_hook_payload(url, review_request)
        self.assertEqual(response.status_code, 404)

        review_request = ReviewRequest.objects.get(pk=review_request.pk)
        self.assertTrue(review_request.public)
        self.assertEqual(review_request.status, review_request.PENDING_REVIEW)
        self.assertEqual(review_request.changedescs.count(), 0)
Ejemplo n.º 9
0
    def test_close_submitted_hook_incomplete_payload(self):
        account = self.create_hosting_account()
        repository = self.create_repository(tool_name='Git',
                                            hosting_account=account)

        url = local_site_reverse('rbgateway-hooks-close-submitted',
                                 local_site=None,
                                 kwargs={
                                     'repository_id': repository.pk,
                                     'hosting_service_id': 'rbgateway',
                                 })

        payload = self.dump_json({
            'event': 'push',
        })
        signature = hmac.new(bytes(repository.get_or_create_hooks_uuid()),
                             payload, hashlib.sha1).hexdigest()

        rsp = self.client.post(url,
                               payload,
                               content_type='application/json',
                               HTTP_X_RBG_SIGNATURE=signature,
                               HTTP_X_RBG_EVENT='push')

        self.assertEqual(rsp.status_code, 400)
        self.assertEqual(rsp.content, 'Invalid payload; expected "commits".')
Ejemplo n.º 10
0
    def test_close_submitted_hook_malformed_payload(self):
        """Testing the ReviewBoardGateway close-submitted hook with a malformed
        signature
        """
        account = self.create_hosting_account()
        repository = self.create_repository(tool_name='Git',
                                            hosting_account=account)

        url = local_site_reverse('rbgateway-hooks-close-submitted',
                                 local_site=None,
                                 kwargs={
                                     'repository_id': repository.pk,
                                     'hosting_service_id': 'rbgateway',
                                 })

        payload = 'event=push&commit_id=bbbbbbb&branch=master'
        signature = hmac.new(bytes(repository.get_or_create_hooks_uuid()),
                             payload, hashlib.sha1).hexdigest()

        rsp = self.client.post(
            url,
            payload,
            content_type='application/x-www-form-urlencoded',
            HTTP_X_RBG_SIGNATURE=signature,
            HTTP_X_RBG_EVENT='push')

        self.assertEqual(rsp.status_code, 400)
        self.assertEqual(rsp.content, 'Invalid payload format.')
Ejemplo n.º 11
0
    def test_close_submitted_hook_invalid_signature(self):
        """Testing the ReviewBoardGateway close-submitted hook with an invalid
        signature
        """
        account = self.create_hosting_account()
        repository = self.create_repository(tool_name='Git',
                                            hosting_account=account)

        url = local_site_reverse('rbgateway-hooks-close-submitted',
                                 local_site=None,
                                 kwargs={
                                     'repository_id': repository.pk,
                                     'hosting_service_id': 'rbgateway',
                                 })

        payload = self.dump_json({
            'event': 'push',
            'commits': [],
        })
        signature = hmac.new(b'this is not the secret key', payload,
                             hashlib.sha1).hexdigest()

        rsp = self.client.post(
            url,
            payload,
            content_type='application/x-www-form-urlencoded',
            HTTP_X_RBG_SIGNATURE=signature,
            HTTP_X_RBG_EVENT='push')

        self.assertEqual(rsp.status_code, 400)
        self.assertEqual(rsp.content, 'Bad signature.')
Ejemplo n.º 12
0
    def serialize_token(token):
        """Serialize a single token for the JavaScript view.

        Returns:
            dict:
            A dict with the following keys:

            ``'apiURL'`` (:py:class:`unicode`):
                The URL to access the token via the API.

            ``'application'`` (:py:class:`unicode`):
                The name of the application the token is associated with.
        """
        return {
            'apiURL':
            local_site_reverse(
                'oauth-token-resource',
                local_site=token.application.local_site,
                kwargs={
                    'oauth_token_id': token.pk,
                },
            ),
            'application':
            token.application.name,
        }
Ejemplo n.º 13
0
    def render_data(self, state, review_request):
        """Return the rendered contents of the column."""
        bugs = review_request.get_bug_list()
        repository = review_request.repository
        local_site_name = None

        if review_request.local_site:
            local_site_name = review_request.local_site.name

        if repository and repository.bug_tracker:
            links = []

            for bug in bugs:
                try:
                    url = local_site_reverse(
                        'bug_url',
                        local_site_name=local_site_name,
                        args=[review_request.display_id, bug])
                    links.append(
                        format_html('<a class="bug" href="{0}">{1}</a>', url,
                                    bug))
                except NoReverseMatch:
                    links.append(escape(bug))

            return ', '.join(links)

        return format_html_join(', ', '<span class="bug">{0}</span>',
                                ((bug, ) for bug in bugs))
Ejemplo n.º 14
0
    def link_to_object(self, state, obj, value):
        if value and isinstance(value, User):
            return local_site_reverse('user',
                                      request=self.request,
                                      args=[value])

        return obj.get_absolute_url()
Ejemplo n.º 15
0
    def _get_bug_url(self, bug_id):
        """Return the URL to link to a specific bug.

        Args:
            bug_id (unicode):
                The ID of the bug to link to.

        Returns:
            unicode:
            The link to view the bug in the bug tracker, if available.
        """
        review_request = self.review_request_details.get_review_request()
        repository = self.review_request_details.repository
        local_site_name = None
        bug_url = None

        if review_request.local_site:
            local_site_name = review_request.local_site.name

        try:
            if (repository and
                repository.bug_tracker and
                '%s' in repository.bug_tracker):
                bug_url = local_site_reverse(
                    'bug_url', local_site_name=local_site_name,
                    args=[review_request.display_id, bug_id])
        except NoReverseMatch:
            pass

        return bug_url
Ejemplo n.º 16
0
    def get_comment_link_url(self, comment):
        """Return a URL for linking to a comment.

        This will normally just link to the Review UI itself, but subclasses
        may want to override this to provide a more specialized URL.

        Args:
            comment (reviewboard.reviews.models.file_attachment_comment.
                     FileAttachmentComment):
                The comment to return a link for.

        Returns:
            unicode:
            The URL to link to the comment.
        """
        local_site_name = None

        if self.review_request.local_site:
            local_site_name = self.review_request.local_site.name

        return local_site_reverse(
            'file-attachment',
            local_site_name=local_site_name,
            kwargs={
                'review_request_id': self.review_request.display_id,
                'file_attachment_id': self.obj.pk,
            })
Ejemplo n.º 17
0
    def get_absolute_url(self):
        if self.local_site:
            local_site_name = self.local_site.name
        else:
            local_site_name = None

        return local_site_reverse("group", local_site_name=local_site_name, kwargs={"name": self.name})
Ejemplo n.º 18
0
    def test_close_submitted_hook_with_invalid_site(self):
        """Testing BitBucket close_submitted hook with invalid Local Site"""
        local_site = LocalSite.objects.get(name=self.local_site_name)
        account = self._get_hosting_account(local_site=local_site)
        account.save()

        repository = self.create_repository(hosting_account=account,
                                            local_site=local_site)

        review_request = self.create_review_request(repository=repository,
                                                    publish=True)
        self.assertTrue(review_request.public)
        self.assertEqual(review_request.status, review_request.PENDING_REVIEW)

        url = local_site_reverse(
            'bitbucket-hooks-close-submitted',
            local_site_name='badsite',
            kwargs={
                'repository_id': repository.pk,
                'hosting_service_id': 'bitbucket',
                'hooks_uuid': repository.get_or_create_hooks_uuid(),
            })

        response = self._post_commit_hook_payload(url, review_request)
        self.assertEqual(response.status_code, 404)

        review_request = ReviewRequest.objects.get(pk=review_request.pk)
        self.assertTrue(review_request.public)
        self.assertEqual(review_request.status, review_request.PENDING_REVIEW)
        self.assertEqual(review_request.changedescs.count(), 0)
Ejemplo n.º 19
0
    def _test_post_commit_hook(self, local_site=None, publish=True):
        account = self._get_hosting_account(local_site=local_site)
        account.save()

        repository = self.create_repository(hosting_account=account,
                                            local_site=local_site)

        review_request = self.create_review_request(repository=repository,
                                                    local_site=local_site,
                                                    publish=publish)
        self.assertEqual(review_request.status, review_request.PENDING_REVIEW)

        url = local_site_reverse(
            'github-hooks-close-submitted',
            local_site=local_site,
            kwargs={
                'repository_id': repository.pk,
                'hosting_service_id': 'github',
            })

        response = self._post_commit_hook_payload(
            url, review_request, repository.get_or_create_hooks_uuid())
        self.assertEqual(response.status_code, 200)

        review_request = ReviewRequest.objects.get(pk=review_request.pk)
        self.assertTrue(review_request.public)
        self.assertEqual(review_request.status, review_request.SUBMITTED)
        self.assertEqual(review_request.changedescs.count(), 1)

        changedesc = review_request.changedescs.get()
        self.assertEqual(changedesc.text, 'Pushed to master (1c44b46)')
Ejemplo n.º 20
0
    def __init__(self, data=None, initial=None, instance=None):
        """Initialize the form:

        Args:
            data (dict, optional):
                The provided form data.

            initial (dict, optional):
                The initial form values.

            instance (Application, optional):
                The application to edit.
        """
        super(ApplicationChangeForm, self).__init__(data=data,
                                                    initial=initial,
                                                    instance=instance)

        if instance and instance.pk:
            # If we are creating an application (as the
            # ApplicationCreationForm is a subclass of this class), the
            # client_secret wont be present so we don't have to initialize the
            # widget.
            client_secret = self.fields['client_secret']
            client_secret.widget = OAuthSecretInputWidget(
                attrs=client_secret.widget.attrs,
                api_url=local_site_reverse('oauth-app-resource',
                                           local_site=instance.local_site,
                                           kwargs={'app_id': instance.pk}),
            )
Ejemplo n.º 21
0
    def create_response(self):
        """Create a response based on the search results."""
        if not self.query:
            return HttpResponseRedirect(
                local_site_reverse('all-review-requests',
                                   request=self.request))

        if self.query.isdigit() and self.results:
            return HttpResponseRedirect(
                self.results[0].object.get_absolute_url())

        paginator, page = self.build_page()
        page_nums = range(max(1, page.number - self.ADJACENT_PAGES),
                          min(paginator.num_pages,
                              page.number + self.ADJACENT_PAGES) + 1)

        context = {
            'query': self.query,
            'page': page,
            'paginator': paginator,
            'is_paginated': page.has_other_pages(),
            'show_first_page': 1 not in page_nums,
            'show_last_page': paginator.num_pages not in page_nums,
            'page_numbers': page_nums,
        }
        context.update(self.extra_context())

        return render_to_response(
            self.template, context,
            context_instance=self.context_class(self.request))
    def test_base_filediff_not_in_diffset(self):
        """Testing ReviewsDiffFragmentView.get with ?base-filediff-id= as a
        FileDiff outside the current diffset
        """
        repository = self.create_repository(tool_name='Git')
        review_request = self.create_review_request(repository=repository,
                                                    create_with_history=True)
        review_request.target_people = [review_request.submitter]

        diffset = self.create_diffset(review_request, draft=True)
        commit = self.create_diffcommit(diffset=diffset)
        diffset.finalize_commit_series(
            cumulative_diff=self.DEFAULT_GIT_FILEDIFF_DATA_DIFF,
            validation_info=None,
            validate=False,
            save=True)

        review_request.publish(user=review_request.submitter)

        filediff = commit.files.get()

        other_diffset = self.create_diffset(repository=repository)
        other_filediff = self.create_filediff(diffset=other_diffset)

        rsp = self.client.get(
            local_site_reverse(
                'view-diff-fragment',
                kwargs={
                    'review_request_id': review_request.display_id,
                    'revision': diffset.revision,
                    'filediff_id': filediff.pk,
                }),
            data={'base-filediff-id': other_filediff.pk})

        self.assertEqual(rsp.status_code, 404)
Ejemplo n.º 23
0
 def _get_resource_url(self, name, local_site_name=None, request=None,
                       **kwargs):
     return local_site_reverse(
         self._build_named_url(name),
         local_site_name=local_site_name,
         request=request,
         kwargs=kwargs)
Ejemplo n.º 24
0
    def get(self, request, *args, **kwargs):
        """Returns the information on the Review Board server."""
        site = Site.objects.get_current()
        siteconfig = SiteConfiguration.objects.get_current()

        url = '%s://%s%s' % (siteconfig.get('site_domain_method'), site.domain,
                             local_site_reverse('root', request=request))

        return 200, {
            self.item_result_key: {
                'product': {
                    'name': 'Review Board',
                    'version': get_version_string(),
                    'package_version': get_package_version(),
                    'is_release': is_release(),
                },
                'site': {
                    'url': url,
                    'administrators': [{'name': name, 'email': email}
                                       for name, email in settings.ADMINS],
                    'time_zone': settings.TIME_ZONE,
                },
                'capabilities': {
                    'diffs': {
                        'base_commit_ids': True,
                        'moved_files': True,
                    },
                    'scmtools': {
                        'perforce': {
                            'moved_files': True,
                        },
                    },
                },
            },
        }
Ejemplo n.º 25
0
    def test_close_submitted_hook_ping(self):
        """Testing GitHub close_submitted hook ping"""
        account = self._get_hosting_account()
        account.save()

        repository = self.create_repository(hosting_account=account)

        review_request = self.create_review_request(repository=repository,
                                                    publish=True)
        self.assertTrue(review_request.public)
        self.assertEqual(review_request.status, review_request.PENDING_REVIEW)

        url = local_site_reverse(
            'github-hooks-close-submitted',
            kwargs={
                'repository_id': repository.pk,
                'hosting_service_id': 'github',
            })

        response = self._post_commit_hook_payload(
            url, review_request, repository.get_or_create_hooks_uuid(),
            event='ping')
        self.assertEqual(response.status_code, 200)

        review_request = ReviewRequest.objects.get(pk=review_request.pk)
        self.assertTrue(review_request.public)
        self.assertEqual(review_request.status, review_request.PENDING_REVIEW)
        self.assertEqual(review_request.changedescs.count(), 0)
Ejemplo n.º 26
0
    def record_change_entry(self, changedesc, unused, diffset):
        """Record information on the changed values in a ChangeDescription.

        Args:
            changedesc (reviewboard.changedescs.models.ChangeDescription):
                The change description to record the entry in.

            old_value (object):
                The old value of the field.

            new_value (object):
                The new value of the field.
        """
        review_request = self.review_request_details.get_review_request()

        url = local_site_reverse(
            'view-diff-revision',
            local_site=review_request.local_site,
            args=[review_request.display_id, diffset.revision])

        changedesc.fields_changed['diff'] = {
            'added': [(
                _('Diff r%s') % diffset.revision,
                url,
                diffset.pk
            )]
        }
Ejemplo n.º 27
0
    def dispatch(self, request, local_site=None, *args, **kwargs):
        """Dispatch the view.

        If search is disabled, the search will not be performed and the user
        will be informed.

        Args:
            request (django.http.HttpRequest):
                The current HTTP request.

            local_site (reviewboard.site.models.LocalSite):
                The LocalSite on which the search is being performed.

            *args (tuple, unused):
                Ignored positional arguments.

            **kwargs (dict, unused):
                Ignored keyword arguments.

        Returns:
            django.http.HttpResponse:
            The HTTP response for the search.
        """
        if not search_backend_registry.search_enabled:
            return render(request, self.disabled_template_name)

        form_class = self.get_form_class()
        form = form_class(user=request.user,
                          local_site=local_site,
                          **self.get_form_kwargs())

        if not form.is_valid():
            return self.form_invalid(form)

        query = form.cleaned_data.get(self.search_field, '')

        if not query:
            return HttpResponseRedirect(
                local_site_reverse('all-review-requests',
                                   local_site=local_site),
            )

        if query.isdigit():
            # If the query is an integer, then assume that it's a review
            # request ID that we'll want to redirect to. This mirrors behavior
            # we've had since Review Board 1.7.
            try:
                review_request = ReviewRequest.objects.for_id(query,
                                                              local_site)
            except ReviewRequest.DoesNotExist:
                pass
            else:
                if review_request.is_accessible_by(self.request.user,
                                                   local_site=local_site,
                                                   request=request):
                    return HttpResponseRedirect(
                        review_request.get_absolute_url()
                    )

        return self.form_valid(form)
Ejemplo n.º 28
0
    def _get_bug_url(self, bug_id):
        """Return the URL to link to a specific bug.

        Args:
            bug_id (unicode):
                The ID of the bug to link to.

        Returns:
            unicode:
            The link to view the bug in the bug tracker, if available.
        """
        review_request = self.review_request_details.get_review_request()
        repository = self.review_request_details.repository
        local_site_name = None
        bug_url = None

        if review_request.local_site:
            local_site_name = review_request.local_site.name

        try:
            if (repository and
                repository.bug_tracker and
                '%s' in repository.bug_tracker):
                bug_url = local_site_reverse(
                    'bug_url', local_site_name=local_site_name,
                    args=[review_request.display_id, bug_id])
        except NoReverseMatch:
            pass

        return bug_url
Ejemplo n.º 29
0
    def test_close_submitted_hook_with_invalid_service_id(self):
        """Testing GitHub close_submitted hook with invalid hosting service ID
        """
        # We'll test against Bitbucket for this test.
        account = self._get_hosting_account()
        account.service_name = 'bitbucket'
        account.save()
        repository = self.create_repository(hosting_account=account)

        review_request = self.create_review_request(repository=repository,
                                                    publish=True)
        self.assertTrue(review_request.public)
        self.assertEqual(review_request.status, review_request.PENDING_REVIEW)

        url = local_site_reverse(
            'github-hooks-close-submitted',
            kwargs={
                'repository_id': repository.pk,
                'hosting_service_id': 'github',
            })

        response = self._post_commit_hook_payload(
            url, review_request, repository.get_or_create_hooks_uuid())
        self.assertEqual(response.status_code, 404)

        review_request = ReviewRequest.objects.get(pk=review_request.pk)
        self.assertTrue(review_request.public)
        self.assertEqual(review_request.status, review_request.PENDING_REVIEW)
        self.assertEqual(review_request.changedescs.count(), 0)
Ejemplo n.º 30
0
def navigation_bar_hooks(context):
    """Displays all registered navigation bar entries."""
    s = ""

    for hook in NavigationBarHook.hooks:
        try:
            for nav_info in hook.get_entries(context):
                if nav_info:
                    url_name = nav_info.get('url_name', None)
                    if url_name:
                        nav_info['url'] = local_site_reverse(
                            url_name, request=context.get('request'))

                    context.push()
                    context['entry'] = nav_info
                    s += render_to_string("extensions/navbar_entry.html",
                                          context)
                    context.pop()
        except Exception as e:
            extension = hook.extension
            logging.error('Error when running NavigationBarHook.'
                          'get_entries function in extension: "%s": %s',
                          extension.id, e, exc_info=1)

    return s
Ejemplo n.º 31
0
    def build_resource_url(self, name, local_site_name=None, request=None,
                           **kwargs):
        """Build the URL to a resource, factoring in Local Sites.

        Args:
            name (unicode):
                The resource name.

            local_site_name (unicode):
                The LocalSite name.

            request (django.http.HttpRequest):
                The HTTP request from the client.

            kwargs (dict):
                The keyword arguments needed for URL resolution.

        Returns:
            unicode: The resulting absolute URL to the resource.
        """
        url = local_site_reverse(
            self._build_named_url(name),
            local_site_name=local_site_name,
            request=request,
            kwargs=kwargs)

        if request:
            return request.build_absolute_uri(url)

        return url
Ejemplo n.º 32
0
    def render_data(self, state, review_request):
        """Return the rendered contents of the column."""
        bugs = review_request.get_bug_list()
        repository = review_request.repository
        local_site_name = None

        if review_request.local_site:
            local_site_name = review_request.local_site.name

        if repository and repository.bug_tracker:
            links = []

            for bug in bugs:
                try:
                    url = local_site_reverse(
                        'bug_url',
                        local_site_name=local_site_name,
                        args=[review_request.display_id, bug])
                    links.append(
                        format_html('<a class="bug" href="{0}">{1}</a>',
                                    url, bug))
                except NoReverseMatch:
                    links.append(escape(bug))

            return ', '.join(links)

        return format_html_join(
            ', ',
            '<span class="bug">{0}</span>',
            ((bug,) for bug in bugs)
        )
Ejemplo n.º 33
0
    def link_to_object(self, state, obj, value):
        """Return a link to the given object."""
        if value and isinstance(value, User):
            return local_site_reverse('user', request=self.request,
                                      args=[value])

        return obj.get_absolute_url()
Ejemplo n.º 34
0
    def record_change_entry(self, changedesc, unused, diffset):
        """Record information on the changed values in a ChangeDescription.

        Args:
            changedesc (reviewboard.changedescs.models.ChangeDescription):
                The change description to record the entry in.

            old_value (object):
                The old value of the field.

            new_value (object):
                The new value of the field.
        """
        review_request = self.review_request_details.get_review_request()

        url = local_site_reverse(
            'view-diff-revision',
            local_site=review_request.local_site,
            args=[review_request.display_id, diffset.revision])

        changedesc.fields_changed['diff'] = {
            'added': [(
                _('Diff r%s') % diffset.revision,
                url,
                diffset.pk
            )]
        }
Ejemplo n.º 35
0
    def authorize(self, username, password, local_site_name=None,
                  *args, **kwargs):
        site = Site.objects.get_current()
        siteconfig = SiteConfiguration.objects.get_current()

        site_url = '%s://%s%s' % (
            siteconfig.get('site_domain_method'),
            site.domain,
            local_site_reverse('root', local_site_name=local_site_name))

        try:
            rsp, headers = self._json_post(
                url=self.API_URL + 'authorizations',
                username=username,
                password=password,
                body=simplejson.dumps({
                    'scopes': [
                        'user',
                        'repo',
                    ],
                    'note': 'Access for Review Board',
                    'note_url': site_url,
                }))
        except (urllib2.HTTPError, urllib2.URLError), e:
            data = e.read()

            try:
                rsp = simplejson.loads(data)
            except:
                rsp = None

            if rsp and 'message' in rsp:
                raise AuthorizationError(rsp['message'])
            else:
                raise AuthorizationError(str(e))
Ejemplo n.º 36
0
    def get_repository_hook_instructions(self, request, repository):
        """Returns instructions for setting up incoming webhooks."""
        plan = repository.extra_data["repository_plan"]
        add_webhook_url = urljoin(
            self.account.hosting_url or "https://github.com/",
            "%s/%s/settings/hooks/new"
            % (
                self._get_repository_owner_raw(plan, repository.extra_data),
                self._get_repository_name_raw(plan, repository.extra_data),
            ),
        )

        webhook_endpoint_url = build_server_url(
            local_site_reverse(
                "github-hooks-close-submitted",
                local_site=repository.local_site,
                kwargs={"repository_id": repository.pk, "hosting_service_id": repository.hosting_account.service_name},
            )
        )

        return render_to_string(
            "hostingsvcs/github/repo_hook_instructions.html",
            RequestContext(
                request,
                {
                    "repository": repository,
                    "server_url": get_server_url(),
                    "add_webhook_url": add_webhook_url,
                    "webhook_endpoint_url": webhook_endpoint_url,
                    "hook_uuid": repository.get_or_create_hooks_uuid(),
                },
            ),
        )
Ejemplo n.º 37
0
    def authorize(
        self, username, password, hosting_url, two_factor_auth_code=None, local_site_name=None, *args, **kwargs
    ):
        site = Site.objects.get_current()
        siteconfig = SiteConfiguration.objects.get_current()

        site_base_url = "%s%s" % (site.domain, local_site_reverse("root", local_site_name=local_site_name))

        site_url = "%s://%s" % (siteconfig.get("site_domain_method"), site_base_url)

        note = "Access for Review Board (%s - %s)" % (site_base_url, uuid.uuid4().hex[:7])

        try:
            body = {"scopes": ["user", "repo"], "note": note, "note_url": site_url}

            # If the site is using a registered GitHub application,
            # send it in the requests. This will gain the benefits of
            # a GitHub application, such as higher rate limits.
            if hasattr(settings, "GITHUB_CLIENT_ID") and hasattr(settings, "GITHUB_CLIENT_SECRET"):
                body.update({"client_id": settings.GITHUB_CLIENT_ID, "client_secret": settings.GITHUB_CLIENT_SECRET})

            headers = {}

            if two_factor_auth_code:
                headers["X-GitHub-OTP"] = two_factor_auth_code

            rsp, headers = self.client.json_post(
                url=self.get_api_url(hosting_url) + "authorizations",
                username=username,
                password=password,
                headers=headers,
                body=json.dumps(body),
            )
        except (HTTPError, URLError) as e:
            data = e.read()

            try:
                rsp = json.loads(data)
            except:
                rsp = None

            if rsp and "message" in rsp:
                response_info = e.info()
                x_github_otp = response_info.get("X-GitHub-OTP", "")

                if x_github_otp.startswith("required;"):
                    raise TwoFactorAuthCodeRequiredError(
                        _(
                            "Enter your two-factor authentication code "
                            "and re-enter your password to link your account. "
                            "This code will be sent to you by GitHub."
                        )
                    )

                raise AuthorizationError(rsp["message"])
            else:
                raise AuthorizationError(six.text_type(e))

        self._save_auth_data(rsp)
Ejemplo n.º 38
0
 def get_url(self):
     if self.url:
         return self.url
     elif self.url_name:
         return local_site_reverse(self.url_name,
                                   request=self.datagrid.request)
     else:
         return super(SidebarNavItem, self).get_url()
Ejemplo n.º 39
0
    def get_absolute_url(self):
        if self.local_site_id:
            local_site_name = self.local_site.name
        else:
            local_site_name = None

        return local_site_reverse('group', local_site_name=local_site_name,
                                  kwargs={'name': self.name})
Ejemplo n.º 40
0
    def test_unicode(self):
        """Testing UserInfoboxView with a user with non-ascii characters"""
        user = User.objects.create_user('test', '*****@*****.**')
        user.first_name = 'Test\u21b9'
        user.last_name = 'User\u2729'
        user.save()

        self.client.get(local_site_reverse('user-infobox', args=['test']))
Ejemplo n.º 41
0
 def render_value(self, user):
     return format_html(
         '<a class="user" href="{0}">{1}</a>',
         local_site_reverse(
             'user',
             local_site=self.review_request_details.local_site,
             args=[user]),
         user.get_full_name() or user.username)
Ejemplo n.º 42
0
    def test_unicode(self):
        """Testing user_infobox with a user with non-ascii characters"""
        user = User.objects.create_user('test', '*****@*****.**')
        user.first_name = 'Test\u21b9'
        user.last_name = 'User\u2729'
        user.save()

        self.client.get(local_site_reverse('user-infobox', args=['test']))
Ejemplo n.º 43
0
    def dispatch(self, request, local_site=None, *args, **kwargs):
        """Dispatch the view.

        If search is disabled, the search will not be performed and the user
        will be informed.

        Args:
            request (django.http.HttpRequest):
                The current HTTP request.

            local_site (reviewboard.site.models.LocalSite):
                The LocalSite on which the search is being performed.

            *args (tuple, unused):
                Ignored positional arguments.

            **kwargs (dict, unused):
                Ignored keyword arguments.

        Returns:
            django.http.HttpResponse:
            The HTTP response for the search.
        """
        if not search_backend_registry.search_enabled:
            return render(request, self.disabled_template_name)

        form_class = self.get_form_class()
        form = form_class(user=request.user,
                          local_site=local_site,
                          **self.get_form_kwargs())

        if not form.is_valid():
            return self.form_invalid(form)

        query = form.cleaned_data.get(self.search_field, '')

        if not query:
            return HttpResponseRedirect(
                local_site_reverse('all-review-requests',
                                   local_site=local_site), )

        if query.isdigit():
            # If the query is an integer, then assume that it's a review
            # request ID that we'll want to redirect to. This mirrors behavior
            # we've had since Review Board 1.7.
            try:
                review_request = ReviewRequest.objects.for_id(
                    query, local_site)
            except ReviewRequest.DoesNotExist:
                pass
            else:
                if review_request.is_accessible_by(self.request.user,
                                                   local_site=local_site,
                                                   request=request):
                    return HttpResponseRedirect(
                        review_request.get_absolute_url())

        return self.form_valid(form)
Ejemplo n.º 44
0
def get_server_info(request=None):
    """Returns server information for use in the API.

    This is used for the root resource and for the deprecated server
    info resource.
    """
    site = Site.objects.get_current()
    siteconfig = SiteConfiguration.objects.get_current()

    url = '%s://%s%s' % (siteconfig.get('site_domain_method'), site.domain,
                         local_site_reverse('root', request=request))

    return {
        'product': {
            'name': 'Review Board',
            'version': get_version_string(),
            'package_version': get_package_version(),
            'is_release': is_release(),
        },
        'site': {
            'url': url,
            'administrators': [
                {
                    'name': name,
                    'email': email,
                }
                for name, email in settings.ADMINS
            ],
            'time_zone': settings.TIME_ZONE,
        },
        'capabilities': {
            'diffs': {
                'base_commit_ids': True,
                'moved_files': True,
            },
            'review_requests': {
                'commit_ids': True,
            },
            'scmtools': {
                'git': {
                    'empty_files': True,
                },
                'mercurial': {
                    'empty_files': True,
                },
                'perforce': {
                    'moved_files': True,
                    'empty_files': True,
                },
                'svn': {
                    'empty_files': True,
                },
            },
            'text': {
                'markdown': True,
            },
        }
    }
Ejemplo n.º 45
0
 def _get_resource_url(self,
                       name,
                       local_site_name=None,
                       request=None,
                       **kwargs):
     return local_site_reverse(self._build_named_url(name),
                               local_site_name=local_site_name,
                               request=request,
                               kwargs=kwargs)
    def test_base_filediff_and_interfilediff(self):
        """Testing ReviewsDiffFragmentView.get with interfilediff and
        ?base-filediff-id
        """
        repository = self.create_repository(tool_name='Git')
        review_request = self.create_review_request(repository=repository,
                                                    create_with_history=True)
        review_request.target_people = [review_request.submitter]

        diffset = self.create_diffset(review_request, draft=True)
        diffset_commits = [
            self.create_diffcommit(diffset=diffset, commit_id='r1',
                                   parent_id='r0'),
            self.create_diffcommit(diffset=diffset, commit_id='r2',
                                   parent_id='r1'),
        ]

        filediff = diffset_commits[1].files.get()
        base_filediff = diffset_commits[0].files.get()

        diffset.finalize_commit_series(
            cumulative_diff=self.DEFAULT_GIT_FILEDIFF_DATA_DIFF,
            validation_info=None,
            validate=False,
            save=True)
        review_request.publish(user=review_request.submitter)

        interdiffset = self.create_diffset(review_request, draft=True)
        interdiffset_commit = self.create_diffcommit(
            diffset=interdiffset, commit_id='r1', parent_id='r0')

        interdiffset.finalize_commit_series(
            cumulative_diff=self.DEFAULT_GIT_FILEDIFF_DATA_DIFF,
            validation_info=None,
            validate=False,
            save=True)
        review_request.publish(user=review_request.submitter)

        interfilediff = interdiffset_commit.files.get()

        rsp = self.client.get(
            local_site_reverse(
                'view-diff-fragment',
                kwargs={
                    'review_request_id': review_request.display_id,
                    'revision': diffset.revision,
                    'interdiff_revision': interdiffset.revision,
                    'filediff_id': filediff.pk,
                    'interfilediff_id': interfilediff.pk,
                }),
            data={'base-filediff-id': base_filediff.pk})

        self.assertEqual(rsp.status_code, 500)
        self.assertIn(
            b'Cannot generate an interdiff when base FileDiff ID is '
            b'specified.',
            rsp.content)
Ejemplo n.º 47
0
    def test_with_anonymous_with_private_access(self):
        """Testing RootView with anonymous user with anonymous access not
        allowed
        """
        with self.siteconfig_settings({'auth_require_sitewide_login': True},
                                      reload_settings=False):
            response = self.client.get(local_site_reverse('root'))

        self.assertRedirects(response, '/account/login/?next=/')
Ejemplo n.º 48
0
    def test_with_anonymous_with_local_site_private(self):
        """Testing RootView with anonymous user with private Local Site"""
        response = self.client.get(
            local_site_reverse('root', local_site_name=self.local_site_name))

        self.assertEqual(
            response['Location'],
            'http://testserver/account/login/?next=/s/%s/' %
            self.local_site_name)
Ejemplo n.º 49
0
    def test_with_logged_in_with_local_site(self):
        """Testing RootView with authenticated user with Local Site"""
        self.assertTrue(self.client.login(username='******', password='******'))

        response = self.client.get(
            local_site_reverse('root', local_site_name=self.local_site_name))

        self.assertRedirects(response,
                             '/s/%s/dashboard/' % self.local_site_name)
Ejemplo n.º 50
0
    def test_user_infobox_hook(self):
        """Testing UserInfoboxHook with methods raising exceptions"""
        SandboxUserInfoboxHook(self.extension, 'template.html')

        self.client.get(
            local_site_reverse('user-infobox',
                               kwargs={
                                   'username': self.user.username,
                               }))
Ejemplo n.º 51
0
    def get_success_url(self):
        """Return the URL to redirect to after saving the form.

        This will take the user back to the list of integrations.

        Returns:
            unicode:
            The URL to the integration list page.
        """
        return local_site_reverse('integration-list', request=self.request)
Ejemplo n.º 52
0
def get_obj_url(obj, site=None, siteconfig=None):
    if not site:
        site = Site.objects.get_current()

    if not siteconfig:
        siteconfig = SiteConfiguration.objects.get_current()

    return '%s://%s%s%s' % (siteconfig.get('site_domain_method'), site.domain,
                            local_site_reverse('root').rstrip('/'),
                            obj.get_absolute_url())
Ejemplo n.º 53
0
    def test_with_logged_in_with_local_site(self):
        """Testing RootView with authenticated user with Local Site"""
        self.assertTrue(self.client.login(username='******', password='******'))

        response = self.client.get(
            local_site_reverse('root', local_site_name=self.local_site_name))

        self.assertEqual(
            response['Location'],
            'http://testserver/s/%s/dashboard/' % self.local_site_name)
Ejemplo n.º 54
0
    def test_with_anonymous_with_local_site_public(self):
        """Testing RootView with anonymous user with public Local Site"""
        local_site = self.get_local_site(name=self.local_site_name)
        local_site.public = True
        local_site.save()

        response = self.client.get(
            local_site_reverse('root', local_site=local_site))

        self.assertRedirects(response, '/s/%s/r/' % self.local_site_name)
Ejemplo n.º 55
0
    def get_absolute_url(self):
        if self.local_site:
            local_site_name = self.local_site.name
        else:
            local_site_name = None

        return local_site_reverse(
            'review-request-detail',
            local_site_name=local_site_name,
            kwargs={'review_request_id': self.display_id})
Ejemplo n.º 56
0
    def get_repository_hook_instructions(self, request, repository):
        """Returns instructions for setting up incoming webhooks.

        Args:
            request (django.http.HttpRequest):
                The HTTP request from the client.

            repository (reviewboard.scmtools.models.Repository):
                The repository to show instructions for.

        Returns:
            django.http.HttpResponse:
            The hook installation instructions rendered to the contents of an
            HTTP response.
        """
        example_id = 123
        example_url = build_server_url(
            local_site_reverse('review-request-detail',
                               local_site=repository.local_site,
                               kwargs={
                                   'review_request_id': example_id,
                               }))

        hook_uuid = repository.get_or_create_hooks_uuid()
        close_url = build_server_url(
            local_site_reverse('rbgateway-hooks-close-submitted',
                               kwargs={
                                   'repository_id': repository.pk,
                                   'hosting_service_id': 'rbgateway',
                               },
                               local_site=repository.local_site))

        return render_to_string(
            template_name='hostingsvcs/rb-gateway/repo_hook_instructions.html',
            request=request,
            context={
                'example_id': example_id,
                'example_url': example_url,
                'hook_uuid': hook_uuid,
                'close_url': close_url,
                'repo_name': repository.extra_data['rbgateway_repo_name'],
            })
Ejemplo n.º 57
0
    def _test_post_commit_hook(self,
                               tool_name,
                               local_site=None,
                               publish=True,
                               expected_close_msg='Pushed to master (bbbbbbb)',
                               **kwargs):
        """Testing posting to a commit hook.

        This will simulate pushing a commit and posting the resulting webhook
        payload from RB Gateway to the handler for the hook.

        Args:
            tool_name (unicode):
                The name of the SCM tool to use.

            local_site (reviewboard.site.models.LocalSite, optional):
                The Local Site owning the review request.

            publish (bool):
                Whether or not to use a published review request.
        """
        account = self.create_hosting_account(local_site=local_site)
        repository = self.create_repository(tool_name=tool_name,
                                            hosting_account=account,
                                            local_site=local_site)

        review_request = self.create_review_request(repository=repository,
                                                    local_site=local_site,
                                                    publish=publish)

        self.assertEqual(review_request.status, review_request.PENDING_REVIEW)

        url = local_site_reverse('rbgateway-hooks-close-submitted',
                                 local_site=local_site,
                                 kwargs={
                                     'repository_id': repository.pk,
                                     'hosting_service_id': 'rbgateway',
                                 })

        response = self._post_commit_hook_payload(
            post_url=url,
            review_request_url=review_request.get_absolute_url(),
            repository_name=repository.name,
            secret=repository.get_or_create_hooks_uuid(),
            **kwargs)
        self.assertEqual(response.status_code, 200)

        review_request = ReviewRequest.objects.get(pk=review_request.pk)
        self.assertTrue(review_request.public)
        self.assertEqual(review_request.status, review_request.SUBMITTED)
        self.assertEqual(review_request.changedescs.count(), 1)

        changedesc = review_request.changedescs.get()
        self.assertEqual(changedesc.text, expected_close_msg)
Ejemplo n.º 58
0
def admin_subnav(context, url_name, name, icon=""):
    """Return an <li> containing a link to the desired setting tab."""
    request = context.get('request')
    url = local_site_reverse(url_name, request=request)

    return RequestContext(request, {
        'url': url,
        'name': name,
        'current': url == request.path,
        'icon': icon,
    })
Ejemplo n.º 59
0
    def test_with_anonymous_with_local_site_public(self):
        """Testing RootView with anonymous user with public Local Site"""
        local_site = self.get_local_site(name=self.local_site_name)
        local_site.public = True
        local_site.save()

        response = self.client.get(
            local_site_reverse('root', local_site=local_site))

        self.assertEqual(response['Location'],
                         'http://testserver/s/%s/r/' % self.local_site_name)
Ejemplo n.º 60
0
    def record_change_entry(self, changedesc, unused, diffset):
        review_request = self.review_request_details.get_review_request()

        url = local_site_reverse(
            'view-diff-revision',
            local_site=review_request.local_site,
            args=[review_request.display_id, diffset.revision])

        changedesc.fields_changed['diff'] = {
            'added': [(_('Diff r%s') % diffset.revision, url, diffset.pk)]
        }