def test_get_file_http_with_username(self):
        """Testing SCMClient.get_file_http with username"""
        self.spy_on(urlopen, op=kgb.SpyOpReturn(GetFileHTTPResponse()))

        client = SCMClient(path='/path/to/repo',
                           username='******',
                           password='******')

        self.assertEqual(
            client.get_file_http('https://example.com',
                                 path='/path/to/file',
                                 revision='abc123'), b'abc')

        request = urlopen.last_call.args[0]
        self.assertEqual(request.headers[str('Authorization')],
                         str('Basic dGVzdC11c2VyOnRlc3QtcGFzcw=='))
Exemple #2
0
    def test_find_matching_server_repository_with_uuid_match(self):
        """Testing SVNClient.find_matching_server_repository with UUID
        match
        """
        url = 'svn+ssh://blargle/'
        self.options.repository_url = url
        client = SVNClient(options=self.options)

        self.spy_on(client.svn_info,
                    op=kgb.SpyOpReturn({
                        'Repository UUID': 'UUID-3',
                    }))

        repository, info = get_repository_resource(self.root_resource,
                                                   tool=client,
                                                   repository_paths=url)
        self.assertEqual(repository.id, 3)
Exemple #3
0
    def test_get_or_create_user_not_in_ldap(self):
        """Testing LDAPBackend.get_or_create_user with new user not found in
        LDAP
        """
        self.spy_on(TestLDAPObject.search_s,
                    owner=TestLDAPObject,
                    op=kgb.SpyOpReturn([]))

        self.assertEqual(User.objects.count(), 0)

        user = self.backend.get_or_create_user(username='******', request=None)

        self.assertIsNone(user)
        self.assertEqual(User.objects.count(), 0)

        self.assertSpyCalledWith(TestLDAPObject.search_s,
                                 'CN=admin,DC=example,DC=com',
                                 ldap.SCOPE_SUBTREE, '(uid=doc)')
Exemple #4
0
    def test_get_file_with_context(self):
        """Testing Repository.get_file with context="""
        repository = self.repository
        scmtool_cls = repository.scmtool_class

        self.spy_on(scmtool_cls.get_file,
                    owner=scmtool_cls,
                    op=kgb.SpyOpReturn(b'data'))

        context = FileLookupContext(base_commit_id='def456')

        repository.get_file(path='readme', revision='abc123', context=context)

        self.assertSpyCalledWith(scmtool_cls.get_file,
                                 'readme',
                                 revision='abc123',
                                 base_commit_id='def456',
                                 context=context)
Exemple #5
0
    def test_post_with_hosting_service_and_bug_tracker_use_hosting(self):
        """Testing the POST repositories/ API with hosting service and
        bug_tracker_use_hosting
        """
        account = HostingServiceAccount.objects.create(
            username='******',
            service_name='github')

        self.spy_on(GitHub.is_authorized,
                    owner=GitHub,
                    op=kgb.SpyOpReturn(True))
        self.spy_on(GitHub.check_repository,
                    owner=GitHub,
                    call_original=False)

        rsp = self._post_repository({
            'bug_tracker_use_hosting': True,
            'github_public_org_name': 'myorg',
            'github_public_org_repo_name': 'myrepo',
            'hosting_account_username': '******',
            'hosting_type': 'github',
            'repository_plan': 'public-org',
            'tool': 'Git',
        })

        self._verify_repository_info(
            rsp=rsp,
            expected_tool_id='git',
            expected_attrs={
                'bug_tracker':
                    'http://github.com/myorg/myrepo/issues#issue/%s',
                'extra_data': {
                    'bug_tracker_use_hosting': True,
                    'github_public_org_name': 'myorg',
                    'github_public_org_repo_name': 'myrepo',
                    'repository_plan': 'public-org',
                },
                'hosting_account': account,
                'mirror_path': '[email protected]:myorg/myrepo.git',
                'path': 'git://github.com/myorg/myrepo.git',
            })

        self.assertSpyCalled(GitHub.is_authorized)
        self.assertSpyCalled(GitHub.check_repository)
