diff --git a/freqtrade/rpc/api_server2/auth.py b/freqtrade/rpc/api_server2/api_auth.py similarity index 94% rename from freqtrade/rpc/api_server2/auth.py rename to freqtrade/rpc/api_server2/api_auth.py index 3155e7754..d0c975480 100644 --- a/freqtrade/rpc/api_server2/auth.py +++ b/freqtrade/rpc/api_server2/api_auth.py @@ -1,4 +1,3 @@ -from freqtrade.rpc.api_server2.models import AccessAndRefreshToken, AccessToken import secrets from typing import Optional @@ -8,6 +7,8 @@ from fastapi.security.utils import get_authorization_scheme_param from fastapi_jwt_auth import AuthJWT from pydantic import BaseModel +from freqtrade.rpc.api_server2.api_models import AccessAndRefreshToken, AccessToken + from .deps import get_config @@ -41,7 +42,7 @@ class HTTPBasicOrJWTToken(HTTPBasic): header_authorization: str = request.headers.get("Authorization") header_scheme, header_param = get_authorization_scheme_param(header_authorization) if header_scheme.lower() == 'bearer': - AuthJWT.jwt_required() + AuthJWT(request).jwt_required() elif header_scheme.lower() == 'basic': credentials: Optional[HTTPBasicCredentials] = await HTTPBasic()(request) if credentials and verify_auth(config, credentials.username, credentials.password): @@ -49,7 +50,6 @@ class HTTPBasicOrJWTToken(HTTPBasic): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect username or password", - headers={"WWW-Authenticate": "Basic"}, ) diff --git a/freqtrade/rpc/api_server2/models.py b/freqtrade/rpc/api_server2/api_models.py similarity index 91% rename from freqtrade/rpc/api_server2/models.py rename to freqtrade/rpc/api_server2/api_models.py index c9ddb0d6f..0646ce3e6 100644 --- a/freqtrade/rpc/api_server2/models.py +++ b/freqtrade/rpc/api_server2/api_models.py @@ -1,4 +1,5 @@ from typing import List + from pydantic import BaseModel @@ -18,6 +19,10 @@ class Version(BaseModel): version: str +class StatusMsg(BaseModel): + status: str + + class Balance(BaseModel): currency: str free: float diff --git a/freqtrade/rpc/api_server2/api_v1.py b/freqtrade/rpc/api_server2/api_v1.py index c2e7a9172..b3e0a7a4f 100644 --- a/freqtrade/rpc/api_server2/api_v1.py +++ b/freqtrade/rpc/api_server2/api_v1.py @@ -1,9 +1,10 @@ +from freqtrade.rpc import RPC from fastapi import APIRouter, Depends from freqtrade import __version__ +from .api_models import Balances, Ping, StatusMsg, Version from .deps import get_config, get_rpc -from .models import Balances, Ping, Version # Public API, requires no auth. @@ -18,13 +19,21 @@ def ping(): return {"status": "pong"} -@router.get('/version', response_model=Version) +@router.get('/version', response_model=Version, tags=['info']) def version(): return {"version": __version__} -@router.get('/balance', response_model=Balances) -def balance(rpc=Depends(get_rpc), config=Depends(get_config)): +@router.get('/balance', response_model=Balances, tags=['info']) +def balance(rpc: RPC = Depends(get_rpc), config=Depends(get_config)): return rpc._rpc_balance(config['stake_currency'], config.get('fiat_display_currency', ''),) +@router.post('/start', response_model=StatusMsg, tags=['botcontrol']) +def start(rpc: RPC = Depends(get_rpc)): + return rpc._rpc_start() + + +@router.post('/stop', response_model=StatusMsg, tags=['botcontrol']) +def stop(rpc: RPC = Depends(get_rpc)): + return rpc._rpc_stop() diff --git a/freqtrade/rpc/api_server2/uvicorn_threaded.py b/freqtrade/rpc/api_server2/uvicorn_threaded.py index ba9263620..7c8804fd3 100644 --- a/freqtrade/rpc/api_server2/uvicorn_threaded.py +++ b/freqtrade/rpc/api_server2/uvicorn_threaded.py @@ -1,6 +1,7 @@ import contextlib -import time import threading +import time + import uvicorn diff --git a/freqtrade/rpc/api_server2/webserver.py b/freqtrade/rpc/api_server2/webserver.py index 84f6fc222..5f2e1d6fe 100644 --- a/freqtrade/rpc/api_server2/webserver.py +++ b/freqtrade/rpc/api_server2/webserver.py @@ -1,4 +1,5 @@ from typing import Any, Dict, Optional + import uvicorn from fastapi import Depends, FastAPI from fastapi.middleware.cors import CORSMiddleware @@ -36,7 +37,7 @@ class ApiServer(RPCHandler): def configure_app(self, app: FastAPI, config): from .api_v1 import router as api_v1 from .api_v1 import router_public as api_v1_public - from .auth import router_login, HTTPBasicOrJWTToken + from .api_auth import HTTPBasicOrJWTToken, router_login app.include_router(api_v1_public, prefix="/api/v1") app.include_router(api_v1, prefix="/api/v1",