Beispiel #1
0
    def get_for(cls,
                user,
                email=None,
                blake2b160=None,
                blake2b=None,
                email_hash=None):
        """
        Return a UserEmailClaim with matching email address for the given user.

        :param User user: User who claimed this email address
        :param str email: Email address to look up
        :param bytes blake2b160: 160-bit blake2b of email address to look up
        :param bytes blake2b: 128-bit blake2b of email address to look up (deprecated)
        :param str email_hash: Base58 rendering of 160-bit blake2b hash
        """
        require_one_of(email=email,
                       blake2b160=blake2b160,
                       email_hash=email_hash,
                       blake2b=blake2b)
        if blake2b:
            return cls.query.filter_by(blake2b=blake2b,
                                       user=user).one_or_none()
        return (cls.query.join(EmailAddress).filter(
            cls.user == user,
            EmailAddress.get_filter(email=email,
                                    blake2b160=blake2b160,
                                    email_hash=email_hash),
        ).one_or_none())
Beispiel #2
0
    def get(cls, username=None, buid=None, userid=None, defercols=False):
        """
        Return a User with the given username or buid.

        :param str username: Username to lookup
        :param str buid: Buid to lookup
        :param bool defercols: Defer loading non-critical columns
        """
        require_one_of(username=username, buid=buid, userid=userid)

        # userid parameter is temporary for Flask-Lastuser compatibility
        if userid:
            buid = userid

        if username is not None:
            query = cls.query.join(Profile).filter(
                db.func.lower(Profile.name) == db.func.lower(username))
        else:
            query = cls.query.filter_by(buid=buid)
        if defercols:
            query = query.options(*cls._defercols)
        user = query.one_or_none()
        if user and user.status == USER_STATUS.MERGED:
            user = user.merged_user()
        if user and user.is_active:
            return user
Beispiel #3
0
 def get_for(cls, auth_client, user=None, user_session=None):
     require_one_of(user=user, user_session=user_session)
     if user:
         return cls.query.filter_by(auth_client=auth_client,
                                    user=user).one_or_none()
     else:
         return cls.query.filter_by(
             auth_client=auth_client,
             user_session=user_session).one_or_none()
Beispiel #4
0
    def get(cls, name, client=None, namespace=None):
        """
        Return a Resource with the given name.

        :param str name: Name of the resource.
        """
        require_one_of(client=client, namespace=namespace)

        if client:
            return cls.query.filter_by(name=name, client=client).one_or_none()
        else:
            return cls.query.filter_by(name=name).join(Client).filter(Client.namespace == namespace).one_or_none()
Beispiel #5
0
    def get(cls, email=None, md5sum=None):
        """
        Return a UserEmail with matching email or md5sum.

        :param str email: Email address to lookup
        :param str md5sum: md5sum of email address to lookup
        """
        require_one_of(email=email, md5sum=md5sum)

        if email:
            return cls.query.filter(cls.email.in_([email, email.lower()])).one_or_none()
        else:
            return cls.query.filter_by(md5sum=md5sum).one_or_none()
Beispiel #6
0
    def get(cls, name, client=None, namespace=None):
        """
        Return a Resource with the given name.

        :param str name: Name of the resource.
        """
        require_one_of(client=client, namespace=namespace)

        if client:
            return cls.query.filter_by(name=name, client=client).one_or_none()
        else:
            return cls.query.filter_by(name=name).join(Client).filter(
                Client.namespace == namespace).one_or_none()
Beispiel #7
0
    def get(cls, email=None, md5sum=None):
        """
        Return a UserEmail with matching email or md5sum.

        :param str email: Email address to lookup
        :param str md5sum: md5sum of email address to lookup
        """
        require_one_of(email=email, md5sum=md5sum)

        if email:
            return cls.query.filter(cls.email.in_([email, email.lower()
                                                   ])).one_or_none()
        else:
            return cls.query.filter_by(md5sum=md5sum).one_or_none()