Exemple #6
0
    def test_create_from_data_with_committer_date_none(self):
        """Testing DiffCommitManager.create_from_data with committer_date=None
        """
        # committer_date is a property that sets a couple of fields based on
        # the provided date. If this crashes (which was an issue initially with
        # the implementation when passing in None), construction will fail
        # with:
        #
        #     TypeError: 'committer_date' is an invalid keyword argument for
        #     this function
        repository = self.create_repository(tool_name='Test')
        self.spy_on(repository.get_file_exists, op=kgb.SpyOpReturn(True))

        diffset = DiffSet.objects.create_empty(repository=repository,
                                               basedir='',
                                               revision=1)

        commit = DiffCommit.objects.create_from_data(
            repository=repository,
            diff_file_name='diff',
            diff_file_contents=self.commit_test_diff,
            parent_diff_file_name=None,
            parent_diff_file_contents=b'',
            request=None,
            commit_id='r1',
            parent_id='r0',
            author_name='Author',
            author_email='*****@*****.**',
            author_date=parse_date('2000-01-01 00:00:00-0600'),
            committer_name='Committer',
            committer_email='*****@*****.**',
            committer_date=None,
            commit_message='Description',
            diffset=diffset,
            validation_info={})

        self.assertEqual(commit.files.count(), 1)
        self.assertEqual(diffset.files.count(), commit.files.count())
        self.assertEqual(diffset.commit_count, 1)

        self.assertIsNone(commit.committer_date)
        self.assertIsNone(commit.committer_date_utc)
        self.assertIsNone(commit.committer_date_offset)
Exemple #7
0
    def _test_hook_approval_sequence(self, accessible_values, result):
        """Test a sequence of FileDiffACLHook approval results.

        Args:
            accessible_values (list of bool):
                A list of the values to return from FileDiffACLHook
                implementations.

            result (bool):
                A resulting approval value to check.
        """
        with override_feature_check(DiffACLsFeature.feature_id,
                                    enabled=True):
            for value in accessible_values:
                hook = FileDiffACLHook(extension=self.extension)
                self.spy_on(hook.is_accessible, op=kgb.SpyOpReturn(value))

            self.assertEqual(self.review_request.is_accessible_by(self.user),
                             result)
Exemple #8
0
    def test_post_with_unknown_cert_and_trust_host(self):
        """Testing the POST repositories/ API with Unknown Certificate error
        and trust_host=1
        """
        class Certificate(object):
            failures = ['failures']
            fingerprint = 'fingerprint'
            hostname = 'example.com'
            issuer = 'issuer'
            valid_from = 'valid_from'
            valid_until = 'valid_until'

        cert = Certificate()

        @self.spy_for(TestTool.check_repository, owner=TestTool)
        def _check_repository(cls, *args, **kwargs):
            if not TestTool.accept_certificate.called:
                raise UnverifiedCertificateError(cert)

        self.spy_on(
            TestTool.accept_certificate,
            owner=TestTool,
            op=kgb.SpyOpReturn({
                'fingerprint': '123',
            }))

        rsp = self._post_repository({
            'trust_host': 1,
        })

        self._verify_repository_info(
            rsp=rsp,
            expected_attrs={
                'extra_data': {
                    'cert': {
                        'fingerprint': '123',
                    },
                },
            })

        self.assertSpyCalled(TestTool.accept_certificate)
