diff --git a/r2/r2/config/middleware.py b/r2/r2/config/middleware.py
index 36d0b23da..fa43ef7ac 100644
--- a/r2/r2/config/middleware.py
+++ b/r2/r2/config/middleware.py
@@ -175,6 +175,15 @@ class DomainMiddleware(object):
def __init__(self, app):
self.app = app
+ auth_cnames = config['global_conf'].get('authorized_cnames', '')
+ auth_cnames = [x.strip() for x in auth_cnames.split(',')]
+ # we are going to be matching with endswith, so make sure there
+ # are no empty strings that have snuck in
+ self.auth_cnames = [x for x in auth_cnames if x]
+
+ def is_auth_cname(self, domain):
+ return any((domain == cname or domain.endswith('.' + cname))
+ for cname in self.auth_cnames)
def __call__(self, environ, start_response):
# get base domain as defined in INI file
@@ -198,6 +207,9 @@ class DomainMiddleware(object):
if not environ.get('extension'):
if environ['PATH_INFO'].startswith('/frame'):
return self.app(environ, start_response)
+ elif self.is_auth_cname(sub_domains):
+ environ['frameless_cname'] = True
+ environ['authorized_cname'] = True
elif ("redditSession" in environ.get('HTTP_COOKIE', '')
and environ['REQUEST_METHOD'] != 'POST'
and not environ['PATH_INFO'].startswith('/error')):
diff --git a/r2/r2/controllers/reddit_base.py b/r2/r2/controllers/reddit_base.py
index 9631b0baf..36e6ed5ee 100644
--- a/r2/r2/controllers/reddit_base.py
+++ b/r2/r2/controllers/reddit_base.py
@@ -60,6 +60,8 @@ class Cookie(object):
self.dirty = dirty
if domain:
self.domain = domain
+ elif c.authorized_cname:
+ self.domain = c.site.domain
else:
self.domain = g.domain
@@ -133,10 +135,8 @@ def read_user_cookie(name):
def set_user_cookie(name, val):
uname = c.user.name if c.user_is_loggedin else ""
- domain = g.domain if not c.frameless_cname else None
- c.cookies[uname + '_' + name] = Cookie(value = val,
- domain = domain)
-
+ c.cookies[uname + '_' + name] = Cookie(value = val)
+
valid_click_cookie = re.compile(r'(t[0-9]_[a-zA-Z0-9]+:)+').match
def read_click_cookie():
if c.user_is_loggedin:
@@ -182,8 +182,7 @@ def set_redditfirst(key,val):
cookie = {key: val}
c.cookies['reddit_first'] = Cookie(simplejson.dumps(cookie),
- expires = NEVER,
- domain = g.domain)
+ expires = NEVER)
# this cookie is also accessed by organic.js, so changes to the format
# will have to be made there as well
@@ -336,7 +335,9 @@ def set_cnameframe():
del request.params[utils.UrlParser.cname_get]
if request.get.has_key(utils.UrlParser.cname_get):
del request.get[utils.UrlParser.cname_get]
- c.frameless_cname = request.environ.get('frameless_cname', False)
+ c.frameless_cname = request.environ.get('frameless_cname', False)
+ if hasattr(c.site, 'domain'):
+ c.authorized_cname = request.environ.get('authorized_cname', False)
def ratelimit_agents():
user_agent = request.user_agent
@@ -424,6 +425,10 @@ class RedditController(BaseController):
#check if user-agent needs a dose of rate-limiting
ratelimit_agents()
+ # the domain has to be set before Cookies get initialized
+ set_subreddit()
+ set_cnameframe()
+
# populate c.cookies
c.cookies = Cookies()
for k,v in request.cookies.iteritems():
@@ -458,11 +463,9 @@ class RedditController(BaseController):
#set_browser_langs()
set_host_lang()
- set_subreddit()
set_content_type()
set_iface_lang()
set_content_lang()
- set_cnameframe()
# set some environmental variables in case we hit an abort
if not isinstance(c.site, FakeSubreddit):
diff --git a/r2/r2/lib/pages/pages.py b/r2/r2/lib/pages/pages.py
index 84acc13d5..5027b917a 100644
--- a/r2/r2/lib/pages/pages.py
+++ b/r2/r2/lib/pages/pages.py
@@ -92,7 +92,8 @@ class Reddit(Wrapped):
#c.subredditbox is set by VSRMask
self.subreddit_sidebox = False
- if c.subreddit_sidebox:
+ #don't show the sidebox on cnames
+ if c.subreddit_sidebox and not c.cname:
self.subreddit_sidebox = True
self.subreddit_checkboxes = c.site == Default
@@ -101,7 +102,6 @@ class Reddit(Wrapped):
else:
self._content = content
-
self.toolbars = self.build_toolbars()
def rightbox(self):
@@ -112,7 +112,8 @@ class Reddit(Wrapped):
if not c.user_is_loggedin and self.loginbox:
ps.append(LoginFormWide())
- if not isinstance(c.site, FakeSubreddit):
+ #don't show the subreddit info bar on cnames
+ if not isinstance(c.site, FakeSubreddit) and not c.cname:
ps.append(SubredditInfoBar())
if self.subreddit_sidebox:
@@ -179,7 +180,8 @@ class Reddit(Wrapped):
NamedButton("blog", False, nocname=True)]
if c.user_is_loggedin:
- buttons += [NamedButton("logout", False, nocname=True,
+ buttons += [NamedButton("logout", False,
+ nocname=not c.authorized_cname,
target = "_self")]
return NavMenu(buttons, base_path = "/", type = "flatlist")
diff --git a/r2/r2/templates/base.html b/r2/r2/templates/base.html
index e979dfc05..29c5ed2a3 100644
--- a/r2/r2/templates/base.html
+++ b/r2/r2/templates/base.html
@@ -49,7 +49,7 @@
var cnameframe = ${'true' if c.cname else 'false'};
var modhash = ${"'%s'" % c.modhash or "false"};
var cur_domain = "${get_domain(cname = True, subreddit = False) if c.frameless_cname else g.domain}";
- var ajax_domain = "${g.domain}";
+ var ajax_domain = "${get_domain(cname = True, subreddit = False) if c.authorized_cname else g.domain}";
diff --git a/r2/r2/templates/redditfooter.html b/r2/r2/templates/redditfooter.html
index 1894805ff..009739e57 100644
--- a/r2/r2/templates/redditfooter.html
+++ b/r2/r2/templates/redditfooter.html
@@ -46,7 +46,7 @@
%if g.tracker_url:
%endif
- %if c.frameless_cname:
+ %if c.frameless_cname and not c.authorized_cname:
<%
u = UrlParser("http://%s/%s" % (get_domain(cname = True, subreddit = False), request.path))
u.update_query(**request.get)
diff --git a/r2/r2/templates/sharelink.html b/r2/r2/templates/sharelink.html
index 30466d0f1..9d37adadf 100644
--- a/r2/r2/templates/sharelink.html
+++ b/r2/r2/templates/sharelink.html
@@ -77,7 +77,7 @@