Beispiel #8
0
    def get_for(cls, user, email=None, md5sum=None):
        """
        Return a UserEmail with matching md5sum if it belongs to the given user

        :param User user: User to lookup for
        :param str md5sum: md5sum of email address
        """
        require_one_of(email=email, md5sum=md5sum)
        if email:
            return cls.query.filter(cls.user == user,
                                    cls.email.in_([email, email.lower()
                                                   ])).one_or_none()
        else:
            return cls.query.filter_by(user=user, md5sum=md5sum).one_or_none()
Beispiel #9
0
    def get_for(cls, user, email=None, md5sum=None):
        """
        Return a UserEmailClaim with matching email address for the given user.

        :param User user: User who claimed this email address
        :param str email: Email address to lookup
        :param str md5sum: md5sum of email address to lookup
        """
        require_one_of(email=email, md5sum=md5sum)
        if email:
            return (cls.query.filter(
                UserEmailClaim.email.in_(
                    [email,
                     email.lower()])).filter_by(user=user).one_or_none())
        else:
            return cls.query.filter_by(md5sum=md5sum, user=user).one_or_none()
Beispiel #10
0
    def loader(self, profile, project, suuid, url_name_suuid=None, url_id_name=None):
        require_one_of(url_name_suuid=url_name_suuid, url_id_name=url_id_name)
        if url_name_suuid:
            proposal = Proposal.query.join(Project, Profile).filter(
                Profile.name == profile, Project.name == project, Proposal.url_name_suuid == url_name_suuid
                ).first_or_404()
        else:
            proposal = Proposal.query.join(Project, Profile).filter(
                Profile.name == profile, Project.name == project, Proposal.url_name == url_id_name
                ).first_or_404()

        comment = Comment.query.join(
            Proposal, Comment.commentset_id == Proposal.commentset_id
            ).filter(Comment.suuid == suuid, Proposal.id == proposal.id).first_or_404()

        return ProposalComment(proposal, comment)
Beispiel #11
0
    def get(cls, name=None, userid=None, buid=None):
        require_one_of(name=name, userid=userid, buid=buid)

        if userid:
            profile = cls.query.filter_by(userid=userid, status=USER_STATUS.ACTIVE).one_or_none()
        elif buid:
            # buid is used in Nodular, where it has slightly different semantics from
            # userid: buid always gets the Node if it exists, so there's no check
            # against the status column
            profile = cls.query.filter_by(buid=buid).one_or_none()
        else:
            profile = cls.query.filter_by(name=name, status=USER_STATUS.ACTIVE).one_or_none()

        if profile.is_merged:
            profile = profile.merged_profile()
        if profile.is_active:
            return profile
Beispiel #12
0
 def get_by(cls,
            verification_code,
            blake2b=None,
            blake2b160=None,
            email_hash=None):
     require_one_of(blake2b=blake2b,
                    blake2b160=blake2b160,
                    email_hash=email_hash)
     if blake2b:
         return cls.query.filter_by(
             blake2b=blake2b,
             verification_code=verification_code).one_or_none()
     return (cls.query.join(EmailAddress).filter(
         cls.verification_code == verification_code,
         EmailAddress.get_filter(blake2b160=blake2b160,
                                 email_hash=email_hash),
     ).one_or_none())
Beispiel #13
0
    def get(cls, name=None, buid=None, defercols=False):
        """
        Return an Organization with matching name or buid. Note that ``name`` is the username, not the title.

        :param str name: Name of the organization
        :param str buid: Buid of the organization
        :param bool defercols: Defer loading non-critical columns
        """
        require_one_of(name=name, buid=buid)

        if name is not None:
            query = cls.query.join(Name).filter(Name.name == name)
        else:
            query = cls.query.filter_by(buid=buid)
        if defercols:
            query = query.options(*cls._defercols)
        return query.one_or_none()
Beispiel #14
0
    def get(cls, name=None, buid=None, defercols=False):
        """
        Return an Organization with matching name or buid. Note that ``name`` is the username, not the title.

        :param str name: Name of the organization
        :param str buid: Buid of the organization
        :param bool defercols: Defer loading non-critical columns
        """
        require_one_of(name=name, buid=buid)

        if name is not None:
            query = cls.query.join(Name).filter(Name.name == name)
        else:
            query = cls.query.filter_by(buid=buid)
        if defercols:
            query = query.options(*cls._defercols)
        return query.one_or_none()
