You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

206 lines
5.5 KiB

11 years ago
import os
import time
import traceback
from couchpotato.api import api_docs, api_docs_missing, api
14 years ago
from couchpotato.core.event import fireEvent
10 years ago
from couchpotato.core.helpers.encoding import sp
12 years ago
from couchpotato.core.helpers.variable import md5, tryInt
from couchpotato.core.logger import CPLog
from couchpotato.environment import Env
from tornado import template
12 years ago
from tornado.web import RequestHandler, authenticated
14 years ago
11 years ago
log = CPLog(__name__)
views = {}
template_loader = template.Loader(os.path.join(os.path.dirname(__file__), 'templates'))
11 years ago
12 years ago
class BaseHandler(RequestHandler):
def get_current_user(self):
username = Env.setting('username')
password = Env.setting('password')
if username and password:
12 years ago
return self.get_secure_cookie('user')
11 years ago
else: # Login when no username or password are set
12 years ago
return True
11 years ago
# Main web handler
12 years ago
class WebHandler(BaseHandler):
@authenticated
def get(self, route, *args, **kwargs):
route = route.strip('/')
if not views.get(route):
page_not_found(self)
return
try:
10 years ago
self.write(views[route](self))
except:
12 years ago
log.error("Failed doing web request '%s': %s", (route, traceback.format_exc()))
self.write({'success': False, 'error': 'Failed returning results'})
11 years ago
11 years ago
def addView(route, func):
views[route] = func
14 years ago
11 years ago
11 years ago
def get_db():
return Env.get('db')
14 years ago
# Web view
10 years ago
def index(*args):
return template_loader.load('index.html').generate(sep = os.sep, fireEvent = fireEvent, Env = Env)
addView('', index)
14 years ago
11 years ago
11 years ago
# Web view
10 years ago
def robots(handler):
handler.set_header('Content-Type', 'text/plain')
11 years ago
return 'User-agent: * \n' \
'Disallow: /'
addView('robots.txt', robots)
10 years ago
# Manifest
def manifest(handler):
web_base = Env.get('web_base')
static_base = Env.get('static_path')
lines = [
'CACHE MANIFEST',
10 years ago
'# %s theme' % ('dark' if Env.setting('dark_theme') else 'light'),
10 years ago
'',
10 years ago
'CACHE:',
''
10 years ago
]
if not Env.get('dev'):
10 years ago
# CSS
for url in fireEvent('clientscript.get_styles', single = True):
lines.append(web_base + url)
10 years ago
10 years ago
# Scripts
for url in fireEvent('clientscript.get_scripts', single = True):
lines.append(web_base + url)
10 years ago
10 years ago
# Favicon
lines.append(static_base + 'images/favicon.ico')
# Fonts
font_folder = sp(os.path.join(Env.get('app_dir'), 'couchpotato', 'static', 'fonts'))
for subfolder, dirs, files in os.walk(font_folder, topdown = False):
for file in files:
if '.woff' in file:
10 years ago
lines.append(static_base + 'fonts/' + file + ('?%s' % os.path.getmtime(os.path.join(font_folder, file))))
10 years ago
else:
lines.append('# Not caching anything in dev mode')
# End lines
10 years ago
lines.extend(['',
'NETWORK: ',
'*'])
handler.set_header('Content-Type', 'text/cache-manifest')
return '\n'.join(lines)
addView('couchpotato.appcache', manifest)
# API docs
10 years ago
def apiDocs(*args):
11 years ago
routes = list(api.keys())
if api_docs.get(''):
del api_docs['']
del api_docs_missing['']
return template_loader.load('api.html').generate(fireEvent = fireEvent, routes = sorted(routes), api_docs = api_docs, api_docs_missing = sorted(api_docs_missing), Env = Env)
addView('docs', apiDocs)
11 years ago
# Database debug manager
10 years ago
def databaseManage(*args):
return template_loader.load('database.html').generate(fireEvent = fireEvent, Env = Env)
addView('database', databaseManage)
# Make non basic auth option to get api key
class KeyHandler(RequestHandler):
def get(self, *args, **kwargs):
11 years ago
api_key = None
try:
username = Env.setting('username')
password = Env.setting('password')
if (self.get_argument('u') == md5(username) or not username) and (self.get_argument('p') == password or not password):
11 years ago
api_key = Env.setting('api_key')
self.write({
11 years ago
'success': api_key is not None,
'api_key': api_key
})
except:
log.error('Failed doing key request: %s', (traceback.format_exc()))
self.write({'success': False, 'error': 'Failed returning results'})
12 years ago
class LoginHandler(BaseHandler):
def get(self, *args, **kwargs):
if self.get_current_user():
12 years ago
self.redirect(Env.get('web_base'))
12 years ago
else:
self.write(template_loader.load('login.html').generate(sep = os.sep, fireEvent = fireEvent, Env = Env))
12 years ago
def post(self, *args, **kwargs):
11 years ago
api_key = None
12 years ago
username = Env.setting('username')
password = Env.setting('password')
if (self.get_argument('username') == username or not username) and (md5(self.get_argument('password')) == password or not password):
11 years ago
api_key = Env.setting('api_key')
12 years ago
11 years ago
if api_key:
12 years ago
remember_me = tryInt(self.get_argument('remember_me', default = 0))
11 years ago
self.set_secure_cookie('user', api_key, expires_days = 30 if remember_me > 0 else None)
12 years ago
12 years ago
self.redirect(Env.get('web_base'))
12 years ago
11 years ago
12 years ago
class LogoutHandler(BaseHandler):
def get(self, *args, **kwargs):
self.clear_cookie('user')
12 years ago
self.redirect('%slogin/' % Env.get('web_base'))
12 years ago
def page_not_found(rh):
index_url = Env.get('web_base')
url = rh.request.uri[len(index_url):]
if url[:3] != 'api':
r = index_url + '#' + url.lstrip('/')
rh.redirect(r)
else:
if not Env.get('dev'):
time.sleep(0.1)
rh.set_status(404)
rh.write('Wrong API key used')