Mikhail Korobov avatar Mikhail Korobov committed e6957bb

IFrameFixMiddleware improvements (fix #6).

Comments (0)

Files changed (3)

 * Nakvasiuk Vasyl <vaxxxa@gmail.com>
 * Evgeniy Kirov
 * Maxim Syabro
+* Domantas Jackūnas
 CHANGES
 =======
 
+dev (TBA)
+---------
+* Improved Safari cookie fix (thanks Domantas Jackūnas);
+* IFrameFixMiddleware works now if user agent is not set.
+
 0.3 (2011-11-28)
 ----------------
 

vk_iframe/middleware.py

 
     def process_request(self, request):
         """
-        Safari default security policy restricts cookie setting in first request in iframe.
+        Safari and Opera default security policies restrict cookie setting in first request in iframe.
         Solution is to create hidden form to preserve GET variables and REPOST it to current URL.
-        taken from https://gist.github.com/796811
+
+        Inspired by https://gist.github.com/796811 and https://gist.github.com/1511039.
         """
-        if (request.META['HTTP_USER_AGENT'].find('Safari') != -1
-            or request.META['HTTP_USER_AGENT'].find('Opera') != -1) \
-           and 'sessionid' not in request.COOKIES \
-           and 'cookie_fix' not in request.GET \
-           and 'api_id' in request.GET:
+        user_agent = request.META.get('HTTP_USER_AGENT', '')
 
+        browser_is_safari = 'Safari' in user_agent and 'Chrome' not in user_agent
+        browser_is_opera = 'Opera' in user_agent
+        first_request = 'sessionid' not in request.COOKIES and 'cookie_fix' not in request.GET
+        iframe_auth = 'api_id' in request.GET
+
+        if (browser_is_safari or browser_is_opera) and first_request and iframe_auth:
             html = """<html><body><form name='cookie_fix' method='GET' action='.'>"""
             for item in request.GET:
                 html += "<input type='hidden' value='%s' name='%s' />" % (request.GET[item], item)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.