Add camera presets snapshots and continuous recording playback

This commit is contained in:
Codex
2026-10-04 08:33:00 +08:00
parent 14f722fa69
commit 68be32e269
15 changed files with 513 additions and 43 deletions
+28 -1
View File
@@ -59,6 +59,33 @@ class WebTests(unittest.TestCase):
with self.subTest(path=path):
self.assertEqual(self.request(path, False)[0], 401)
def test_presets_api_enforces_control_and_management_roles(self):
camera = dict(id='f'*16, name='Preset test', siteId='preset-site', enabled=True)
app.save_object('sites', dict(id='preset-site', name='Preset site'))
app.save_object('cameras', camera)
viewer = app.ACCOUNTS.save(dict(username='preset-viewer', password='test-password', siteIds=['preset-site'], ptzControl=True), self.admin)
token = '2'*64
with app.LOCK:
app.DB.execute('INSERT INTO sessions VALUES (?,?,?)', (hashlib.sha256(token.encode()).hexdigest(), time.time()+3600, viewer['id']))
app.DB.commit()
path='/api/ptz/presets'
payload=dict(camera=camera['id'],action='goto',token='1',revision='v1')
with patch.object(app.ptz.CONTROLLER,'read_presets',return_value=({'items':[]},{})),patch.object(app.ptz.CONTROLLER,'preset_command',return_value={'ok':True}) as command:
self.assertEqual(self.request(path+'?camera='+camera['id'],False)[0],401)
code,_,body=self.request(path+'?camera='+camera['id'],token=token)
self.assertEqual(code,200);self.assertFalse(json.loads(body)['canManage'])
self.assertEqual(self.request(path,data=payload,token=token)[0],200)
for action in ['create','replace','remove']:
self.assertEqual(self.request(path,data=dict(payload,action=action),token=token)[0],403)
self.assertEqual(command.call_count,1)
self.assertEqual(self.request(path,data=dict(payload,action='create'))[0],200)
self.assertEqual(self.request(path,data=payload,origin='https://other.example')[0],403)
app.ACCOUNTS.save(dict(viewer,ptzControl=False),self.admin)
with app.LOCK:
app.DB.execute('INSERT INTO sessions VALUES (?,?,?)', (hashlib.sha256(token.encode()).hexdigest(), time.time()+3600, viewer['id']))
app.DB.commit()
self.assertEqual(self.request(path+'?camera='+camera['id'],token=token)[0],403)
def test_static_security_headers(self):
code, headers, _ = self.request('/', False)
self.assertEqual(code, 200)
@@ -78,7 +105,7 @@ class WebTests(unittest.TestCase):
self.assertEqual(headers['Cache-Control'], 'no-store')
self.assertNotIn(b'__ASSET_VERSION__', body)
assets = re.findall(r'(?:src|href)="(/[^"?]+\.(?:js|css)\?v=[^"]+)"', body.decode())
self.assertEqual(len(assets), 15)
self.assertEqual(len(assets), 18)
version = (app.ROOT / 'VERSION').read_text().strip()
for asset in assets:
self.assertTrue(asset.endswith('?v=' + version))