new: pwngrid web client

This commit is contained in:
Simone Margaritelli
2019-11-12 20:18:02 +01:00
parent e2be21004d
commit df01a03a4b
8 changed files with 624 additions and 1 deletions

View File

@@ -1,5 +1,6 @@
import logging
import os
import base64
import _thread
# https://stackoverflow.com/questions/14888799/disable-console-messages-in-flask-server
@@ -7,12 +8,15 @@ logging.getLogger('werkzeug').setLevel(logging.ERROR)
os.environ['WERKZEUG_RUN_MAIN'] = 'true'
import pwnagotchi
import pwnagotchi.grid as grid
import pwnagotchi.ui.web as web
from pwnagotchi import plugins
from flask import send_file
from flask import request
from flask import jsonify
from flask import abort
from flask import redirect
from flask import render_template, render_template_string
@@ -24,6 +28,15 @@ class Handler:
self._app.add_url_rule('/ui', 'ui', self.ui)
self._app.add_url_rule('/shutdown', 'shutdown', self.shutdown, methods=['POST'])
self._app.add_url_rule('/restart', 'restart', self.restart, methods=['POST'])
# inbox
self._app.add_url_rule('/inbox', 'inbox', self.inbox)
self._app.add_url_rule('/inbox/profile', 'inbox_profile', self.inbox_profile)
self._app.add_url_rule('/inbox/<id>', 'show_message', self.show_message)
self._app.add_url_rule('/inbox/<id>/<mark>', 'mark_message', self.mark_message)
self._app.add_url_rule('/inbox/new', 'new_message', self.new_message)
self._app.add_url_rule('/inbox/send', 'send_message', self.send_message, methods=['POST'])
# plugins
self._app.add_url_rule('/plugins', 'plugins', self.plugins, strict_slashes=False,
defaults={'name': None, 'subpath': None})
@@ -37,6 +50,81 @@ class Handler:
other_mode='AUTO' if self._agent.mode == 'manual' else 'MANU',
fingerprint=self._agent.fingerprint())
def inbox(self):
page = request.args.get("p", default=1, type=int)
inbox = {
"pages": 1,
"records": 0,
"messages": []
}
error = None
try:
inbox = grid.inbox(page, with_pager=True)
except Exception as e:
logging.exception('error while reading pwnmail inbox')
error = str(e)
return render_template('inbox.html',
name=pwnagotchi.name(),
page=page,
error=error,
inbox=inbox)
def inbox_profile(self):
data = {}
error = None
try:
data = grid.get_advertisement_data()
except Exception as e:
logging.exception('error while reading pwngrid data')
error = str(e)
return render_template('profile.html',
name=pwnagotchi.name(),
fingerprint=self._agent.fingerprint(),
data=data,
error=error)
def show_message(self, id):
message = {}
error = None
try:
message = grid.inbox_message(id)
if message['data']:
message['data'] = base64.b64decode(message['data']).decode("utf-8")
except Exception as e:
logging.exception('error while reading pwnmail message %d' % int(id))
error = str(e)
return render_template('message.html',
name=pwnagotchi.name(),
error=error,
message=message)
def new_message(self):
to = request.args.get("to", default="")
return render_template('new_message.html', to=to)
def send_message(self):
to = request.form["to"]
message = request.form["message"]
error = None
try:
grid.send_message(to, message)
except Exception as e:
error = str(e)
return jsonify({"error": error})
def mark_message(self, id, mark):
logging.info("marking message %d as %s" % (int(id), mark))
grid.mark_message(id, mark)
return redirect("/inbox")
def plugins(self, name, subpath):
if name is None:
# show plugins overview