Example #1
0
 def _sendApprovalEmail(self, user):
     url = '%s#user/%s' % (mail_utils.getEmailUrlPrefix(), str(user['_id']))
     text = mail_utils.renderTemplate('accountApproval.mako', {
         'user': user,
         'url': url
     })
     mail_utils.sendMailToAdmins('Girder: Account pending approval', text)
Example #2
0
    def generateTemporaryPassword(self, email):
        user = self._model.findOne({'email': self._model.hash(email.lower()), 'email_encrypted': True})

        if not user:
            user = self._model.findOne({'email': email.lower(), 'email_encrypted': {'$ne': True}})

        if not user:
            raise RestException('That email is not registered.')

        token = Token().createToken(user, days=(15/1440.0), scope=TokenScope.TEMPORARY_USER_AUTH)

        url = '%s#useraccount/%s/token/%s' % (
            mail_utils.getEmailUrlPrefix(), str(user['_id']), str(token['_id']))

        html = mail_utils.renderTemplate('temporaryAccess.mako', {
            'url': url,
            'token': str(token['_id'])
        })

        mail_utils.sendMail(
            '%s: Temporary access' % Setting().get(SettingKey.BRAND_NAME),
            html,
            [email]
        )
        return {'message': 'Sent temporary access email.'}
Example #3
0
def _uploadComplete(event):
    """
    Called after an upload finishes. We check if our current token is a special
    authorized upload token, and if so, delete it.

    TODO we could alternatively keep a reference count inside each token that authorized
    more than a single upload at a time, and just decrement it here.
    """
    token = getCurrentToken()
    if token and 'authorizedUploadId' in token:
        user = User().load(token['userId'], force=True)
        item = Item().load(event.info['file']['itemId'], force=True)

        # Save the metadata on the item
        item['description'] = token['authorizedUploadDescription']
        item['authorizedUploadEmail'] = token['authorizedUploadEmail']
        Item().save(item)

        text = mail_utils.renderTemplate('authorized_upload.uploadFinished.mako', {
            'itemId': item['_id'],
            'itemName': item['name'],
            'itemDescription': item.get('description', '')
        })
        mail_utils.sendMail('Authorized upload complete', text, [user['email']])
        Token().remove(token)
Example #4
0
 def _sendApprovedEmail(self, user):
     text = mail_utils.renderTemplate('accountApproved.mako', {
         'user': user,
         'url': mail_utils.getEmailUrlPrefix()
     })
     mail_utils.sendMail('Girder: Account approved', text,
                         [user.get('email')])
 def _sendCreateAccountEmail(self, user, email):
     # from girderformindlogger.models.token import Token
     #
     # token = Token().createToken(
     #     user, days=1, scope=TokenScope.EMAIL_VERIFICATION)
     url = 'https://web.mindlogger.org/#/signup?email={}'.format(email)
     text = mail_utils.renderTemplate('emailCreateAccount.mako',
                                      {'url': url})
     mail_utils.sendMail(to=email,
                         subject='MindLogger: Invitation',
                         text=text)
Example #6
0
    def _sendVerificationEmail(self, user, email):
        from girderformindlogger.models.token import Token

        token = Token().createToken(user,
                                    days=1,
                                    scope=TokenScope.EMAIL_VERIFICATION)
        url = '%s#useraccount/%s/verification/%s' % (
            mail_utils.getEmailUrlPrefix(), str(user['_id']), str(
                token['_id']))
        text = mail_utils.renderTemplate('emailVerification.mako',
                                         {'url': url})
        mail_utils.sendMail('Girder: Email verification', text, [email])
Example #7
0
 def _sendCreateAccountEmail(self, user, email):
     # from girderformindlogger.models.token import Token
     #
     # token = Token().createToken(
     #     user, days=1, scope=TokenScope.EMAIL_VERIFICATION)
     web_url = os.getenv('WEB_URI') or 'localhost:8082'
     url = f'https://{web_url}/#/signup?email={email}'
     text = mail_utils.renderTemplate('emailCreateAccount.mako', {
         'url': url
     })
     mail_utils.sendMail(
         to=email,
         subject='MindLogger: Invitation',
         text=text)
