36 lines
1.6 KiB
Python
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()
|