mirror of
https://github.com/scottlamb/moonfire-nvr.git
synced 2024-12-26 23:25:55 -05:00
422cd2a75e
Some caveats: * it doesn't record the peer IP yet, which makes it harder to verify sessions are valid. This is a little annoying to do in hyper now (see hyperium/hyper#1410). The direct peer might not be what we want right now anyway because there's no TLS support yet (see #27). In the meantime, the sane way to expose Moonfire NVR to the Internet is via a proxy server, and recording the proxy's IP is not useful. Maybe better to interpret a RFC 7239 Forwarded header (and/or the older X-Forwarded-{For,Proto} headers). * it doesn't ever use Secure (https-only) cookies, for a similar reason. It's not safe to use even with a tls proxy until this is fixed. * there's no "moonfire-nvr config" support for inspecting/invalidating sessions yet. * in debug builds, logging in is crazy slow. See libpasta/libpasta#9. Some notes: * I removed the Javascript "no-use-before-defined" lint, as some of the functions form a cycle. * Fixed #20 along the way. I needed to add support for properly returning non-OK HTTP statuses to signal unauthorized and such. * I removed the Access-Control-Allow-Origin header support, which was at odds with the "SameSite=lax" in the cookie header. The "yarn start" method for running a local proxy server accomplishes the same thing as the Access-Control-Allow-Origin support in a more secure manner.
101 lines
4.1 KiB
HTML
101 lines
4.1 KiB
HTML
<!DOCTYPE html>
|
|
<!-- vim: set et: -->
|
|
<html lang="en">
|
|
<head>
|
|
<title>Moonfire NVR</title>
|
|
</head>
|
|
<body>
|
|
<div id="session">
|
|
</div>
|
|
<div id="nav">
|
|
<form action="#">
|
|
<fieldset>
|
|
<legend>Streams</legend>
|
|
<table id="streams"></table>
|
|
</fieldset>
|
|
<fieldset id="datetime">
|
|
<legend>Date & Time Range</legend>
|
|
<div id="from">
|
|
<div id="start-date"></div>
|
|
<div id="st">
|
|
<label for="start-time">Time:</label>
|
|
<input id="start-time" name="start-time" type="text" title="Starting
|
|
time within the day. Blank for the beginning of the day. Otherwise
|
|
HH:mm[:ss[:FFFFF]][+-HH:mm], where F is 90,000ths of a second.
|
|
Timezone is normally left out; it's useful once a year during the
|
|
ambiguous times of the "fall back" hour."></div>
|
|
</div>
|
|
<div id="range">Range:
|
|
<input type="radio" name="end-date-type" id="end-date-same" checked>
|
|
<label for="end-date-same">Single Day</label>
|
|
<input type="radio" name="end-date-type" id="end-date-other">
|
|
<label for="end-date-other">Multi Day</label><br/>
|
|
</div>
|
|
<div id="to">
|
|
<div id="end-date"></div>
|
|
<label for="start-time">Time:</label>
|
|
<input id="end-time" name="end-time" type="text" title="Ending
|
|
time within the day. Blank for the end of the day. Otherwise
|
|
HH:mm[:ss[:FFFFF]][+-HH:mm], where F is 90,000ths of a second.
|
|
Timezone is normally left out; it's useful once a year during the
|
|
ambiguous times of the "fall back" hour.">
|
|
</div>
|
|
</fieldset>
|
|
<fieldset>
|
|
<legend>Recordings Display</legend>
|
|
<label for="split">Max Video Duration:</label>
|
|
<select name="split" id="split">
|
|
<option value="324000000">1 hour</option>
|
|
<option value="1296000000">4 hours</option>
|
|
<option value="7776000000">24 hours</option>
|
|
<option value="infinite">infinite</option>
|
|
</select><br>
|
|
<input type="checkbox" checked id="trim" name="trim">
|
|
<label for="trim">Trim Segment Start & End</label><br>
|
|
<input type="checkbox" checked id="ts" name="ts">
|
|
<label for="ts">Timestamp Track</label><br>
|
|
<label for="timefmt">Time Format:</label>
|
|
<select name="timefmt" id="timefmt">
|
|
<option value="MM/DD/YY hh:mm A">US-short</option>
|
|
<option value="MM/DD/YYYY hh:mm:ss A">US</option>
|
|
<option value="MM/DD/YY HH:mm" selected>Military-short</option>
|
|
<option value="MM/DD/YYYY HH:mm:ss">Military</option>
|
|
<option value="DD.MM.YY HH:mm">EU-short</option>
|
|
<option value="DD-MM-YYYY HH:mm:ss">EU</option>
|
|
<option value="YY-MM-DD hh:mm A">ISO-short (12h)</option>
|
|
<option value="YY-MM-DD HH:mm">ISO-short (24h)</option>
|
|
<option value="YYYY-MM-DD hh:mm:ss A">ISO (12h)</option>
|
|
<option value="YYYY-MM-DD HH:mm:ss">ISO (24h)</option>
|
|
<option value="YYYY-MM-DD HH:mm:ss">ISO 8601-like (No TZ)</option>
|
|
<option value="YYYY-MM-DDTHH:mm:ss">ISO 8601 (No TZ)</option>
|
|
<option value="YYYY-MM-DDTHH:mm:ssZ">ISO 8601</option>
|
|
<option value="YYYY-MM-DDTHH:mm:ss:FFFFFZ">Internal</option>
|
|
</select>
|
|
</fieldset>
|
|
</form>
|
|
</div>
|
|
<table id="videos"></table>
|
|
<div id="login">
|
|
<form>
|
|
<fieldset>
|
|
<table>
|
|
<tr>
|
|
<td><label for="login-username">Username:</label></td>
|
|
<td><input type="text" id="login-username" name="username"></td>
|
|
</tr>
|
|
<tr>
|
|
<td><label for="login-password">Password:</label></td>
|
|
<td><input type="password" id="login-password" name="password"></td>
|
|
</tr>
|
|
<tr>
|
|
<td></td>
|
|
<td><input type="submit" tabindex="-1" style="position:absolute; top:-1000px"></td>
|
|
</tr>
|
|
</table>
|
|
<p id="login-error"></p>
|
|
</fieldset>
|
|
</form>
|
|
</div>
|
|
</body>
|
|
</html>
|