From d63629ba5c81c5ad5b431c66d002829251be9dd9 Mon Sep 17 00:00:00 2001 From: Thomas Peetz Date: Wed, 7 Jan 2026 23:46:42 +0100 Subject: [PATCH] add authentication for kontor-scripts --- kontor-scripts/download.py | 51 ++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 5 deletions(-) diff --git a/kontor-scripts/download.py b/kontor-scripts/download.py index 7a54309..b58c5c2 100644 --- a/kontor-scripts/download.py +++ b/kontor-scripts/download.py @@ -2,15 +2,20 @@ download files with URLs from DB """ +import os import re import subprocess from argparse import ArgumentDefaultsHelpFormatter, ArgumentParser from datetime import datetime from enum import Enum, auto from pathlib import Path +import sys +from typing import Any, Dict from uuid import UUID +from platformdirs import PlatformDirs import requests +import yaml from config import get_logger @@ -102,9 +107,9 @@ def is_file_downloaded(media_file: dict, dir: Path) -> FileStatus: def update_status(item_id: UUID, file_info: dict): - update = requests.put( - f"http://127.0.0.1:8800/api/media/files/{item_id}", json=file_info - ) + url: str = f"http://127.0.0.1:8800/api/media/files/{item_id}" + headers: Dict[str, str] = {"Authorization": f"Bearer {bearer_token}"} + update = requests.put(url, headers=headers, json=file_info) log.info(f"update status: {update.status_code}") log.info(f"update result: {update.json()}") @@ -127,14 +132,50 @@ def rename_file(file_info: dict): if __name__ == "__main__": log = get_logger(args.verbose, args.config) log.info("kontor.download started") - response = requests.get("http://127.0.0.1:8800/api/media/files?download=true") + api_data: Dict[str, Any] = {} + token: str | None = None + host: str | None = None + port: int = 0 + dirs = PlatformDirs(args.config) + api_config = Path(dirs.user_config_dir, 'api.yaml') + with open(api_config, 'rt') as f: + api_data = yaml.safe_load(f.read()) + if not api_data: + log.fatal("API configuration is missing") + sys.exit(1) + host = api_data["host"] + port = api_data["port"] + if not token: + log.info("Call login first") + login_url = f"http://{host}:{port}/login" + login_data = {} + login_data['user'] = api_data["user"] + login_data['pass'] = api_data["pass"] + response = requests.post(login_url, data=login_data) + status = response.status_code + log.info(f"Status: {status}") + if status != 200: + log.fatal("authentication failed") + sys.exit(0) + data = response.json() + token = data['token'] + api_data['token'] = token + with open(api_config, 'w') as f: + yaml.dump(api_data, f) + else: + token = api_data['token'] + url: str = f"http://{host}:8500/api/media/files?download=true" + headers: Dict[str, str] = {"Authorization": f"Bearer {token}"} + response = requests.get(url, headers=headers) log.info(f"Status: {response.status_code}") data = response.json() entries_count = len(data) log.info(f"data: {entries_count}") mediafile_index = 1 - log.debug(f"data: {len(data)}") + log.debug(f"data: {data}") missing_actors = {} + if args.dry_run: + sys.exit(0) if args.limit: log.warning(f"check the first {args.limit} links") for item in data: