Revised terms and privacy consent dialog, analytics hooks (#1426)

* revised terms and privacy consent

* reorg code

* fix conditional

* Overlay reflects un-dissmissable state

* add inline scripts, and consent callback

* add csp_directive config hook

* revert config.yaml

* fix logic error

Co-authored-by: Colin Megill <colinmegill@gmail.com>
This commit is contained in:
Bruce Martin
2020-04-28 14:21:53 -07:00
committed by GitHub
co-authored by Colin Megill
parent 666e6d9849
commit 05fcdaf93c
7 changed files with 184 additions and 48 deletions
+22
View File
@@ -50,6 +50,7 @@ class AppConfig(object):
self.server__host = dc["server"]["host"]
self.server__port = dc["server"]["port"]
self.server__scripts = dc["server"]["scripts"]
self.server__inline_scripts = dc["server"]["inline_scripts"]
self.server__open_browser = dc["server"]["open_browser"]
self.server__about_legal_tos = dc["server"]["about_legal_tos"]
self.server__about_legal_privacy = dc["server"]["about_legal_privacy"]
@@ -57,6 +58,7 @@ class AppConfig(object):
self.server__flask_secret_key = dc["server"]["flask_secret_key"]
self.server__generate_cache_control_headers = dc["server"]["generate_cache_control_headers"]
self.server__server_timing_headers = dc["server"]["server_timing_headers"]
self.server__csp_directives = dc["server"]["csp_directives"]
self.multi_dataset__dataroot = dc["multi_dataset"]["dataroot"]
self.multi_dataset__index = dc["multi_dataset"]["index"]
@@ -129,6 +131,12 @@ class AppConfig(object):
mapping["adaptor__cxg_adaptor__tiledb_ctx"] = (("adaptor", "cxg_adaptor", "tiledb_ctx"), val)
del dc["adaptor"]["cxg_adaptor"]["tiledb_ctx"]
# special case for csp_directives whose value is a dict.
val = config.get("server", {}).get("csp_directives", {})
if val is not None:
mapping["server__csp_directives"] = (("server", "csp_directives"), val)
del dc["server"]["csp_directives"]
flat_config = flatten(dc)
for key, value in flat_config.items():
# name of the attribute
@@ -231,6 +239,7 @@ class AppConfig(object):
self.__check_attr("server__host", str)
self.__check_attr("server__port", (type(None), int))
self.__check_attr("server__scripts", (list, tuple))
self.__check_attr("server__inline_scripts", (list, tuple))
self.__check_attr("server__open_browser", bool)
self.__check_attr("server__force_https", bool)
self.__check_attr("server__flask_secret_key", (type(None), str))
@@ -238,6 +247,7 @@ class AppConfig(object):
self.__check_attr("server__about_legal_tos", (type(None), str))
self.__check_attr("server__about_legal_privacy", (type(None), str))
self.__check_attr("server__server_timing_headers", bool)
self.__check_attr("server__csp_directives", (type(None), dict))
if self.server__port:
if not is_port_available(self.server__host, self.server__port):
@@ -262,6 +272,18 @@ class AppConfig(object):
# second, from config file
self.server__flask_secret_key = os.environ.get("CXG_SECRET_KEY", self.server__flask_secret_key)
# CSP Directives are a dict of string: list(string) or string: string
if self.server__csp_directives is not None:
for k, v in self.server__csp_directives.items():
if not isinstance(k, str):
raise ConfigurationError(f"CSP directive names must be a string.")
if isinstance(v, list):
for policy in v:
if not isinstance(policy, str):
raise ConfigurationError(f"CSP directive value must be a string or list of strings.")
elif not isinstance(v, str):
raise ConfigurationError(f"CSP directive value must be a string or list of strings.")
def handle_data_locator(self, context):
self.__check_attr("data_locator__s3__region_name", (type(None), bool, str))
if self.data_locator__s3__region_name is True:
+2
View File
@@ -9,6 +9,7 @@ server:
host: "127.0.0.1"
port : null
scripts : []
inline_scripts: []
open_browser: false
about_legal_tos: null
about_legal_privacy: null
@@ -16,6 +17,7 @@ server:
flask_secret_key: null
generate_cache_control_headers: false
server_timing_headers: false
csp_directives: null
presentation:
max_categories: 1000