Beispiel #15
0
    def get(cls, key=None, namespace=None):
        """
        Return a Client identified by its client key or namespace. Only returns active clients.

        :param str key: Client key to lookup
        :param str namespace: Client namespace to lookup
        """
        param, value = require_one_of(True, key=key, namespace=namespace)
        return cls.query.filter_by(**{param: value, 'active': True}).one_or_none()
Beispiel #16
0
    def get(cls, username=None, userid=None, defercols=True):
        """
        Return a User with the given username or userid.

        :param str username: Username to lookup
        :param str userid: Userid to lookup
        """
        param, value = require_one_of(True, username=username, userid=userid)
        query = cls.query.filter_by(**{param: value})
        if not defercols:
            query = query.options(undefer('userinfo'))
        return query.one_or_none()
Beispiel #17
0
    def get(cls, buid=None, namespace=None):
        """
        Return a AuthClient identified by its client buid or namespace. Only returns active clients.

        :param str buid: AuthClient buid to lookup
        :param str namespace: AuthClient namespace to lookup
        """
        param, value = require_one_of(True, buid=buid, namespace=namespace)
        return cls.query.filter_by(**{
            param: value,
            'active': True
        }).one_or_none()
Beispiel #18
0
    def get(cls, key=None, namespace=None):
        """
        Return a Client identified by its client key or namespace. Only returns active clients.

        :param str key: Client key to lookup
        :param str namespace: Client namespace to lookup
        """
        param, value = require_one_of(True, key=key, namespace=namespace)
        return cls.query.filter_by(**{
            param: value,
            'active': True
        }).one_or_none()
Beispiel #19
0
    def get(cls, username=None, buid=None, defercols=False):
        """
        Return a User with the given username or buid.

        :param str username: Username to lookup
        :param str buid: Buid to lookup
        :param bool defercols: Defer loading non-critical columns
        """
        require_one_of(username=username, buid=buid)

        if username is not None:
            query = cls.query.join(Name).filter(Name.name == username)
        else:
            query = cls.query.filter_by(buid=buid)
        if defercols:
            query = query.options(*cls._defercols)
        user = query.one_or_none()
        if user and user.status == USER_STATUS.MERGED:
            user = user.merged_user()
        if user and user.is_active:
            return user
Beispiel #20
0
 def loader(self, profile, project, url_name_suuid=None, url_id_name=None):
     require_one_of(url_name_suuid=url_name_suuid, url_id_name=url_id_name)
     if url_name_suuid:
         proposal = self.model.query.join(Project, Profile).filter(
             Proposal.url_name_suuid == url_name_suuid
             ).first_or_404()
     else:
         proposal = self.model.query.join(Project, Profile).filter(
             Profile.name == profile, Project.name == project, Proposal.url_name == url_id_name
             ).first()
         if proposal is None:
             if request.method == 'GET':
                 redirect = ProposalRedirect.query.join(Project, Profile).filter(
                     Profile.name == profile, Project.name == project, ProposalRedirect.url_name == url_id_name
                     ).first_or_404()
                 return redirect
             else:
                 abort(404)
     if proposal.project.state.DELETED or proposal.state.DELETED:
         abort(410)
     return proposal
Beispiel #21
0
    def get(cls, username=None, buid=None, defercols=False):
        """
        Return a User with the given username or buid.

        :param str username: Username to lookup
        :param str buid: Buid to lookup
        :param bool defercols: Defer loading non-critical columns
        """
        require_one_of(username=username, buid=buid)

        if username is not None:
            query = cls.query.join(Name).filter(Name.name == username)
        else:
            query = cls.query.filter_by(buid=buid)
        if defercols:
            query = query.options(*cls._defercols)
        user = query.one_or_none()
        if user and user.status == USER_STATUS.MERGED:
            user = user.merged_user()
        if user and user.is_active:
            return user
