2018-05-18 18:41:41 +00:00
|
|
|
import os
|
2018-06-16 20:02:10 +00:00
|
|
|
import subprocess
|
|
|
|
from datetime import datetime
|
|
|
|
|
2018-05-18 18:41:41 +00:00
|
|
|
import requests
|
2018-06-16 20:02:10 +00:00
|
|
|
import yaml
|
2018-05-30 21:47:01 +00:00
|
|
|
from itsdangerous import JSONWebSignatureSerializer
|
2018-06-16 20:02:10 +00:00
|
|
|
from pymongo import MongoClient
|
2018-05-18 18:41:41 +00:00
|
|
|
|
2018-06-16 20:02:10 +00:00
|
|
|
from little_boxes import strtobool
|
|
|
|
from utils.key import KEY_DIR
|
|
|
|
from utils.key import get_key
|
|
|
|
from utils.key import get_secret_key
|
2018-06-16 19:24:53 +00:00
|
|
|
|
2018-05-18 18:41:41 +00:00
|
|
|
|
2018-05-21 15:04:53 +00:00
|
|
|
def noop():
|
|
|
|
pass
|
2018-05-18 18:41:41 +00:00
|
|
|
|
2018-05-21 15:04:53 +00:00
|
|
|
|
|
|
|
CUSTOM_CACHE_HOOKS = False
|
|
|
|
try:
|
2018-06-16 19:24:53 +00:00
|
|
|
from cache_hooks import purge as custom_cache_purge_hook
|
2018-05-21 15:04:53 +00:00
|
|
|
except ModuleNotFoundError:
|
|
|
|
custom_cache_purge_hook = noop
|
|
|
|
|
|
|
|
VERSION = subprocess.check_output(['git', 'describe', '--always']).split()[0].decode('utf-8')
|
2018-05-18 18:41:41 +00:00
|
|
|
|
2018-05-27 09:01:34 +00:00
|
|
|
DEBUG_MODE = strtobool(os.getenv('MICROBLOGPUB_DEBUG', 'false'))
|
|
|
|
|
|
|
|
|
2018-05-18 18:41:41 +00:00
|
|
|
CTX_AS = 'https://www.w3.org/ns/activitystreams'
|
|
|
|
CTX_SECURITY = 'https://w3id.org/security/v1'
|
|
|
|
AS_PUBLIC = 'https://www.w3.org/ns/activitystreams#Public'
|
|
|
|
HEADERS = [
|
|
|
|
'application/activity+json',
|
|
|
|
'application/ld+json;profile=https://www.w3.org/ns/activitystreams',
|
|
|
|
'application/ld+json; profile="https://www.w3.org/ns/activitystreams"',
|
|
|
|
'application/ld+json',
|
|
|
|
]
|
|
|
|
|
|
|
|
|
2018-05-30 20:50:45 +00:00
|
|
|
with open(os.path.join(KEY_DIR, 'me.yml')) as f:
|
2018-05-18 18:41:41 +00:00
|
|
|
conf = yaml.load(f)
|
|
|
|
|
|
|
|
USERNAME = conf['username']
|
|
|
|
NAME = conf['name']
|
|
|
|
DOMAIN = conf['domain']
|
|
|
|
SCHEME = 'https' if conf.get('https', True) else 'http'
|
|
|
|
BASE_URL = SCHEME + '://' + DOMAIN
|
|
|
|
ID = BASE_URL
|
|
|
|
SUMMARY = conf['summary']
|
|
|
|
ICON_URL = conf['icon_url']
|
|
|
|
PASS = conf['pass']
|
2018-05-26 07:50:59 +00:00
|
|
|
PUBLIC_INSTANCES = conf.get('public_instances', [])
|
2018-05-25 21:57:29 +00:00
|
|
|
# TODO(tsileo): choose dark/light style
|
2018-05-21 19:10:21 +00:00
|
|
|
THEME_COLOR = conf.get('theme_color')
|
2018-05-18 18:41:41 +00:00
|
|
|
|
|
|
|
USER_AGENT = (
|
|
|
|
f'{requests.utils.default_user_agent()} '
|
|
|
|
f'(microblog.pub/{VERSION}; +{BASE_URL})'
|
|
|
|
)
|
|
|
|
|
|
|
|
mongo_client = MongoClient(
|
|
|
|
host=[os.getenv('MICROBLOGPUB_MONGODB_HOST', 'localhost:27017')],
|
|
|
|
)
|
|
|
|
|
2018-05-27 09:50:09 +00:00
|
|
|
DB_NAME = '{}_{}'.format(USERNAME, DOMAIN.replace('.', '_'))
|
|
|
|
DB = mongo_client[DB_NAME]
|
|
|
|
|
2018-06-16 19:24:53 +00:00
|
|
|
|
2018-05-27 09:50:09 +00:00
|
|
|
def _drop_db():
|
|
|
|
if not DEBUG_MODE:
|
|
|
|
return
|
|
|
|
|
|
|
|
mongo_client.drop_database(DB_NAME)
|
|
|
|
|
2018-06-16 19:24:53 +00:00
|
|
|
|
|
|
|
KEY = get_key(ID, USERNAME, DOMAIN)
|
2018-05-18 18:41:41 +00:00
|
|
|
|
2018-05-30 21:47:01 +00:00
|
|
|
|
|
|
|
JWT_SECRET = get_secret_key('jwt')
|
|
|
|
JWT = JSONWebSignatureSerializer(JWT_SECRET)
|
|
|
|
|
2018-06-16 19:24:53 +00:00
|
|
|
|
2018-05-30 21:47:01 +00:00
|
|
|
def _admin_jwt_token() -> str:
|
|
|
|
return JWT.dumps({'me': 'ADMIN', 'ts': datetime.now().timestamp()}).decode('utf-8') # type: ignore
|
|
|
|
|
|
|
|
|
2018-06-16 19:24:53 +00:00
|
|
|
ADMIN_API_KEY = get_secret_key('admin_api_key', _admin_jwt_token)
|
2018-05-30 21:47:01 +00:00
|
|
|
|
2018-05-18 18:41:41 +00:00
|
|
|
ME = {
|
|
|
|
"@context": [
|
|
|
|
CTX_AS,
|
|
|
|
CTX_SECURITY,
|
|
|
|
],
|
|
|
|
"type": "Person",
|
|
|
|
"id": ID,
|
|
|
|
"following": ID+"/following",
|
|
|
|
"followers": ID+"/followers",
|
|
|
|
"liked": ID+"/liked",
|
|
|
|
"inbox": ID+"/inbox",
|
|
|
|
"outbox": ID+"/outbox",
|
|
|
|
"preferredUsername": USERNAME,
|
|
|
|
"name": NAME,
|
|
|
|
"summary": SUMMARY,
|
|
|
|
"endpoints": {},
|
|
|
|
"url": ID,
|
|
|
|
"icon": {
|
|
|
|
"mediaType": "image/png",
|
|
|
|
"type": "Image",
|
|
|
|
"url": ICON_URL,
|
|
|
|
},
|
2018-06-16 19:24:53 +00:00
|
|
|
"publicKey": KEY.to_dict(),
|
2018-05-18 18:41:41 +00:00
|
|
|
}
|