mirror of
https://github.com/apache/superset.git
synced 2026-04-23 18:14:56 +00:00
fix: improve upload ZIP file validation (#25658)
This commit is contained in:
committed by
GitHub
parent
cb963585ad
commit
f473d13d0d
@@ -15,13 +15,17 @@
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
import os
|
||||
from dataclasses import dataclass
|
||||
from typing import Any, Optional
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
import pandas as pd
|
||||
import pytest
|
||||
|
||||
from superset.exceptions import SupersetException
|
||||
from superset.utils.core import (
|
||||
cast_to_boolean,
|
||||
check_is_safe_zip,
|
||||
DateColumn,
|
||||
is_test,
|
||||
normalize_dttm_col,
|
||||
@@ -44,6 +48,12 @@ EXTRA_FILTER: QueryObjectFilterClause = {
|
||||
}
|
||||
|
||||
|
||||
@dataclass
|
||||
class MockZipInfo:
|
||||
file_size: int
|
||||
compress_size: int
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"original,expected",
|
||||
[
|
||||
@@ -201,3 +211,50 @@ def test_normalize_dttm_col() -> None:
|
||||
normalize_dttm_col(df, dttm_cols)
|
||||
|
||||
assert df["__time"].astype(str).tolist() == ["2017-07-01"]
|
||||
|
||||
|
||||
def test_check_if_safe_zip_success(app_context: None) -> None:
|
||||
"""
|
||||
Test if ZIP files are safe
|
||||
"""
|
||||
ZipFile = MagicMock()
|
||||
ZipFile.infolist.return_value = [
|
||||
MockZipInfo(file_size=1000, compress_size=10),
|
||||
MockZipInfo(file_size=1000, compress_size=10),
|
||||
MockZipInfo(file_size=1000, compress_size=10),
|
||||
MockZipInfo(file_size=1000, compress_size=10),
|
||||
MockZipInfo(file_size=1000, compress_size=10),
|
||||
]
|
||||
check_is_safe_zip(ZipFile)
|
||||
|
||||
|
||||
def test_check_if_safe_zip_high_rate(app_context: None) -> None:
|
||||
"""
|
||||
Test if ZIP files is not highly compressed
|
||||
"""
|
||||
ZipFile = MagicMock()
|
||||
ZipFile.infolist.return_value = [
|
||||
MockZipInfo(file_size=1000, compress_size=1),
|
||||
MockZipInfo(file_size=1000, compress_size=1),
|
||||
MockZipInfo(file_size=1000, compress_size=1),
|
||||
MockZipInfo(file_size=1000, compress_size=1),
|
||||
MockZipInfo(file_size=1000, compress_size=1),
|
||||
]
|
||||
with pytest.raises(SupersetException):
|
||||
check_is_safe_zip(ZipFile)
|
||||
|
||||
|
||||
def test_check_if_safe_zip_hidden_bomb(app_context: None) -> None:
|
||||
"""
|
||||
Test if ZIP file does not contain a big file highly compressed
|
||||
"""
|
||||
ZipFile = MagicMock()
|
||||
ZipFile.infolist.return_value = [
|
||||
MockZipInfo(file_size=1000, compress_size=100),
|
||||
MockZipInfo(file_size=1000, compress_size=100),
|
||||
MockZipInfo(file_size=1000, compress_size=100),
|
||||
MockZipInfo(file_size=1000, compress_size=100),
|
||||
MockZipInfo(file_size=1000 * (1024 * 1024), compress_size=100),
|
||||
]
|
||||
with pytest.raises(SupersetException):
|
||||
check_is_safe_zip(ZipFile)
|
||||
|
||||
Reference in New Issue
Block a user