Files

36 lines
1.6 KiB
Python

#!/usr/bin/env python3
"""Run the portable save API on localhost with a configured external OIDC login provider."""
import argparse
import os
from pathlib import Path
import sys
from wsgiref.simple_server import WSGIRequestHandler, WSGIServer, make_server
ROOT=Path(__file__).resolve().parents[1]
sys.path.insert(0,str(ROOT/'dm/cloud'))
from save_api import SaveAPI, SaveStore, oidc_verifier
class QuietHandler(WSGIRequestHandler):
# Do not log bearer tokens, share URLs, payloads or user identity.
def log_message(self,format,*args):pass
class TimeoutServer(WSGIServer):
def get_request(self):
connection,address=super().get_request();connection.settimeout(15);return connection,address
def main():
parser=argparse.ArgumentParser(description=__doc__)
parser.add_argument('--data',type=Path,required=True,help='private persistent directory outside this checkout')
parser.add_argument('--port',type=int,default=8787)
args=parser.parse_args();data=args.data.expanduser().resolve()
if data==ROOT or ROOT in data.parents:parser.error('Keep private saves outside the repository.')
verify=oidc_verifier(os.environ.get('OIDC_ISSUER'),os.environ.get('OIDC_AUDIENCE'),os.environ.get('OIDC_JWKS_URL'))
data.mkdir(parents=True,exist_ok=True);os.chmod(data,0o700)
app=SaveAPI(SaveStore(data/'saves.sqlite3'),verify)
with make_server('127.0.0.1',args.port,app,server_class=TimeoutServer,handler_class=QuietHandler) as server:
print(f'Save API listening on http://127.0.0.1:{args.port}; native cloud login/import is not connected yet.',flush=True)
server.serve_forever()
if __name__=='__main__':main()