# This file is part of Remote Support Desktop # https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.sessionservice # Copyright 2020, 2021 Jonathan Weth # Copyright 2020 Daniel Teichmann # Copyright 2020 Mike Gabriel # SPDX-License-Identifier: GPL-2.0-or-later # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the # Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import threading from typing import Callable, Optional, Union from wsgiref.simple_server import make_server import port_for from flask import Flask, abort, jsonify, request class TriggerServerThread(threading.Thread): """Simple Flask server (wrapped as thread) for triggering actions on sessions.""" def __init__(self, trigger_method: Callable[[int, dict, Optional[str]], Union[dict, bool]]): super().__init__() self.port = port_for.select_random() app = Flask(__name__) @app.route("/", methods=["POST"]) def trigger(): json = request.json token = json.get("token", "") try: session_id = int(json.get("session_id")) r = trigger_method(session_id, {"token": token}, "trigger") if r: return "Successful triggered" else: return abort(403) except (ValueError, TypeError): return abort(404) @app.route("/authenticate/", methods=["POST"]) def authenticate(): json = request.json try: session_id = int(json.get("session_id")) pin = int(json.get("pin", "")) r = trigger_method(session_id, {"pin": pin}, "authenticate") if r: return jsonify(r) else: return abort(403) except (ValueError, TypeError): return abort(404) self.srv = make_server("0.0.0.0", self.port, app) # noqa self.ctx = app.app_context() self.ctx.push() def run(self): self.srv.serve_forever() def shutdown(self): self.srv.shutdown()