Beispiel #22
0
 def loader(self,
            profile,
            project,
            url_name_uuid_b58=None,
            url_id_name=None):
     require_one_of(url_name_uuid_b58=url_name_uuid_b58,
                    url_id_name=url_id_name)
     if url_name_uuid_b58:
         proposal = (self.model.query.join(Project, Profile).filter(
             Proposal.url_name_uuid_b58 == url_name_uuid_b58).first())
         if proposal is None:
             if request.method == 'GET':
                 redirect = (
                     ProposalSuuidRedirect.query.join(Proposal).filter(
                         ProposalSuuidRedirect.suuid ==
                         url_name_uuid_b58.split('-')[-1]).first_or_404())
                 return redirect
             else:
                 abort(404)
     else:
         proposal = (self.model.query.join(Project, Profile).filter(
             db.func.lower(Profile.name) == db.func.lower(profile),
             Project.name == project,
             Proposal.url_name == url_id_name,
         ).first())
         if proposal is None:
             if request.method == 'GET':
                 redirect = (ProposalRedirect.query.join(
                     Project, Profile).filter(
                         db.func.lower(
                             Profile.name) == db.func.lower(profile),
                         Project.name == project,
                         ProposalRedirect.url_name == url_id_name,
                     ).first_or_404())
                 return redirect
             else:
                 abort(404)
     if proposal.project.state.DELETED or proposal.state.DELETED:
         abort(410)
     return proposal
Beispiel #23
0
    def get(cls, name=None, buid=None, defercols=False):
        """
        Return an Organization with matching name or buid. Note that ``name`` is the username, not the title.

        :param str name: Name of the organization
        :param str buid: Buid of the organization
        :param bool defercols: Defer loading non-critical columns
        """
        param, value = require_one_of(True, name=name, buid=buid)
        query = cls.query.filter_by(**{param: value})
        if defercols:
            query = query.options(*cls._defercols)
        return query.one_or_none()
Beispiel #24
0
    def get_filter(
        cls,
        email: Optional[str] = None,
        blake2b160: Optional[bytes] = None,
        email_hash: Optional[str] = None,
    ):
        """
        Get an filter condition for retriving an EmailAddress.

        Accepts an email address or a blake2b160 hash in either bytes or base58 form.
        Internally converts all lookups to a bytes-based hash lookup. Returns an
        expression suitable for use as a query filter.
        """
        require_one_of(email=email, blake2b160=blake2b160, email_hash=email_hash)
        if email:
            if not cls.is_valid_email_address(email):
                return
            blake2b160 = email_blake2b160_hash(email)
        elif email_hash:
            blake2b160 = base58.b58decode(email_hash)

        return cls.blake2b160 == blake2b160
Beispiel #25
0
    def get(cls, name=None, buid=None, defercols=False):
        """
        Return an Organization with matching name or buid. Note that ``name`` is the username, not the title.

        :param str name: Name of the organization
        :param str buid: Buid of the organization
        :param bool defercols: Defer loading non-critical columns
        """
        param, value = require_one_of(True, name=name, buid=buid)
        query = cls.query.filter_by(**{param: value})
        if defercols:
            query = query.options(*cls._defercols)
        return query.one_or_none()
Beispiel #26
0
    def get(cls, service, userid=None, username=None):
        """
        Return a UserExternalId with the given service and userid or username.

        :param str service: Service to lookup
        :param str userid: Userid to lookup
        :param str username: Username to lookup (may be non-unique)

        Usernames are not guaranteed to be unique within a service. An example is with Google,
        where the userid is a directed OpenID URL, unique but subject to change if the Lastuser
        site URL changes. The username is the email address, which will be the same despite
        different userids.
        """
        param, value = require_one_of(True, userid=userid, username=username)
        return cls.query.filter_by(**{param: value, 'service': service}).one_or_none()
Beispiel #27
0
    def get(cls, name, user=None, org=None, allusers=False):
        """
        Get a permission with the given name and owned by the given user or org,
        or a permission available to all users.

        :param str name: Name of the permission
        :param User user: User who owns this permission
        :param Organization org: Organization which owns this permission
        :param bool allusers: Whether resources that belong to all users should be returned

        One of ``user`` and ``org`` must be specified, unless ``allusers`` is ``True``.
        """
        if allusers:
            return cls.query.filter_by(name=name, allusers=True).one_or_none()
        else:
            param, value = require_one_of(True, user=user, org=org)
            return cls.query.filter_by(**{param: value, 'name': name}).one_or_none()
