mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	When an unauthenticated user tries to access the /plans page, we redirect to /accounts/login/?next=plans (note the missing slash before "plans"). After the user is authenticated, they are then redirected to /accounts/login/plans, which is an invalid URL. The correct URL should be just /plans. This commit solves this by prefixing the "plans" in the query parameter with a forward slash, which results in the correct redirect URL, i.e., /plans.
		
			
				
	
	
		
			129 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import urllib.parse
 | 
						|
from typing import Optional
 | 
						|
 | 
						|
import orjson
 | 
						|
from django.conf import settings
 | 
						|
from django.contrib.auth.views import redirect_to_login
 | 
						|
from django.http import HttpRequest, HttpResponse, HttpResponseRedirect
 | 
						|
from django.template.response import TemplateResponse
 | 
						|
 | 
						|
from zerver.context_processors import get_realm_from_request, latest_info_context
 | 
						|
from zerver.decorator import add_google_analytics
 | 
						|
from zerver.lib.github import InvalidPlatform, get_latest_github_release_download_link_for_platform
 | 
						|
from zerver.lib.subdomains import is_subdomain_root_or_alias
 | 
						|
from zerver.models import Realm
 | 
						|
 | 
						|
 | 
						|
@add_google_analytics
 | 
						|
def apps_view(request: HttpRequest, platform: Optional[str] = None) -> HttpResponse:
 | 
						|
    if settings.ZILENCER_ENABLED:
 | 
						|
        return TemplateResponse(
 | 
						|
            request,
 | 
						|
            "zerver/apps.html",
 | 
						|
        )
 | 
						|
    return HttpResponseRedirect("https://zulip.com/apps/", status=301)
 | 
						|
 | 
						|
 | 
						|
def app_download_link_redirect(request: HttpRequest, platform: str) -> HttpResponse:
 | 
						|
    try:
 | 
						|
        download_link = get_latest_github_release_download_link_for_platform(platform)
 | 
						|
        return HttpResponseRedirect(download_link, status=302)
 | 
						|
    except InvalidPlatform:
 | 
						|
        return TemplateResponse(request, "404.html", status=404)
 | 
						|
 | 
						|
 | 
						|
@add_google_analytics
 | 
						|
def plans_view(request: HttpRequest) -> HttpResponse:
 | 
						|
    realm = get_realm_from_request(request)
 | 
						|
    free_trial_days = settings.FREE_TRIAL_DAYS
 | 
						|
    sponsorship_pending = False
 | 
						|
    sponsorship_url = "/upgrade#sponsorship"
 | 
						|
    if is_subdomain_root_or_alias(request):
 | 
						|
        # If we're on the root domain, we make this link first ask you which organization.
 | 
						|
        sponsorship_url = f"/accounts/go/?next={urllib.parse.quote(sponsorship_url)}"
 | 
						|
    realm_on_free_trial = False
 | 
						|
 | 
						|
    if realm is not None:
 | 
						|
        if realm.plan_type == Realm.SELF_HOSTED and settings.PRODUCTION:
 | 
						|
            return HttpResponseRedirect("https://zulip.com/plans")
 | 
						|
        if not request.user.is_authenticated:
 | 
						|
            return redirect_to_login(next="/plans")
 | 
						|
        if request.user.is_guest:
 | 
						|
            return TemplateResponse(request, "404.html", status=404)
 | 
						|
        if settings.CORPORATE_ENABLED:
 | 
						|
            from corporate.lib.stripe import is_realm_on_free_trial
 | 
						|
            from corporate.models import get_customer_by_realm
 | 
						|
 | 
						|
            customer = get_customer_by_realm(realm)
 | 
						|
            if customer is not None:
 | 
						|
                sponsorship_pending = customer.sponsorship_pending
 | 
						|
                realm_on_free_trial = is_realm_on_free_trial(realm)
 | 
						|
 | 
						|
    return TemplateResponse(
 | 
						|
        request,
 | 
						|
        "zerver/plans.html",
 | 
						|
        context={
 | 
						|
            "realm": realm,
 | 
						|
            "free_trial_days": free_trial_days,
 | 
						|
            "realm_on_free_trial": realm_on_free_trial,
 | 
						|
            "sponsorship_pending": sponsorship_pending,
 | 
						|
            "sponsorship_url": sponsorship_url,
 | 
						|
        },
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
@add_google_analytics
 | 
						|
def team_view(request: HttpRequest) -> HttpResponse:
 | 
						|
    if not settings.ZILENCER_ENABLED:
 | 
						|
        return HttpResponseRedirect("https://zulip.com/team/", status=301)
 | 
						|
 | 
						|
    try:
 | 
						|
        with open(settings.CONTRIBUTOR_DATA_FILE_PATH, "rb") as f:
 | 
						|
            data = orjson.loads(f.read())
 | 
						|
    except FileNotFoundError:
 | 
						|
        data = {"contributors": {}, "date": "Never ran."}
 | 
						|
 | 
						|
    return TemplateResponse(
 | 
						|
        request,
 | 
						|
        "zerver/team.html",
 | 
						|
        context={
 | 
						|
            "page_params": {
 | 
						|
                "contributors": data["contributors"],
 | 
						|
            },
 | 
						|
            "date": data["date"],
 | 
						|
        },
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def get_isolated_page(request: HttpRequest) -> bool:
 | 
						|
    """Accept a GET param `?nav=no` to render an isolated, navless page."""
 | 
						|
    return request.GET.get("nav") == "no"
 | 
						|
 | 
						|
 | 
						|
@add_google_analytics
 | 
						|
def landing_view(request: HttpRequest, template_name: str) -> HttpResponse:
 | 
						|
    return TemplateResponse(request, template_name)
 | 
						|
 | 
						|
 | 
						|
@add_google_analytics
 | 
						|
def hello_view(request: HttpRequest) -> HttpResponse:
 | 
						|
    return TemplateResponse(request, "zerver/hello.html", latest_info_context())
 | 
						|
 | 
						|
 | 
						|
@add_google_analytics
 | 
						|
def terms_view(request: HttpRequest) -> HttpResponse:
 | 
						|
    return TemplateResponse(
 | 
						|
        request,
 | 
						|
        "zerver/terms.html",
 | 
						|
        context={"isolated_page": get_isolated_page(request)},
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
@add_google_analytics
 | 
						|
def privacy_view(request: HttpRequest) -> HttpResponse:
 | 
						|
    return TemplateResponse(
 | 
						|
        request,
 | 
						|
        "zerver/privacy.html",
 | 
						|
        context={"isolated_page": get_isolated_page(request)},
 | 
						|
    )
 |