Example #8
0
    def inviteToGroup(
        self,
        group,
        userToInvite=None,
        email=None,
        level=AccessType.READ,
        quiet=False,
        force=False
    ):
        if ((
            userToInvite is None and email is None
        ) or (
            userToInvite is not None and email is not None
        )):
            raise ValidationException(
                "`POST /group/{id}/invitation` requires exactly one of `userID`"
                "and `email`."
            )
        groupModel = self._model
        user = self.getCurrentUser()
        if email is not None:
            userToInvite = User().findOne(query={"email": email}, force=True)
        if userToInvite is None:
            try:
                group["queue"] = list(set([email, *group.get("queue", [])]))
            except:
                group["queue"] = list(set([email]))
            groupModel.updateGroup(group)
            userToInvite = ProtoUser().createProtoUser(email=email)
            # TODO: send email to invite user
            return(group)
        if force:
            if not user['admin']:
                mustBeAdmin = True
                addPolicy = Setting().get(SettingKey.ADD_TO_GROUP_POLICY)
                addGroup = group.get('addAllowed', 'default')
                if addGroup not in ['no', 'yesadmin', 'yesmod']:
                    addGroup = addPolicy
                if (groupModel.hasAccess(
                        group, user, AccessType.ADMIN)
                        and ('mod' in addPolicy or 'admin' in addPolicy)
                        and addGroup.startswith('yes')):
                    mustBeAdmin = False
                elif (groupModel.hasAccess(
                        group, user, AccessType.WRITE)
                        and 'mod' in addPolicy
                        and addGroup == 'yesmod'):
                    mustBeAdmin = False
                if mustBeAdmin:
                    self.requireAdmin(user)
            groupModel.addUser(group, userToInvite, level=level)
        else:
            # Can only invite into access levels that you yourself have
            groupModel.requireAccess(group, user, level)
            groupModel.inviteUser(group, userToInvite, level)

            if not quiet:
                html = mail_utils.renderTemplate('groupInvite.mako', {
                    'userToInvite': userToInvite,
                    'user': user,
                    'group': group
                })
                mail_utils.sendMail(
                    "%s: You've been invited to a group" % Setting().get(SettingKey.BRAND_NAME),
                    html,
                    [userToInvite['email']]
                )

        group['access'] = groupModel.getFullAccessList(group)
        group['requests'] = list(groupModel.getFullRequestList(group))
        return(group)
Example #9
0
    def inviteUser(self,
                   applet,
                   role="user",
                   email='',
                   firstName='',
                   lastName='',
                   MRN=''):
        from girderformindlogger.models.invitation import Invitation
        from girderformindlogger.models.profile import Profile

        if not mail_utils.validateEmailAddress(email):
            raise ValidationException('invalid email', 'email')

        thisUser = self.getCurrentUser()

        encryptedEmail = UserModel().hash(email)
        invitedUser = UserModel().findOne({
            'email': encryptedEmail,
            'email_encrypted': True
        })

        if not invitedUser:
            invitedUser = UserModel().findOne({
                'email': email,
                'email_encrypted': {
                    '$ne': True
                }
            })

        if not AppletModel().isCoordinator(applet['_id'], thisUser):
            raise AccessException(
                "Only coordinators and managers can invite users.")

        if role not in USER_ROLE_KEYS:
            raise ValidationException('Invalid role.', 'role')

        invitation = Invitation().createInvitationForSpecifiedUser(
            applet=applet,
            coordinator=thisUser,
            role=role,
            user=invitedUser,
            firstName=firstName,
            lastName=lastName,
            MRN=MRN,
            userEmail=encryptedEmail)

        url = 'web.mindlogger.org/#/invitation/%s' % (str(invitation['_id'], ))

        managers = mail_utils.htmlUserList(AppletModel().listUsers(applet,
                                                                   'manager',
                                                                   force=True))
        coordinators = mail_utils.htmlUserList(AppletModel().listUsers(
            applet, 'coordinator', force=True))
        reviewers = mail_utils.htmlUserList(AppletModel().listUsers(
            applet, 'reviewer', force=True))

        html = mail_utils.renderTemplate(
            'userInvite.mako'
            if invitedUser else 'inviteUserWithoutAccount.mako', {
                'url': url,
                'userName': firstName,
                'coordinatorName': thisUser['firstName'],
                'appletName': applet['displayName'],
                'MRN': MRN,
                'managers': managers,
                'coordinators': coordinators,
                'reviewers': reviewers
            })

        mail_utils.sendMail('invitation for an applet', html, [email])

        return 'sent invitation mail to {}'.format(email)
