mirror of
https://github.com/andrewyng/openworker.git
synced 2026-09-12 15:20:19 +00:00
security: complete local access protections
This commit is contained in:
+25
-8
@@ -4,12 +4,13 @@ from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import secrets
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
from ..config import load_config
|
||||
from ..permissions import Mode
|
||||
from ..secrets import state_dir
|
||||
from ..secrets import state_dir, write_private_text
|
||||
from .app import _WS_MAX_FRAME_BYTES, create_app
|
||||
from .manager import SessionManager
|
||||
|
||||
@@ -124,6 +125,17 @@ def _ensure_ca_bundle() -> None:
|
||||
pass
|
||||
|
||||
|
||||
def _ensure_api_token(port: int) -> Path | None:
|
||||
"""Set launch auth; standalone/dev tokens use a user-only, port-specific file."""
|
||||
if os.environ.get("COWORKER_API_TOKEN"):
|
||||
return None # Tauri supplied an in-memory token; never persist it.
|
||||
token = secrets.token_hex(32)
|
||||
os.environ["COWORKER_API_TOKEN"] = token
|
||||
return write_private_text(
|
||||
state_dir() / f"sidecar-{port}.token", token + "\n"
|
||||
)
|
||||
|
||||
|
||||
def main(argv=None) -> None:
|
||||
_ensure_ca_bundle()
|
||||
cfg = load_config() # global config supplies defaults
|
||||
@@ -144,14 +156,19 @@ def main(argv=None) -> None:
|
||||
# a random free port (to coexist with a hand-run server on 8765), so the
|
||||
# managed-connect redirect must follow the real port, not the 8765 default.
|
||||
os.environ["COWORKER_PORT"] = str(args.port)
|
||||
generated_token_path = _ensure_api_token(args.port)
|
||||
try:
|
||||
import uvicorn
|
||||
|
||||
import uvicorn
|
||||
|
||||
_exit_when_orphaned()
|
||||
app = build_app(args.cwd, args.model, args.mode)
|
||||
uvicorn.run(
|
||||
app, host=args.host, port=args.port, ws_max_size=_WS_MAX_FRAME_BYTES
|
||||
)
|
||||
_exit_when_orphaned()
|
||||
app = build_app(args.cwd, args.model, args.mode)
|
||||
uvicorn.run(
|
||||
app, host=args.host, port=args.port, ws_max_size=_WS_MAX_FRAME_BYTES
|
||||
)
|
||||
finally:
|
||||
if generated_token_path is not None:
|
||||
generated_token_path.unlink(missing_ok=True)
|
||||
os.environ.pop("COWORKER_API_TOKEN", None)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
Reference in New Issue
Block a user