mirror of
https://github.com/blakeblackshear/frigate.git
synced 2024-11-26 19:06:11 +01:00
1133202cbd
* reload the window on 401 * backend apis for auth * add login page * re-enable web linter * fix login page routing * bypass csrf for internal auth endpoint * disable healthcheck in devcontainer target * include login page in vite build * redirect to login page on 401 * implement config for users and settings * implement JWT actual secret * add brute force protection on login * add support for redirecting from auth failures on api calls * return location for redirect * default cookie name should pass regex test * set hash iterations to current OWASP recommendation * move users to database instead of config * config option to reset admin password on startup * user management UI * check for deleted user on refresh * validate username and fixes * remove password constraint * cleanup * fix user check on refresh * web fixes * implement auth via new external port * use x-forwarded-for to rate limit login attempts by ip * implement logout and profile * fixes * lint fixes * add support for user passthru from upstream proxies * add support for specifying a logout url * add documentation * Update docs/docs/configuration/authentication.md Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com> * Update docs/docs/configuration/authentication.md Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com> --------- Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>
121 lines
4.2 KiB
Python
121 lines
4.2 KiB
Python
from peewee import (
|
|
BooleanField,
|
|
CharField,
|
|
DateTimeField,
|
|
FloatField,
|
|
IntegerField,
|
|
Model,
|
|
TextField,
|
|
)
|
|
from playhouse.sqlite_ext import JSONField
|
|
|
|
|
|
class Event(Model): # type: ignore[misc]
|
|
id = CharField(null=False, primary_key=True, max_length=30)
|
|
label = CharField(index=True, max_length=20)
|
|
sub_label = CharField(max_length=100, null=True)
|
|
camera = CharField(index=True, max_length=20)
|
|
start_time = DateTimeField()
|
|
end_time = DateTimeField()
|
|
top_score = (
|
|
FloatField()
|
|
) # TODO remove when columns can be dropped without rebuilding table
|
|
score = (
|
|
FloatField()
|
|
) # TODO remove when columns can be dropped without rebuilding table
|
|
false_positive = BooleanField()
|
|
zones = JSONField()
|
|
thumbnail = TextField()
|
|
has_clip = BooleanField(default=True)
|
|
has_snapshot = BooleanField(default=True)
|
|
region = (
|
|
JSONField()
|
|
) # TODO remove when columns can be dropped without rebuilding table
|
|
box = (
|
|
JSONField()
|
|
) # TODO remove when columns can be dropped without rebuilding table
|
|
area = (
|
|
IntegerField()
|
|
) # TODO remove when columns can be dropped without rebuilding table
|
|
retain_indefinitely = BooleanField(default=False)
|
|
ratio = FloatField(
|
|
default=1.0
|
|
) # TODO remove when columns can be dropped without rebuilding table
|
|
plus_id = CharField(max_length=30)
|
|
model_hash = CharField(max_length=32)
|
|
detector_type = CharField(max_length=32)
|
|
model_type = CharField(max_length=32)
|
|
data = JSONField() # ex: tracked object box, region, etc.
|
|
|
|
|
|
class Timeline(Model): # type: ignore[misc]
|
|
timestamp = DateTimeField()
|
|
camera = CharField(index=True, max_length=20)
|
|
source = CharField(index=True, max_length=20) # ex: tracked object, audio, external
|
|
source_id = CharField(index=True, max_length=30)
|
|
class_type = CharField(max_length=50) # ex: entered_zone, audio_heard
|
|
data = JSONField() # ex: tracked object id, region, box, etc.
|
|
|
|
|
|
class Regions(Model): # type: ignore[misc]
|
|
camera = CharField(null=False, primary_key=True, max_length=20)
|
|
grid = JSONField() # json blob of grid
|
|
last_update = DateTimeField()
|
|
|
|
|
|
class Recordings(Model): # type: ignore[misc]
|
|
id = CharField(null=False, primary_key=True, max_length=30)
|
|
camera = CharField(index=True, max_length=20)
|
|
path = CharField(unique=True)
|
|
start_time = DateTimeField()
|
|
end_time = DateTimeField()
|
|
duration = FloatField()
|
|
motion = IntegerField(null=True)
|
|
objects = IntegerField(null=True)
|
|
dBFS = IntegerField(null=True)
|
|
segment_size = FloatField(default=0) # this should be stored as MB
|
|
regions = IntegerField(null=True)
|
|
|
|
|
|
class Export(Model): # type: ignore[misc]
|
|
id = CharField(null=False, primary_key=True, max_length=30)
|
|
camera = CharField(index=True, max_length=20)
|
|
name = CharField(index=True, max_length=100)
|
|
date = DateTimeField()
|
|
video_path = CharField(unique=True)
|
|
thumb_path = CharField(unique=True)
|
|
in_progress = BooleanField()
|
|
|
|
|
|
class ReviewSegment(Model): # type: ignore[misc]
|
|
id = CharField(null=False, primary_key=True, max_length=30)
|
|
camera = CharField(index=True, max_length=20)
|
|
start_time = DateTimeField()
|
|
end_time = DateTimeField()
|
|
has_been_reviewed = BooleanField(default=False)
|
|
severity = CharField(max_length=30) # alert, detection, significant_motion
|
|
thumb_path = CharField(unique=True)
|
|
data = JSONField() # additional data about detection like list of labels, zone, areas of significant motion
|
|
|
|
|
|
class Previews(Model): # type: ignore[misc]
|
|
id = CharField(null=False, primary_key=True, max_length=30)
|
|
camera = CharField(index=True, max_length=20)
|
|
path = CharField(unique=True)
|
|
start_time = DateTimeField()
|
|
end_time = DateTimeField()
|
|
duration = FloatField()
|
|
|
|
|
|
# Used for temporary table in record/cleanup.py
|
|
class RecordingsToDelete(Model): # type: ignore[misc]
|
|
id = CharField(null=False, primary_key=False, max_length=30)
|
|
|
|
class Meta:
|
|
temporary = True
|
|
|
|
|
|
class User(Model): # type: ignore[misc]
|
|
username = CharField(null=False, primary_key=True, max_length=30)
|
|
password_hash = CharField(null=False, max_length=120)
|