mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-12-11 09:07:18 +01:00
Fixes issues with copy2 or copystat and SELinux see #3665
This commit is contained in:
parent
4aa452ce63
commit
9f5d47c320
7 changed files with 68 additions and 17 deletions
43
src/documents/utils.py
Normal file
43
src/documents/utils.py
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
import shutil
|
||||
from os import utime
|
||||
from pathlib import Path
|
||||
from typing import Tuple
|
||||
from typing import Union
|
||||
|
||||
|
||||
def _coerce_to_path(
|
||||
source: Union[Path, str],
|
||||
dest: Union[Path, str],
|
||||
) -> Tuple[Path, Path]:
|
||||
return Path(source).resolve(), Path(dest).resolve()
|
||||
|
||||
|
||||
def copy_basic_file_stats(source: Union[Path, str], dest: Union[Path, str]) -> None:
|
||||
"""
|
||||
Copies only the m_time and a_time attributes from source to destination.
|
||||
Both are expected to exist.
|
||||
|
||||
The extended attribute copy does weird things with SELinux and files
|
||||
copied from temporary directories and copystat doesn't allow disabling
|
||||
these copies
|
||||
"""
|
||||
source, dest = _coerce_to_path(source, dest)
|
||||
src_stat = source.stat()
|
||||
utime(dest, ns=(src_stat.st_atime_ns, src_stat.st_mtime_ns))
|
||||
|
||||
|
||||
def copy_file_with_basic_stats(
|
||||
source: Union[Path, str],
|
||||
dest: Union[Path, str],
|
||||
) -> None:
|
||||
"""
|
||||
A sort of simpler copy2 that doesn't copy extended file attributes,
|
||||
only the access time and modified times from source to dest.
|
||||
|
||||
The extended attribute copy does weird things with SELinux and files
|
||||
copied from temporary directories.
|
||||
"""
|
||||
source, dest = _coerce_to_path(source, dest)
|
||||
|
||||
shutil.copy(source, dest)
|
||||
copy_basic_file_stats(source, dest)
|
||||
Loading…
Add table
Add a link
Reference in a new issue