Example #1
0
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
Example #2
0
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
Example #3
0
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
Example #4
0
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
Example #5
0
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()
Example #7
0
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))
Example #8
0
 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()
Example #9
0
 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]),