コード例 #1
0
def activate_instance(request):

    token = request.GET.get("token", "")

    try:
        encrypted_data = token.encode("ascii") # encrypted json containing the game id, the user login and a validity timestamp
        (game_instance_id, creator_login, creator_email) = decode_game_activation_token(encrypted_data)

        if not datamanager_administrator.game_instance_exists(game_instance_id):
            datamanager_administrator.create_game_instance(game_instance_id=game_instance_id,
                                                           creator_login=creator_login,
                                                           creator_email=creator_email,
                                                           skip_randomizations=False)
        else:
            metadata = datamanager_administrator.get_game_instance_metadata_copy(game_instance_id) # shall NOT raise errors
            if (metadata["creator_login"] != creator_login or metadata["creator_email"] != creator_email):
                raise ValueError("Creator data doesn't match for game instance %(game_instance_id)s" % SDICT(game_instance_id=game_instance_id))

        # we retrieve the datamanager whatever its possible maintenance status
        dm = datamanager_administrator.retrieve_game_instance(game_instance_id, request=None, metadata_checker=lambda *args, **kwargs: True)
        master_login = dm.get_global_parameter("master_login")

        authentication_token = authentication.compute_enforced_login_token(game_instance_id=game_instance_id, login=master_login, is_observer=False)
        session_token_display = urlencode({authentication.ENFORCED_SESSION_TICKET_NAME: authentication_token})

        import pychronia_game.views
        target_url = config.SITE_DOMAIN + reverse(pychronia_game.views.homepage, kwargs=dict(game_instance_id=game_instance_id, game_username=master_login))
        target_url += "?" + session_token_display

        content = _("In case you don't get properly redirected, please copy this link into our URL bar: %(target_url)s") % SDICT(target_url=target_url)
        return HttpResponseRedirect(target_url, content=content)

    except (ValueError, TypeError, LookupError, AttributeError, UnicodeError), e:
        logging.warning("Game activation key not recognized : %s", token, exc_info=True)
        return HttpResponseForbidden(_("Activation key not recognized"))
コード例 #2
0
def activate_instance(request):
    token = request.GET.get("token", "")

    try:
        encrypted_data = token.encode(
            "ascii"
        )  # encrypted json containing the game id, the user login and a validity timestamp
        (game_instance_id, creator_login,
         creator_email) = decode_game_activation_token(encrypted_data)

        if not datamanager_administrator.game_instance_exists(
                game_instance_id):
            datamanager_administrator.create_game_instance(
                game_instance_id=game_instance_id,
                creator_login=creator_login,
                creator_email=creator_email,
                skip_randomizations=False)
        else:
            metadata = datamanager_administrator.get_game_instance_metadata_copy(
                game_instance_id)  # shall NOT raise errors
            if (metadata["creator_login"] != creator_login
                    or metadata["creator_email"] != creator_email):
                raise ValueError(
                    "Creator data doesn't match for game instance %(game_instance_id)s"
                    % SDICT(game_instance_id=game_instance_id))

        # we retrieve the datamanager whatever its possible maintenance status
        dm = datamanager_administrator.retrieve_game_instance(
            game_instance_id,
            request=None,
            metadata_checker=lambda *args, **kwargs: True)
        master_login = dm.get_global_parameter("master_login")

        authentication_token = authentication.compute_enforced_login_token(
            game_instance_id=game_instance_id,
            login=master_login,
            is_observer=False)
        session_token_display = urlencode({
            authentication.ENFORCED_SESSION_TICKET_NAME:
            authentication_token
        })

        import pychronia_game.views
        target_url = config.SITE_DOMAIN + reverse(
            pychronia_game.views.homepage,
            kwargs=dict(game_instance_id=game_instance_id,
                        game_username=master_login))
        target_url += "?" + session_token_display

        content = _(
            "In case you don't get properly redirected, please copy this link into our URL bar: %(target_url)s"
        ) % SDICT(target_url=target_url)
        return HttpResponseRedirect(target_url, content=content)

    except (ValueError, TypeError, LookupError, AttributeError,
            UnicodeError) as e:
        logging.warning("Game activation key not recognized : %s",
                        token,
                        exc_info=True)
        return HttpResponseForbidden(_("Activation key not recognized"))
