def test_merge_accounts(self):
        self.assertEqual(0, merge_accounts(self.db, {}, []))

        master_id = self.db.users.insert({
                'email': '*****@*****.**',
                'twitter_id': 1234,
                'authorized_apps': ['a', 'b'],
                }, safe=True)
        master_user = self.db.users.find_one({'_id': master_id}, safe=True)

        self.db.passwords.insert({
                'owner': master_id,
                'password1': 'secret1',
                }, safe=True)

        # merging with itself does nothing
        self.assertEqual(1, self.db.users.count())
        self.assertEqual(0, merge_accounts(self.db, master_user,
                                            [str(master_id)]))
        master_user_reloaded = self.db.users.find_one({'_id': master_id},
                                                      safe=True)
        self.assertEqual(master_user, master_user_reloaded)
        self.assertEqual(1, self.db.users.count())

        # merge with invented users does nothing neither
        self.assertEqual(0, merge_accounts(self.db, master_user,
                                           ['000000000000000000000000']))
        master_user_reloaded = self.db.users.find_one({'_id': master_id},
                                                      safe=True)
        self.assertEqual(master_user, master_user_reloaded)
        self.assertEqual(1, self.db.users.count())

        # let's create valid users
        other_id = self.db.users.insert({
                'email': '*****@*****.**',
                'google_id': 4321,
                'authorized_apps': ['b', 'c'],
                }, safe=True)
        self.assertEqual(2, self.db.users.count())
        self.db.passwords.insert({
                'owner': other_id,
                'password2': 'secret2',
                }, safe=True)

        self.assertEqual(1, merge_accounts(self.db, master_user,
                                           [str(other_id)]))
        master_user_reloaded = self.db.users.find_one({'_id': master_id},
                                                      safe=True)
        self.assertEqual({
                '_id': master_id,
                'email': '*****@*****.**',
                'twitter_id': 1234,
                'google_id': 4321,
                'authorized_apps': ['a', 'b', 'c'],
                }, master_user_reloaded)
        self.assertEqual(1, self.db.users.count())
        self.assertEqual(2,
                         self.db.passwords.find({'owner': master_id}).count())
    def test_merge_valid_users(self):
        master_id, master_user = self._create_master_user()

        # let's create valid users
        other_id = self.db.users.insert({
            'email': '*****@*****.**',
            'google_id': 4321,
        })
        self._add_authorized_app(other_id, 'b')
        self._add_authorized_app(other_id, 'c')
        self.assertEqual(2, self.db.users.count())
        self.db.passwords.insert({
            'owner': other_id,
            'password2': 'secret2',
        })

        self.assertEqual(1, merge_accounts(self.db, master_user,
                                           [str(other_id)]))
        master_user_reloaded = self.db.users.find_one({'_id': master_id})
        self.assertEqual({
            '_id': master_id,
            'email': '*****@*****.**',
            'twitter_id': 1234,
            'google_id': 4321,
        }, master_user_reloaded)
        self.assertEqual(1, self.db.users.count())
        self.assertEqual(2,
                         self.db.passwords.find({'owner': master_id}).count())
    def test_merge_with_invented_users(self):
        master_id, master_user = self._create_master_user()

        self.assertEqual(0, merge_accounts(self.db, master_user,
                                           ['000000000000000000000000']))
        master_user_reloaded = self.db.users.find_one({'_id': master_id})
        self.assertEqual(master_user, master_user_reloaded)
        self.assertEqual(1, self.db.users.count())
Exemple #4
0
    def test_merge_with_itself(self):
        user = User()
        Session.add(user)
        Session.flush()

        self.assertEqual(1, Session.query(User).count())
        self.assertEqual(0, merge_accounts(user, [user.id]))
        self.assertEqual(1, Session.query(User).count())
Exemple #5
0
    def test_merge_with_invented_users(self):
        user = User()
        Session.add(user)
        Session.flush()

        fake_id = '00000000-0000-0000-0000-000000000000'
        self.assertEqual(1, Session.query(User).count())
        self.assertEqual(0, merge_accounts(user, [fake_id]))
        self.assertEqual(1, Session.query(User).count())
Exemple #6
0
    def test_merge_valid_users(self):
        master_user = User()
        Session.add(master_user)

        other_user = User()
        Session.add(other_user)

        Session.flush()

        self.assertEqual(2, Session.query(User).count())
        self.assertEqual(1, merge_accounts(master_user, [other_user.id]))
        self.assertEqual(1, Session.query(User).count())
Exemple #7
0
def identity_providers(request):
    current_provider = request.session.get('current_provider', None)
    accounts = get_accounts(request.db, request.user, current_provider)
    context = {
        'accounts': accounts
    }
    verified = [ac for ac in accounts if ac['is_verified']]
    context['can_merge'] = len(verified) > 1

    if 'submit' in request.POST:
        if not context['can_merge']:
            return HTTPBadRequest('You do not have enough accounts to merge')

        def is_verified(ac):
            for a in accounts:
                if a['id'] == ac:
                    return a['is_verified']
            return False

        accounts_to_merge = [account.replace('account-', '')
                             for account in request.POST.keys()
                             if account != 'submit']
        accounts_to_merge = [account
                             for account in accounts_to_merge
                             if is_verified(account)]

        if len(accounts_to_merge) > 1:
            merged = merge_accounts(request.db, request.user,
                                    accounts_to_merge)
            localizer = get_localizer(request)
            msg = localizer.pluralize(
                _('Congratulations, ${n_merged} of your accounts has been merged into the current one'),
                _('Congratulations, ${n_merged} of your accounts have been merged into the current one'),
                merged,
                domain=translation_domain,
                mapping={'n_merged': merged},
            )
            request.session.flash(msg, 'success')
        else:
            request.session.flash(
                _('Not enough accounts for merging'),
                'error',
            )

        return HTTPFound(
            location=request.route_path('user_identity_providers'))

    return context
Exemple #8
0
def identity_providers(request):
    current_provider = request.session.get('current_provider', None)
    accounts = request.user.get_accounts(current_provider)
    context = {'accounts': accounts}
    verified = [ac for ac in accounts if ac['is_verified']]
    context['can_merge'] = len(verified) > 1

    if 'submit' in request.POST:
        if not context['can_merge']:
            return HTTPBadRequest('You do not have enough accounts to merge')

        def is_verified(ac):
            for a in accounts:
                if a['id'] == ac:
                    return a['is_verified']
            return False

        accounts_to_merge = [
            account.replace('account-', '') for account in request.POST.keys()
            if account != 'submit'
        ]
        accounts_to_merge = [
            account for account in accounts_to_merge if is_verified(account)
        ]

        if len(accounts_to_merge) > 1:
            merged = merge_accounts(request.user, accounts_to_merge)
            localizer = get_localizer(request)
            msg = localizer.pluralize(
                _('Congratulations, ${n_merged} of your accounts has been merged into the current one'
                  ),
                _('Congratulations, ${n_merged} of your accounts have been merged into the current one'
                  ),
                merged,
                domain=translation_domain,
                mapping={'n_merged': merged},
            )
            request.session.flash(msg, 'success')
        else:
            request.session.flash(
                _('Not enough accounts for merging'),
                'error',
            )

        return HTTPFound(
            location=request.route_path('user_identity_providers'))

    return context
 def test_merge_empty_user(self):
     self.assertEqual(0, merge_accounts(self.db, {}, []))
Exemple #10
0
 def test_merge_empty_user(self):
     self.assertEqual(0, merge_accounts(None, []))