Exemple #9
0
    def _check_upgrade_settings(self, stored_settings, stored_settings_text,
                                expected_settings_text):
        """Check that upgrading settings produces the expected results.

        Args:
            stored_settings (dict):
                A dictionary of settings that would be stored in
                :file:`settings_local.py`.

            stored_settings_text (unicode):
                The content of the :file:`settings_local.py` file to write
                and upgrade.

            expected_settings_text (unicode):
                The content of just the settings, without any blank lines
                or comments.

        Raises:
            AssertionError:
                An expectation failed.
        """
        class SettingsLocal(object):
            pass

        for key, value in six.iteritems(stored_settings):
            setattr(SettingsLocal, key, value)

        site = Site(install_dir=self.sitedir2,
                    options={})
        self.spy_on(site.get_settings_local,
                    op=kgb.SpyOpReturn(SettingsLocal))

        with open(os.path.join(site.abs_install_dir, 'conf',
                               'settings_local.py'),
                  'w') as fp:
            fp.write(stored_settings_text)

        site.upgrade_settings()

        self._check_settings_local(site.abs_install_dir,
                                   expected_settings_text)
Exemple #10
0
    def test_post_with_hosting_service_and_invalid_username(self):
        """Testing the POST <URL> API with hosting service and invalid
        hosting_account_username
        """
        self.spy_on(GitHub.is_authorized,
                    owner=GitHub,
                    op=kgb.SpyOpReturn(True))
        self.spy_on(GitHub.check_repository,
                    owner=GitHub,
                    call_original=False)

        rsp = self._post_repository(
            {
                'bug_tracker_use_hosting': True,
                'github_public_org_name': 'myorg',
                'github_public_org_repo_name': 'myrepo',
                'hosting_account_username': '******',
                'hosting_type': 'github',
                'repository_plan': 'public-org',
                'tool': 'Git',
            },
            expected_status=400)

        self.assertEqual(rsp, {
            'err': {
                'code': 105,
                'msg': 'One or more fields had errors',
            },
            'fields': {
                'hosting_account_username': [
                    'An existing hosting service account with the username '
                    '"test-user" could not be found for the hosting '
                    'service "github".'
                ],
            },
            'stat': 'fail',
        })

        self.assertSpyNotCalled(GitHub.is_authorized)
        self.assertSpyNotCalled(GitHub.check_repository)
Exemple #11
0
    def test_post_with_hosting_service_and_hosting_url(self):
        """Testing the POST <URL> API with hosting service and hosting_url"""
        account = HostingServiceAccount.objects.create(
            hosting_url='https://example.com',
            username='******',
            service_name='gitlab')

        self.spy_on(GitLab.is_authorized,
                    owner=GitLab,
                    op=kgb.SpyOpReturn(True))
        self.spy_on(GitLab.check_repository,
                    owner=GitLab,
                    call_original=False)

        rsp = self._post_repository({
            'gitlab_personal_repo_name': 'myrepo',
            'hosting_account_username': '******',
            'hosting_type': 'gitlab',
            'hosting_url': 'https://example.com',
            'repository_plan': 'personal',
            'tool': 'Git',
        })

        self._verify_repository_info(
            rsp=rsp,
            expected_tool_id='git',
            expected_attrs={
                'extra_data': {
                    'bug_tracker_use_hosting': False,
                    'gitlab_personal_repo_name': 'myrepo',
                    'hosting_url': 'https://example.com',
                    'repository_plan': 'personal',
                },
                'hosting_account': account,
                'mirror_path': 'https://example.com/test-user/myrepo.git',
                'path': '[email protected]:test-user/myrepo.git',
            })

        self.assertSpyCalled(GitLab.is_authorized)
        self.assertSpyCalled(GitLab.check_repository)
    def test_find_domain_controllers_from_dns_with_custom_domain(self):
        """Testing ActiveDirectoryBackend.find_domain_controllers_from_dns
        with custom domain
        """
        self.spy_on(
            dns.resolver.query,
            op=kgb.SpyOpReturn(
                dns.resolver.Answer(
                    qname=dns.name.from_text('_ldap._tcp.corp.example.com'),
                    rdtype=dns.rdatatype.SRV,
                    rdclass=dns.rdataclass.IN,
                    response=dns.message.from_text(
                        'id 12345\n'
                        'opcode QUERY\n'
                        'rcode NOERROR\n'
                        'flags QR RD RA\n'
                        ';QUESTION\n'
                        '_ldap._tcp.corp.example.com. IN SRV\n'
                        ';ANSWER\n'
                        '_ldap._tcp.corp.example.com. 299 IN SRV 10 1 389'
                        ' my-ad3.example.com.\n'
                        '_ldap._tcp.corp.example.com. 299 IN SRV 5 1 390'
                        ' my-ad2.example.com.\n'
                        '_ldap._tcp.corp.example.com. 299 IN SRV 5 5 391'
                        ' my-ad1.example.com.\n'
                        ';AUTHORITY\n'
                        ';ADDITIONAL\n'))))

        self.assertEqual(
            self.backend.find_domain_controllers_from_dns('corp.example.com'),
            [
                (391, 'my-ad1.example.com'),
                (390, 'my-ad2.example.com'),
                (389, 'my-ad3.example.com'),
            ])

        self.assertSpyCalledWith(dns.resolver.query,
                                 '_ldap._tcp.corp.example.com',
                                 rdtype='SRV')
