Skip to content

Commit

Permalink
Fleet Manager: One-Time Password cleanup (commaai#177)
Browse files Browse the repository at this point in the history
* init

* keep previous page from session
  • Loading branch information
sunnyhaibin committed Jun 8, 2023
1 parent d9c348f commit 3790c6c
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 21 deletions.
37 changes: 16 additions & 21 deletions system/fleetmanager/fleet_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,11 @@
import secrets
import system.fleetmanager.helpers as fleet
from flask import Flask, render_template, Response, request, send_from_directory, session, redirect, url_for
from functools import wraps
from system.loggerd.config import ROOT as REALDATA

app = Flask(__name__)


def login_required(f):
@wraps(f)
def decorated_route(*args, **kwargs):
if not session.get("logged_in"):
return redirect(url_for("index_page"))
return f(*args, **kwargs)
return decorated_route


@app.route("/")
def index_page():
if session.get("logged_in"):
Expand All @@ -34,20 +24,24 @@ def login():

if inputted_pin == correct_pin:
session["logged_in"] = True
return redirect(url_for("home_page"))
if "previous_page" in session:
previous_page = session["previous_page"]
session.pop("previous_page", None)
return redirect(previous_page)
else:
return redirect(url_for("home_page"))
else:
error_message = "Incorrect PIN. Please try again."
return render_template("login.html", error=error_message)


@app.route("/index")
@login_required
def home_page():
return render_template("index.html")


@app.route("/footage/full/<cameratype>/<route>")
@login_required
@fleet.login_required
def full(cameratype, route):
chunk_size = 1024 * 512 # 5KiB
file_name = cameratype + (".ts" if cameratype == "qcamera" else ".hevc")
Expand All @@ -61,7 +55,7 @@ def generate_buffered_stream():


@app.route("/footage/<cameratype>/<segment>")
@login_required
@fleet.login_required
def fcamera(cameratype, segment):
if not fleet.is_valid_segment(segment):
return render_template("error.html", error="invalid segment")
Expand All @@ -70,7 +64,7 @@ def fcamera(cameratype, segment):


@app.route("/footage/<route>")
@login_required
@fleet.login_required
def route(route):
if len(route) != 20:
return render_template("error.html", error="route not found")
Expand All @@ -90,14 +84,16 @@ def route(route):
return render_template("route.html", route=route, query_type=query_type, links=links, segments=segments, query_segment=query_segment)


@app.route("/footage/")
@app.route("/footage")
@login_required
@fleet.login_required
def footage():
return render_template("footage.html", rows=fleet.all_routes())


@app.route("/screenrecords/")
@app.route("/screenrecords")
@login_required
@fleet.login_required
def screenrecords():
rows = fleet.all_screenrecords()
if not rows:
Expand All @@ -106,26 +102,25 @@ def screenrecords():


@app.route("/screenrecords/<clip>")
@login_required
@fleet.login_required
def screenrecord(clip):
return render_template("screenrecords.html", rows=fleet.all_screenrecords(), clip=clip)


@app.route("/screenrecords/play/pipe/<file>")
@login_required
@fleet.login_required
def videoscreenrecord(file):
file_name = fleet.SCREENRECORD_PATH + file
return Response(fleet.ffplay_mp4_wrap_process_builder(file_name).stdout.read(), status=200, mimetype='video/mp4')


@app.route("/screenrecords/download/<clip>")
@login_required
@fleet.login_required
def download_file(clip):
return send_from_directory(fleet.SCREENRECORD_PATH, clip, as_attachment=True)


@app.route("/about")
@login_required
def about():
return render_template("about.html")

Expand Down
12 changes: 12 additions & 0 deletions system/fleetmanager/helpers.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import os
import subprocess
from flask import render_template, request, session
from functools import wraps
from pathlib import Path
from system.hardware import PC
from system.loggerd.config import ROOT as REALDATA
Expand All @@ -15,6 +17,16 @@
PIN_PATH = "/data/otp/"


def login_required(f):
@wraps(f)
def decorated_route(*args, **kwargs):
if not session.get("logged_in"):
session["previous_page"] = request.url
return render_template("login.html")
return f(*args, **kwargs)
return decorated_route


def all_screenrecords():
return sorted(listdir_by_creation(SCREENRECORD_PATH), reverse=True)

Expand Down

0 comments on commit 3790c6c

Please sign in to comment.