diff options
author | Rob Crittenden <rcritten@redhat.com> | 2015-04-23 16:42:27 -0400 |
---|---|---|
committer | Patrick Uiterwijk <puiterwijk@redhat.com> | 2015-04-24 19:10:34 +0200 |
commit | 44f663ac7dc5a6f28b25b083a21f6d9e912cff92 (patch) | |
tree | 1975cf213d09bd9f1988e191366636fe4d39fee8 /ipsilon/util/endpoint.py | |
parent | b6d5f11ffe484e2ba7de14c7bac31c52461fe791 (diff) | |
download | ipsilon.git-44f663ac7dc5a6f28b25b083a21f6d9e912cff92.tar.gz ipsilon.git-44f663ac7dc5a6f28b25b083a21f6d9e912cff92.tar.xz ipsilon.git-44f663ac7dc5a6f28b25b083a21f6d9e912cff92.zip |
Disallow iframes via X-Frame-Options and CSP by default
A decorator, allow_iframe, is also created so that specific
pages can remove the deny values and allow operating within
a frame.
The Persona plugin relies on iframes and uses this decorator
for all endpoints.
https://fedorahosted.org/ipsilon/ticket/15
Signed-off-by: Rob Crittenden <rcritten@redhat.com>
Reviewed-by: Patrick Uiterwijk <puiterwijk@redhat.com>
Diffstat (limited to 'ipsilon/util/endpoint.py')
-rw-r--r-- | ipsilon/util/endpoint.py | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/ipsilon/util/endpoint.py b/ipsilon/util/endpoint.py index f160329..0016bc2 100644 --- a/ipsilon/util/endpoint.py +++ b/ipsilon/util/endpoint.py @@ -4,6 +4,7 @@ import cherrypy from ipsilon.util.log import Log from ipsilon.util.user import UserSession from urllib import unquote +from functools import wraps try: from urlparse import urlparse except ImportError: @@ -11,6 +12,23 @@ except ImportError: from urllib.parse import urlparse +def allow_iframe(func): + """ + Remove the X-Frame-Options and CSP frame-options deny headers. + """ + @wraps(func) + def wrapper(*args, **kwargs): + result = func(*args, **kwargs) + for (header, value) in [ + ('X-Frame-Options', 'deny'), + ('Content-Security-Policy', 'frame-options \'deny\'')]: + if cherrypy.response.headers.get(header, None) == value: + cherrypy.response.headers.pop(header, None) + return result + + return wrapper + + class Endpoint(Log): def __init__(self, site): self._site = site @@ -19,6 +37,8 @@ class Endpoint(Log): self.default_headers = { 'Cache-Control': 'no-cache, no-store, must-revalidate, private', 'Pragma': 'no-cache', + 'Content-Security-Policy': 'frame-options \'deny\'', + 'X-Frame-Options': 'deny', } self.auth_protect = False |