|
|
|
from couchpotato.api import api_docs, api_docs_missing, api
|
|
|
|
from couchpotato.core.auth import requires_auth
|
|
|
|
from couchpotato.core.event import fireEvent
|
|
|
|
from couchpotato.core.helpers.variable import md5
|
|
|
|
from couchpotato.core.logger import CPLog
|
|
|
|
from couchpotato.environment import Env
|
|
|
|
from sqlalchemy.engine import create_engine
|
|
|
|
from sqlalchemy.orm import scoped_session
|
|
|
|
from sqlalchemy.orm.session import sessionmaker
|
|
|
|
from tornado import template
|
|
|
|
from tornado.web import RequestHandler
|
|
|
|
import os
|
|
|
|
import time
|
|
|
|
|
|
|
|
log = CPLog(__name__)
|
|
|
|
|
|
|
|
views = {}
|
|
|
|
template_loader = template.Loader(os.path.join(os.path.dirname(__file__), 'templates'))
|
|
|
|
|
|
|
|
# Main web handler
|
|
|
|
@requires_auth
|
|
|
|
class WebHandler(RequestHandler):
|
|
|
|
def get(self, route):
|
|
|
|
if not views.get(route):
|
|
|
|
page_not_found(self)
|
|
|
|
return
|
|
|
|
self.write(views[route]())
|
|
|
|
|
|
|
|
def addView(route, func, static = False):
|
|
|
|
views[route] = func
|
|
|
|
|
|
|
|
def get_session(engine = None):
|
|
|
|
return Env.getSession(engine)
|
|
|
|
|
|
|
|
|
|
|
|
# Web view
|
|
|
|
def index():
|
|
|
|
return template_loader.load('index.html').generate(sep = os.sep, fireEvent = fireEvent, Env = Env)
|
|
|
|
addView('', index)
|
|
|
|
|
|
|
|
# API docs
|
|
|
|
def apiDocs():
|
|
|
|
routes = []
|
|
|
|
|
|
|
|
for route in api.iterkeys():
|
|
|
|
routes.append(route)
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
# Make non basic auth option to get api key
|
|
|
|
class KeyHandler(RequestHandler):
|
|
|
|
def get(self):
|
|
|
|
api = None
|
|
|
|
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):
|
|
|
|
api = Env.setting('api_key')
|
|
|
|
|
|
|
|
self.write({
|
|
|
|
'success': api is not None,
|
|
|
|
'api_key': api
|
|
|
|
})
|
|
|
|
|
|
|
|
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')
|
|
|
|
|