sql: test read-write permissions for given path and raise early
maybe fix #6485
This commit is contained in:
@@ -6,6 +6,7 @@ import asyncio
|
|||||||
import sqlite3
|
import sqlite3
|
||||||
|
|
||||||
from .logging import Logger
|
from .logging import Logger
|
||||||
|
from .util import test_read_write_permissions
|
||||||
|
|
||||||
|
|
||||||
def sql(func):
|
def sql(func):
|
||||||
@@ -17,12 +18,14 @@ def sql(func):
|
|||||||
return f
|
return f
|
||||||
return wrapper
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
class SqlDB(Logger):
|
class SqlDB(Logger):
|
||||||
|
|
||||||
def __init__(self, asyncio_loop, path, commit_interval=None):
|
def __init__(self, asyncio_loop, path, commit_interval=None):
|
||||||
Logger.__init__(self)
|
Logger.__init__(self)
|
||||||
self.asyncio_loop = asyncio_loop
|
self.asyncio_loop = asyncio_loop
|
||||||
self.path = path
|
self.path = path
|
||||||
|
test_read_write_permissions(path)
|
||||||
self.commit_interval = commit_interval
|
self.commit_interval = commit_interval
|
||||||
self.db_requests = queue.Queue()
|
self.db_requests = queue.Queue()
|
||||||
self.sql_thread = threading.Thread(target=self.run_sql)
|
self.sql_thread = threading.Thread(target=self.run_sql)
|
||||||
|
|||||||
@@ -31,7 +31,8 @@ import zlib
|
|||||||
from enum import IntEnum
|
from enum import IntEnum
|
||||||
|
|
||||||
from . import ecc
|
from . import ecc
|
||||||
from .util import profiler, InvalidPassword, WalletFileException, bfh, standardize_path
|
from .util import (profiler, InvalidPassword, WalletFileException, bfh, standardize_path,
|
||||||
|
test_read_write_permissions)
|
||||||
|
|
||||||
from .wallet_db import WalletDB
|
from .wallet_db import WalletDB
|
||||||
from .logging import Logger
|
from .logging import Logger
|
||||||
@@ -62,7 +63,10 @@ class WalletStorage(Logger):
|
|||||||
self.logger.info(f"wallet path {self.path}")
|
self.logger.info(f"wallet path {self.path}")
|
||||||
self.pubkey = None
|
self.pubkey = None
|
||||||
self.decrypted = ''
|
self.decrypted = ''
|
||||||
self._test_read_write_permissions(self.path)
|
try:
|
||||||
|
test_read_write_permissions(self.path)
|
||||||
|
except IOError as e:
|
||||||
|
raise StorageReadWriteError(e) from e
|
||||||
if self.file_exists():
|
if self.file_exists():
|
||||||
with open(self.path, "r", encoding='utf-8') as f:
|
with open(self.path, "r", encoding='utf-8') as f:
|
||||||
self.raw = f.read()
|
self.raw = f.read()
|
||||||
@@ -74,28 +78,6 @@ class WalletStorage(Logger):
|
|||||||
def read(self):
|
def read(self):
|
||||||
return self.decrypted if self.is_encrypted() else self.raw
|
return self.decrypted if self.is_encrypted() else self.raw
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _test_read_write_permissions(cls, path):
|
|
||||||
# note: There might already be a file at 'path'.
|
|
||||||
# Make sure we do NOT overwrite/corrupt that!
|
|
||||||
temp_path = "%s.tmptest.%s" % (path, os.getpid())
|
|
||||||
echo = "fs r/w test"
|
|
||||||
try:
|
|
||||||
# test READ permissions for actual path
|
|
||||||
if os.path.exists(path):
|
|
||||||
with open(path, "r", encoding='utf-8') as f:
|
|
||||||
f.read(1) # read 1 byte
|
|
||||||
# test R/W sanity for "similar" path
|
|
||||||
with open(temp_path, "w", encoding='utf-8') as f:
|
|
||||||
f.write(echo)
|
|
||||||
with open(temp_path, "r", encoding='utf-8') as f:
|
|
||||||
echo2 = f.read()
|
|
||||||
os.remove(temp_path)
|
|
||||||
except Exception as e:
|
|
||||||
raise StorageReadWriteError(e) from e
|
|
||||||
if echo != echo2:
|
|
||||||
raise StorageReadWriteError('echo sanity-check failed')
|
|
||||||
|
|
||||||
@profiler
|
@profiler
|
||||||
def write(self, data):
|
def write(self, data):
|
||||||
s = self.encrypt_before_writing(data)
|
s = self.encrypt_before_writing(data)
|
||||||
|
|||||||
@@ -1465,3 +1465,25 @@ def random_shuffled_copy(x: Iterable[T]) -> List[T]:
|
|||||||
x_copy = list(x) # copy
|
x_copy = list(x) # copy
|
||||||
random.shuffle(x_copy) # shuffle in-place
|
random.shuffle(x_copy) # shuffle in-place
|
||||||
return x_copy
|
return x_copy
|
||||||
|
|
||||||
|
|
||||||
|
def test_read_write_permissions(path) -> None:
|
||||||
|
# note: There might already be a file at 'path'.
|
||||||
|
# Make sure we do NOT overwrite/corrupt that!
|
||||||
|
temp_path = "%s.tmptest.%s" % (path, os.getpid())
|
||||||
|
echo = "fs r/w test"
|
||||||
|
try:
|
||||||
|
# test READ permissions for actual path
|
||||||
|
if os.path.exists(path):
|
||||||
|
with open(path, "rb") as f:
|
||||||
|
f.read(1) # read 1 byte
|
||||||
|
# test R/W sanity for "similar" path
|
||||||
|
with open(temp_path, "w", encoding='utf-8') as f:
|
||||||
|
f.write(echo)
|
||||||
|
with open(temp_path, "r", encoding='utf-8') as f:
|
||||||
|
echo2 = f.read()
|
||||||
|
os.remove(temp_path)
|
||||||
|
except Exception as e:
|
||||||
|
raise IOError(e) from e
|
||||||
|
if echo != echo2:
|
||||||
|
raise IOError('echo sanity-check failed')
|
||||||
|
|||||||
Reference in New Issue
Block a user