def set_email(self, email): """See :http:post:`/api/users/(id)/set-email`.""" if self.app.user != self: raise PermissionError() check_email(email) code = randstr() auth_request = AuthRequest(id='AuthRequest:' + randstr(), trashed=False, app=self.app, email=email, code=code) self.app.r.oset(auth_request.id, auth_request) self.app.r.expire(auth_request.id, 10 * 60) if self.app.render_email_auth_message: self._send_email(email, self.app.render_email_auth_message(email, auth_request, code)) return auth_request
def store_email(self, email): """Update the user's *email* address. If *email* is already associated with another user, a :exc:`ValueError` (``email_duplicate``) is raised. """ check_email(email) id = self.app.r.hget('user_email_map', email) if id and id.decode() != self.id: raise ValueError('email_duplicate') if self.email: self.app.r.hdel('user_email_map', self.email) self.email = email self.app.r.oset(self.id, self) self.app.r.hset('user_email_map', self.email, self.id)
def __init__(self, redis_url='', email='bot@localhost', smtp_url='', render_email_auth_message=None): check_email(email) try: # pylint: disable=pointless-statement; port errors are only triggered on access urlparse(smtp_url).port except builtins.ValueError: raise ValueError('smtp_url_invalid') self.redis_url = redis_url try: self.r = StrictRedis.from_url(self.redis_url) except builtins.ValueError: raise ValueError('redis_url_invalid') self.r = JSONRedis(self.r, self._encode, self._decode) self.types = {'User': User, 'Settings': Settings, 'AuthRequest': AuthRequest} self.user = None self.users = JSONRedisMapping(self.r, 'users') self.email = email self.smtp_url = smtp_url self.render_email_auth_message = render_email_auth_message