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.
126 lines
3.7 KiB
126 lines
3.7 KiB
import os |
|
import pickle |
|
import re |
|
|
|
from collections import OrderedDict |
|
from pyramid.config import Configurator |
|
from pyramid.response import Response |
|
from pyramid.view import view_config |
|
|
|
from . import utils |
|
|
|
|
|
class RootResource: |
|
''' A simple 'catch all' resource ''' |
|
|
|
moin_config_dir = None |
|
moin_wiki_defs = [] |
|
|
|
def __init__(self, request): |
|
''' initialization ''' |
|
self.request = request |
|
|
|
def __getitem__(self, key): |
|
''' no child resource lookup, only one view used''' |
|
return self |
|
|
|
@classmethod |
|
def pre_init(cls, moin_config_dir): |
|
cls.moin_config_dir = moin_config_dir |
|
moin_farmconfig = os.path.join(moin_config_dir, 'farmconfig.py') |
|
with open(moin_farmconfig, 'r') as fh: |
|
cls.moin_wiki_defs = list(utils.extract_wiki_definitions(fh)) |
|
|
|
|
|
def get_moin_user(self): |
|
email, name = '', '' |
|
try: |
|
moin_data_dir = self._get_wiki_data_dir() |
|
moin_session_dir = os.path.join( |
|
moin_data_dir, |
|
'cache', |
|
'__session__' |
|
) |
|
moin_user_id = self._get_user_id(moin_session_dir) |
|
moin_user_file = os.path.join(moin_data_dir, 'user', moin_user_id) |
|
with open(moin_user_file, 'r') as fh: |
|
if 'email=' in line: |
|
email = line.split('=', 1)[1] |
|
if 'name=' in line: |
|
name = line.split('=', 1)[1] |
|
except: |
|
pass |
|
return email, name |
|
|
|
def _get_wiki_data_dir(self): |
|
wiki_name = self._get_wiki_name() |
|
wiki_config = os.path.join(cls.moin_config_dir, wiki_name + '.py') |
|
with open(wiki_config, 'r') as fh: |
|
data_dir = utils.extract_data_dir(fh) |
|
return data_dir |
|
|
|
def _get_wiki_name(self): |
|
for name, re_url in self.moin_wiki_defs: |
|
if re.match(re_url, self.request.url): |
|
return name |
|
|
|
def _get_user_id(self, session_dir): |
|
session_path = self._get_session_path(session_dir) |
|
with open(session_path, 'rb') as fh: |
|
session_data = pickle.load(fh) |
|
return session_data.get('user.id') |
|
|
|
def _get_session_path(self, session_dir): |
|
for key, value in self.request.cookies.items(): |
|
if key.lower().startswith('moin'): |
|
session_path = os.path.join(sesssion_dir, value) |
|
if os.path.is_file(session_path): |
|
return session_path |
|
return None |
|
|
|
|
|
@view_config(context=RootResource) |
|
def the_view(context, request): |
|
|
|
body = [ |
|
'Someone Wanted Some Sweet Honey', |
|
'-------------------------------', |
|
'', |
|
'requested url: %s' % request.url, |
|
'request method: %s' % request.method, |
|
'client ip address: %s' % request.client_addr, |
|
'remote ip address: %s' % request.remote_addr, |
|
'', |
|
'request.authorization: %s' % request.authorization, |
|
'request.remote_user: %s' % request.remote_user, |
|
'', |
|
'headers:' |
|
] |
|
|
|
body.extend(utils.dict_helper(request.headers)) |
|
|
|
body.extend(['', 'cookies:']) |
|
if request.cookies: |
|
body.extend(utils.dict_helper(request.cookies)) |
|
else: |
|
body.append(' (no cookies)') |
|
|
|
email, name = context.get_moin_user() |
|
if email or name: |
|
body.extend(['', 'MoinMoin user: %s, %s' % (email, name) ]) |
|
|
|
return Response(body='\n'.join(body), content_type='text/plain') |
|
|
|
|
|
|
|
def main(global_config, **settings): |
|
""" This function returns a Pyramid WSGI application. |
|
""" |
|
print(settings) |
|
RootResource.pre_init(settings['moin.config_path']) |
|
|
|
config = Configurator(settings=settings) |
|
config.set_root_factory(RootResource) |
|
config.scan() |
|
|
|
return config.make_wsgi_app()
|
|
|