Exemple #13
0
    def test_authenticate_with_invalid_credentials(self):
        """Testing LDAPBackend.authenticate with invalid credentials"""
        self.spy_on(TestLDAPObject.bind_s,
                    owner=TestLDAPObject,
                    op=kgb.SpyOpRaise(ldap.INVALID_CREDENTIALS()))
        self.spy_on(TestLDAPObject.search_s,
                    owner=TestLDAPObject,
                    op=kgb.SpyOpReturn([
                        ('CN=Doc Dwarf,OU=MyOrg,DC=example,DC=COM', {}),
                    ]))

        user = self.backend.authenticate(request=None,
                                         username='******',
                                         password='******')
        self.assertIsNone(user)

        self.assertSpyCalledWith(TestLDAPObject.bind_s,
                                 'CN=Doc Dwarf,OU=MyOrg,DC=example,DC=COM',
                                 'mypass')
        self.assertSpyCalledWith(TestLDAPObject.search_s,
                                 'CN=admin,DC=example,DC=com',
                                 ldap.SCOPE_SUBTREE, '(uid=doc)')
Exemple #14
0
    def test_authenticate_with_exception(self):
        """Testing LDAPBackend.authenticate with unexpected exception"""
        self.spy_on(TestLDAPObject.bind_s,
                    owner=TestLDAPObject,
                    op=kgb.SpyOpRaise(Exception('oh no!')))
        self.spy_on(TestLDAPObject.search_s,
                    owner=TestLDAPObject,
                    op=kgb.SpyOpReturn([
                        ('CN=Doc Dwarf,OU=MyOrg,DC=example,DC=COM', {}),
                    ]))

        user = self.backend.authenticate(request=None,
                                         username='******',
                                         password='******')
        self.assertIsNone(user)

        self.assertSpyCalledWith(TestLDAPObject.bind_s,
                                 'CN=Doc Dwarf,OU=MyOrg,DC=example,DC=COM',
                                 'mypass')
        self.assertSpyCalledWith(TestLDAPObject.search_s,
                                 'CN=admin,DC=example,DC=com',
                                 ldap.SCOPE_SUBTREE, '(uid=doc)')
    def _get_settings_upgrade_needed(self, stored_settings):
        """Return Site.get_settings_upgrade_needed with the provided settings.

        Args:
            stored_settings (dict):
                A dictionary of settings that would be stored in
                :file:`settings_local.py`.

        Returns:
            bool:
            The result of :py:class:`~reviewboard.cmdline.rbsite.Site.
            get_settings_upgrade_needed`.
        """
        class SettingsLocal(object):
            pass

        for key, value in six.iteritems(stored_settings):
            setattr(SettingsLocal, key, value)

        site = Site(install_dir=self.sitedir2, options={})
        self.spy_on(site.get_settings_local, op=kgb.SpyOpReturn(SettingsLocal))

        return site.get_settings_upgrade_needed()
    def test_sends_404_when_no_patch_error(self):
        """Testing DownloadPatchErrorBundleView returns 404 when
        no patch error is raised by the renderer.
        """
        review_request = self.create_review_request(publish=True,
                                                    create_repository=True)
        diffset = self.create_diffset(review_request=review_request)
        self.create_diffcommit(diffset=diffset)
        filediff_id = diffset.files.all()[0].pk

        # This does not raise a PatchError, so there is no patch error bundle.
        self.spy_on(DiffRenderer.render_to_response,
                    op=kgb.SpyOpReturn(HttpResponse()))

        response = self.client.get(
            local_site_reverse('patch-error-bundle',
                               kwargs={
                                   'review_request_id': review_request.pk,
                                   'revision': diffset.revision,
                                   'filediff_id': filediff_id,
                               }))

        self.assertEqual(response.status_code, 404)
    def test_authenticate_with_valid_credentials_with_at(self):
        """Testing ActiveDirectoryBackend.authenticate with valid credentials
        and "@" in username
        """
        self.spy_on(TestLDAPObject.simple_bind_s, owner=TestLDAPObject)
        self.spy_on(TestLDAPObject.search_s,
                    owner=TestLDAPObject,
                    op=kgb.SpyOpReturn([
                        ('CN=Test User,OU=MyOrg,DC=example,DC=com', {
                            'givenName': [b'Test'],
                            'sn': [b'User'],
                            'mail': [b'*****@*****.**'],
                        }),
                    ]))

        user = self.backend.authenticate(request=None,
                                         username='******',
                                         password='******')

        self.assertIsNotNone(user)

        self.assertIsNotNone(user.pk)
        self.assertEqual(user.username, 'test-user')
        self.assertEqual(user.first_name, 'Test')
        self.assertEqual(user.last_name, 'User')
        self.assertEqual(user.email, '*****@*****.**')
        self.assertFalse(user.is_staff)
        self.assertFalse(user.is_superuser)

        self.assertSpyCalledWith(TestLDAPObject.simple_bind_s,
                                 '*****@*****.**', 'test-pass')
        self.assertSpyCalledWith(
            TestLDAPObject.search_s,
            'dc=test,dc=example,dc=com',
            filterstr='(&(objectClass=user)(sAMAccountName=test-user))',
            scope=ldap.SCOPE_SUBTREE)
    def test_create_from_data_custom_parser_extra_data(self):
        """Testing DiffCommitManager.create_from_data with a custom diff parser
        that sets extra_data
        """
        repository = self.create_repository(tool_name='Test')

        class CustomParser(DiffParser):
            def parse(self):
                result = super(CustomParser, self).parse()

                self.parsed_diff.extra_data = {
                    'key1': 'value1',
                }

                self.parsed_diff_change.extra_data = {
                    'key2': 'value2',
                }

                return result

            def parse_diff_header(self, linenum, parsed_file):
                parsed_file.extra_data = {
                    'key3': 'value3',
                }

                return super(CustomParser,
                             self).parse_diff_header(linenum, parsed_file)

        self.spy_on(repository.get_file_exists, op=kgb.SpyOpReturn(True))

        tool = repository.get_scmtool()

        self.spy_on(repository.get_scmtool, op=kgb.SpyOpReturn(tool))
        self.spy_on(tool.get_parser,
                    call_fake=lambda repo, diff: CustomParser(diff))

        diffset = DiffSet.objects.create_empty(repository=repository,
                                               basedir='',
                                               revision=1)

        diffcommit = DiffCommit.objects.create_from_data(
            repository=repository,
            diff_file_name='diff',
            diff_file_contents=self.DEFAULT_FILEDIFF_DATA_DIFF,
            parent_diff_file_name=None,
            parent_diff_file_contents=b'',
            request=None,
            commit_id='r1',
            parent_id='r0',
            author_name='Author',
            author_email='*****@*****.**',
            author_date=parse_date('2000-01-01 00:00:00-0600'),
            committer_name='Committer',
            committer_email='*****@*****.**',
            committer_date=None,
            commit_message='Description',
            diffset=diffset,
            validation_info={})

        # Test against what's in the database.
        diffset.refresh_from_db()
        diffcommit.refresh_from_db()

        self.assertEqual(diffset.extra_data, {
            'key1': 'value1',
        })

        self.assertEqual(diffcommit.extra_data, {
            'key2': 'value2',
        })

        self.assertEqual(diffset.files.count(), 1)

        filediff = diffset.files.all()[0]
        self.assertEqual(
            filediff.extra_data, {
                'is_symlink': False,
                'key3': 'value3',
                'raw_delete_count': 1,
                'raw_insert_count': 1,
            })

        # Check the FileLookupContext passed to get_file_exists.
        self.assertSpyCallCount(repository.get_file_exists, 1)

        context = repository.get_file_exists.last_call.kwargs.get('context')
        self.assertIsNotNone(context)
        self.assertEqual(context.diff_extra_data, {
            'key1': 'value1',
        })
        self.assertEqual(context.commit_extra_data, {
            'key2': 'value2',
        })
        self.assertEqual(context.file_extra_data, {
            'key3': 'value3',
        })
    def test_create_from_data_custom_parser_extra_data_and_parent(self):
        """Testing DiffSetManager.create_from_data with a custom diff parser
        that sets extra_data and using parent diff
        """
        repository = self.create_repository(tool_name='Test')

        namespaces = ['main_', 'parent_']

        class CustomParser(DiffParser):
            def parse(self):
                self.namespace = namespaces.pop(0)

                result = super(CustomParser, self).parse()

                self.parsed_diff.extra_data = {
                    '%skey1' % self.namespace: 'value1',
                }

                self.parsed_diff_change.extra_data = {
                    '%skey2' % self.namespace: 'value2',
                }

                return result

            def parse_diff_header(self, linenum, parsed_file):
                parsed_file.extra_data = {
                    '%skey3' % self.namespace: 'value3',
                }

                return super(CustomParser,
                             self).parse_diff_header(linenum, parsed_file)

        self.spy_on(repository.get_file_exists, op=kgb.SpyOpReturn(True))

        tool = repository.get_scmtool()

        self.spy_on(repository.get_scmtool, op=kgb.SpyOpReturn(tool))
        self.spy_on(tool.get_parser,
                    call_fake=lambda repo, diff: CustomParser(diff))

        diffset = DiffSet.objects.create_from_data(
            repository=repository,
            diff_file_name='diff',
            diff_file_contents=self.DEFAULT_FILEDIFF_DATA_DIFF,
            parent_diff_file_name='parent-diff',
            parent_diff_file_contents=self.DEFAULT_FILEDIFF_DATA_DIFF,
            basedir='/')

        # Test against what's in the database.
        diffset.refresh_from_db()

        self.assertEqual(
            diffset.extra_data, {
                'change_extra_data': {
                    'main_key2': 'value2',
                },
                'main_key1': 'value1',
                'parent_extra_data': {
                    'change_extra_data': {
                        'parent_key2': 'value2',
                    },
                    'parent_key1': 'value1',
                },
            })

        self.assertEqual(diffset.files.count(), 1)

        filediff = diffset.files.all()[0]
        self.assertEqual(
            filediff.extra_data, {
                '__parent_diff_empty': False,
                'is_symlink': False,
                'main_key3': 'value3',
                'parent_extra_data': {
                    'parent_key3': 'value3',
                },
                'parent_source_filename': '/README',
                'parent_source_revision': 'revision 123',
                'raw_delete_count': 1,
                'raw_insert_count': 1,
            })

        # Check the FileLookupContext passed to get_file_exists.
        self.assertSpyCallCount(repository.get_file_exists, 1)

        context = repository.get_file_exists.last_call.kwargs.get('context')
        self.assertIsNotNone(context)
        self.assertEqual(context.diff_extra_data, {
            'parent_key1': 'value1',
        })
        self.assertEqual(context.commit_extra_data, {
            'parent_key2': 'value2',
        })
        self.assertEqual(context.file_extra_data, {
            'parent_key3': 'value3',
        })