From 2aeefcbf246ff4303ce9bb2003d34e95f873937e Mon Sep 17 00:00:00 2001 From: Open TAK server Date: Thu, 16 Apr 2026 15:28:27 +0000 Subject: [PATCH 1/2] feat: add OTS_MAP_* config defaults for map position, zoom, and layer --- opentakserver/defaultconfig.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/opentakserver/defaultconfig.py b/opentakserver/defaultconfig.py index 32ce462a..f11b5384 100644 --- a/opentakserver/defaultconfig.py +++ b/opentakserver/defaultconfig.py @@ -45,6 +45,12 @@ class DefaultConfig: OTS_BACKUP_COUNT = int(os.getenv("OTS_BACKUP_COUNT", 7)) OTS_ENABLE_CHANNELS = os.getenv("OTS_ENABLE_CHANNELS", "True").lower() in ["true", "1", "yes"] + # Map defaults + OTS_MAP_DEFAULT_LAT = float(os.getenv("OTS_MAP_DEFAULT_LAT", 10)) + OTS_MAP_DEFAULT_LON = float(os.getenv("OTS_MAP_DEFAULT_LON", 0)) + OTS_MAP_DEFAULT_ZOOM = int(os.getenv("OTS_MAP_DEFAULT_ZOOM", 3)) + OTS_MAP_DEFAULT_LAYER = os.getenv("OTS_MAP_DEFAULT_LAYER", "OSM") + # RabbitMQ Settings OTS_RABBITMQ_SERVER_ADDRESS = os.getenv("OTS_RABBITMQ_SERVER_ADDRESS", "127.0.0.1") OTS_RABBITMQ_USERNAME = os.getenv("OTS_RABBITMQ_USERNAME", "guest") From d5c1ff50bbeb19d0b3148cb96e4b17a6c7c36a91 Mon Sep 17 00:00:00 2001 From: Open TAK server Date: Thu, 16 Apr 2026 15:28:56 +0000 Subject: [PATCH 2/2] feat: add GET/PUT /api/config endpoint with whitelist for map settings --- opentakserver/blueprints/ots_api/__init__.py | 2 + .../blueprints/ots_api/config_api.py | 44 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 opentakserver/blueprints/ots_api/config_api.py diff --git a/opentakserver/blueprints/ots_api/__init__.py b/opentakserver/blueprints/ots_api/__init__.py index e56a0be0..fd8469f9 100644 --- a/opentakserver/blueprints/ots_api/__init__.py +++ b/opentakserver/blueprints/ots_api/__init__.py @@ -22,6 +22,7 @@ from .language_api import language_api from .ldap_api import ldap_blueprint from .tak_gov_link_api import tak_gov_link_blueprint +from .config_api import config_api_blueprint ots_api = Blueprint("ots_api", __name__) ots_api.register_blueprint(api_blueprint) @@ -43,3 +44,4 @@ ots_api.register_blueprint(ldap_blueprint) ots_api.register_blueprint(tak_gov_link_blueprint) ots_api.register_blueprint(language_api) +ots_api.register_blueprint(config_api_blueprint) diff --git a/opentakserver/blueprints/ots_api/config_api.py b/opentakserver/blueprints/ots_api/config_api.py new file mode 100644 index 00000000..9f74fead --- /dev/null +++ b/opentakserver/blueprints/ots_api/config_api.py @@ -0,0 +1,44 @@ +from flask import Blueprint, jsonify, request +from flask import current_app as app +from flask_babel import gettext +from flask_security import auth_required, roles_required + +from opentakserver.blueprints.ots_api.api import change_config_setting +from opentakserver.extensions import logger + +config_api_blueprint = Blueprint("config_api_blueprint", __name__) + +CONFIG_WHITELIST = { + "OTS_MAP_DEFAULT_LAT", + "OTS_MAP_DEFAULT_LON", + "OTS_MAP_DEFAULT_ZOOM", + "OTS_MAP_DEFAULT_LAYER", +} + + +@config_api_blueprint.route("/api/config") +@auth_required() +def get_config(): + return jsonify({key: app.config.get(key) for key in CONFIG_WHITELIST}) + + +@config_api_blueprint.route("/api/config", methods=["PUT"]) +@auth_required() +@roles_required("administrator") +def update_config(): + data = request.json + if not data: + return jsonify({"success": False, "error": gettext("No data provided")}), 400 + + invalid_keys = set(data.keys()) - CONFIG_WHITELIST + if invalid_keys: + return jsonify({ + "success": False, + "error": gettext("Invalid config keys: %(keys)s", keys=", ".join(invalid_keys)) + }), 400 + + for key, value in data.items(): + change_config_setting(key, value) + app.config[key] = value + + return jsonify({"success": True})