mirror of
https://github.com/home-assistant/core.git
synced 2025-07-25 14:17:45 +00:00
File Path fixes for RPi Camera (#12338)
* Checked file path with is_allowed_path() for RPi Camera * Used cv.isfile to verify file path instead of manual checks * Changed default file path for RPiCamera to config_dir/image.jpg * Used tempfiles for storing RPi Camera images, if no other path is defined * Stopped checking for whitelisted paths on temporary files
This commit is contained in:
parent
28964806c5
commit
6500cb7915
@ -8,6 +8,7 @@ import os
|
|||||||
import subprocess
|
import subprocess
|
||||||
import logging
|
import logging
|
||||||
import shutil
|
import shutil
|
||||||
|
from tempfile import NamedTemporaryFile
|
||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
@ -36,7 +37,7 @@ DEFAULT_TIMELAPSE = 1000
|
|||||||
DEFAULT_VERTICAL_FLIP = 0
|
DEFAULT_VERTICAL_FLIP = 0
|
||||||
|
|
||||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
vol.Optional(CONF_FILE_PATH): cv.string,
|
vol.Optional(CONF_FILE_PATH): cv.isfile,
|
||||||
vol.Optional(CONF_HORIZONTAL_FLIP, default=DEFAULT_HORIZONTAL_FLIP):
|
vol.Optional(CONF_HORIZONTAL_FLIP, default=DEFAULT_HORIZONTAL_FLIP):
|
||||||
vol.All(vol.Coerce(int), vol.Range(min=0, max=1)),
|
vol.All(vol.Coerce(int), vol.Range(min=0, max=1)),
|
||||||
vol.Optional(CONF_IMAGE_HEIGHT, default=DEFAULT_IMAGE_HEIGHT):
|
vol.Optional(CONF_IMAGE_HEIGHT, default=DEFAULT_IMAGE_HEIGHT):
|
||||||
@ -77,25 +78,32 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
|||||||
CONF_TIMELAPSE: config.get(CONF_TIMELAPSE),
|
CONF_TIMELAPSE: config.get(CONF_TIMELAPSE),
|
||||||
CONF_HORIZONTAL_FLIP: config.get(CONF_HORIZONTAL_FLIP),
|
CONF_HORIZONTAL_FLIP: config.get(CONF_HORIZONTAL_FLIP),
|
||||||
CONF_VERTICAL_FLIP: config.get(CONF_VERTICAL_FLIP),
|
CONF_VERTICAL_FLIP: config.get(CONF_VERTICAL_FLIP),
|
||||||
CONF_FILE_PATH: config.get(CONF_FILE_PATH,
|
CONF_FILE_PATH: config.get(CONF_FILE_PATH)
|
||||||
os.path.join(os.path.dirname(__file__),
|
|
||||||
'image.jpg'))
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, kill_raspistill)
|
hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, kill_raspistill)
|
||||||
|
|
||||||
try:
|
file_path = setup_config[CONF_FILE_PATH]
|
||||||
# Try to create an empty file (or open existing) to ensure we have
|
|
||||||
# proper permissions.
|
|
||||||
open(setup_config[CONF_FILE_PATH], 'a').close()
|
|
||||||
|
|
||||||
add_devices([RaspberryCamera(setup_config)])
|
def delete_temp_file(*args):
|
||||||
except PermissionError:
|
"""Delete the temporary file to prevent saving multiple temp images.
|
||||||
_LOGGER.error("File path is not writable")
|
|
||||||
return False
|
Only used when no path is defined
|
||||||
except FileNotFoundError:
|
"""
|
||||||
_LOGGER.error("Could not create output file (missing directory?)")
|
os.remove(file_path)
|
||||||
|
|
||||||
|
# If no file path is defined, use a temporary file
|
||||||
|
if file_path is None:
|
||||||
|
temp_file = NamedTemporaryFile(suffix='.jpg', delete=False)
|
||||||
|
temp_file.close()
|
||||||
|
file_path = temp_file.name
|
||||||
|
setup_config[CONF_FILE_PATH] = file_path
|
||||||
|
hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, delete_temp_file)
|
||||||
|
|
||||||
|
# Check whether the file path has been whitelisted
|
||||||
|
elif not hass.config.is_allowed_path(file_path):
|
||||||
|
_LOGGER.error("'%s' is not a whitelisted directory", file_path)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user