Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def run_validation(
if not filename.lower().endswith(".zip"):
raise ValueError(zip_only_message or "Only SPS .zip files are supported.")
with tempfile.TemporaryDirectory(prefix="spsvalidator-") as temp_dir:
zip_path = os.path.join(temp_dir, Path(filename).name)
zip_path = os.path.join(temp_dir, "package.zip")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Rossi-Luciano não pode ser fixo. Recupere o nome do arquivo em uso

uploaded_file.save(zip_path)
result = validate_sps_zip(zip_path)
rows = result["rows"]
Expand Down
8 changes: 7 additions & 1 deletion spsvalidator/src/spsvalidator/web/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,12 @@ def _render_index(**context):
)


def _safe_redirect_target(next_url: str | None) -> str:
if next_url and next_url.startswith("/") and not next_url.startswith("//"):
return next_url
return url_for("web.index")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use uma solução mais apropriada que é adoção da função urlparse

from urllib.parse import urlparse  # No Python moderno, ou werkzeug.urls

def _safe_redirect_target(next_url: str | None) -> str:
    if not next_url:
        return url_for("web.index")
    
    # Faz o parsing da URL
    parsed_url = urlparse(next_url)
    
    # Se o netloc (host) estiver vazio, significa que é uma URL relativa (interna e segura)
    if not parsed_url.netloc and parsed_url.path.startswith("/"):
        return next_url
        
    return url_for("web.index")


def _redirect_with_lang(endpoint: str, **values):
response = make_response(redirect(url_for(endpoint, **values)))
language = normalize_language(request.cookies.get("lang"))
Expand Down Expand Up @@ -98,7 +104,7 @@ def download_csv(history_id: str):
@web_blueprint.get("/language/<language_code>")
def set_language(language_code: str):
language = normalize_language(language_code)
redirect_target = request.args.get("next") or url_for("web.index")
redirect_target = _safe_redirect_target(request.args.get("next"))
response = make_response(redirect(redirect_target))
response.set_cookie("lang", language, max_age=60 * 60 * 24 * 365)
return response
Expand Down