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, }))
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, }))
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)
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, }
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/')
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")
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)
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".')
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.')
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.')
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, }
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))
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()
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
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, })
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})
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)
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)')
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}), )
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)
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 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, }, }, }, }, }
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)
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 )] }
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)
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)
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
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
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) )
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()
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))
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(), }, ), )
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)
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()
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})
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']))
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)
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']))
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)
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, }, } }
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)
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=/')
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)
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)
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, }))
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)
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())
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)
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)
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})
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'], })
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)
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, })
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)
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)] }