def email_password_change_email(user, new_email=None, password_change=False): """Queues a system email for email or password change notification.""" from r2.lib.pages import EmailPasswordChangeEmail token = make_reset_token(AccountRecoveryToken, user, issue_limit=1) if not token: return False passlink = token.make_token_url() if not passlink: return False g.log.info("Generated %s: %s", AccountRecoveryToken.__name__, passlink) signer = MessageSigner(g.secrets["outbound_url_secret"]) signature = base64.urlsafe_b64encode( signer.make_signature(_force_unicode(passlink), max_age=timedelta(days=180))) email_kind = Email.Kind.EMAIL_CHANGE if password_change: email_kind = Email.Kind.PASSWORD_CHANGE _system_email( user.email, EmailPasswordChangeEmail( user=user, new_email=new_email, passlink=passlink, email_kind=email_kind, signature=signature, ).render(style='email'), email_kind, reply_to=g.support_email, ) return True
def password_email(user): """For resetting a user's password.""" from r2.lib.pages import PasswordReset token = make_reset_token(PasswordResetToken, user, issue_limit=3) if not token: return False passlink = token.make_token_url() if not passlink: return False g.log.info("Generated %s: %s for user %s", PasswordResetToken.__name__, passlink, user.name) signer = MessageSigner(g.secrets["outbound_url_secret"]) signature = base64.urlsafe_b64encode( signer.make_signature(_force_unicode(passlink), max_age=timedelta(days=180))) _system_email( user.email, PasswordReset( user=user, passlink=passlink, signature=signature, ).render(style='email'), Email.Kind.RESET_PASSWORD, reply_to=g.support_email, user=user, ) return True
def email_password_change_email(user, new_email=None, password_change=False): """Queues a system email for email or password change notification.""" from r2.lib.pages import EmailPasswordChangeEmail token = make_reset_token(AccountRecoveryToken, user, issue_limit=1) if not token: return False passlink = token.make_token_url() if not passlink: return False g.log.info("Generated %s: %s", AccountRecoveryToken.__name__, passlink) signer = MessageSigner(g.secrets["outbound_url_secret"]) signature = base64.urlsafe_b64encode( signer.make_signature( _force_unicode(passlink), max_age=timedelta(days=180)) ) email_kind = Email.Kind.EMAIL_CHANGE if password_change: email_kind = Email.Kind.PASSWORD_CHANGE _system_email( user.email, EmailPasswordChangeEmail( user=user, new_email=new_email, passlink=passlink, email_kind=email_kind, signature=signature, ).render(style='email'), email_kind, reply_to=g.support_email, ) return True
def password_email(user): """For resetting a user's password.""" from r2.lib.pages import PasswordReset token = make_reset_token(PasswordResetToken, user, issue_limit=3) if not token: return False passlink = token.make_token_url() if not passlink: return False g.log.info("Generated %s: %s for user %s", PasswordResetToken.__name__, passlink, user.name) signer = MessageSigner(g.secrets["outbound_url_secret"]) signature = base64.urlsafe_b64encode( signer.make_signature( _force_unicode(passlink), max_age=timedelta(days=180)) ) _system_email( user.email, PasswordReset( user=user, passlink=passlink, signature=signature, ).render(style='email'), Email.Kind.RESET_PASSWORD, reply_to=g.support_email, user=user, ) return True
def make_url(namespace, max_age): """Return a signed URL for the client to use for websockets. The namespace determines which messages the client receives and max_age is the number of seconds the URL is valid for. """ signer = MessageSigner(g.secrets["websocket"]) signature = signer.make_signature(namespace, max_age=datetime.timedelta(seconds=max_age)) query_string = urllib.urlencode({"m": signature}) return urlparse.urlunparse(("wss", g.websocket_host, namespace, None, query_string, None))
def make_wsgi_app(app_config): cfg = config.parse_config(app_config) signer = MessageSigner(cfg.ads_tracking.click_secret) metrics_client = make_metrics_client(app_config) baseplate = Baseplate() baseplate.configure_logging() baseplate.configure_metrics(metrics_client) baseplate.add_to_context("events", events.EventQueue("production")) baseplate.add_to_context("events_test", events.EventQueue("test")) configurator = Configurator(settings=app_config) baseplate_configurator = BaseplateConfigurator(baseplate) configurator.include(baseplate_configurator.includeme) controller = TrackingService(signer=signer, ) configurator.add_route("health", "/health", request_method="GET") configurator.add_view(controller.is_healthy, route_name="health", renderer="json") configurator.add_route("click", "/click", request_method="GET") configurator.add_view(controller.track_click, route_name="click", renderer="json") return configurator.make_wsgi_app()
def make_url(namespace, max_age): """Return a signed URL for the client to use for websockets. The namespace determines which messages the client receives and max_age is the number of seconds the URL is valid for. """ signer = MessageSigner(g.secrets["websocket"]) signature = signer.make_signature( namespace, max_age=datetime.timedelta(seconds=max_age)) query_string = urllib.urlencode({ "m": signature, }) return urlparse.urlunparse( ("wss", g.websocket_host, namespace, None, query_string, None))
def __init__( self, metrics, dispatcher, mac_secret, ping_interval, admin_auth, conn_shed_rate, ): self.metrics = metrics self.dispatcher = dispatcher self.signer = MessageSigner(mac_secret) self.ping_interval = ping_interval self.admin_auth = admin_auth self.shed_rate_per_sec = conn_shed_rate self.status_publisher = None self.quiesced = False self.connections = set()
def __init__(self, metrics, dispatcher, mac_secret, ping_interval): self.metrics = metrics self.dispatcher = dispatcher self.signer = MessageSigner(mac_secret) self.ping_interval = ping_interval self.status_publisher = None
from .. import ( mock, patch_service, ) from reddit_service_ads_tracking import ( config, make_wsgi_app, ) from reddit_service_ads_tracking.lib import ( response, ) app_config = get_appsettings("example.ini", name="main") cfg = config.parse_config(app_config) signer = MessageSigner(cfg.ads_tracking.click_secret) def _encode_data(data): return base64.urlsafe_b64encode(json.dumps(data)) def _generate_click_url(url, data, expires=None): if expires is None: expires = cfg.ads_tracking.max_click_age params = { "url": url, "data": data, "hmac": signer.make_signature( "|".join([url, data]),