Beispiel #28
0
    def get(cls, service, userid=None, username=None):
        """
        Return a UserExternalId with the given service and userid or username.

        :param str service: Service to lookup
        :param str userid: Userid to lookup
        :param str username: Username to lookup (may be non-unique)

        Usernames are not guaranteed to be unique within a service. An example is with Google,
        where the userid is a directed OpenID URL, unique but subject to change if the Lastuser
        site URL changes. The username is the email address, which will be the same despite
        different userids.
        """
        param, value = require_one_of(True, userid=userid, username=username)
        return cls.query.filter_by(**{
            param: value,
            'service': service
        }).one_or_none()
Beispiel #29
0
    def get(cls, name, user=None, org=None, allusers=False):
        """
        Get a permission with the given name and owned by the given user or org,
        or a permission available to all users.

        :param str name: Name of the permission
        :param User user: User who owns this permission
        :param Organization org: Organization which owns this permission
        :param bool allusers: Whether resources that belong to all users should be returned

        One of ``user`` and ``org`` must be specified, unless ``allusers`` is ``True``.
        """
        if allusers:
            return cls.query.filter_by(name=name, allusers=True).one_or_none()
        else:
            param, value = require_one_of(True, user=user, org=org)
            return cls.query.filter_by(**{
                param: value,
                'name': name
            }).one_or_none()
Beispiel #30
0
 def test_require_one_of(self):
     # Valid scenarios
     require_one_of(solo='solo')
     require_one_of(first='first', second=None)
     # Invalid scenarios
     with pytest.raises(TypeError):
         require_one_of()
     with pytest.raises(TypeError):
         require_one_of(solo=None)
     with pytest.raises(TypeError):
         require_one_of(first=None, second=None)
     with pytest.raises(TypeError):
         require_one_of(first='first', second='second')
     with pytest.raises(TypeError):
         require_one_of(first='first', second='second', third=None)
     with pytest.raises(TypeError):
         require_one_of(first='first', second='second', third='third')
     # Ask for which was passed in
     assert require_one_of(True, first='a', second=None) == ('first', 'a')
     assert require_one_of(True, first=None, second='b') == ('second', 'b')
Beispiel #31
0
 def test_require_one_of(self):
     # Valid scenarios
     require_one_of(solo='solo')
     require_one_of(first='first', second=None)
     # Invalid scenarios
     with self.assertRaises(TypeError):
         require_one_of()
     with self.assertRaises(TypeError):
         require_one_of(solo=None)
     with self.assertRaises(TypeError):
         require_one_of(first=None, second=None)
     with self.assertRaises(TypeError):
         require_one_of(first='first', second='second')
     with self.assertRaises(TypeError):
         require_one_of(first='first', second='second', third=None)
     with self.assertRaises(TypeError):
         require_one_of(first='first', second='second', third='third')
     # Ask for which was passed in
     self.assertEqual(require_one_of(True, first='a', second=None), ('first', 'a'))
     self.assertEqual(require_one_of(True, first=None, second='b'), ('second', 'b'))
Beispiel #32
0
 def test_require_one_of(self):
     # Valid scenarios
     require_one_of(solo='solo')
     require_one_of(first='first', second=None)
     # Invalid scenarios
     with self.assertRaises(TypeError):
         require_one_of()
     with self.assertRaises(TypeError):
         require_one_of(solo=None)
     with self.assertRaises(TypeError):
         require_one_of(first=None, second=None)
     with self.assertRaises(TypeError):
         require_one_of(first='first', second='second')
     with self.assertRaises(TypeError):
         require_one_of(first='first', second='second', third=None)
     with self.assertRaises(TypeError):
         require_one_of(first='first', second='second', third='third')
     # Ask for which was passed in
     self.assertEqual(require_one_of(True, first='a', second=None),
                      ('first', 'a'))
     self.assertEqual(require_one_of(True, first=None, second='b'),
                      ('second', 'b'))