Example #10
0
    def htmlInvitation(self,
                       invitation,
                       invitee=None,
                       fullDoc=False,
                       includeLink=True):
        """
        Returns an HTML document rendering the invitation.

        :param invitation: Invitation to render
        :type invitation: dict
        :param invitee: Invited user
        :type invitee: dict or None

        :returns: html document
        """
        from girderformindlogger.models.applet import Applet
        from girderformindlogger.models.profile import Profile
        from girderformindlogger.models.protocol import Protocol
        from girderformindlogger.models.token import Token
        from girderformindlogger.models.user import User
        from girderformindlogger.exceptions import GirderException
        from girderformindlogger.api.rest import getApiUrl
        from girderformindlogger.utility import context as contextUtil,        \
            mail_utils

        web_url = os.getenv('WEB_URI') or 'localhost:8082'

        accept = ("To accept or decline, visit <a href=\"{u}\">{u}</a>".format(
            u=f"https://{web_url}/#/invitation/{str(invitation['_id'])}")
                  ) if includeLink else ""
        applet = Applet().load(ObjectId(invitation['appletId']), force=True)
        appletName = applet['meta']['applet'].get(
            'displayName', applet.get('displayName', 'new applet'))
        try:
            skin = contextUtil.getSkin()
        except:
            skin = {}
        instanceName = skin.get("name", "MindLogger")
        role = invitation.get("role", "user")
        try:
            coordinator = Profile().coordinatorProfile(applet['_id'],
                                                       invitation["invitedBy"])
        except:
            coordinator = None
        displayProfile = Profile().displayProfileFields(invitation, invitee)
        description = applet.get('meta', {}).get('applet', {}).get(
            "schema:description",
            Protocol().load(
                applet['meta']['protocol']['_id'].split('protocol/')[-1],
                force=True).get('meta', {}).get('protocol') if 'protocol'
            in applet.get('meta', {}) else {}).get("schema:description", "")
        managers = mail_utils.htmlUserList(Applet().listUsers(applet,
                                                              'manager',
                                                              force=True))
        coordinators = mail_utils.htmlUserList(Applet().listUsers(
            applet, 'coordinator', force=True))
        reviewers = mail_utils.htmlUserList(Applet().listUsers(applet,
                                                               'reviewer',
                                                               force=True))

        body = mail_utils.renderTemplate(
            f'welcome{"Owner" if role == "owner" else ""}.{invitation.get("lang", "en")}.mako',
            {
                'accept':
                accept,
                'appletName':
                appletName,
                'byCoordinator':
                "by {} ({}) ".format(
                    coordinator.get("displayName", "an anonymous entity"),
                    "<a href=\"mailto:{email}\">{email}</a>".format(
                        email=coordinator["email"]) if "email" in coordinator
                    and coordinator["email"] is not None
                    else "email not available") if isinstance(
                        coordinator, dict) else "",
                'coordinators':
                "{}".format(coordinators if len(coordinators) else
                            "<ul><li>None</li></ul>"),
                'instanceName':
                " on {}".format(instanceName)
                if instanceName is not None and len(instanceName) else "",
                'managers':
                "{}".format(
                    managers if len(managers) else "<ul><li>None</li></ul>"),
                'reviewers':
                "{}".format(
                    reviewers if len(reviewers) else "<ul><li>None</li></ul>"),
                'role':
                "an editor" if role == "editor" else "a {}".format(role),
                'url':
                f'https://{web_url}/#/invitation/{str(invitation["_id"])}'
            })

        return (body if not fullDoc else """
            <!DOCTYPE html>
            <html>
            <head>
            <meta charset="UTF-8">
            <title>Invitation to {appletName} on {instanceName}</title>
            </head>
            <body>
            {body}
            </body>
            </html>
        """.format(appletName=appletName, instanceName=instanceName,
                   body=body).strip())