Simple repository for the /HonigTopf (HoneyPot) link, that alerts the admins if someone tries to scrape a moin moin wiki.
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

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()