83 lines
2.4 KiB
Python
Executable File
83 lines
2.4 KiB
Python
Executable File
import base64
|
|
import json
|
|
import os
|
|
|
|
from fastapi import FastAPI
|
|
from starlette.responses import JSONResponse, PlainTextResponse
|
|
|
|
from annotations import repo_info, addon_info
|
|
from params import *
|
|
|
|
app = FastAPI(
|
|
title=repository_name,
|
|
description="Sieloader repository",
|
|
version=version,
|
|
summary="Welcome to sieloader repository API",
|
|
contact={
|
|
"name": repository_name,
|
|
"email": email
|
|
}, docs_url="/"
|
|
)
|
|
|
|
@app.get(
|
|
path="/repo/info",
|
|
summary="Getting information about repository",
|
|
responses={200: {'model': repo_info}}
|
|
)
|
|
def info():
|
|
return repo_info(
|
|
name=repository_name,
|
|
version=version,
|
|
email=email,
|
|
repositories=len(next(os.walk("data"))[1])
|
|
)
|
|
|
|
@app.get(
|
|
path="/repo/metadata",
|
|
summary="Getting repository metadata, for sure information about every addon which this repository service host"
|
|
)
|
|
def metadata():
|
|
dirs = next(os.walk("data"))[1]
|
|
data = {}
|
|
for i in dirs:
|
|
with open(f"data/{i}/metadata.json") as file:
|
|
meta = json.load(file)
|
|
if secure:
|
|
source = f"https://{config['SIERRA']['hostname']}/repo/{i}"
|
|
else:
|
|
source = f"http://{config['SIERRA']['hostname']}/repo/{i}"
|
|
size = len(base64.b64encode(bytes(pgpy.PGPMessage.new(f"data/{i}/data.tar.xz", file=True))))
|
|
meta = addon_info(
|
|
author=meta['author'],
|
|
description=meta['description'],
|
|
email=meta['email'],
|
|
source=source,
|
|
size=size,
|
|
version=meta['version']
|
|
)
|
|
data[i] = json.loads(meta.model_dump_json())
|
|
return JSONResponse(content=data)
|
|
|
|
@app.get(
|
|
path="/repo/public_key",
|
|
summary="Repository public key for verifying signed addons"
|
|
)
|
|
def public_key():
|
|
return PlainTextResponse(base64.b64encode(bytes(pgpkey.pubkey)))
|
|
|
|
@app.get(
|
|
path="/repo/{repo}",
|
|
summary="For downloading addon from repository"
|
|
)
|
|
def repo_download(repo):
|
|
return PlainTextResponse(base64.b64encode(bytes(pgpy.PGPMessage.new(f"data/{repo}/data.tar.xz", file=True))))
|
|
|
|
@app.get(
|
|
path="/repo/{repo}/signature",
|
|
summary="For getting addon signature from repository"
|
|
)
|
|
def repo_cert(repo):
|
|
file = pgpy.PGPMessage.new(f"data/{repo}/data.tar.xz", file=True)
|
|
signature = pgpkey.sign(file)
|
|
return PlainTextResponse(base64.b64encode(bytes(signature)))
|