def test_sanitize_filename(self): """Test sanitize_filename.""" assert "test" == util.sanitize_filename("test") assert "test" == util.sanitize_filename("/test") assert "test" == util.sanitize_filename("..test") assert "test" == util.sanitize_filename("\\test") assert "test" == util.sanitize_filename("\\../test")
def test_sanitize_filename(): """Test sanitize_filename.""" assert util.sanitize_filename("test") == "test" assert util.sanitize_filename("/test") == "" assert util.sanitize_filename("..test") == "" assert util.sanitize_filename("\\test") == "" assert util.sanitize_filename("\\../test") == ""
def test_sanitize_filename(self): """Test sanitize_filename.""" self.assertEqual("test", util.sanitize_filename("test")) self.assertEqual("test", util.sanitize_filename("/test")) self.assertEqual("test", util.sanitize_filename("..test")) self.assertEqual("test", util.sanitize_filename("\\test")) self.assertEqual("test", util.sanitize_filename("\\../test"))
async def _setup_micloud_entry(hass: HomeAssistant, config_entry): data: dict = config_entry.data.copy() session = async_create_clientsession(hass) cloud = MiCloud(session) if 'service_token' in data: # load devices with saved MiCloud auth cloud.auth = data devices = await cloud.get_total_devices(data['servers']) else: devices = None if devices is None: _LOGGER.debug(f"Login to MiCloud for {config_entry.title}") if await cloud.login(data['username'], data['password']): # update MiCloud auth in .storage data.update(cloud.auth) hass.config_entries.async_update_entry(config_entry, data=data) devices = await cloud.get_total_devices(data['servers']) if devices is None: _LOGGER.error("Can't load devices from MiCloud") else: _LOGGER.error("Can't login to MiCloud") # load devices from or save to .storage filename = sanitize_filename(data['username']) store = Store(hass, 1, f"{DOMAIN}/{filename}.json") if devices is None: _LOGGER.debug("Loading a list of devices from the .storage") devices = await store.async_load() else: _LOGGER.debug(f"Loaded from MiCloud {len(devices)} devices") await store.async_save(devices) if devices is None: _LOGGER.debug("No devices in .storage") return False # TODO: Think about a bunch of devices if 'devices' not in hass.data[DOMAIN]: hass.data[DOMAIN]['devices'] = devices else: hass.data[DOMAIN]['devices'] += devices default_devices = hass.data[DOMAIN]['config']['devices'] for device in devices: default_devices[device['did']] = {'device_name': device['name']} return True
def download_file(event): """ Downloads file specified in the url. """ try: req = requests.get(event.data['url'], stream=True) if req.status_code == 200: filename = None if 'content-disposition' in req.headers: match = re.findall(r"filename=(\S+)", req.headers['content-disposition']) if len(match) > 0: filename = match[0].strip("'\" ") if not filename: filename = os.path.basename(event.data['url']).strip() if not filename: filename = "ha_download" # Remove stuff to ruin paths filename = util.sanitize_filename(filename) path, ext = os.path.splitext(os.path.join(download_path, filename)) # If file exist append a number. We test filename, filename_2.. tries = 0 while True: tries += 1 name_suffix = "" if tries == 1 else "_{}".format(tries) final_path = path + name_suffix + ext if not os.path.isfile(final_path): break logger.info("FileDownloader:{} -> {}".format( event.data['url'], final_path)) with open(final_path, 'wb') as fil: for chunk in req.iter_content(1024): fil.write(chunk) except requests.exceptions.ConnectionError: logger.exception("FileDownloader:ConnectionError occured for {}". format(event.data['url']))
def _handle_get_static(self, path_match, data): """ Returns a static file. """ req_file = util.sanitize_filename(path_match.group('file')) path = os.path.join(os.path.dirname(__file__), 'www_static', req_file) if os.path.isfile(path): self.send_response(HTTP_OK) # TODO: correct header for mime-type and caching self.end_headers() with open(path, 'rb') as inp: data = inp.read(1024) while data: self.wfile.write(data) data = inp.read(1024) else: self.send_response(HTTP_NOT_FOUND) self.end_headers()
def do_download(): """Download the file.""" try: url = service.data[ATTR_URL] subdir = service.data.get(ATTR_SUBDIR) filename = service.data.get(ATTR_FILENAME) overwrite = service.data.get(ATTR_OVERWRITE) if subdir: subdir = sanitize_filename(subdir) final_path = None req = requests.get(url, stream=True, timeout=10) if req.status_code != 200: _LOGGER.warning( "downloading '%s' failed, status_code=%d", url, req.status_code ) hass.bus.fire( f"{DOMAIN}_{DOWNLOAD_FAILED_EVENT}", {"url": url, "filename": filename}, ) else: if filename is None and "content-disposition" in req.headers: match = re.findall( r"filename=(\S+)", req.headers["content-disposition"] ) if match: filename = match[0].strip("'\" ") if not filename: filename = os.path.basename(url).strip() if not filename: filename = "ha_download" # Remove stuff to ruin paths filename = sanitize_filename(filename) # Do we want to download to subdir, create if needed if subdir: subdir_path = os.path.join(download_path, subdir) # Ensure subdir exist if not os.path.isdir(subdir_path): os.makedirs(subdir_path) final_path = os.path.join(subdir_path, filename) else: final_path = os.path.join(download_path, filename) path, ext = os.path.splitext(final_path) # If file exist append a number. # We test filename, filename_2.. if not overwrite: tries = 1 final_path = path + ext while os.path.isfile(final_path): tries += 1 final_path = f"{path}_{tries}.{ext}" _LOGGER.debug("%s -> %s", url, final_path) with open(final_path, "wb") as fil: for chunk in req.iter_content(1024): fil.write(chunk) _LOGGER.debug("Downloading of %s done", url) hass.bus.fire( f"{DOMAIN}_{DOWNLOAD_COMPLETED_EVENT}", {"url": url, "filename": filename}, ) except requests.exceptions.ConnectionError: _LOGGER.exception("ConnectionError occurred for %s", url) hass.bus.fire( f"{DOMAIN}_{DOWNLOAD_FAILED_EVENT}", {"url": url, "filename": filename}, ) # Remove file if we started downloading but failed if final_path and os.path.isfile(final_path): os.remove(final_path)
def execute_script(hass, name, data=None): """Execute a script.""" filename = '{}.py'.format(name) with open(hass.config.path(FOLDER, sanitize_filename(filename))) as fil: source = fil.read() execute(hass, filename, source, data)
def do_download(): """Download the file.""" try: url = service.data[ATTR_URL] subdir = service.data.get(ATTR_SUBDIR) if subdir: subdir = sanitize_filename(subdir) final_path = None req = requests.get(url, stream=True, timeout=10) if req.status_code == 200: filename = None if 'content-disposition' in req.headers: match = re.findall(r"filename=(\S+)", req.headers['content-disposition']) if len(match) > 0: filename = match[0].strip("'\" ") if not filename: filename = os.path.basename( url).strip() if not filename: filename = "ha_download" # Remove stuff to ruin paths filename = sanitize_filename(filename) # Do we want to download to subdir, create if needed if subdir: subdir_path = os.path.join(download_path, subdir) # Ensure subdir exist if not os.path.isdir(subdir_path): os.makedirs(subdir_path) final_path = os.path.join(subdir_path, filename) else: final_path = os.path.join(download_path, filename) path, ext = os.path.splitext(final_path) # If file exist append a number. # We test filename, filename_2.. tries = 1 final_path = path + ext while os.path.isfile(final_path): tries += 1 final_path = "{}_{}.{}".format(path, tries, ext) logger.info("%s -> %s", url, final_path) with open(final_path, 'wb') as fil: for chunk in req.iter_content(1024): fil.write(chunk) logger.info("Downloading of %s done", url) except requests.exceptions.ConnectionError: logger.exception("ConnectionError occured for %s", url) # Remove file if we started downloading but failed if final_path and os.path.isfile(final_path): os.remove(final_path)
def do_download(): """ Downloads the file. """ try: url = service.data[ATTR_URL] subdir = service.data.get(ATTR_SUBDIR) if subdir: subdir = sanitize_filename(subdir) final_path = None req = requests.get(url, stream=True, timeout=10) if req.status_code == 200: filename = None if 'content-disposition' in req.headers: match = re.findall(r"filename=(\S+)", req.headers['content-disposition']) if len(match) > 0: filename = match[0].strip("'\" ") if not filename: filename = os.path.basename( url).strip() if not filename: filename = "ha_download" # Remove stuff to ruin paths filename = sanitize_filename(filename) # Do we want to download to subdir, create if needed if subdir: subdir_path = os.path.join(download_path, subdir) # Ensure subdir exist if not os.path.isdir(subdir_path): os.makedirs(subdir_path) final_path = os.path.join(subdir_path, filename) else: final_path = os.path.join(download_path, filename) path, ext = os.path.splitext(final_path) # If file exist append a number. # We test filename, filename_2.. tries = 1 final_path = path + ext while os.path.isfile(final_path): tries += 1 final_path = "{}_{}.{}".format(path, tries, ext) logger.info("%s -> %s", url, final_path) with open(final_path, 'wb') as fil: for chunk in req.iter_content(1024): fil.write(chunk) logger.info("Downloading of %s done", url) except requests.exceptions.ConnectionError: logger.exception("ConnectionError occured for %s", url) # Remove file if we started downloading but failed if final_path and os.path.isfile(final_path): os.remove(final_path)
def execute_script_x(hass, name, data=None): """Execute a script.""" filename = f"{name}.py" with open(hass.config.path(FOLDER, sanitize_filename(filename))) as fil: source = fil.read() execute_x(hass, filename, source, data)
def do_download(): """Download the file.""" try: url = service.data[ATTR_URL] subdir = service.data.get(ATTR_SUBDIR) filename = service.data.get(ATTR_FILENAME) overwrite = service.data.get(ATTR_OVERWRITE) if subdir: subdir = sanitize_filename(subdir) final_path = None req = requests.get(url, stream=True, timeout=10) if req.status_code != 200: _LOGGER.warning( "downloading '%s' failed, status_code=%d", url, req.status_code) else: if filename is None and \ 'content-disposition' in req.headers: match = re.findall(r"filename=(\S+)", req.headers['content-disposition']) if match: filename = match[0].strip("'\" ") if not filename: filename = os.path.basename(url).strip() if not filename: filename = 'ha_download' # Remove stuff to ruin paths filename = sanitize_filename(filename) # Do we want to download to subdir, create if needed if subdir: subdir_path = os.path.join(download_path, subdir) # Ensure subdir exist if not os.path.isdir(subdir_path): os.makedirs(subdir_path) final_path = os.path.join(subdir_path, filename) else: final_path = os.path.join(download_path, filename) path, ext = os.path.splitext(final_path) # If file exist append a number. # We test filename, filename_2.. if not overwrite: tries = 1 final_path = path + ext while os.path.isfile(final_path): tries += 1 final_path = "{}_{}.{}".format(path, tries, ext) _LOGGER.debug("%s -> %s", url, final_path) with open(final_path, 'wb') as fil: for chunk in req.iter_content(1024): fil.write(chunk) _LOGGER.debug("Downloading of %s done", url) hass.bus.fire( "{}_{}".format(DOMAIN, DOWNLOAD_COMPLETED_EVENT), { 'url': url, 'filename': filename }) except requests.exceptions.ConnectionError: _LOGGER.exception("ConnectionError occurred for %s", url) hass.bus.fire( "{}_{}".format(DOMAIN, DOWNLOAD_FAILED_EVENT), { 'url': url, 'filename': filename }) # Remove file if we started downloading but failed if final_path and os.path.isfile(final_path): os.remove(final_path)
def do_download(): """Download the file.""" try: url = service.data[ATTR_URL] subdir = service.data.get(ATTR_SUBDIR) if subdir: subdir = sanitize_filename(subdir) final_path = None req = requests.get(url, stream=True, timeout=10) if req.status_code == 200: filename = service.data[ATTR_FILENAME] delfilepath = '/home/homeassistant/.homeassistant/downloads/'+filename if os.path.isfile(delfilepath): os.remove(delfilepath) # Do we want to download to subdir, create if needed if subdir: subdir_path = os.path.join(download_path, subdir) # Ensure subdir exist if not os.path.isdir(subdir_path): os.makedirs(subdir_path) final_path = os.path.join(subdir_path, filename) else: final_path = os.path.join(download_path, filename) path, ext = os.path.splitext(final_path) # If file exist append a number. # We test filename, filename_2.. tries = 1 final_path = path + ext while os.path.isfile(final_path): tries += 1 final_path = "{}_{}.{}".format(path, tries, ext) _LOGGER.info("%s -> %s", url, final_path) with open(final_path, 'wb') as fil: for chunk in req.iter_content(1024): fil.write(chunk) _LOGGER.info("Downloading of %s done", url) except requests.exceptions.ConnectionError: _LOGGER.exception("ConnectionError occured for %s", url) # Remove file if we started downloading but failed if final_path and os.path.isfile(final_path): os.remove(final_path)