| 13 | |
| 14 | |
| 15 | class UserFileStorage: |
| 16 | def __init__(self, secret) -> None: |
| 17 | self.secret = secret |
| 18 | self._autoclean_stopped = False |
| 19 | |
| 20 | def _get_user_download_folder(self, audit_name): |
| 21 | user_hashed = _hash_user(audit_name, self.secret) |
| 22 | if len(user_hashed) > 12: |
| 23 | user_hashed = user_hashed[:12] |
| 24 | return user_hashed |
| 25 | |
| 26 | def allowed_to_access(self, relative_file_path, user_id): |
| 27 | user_folder = self._get_user_download_folder(user_id) |
| 28 | |
| 29 | path_chunks = file_utils.split_all(relative_file_path) |
| 30 | |
| 31 | return path_chunks[0] == user_folder |
| 32 | |
| 33 | def prepare_new_folder(self, audit_name, parent_path): |
| 34 | millis = get_current_millis() |
| 35 | user_folder_name = self._get_user_download_folder(audit_name) |
| 36 | |
| 37 | temp_path = os.path.join(parent_path, user_folder_name, str(millis)) |
| 38 | |
| 39 | file_utils.prepare_folder(temp_path) |
| 40 | |
| 41 | return temp_path |
| 42 | |
| 43 | def start_autoclean(self, parent_folder, lifetime_ms): |
| 44 | period_sec = lifetime_ms / 1000 / 25 |
| 45 | |
| 46 | def clean_results(): |
| 47 | if self._autoclean_stopped: |
| 48 | return |
| 49 | |
| 50 | if os.path.exists(parent_folder): |
| 51 | for user_folder in os.listdir(parent_folder): |
| 52 | for timed_folder in os.listdir(os.path.join(parent_folder, user_folder)): |
| 53 | if not re.match('\d+', timed_folder): |
| 54 | continue |
| 55 | |
| 56 | millis = int(timed_folder) |
| 57 | folder_date = ms_to_datetime(millis) |
| 58 | now = date_utils.now() |
| 59 | |
| 60 | if (now - folder_date) > datetime.timedelta(milliseconds=lifetime_ms): |
| 61 | folder_path = os.path.join(parent_folder, user_folder, timed_folder) |
| 62 | |
| 63 | LOGGER.info('Cleaning old folder: ' + folder_path) |
| 64 | shutil.rmtree(folder_path) |
| 65 | |
| 66 | timer = threading.Timer(period_sec, clean_results) |
| 67 | timer.setDaemon(True) |
| 68 | timer.start() |
| 69 | |
| 70 | timer = threading.Timer(period_sec, clean_results) |
| 71 | timer.setDaemon(True) |
| 72 | timer.start() |