コード例 #3
0
def create_instance(request):
    """
    Workflow to create an instance through email validation, for non-superusers.
    """
    require_email = True # important

    game_creation_form = None

    information = _("Please provide a valid email address, so that we can send you the activation link for your new game. "
                    "If after several attempts you don't manage to create your game, please contact the game staff. ")

    if request.method == "POST":

        game_creation_form = GameInstanceCreationForm(require_email=require_email, data=request.POST)
        if game_creation_form.is_valid():
            cleaned_data = game_creation_form.cleaned_data
            game_instance_id = cleaned_data["game_instance_id"]
            creator_login = cleaned_data["creator_login"]
            creator_email = cleaned_data["creator_email"] or None

            if datamanager_administrator.game_instance_exists(game_instance_id):
                messages.add_message(request, messages.ERROR, _(u"Please choose another game identifier."))

            else:

                activation_link = _build_activation_url(game_instance_id=game_instance_id, creator_login=creator_login, creator_email=creator_email)

                message = GAME_ACTIVATION_EMAIL_BODY_TPL % locals()

                try:
                    send_mail(subject=GAME_ACTIVATION_EMAIL_SUBJECT,
                              message=message,
                              from_email=settings.SERVER_EMAIL,
                              recipient_list=[creator_email],
                              fail_silently=False)
                except (SMTPException, EnvironmentError), e:
                    logging.error("Couldn't send game instance activation email to %s", creator_email, exc_info=True)
                    messages.add_message(request, messages.ERROR, _(u"Couldn't send activation email."))
                else:
                    messages.add_message(request, messages.INFO, _(u"Game instance '%(game_instance_id)s' successfully created for '%(creator_login)s/%(creator_email)s'") %
                                         SDICT(game_instance_id=game_instance_id, creator_login=creator_login, creator_email=creator_email))
                    game_creation_form = None
                    information = _("The activation email has been sent to %(creator_email)s.") % SDICT(creator_email=creator_email)

                if settings.DEBUG and request.GET.get("_debug_"): # even if we haven't managed to send the activation email
                    information += " " + _("Debug Information: [%(activation_link)s].") % SDICT(activation_link=activation_link)
コード例 #4
0
ファイル: _test_tools.py プロジェクト: akram-max/pychronia
def temp_datamanager(game_instance_id, request=None):
    assert game_instance_exists(game_instance_id)
    dm = retrieve_game_instance(game_instance_id, request=request)
    yield dm
    dm.close()
コード例 #5
0
def temp_datamanager(game_instance_id, request=None):
    assert game_instance_exists(game_instance_id)
    dm = retrieve_game_instance(game_instance_id, request=request)
    yield dm
    dm.close()
コード例 #6
0
def create_instance(request):
    """
    Workflow to create an instance through email validation, for non-superusers.
    """
    require_email = True  # important

    game_creation_form = None

    information = _(
        "Please provide a valid email address, so that we can send you the activation link for your new game. "
        "If after several attempts you don't manage to create your game, please contact the game staff. "
    )

    if request.method == "POST":

        game_creation_form = GameInstanceCreationForm(
            require_email=require_email, data=request.POST)
        if game_creation_form.is_valid():
            cleaned_data = game_creation_form.cleaned_data
            game_instance_id = cleaned_data["game_instance_id"]
            creator_login = cleaned_data["creator_login"]
            creator_email = cleaned_data["creator_email"] or None

            if datamanager_administrator.game_instance_exists(
                    game_instance_id):
                messages.add_message(
                    request, messages.ERROR,
                    _("Please choose another game identifier."))

            else:

                activation_link = _build_activation_url(
                    game_instance_id=game_instance_id,
                    creator_login=creator_login,
                    creator_email=creator_email)

                message = GAME_ACTIVATION_EMAIL_BODY_TPL % locals()

                try:
                    send_mail(subject=GAME_ACTIVATION_EMAIL_SUBJECT,
                              message=message,
                              from_email=settings.SERVER_EMAIL,
                              recipient_list=[creator_email],
                              fail_silently=False)
                except (SMTPException, EnvironmentError) as e:
                    logging.error(
                        "Couldn't send game instance activation email to %s",
                        creator_email,
                        exc_info=True)
                    messages.add_message(request, messages.ERROR,
                                         _("Couldn't send activation email."))
                else:
                    messages.add_message(
                        request, messages.INFO,
                        _("Game instance '%(game_instance_id)s' successfully created for '%(creator_login)s/%(creator_email)s'"
                          ) % SDICT(game_instance_id=game_instance_id,
                                    creator_login=creator_login,
                                    creator_email=creator_email))
                    game_creation_form = None
                    information = _(
                        "The activation email has been sent to %(creator_email)s."
                    ) % SDICT(creator_email=creator_email)

                if settings.DEBUG and request.GET.get(
                        "_debug_"
                ):  # even if we haven't managed to send the activation email
                    information += " " + _(
                        "Debug Information: [%(activation_link)s].") % SDICT(
                            activation_link=activation_link)
        else:
            messages.add_message(request, messages.ERROR,
                                 _("Invalid game creation form submitted."))

    return render(
        request, "meta_administration/create_instance.html", {
            'notifications':
            get_messages(request),
            'game_creation_form':
            game_creation_form
            or GameInstanceCreationForm(require_email=require_email),
            'information':
            information,
        })