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"))
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"))
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)
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()
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, })