def get_public_key_configs(project, full_config, project_keys=None): public_keys = [] for project_key in project_keys or (): key = {"publicKey": project_key.public_key, "isEnabled": project_key.status == 0} if full_config: key["quotas"] = [ q.to_json_legacy() for q in quotas.get_quotas(project, key=project_key) ] key["numericId"] = project_key.id public_keys.append(key) return public_keys
def get_public_key_configs(project, full_config, project_keys=None): public_keys = [] for project_key in project_keys or (): key = { "publicKey": project_key.public_key, "numericId": project_key.id, # Disabled keys are omitted from the config, this is just there so # old Relays don't break (we haven't investigated whether there are # actual relays relying on this value) # # Removed that value in https://github.com/getsentry/relay/pull/778/files#diff-e66f275002251930fbfc361b4cca64ab41ff2435029f65c2fd6ffb729129909dL372 "isEnabled": True, } if full_config: key["quotas"] = [ q.to_json_legacy() for q in quotas.get_quotas(project, key=project_key) ] public_keys.append(key) return public_keys
def get_quotas(project, keys=None): return [quota.to_json() for quota in quotas.get_quotas(project, keys=keys)]
def get_project_config(project, org_options=None, full_config=True, for_store=False): """ Constructs the ProjectConfig information. :param project: The project to load configuration for. Ensure that organization is bound on this object; otherwise it will be loaded from the database. :param org_options: Inject preloaded organization options for faster loading. If ``None``, options are lazy-loaded from the database. :param full_config: True if only the full config is required, False if only the restricted (for external relays) is required (default True, i.e. full configuration) :param for_store: If set to true, this omits all parameters that are not needed for Relay. This is a temporary flag that should be removed once store has been moved to Relay. Most importantly, this avoids database accesses. :return: a ProjectConfig object for the given project """ with configure_scope() as scope: scope.set_tag("project", project.id) if for_store: project_keys = [] else: project_keys = ProjectKey.objects.filter(project=project).all() public_keys = [] for project_key in project_keys: key = { "publicKey": project_key.public_key, "isEnabled": project_key.status == 0 } if full_config: key["numericId"] = project_key.id key["quotas"] = [ quota.to_json() for quota in quotas.get_quotas(project, key=project_key) ] public_keys.append(key) now = datetime.utcnow().replace(tzinfo=utc) if org_options is None: org_options = OrganizationOption.objects.get_all_values( project.organization_id) cfg = { "disabled": project.status > 0, "slug": project.slug, "lastFetch": now, "lastChange": project.get_option("sentry:relay-rev-lastchange", now), "rev": project.get_option("sentry:relay-rev", uuid.uuid4().hex), "publicKeys": public_keys, "config": { "allowedDomains": project.get_option("sentry:origins", ["*"]), "trustedRelays": org_options.get("sentry:trusted-relays", []), "piiConfig": _get_pii_config(project), "datascrubbingSettings": _get_datascrubbing_settings(project, org_options), }, "project_id": project.id, } if not full_config: # This is all we need for external Relay processors return ProjectConfig(project, **cfg) # The organization id is only required for reporting when processing events # internally. Do not expose it to external Relays. cfg["organization_id"] = project.organization_id project_cfg = cfg["config"] # get the filter settings for this project filter_settings = {} project_cfg["filter_settings"] = filter_settings for flt in get_all_filters(): filter_id = get_filter_key(flt) settings = _load_filter_settings(flt, project) filter_settings[filter_id] = settings invalid_releases = project.get_option(u"sentry:{}".format( FilterTypes.RELEASES)) if invalid_releases: filter_settings[FilterTypes.RELEASES] = {"releases": invalid_releases} blacklisted_ips = project.get_option("sentry:blacklisted_ips") if blacklisted_ips: filter_settings["client_ips"] = {"blacklisted_ips": blacklisted_ips} error_messages = project.get_option(u"sentry:{}".format( FilterTypes.ERROR_MESSAGES)) if error_messages: filter_settings[FilterTypes.ERROR_MESSAGES] = { "patterns": error_messages } csp_disallowed_sources = [] if bool(project.get_option("sentry:csp_ignored_sources_defaults", True)): csp_disallowed_sources += DEFAULT_DISALLOWED_SOURCES csp_disallowed_sources += project.get_option("sentry:csp_ignored_sources", []) if csp_disallowed_sources: filter_settings["csp"] = {"disallowed_sources": csp_disallowed_sources} scrub_ip_address = org_options.get("sentry:require_scrub_ip_address", False) or project.get_option( "sentry:scrub_ip_address", False) project_cfg["scrub_ip_addresses"] = scrub_ip_address project_cfg["grouping_config"] = get_grouping_config_dict_for_project( project) project_cfg["allowed_domains"] = list(get_origins(project)) return ProjectConfig(project, **cfg)
def get_project_config(project, org_options=None, full_config=True, project_keys=None): """ Constructs the ProjectConfig information. :param project: The project to load configuration for. Ensure that organization is bound on this object; otherwise it will be loaded from the database. :param org_options: Inject preloaded organization options for faster loading. If ``None``, options are lazy-loaded from the database. :param full_config: True if only the full config is required, False if only the restricted (for external relays) is required (default True, i.e. full configuration) :param project_keys: Pre-fetched project keys for performance, similar to org_options. However, if no project keys are provided it is assumed that the config does not need to contain auth information (this is the case when used in python's StoreView) :return: a ProjectConfig object for the given project """ with configure_scope() as scope: scope.set_tag("project", project.id) public_keys = [] for project_key in project_keys or (): key = { "publicKey": project_key.public_key, "isEnabled": project_key.status == 0 } if full_config: key["numericId"] = project_key.id key["quotas"] = [ quota.to_json() for quota in quotas.get_quotas(project, key=project_key) ] public_keys.append(key) now = datetime.utcnow().replace(tzinfo=utc) if org_options is None: org_options = OrganizationOption.objects.get_all_values( project.organization_id) with Hub.current.start_span(op="get_public_config"): cfg = { "disabled": project.status > 0, "slug": project.slug, "lastFetch": now, "lastChange": project.get_option("sentry:relay-rev-lastchange", now), "rev": project.get_option("sentry:relay-rev", uuid.uuid4().hex), "publicKeys": public_keys, "config": { "allowedDomains": list(get_origins(project)), "trustedRelays": org_options.get("sentry:trusted-relays", []), "piiConfig": _get_pii_config(project), "datascrubbingSettings": _get_datascrubbing_settings(project, org_options), }, "projectId": project.id, } if not full_config: # This is all we need for external Relay processors return ProjectConfig(project, **cfg) # The organization id is only required for reporting when processing events # internally. Do not expose it to external Relays. cfg["organizationId"] = project.organization_id project_cfg = cfg["config"] with Hub.current.start_span(op="get_filter_settings"): # get the filter settings for this project filter_settings = {} project_cfg["filterSettings"] = filter_settings for flt in get_all_filters(): filter_id = get_filter_key(flt) settings = _load_filter_settings(flt, project) filter_settings[filter_id] = settings invalid_releases = project.get_option(u"sentry:{}".format( FilterTypes.RELEASES)) if invalid_releases: filter_settings["releases"] = {"releases": invalid_releases} blacklisted_ips = project.get_option("sentry:blacklisted_ips") if blacklisted_ips: filter_settings["clientIps"] = {"blacklistedIps": blacklisted_ips} error_messages = project.get_option(u"sentry:{}".format( FilterTypes.ERROR_MESSAGES)) if error_messages: filter_settings["errorMessages"] = {"patterns": error_messages} csp_disallowed_sources = [] if bool(project.get_option("sentry:csp_ignored_sources_defaults", True)): csp_disallowed_sources += DEFAULT_DISALLOWED_SOURCES csp_disallowed_sources += project.get_option( "sentry:csp_ignored_sources", []) if csp_disallowed_sources: filter_settings["csp"] = { "disallowedSources": csp_disallowed_sources } with Hub.current.start_span(op="get_grouping_config_dict_for_project"): project_cfg["groupingConfig"] = get_grouping_config_dict_for_project( project) return ProjectConfig(project, **cfg)