def impersonated_session_status(request): """ Adds variable to all contexts :param request: :return bool: """ return {'is_impersonated_session': is_impersonated_session(request)}
def __call__(self, request: HttpRequest): """ Install monkey-patch on demand. If monkey-patch has not been run in for this process (assuming multiple preforked processes), then do it now. """ from ee.clickhouse import client route = resolve(request.path) client._request_information = { "save": (is_clickhouse_enabled() and request.user.pk and (request.user.is_staff or is_impersonated_session(request) or settings.DEBUG)), "user_id": request.user.pk, "kind": "request", "id": f"{route.route} ({route.func.__name__})", } response: HttpResponse = self.get_response(request) client._request_information = None return response
def __call__(self, request: HttpRequest): """ Install monkey-patch on demand. If monkey-patch has not been run in for this process (assuming multiple preforked processes), then do it now. """ from ee.clickhouse import client route = resolve(request.path) route_id = f"{route.route} ({route.func.__name__})" client._request_information = { "save": (request.user.pk and (request.user.is_staff or is_impersonated_session(request) or settings.DEBUG)), "user_id": request.user.pk, "kind": "request", "id": route_id, } response: HttpResponse = self.get_response(request) if "api/" in route_id and "capture" not in route_id: incr("http_api_request_response", tags={"id": route_id, "status_code": response.status_code}) client._request_information = None return response
def impersonated_session_status(request): """ Adds variable to all contexts :param request: :return bool: """ return {"is_impersonated_session": is_impersonated_session(request)}
def logout(request): if request.user.is_authenticated: request.user.temporary_token = None request.user.save() if is_impersonated_session(request): restore_original_login(request) return redirect("/admin/") response = auth_views.logout_then_login(request) response.delete_cookie(settings.TOOLBAR_COOKIE_NAME, "/") return response
def get_is_impersonated(self, _) -> Optional[bool]: if "request" not in self.context: return None return is_impersonated_session(self.context["request"])
def user(request): """ DEPRECATED: This endpoint (/api/user/) has been deprecated in favor of /api/users/@me/ and will be removed soon. """ organization: Optional[Organization] = request.user.organization organizations = list( request.user.organizations.order_by("-created_at").values( "name", "id")) team: Optional[Team] = request.user.team teams = list( request.user.teams.order_by("-created_at").values("name", "id")) user = cast(User, request.user) if request.method == "PATCH": data = json.loads(request.body) if team is not None and "team" in data: team.app_urls = data["team"].get("app_urls", team.app_urls) team.slack_incoming_webhook = data["team"].get( "slack_incoming_webhook", team.slack_incoming_webhook) team.anonymize_ips = data["team"].get("anonymize_ips", team.anonymize_ips) team.session_recording_opt_in = data["team"].get( "session_recording_opt_in", team.session_recording_opt_in) team.session_recording_retention_period_days = data["team"].get( "session_recording_retention_period_days", team.session_recording_retention_period_days, ) team.completed_snippet_onboarding = data["team"].get( "completed_snippet_onboarding", team.completed_snippet_onboarding, ) team.test_account_filters = data["team"].get( "test_account_filters", team.test_account_filters) team.timezone = data["team"].get("timezone", team.timezone) team.save() if "user" in data: try: user.current_organization = user.organizations.get( id=data["user"]["current_organization_id"]) assert user.organization is not None, "Organization should have been just set" user.current_team = user.organization.teams.first() except (KeyError, ValueError): pass except ObjectDoesNotExist: return JsonResponse( {"detail": "Organization not found for user."}, status=404) except KeyError: pass except ObjectDoesNotExist: return JsonResponse( {"detail": "Organization not found for user."}, status=404) if user.organization is not None: try: user.current_team = user.organization.teams.get( id=int(data["user"]["current_team_id"])) except (KeyError, TypeError): pass except ValueError: return JsonResponse( {"detail": "Team ID must be an integer."}, status=400) except ObjectDoesNotExist: return JsonResponse( { "detail": "Team not found for user's current organization." }, status=404) user.email_opt_in = data["user"].get("email_opt_in", user.email_opt_in) user.anonymize_data = data["user"].get("anonymize_data", user.anonymize_data) user.toolbar_mode = data["user"].get("toolbar_mode", user.toolbar_mode) user.save() user_identify.identify_task.delay(user_id=user.id) return JsonResponse({ "deprecation": "Endpoint has been deprecated. Please use `/api/users/@me/`.", "id": user.pk, "distinct_id": user.distinct_id, "name": user.first_name, "email": user.email, "email_opt_in": user.email_opt_in, "anonymize_data": user.anonymize_data, "toolbar_mode": user.toolbar_mode, "organization": None if organization is None else { "id": organization.id, "name": organization.name, "billing_plan": organization.billing_plan, "available_features": organization.available_features, "plugins_access_level": organization.plugins_access_level, "created_at": organization.created_at, "updated_at": organization.updated_at, "teams": [{ "id": team.id, "name": team.name } for team in organization.teams.all().only("id", "name")], }, "organizations": organizations, "team": None if team is None else { "id": team.id, "name": team.name, "app_urls": team.app_urls, "api_token": team.api_token, "anonymize_ips": team.anonymize_ips, "slack_incoming_webhook": team.slack_incoming_webhook, "completed_snippet_onboarding": team.completed_snippet_onboarding, "session_recording_opt_in": team.session_recording_opt_in, "session_recording_retention_period_days": team.session_recording_retention_period_days, "ingested_event": team.ingested_event, "is_demo": team.is_demo, "test_account_filters": team.test_account_filters, "timezone": team.timezone, "data_attributes": team.data_attributes, }, "teams": teams, "has_password": user.has_usable_password(), "opt_out_capture": os.environ.get("OPT_OUT_CAPTURE"), "posthog_version": VERSION, "is_multi_tenancy": getattr(settings, "MULTI_TENANCY", False), "ee_available": settings.EE_AVAILABLE, "is_clickhouse_enabled": is_clickhouse_enabled(), "email_service_available": is_email_available(with_absolute_urls=True), "is_debug": getattr(settings, "DEBUG", False), "is_staff": user.is_staff, "is_impersonated": is_impersonated_session(request), "is_event_property_usage_enabled": getattr(settings, "ASYNC_EVENT_PROPERTY_USAGE", False), "realm": get_instance_realm(), })
def user(request): organization: Optional[Organization] = request.user.organization organizations = list( request.user.organizations.order_by("-created_at").values( "name", "id")) team: Optional[Team] = request.user.team teams = list( request.user.teams.order_by("-created_at").values("name", "id")) user = cast(User, request.user) if request.method == "PATCH": data = json.loads(request.body) if team is not None and "team" in data: team.app_urls = data["team"].get("app_urls", team.app_urls) team.opt_out_capture = data["team"].get("opt_out_capture", team.opt_out_capture) team.slack_incoming_webhook = data["team"].get( "slack_incoming_webhook", team.slack_incoming_webhook) team.anonymize_ips = data["team"].get("anonymize_ips", team.anonymize_ips) team.session_recording_opt_in = data["team"].get( "session_recording_opt_in", team.session_recording_opt_in) team.session_recording_retention_period_days = data["team"].get( "session_recording_retention_period_days", team.session_recording_retention_period_days) if data["team"].get("plugins_opt_in") is not None: reload_plugins_on_workers() team.plugins_opt_in = data["team"].get("plugins_opt_in", team.plugins_opt_in) team.completed_snippet_onboarding = data["team"].get( "completed_snippet_onboarding", team.completed_snippet_onboarding, ) team.save() if "user" in data: try: user.current_organization = user.organizations.get( id=data["user"]["current_organization_id"]) assert user.organization is not None, "Organization should have been just set" user.current_team = user.organization.teams.first() except (KeyError, ValueError): pass except ObjectDoesNotExist: return JsonResponse( {"detail": "Organization not found for user."}, status=404) except KeyError: pass except ObjectDoesNotExist: return JsonResponse( {"detail": "Organization not found for user."}, status=404) if user.organization is not None: try: user.current_team = user.organization.teams.get( id=int(data["user"]["current_team_id"])) except (KeyError, TypeError): pass except ValueError: return JsonResponse( {"detail": "Team ID must be an integer."}, status=400) except ObjectDoesNotExist: return JsonResponse( { "detail": "Team not found for user's current organization." }, status=404) user.email_opt_in = data["user"].get("email_opt_in", user.email_opt_in) user.anonymize_data = data["user"].get("anonymize_data", user.anonymize_data) user.toolbar_mode = data["user"].get("toolbar_mode", user.toolbar_mode) user.save() user_identify.identify_task.delay(user_id=user.id) return JsonResponse({ "id": user.pk, "distinct_id": user.distinct_id, "name": user.first_name, "email": user.email, "email_opt_in": user.email_opt_in, "anonymize_data": user.anonymize_data, "toolbar_mode": user.toolbar_mode, "organization": None if organization is None else { "id": organization.id, "name": organization.name, "billing_plan": organization.billing_plan, "available_features": organization.available_features, "created_at": organization.created_at, "updated_at": organization.updated_at, "teams": [{ "id": team.id, "name": team.name } for team in organization.teams.all().only("id", "name")], }, "organizations": organizations, "team": None if team is None else { "id": team.id, "name": team.name, "app_urls": team.app_urls, "api_token": team.api_token, "opt_out_capture": team.opt_out_capture, "anonymize_ips": team.anonymize_ips, "slack_incoming_webhook": team.slack_incoming_webhook, "event_names": team.event_names, "event_names_with_usage": team.event_names_with_usage or [{ "event": event, "volume": None, "usage_count": None } for event in team.event_names], "event_properties": team.event_properties, "event_properties_numerical": team.event_properties_numerical, "event_properties_with_usage": team.event_properties_with_usage or [{ "key": key, "volume": None, "usage_count": None } for key in team.event_properties], "completed_snippet_onboarding": team.completed_snippet_onboarding, "session_recording_opt_in": team.session_recording_opt_in, "session_recording_retention_period_days": team.session_recording_retention_period_days, "plugins_opt_in": team.plugins_opt_in, "ingested_event": team.ingested_event, }, "teams": teams, "has_password": user.has_usable_password(), "opt_out_capture": os.environ.get("OPT_OUT_CAPTURE"), "posthog_version": VERSION, "is_multi_tenancy": getattr(settings, "MULTI_TENANCY", False), "ee_available": settings.EE_AVAILABLE, "ee_enabled": is_ee_enabled(), "email_service_available": is_email_available(with_absolute_urls=True), "is_debug": getattr(settings, "DEBUG", False), "is_staff": user.is_staff, "is_impersonated": is_impersonated_session(request), "plugin_access": { "install": can_install_plugins_via_api(user.organization), "configure": can_configure_plugins_via_api(user.organization), }, })
def render_template(template_name: str, request: HttpRequest, context: Dict = {}) -> HttpResponse: from loginas.utils import is_impersonated_session template = get_template(template_name) context["opt_out_capture"] = os.getenv( "OPT_OUT_CAPTURE", False) or is_impersonated_session(request) context["self_capture"] = settings.SELF_CAPTURE if os.environ.get("SENTRY_DSN"): context["sentry_dsn"] = os.environ["SENTRY_DSN"] if settings.DEBUG and not settings.TEST: context["debug"] = True context["git_rev"] = get_git_commit() context["git_branch"] = get_git_branch() if settings.E2E_TESTING: context["e2e_testing"] = True if settings.SELF_CAPTURE: api_token = get_self_capture_api_token(request) if api_token: context["js_posthog_api_key"] = f"'{api_token}'" context["js_posthog_host"] = "window.location.origin" else: context["js_posthog_api_key"] = "'sTMFPsFhdP1Ssg'" context["js_posthog_host"] = "'https://app.posthog.com'" context["js_capture_internal_metrics"] = settings.CAPTURE_INTERNAL_METRICS context["js_url"] = settings.JS_URL posthog_app_context: Dict[str, Any] = { "persisted_feature_flags": settings.PERSISTED_FEATURE_FLAGS, "anonymous": not request.user or not request.user.is_authenticated, } # Set the frontend app context if not request.GET.get("no-preloaded-app-context"): from posthog.api.team import TeamSerializer from posthog.api.user import User, UserSerializer from posthog.views import preflight_check posthog_app_context = { "current_user": None, "current_team": None, "preflight": json.loads(preflight_check(request).getvalue()), "default_event_name": get_default_event_name(), "switched_team": getattr(request, "switched_team", False), **posthog_app_context, } if request.user.pk: user_serialized = UserSerializer(request.user, context={"request": request}, many=False) posthog_app_context["current_user"] = user_serialized.data team = cast(User, request.user).team if team: team_serialized = TeamSerializer(team, context={"request": request}, many=False) posthog_app_context["current_team"] = team_serialized.data context["posthog_app_context"] = json.dumps(posthog_app_context, default=json_uuid_convert) html = template.render(context, request=request) return HttpResponse(html)